From ee8e6411ba0274d5fba820ed21c30f767f768ede Mon Sep 17 00:00:00 2001 From: snickersun Date: Mon, 21 Dec 2020 18:26:05 +0800 Subject: [PATCH] =?utf8?q?protocol=5Fjiai=20=E6=B7=BB=E5=8A=A0=E8=AF=AD?= =?utf8?q?=E8=A8=80=E5=88=87=E6=8D=A2=E5=91=BD=E4=BB=A4=20=20BPLA?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 2 + .../com/enqualcomm/support/ICSmsManager.java | 14 + .../com/enqualcomm/support/bean/Runtime.java | 2428 +++++----- .../java/com/ic/protocols/protocol_jiai.java | 4071 +++++++++-------- app/src/main/res/values-zh-rCN/strings.xml | 11 + app/src/main/res/values/strings.xml | 12 + local.properties | 4 +- 7 files changed, 3311 insertions(+), 3231 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0dc82576..60a1fa56 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -22,6 +22,8 @@ + + diff --git a/app/src/main/java/com/enqualcomm/support/ICSmsManager.java b/app/src/main/java/com/enqualcomm/support/ICSmsManager.java index 3d74b978..664ec455 100644 --- a/app/src/main/java/com/enqualcomm/support/ICSmsManager.java +++ b/app/src/main/java/com/enqualcomm/support/ICSmsManager.java @@ -36,6 +36,7 @@ import com.enqualcomm.support.utils.DeviceInfoUtil; import com.enqualcomm.support.utils.ICAudioManager; import com.enqualcomm.support.utils.ICHttpUtil; import com.enqualcomm.support.utils.ICLogger; +import com.enqualcomm.support.utils.LanguageUtils; import com.enqualcomm.support.utils.SendEmail; import com.enqualcomm.support.utils.ServiceUtil; import com.enqualcomm.support.utils.SimSignalUtil; @@ -1279,6 +1280,19 @@ public class ICSmsManager extends BroadcastReceiver { if(CoreService.getInstance()!=null) CoreService.getInstance().setBleScanAlarm(20); + + + + }else if(cmd.startsWith("BPLA,")) { + + String list[]=cmd.split(","); + if(list.length==2){ + + LanguageUtils.changeLanguageByIndex(mContext,list[1]); + } + + + } } } \ No newline at end of file diff --git a/app/src/main/java/com/enqualcomm/support/bean/Runtime.java b/app/src/main/java/com/enqualcomm/support/bean/Runtime.java index f5aa7e37..65874f89 100644 --- a/app/src/main/java/com/enqualcomm/support/bean/Runtime.java +++ b/app/src/main/java/com/enqualcomm/support/bean/Runtime.java @@ -1,1217 +1,1211 @@ -package com.enqualcomm.support.bean; - - -import android.content.Context; - -import com.enqualcomm.support.Config; -import com.enqualcomm.support.adapter.LBSHelper; -import com.enqualcomm.support.utils.ContextProxy; -import com.enqualcomm.support.utils.DBHelper; -import com.enqualcomm.support.utils.DnsUtil; -import com.enqualcomm.support.utils.ICLogger; - -import java.io.File; - -public class Runtime { - private boolean debugflag = false; - - public int temp_test_Cycle = 60 * 60; - public int anti_test_cycle = 30; - - public static String PushtxtMsg_srv_index = ""; - - public int SignalStrength; - //上一次成功心跳时间,供系统重连机制使用。 - public long lastLoginSuccessTime = 0; - public TemperatureInfo tempInfo = new TemperatureInfo(); - public boolean BindingStatus = false; - public BLEInfo bleInfo = new BLEInfo(); - private String battery = "000"; - - private int batteryVoltage = 0; - private boolean batteryLow; - - private boolean batterychanging; - - public String belong; - - private File cacheDir; - - private String cdmaInfo; - - public String cellidByAt; - - private String cellinfo; - - private String cid = ""; - - private ContextProxy contextProxy; - - private String currentCellInfo; - - // public String currentWifiInfo=""; - private static int ppgTestCycle; - - private DBHelper dbHelper; - - private String device_id; - - private String device_key; - - private File fileDir; - - private boolean haveBatteryChange; - - private String haveBuy; - - private String haveTry; - - private String host = "watch.jiai.pro"; //118.178.155.223 - - private String srvIP = "118.178.155.223";//"39.98.94.164"; - - private String imei = ""; - - private int port = 8090;//20048;//8888;//8090; - - - private boolean testServerProp = false; - - private String imei_cid = ""; - - private String imei_cid_key = ""; - - private String imsi = ""; - - public boolean isAirMode = false; - - - private String key = "867155030001063"; - - public String lacByAt; - - - private LBSHelper lbsHelper; - - - private heartRateStatus HRS = null; - - private boolean FactoryTestingStat = false; - - public void setFactoryTestingStat(boolean testing) { - FactoryTestingStat = testing; - } - - public boolean getFactoryTestingStat() { - return FactoryTestingStat; - } - - private boolean UseQueue = false; - private boolean lockSimInfo = false; - - private boolean ServerHeartBeadReceived = false; - - public void setServerProtocolConnected(boolean received) { - ServerHeartBeadReceived = received; - } - - public boolean isServerProtocolConnected() { - return ServerHeartBeadReceived; - } - - public void setPpgTestCycle(int cycle) { - ppgTestCycle = cycle; - } - - public int getPpgTestCycle() { - return ppgTestCycle; - } - - - public boolean check_stat_do_ppg_test() { - if (debugflag || (Config.noPPGSensor == false //有心率 - && ((isNeedAntioff == true && isAntioff == false) || (isNeedAntioff == false)) //不支持脱腕,或者支持脱腕且佩戴中 - )) { - return true; - } - ICLogger.i("不符合条件,跳过 心率检测!" + (Config.noPPGSensor == true ? "无心率" : "有心率") + " 有佩戴检测?" + isNeedAntioff + " 脱落?" + isAntioff); - return false; - } - - public boolean check_stat_do_temp_test() { - if (debugflag || (Config.noTempSensor == false //有体温 - && ((isNeedAntioff == true && isAntioff == false) || (isNeedAntioff == false)) //不支持脱腕,或者支持脱腕且佩戴中 - )) { - return true; - } - ICLogger.i("不符合条件,跳过 体温检测!" + (Config.noTempSensor == true ? "无体温" : "有体温") + " 充电?" + isPowerConnected() + " 移除充电器时间?" + getMsAfterLastPowerPlugout() + "ms, 需要佩戴检测?" + isNeedAntioff + ", 脱腕?" + isAntioff); - return false; - } - - public void setUseQueue(boolean usequeue) { - UseQueue = usequeue; - } - - public boolean getUseQueue() { - return UseQueue; - } - - private String mccAndMnc; - - private String language = "zh-cn"; - - public String getLanguage() { - return language; - } - - public void setLanguage(String _language) { - language = _language; - } - - - //0 代表没有出围栏,如果出围栏则置1,每次报警再加1 - public int Fence_Warning_flag = 0; - - //0 代表佩戴,如果脱腕则置1,每次报警再加1 - public int Anti_off_flag = 0; - public int Cut_off_flag = 0; - - public enum AlarmType { - ALARM_SOS, //sos - ALARM_LOWBATTERY, //低电 - ALARM_ANTIOFF, //脱腕报警 - ALARM_WEARED, //佩戴 - ALARM_CUTOFF,//剪断报警 - ALARM_FALL, //跌倒 - ALARM_ABNORMAL_HEART_RATE, //心率异常 - ALARM_HEART_RATE_HIGH, //心率高 - ALARM_HEART_RATE_LOW, //心率低 - ALARM_BPH_HIGH, //高压高 - ALARM_BPH_LOW, //高压低 - ALARM_BPL_HIGH, //低压高 - ALARM_BPL_LOW, //低压低 - ALARM_SEDENTARY, //久坐提醒 - ALARM_ILLEGAL_CUTOFF, //剪断 - ALARM_LOCK_WATCH, //锁定 - ALARM_TEMP_HIGH, //体温高 - ALARM_TEMP_LOW, //体温低 - ALARM_POWER_OFF, //关机 - ALARM_ESCAPE, //逃逸 - ALARM_UNREADMSG, //消息未读 - ALARM_MSGREAD, //消息已读 - ALARM_NONE, - ALARM_REMOVE_SOS,//附加的,专门给防走丢用来清除SOS标志用的 - } - - ; - - private AlarmType g_alarm = AlarmType.ALARM_NONE; - - private String alarmType = "00"; - - public String getAlarmType() { - return alarmType; - } - - //32 bit 数据 - private int fzdDevStatus = 0x00000000; - - - /*** - * 00为报警状态,00为无任何报警(01:SOS,02:低电,03:脱落报警,04:佩戴提醒,05:剪断报警,06:跌倒报警, - * 07:心率异常, 08:心率过高, 09:心率过低,10:收缩压过高,11:收缩压过低,12:舒张压过高,13:舒张压过低, - * 14:久坐提醒,15:非法解锁(剪断报警),16:锁定提醒(佩戴提醒),17:体温过高,18体温过低) 19 关机事件(非服务器指令关机), 20,escape逃跑事件(离开蓝牙管控范围) - * 21, 消息未读 , 22消息已读 - */ - public boolean setAlarmType(AlarmType alarm) { -// if ( !fall && !lowbattery && !sos && antioff) - g_alarm = alarm; - - if (Config.isAlarmTypeEnabled(alarm) == false) { - ICLogger.i(alarm.name() + " is disabled, skip!"); - return false; - } - //同时更新防走丢设备状态标志 - setFZDDevStatus(alarm); - - switch (alarm) { - case ALARM_SOS: - alarmType = "01"; - break; - case ALARM_LOWBATTERY: - alarmType = "02"; - break; - case ALARM_ANTIOFF: - alarmType = "03"; - break; - case ALARM_WEARED: - alarmType = "04"; - break; - case ALARM_CUTOFF: - alarmType = "05"; - break; - case ALARM_FALL: - alarmType = "06"; - break; - - case ALARM_ABNORMAL_HEART_RATE: - alarmType = "07"; - break; - - case ALARM_HEART_RATE_HIGH: - alarmType = "08"; - break; - - case ALARM_HEART_RATE_LOW: - alarmType = "09"; - break; - - case ALARM_BPH_HIGH: - alarmType = "10"; - break; - - case ALARM_BPH_LOW: - alarmType = "11"; - break; - - case ALARM_BPL_HIGH: - alarmType = "12"; - break; - - case ALARM_BPL_LOW: - alarmType = "13"; - break; - - case ALARM_SEDENTARY: - alarmType = "14"; - break; - - case ALARM_ILLEGAL_CUTOFF: - alarmType = "15"; - break; - - case ALARM_LOCK_WATCH: - alarmType = "16"; - break; - - case ALARM_TEMP_HIGH: - alarmType = "17"; - break; - - case ALARM_TEMP_LOW: - alarmType = "18"; - break; - case ALARM_POWER_OFF: - alarmType = "19"; - break; - case ALARM_ESCAPE: - alarmType = "20"; - break; - case ALARM_UNREADMSG: - alarmType = "21"; - break; - case ALARM_MSGREAD: - alarmType = "22"; - break; - default: - alarmType = "00"; - break; - } - return true; - } - - - /*** - * 终端状态 00000000 ( 16 进 - * 制) 用二进制字符串表示为 - * 0000 0000 0000 0010 0000 0000 0000 0000 含义如下: - * 左边高 16bit 表示报警,右边低 16bit 表示状态. Bit 位(0 开始) 含义(1 有效) - * 0低电状态 00000000000000000000000000000001 0x00000001 - * 1出围栏状态(目前没用到) 00000000000000000000000000000010 0x00000002 - * 2进围栏状态(目前没用到) 00000000000000000000000000000100 0x00000004 - * 3手环戴上取下状态 (佩戴检测) 00000000000000000000000000001000 0x00000008 - * 4手表运行静止状态 00000000000000000000000000010000 0x00000010 - * 16SOS 报警 00000000000000010000000000000000 0x00010000 - * 17低电报警 00000000000000100000000000000000 0x00020000 - * 18出围栏报警(逃跑出蓝牙监控范围) 00000000000001000000000000000000 0x00040000 - * 19进围栏报警(目前没用到) 00000000000010000000000000000000 0x00080000 - * 20手环拆除报警 (表带剪断) 00000000000100000000000000000000 0x00100000 - * 21跌倒报警 00000000001000000000000000000000 0x00200000 - * 22震动报警 00000000010000000000000000000000 0x00400000 - * 23断电报警 (手表关机报警) 00000000100000000000000000000000 0x00800000 - * 24心率骤降报警 00000001000000000000000000000000 0x01000000 - * 25车辆启动 (手表用不到) 00000010000000000000000000000000 0x02000000 - * 比如 00200010,即表示00000000001000000000000000010000 - * 这个项目需要支持防拆 20、00000000000100000000000000000000 0x 00100000 1048576 - * 低电 17、00000000000000100000000000000000 0x 00020000 131072 - * 离线 23、00000000100000000000000000000000 0x 00800000 8388608 - * 逃逸报警 18\ 00000000000001000000000000000000 0x 00040000 262144 - * 分别是第四位为 1,第 21 位为 1,对应 21 位是跌倒报警 - * @param runtime - * @return - */ - public String getFZDDevStatus(Runtime runtime) { - StringBuilder sb = new StringBuilder(); - sb.append(Integer.toHexString(runtime.fzdDevStatus)); - if (sb.length() < 8) { - for (int i = 0; i < 8 - sb.length(); i++) - sb.insert(0, '0'); // pad with leading zero if needed - } - String hex = sb.toString(); - return hex; - } - - - public void updateFZDDevStatusLowbat(boolean lowbattery) { - - if (lowbattery) { - fzdDevStatus |= 0x00000001; - fzdDevStatus |= 0x00020000; - } else { - fzdDevStatus &= ~0x00000001; - fzdDevStatus &= ~0x00020000; - } - } - - public void updateFZDDevStatusWeared(boolean weared) { - if (weared) { - fzdDevStatus |= 0x00000008; - } else { - fzdDevStatus &= ~0x00000008; - } - } - - public void updateFZDDevStatusMoving(boolean moving) { - if (moving) { - fzdDevStatus &= ~0x00000010; - } else { - fzdDevStatus |= 0x00000010; - } - } - - public void updateFZDDevStatusEscape(boolean escape) { - if (escape) { - fzdDevStatus |= 0x00040000; - } else { - fzdDevStatus &= ~0x00040000; - } - - } - - public void setFZDDevStatus(AlarmType _alarmType) { - - switch (_alarmType) { - case ALARM_SOS: - fzdDevStatus |= 0x00010000; - break; - case ALARM_LOWBATTERY: - fzdDevStatus |= 0x00020000; - break; - case ALARM_ANTIOFF: -// fzdDevStatus&=0x00000008; - updateFZDDevStatusWeared(false); - break; - case ALARM_WEARED: - updateFZDDevStatusWeared(true); -// fzdDevStatus&=~0x00000008; - break; - case ALARM_LOCK_WATCH: - fzdDevStatus &= ~0x00100000; - break; - case ALARM_CUTOFF: - case ALARM_ILLEGAL_CUTOFF: - fzdDevStatus |= 0x00100000; - break; - case ALARM_FALL: - fzdDevStatus |= 0x00200000; - break; - case ALARM_ABNORMAL_HEART_RATE: - fzdDevStatus |= 0x01000000; - break; - case ALARM_HEART_RATE_HIGH: -// alarmType1="08"; - break; - - case ALARM_HEART_RATE_LOW: -// alarmType1="09"; - break; - - case ALARM_BPH_HIGH: -// alarmType1="10"; - break; - - case ALARM_BPH_LOW: -// alarmType1="11"; - break; - - case ALARM_BPL_HIGH: -// alarmType1="12"; - break; - - case ALARM_BPL_LOW: -// alarmType1="13"; - break; - case ALARM_SEDENTARY: -// alarmType1="14"; - break; - case ALARM_TEMP_HIGH: -// alarmType1="17"; - break; - case ALARM_TEMP_LOW: -// alarmType1="18"; - break; - case ALARM_POWER_OFF: - fzdDevStatus |= 0x00800000; - break; - - case ALARM_ESCAPE: - updateFZDDevStatusEscape(true); - break; - case ALARM_REMOVE_SOS: - fzdDevStatus &= ~0x00010000; - break; - case ALARM_NONE: - default: -// alarmType1="00000000"; - break; - } - - ICLogger.i("setFZDDevStatus " + String.format("0x%x", fzdDevStatus) + " " + fzdDevStatus); - - } - - public void dumpDevStatus() { - StringBuilder sb = new StringBuilder("get FZDStatus "); - if ((fzdDevStatus & 0x00800000) > 0) { - sb.append("ALARM_POWER_OFF "); - } - if ((fzdDevStatus & 0x00040000) > 0) { - sb.append("ALARM_ESCAPE "); - } - if ((fzdDevStatus & 0x01000000) > 0) { - sb.append("ALARM_ABNORMAL_HEART_RATE "); - } - if ((fzdDevStatus & 0x00200000) > 0) { - sb.append("ALARM_FALL "); - } - if ((fzdDevStatus & 0x00100000) > 0) { - sb.append("ALARM_ILLEGAL_CUTOFF "); - } - if ((fzdDevStatus & 0x00100000) == 0) { - sb.append("ALARM_LOCK_WATCH "); - } - if ((fzdDevStatus & 0x00020000) > 0) { - sb.append("ALARM_LOWBATTERY "); - } - if ((fzdDevStatus & 0x00010000) > 0) { - sb.append("ALARM_SOS "); - } - if ((fzdDevStatus & 0x00000008) > 0) { - sb.append("ALARM_ANTIOFF "); - } - if ((fzdDevStatus & 0x00000008) == 0) { - sb.append("ALARM_WEARED "); - } - ICLogger.i(sb.toString()); - } - - public String preCdmaInfo; - - public String preCellInfo; - - public String preTime; - - public int saveStepCount; - - private boolean shutdown; - - public static long lastLinkReceiveStamp = 0; - - private boolean PowerConnected = false; - - private long msPowerConnectionStatusChangedTime = 0; - - public void setPowerConnected(boolean connected) { - if (PowerConnected != connected) { - msPowerConnectionStatusChangedTime = System.currentTimeMillis(); - PowerConnected = connected; - } - } - - //获取上次开始充电到现在的时间 ms - public long getMsAfterLastPowerPlugin() { - if (isPowerConnected()) { - return (System.currentTimeMillis() - msPowerConnectionStatusChangedTime); - } else - return 0; - } - - //获取上次停止充电到现在的时间 ms - public long getMsAfterLastPowerPlugout() { - if (!isPowerConnected()) { - return (System.currentTimeMillis() - msPowerConnectionStatusChangedTime); - } else - return 0; - } - - public boolean isPowerConnected() { - return PowerConnected; - } - - private DnsUtil dnsUtil = null; - - public void initDnsUtil(Context context) { - if (dnsUtil == null) - dnsUtil = new DnsUtil(5, context); - } - - public DnsUtil getDnsUtil() { - return dnsUtil; - } - - private int lastStepCount = 0; - private int lastStepCountForBT = 0; - private long timestamp; - - public int totalStepCount; - - private int heartbeatCycle; - - - public int getHeartBeatCycle() { - return heartbeatCycle; - } - - public void setHeartBeatCycle(int cycle) { - heartbeatCycle = cycle; - } - - public heartRateStatus getHRS() { - return HRS; - } - - public void setHRS(heartRateStatus hrs) { - HRS = hrs; - } - - public int getLastStepCount() { - return lastStepCount; - } - - public void setLastStepCount(int st) { - lastStepCount = st; - } - - public int getLastStepCountForBT() { - return lastStepCountForBT; - } - - public void setLastStepCountForBT(int st) { - lastStepCountForBT = st; - } - - public String IMEI() { - return this.imei; - } - - public String IMEI_CID() { - return this.imei_cid; - } - - public String IMEI_CID_KEY() { - return this.imei_cid_key; - } - - public String IMSI() { - return this.imsi; - } - - - private boolean noTurnOffWifiOnScreenOff = false; - - public void setNoTurnOffOnScreenOff(boolean bol) { - noTurnOffWifiOnScreenOff = bol; - } - - public boolean isNoTurnOffWifiOnScreenOff() { - return noTurnOffWifiOnScreenOff; - } - - public boolean isAntioff = false; - private boolean isNeedAntioff; - - public boolean getNeedAntioff() { - return this.isNeedAntioff; - } - - public void setNeedAntioff(boolean paramBoolean) { - this.isNeedAntioff = paramBoolean; - } - - private boolean isNeedReportcutoff = false; - - public boolean needReportCutoff() { - return this.isNeedReportcutoff; - } - - public void setNeddReportCutoff(boolean needreport) { - this.isNeedReportcutoff = needreport; - } - - public String getBattery() { - return this.battery; - } - - public int getBatteryVotage() { - return this.batteryVoltage; - } - - public void setBatteryVoltage(int voltage) { - this.batteryVoltage = voltage; - } - - public boolean getBatteryLow() { - return this.batteryLow; - } - - public boolean getBatterychanging() { - return this.batterychanging; - } - - - public File getCacheDir() { - return this.cacheDir; - } - - public String getCdmaInfo() { - return this.cdmaInfo; - } - - public String getCellidInfoByAt() { - return this.cellidByAt; - } - - - public ContextProxy getContextProxy() { - return this.contextProxy; - } - - public String getCurrentCellInfo() { - return this.currentCellInfo; - } - - public DBHelper getDbHelper() { - return this.dbHelper; - } - - public String getDevice_id() { - return this.device_id; - } - - public String getDevice_key() { - return this.device_key; - } - - public File getFileDir() { - return this.fileDir; - } - - public boolean getHaveBatteryChange() { - return this.haveBatteryChange; - } - - - public String getHost() { - return this.testServerProp ? srvIP : this.host; - } - - public void setSrvIP(String ip) { - this.srvIP = ip; - } - - public String getSrvIP() { - return this.srvIP; - } - - public String getKey() { - return this.key; - } - - public String getLacInfoByAt() { - return this.lacByAt; - } - - public LBSHelper getLbsHelper() { - return this.lbsHelper; - } - - - public boolean getLockSimInfo() { - return this.lockSimInfo; - } - - - public String getMccAndMnc() { - return this.mccAndMnc; - } - - public int getPort() { - return this.port; - } - - public int getSaveStepCount() { - return this.saveStepCount; - } - - public int getSignalStrength() { - return this.SignalStrength; - } - - private String SignalInfo = ""; - - public void setSignalInfo(String info) { - this.SignalInfo = info; - } - - public String getSignalInfo() { - return this.SignalInfo; - } - - public long getTimestamp() { - return this.timestamp; - } - - public int getTotalStepCount() { - return this.totalStepCount; - } - - - public boolean isShutdown() { - return this.shutdown; - } - - - private static int batterylevel = 0; - - public int getBatterylevel() { - return batterylevel; - } - - public void setBattery(String paramString) { - this.battery = paramString; - } - - public void setBattery(int param) { - this.batterylevel = param; - } - - public void setBatteryLow(boolean paramBoolean) { - this.batteryLow = paramBoolean; - updateFZDDevStatusLowbat(batteryLow); //设置batterylow Alarm - } - - public void setBatterychanging(boolean paramBoolean) { - this.batterychanging = paramBoolean; - } - - public void setBelong(String paramString) { - this.belong = paramString; - } - - public void setCacheDir(File paramFile) { - this.cacheDir = paramFile; - } - - public void setCdmaInfo(String paramString) { - this.cdmaInfo = paramString; - } - - public void setCellinfo(String paramString) { - this.cellinfo = paramString; - } - - public void setCid(String paramString) { - this.cid = paramString; - } - - public void setContextProxy(ContextProxy paramContextProxy) { - this.contextProxy = paramContextProxy; - } - - public void setCurrentCellInfo(String paramString) { - this.currentCellInfo = paramString; - } - - public void setDBHelper(DBHelper paramDBHelper) { - this.dbHelper = paramDBHelper; - } - - public void setDevice_id(String paramString) { - this.device_id = paramString; - } - - public void setDevice_key(String paramString) { - this.device_key = paramString; - } - - public void setFileDir(File paramFile) { - this.fileDir = paramFile; - } - - public void setHaveBatteryChange(boolean paramBoolean) { - this.haveBatteryChange = paramBoolean; - } - - public void setHost(String _host) { - host = _host; - } - - public void setHostAndPort(String paramString, int paramInt) { - this.host = paramString; - this.port = paramInt; - } - - public void setPort(int _port) { - port = _port; - } - - public void setImeiAndCid(String paramString1, String paramString2) { - this.imei = paramString1; - this.cid = paramString2; - StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.append(paramString1); - stringBuilder.append(","); - stringBuilder.append(paramString2); - this.imei_cid = stringBuilder.toString(); - ICLogger.i("imei:" + imei + ",cid:" + cid); - } - - public void setImsi(String paramString) { - this.imsi = paramString; - } - - public void setKey(String paramString) { - this.key = paramString; - StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.append(this.imei_cid); - stringBuilder.append(","); - stringBuilder.append(paramString); - this.imei_cid_key = stringBuilder.toString(); - } - - public void setLbsHelper(LBSHelper paramLBSHelper) { - this.lbsHelper = paramLBSHelper; - } - - public void setLbsInfoByAt(String paramString1, String paramString2) { - this.lacByAt = paramString1; - this.cellidByAt = paramString2; - } - - - public void setLockSimInfo(boolean paramBoolean) { - this.lockSimInfo = paramBoolean; - } - - - public void setMccAndMnc(String MccMnc) { - this.mccAndMnc = MccMnc; - - String[] list = MccMnc.split(","); - if (list.length >= 2) { - gpsp.setMCC(list[0]); - gpsp.setMNC(list[1]); - } - ICLogger.i("setMccAndMnc " + MccMnc); - } - - public void setSaveStepCount(int paramInt) { - this.saveStepCount = paramInt; - } - - public void setShutdown(boolean paramBoolean) { - this.shutdown = paramBoolean; - } - - public void setSignalStrength(int signal) { - this.SignalStrength = signal; -// ICLogger.i("setSignalStrength "+signal); - } - - public void setTestServerProp(boolean paramBoolean) { - this.testServerProp = paramBoolean; - } - - public void setTimestamp(long paramLong) { - this.timestamp = paramLong; - } - - public void setTotalStepCount(int paramInt) { - this.totalStepCount = paramInt; - } - - private ICLocation gpsp = null; - - private String wifiInfo = ""; - - public void setWifiinfo(String info) { - wifiInfo = info; - } - - public String getWifiInfo() { - return wifiInfo; - } - - public Runtime() { - if (gpsp == null) gpsp = new ICLocation(); - } - - public ICLocation getLocationInstance() { - return gpsp; - } - - //暂时没有实现此功能 - public String getGPSLocationStarNums() { - return "000"; - } - - //此功能未实现 - public String getProtection() { - return "00"; - } - - // - public String getWorkModeStr() { - String gpsStr = String.format("%02d", getLocationInstance().getWorkingMod()); - - return gpsStr; - } - - //未实现睡眠监测 - public String getRolltimes() { - return "00"; - } - /* AP03 心跳包 end */ - - /* AP01 定位 */ - - - public double temperature_adjustValue = 0.0f; - - public boolean isGPSFixed() { - return (gpsp.getLocationStat() == ICLocation.LOCATION_STAT.LOCATION_FIXED); - } - - public String getGPSData() { - -// 2232.9806N11404.9355E000.1: 北纬22度32.9806分,东经114度04.9355分,速度为000.1 km/h,如经纬度无效,可默认全为0,如0000.0000N00000.0000E -// 纬度格式为: ddmm.mmmm ,长度不足长度前补0 -// 经度格式为:dddmm.mmmm,长度不足前补0 - StringBuilder sb = new StringBuilder(); - int lati = (int) gpsp.getLocation().lat; - int latl = (int) ((gpsp.getLocation().lat - lati) * 10000); - int loni = (int) gpsp.getLocation().lon; - int lonl = (int) ((gpsp.getLocation().lon - loni) * 10000); - int speedi = (int) gpsp.getLocation().speed; - int speedl = (int) ((gpsp.getLocation().speed - speedi) * 10); - String latStr = gpsp.getLocation().latStr; - String lonStr = gpsp.getLocation().lonStr; - String latname = gpsp.getLocation().lat_name; - String lonname = gpsp.getLocation().lon_name; - if (isGPSFixed()) { - if (gpsp.getLocation().lonStr.isEmpty()) { - String gpsStr = String.format("%04d.%04d%s%05d.%04d%s%03d.%01d", lati, latl, latname, loni, lonl, lonname, speedi, speedl); - sb.append("A").append(gpsStr); - } else { - String gpsStr = String.format("%sN%sE%03d.%01d", latStr.substring(0, 9), lonStr.substring(0, 10), speedi, speedl); - sb.append("A").append(gpsStr); - } - } else { - String gpsStr = String.format("%04d.%04dN%05d.%04dE%03d.%01d", 0, 0, 0, 0, 0, 0); - sb.append("V").append(gpsStr); - } - - - return sb.toString(); - } - - public String getMqttGPSData() { - -/*** - * A,22.570733,N,113.8626083,E,0.00,249.5,0.0,6 - * A,gps 定位有效 - * 22.570733,纬度 N, - * 113.8626083,经度 E, - * 0.00,速度 - * 249.5,方向 - * 0.0,海拔 - * 6,卫星个数 - */ - StringBuilder sb = new StringBuilder(); - int speedi = (int) gpsp.getLocation().speed; - int speedl = (int) ((gpsp.getLocation().speed - speedi) * 100); - - String latStr = gpsp.getLocation().latGPSStr; - String lonStr = gpsp.getLocation().lonGPSStr; - String latname = gpsp.getLocation().lat_name; - String lonname = gpsp.getLocation().lon_name; - ICLogger.i(" UD isfixed " + isGPSFixed() + " is in area " + bleInfo.is_in_area); - if (bleInfo.is_in_area == true) { - latStr = bleInfo.gps_n; - lonStr = bleInfo.gps_e; - latname = (latStr.trim().startsWith("-")) ? "S" : "N"; - lonname = (lonStr.trim().startsWith("-")) ? "W" : "E"; - } - String heading = String.valueOf(gpsp.getLocation().heading); - int starcount = gpsp.getLocation().used_gps_numbs; - if (isGPSFixed() || bleInfo.is_in_area) { - String gpsStr = String.format(",%s,%s,%s,%s,%d.%02d,%s,0.0,%d", latStr, latname, lonStr, lonname, speedi, speedl, heading, starcount); - sb.append("A").append(gpsStr); - - } else { - String gpsStr = String.format(",0.000,N,0.000,E,0.0,0.0,0.0,0"); - sb.append("V").append(gpsStr); - } - - ICLogger.i("UD " + sb.toString()); - - return sb.toString(); - } - - public String getFZDGPSData() { - -/*** - * A,22.570733,N,113.8626083,E,0.00,249.5,0.0,6 - * A,gps 定位有效 - * 22.570733,纬度 N, - * 113.8626083,经度 E, - * 0.00,速度 - * 249.5,方向 - * 0.0,海拔 - * 6,卫星个数 - */ - StringBuilder sb = new StringBuilder(); - int speedi = (int) gpsp.getLocation().speed; - int speedl = (int) ((gpsp.getLocation().speed - speedi) * 100); - String latStr = gpsp.getLocation().latGPSStr; - String lonStr = gpsp.getLocation().lonGPSStr; - String heading = String.valueOf(gpsp.getLocation().heading); - String latname = gpsp.getLocation().lat_name; - String lonname = gpsp.getLocation().lon_name; - int starcount = gpsp.getLocation().used_gps_numbs; - if (isGPSFixed()) { - String gpsStr = String.format(",%s,%s,%s,%s,%d.%02d,%s,0.0,%d", latStr, latname, lonStr, lonname, speedi, speedl, heading, starcount); - sb.append("A").append(gpsStr); - - } else { - String gpsStr = String.format(",0.000,N,0.000,E,0.0,0.0,0.0,0"); - sb.append("V").append(gpsStr); - } - - - return sb.toString(); - } - - public String getGPSHeading() { - int headingi = (int) gpsp.getLocation().heading; - int headingl = (int) ((gpsp.getLocation().heading - headingi) * 100); - String gpsStr = String.format("%03d.%02d", headingi, headingl); - return gpsStr; - } - - public String getFZDLBSMultiStationData() { - if (mFZDLBSMultiStationData.trim().isEmpty()) { - mFZDLBSMultiStationData = "0"; - } - return mFZDLBSMultiStationData; - } - - public String getFZDWifiData() { - - int apsum = 0; - String wifiinfo = getWifiInfo(); - if (!wifiinfo.isEmpty()) { - String[] list = wifiinfo.split("&"); - apsum = list.length; - } - StringBuffer sb = new StringBuffer(); - if (apsum == 0) { - sb.append(apsum); - } else { - sb.append(apsum).append(","); - wifiinfo = wifiinfo.replace("&", ",").replace("|", ","); - sb.append(wifiinfo); - } - return sb.toString(); - } - - private static String mLBSMultiStationData = ""; - - public void setLBSMultiStationData(String data) { - mLBSMultiStationData = data; - } - - private static String mFZDLBSMultiStationData = ""; - - public void setFZDLBSMultiStationData(String data) { - mFZDLBSMultiStationData = data; - } - - //AP03 用的多基站定位数据 - public String getLBSMultiStationData() { - // 7: 表示共有7组基站 -// 460: MCC 国家码 -// 0: MNC运营商代码 -// 9520|3671|10: LAC|CID|dbm表示一组基站信息,后面数量需和基站组数地应 10:dbm为信号强度多基站信号强度建议从高到低排列后上传,信号强度转正数:150 – abs(dbm) - if (mLBSMultiStationData.trim().isEmpty()) { - mLBSMultiStationData = "0,0,0,"; - } - return mLBSMultiStationData; - } - - - public String getLBSData() { - -// 460,0,9520,3671 : LBS基站数据,MCC国家码,460为中国,0:MNC,0为移动,9520:LAC,十进制,3671,CID,十进制 - StringBuilder sb = new StringBuilder(); - sb.append(gpsp.getMCC()).append(",") - .append(gpsp.getMNC()).append(",") - .append(gpsp.getLAC()).append(",") - .append(gpsp.getGSMStationCID()); - return sb.toString(); - } - - public String getWifiData() { - StringBuilder sb = new StringBuilder(); - - int i = 0; - for (String mac : gpsp.getLBSdata().wifi_aps.keySet()) { - sb.append("AP").append(i).append("|").append(mac).append("|").append(gpsp.getLBSdata().wifi_aps.get(mac)).append(","); - i++; - } - if (i > 0) { - int index = sb.lastIndexOf(","); - sb.replace(index, index + 1, ""); - } - return sb.toString(); - } - - - public boolean sleepDataReported = false; - - - public static String lastSitCheckTiimeyyyyMMddHHmmss = ""; - public static long lastSitCheckStepCount = -1; - - public static HealthInfo healthInfo = null; - - static { - healthInfo = new HealthInfo(); - healthInfo.reset(); - } - - public static boolean practising = false; - public static int practice_cycle = 60; - -} - +package com.enqualcomm.support.bean; + + +import android.content.Context; + +import com.enqualcomm.support.Config; +import com.enqualcomm.support.adapter.LBSHelper; +import com.enqualcomm.support.utils.ContextProxy; +import com.enqualcomm.support.utils.DBHelper; +import com.enqualcomm.support.utils.DnsUtil; +import com.enqualcomm.support.utils.ICLogger; +import com.enqualcomm.support.utils.LanguageUtils; + +import java.io.File; + +public class Runtime { + private boolean debugflag = false; + + public int temp_test_Cycle = 60 * 60; + public int anti_test_cycle = 30; + + public static String PushtxtMsg_srv_index = ""; + + public int SignalStrength; + //上一次成功心跳时间,供系统重连机制使用。 + public long lastLoginSuccessTime = 0; + public TemperatureInfo tempInfo = new TemperatureInfo(); + public boolean BindingStatus = false; + public BLEInfo bleInfo = new BLEInfo(); + private String battery = "000"; + + private int batteryVoltage = 0; + private boolean batteryLow; + + private boolean batterychanging; + + public String belong; + + private File cacheDir; + + private String cdmaInfo; + + public String cellidByAt; + + private String cellinfo; + + private String cid = ""; + + private ContextProxy contextProxy; + + private String currentCellInfo; + + // public String currentWifiInfo=""; + private static int ppgTestCycle; + + private DBHelper dbHelper; + + private String device_id; + + private String device_key; + + private File fileDir; + + private boolean haveBatteryChange; + + private String haveBuy; + + private String haveTry; + + private String host = "watch.jiai.pro"; //118.178.155.223 + + private String srvIP = "118.178.155.223";//"39.98.94.164"; + + private String imei = ""; + + private int port = 8090;//20048;//8888;//8090; + + + private boolean testServerProp = false; + + private String imei_cid = ""; + + private String imei_cid_key = ""; + + private String imsi = ""; + + public boolean isAirMode = false; + + + private String key = "867155030001063"; + + public String lacByAt; + + + private LBSHelper lbsHelper; + + + private heartRateStatus HRS = null; + + private boolean FactoryTestingStat = false; + + public void setFactoryTestingStat(boolean testing) { + FactoryTestingStat = testing; + } + + public boolean getFactoryTestingStat() { + return FactoryTestingStat; + } + + private boolean UseQueue = false; + private boolean lockSimInfo = false; + + private boolean ServerHeartBeadReceived = false; + + public void setServerProtocolConnected(boolean received) { + ServerHeartBeadReceived = received; + } + + public boolean isServerProtocolConnected() { + return ServerHeartBeadReceived; + } + + public void setPpgTestCycle(int cycle) { + ppgTestCycle = cycle; + } + + public int getPpgTestCycle() { + return ppgTestCycle; + } + + + public boolean check_stat_do_ppg_test() { + if (debugflag || (Config.noPPGSensor == false //有心率 + && ((isNeedAntioff == true && isAntioff == false) || (isNeedAntioff == false)) //不支持脱腕,或者支持脱腕且佩戴中 + )) { + return true; + } + ICLogger.i("不符合条件,跳过 心率检测!" + (Config.noPPGSensor == true ? "无心率" : "有心率") + " 有佩戴检测?" + isNeedAntioff + " 脱落?" + isAntioff); + return false; + } + + public boolean check_stat_do_temp_test() { + if (debugflag || (Config.noTempSensor == false //有体温 + && ((isNeedAntioff == true && isAntioff == false) || (isNeedAntioff == false)) //不支持脱腕,或者支持脱腕且佩戴中 + )) { + return true; + } + ICLogger.i("不符合条件,跳过 体温检测!" + (Config.noTempSensor == true ? "无体温" : "有体温") + " 充电?" + isPowerConnected() + " 移除充电器时间?" + getMsAfterLastPowerPlugout() + "ms, 需要佩戴检测?" + isNeedAntioff + ", 脱腕?" + isAntioff); + return false; + } + + public void setUseQueue(boolean usequeue) { + UseQueue = usequeue; + } + + public boolean getUseQueue() { + return UseQueue; + } + + private String mccAndMnc; + + public String getLanguage() { + return LanguageUtils.getCurrentLanguage(); + } + + //0 代表没有出围栏,如果出围栏则置1,每次报警再加1 + public int Fence_Warning_flag = 0; + + //0 代表佩戴,如果脱腕则置1,每次报警再加1 + public int Anti_off_flag = 0; + public int Cut_off_flag = 0; + + public enum AlarmType { + ALARM_SOS, //sos + ALARM_LOWBATTERY, //低电 + ALARM_ANTIOFF, //脱腕报警 + ALARM_WEARED, //佩戴 + ALARM_CUTOFF,//剪断报警 + ALARM_FALL, //跌倒 + ALARM_ABNORMAL_HEART_RATE, //心率异常 + ALARM_HEART_RATE_HIGH, //心率高 + ALARM_HEART_RATE_LOW, //心率低 + ALARM_BPH_HIGH, //高压高 + ALARM_BPH_LOW, //高压低 + ALARM_BPL_HIGH, //低压高 + ALARM_BPL_LOW, //低压低 + ALARM_SEDENTARY, //久坐提醒 + ALARM_ILLEGAL_CUTOFF, //剪断 + ALARM_LOCK_WATCH, //锁定 + ALARM_TEMP_HIGH, //体温高 + ALARM_TEMP_LOW, //体温低 + ALARM_POWER_OFF, //关机 + ALARM_ESCAPE, //逃逸 + ALARM_UNREADMSG, //消息未读 + ALARM_MSGREAD, //消息已读 + ALARM_NONE, + ALARM_REMOVE_SOS,//附加的,专门给防走丢用来清除SOS标志用的 + } + + ; + + private AlarmType g_alarm = AlarmType.ALARM_NONE; + + private String alarmType = "00"; + + public String getAlarmType() { + return alarmType; + } + + //32 bit 数据 + private int fzdDevStatus = 0x00000000; + + + /*** + * 00为报警状态,00为无任何报警(01:SOS,02:低电,03:脱落报警,04:佩戴提醒,05:剪断报警,06:跌倒报警, + * 07:心率异常, 08:心率过高, 09:心率过低,10:收缩压过高,11:收缩压过低,12:舒张压过高,13:舒张压过低, + * 14:久坐提醒,15:非法解锁(剪断报警),16:锁定提醒(佩戴提醒),17:体温过高,18体温过低) 19 关机事件(非服务器指令关机), 20,escape逃跑事件(离开蓝牙管控范围) + * 21, 消息未读 , 22消息已读 + */ + public boolean setAlarmType(AlarmType alarm) { +// if ( !fall && !lowbattery && !sos && antioff) + g_alarm = alarm; + + if (Config.isAlarmTypeEnabled(alarm) == false) { + ICLogger.i(alarm.name() + " is disabled, skip!"); + return false; + } + //同时更新防走丢设备状态标志 + setFZDDevStatus(alarm); + + switch (alarm) { + case ALARM_SOS: + alarmType = "01"; + break; + case ALARM_LOWBATTERY: + alarmType = "02"; + break; + case ALARM_ANTIOFF: + alarmType = "03"; + break; + case ALARM_WEARED: + alarmType = "04"; + break; + case ALARM_CUTOFF: + alarmType = "05"; + break; + case ALARM_FALL: + alarmType = "06"; + break; + + case ALARM_ABNORMAL_HEART_RATE: + alarmType = "07"; + break; + + case ALARM_HEART_RATE_HIGH: + alarmType = "08"; + break; + + case ALARM_HEART_RATE_LOW: + alarmType = "09"; + break; + + case ALARM_BPH_HIGH: + alarmType = "10"; + break; + + case ALARM_BPH_LOW: + alarmType = "11"; + break; + + case ALARM_BPL_HIGH: + alarmType = "12"; + break; + + case ALARM_BPL_LOW: + alarmType = "13"; + break; + + case ALARM_SEDENTARY: + alarmType = "14"; + break; + + case ALARM_ILLEGAL_CUTOFF: + alarmType = "15"; + break; + + case ALARM_LOCK_WATCH: + alarmType = "16"; + break; + + case ALARM_TEMP_HIGH: + alarmType = "17"; + break; + + case ALARM_TEMP_LOW: + alarmType = "18"; + break; + case ALARM_POWER_OFF: + alarmType = "19"; + break; + case ALARM_ESCAPE: + alarmType = "20"; + break; + case ALARM_UNREADMSG: + alarmType = "21"; + break; + case ALARM_MSGREAD: + alarmType = "22"; + break; + default: + alarmType = "00"; + break; + } + return true; + } + + + /*** + * 终端状态 00000000 ( 16 进 + * 制) 用二进制字符串表示为 + * 0000 0000 0000 0010 0000 0000 0000 0000 含义如下: + * 左边高 16bit 表示报警,右边低 16bit 表示状态. Bit 位(0 开始) 含义(1 有效) + * 0低电状态 00000000000000000000000000000001 0x00000001 + * 1出围栏状态(目前没用到) 00000000000000000000000000000010 0x00000002 + * 2进围栏状态(目前没用到) 00000000000000000000000000000100 0x00000004 + * 3手环戴上取下状态 (佩戴检测) 00000000000000000000000000001000 0x00000008 + * 4手表运行静止状态 00000000000000000000000000010000 0x00000010 + * 16SOS 报警 00000000000000010000000000000000 0x00010000 + * 17低电报警 00000000000000100000000000000000 0x00020000 + * 18出围栏报警(逃跑出蓝牙监控范围) 00000000000001000000000000000000 0x00040000 + * 19进围栏报警(目前没用到) 00000000000010000000000000000000 0x00080000 + * 20手环拆除报警 (表带剪断) 00000000000100000000000000000000 0x00100000 + * 21跌倒报警 00000000001000000000000000000000 0x00200000 + * 22震动报警 00000000010000000000000000000000 0x00400000 + * 23断电报警 (手表关机报警) 00000000100000000000000000000000 0x00800000 + * 24心率骤降报警 00000001000000000000000000000000 0x01000000 + * 25车辆启动 (手表用不到) 00000010000000000000000000000000 0x02000000 + * 比如 00200010,即表示00000000001000000000000000010000 + * 这个项目需要支持防拆 20、00000000000100000000000000000000 0x 00100000 1048576 + * 低电 17、00000000000000100000000000000000 0x 00020000 131072 + * 离线 23、00000000100000000000000000000000 0x 00800000 8388608 + * 逃逸报警 18\ 00000000000001000000000000000000 0x 00040000 262144 + * 分别是第四位为 1,第 21 位为 1,对应 21 位是跌倒报警 + * @param runtime + * @return + */ + public String getFZDDevStatus(Runtime runtime) { + StringBuilder sb = new StringBuilder(); + sb.append(Integer.toHexString(runtime.fzdDevStatus)); + if (sb.length() < 8) { + for (int i = 0; i < 8 - sb.length(); i++) + sb.insert(0, '0'); // pad with leading zero if needed + } + String hex = sb.toString(); + return hex; + } + + + public void updateFZDDevStatusLowbat(boolean lowbattery) { + + if (lowbattery) { + fzdDevStatus |= 0x00000001; + fzdDevStatus |= 0x00020000; + } else { + fzdDevStatus &= ~0x00000001; + fzdDevStatus &= ~0x00020000; + } + } + + public void updateFZDDevStatusWeared(boolean weared) { + if (weared) { + fzdDevStatus |= 0x00000008; + } else { + fzdDevStatus &= ~0x00000008; + } + } + + public void updateFZDDevStatusMoving(boolean moving) { + if (moving) { + fzdDevStatus &= ~0x00000010; + } else { + fzdDevStatus |= 0x00000010; + } + } + + public void updateFZDDevStatusEscape(boolean escape) { + if (escape) { + fzdDevStatus |= 0x00040000; + } else { + fzdDevStatus &= ~0x00040000; + } + + } + + public void setFZDDevStatus(AlarmType _alarmType) { + + switch (_alarmType) { + case ALARM_SOS: + fzdDevStatus |= 0x00010000; + break; + case ALARM_LOWBATTERY: + fzdDevStatus |= 0x00020000; + break; + case ALARM_ANTIOFF: +// fzdDevStatus&=0x00000008; + updateFZDDevStatusWeared(false); + break; + case ALARM_WEARED: + updateFZDDevStatusWeared(true); +// fzdDevStatus&=~0x00000008; + break; + case ALARM_LOCK_WATCH: + fzdDevStatus &= ~0x00100000; + break; + case ALARM_CUTOFF: + case ALARM_ILLEGAL_CUTOFF: + fzdDevStatus |= 0x00100000; + break; + case ALARM_FALL: + fzdDevStatus |= 0x00200000; + break; + case ALARM_ABNORMAL_HEART_RATE: + fzdDevStatus |= 0x01000000; + break; + case ALARM_HEART_RATE_HIGH: +// alarmType1="08"; + break; + + case ALARM_HEART_RATE_LOW: +// alarmType1="09"; + break; + + case ALARM_BPH_HIGH: +// alarmType1="10"; + break; + + case ALARM_BPH_LOW: +// alarmType1="11"; + break; + + case ALARM_BPL_HIGH: +// alarmType1="12"; + break; + + case ALARM_BPL_LOW: +// alarmType1="13"; + break; + case ALARM_SEDENTARY: +// alarmType1="14"; + break; + case ALARM_TEMP_HIGH: +// alarmType1="17"; + break; + case ALARM_TEMP_LOW: +// alarmType1="18"; + break; + case ALARM_POWER_OFF: + fzdDevStatus |= 0x00800000; + break; + + case ALARM_ESCAPE: + updateFZDDevStatusEscape(true); + break; + case ALARM_REMOVE_SOS: + fzdDevStatus &= ~0x00010000; + break; + case ALARM_NONE: + default: +// alarmType1="00000000"; + break; + } + + ICLogger.i("setFZDDevStatus " + String.format("0x%x", fzdDevStatus) + " " + fzdDevStatus); + + } + + public void dumpDevStatus() { + StringBuilder sb = new StringBuilder("get FZDStatus "); + if ((fzdDevStatus & 0x00800000) > 0) { + sb.append("ALARM_POWER_OFF "); + } + if ((fzdDevStatus & 0x00040000) > 0) { + sb.append("ALARM_ESCAPE "); + } + if ((fzdDevStatus & 0x01000000) > 0) { + sb.append("ALARM_ABNORMAL_HEART_RATE "); + } + if ((fzdDevStatus & 0x00200000) > 0) { + sb.append("ALARM_FALL "); + } + if ((fzdDevStatus & 0x00100000) > 0) { + sb.append("ALARM_ILLEGAL_CUTOFF "); + } + if ((fzdDevStatus & 0x00100000) == 0) { + sb.append("ALARM_LOCK_WATCH "); + } + if ((fzdDevStatus & 0x00020000) > 0) { + sb.append("ALARM_LOWBATTERY "); + } + if ((fzdDevStatus & 0x00010000) > 0) { + sb.append("ALARM_SOS "); + } + if ((fzdDevStatus & 0x00000008) > 0) { + sb.append("ALARM_ANTIOFF "); + } + if ((fzdDevStatus & 0x00000008) == 0) { + sb.append("ALARM_WEARED "); + } + ICLogger.i(sb.toString()); + } + + public String preCdmaInfo; + + public String preCellInfo; + + public String preTime; + + public int saveStepCount; + + private boolean shutdown; + + public static long lastLinkReceiveStamp = 0; + + private boolean PowerConnected = false; + + private long msPowerConnectionStatusChangedTime = 0; + + public void setPowerConnected(boolean connected) { + if (PowerConnected != connected) { + msPowerConnectionStatusChangedTime = System.currentTimeMillis(); + PowerConnected = connected; + } + } + + //获取上次开始充电到现在的时间 ms + public long getMsAfterLastPowerPlugin() { + if (isPowerConnected()) { + return (System.currentTimeMillis() - msPowerConnectionStatusChangedTime); + } else + return 0; + } + + //获取上次停止充电到现在的时间 ms + public long getMsAfterLastPowerPlugout() { + if (!isPowerConnected()) { + return (System.currentTimeMillis() - msPowerConnectionStatusChangedTime); + } else + return 0; + } + + public boolean isPowerConnected() { + return PowerConnected; + } + + private DnsUtil dnsUtil = null; + + public void initDnsUtil(Context context) { + if (dnsUtil == null) + dnsUtil = new DnsUtil(5, context); + } + + public DnsUtil getDnsUtil() { + return dnsUtil; + } + + private int lastStepCount = 0; + private int lastStepCountForBT = 0; + private long timestamp; + + public int totalStepCount; + + private int heartbeatCycle; + + + public int getHeartBeatCycle() { + return heartbeatCycle; + } + + public void setHeartBeatCycle(int cycle) { + heartbeatCycle = cycle; + } + + public heartRateStatus getHRS() { + return HRS; + } + + public void setHRS(heartRateStatus hrs) { + HRS = hrs; + } + + public int getLastStepCount() { + return lastStepCount; + } + + public void setLastStepCount(int st) { + lastStepCount = st; + } + + public int getLastStepCountForBT() { + return lastStepCountForBT; + } + + public void setLastStepCountForBT(int st) { + lastStepCountForBT = st; + } + + public String IMEI() { + return this.imei; + } + + public String IMEI_CID() { + return this.imei_cid; + } + + public String IMEI_CID_KEY() { + return this.imei_cid_key; + } + + public String IMSI() { + return this.imsi; + } + + + private boolean noTurnOffWifiOnScreenOff = false; + + public void setNoTurnOffOnScreenOff(boolean bol) { + noTurnOffWifiOnScreenOff = bol; + } + + public boolean isNoTurnOffWifiOnScreenOff() { + return noTurnOffWifiOnScreenOff; + } + + public boolean isAntioff = false; + private boolean isNeedAntioff; + + public boolean getNeedAntioff() { + return this.isNeedAntioff; + } + + public void setNeedAntioff(boolean paramBoolean) { + this.isNeedAntioff = paramBoolean; + } + + private boolean isNeedReportcutoff = false; + + public boolean needReportCutoff() { + return this.isNeedReportcutoff; + } + + public void setNeddReportCutoff(boolean needreport) { + this.isNeedReportcutoff = needreport; + } + + public String getBattery() { + return this.battery; + } + + public int getBatteryVotage() { + return this.batteryVoltage; + } + + public void setBatteryVoltage(int voltage) { + this.batteryVoltage = voltage; + } + + public boolean getBatteryLow() { + return this.batteryLow; + } + + public boolean getBatterychanging() { + return this.batterychanging; + } + + + public File getCacheDir() { + return this.cacheDir; + } + + public String getCdmaInfo() { + return this.cdmaInfo; + } + + public String getCellidInfoByAt() { + return this.cellidByAt; + } + + + public ContextProxy getContextProxy() { + return this.contextProxy; + } + + public String getCurrentCellInfo() { + return this.currentCellInfo; + } + + public DBHelper getDbHelper() { + return this.dbHelper; + } + + public String getDevice_id() { + return this.device_id; + } + + public String getDevice_key() { + return this.device_key; + } + + public File getFileDir() { + return this.fileDir; + } + + public boolean getHaveBatteryChange() { + return this.haveBatteryChange; + } + + + public String getHost() { + return this.testServerProp ? srvIP : this.host; + } + + public void setSrvIP(String ip) { + this.srvIP = ip; + } + + public String getSrvIP() { + return this.srvIP; + } + + public String getKey() { + return this.key; + } + + public String getLacInfoByAt() { + return this.lacByAt; + } + + public LBSHelper getLbsHelper() { + return this.lbsHelper; + } + + + public boolean getLockSimInfo() { + return this.lockSimInfo; + } + + + public String getMccAndMnc() { + return this.mccAndMnc; + } + + public int getPort() { + return this.port; + } + + public int getSaveStepCount() { + return this.saveStepCount; + } + + public int getSignalStrength() { + return this.SignalStrength; + } + + private String SignalInfo = ""; + + public void setSignalInfo(String info) { + this.SignalInfo = info; + } + + public String getSignalInfo() { + return this.SignalInfo; + } + + public long getTimestamp() { + return this.timestamp; + } + + public int getTotalStepCount() { + return this.totalStepCount; + } + + + public boolean isShutdown() { + return this.shutdown; + } + + + private static int batterylevel = 0; + + public int getBatterylevel() { + return batterylevel; + } + + public void setBattery(String paramString) { + this.battery = paramString; + } + + public void setBattery(int param) { + this.batterylevel = param; + } + + public void setBatteryLow(boolean paramBoolean) { + this.batteryLow = paramBoolean; + updateFZDDevStatusLowbat(batteryLow); //设置batterylow Alarm + } + + public void setBatterychanging(boolean paramBoolean) { + this.batterychanging = paramBoolean; + } + + public void setBelong(String paramString) { + this.belong = paramString; + } + + public void setCacheDir(File paramFile) { + this.cacheDir = paramFile; + } + + public void setCdmaInfo(String paramString) { + this.cdmaInfo = paramString; + } + + public void setCellinfo(String paramString) { + this.cellinfo = paramString; + } + + public void setCid(String paramString) { + this.cid = paramString; + } + + public void setContextProxy(ContextProxy paramContextProxy) { + this.contextProxy = paramContextProxy; + } + + public void setCurrentCellInfo(String paramString) { + this.currentCellInfo = paramString; + } + + public void setDBHelper(DBHelper paramDBHelper) { + this.dbHelper = paramDBHelper; + } + + public void setDevice_id(String paramString) { + this.device_id = paramString; + } + + public void setDevice_key(String paramString) { + this.device_key = paramString; + } + + public void setFileDir(File paramFile) { + this.fileDir = paramFile; + } + + public void setHaveBatteryChange(boolean paramBoolean) { + this.haveBatteryChange = paramBoolean; + } + + public void setHost(String _host) { + host = _host; + } + + public void setHostAndPort(String paramString, int paramInt) { + this.host = paramString; + this.port = paramInt; + } + + public void setPort(int _port) { + port = _port; + } + + public void setImeiAndCid(String paramString1, String paramString2) { + this.imei = paramString1; + this.cid = paramString2; + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append(paramString1); + stringBuilder.append(","); + stringBuilder.append(paramString2); + this.imei_cid = stringBuilder.toString(); + ICLogger.i("imei:" + imei + ",cid:" + cid); + } + + public void setImsi(String paramString) { + this.imsi = paramString; + } + + public void setKey(String paramString) { + this.key = paramString; + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append(this.imei_cid); + stringBuilder.append(","); + stringBuilder.append(paramString); + this.imei_cid_key = stringBuilder.toString(); + } + + public void setLbsHelper(LBSHelper paramLBSHelper) { + this.lbsHelper = paramLBSHelper; + } + + public void setLbsInfoByAt(String paramString1, String paramString2) { + this.lacByAt = paramString1; + this.cellidByAt = paramString2; + } + + + public void setLockSimInfo(boolean paramBoolean) { + this.lockSimInfo = paramBoolean; + } + + + public void setMccAndMnc(String MccMnc) { + this.mccAndMnc = MccMnc; + + String[] list = MccMnc.split(","); + if (list.length >= 2) { + gpsp.setMCC(list[0]); + gpsp.setMNC(list[1]); + } + ICLogger.i("setMccAndMnc " + MccMnc); + } + + public void setSaveStepCount(int paramInt) { + this.saveStepCount = paramInt; + } + + public void setShutdown(boolean paramBoolean) { + this.shutdown = paramBoolean; + } + + public void setSignalStrength(int signal) { + this.SignalStrength = signal; +// ICLogger.i("setSignalStrength "+signal); + } + + public void setTestServerProp(boolean paramBoolean) { + this.testServerProp = paramBoolean; + } + + public void setTimestamp(long paramLong) { + this.timestamp = paramLong; + } + + public void setTotalStepCount(int paramInt) { + this.totalStepCount = paramInt; + } + + private ICLocation gpsp = null; + + private String wifiInfo = ""; + + public void setWifiinfo(String info) { + wifiInfo = info; + } + + public String getWifiInfo() { + return wifiInfo; + } + + public Runtime() { + if (gpsp == null) gpsp = new ICLocation(); + } + + public ICLocation getLocationInstance() { + return gpsp; + } + + //暂时没有实现此功能 + public String getGPSLocationStarNums() { + return "000"; + } + + //此功能未实现 + public String getProtection() { + return "00"; + } + + // + public String getWorkModeStr() { + String gpsStr = String.format("%02d", getLocationInstance().getWorkingMod()); + + return gpsStr; + } + + //未实现睡眠监测 + public String getRolltimes() { + return "00"; + } + /* AP03 心跳包 end */ + + /* AP01 定位 */ + + + public double temperature_adjustValue = 0.0f; + + public boolean isGPSFixed() { + return (gpsp.getLocationStat() == ICLocation.LOCATION_STAT.LOCATION_FIXED); + } + + public String getGPSData() { + +// 2232.9806N11404.9355E000.1: 北纬22度32.9806分,东经114度04.9355分,速度为000.1 km/h,如经纬度无效,可默认全为0,如0000.0000N00000.0000E +// 纬度格式为: ddmm.mmmm ,长度不足长度前补0 +// 经度格式为:dddmm.mmmm,长度不足前补0 + StringBuilder sb = new StringBuilder(); + int lati = (int) gpsp.getLocation().lat; + int latl = (int) ((gpsp.getLocation().lat - lati) * 10000); + int loni = (int) gpsp.getLocation().lon; + int lonl = (int) ((gpsp.getLocation().lon - loni) * 10000); + int speedi = (int) gpsp.getLocation().speed; + int speedl = (int) ((gpsp.getLocation().speed - speedi) * 10); + String latStr = gpsp.getLocation().latStr; + String lonStr = gpsp.getLocation().lonStr; + String latname = gpsp.getLocation().lat_name; + String lonname = gpsp.getLocation().lon_name; + if (isGPSFixed()) { + if (gpsp.getLocation().lonStr.isEmpty()) { + String gpsStr = String.format("%04d.%04d%s%05d.%04d%s%03d.%01d", lati, latl, latname, loni, lonl, lonname, speedi, speedl); + sb.append("A").append(gpsStr); + } else { + String gpsStr = String.format("%sN%sE%03d.%01d", latStr.substring(0, 9), lonStr.substring(0, 10), speedi, speedl); + sb.append("A").append(gpsStr); + } + } else { + String gpsStr = String.format("%04d.%04dN%05d.%04dE%03d.%01d", 0, 0, 0, 0, 0, 0); + sb.append("V").append(gpsStr); + } + + + return sb.toString(); + } + + public String getMqttGPSData() { + +/*** + * A,22.570733,N,113.8626083,E,0.00,249.5,0.0,6 + * A,gps 定位有效 + * 22.570733,纬度 N, + * 113.8626083,经度 E, + * 0.00,速度 + * 249.5,方向 + * 0.0,海拔 + * 6,卫星个数 + */ + StringBuilder sb = new StringBuilder(); + int speedi = (int) gpsp.getLocation().speed; + int speedl = (int) ((gpsp.getLocation().speed - speedi) * 100); + + String latStr = gpsp.getLocation().latGPSStr; + String lonStr = gpsp.getLocation().lonGPSStr; + String latname = gpsp.getLocation().lat_name; + String lonname = gpsp.getLocation().lon_name; + ICLogger.i(" UD isfixed " + isGPSFixed() + " is in area " + bleInfo.is_in_area); + if (bleInfo.is_in_area == true) { + latStr = bleInfo.gps_n; + lonStr = bleInfo.gps_e; + latname = (latStr.trim().startsWith("-")) ? "S" : "N"; + lonname = (lonStr.trim().startsWith("-")) ? "W" : "E"; + } + String heading = String.valueOf(gpsp.getLocation().heading); + int starcount = gpsp.getLocation().used_gps_numbs; + if (isGPSFixed() || bleInfo.is_in_area) { + String gpsStr = String.format(",%s,%s,%s,%s,%d.%02d,%s,0.0,%d", latStr, latname, lonStr, lonname, speedi, speedl, heading, starcount); + sb.append("A").append(gpsStr); + + } else { + String gpsStr = String.format(",0.000,N,0.000,E,0.0,0.0,0.0,0"); + sb.append("V").append(gpsStr); + } + + ICLogger.i("UD " + sb.toString()); + + return sb.toString(); + } + + public String getFZDGPSData() { + +/*** + * A,22.570733,N,113.8626083,E,0.00,249.5,0.0,6 + * A,gps 定位有效 + * 22.570733,纬度 N, + * 113.8626083,经度 E, + * 0.00,速度 + * 249.5,方向 + * 0.0,海拔 + * 6,卫星个数 + */ + StringBuilder sb = new StringBuilder(); + int speedi = (int) gpsp.getLocation().speed; + int speedl = (int) ((gpsp.getLocation().speed - speedi) * 100); + String latStr = gpsp.getLocation().latGPSStr; + String lonStr = gpsp.getLocation().lonGPSStr; + String heading = String.valueOf(gpsp.getLocation().heading); + String latname = gpsp.getLocation().lat_name; + String lonname = gpsp.getLocation().lon_name; + int starcount = gpsp.getLocation().used_gps_numbs; + if (isGPSFixed()) { + String gpsStr = String.format(",%s,%s,%s,%s,%d.%02d,%s,0.0,%d", latStr, latname, lonStr, lonname, speedi, speedl, heading, starcount); + sb.append("A").append(gpsStr); + + } else { + String gpsStr = String.format(",0.000,N,0.000,E,0.0,0.0,0.0,0"); + sb.append("V").append(gpsStr); + } + + + return sb.toString(); + } + + public String getGPSHeading() { + int headingi = (int) gpsp.getLocation().heading; + int headingl = (int) ((gpsp.getLocation().heading - headingi) * 100); + String gpsStr = String.format("%03d.%02d", headingi, headingl); + return gpsStr; + } + + public String getFZDLBSMultiStationData() { + if (mFZDLBSMultiStationData.trim().isEmpty()) { + mFZDLBSMultiStationData = "0"; + } + return mFZDLBSMultiStationData; + } + + public String getFZDWifiData() { + + int apsum = 0; + String wifiinfo = getWifiInfo(); + if (!wifiinfo.isEmpty()) { + String[] list = wifiinfo.split("&"); + apsum = list.length; + } + StringBuffer sb = new StringBuffer(); + if (apsum == 0) { + sb.append(apsum); + } else { + sb.append(apsum).append(","); + wifiinfo = wifiinfo.replace("&", ",").replace("|", ","); + sb.append(wifiinfo); + } + return sb.toString(); + } + + private static String mLBSMultiStationData = ""; + + public void setLBSMultiStationData(String data) { + mLBSMultiStationData = data; + } + + private static String mFZDLBSMultiStationData = ""; + + public void setFZDLBSMultiStationData(String data) { + mFZDLBSMultiStationData = data; + } + + //AP03 用的多基站定位数据 + public String getLBSMultiStationData() { + // 7: 表示共有7组基站 +// 460: MCC 国家码 +// 0: MNC运营商代码 +// 9520|3671|10: LAC|CID|dbm表示一组基站信息,后面数量需和基站组数地应 10:dbm为信号强度多基站信号强度建议从高到低排列后上传,信号强度转正数:150 – abs(dbm) + if (mLBSMultiStationData.trim().isEmpty()) { + mLBSMultiStationData = "0,0,0,"; + } + return mLBSMultiStationData; + } + + + public String getLBSData() { + +// 460,0,9520,3671 : LBS基站数据,MCC国家码,460为中国,0:MNC,0为移动,9520:LAC,十进制,3671,CID,十进制 + StringBuilder sb = new StringBuilder(); + sb.append(gpsp.getMCC()).append(",") + .append(gpsp.getMNC()).append(",") + .append(gpsp.getLAC()).append(",") + .append(gpsp.getGSMStationCID()); + return sb.toString(); + } + + public String getWifiData() { + StringBuilder sb = new StringBuilder(); + + int i = 0; + for (String mac : gpsp.getLBSdata().wifi_aps.keySet()) { + sb.append("AP").append(i).append("|").append(mac).append("|").append(gpsp.getLBSdata().wifi_aps.get(mac)).append(","); + i++; + } + if (i > 0) { + int index = sb.lastIndexOf(","); + sb.replace(index, index + 1, ""); + } + return sb.toString(); + } + + + public boolean sleepDataReported = false; + + + public static String lastSitCheckTiimeyyyyMMddHHmmss = ""; + public static long lastSitCheckStepCount = -1; + + public static HealthInfo healthInfo = null; + + static { + healthInfo = new HealthInfo(); + healthInfo.reset(); + } + + public static boolean practising = false; + public static int practice_cycle = 60; + +} + diff --git a/app/src/main/java/com/ic/protocols/protocol_jiai.java b/app/src/main/java/com/ic/protocols/protocol_jiai.java index 4efe75b4..96d2d43f 100644 --- a/app/src/main/java/com/ic/protocols/protocol_jiai.java +++ b/app/src/main/java/com/ic/protocols/protocol_jiai.java @@ -1,2012 +1,2059 @@ -package com.ic.protocols; - -import android.content.ComponentName; -import android.content.Intent; -import android.net.Uri; -import android.os.Environment; -import android.text.TextUtils; - -import com.enqualcomm.support.Config; -import com.enqualcomm.support.CoreService; -import com.enqualcomm.support.bean.Alarm; -import com.enqualcomm.support.bean.Contact; -import com.enqualcomm.support.bean.Content; -import com.enqualcomm.support.bean.ICLocation; -import com.enqualcomm.support.bean.Runtime; -import com.enqualcomm.support.bean.StringMessage; -import com.enqualcomm.support.bean.VoiceContent; -import com.enqualcomm.support.bean.voicePacket; -import com.enqualcomm.support.service.HeartRateManager; -import com.enqualcomm.support.utils.Connection; -import com.enqualcomm.support.utils.ICLogger; -import com.enqualcomm.support.utils.TimeUtil; -import com.enqualcomm.support.utils.Util; - -import java.io.File; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; - -import static com.enqualcomm.support.Constants.ACTION_HEATR_RATE_START; -import static com.enqualcomm.support.LocationClient.LOCATION_MODE; -import static com.enqualcomm.support.bean.Contact.GROUP_ALL; -import static java.lang.Math.abs; - -public class protocol_jiai { - private static final String TAG = "ICSrv." + protocol_jiai.class.getSimpleName(); - - private static final String CMDHEADER = "IW"; - private static final String CMDEND = "#"; - private static final String CMDSPLIT = ","; - public static final String defaultServerIP="watch.jiai.pro"; - public static final int defaultServerPort=8090; - - public enum CMD_TYPE { - /*终端发起*/ - AP00,//登录包 - BP00, - AP01,//混合定位 - BP01, - AP02,//多基站定位 - BP02, - AP92,//CDMA 混合定位 - BP92, - AP03,//心跳包 - BP03, - AP05,//语音查询接收 - BP05, - AP07,//语音上行 - BP07, - AP10,//报警与地址回复 - BP10, - AP49,//心率上传 - BP49, - AP50,//体温上传 - BP50, - APHT,//心率血压上传 - BPHT, - APHP,//心率血压血氧上传 - BPHP, - APTM,//基站校时及获取定位 - BPTM, - APWT,//同步天气 - BPWT, - AP94,//消息已读 - BP94, - /* 服务器发起*/ - AP12, - BP12,//SOS 号码设置 - AP14, - BP14,//设置联系人白名单 - AP15, - BP15,//设置定位周期 - AP16, - BP16,//立即定位 - AP17, - BP17,//恢复出厂设置 - AP18, - BP18,//重启设备 - AP21, - BP21,//设置计步开关 - AP28, - BP28, //语音下行 - AP31, - BP31,//关机 - AP33, - BP33,//工作模式 - AP34, - BP34,//自定义工作模式 - APXL, - BPXL,//测量心率 - APXY, - BPXY,//测量血压 - APJZ, - BPJZ,//血压校准 - AP84, - BP84,//白名单开关 - AP85, - BP85,//设置闹钟 - AP86, - BP86,//心率血压测试周期 - AP87, - BP87,//体温测试周期 - AP89, - BP89,//心率血压阀值设置 - AP93, - BP93,//服务器下发文本 - APXT, - BPXT,//服务器下发测量体温 - UNKNOWN_CMD, - } - - private static HashMap cmdMap = null; - - static { - cmdMap = new HashMap(); - cmdMap.put(CMD_TYPE.AP00, "AP00"); - cmdMap.put(CMD_TYPE.BP00, "BP00"); - cmdMap.put(CMD_TYPE.AP01, "AP01"); - cmdMap.put(CMD_TYPE.BP01, "BP01"); - cmdMap.put(CMD_TYPE.AP02, "AP02"); - cmdMap.put(CMD_TYPE.BP02, "BP02"); - cmdMap.put(CMD_TYPE.AP92, "AP92"); - cmdMap.put(CMD_TYPE.BP92, "BP92"); - cmdMap.put(CMD_TYPE.AP03, "AP03"); - cmdMap.put(CMD_TYPE.BP03, "BP03"); - cmdMap.put(CMD_TYPE.AP05, "AP05"); - cmdMap.put(CMD_TYPE.BP05, "BP05"); - cmdMap.put(CMD_TYPE.AP07, "AP07"); - cmdMap.put(CMD_TYPE.BP07, "BP07"); - cmdMap.put(CMD_TYPE.AP10, "AP10"); - cmdMap.put(CMD_TYPE.BP10, "BP10"); - cmdMap.put(CMD_TYPE.AP49, "AP49"); - cmdMap.put(CMD_TYPE.BP49, "BP49"); - cmdMap.put(CMD_TYPE.AP50, "AP50"); - cmdMap.put(CMD_TYPE.BP50, "BP50"); - cmdMap.put(CMD_TYPE.APHT, "APHT"); - cmdMap.put(CMD_TYPE.BPHT, "BPHT"); - cmdMap.put(CMD_TYPE.APHP, "APHP"); - cmdMap.put(CMD_TYPE.BPHP, "BPHP"); - cmdMap.put(CMD_TYPE.APTM, "APTM"); - cmdMap.put(CMD_TYPE.BPTM, "BPTM"); - cmdMap.put(CMD_TYPE.APWT, "APWT"); - cmdMap.put(CMD_TYPE.BPWT, "BPWT"); - cmdMap.put(CMD_TYPE.AP94, "AP94"); - cmdMap.put(CMD_TYPE.BP94, "BP94"); - cmdMap.put(CMD_TYPE.AP12, "AP12"); - cmdMap.put(CMD_TYPE.BP12, "BP12"); - cmdMap.put(CMD_TYPE.AP14, "AP14"); - cmdMap.put(CMD_TYPE.BP14, "BP14"); - cmdMap.put(CMD_TYPE.AP15, "AP15"); - cmdMap.put(CMD_TYPE.BP15, "BP15"); - cmdMap.put(CMD_TYPE.AP16, "AP16"); - cmdMap.put(CMD_TYPE.BP16, "BP16"); - cmdMap.put(CMD_TYPE.AP17, "AP17"); - cmdMap.put(CMD_TYPE.BP17, "BP17"); - cmdMap.put(CMD_TYPE.AP18, "AP18"); - cmdMap.put(CMD_TYPE.BP18, "BP18"); - cmdMap.put(CMD_TYPE.AP21, "AP21"); - cmdMap.put(CMD_TYPE.BP21, "BP21"); - cmdMap.put(CMD_TYPE.AP28, "AP28"); - cmdMap.put(CMD_TYPE.BP28, "BP28"); - cmdMap.put(CMD_TYPE.AP31, "AP31"); - cmdMap.put(CMD_TYPE.BP31, "BP31"); - cmdMap.put(CMD_TYPE.AP33, "AP33"); - cmdMap.put(CMD_TYPE.BP33, "BP33"); - cmdMap.put(CMD_TYPE.AP34, "AP34"); - cmdMap.put(CMD_TYPE.BP34, "BP34"); - cmdMap.put(CMD_TYPE.APXL, "APXL"); - cmdMap.put(CMD_TYPE.BPXL, "BPXL"); - cmdMap.put(CMD_TYPE.APXY, "APXY"); - cmdMap.put(CMD_TYPE.BPXY, "BPXY"); - cmdMap.put(CMD_TYPE.APJZ, "APJZ"); - cmdMap.put(CMD_TYPE.BPJZ, "BPJZ"); - cmdMap.put(CMD_TYPE.AP84, "AP84"); - cmdMap.put(CMD_TYPE.BP84, "BP84"); - cmdMap.put(CMD_TYPE.AP85, "AP85"); - cmdMap.put(CMD_TYPE.BP85, "BP85"); - cmdMap.put(CMD_TYPE.AP86, "AP86"); - cmdMap.put(CMD_TYPE.BP86, "BP86"); - cmdMap.put(CMD_TYPE.AP87, "AP87"); - cmdMap.put(CMD_TYPE.BP87, "BP87"); - cmdMap.put(CMD_TYPE.AP89, "AP89"); - cmdMap.put(CMD_TYPE.BP89, "BP89"); - cmdMap.put(CMD_TYPE.AP93, "AP93"); - cmdMap.put(CMD_TYPE.BP93, "BP93"); - cmdMap.put(CMD_TYPE.APXT, "APXT"); - cmdMap.put(CMD_TYPE.BPXT, "BPXT"); - } - - private Connection mConnection=null; - private Runtime mRuntime=null; - - public protocol_jiai(Connection connect,Runtime runtime) { - mConnection=connect; - mRuntime=runtime; - - } - - private StringBuffer cmdbuf = new StringBuffer(); - - /* - 输入的字符串,如果有完整命令,返回 命令名 - 否则返回 空字符串 - */ - public static String isCmdStr(String msg) { - - int head_index = msg.indexOf(CMDHEADER); - if (head_index >= 0) { - int end_index = msg.indexOf("#", head_index); - if (end_index < 0) { - - return ""; - } - }else{ - return ""; - } - - for (CMD_TYPE key : cmdMap.keySet()) { - if (msg.startsWith(CMDHEADER + cmdMap.get(key))) { - ICLogger.i("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key)); - return cmdMap.get(key); - } - } - - return ""; - } - private void log(String msg) { - ICLogger.log(TAG, msg); - } - - private void log(String function, String msg) { - ICLogger.log(TAG, function, msg); - } - - - - /**/ - public static StringMessage genStringMessage(String cmdName, String msg){ - StringMessage sm=new StringMessage(new String[]{cmdName,msg}); - sm.refresh(msg); - sm.setDate(TimeUtil.getSystemDateYYMMDD(),TimeUtil.getSystemTimeHHmmss()); - return sm; - } - /* - 返回true 表示 cmd 全部解析成功 - 返回false表示 cmd至少有一条解析失败,失败的数据归入buffer,下一次识别接着使用 - 字符串通过#号进行识别。 - 每个字符串如果发现 #,却又没有Header,“IW”则会被丢弃 - */ - public boolean parserCmd(byte[] bytes) { - boolean iscmdComplete = false; - boolean ret = true; - String last_inCompletecmd = ""; - String cmd_msgbuf=new String(bytes); - log("bytes.size "+bytes.length); -// cmdbuf.append(cmd_msgbuf); - cmdbuf.append(cmd_msgbuf); - log("cmdbuf.size "+cmdbuf.length() +" "+cmdbuf.toString()); - /* - 如果不是 #结尾,就认为 接收数据不全,置位。 - */ - if (cmdbuf.toString().endsWith(CMDEND)) { - iscmdComplete = true; - } - String[] cmdlist = cmd_msgbuf.split(CMDEND); - int listlen = cmdlist.length; - log("listlen "+listlen); - /* - 如果解析出来的cmdlist不是空,且数据不是完整cmd则保留 最后一条数据到last_inCompletecmd - */ - if (cmdlist.length > 0 && iscmdComplete == false) { - listlen -= 1; - last_inCompletecmd = cmdlist[listlen]; - log("cmd not complete , " + last_inCompletecmd); - } - for (int i = 0; i < listlen; i++) { - for (CMD_TYPE key : cmdMap.keySet()) { - if (cmdlist[i].startsWith(CMDHEADER + cmdMap.get(key))) { - log("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key) + " , " + cmdlist[i]); - if (key == CMD_TYPE.BP28) { - //如果是BP28则 后面的数据是音频,需要保留 - byte[] amrBuf; - int amrLen = getBP28Amrlen(cmdlist[i] ); - if (bytes.length > amrLen) { - handleCmd(key, cmdlist[i], bytes); - } - } else { - handleCmd(key, cmdlist[i]); - } - } - } - } - - cmdbuf = new StringBuffer().append(last_inCompletecmd); - return ret; - } - public int getBP28Amrlen(String cmd) { - - String Name; - String appendIndex; - int packetCount; - int currentId; - int packetLen; - - - String[] msg=cmd.split(CMDSPLIT); - if (msg.length>=6){ - - try { - Name = msg[1]; - appendIndex = msg[2]; - packetCount = Integer.parseInt(msg[3]); - currentId = Integer.parseInt(msg[4]); - packetLen = Integer.parseInt(msg[5]); - - StringBuffer stringBuffer = new StringBuffer(); - stringBuffer.append("getBP28AmrLen name = ").append(Name) - .append(",appendIndex = ").append(appendIndex) - .append(",packetCount = ").append(packetCount) - .append(",currentId = ").append(currentId) - .append(",packetLen = ").append(packetLen); - - - log(stringBuffer.toString()); - return packetLen; - }catch (Exception e){ - ICLogger.e(e.getMessage(),e); - } - }else{ - log("getBP28AmrLen","format Error"); - - } - return -1; - } - /*登录*/ - public static StringMessage AP00(Runtime ds) { - //示例数据:IWAP00867155030001063# - return genStringMessage(cmdMap.get(CMD_TYPE.AP00),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP00)).append(ds.IMEI()).append(CMDEND).toString()); - } - - //处理 登录 BP00 - public void handleBP00(Runtime runtime,String cmd){ - String[] msg=cmd.split(CMDSPLIT); -// get Msg :IWBP00,20191229171933,8# (size)24 -// 12-30 01:19:33.861 6492-6492/com.enqualcomm.support I/ICSrv.protocolAPIHelper: found cmd keyid=BP00 ,keyname=BP00 , IWBP00,20191229171933,8 - - if (msg.length>=3) { - log("handleBP00", "Set Datetime " + msg[1]); - log("handleBP00", "Set TimeZone " + msg[2]); - - try { - Date datetime = TimeUtil.parseDatetiime(msg[1]); - int timezone = Integer.parseInt(msg[2]); - if (datetime != null) { - ICLogger.i("===" + TimeUtil.getDefaultTimeZone()); - TimeUtil.setTimeZone(timezone); - - - ICLogger.i("===" + TimeUtil.getDefaultTimeZone()); - TimeUtil.setSysDateTime(runtime.getContextProxy().context, datetime, timezone); - ICLogger.i("===" + TimeUtil.getDefaultTimeZone()); - - } -// Set Datetime 20200505112734 -// Set TimeZone 8 - }catch (Exception e){ - ICLogger.e(e.getMessage(),e); - } - }else{ - log("handleBP00","format Error"); - } - } - - - public static StringMessage AP03(Runtime ds) { - //示例数据:IWAP03,06000908000102,5555,30# IWAP03,000000null00000,0,0# - return genStringMessage(cmdMap.get(CMD_TYPE.AP03),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP03)).append(CMDSPLIT).append(String.format("%03d",abs(ds.getSignalStrength()))) - .append(ds.getGPSLocationStarNums()).append(ds.getBattery()).append("0") - .append(ds.getProtection()).append(ds.getWorkModeStr()).append(CMDSPLIT) - .append(ds.getTotalStepCount()).append(CMDSPLIT).append(ds.getRolltimes()).append(CMDEND).toString()); - } - //处理 心跳 BP03 - public void handleBP03(String cmd){ - - log("BP03心跳接收成功"); - } - - - public static StringMessage AP10(Runtime ds){ - - /** - * IWAP10080524A2232.9806N11404.9355E000.1 061830 323.87 060 009 080 0 05 02, - * 460,0,9520,3671, - * 00,zh-cn,00, - * 00为报警状态,00为无任何报警(01:SOS,02:低电,03:脱落报警,04:佩戴提醒,05/06:跌倒报警)) - * zh-cn:设备语言 - * 00:第一个0:是否需要回复地址信息,0:不回复,1回复. - * HOME|74-DE-2B-44-88-8C|97&HOME1|74-DE-2B-44-88-8C|97&HOME2|74-DE-2B-44-88-8C|97&HOME3|74-DE-2B-44-88-8C|97# - * IW标识符 - * AP10:命令字 - * 080524: 2008 年05 月24 - * A:“A”表示数据有效,”V”无效,如为V则取LBS数据 - * 2232.9806N11404.9355E000.1: 北纬22度32.9806分,东经114度04.9355分,速度为000.1 km/h,如经纬度无效,可默认全为0,如0000.0000N00000.0000E - * 061830: 格林尼治时间06 点18 分30 秒 - * 323.87:方向角323.87° - * 06000908000102:060为GSM信号,009为参与定位的卫星数,080为电池电量,0,保留位,01为设防状态,02为工作模式 ,(设防,工作模式如果为00,则代表无或未设置) - * 460,0,9520,3671 : LBS基站数据,MCC国家码,460为中国,0:MNC,0为移动,9520:LAC,十进制,3671,CID,十进制 - * 00为报警状态,00为无任何报警(01:SOS,02:低电,03:脱落报警,04:佩戴提醒,05:剪断报警,06:跌倒报警,07:心率异常, 08:心率过高, 09:心率过低,10:收缩压过高,11:收缩压过低,12:舒张压过高,13:舒张压过低,14:久坐提醒,15:非法解锁(剪断报警),16:锁定提醒(佩戴提醒),17:体温过高,18体温过低) - * zh-cn:设备语言 - * 00:第一个0:是否需要回复地址信息,0:不回复,1回复. - */ - return genStringMessage(cmdMap.get(CMD_TYPE.AP10),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP10)).append(TimeUtil.getShortDate()) - .append(ds.getGPSData()).append(TimeUtil.getShortTime()).append(ds.getGPSHeading()).append(String.format("%03d",abs(ds.getSignalStrength()))) - .append(ds.getGPSLocationStarNums()).append(ds.getBattery()).append("0") - .append(ds.getProtection()).append(ds.getWorkModeStr()).append(CMDSPLIT) - .append(ds.getLBSData()).append(CMDSPLIT) - .append(ds.getAlarmType()).append(CMDSPLIT) - .append(ds.getLanguage()).append(CMDSPLIT) - .append("00").append(CMDSPLIT) //不回复地址 - .append(ds.getWifiInfo()).append(CMDEND).toString()); - - } - - /*LBS+GPS混合定位*/ - public static StringMessage AP01(Runtime ds) { - //示例数据:IWAP01080524A2232.9806N11404.9355E000.1061830323.8706000908000102, - // 460,0,9520,3671, - // Home|74-DE-2B-44-88-8C|97& Home1|74-DE-2B-44-88-8C|97&Home2|74-DE-2B-44-88-8C|97& Home3|74-DE-2B-44-88-8C|97# -// IWAP01191230A2232.9807N11404.9355E000.1161320000.0006000910000000,460,00,9520,3671,# - return genStringMessage( cmdMap.get(CMD_TYPE.AP01),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP01)).append(TimeUtil.getShortDate()) - .append(ds.getGPSData()).append(TimeUtil.getShortTime()).append(ds.getGPSHeading()).append(String.format("%03d",abs(ds.getSignalStrength()))) - .append(ds.getGPSLocationStarNums()).append(ds.getBattery()).append("0") - .append(ds.getProtection()).append(ds.getWorkModeStr()).append(CMDSPLIT) - .append(ds.getLBSData()).append(CMDSPLIT).append(ds.getWifiInfo()).append(CMDEND).toString()); - } - - //处理 定位 BP01 - public void handleBP01(String cmd){ - log("BP01定位接收成功"); - } - - - - /*LBS+WiFi混合定位*/ - public static StringMessage AP02(Runtime ds) { - //示例数据:IWAP02, - // zh_cn, - // 0, - // 7, - // 460,0, - // 9520|3671|13,9520|3672|12,9520|3673|11,9520|3674|10,9520|3675|9,9520|3676|8,9520|3677|7, - // 4, - // 1|D8-24-BD-79-FA-1F|59&2|3C-46-D8-6D-CE-01|81&3|0C-4C-39-1A-7C-65|69&4|70-A8-E3-5D-D7-C0|65# -// IW标识符 -// AP02:命令字 -// zh_cn: 语言标志 -// 0:回复标识,为0时不回复地址,为 1 时,服务器回复地址信息 -// 7: 表示共有7组基站 -// 460: MCC 国家码 -// 0: MNC运营商代码 -// 9520|3671|10: LAC|CID|dbm表示一组基站信息,后面数量需和基站组数地应 10:dbm为信号强度多基站信号强度建议从高到低排列后上传,信号强度转正数:150 – abs(dbm) -// 4: 表示WIFI组数, -// 1|D8-24-BD-79-FA-1F|59: ssid|mac地址|信号强度,信号强度转正数:150 – abs(信号强度) - - int apsum=0; - String wifiinfo=ds.getWifiInfo(); - if (!wifiinfo.isEmpty()) { - String[] list = wifiinfo.split("&"); - apsum = list.length; - } - - ICLogger.i("Wifi ap sum "+apsum); - return genStringMessage(cmdMap.get(CMD_TYPE.AP02),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP02)).append(CMDSPLIT) - .append(ds.getLanguage()).append(CMDSPLIT) - .append(0).append(CMDSPLIT) //为0时不回复地址 - .append(ds.getLBSMultiStationData()).append(CMDSPLIT) //基站信息数据 - .append(apsum).append(CMDSPLIT).append(ds.getWifiInfo()).append(CMDEND).toString()); //wifi信息数据 - } - - //处理 定位 BP01 - public void handleBP02(String cmd){ - log("BP02定位接收成功"); - } - - - - public static StringMessage APXL(String id){ -//设备响应: IWAPXL,080835# - //080835:指令流水号 - return genStringMessage("APXL",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APXL)) - .append(CMDSPLIT).append(id) - .append(CMDEND).toString()); - } - - /** - * 测量心率 - * @param cmd - * @param connection - */ - public void handleBPXL(String cmd, Connection connection){ - //IWBPXL,353456789012345,080835# - //说明: - //IW:标识符 - //BPXL : 命令字符 - //353456789012345:IMEI号,设备唯一ID - //080835 :指令流水号 - //设备响应: IWAPXL,080835# - //080835:指令流水号 - String[] list=cmd.split(CMDSPLIT); - if (list.length==3){ - String index=list[2]; - String imei=list[1]; - ICLogger.i("Handle BPXL IMEI "+imei+",index "+index); - connection.send(APXL(index)); - }else{ - ICLogger.i("BPXL format error!"); - } - - } - - public static StringMessage APXY(String id){ -//设备响应: IWAPXY,080835# - //080835:指令流水号 - return genStringMessage("APXY",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APXY)) - .append(CMDSPLIT).append(id) - .append(CMDEND).toString()); - } - - /** - * 测量血压 - * @param cmd - * @param connection - */ - public void handleBPXY(String cmd,Connection connection){ - //IWBPXY,353456789012345,080835# - //说明: - //IW:标识符 - //BPXL : 命令字符 - //353456789012345:IMEI号,设备唯一ID - //080835 :指令流水号 - //设备响应: IWAPXY,080835# - //080835:指令流水号 - String[] list=cmd.split(CMDSPLIT); - if (list.length==3){ - String index=list[2]; - String imei=list[1]; - ICLogger.i("Handle BPXY IMEI "+imei+",index "+index); - connection.send(APXY(index)); - }else{ - ICLogger.i("BPXY format error!"); - } - - } - - - - public static StringMessage APJZ(String id,String BPH,String BPL,String Age,String Sex){ - //设备响应: IWAPJZ,792997,120,85,42,1# - //792997:指令流水号 - // 高压120,低压85,年龄42,1 男性 - return genStringMessage("APJZ",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APJZ)) - .append(CMDSPLIT).append(id) - .append(CMDSPLIT).append(BPH) - .append(CMDSPLIT).append(BPL) - .append(CMDSPLIT).append(Age) - .append(CMDSPLIT).append(Sex) - .append(CMDEND).toString()); - } - - /** - * - * @param cmd - * @param connection - * @param runtime - */ - public void handleBPJZ(String cmd,Connection connection,Runtime runtime){ - //cmdbuf.size 42 IWBPJZ,867155030001063,199600,120,85,45,1# 高压120,低压85,年龄45,男性 -// cmdbuf.size 42 IWBPJZ,867155030001063,909957,120,85,42,0# 高压120,低压85,年龄42,女性 - //IWBPJZ,353456789012345,080835,110,75# - //说明: - //IW:标识符 - //BPJZ : 命令字符 - //353456789012345:IMEI号,设备唯一ID - //110:高压值 - //75:低压值 - //080835 :指令流水号 - //设备响应: IWAPJZ,792997,120,85,42,1# - //792997:指令流水号 - String[] list=cmd.split(CMDSPLIT); - if (list.length==7){ - String index=list[2]; - String imei=list[1]; - String strBPH=list[3]; - String strBPL=list[4]; - String strAge=list[5]; - String strSex=list[6]; - - connection.send(APJZ(index,strBPH,strBPL,strAge,strSex)); - try { - runtime.getHRS().setXY_Ref(Integer.parseInt(strBPH), Integer.parseInt(strBPL), Integer.parseInt(strAge), Integer.parseInt(strSex)); - ICLogger.i("Handle BPJZ IMEI " + imei + ",index " + index + ", BPH " + strBPH + ", BPL " + strBPL + ", Age " + strAge + ", Sex " + (strSex.equals("1") ? "男" : "女")); - }catch (Exception e){ - ICLogger.e(e.getMessage(),e); - } - }else{ - ICLogger.i("BPXY format error!"); - } - } - - - - //重启 - - - public static StringMessage AP18(String index){ - return genStringMessage("AP18",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP18)) - .append(CMDSPLIT).append(index) - .append(CMDEND).toString()); - } - - public void handleBP18(Connection connection,String cmd) { - - // IWBP18,867155030001063,161723 - String[] cmdlist=cmd.split(CMDSPLIT); - if (cmdlist.length==3) { - - connection.send(AP18(cmdlist[2])); - - } - } - //恢复出厂设置 - - public static StringMessage AP17(String index){ - return genStringMessage("AP17",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP17)) - .append(CMDSPLIT).append(index) - .append(CMDEND).toString()); - } - public void handleBP17(Connection connection,String cmd) { - - // IWBP17,867155030001063,161723 - String[] cmdlist=cmd.split(CMDSPLIT); - if (cmdlist.length==3) { - - connection.send(AP17(cmdlist[2])); - - } - } - - //关机 - - - public static StringMessage AP31(String index){ - return genStringMessage("AP31",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP31)) - .append(CMDSPLIT).append(index) - .append(CMDEND).toString()); - } - public void handleBP31(Connection connection,String cmd) { - - // IWBP31,867155030001063,161723 - String[] cmdlist=cmd.split(CMDSPLIT); - if (cmdlist.length==3) { - - connection.send(AP31(cmdlist[2])); - - } - } - - //设置SOS号码 - public static StringMessage AP12(String index,String phNum1,String phNum2,String phNum3){ - return genStringMessage("AP12",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP12)) - .append(CMDSPLIT).append(index) - .append(CMDSPLIT).append(phNum1) - .append(CMDSPLIT).append(phNum2) - .append(CMDSPLIT).append(phNum3) - .append(CMDEND).toString()); - } - - //设置SOS号码 - public void handleBP12(Connection connection,String cmd,Runtime runtime){ - // IWBP12,353456789012345,080835,135XXXXXXXX,135XXXXXXXX,135XXXXXXXX# - String[] cmdlist=cmd.split(CMDSPLIT); - if (cmdlist.length>=3){ - String index=cmdlist[2]; - String phNum1=cmdlist.length==3?"":cmdlist[3]; - String phNum2=cmdlist.length>3?(cmdlist.length==4?"":cmdlist[4]):""; - String phNum3=(cmdlist.length>4)?(cmdlist.length==5? "":cmdlist[5]):""; - ICLogger.i(new StringBuffer().append("get Emegency Numbs "+phNum1+","+phNum2+","+phNum3).toString()); - connection.send(AP12(index,phNum1,phNum2,phNum3)); - - ArrayList contactArray=new ArrayList(); - if (!phNum1.isEmpty()) contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos1",phNum1)); - if (!phNum2.isEmpty()) contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos2",phNum2)); - if (!phNum3.isEmpty()) contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos3",phNum3)); - - runtime.getDbHelper().saveContacts(contactArray,false,false,false,false,false,true); - - }else{ - ICLogger.i(" BP12 format error!"); - } - } - - - public static StringMessage AP14(String index,String[] phnumbs){ - return genStringMessage("AP14",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP14)) - .append(CMDSPLIT).append(index) - .append(CMDSPLIT).append(phnumbs[0]) - .append(CMDSPLIT).append(phnumbs[1]) - .append(CMDSPLIT).append(phnumbs[2]) - .append(CMDSPLIT).append(phnumbs[3]) - .append(CMDSPLIT).append(phnumbs[4]) - .append(CMDSPLIT).append(phnumbs[5]) - .append(CMDSPLIT).append(phnumbs[6]) - .append(CMDSPLIT).append(phnumbs[7]) - .append(CMDSPLIT).append(phnumbs[8]) - .append(CMDSPLIT).append(phnumbs[9]) - .append(CMDEND).toString()); - } - //设置通讯录,白名单(10个) - public void handleBP14(Connection connection,String cmd , Runtime runtime){ -// IWBP14,867155030001063,357444,9b44529b|13554820016,,,,,,,,, -/** - * IWBP14,353456789012345,080835, - * D3590D54|135xxxxxxxxxx, - * D3590D54|135xxxxxxxxxx, - * D3590D54|135xxxxxxxxxx, - * D3590D54|135xxxxxxxxxx, - * D3590D54|135xxxxxxxxxx, - * D3590D54|135xxxxxxxxxx, - * D3590D54|135xxxxxxxxxx, - * D3590D54|135xxxxxxxxxx, - * D3590D54|135xxxxxxxxxx, - * D3590D54|135xxxxxxxxxx# - */ - String[] cmdlist=cmd.split(CMDSPLIT); - String[] phnums=new String[]{"","","","","","","","","",""}; - StringBuffer sb=new StringBuffer().append("recv phone Numbs "); - if (cmdlist.length>=3){ - switch (cmdlist.length){ - case 13: - phnums[9]=cmdlist[12]; - sb.append(phnums[9]).append(","); - case 12: - phnums[8]=cmdlist[11]; - sb.append(phnums[8]).append(","); - case 11: - phnums[7]=cmdlist[10]; - sb.append(phnums[7]).append(","); - case 10: - phnums[6]=cmdlist[9]; - sb.append(phnums[6]).append(","); - case 9: - phnums[5]=cmdlist[8]; - sb.append(phnums[5]).append(","); - case 8: - phnums[4]=cmdlist[7]; - sb.append(phnums[4]).append(","); - case 7: - phnums[3]=cmdlist[6]; - sb.append(phnums[3]).append(","); - case 6: - phnums[2]=cmdlist[5]; - sb.append(phnums[2]).append(","); - case 5: - phnums[1]=cmdlist[4]; - sb.append(phnums[1]).append(","); - case 4: - phnums[0]=cmdlist[3]; - sb.append(phnums[0]).append(","); - - } - - String index=cmdlist[2]; - ICLogger.i(sb.toString()); - connection.send(AP14(index,phnums)); - ArrayList contactArray=new ArrayList(); - for (int i=0; i< phnums.length;i++){ - String[] tmp= phnums[i].split("\\|"); - if (tmp.length==2){ - String name= Util.decodeUnicode2Utf8(tmp[0]); - String phonem=tmp[1]; - ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length+" , name="+name+",-"+phonem); - contactArray.add(new Contact(Contact.CATEGORY_CALL,name,phonem)); - }else{ - ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length); - - } - } -// contactArray.add(new Contact(Contact.CATEGORY_GROUP,"All","666")); -// contactArray.add(new Contact(Contact.CATEGORY_PARTNER,"PARTNER","666")); -// contactArray.add(new Contact(Contact.CATEGORY_CARE,"CARE","666")); -// contactArray.add(new Contact(Contact.CATEGORY_VOLTE,"VOLTE","666")); - - runtime.getDbHelper().saveContacts(contactArray,false,false,true,false,false,false); - - }else{ - ICLogger.i(" BP14 format error!"); - } - - } - - - - public static StringMessage AP85(Runtime ds,String cmddata){ -//示例数据:IWAP49,68## - return genStringMessage("AP85",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP85)) - .append(CMDSPLIT).append(cmddata) - .append(CMDEND).toString()); - - } - //设置闹钟 - public void handleBP85(String cmd , Connection connection,Runtime runtime){ -// IWBP85,867155030001063,155312,1,1,0235,12,1,1 -// IWBP85,867155030002145,945166,1,0, -// IWBP85,867155030001064,265960,1,1,1130,,1,1 -// IWBP85,353456789012345,080835,1,3, 0900,135,1,1@0900 ,135,1,2@0900 ,135,1,3# -//353456789012345:IMEI号,设备唯一ID -//080835 :指令流水号 -//1: 表示闹钟总开关,1为开,0 为关 -//3: 表示闹钟个数 -//0900 ,135,1,1,表示一组闹钟,0900表示早上09:00, 135表示周一周三周五,使用24小时制 -//1表示该组闹钟开启或关闭状态 1表示开启 0表示关闭 -//1表示吃药提醒 -//2 表示喝水提醒 -//3 表示久坐提醒 -//多组闹钟之间用”@”符号分隔 - - String imei="",cmdindex="0"/*指令流水号*/; - int all_alarmswitch=0 /*总开关 1为开,0 为关*/, - alarmswitch=0 /*1为开,0 为关*/, - alarmcount=0 /*表示闹钟个数*/; - String alarmtime="";//0900表示早上09:00 - int alarmtype=1; //1表示吃药提醒 , 2 表示喝水提醒 ,3 表示久坐提醒 - String repeat="";// 135表示周一周三周五,使用24小时制 - String[] datalist= cmd.split("@"); - ArrayList alarmlist=new ArrayList<>(); - - - if (datalist.length >0){ - - - for (int i =0 ; i< datalist.length;i++){ - String [] cmdarglist=datalist[i].split(","); - - if (i == 0){ - if (cmdarglist.length == 9){ - try { - imei = cmdarglist[1]; - cmdindex = cmdarglist[2]; - all_alarmswitch = Integer.parseInt(cmdarglist[3]); - alarmcount = Integer.parseInt(cmdarglist[4]); - alarmtime = cmdarglist[5]; - repeat = cmdarglist[6]; - alarmswitch = Integer.parseInt(cmdarglist[7]); - alarmtype = Integer.parseInt(cmdarglist[8]); - log(new StringBuilder("imei ").append(imei) - .append(", cmdindex ").append(cmdindex) - .append(", allswitch=").append(all_alarmswitch) - .append(", all alarm count=").append(alarmcount) - .toString() - ); - - log(new StringBuilder("alarmtime ").append(alarmtime) - .append(", relpeat ").append(repeat) - .append(", switch=").append(alarmswitch) - .append(", alarmtype=").append(alarmtype) - .toString() - ); - alarmlist.add(new Alarm("ST" + alarmtime.substring(0, 2) + "." + alarmtime.substring(2), "W" + repeat, "CON", alarmswitch == 1 ? "ON" : "OFF", "闹铃")); - }catch (Exception e){ - ICLogger.e(e.getMessage(),e); - } - }else if (cmdarglist.length == 5) { - try { - imei = cmdarglist[1]; - cmdindex = cmdarglist[2]; - all_alarmswitch = Integer.parseInt(cmdarglist[3]); - alarmcount = Integer.parseInt(cmdarglist[4]); - }catch (Exception e){ - ICLogger.e(e.getMessage(),e); - } - }else{ - log("data len is too small!"); - } - }else{ - if (cmdarglist.length == 4){ - try { - alarmtime = cmdarglist[0]; - repeat = cmdarglist[1]; - alarmswitch = Integer.parseInt(cmdarglist[2]); - alarmtype = Integer.parseInt(cmdarglist[3]); - - log(new StringBuilder("set alarmtime ").append(alarmtime) - .append(", relpeat ").append(repeat) - .append(", switch=").append(alarmswitch) - .append(", alarmtype=").append(alarmtype) - .toString() - ); - - alarmlist.add(new Alarm("ST" + alarmtime.substring(0, 2) + "." + alarmtime.substring(2), "W" + repeat, "CON", alarmswitch == 1 ? "ON" : "OFF", "闹铃")); - }catch (Exception e){ - ICLogger.e(e.getMessage(),e); - } - }else{ - log("data len is too small!"); - } - - } - }//循环获取alarm数据结束 - runtime.getDbHelper().saveAlarm(alarmlist); - - //do clean and set alarm things - - } -//IWBP85,867155030002145,410385,1,0,# - - String replacement=new StringBuilder("IWBP85,").append(imei).append(",").toString(); - String replycmd = cmd.replace(replacement,""); - ICLogger.i("gen reply "+replacement+" "+replycmd); - connection.send(AP85(runtime,replycmd)); - } - - -// AP05命令L02服务器不适用 -// public static String AP05(boolean recvFlag){ -// -//// IWAP05,1# -// return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP05)) -// .append(CMDSPLIT).append(recvFlag?1:0) -// .append(CMDEND).toString(); -// -// } -// -// -// public void handleBP05(String cmd){ -//// IWBP05,6# -// String[] cmdlist=cmd.split(CMDSPLIT); -// if (cmdlist.length>1){ -// ICLogger.i(" 服务器有 " +cmdlist[1]+" 条语音未接收!"); -// } -// } - - - - - public static byte[] AP07(String packetTime,int count,int index,int datalen,byte[] amrdata){ -//IWAP07,20140818064408,6,1,1024,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX# -//说明: -//IW:标识符 -//AP07 : 命令字符 -//20140818064408 :yyyyMMddHHmmss 格式的年月日时分秒,设备录音时间 -//6:语音包分包总数 -//1 :当前包数,第一包为1,第二包为2,。。。。。。同一个语音包的语音时间相同 -//1024 :语音包长度 -//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:当前音频数据, 每个音频数据包大小为1024字节,最后一包不足1024的取实际字节数 -//语音包上传规则: -//按包次序依次上传,上传后如果没有收到服务器的响应包,则继续上传该语音包。 -//收到设备回复确认数据包接收成功状态后,继续开始依次上传下一个数据包。。。。。。 -//如果设备回复确认数据包接收失败状态,则重复发送上一个数据包 - - - String sb=new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP07)) - .append(CMDSPLIT).append(packetTime) - .append(CMDSPLIT).append(count) - .append(CMDSPLIT).append(index) - .append(CMDSPLIT).append(datalen) - .append(CMDSPLIT).toString(); - - byte[] sentbuf=new byte[sb.length()+datalen+1]; - System.arraycopy(sb.getBytes(),0,sentbuf,0,sb.length()); - System.arraycopy(amrdata,0,sentbuf,sb.length(),datalen); - sentbuf[sb.length()+datalen]='#'; - - return sentbuf; - - } - - - public void handleBP07(String cmd , Connection connection ){ -//平台响应: IWBP07,20140818064408,6,1,1# -//20140818064408:设备语音时间,yyyyMMddHHmmss 格式的年月日时分秒 -//6:语音包分包总数 -//1:当前设备收到的是第几个包 -//1:表示服务器接受数据成功,0表示服务器接受数据失败 - String[] cmdlist=cmd.split(CMDSPLIT); - if (cmdlist.length==5){ - try { - String time = cmdlist[1]; - int packetCount = Integer.parseInt(cmdlist[2]); - int packetIndex = Integer.parseInt(cmdlist[3]); - int receiveSuccess = Integer.parseInt(cmdlist[4]); - ICLogger.i("服务器在" + time + " 收到语音 " + packetIndex + "/" + packetCount + " " + (receiveSuccess == 1 ? "成功" : "失敗")); - if (receiveSuccess == 1) { - //如果服务器接收 语音成功,则设置下一个要发送的语音包Index,当index == packetCount的时候表示所有包发送完毕,停止继续发送 - voicePacket.getInstanceSent().setCurrentIndexToSent(packetIndex); - } - //发送消息,再次检查要发送的语音包,确认其发送完毕 - connection.DeliverCMDMessageToSystem("SentVoicePacket", "SentVoicePacket"); - }catch (Exception e){ - ICLogger.e(e.getMessage(),e); - } - }else{ - ICLogger.i(" BP07 Format error!"); - } - } - - - - public static StringMessage AP33(String cmdindex,int workMode){ -//IWAP33,080835,1# -//080835:指令流水号 -//1:设置信息,供服务器同步 - return genStringMessage("AP33",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP33)) - .append(CMDSPLIT).append(cmdindex) - .append(CMDSPLIT).append(workMode) - .append(CMDEND).toString()); - } - - //设置工作模式 - public void handleBP33(Connection connection,Runtime runtime,String cmd){ - -// IWBP33,867155030001063,560555,1 -// IW:标识符 -// BP33 : 命令字符 -// 353456789012345:IMEI号,设备唯一ID -// 080835:指令流水号 -// 1:设备工作模式,1:正常模式,2:省电模式,3:紧急模式 - - String[] cmdlist=cmd.split(","); - if (cmdlist.length == 4){ - - try { - log("work mode " + cmdlist[3]); - int mod = Integer.parseInt(cmdlist[3]); - int Cycle = 900; - switch (mod) { - case ICLocation.NORMAL_MOD: - Cycle = 900; - break; - case ICLocation.LOWPOWER_MOD: - Cycle = 3600; - break; - case ICLocation.EMERGNECY_MOD: - case ICLocation.REALTIME_MOD: - Cycle = 60; - break; - - } - - StringMessage msg = AP33(cmdlist[2], mod); - //设定当前工作模式及循环频率 - connection.send(msg); - log("reply msg " + msg.isFromCache()); - log("LOCATION_MODE " + LOCATION_MODE + " mod " + mod); - Config.setLocationMode(runtime.getContextProxy().context, mod); - Config.setLocationCycle(runtime.getContextProxy().context, Cycle); - runtime.getLocationInstance().setLocation_cycle(Cycle); - runtime.getLocationInstance().setWorkingMod(mod); -// CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod()); - //此处设置好配置后,会在LocationClient通过消息开始执行及时定位操作。 - }catch (Exception e){ - ICLogger.e(e.getMessage(),e); - } - } - - } - - - public static StringMessage AP34(String cmdindex,int workMode){ -//IWAP34,588854,1# -//080835:指令流水号 -//8:模式 - return genStringMessage("AP34",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP34)) - .append(CMDSPLIT).append(cmdindex) - .append(CMDSPLIT).append(workMode) - .append(CMDEND).toString()); - } - - //设置自定义工作模式 - public void handleBP34(Connection connection,Runtime runtime,String cmd){ - -// IWBP34,867155030001063,588854,8,900,1# -// IW:标识符 -// BP33 : 命令字符 -// 353456789012345:IMEI号,设备唯一ID -// 080835:指令流水号 -// 1:设备工作模式,1:正常模式,2:省电模式,3:紧急模式 - - String[] cmdlist=cmd.split(","); - if (cmdlist.length == 6){ - - - log("work mode "+cmdlist[3]); - try { - int mod = Integer.parseInt(cmdlist[3]); - int Cycle = Integer.parseInt(cmdlist[4]); - int gpson = Integer.parseInt(cmdlist[5]); - - StringMessage msg = AP34(cmdlist[2], mod); - //设定当前工作模式及循环频率 - connection.send(msg); - - if (gpson == 1) { - mod = ICLocation.CUSTOM_MOD8_GPS; - } else { - mod = ICLocation.CUSTOM_MOD8_WIFI; - } - log("reply msg " + msg.isFromCache()); - log("LOCATION_MODE " + LOCATION_MODE + " mod " + mod + ", cycle = " + Cycle + ", GPS On= " + gpson); - Config.setLocationMode(runtime.getContextProxy().context, mod); - Config.setLocationCycle(runtime.getContextProxy().context, Cycle); - runtime.getLocationInstance().setLocation_cycle(Cycle); - runtime.getLocationInstance().setWorkingMod(mod); -// CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod()); - //此处设置好配置后,会在LocationClient通过消息开始执行及时定位操作。 - }catch (Exception e){ - ICLogger.e(e.getMessage(),e); - } - } - - } - - /** - * 心率上传,返回协议字串 - * @param ds - * @return - */ - public static StringMessage AP49(Runtime ds){ - //示例数据:IWAP49,68## - return genStringMessage(cmdMap.get(CMD_TYPE.AP49),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP49)) - .append(CMDSPLIT).append(ds.getHRS().getPPG()) - .append(CMDEND).toString()); - - } - -/*** - * 9温度数据上传(上行协议号:AP50,响应:BP50) - * 示例: - * IWAP50,36.7,90# - * 说明: - * IW:标识符 - * AP50 : 命令字符 - * 36.7:温度 - * 90:电量 - * 平台响应: IWBP50# - * 说明: 本消息适用所有终端 - */ -public static StringMessage AP50(Runtime ds){ - //示例数据:IWAP50,36.7,90# - return genStringMessage(cmdMap.get(CMD_TYPE.AP50),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP50)) - .append(CMDSPLIT).append(ds.tempInfo.currentBodyTemp) - .append(CMDSPLIT).append("100") - .append(CMDEND).toString()); - -} - - /** - * 返回上传心率血压的协议字串 - * @param ds - * @return - */ - public static StringMessage APHT(Runtime ds){ - //IWAPHT,60,130,85# - //说明: - //IW:标识符 - //APHT : 命令字符 - //60 : 表示心率 - //130: 血压高压 [收缩压] - //85 : 血压低压 [舒张压] - //平台响应: IWBPHT# - //表示平台已接收,可不作响应 - return genStringMessage(cmdMap.get(CMD_TYPE.APHT),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APHT)) - .append(CMDSPLIT).append(ds.getHRS().getPPG()) - .append(CMDSPLIT).append(ds.getHRS().getBPH()) - .append(CMDSPLIT).append(ds.getHRS().getBPL()) - .append(CMDEND).toString()); - } - public static StringMessage APHT(int ppg,int bph,int bpl){ - //IWAPHT,60,130,85# - //说明: - //IW:标识符 - //APHT : 命令字符 - //60 : 表示心率 - //130: 血压高压 [收缩压] - //85 : 血压低压 [舒张压] - //平台响应: IWBPHT# - //表示平台已接收,可不作响应 - return genStringMessage(cmdMap.get(CMD_TYPE.APHT),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APHT)) - .append(CMDSPLIT).append(ppg) - .append(CMDSPLIT).append(bph) - .append(CMDSPLIT).append(bpl) - .append(CMDEND).toString()); - } - public static StringMessage APHP(Runtime ds){ - //IWAPHP,60,130,85,95,90, , , , , , , , # - //IW:标识符 - //APHT : 命令字符 - //60 : 表示心率 - //130: 血压高压 [收缩压] - //85 : 血压低压 [舒张压] - //95:血氧 - //90:血糖 -// 本消息适用所有终端,其中需要每项指标不一定全部有值,如果无值,则留空 - return genStringMessage(cmdMap.get(protocol_ic.CMD_TYPE.APHP),new StringBuffer(CMDHEADER).append(cmdMap.get(protocol_ic.CMD_TYPE.APHP)) - .append(CMDSPLIT).append(ds.getHRS().getPPG()) - .append(CMDSPLIT).append(ds.getHRS().getBPH()) - .append(CMDSPLIT).append(ds.getHRS().getBPL()) - .append(CMDSPLIT).append(ds.getHRS().getSpo2()) - .append(CMDSPLIT).append(0) - .append(CMDSPLIT) - .append(CMDSPLIT) - .append(CMDSPLIT) - .append(CMDSPLIT) - .append(CMDSPLIT) - .append(CMDSPLIT) - .append(CMDSPLIT) - .append(CMDSPLIT) - .append(CMDEND).toString()); - } - public static StringMessage APHP(int ppg,int bph, int bpl, int spo2){ - //IWAPHP,60,130,85,95,90, , , , , , , , # - //IW:标识符 - //APHT : 命令字符 - //60 : 表示心率 - //130: 血压高压 [收缩压] - //85 : 血压低压 [舒张压] - //95:血氧 - //90:血糖 -// 本消息适用所有终端,其中需要每项指标不一定全部有值,如果无值,则留空 - return genStringMessage(cmdMap.get(protocol_ic.CMD_TYPE.APHP),new StringBuffer(CMDHEADER).append(cmdMap.get(protocol_ic.CMD_TYPE.APHP)) - .append(CMDSPLIT).append(ppg) - .append(CMDSPLIT).append(bph) - .append(CMDSPLIT).append(bpl) - .append(CMDSPLIT).append(spo2) - .append(CMDSPLIT).append(0) - .append(CMDSPLIT) - .append(CMDSPLIT) - .append(CMDSPLIT) - .append(CMDSPLIT) - .append(CMDSPLIT) - .append(CMDSPLIT) - .append(CMDSPLIT) - .append(CMDSPLIT) - .append(CMDEND).toString()); - } - - - public void handleBPHP(){ - - ICLogger.i("服务器收到APHP 心率血压血氧 !"); - - } - - //立即定位反馈 - public static StringMessage AP16(String cmdindex){ -//IWAP16,080835# -//080835:指令流水号 - return genStringMessage("AP16",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP16)) - .append(CMDSPLIT).append(cmdindex) - .append(CMDEND).toString()); - } - // 立即定位指令(长链接有效) - public void handleBP16(Connection connection,Runtime runtime,String cmd){ - //示例数据:IWBP16,867155030001063,335386 -// IWBP16,353456789012345,080835# -// 说明: -// IW:标识符 -// BP16 : 命令字符 -// 353456789012345:IMEI号,设备唯一ID -// 080835 :指令流水号 - String[] cmdlist = cmd.split(","); - if(cmdlist.length==3){ - log("imei "+cmdlist[1]+", cmdindex "+cmdlist[2]); - - connection.send(AP16(cmdlist[2])); - }else{ - log("error BP16 format"); - } - } - - - /*通过基站获取时间和坐标*/ - public static StringMessage APTM(Runtime ds){ - //示例数据:IWAPTM,460,0,9750,3613# - //说明: - //IW:标识符 - //APTM : 命令字符 - //460:MCC - //0: MNC - //9750: LAC - //3613: CID - - return genStringMessage(cmdMap.get(CMD_TYPE.APTM),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTM)) - .append(CMDSPLIT).append(ds.getLocationInstance().getMCC()) - .append(CMDSPLIT).append(ds.getLocationInstance().getMNC()) - .append(CMDSPLIT).append(ds.getLocationInstance().getLAC()) - .append(CMDSPLIT).append(ds.getLocationInstance().getGSMStationCID()) - .append(CMDEND).toString()); - - } - - public void handleBPTM(String cmd){ - //平台响应: IWBPTM,20160225090909,22.123456,113.654321# - //返回时间,格式为:yyyyMMddHHmmss ,为UTC0 时间 - //经纬度保留六位小数,若没取到则返回 0 - String[] list=cmd.split(CMDSPLIT); - - if(list.length==4){ - - String time=list[1]; - String lat=list[2]; - String lon=list[3]; - ICLogger.i("BPTM , time="+time+", lat="+lat+", lon="+lon); - }else{ - ICLogger.i("BPTM format error"); - } - - - } - - public static StringMessage AP15(String index){ -//IWAP15, 080835# -//080835:指令流水号 - return genStringMessage("AP15",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP15)) - .append(CMDSPLIT).append(index) - .append(CMDEND).toString()); - } - - //设置定位周期 - public void handleBP15(String cmd ,Connection connection,Runtime runtime){ -// IWBP15, 353456789012345, 080835, 30# -// 353456789012345:IMEI号,设备唯一ID -// 080835 :指令流水号 -// 30: 表示频率为30分钟 - - String[] list=cmd.split(CMDSPLIT); - - if(list.length==4){ - try { - String index = list[2]; - String time = list[3]; - connection.send(AP15(index)); - ICLogger.i("BP15 , 定位周期=" + time + "秒"); - - Config.setLocationMode(runtime.getContextProxy().context, ICLocation.CUSTOM_MOD8_GPS); - Config.setLocationCycle(runtime.getContextProxy().context, Integer.parseInt(time)); - runtime.getLocationInstance().setWorkingMod(Config.getLocationMode(runtime.getContextProxy().context)); - runtime.getLocationInstance().setLocation_cycle(Config.getLocationCycle(runtime.getContextProxy().context)); - //set AlarmCycle and trigger Location - CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod()); - }catch (Exception e){ - ICLogger.e(e.getMessage(),e); - } - }else{ - ICLogger.i("BP15 format error"); - } - - } - - - - - - - /*语音下行反馈*/ - public static StringMessage AP28(String name, String msg, int packagecount, int currentpackageindex, int received_success) { - //示例数据:IWAP28,D3590D54,xxxx,6,1,1# - return genStringMessage("AP28",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP28)) - .append(CMDSPLIT).append(name) - .append(CMDSPLIT).append(msg) - .append(CMDSPLIT).append(packagecount) - .append(CMDSPLIT).append(currentpackageindex) - .append(CMDSPLIT).append(received_success) - .append(CMDEND).toString()); - } - - //处理 BP28 语音消息 - public void handleBP28(Connection connection,String cmd,Runtime runtime,byte[] bytes) { - //log("handleBP28 msg"+cmd); -/** - * IWBP28, D3590D54,XXXX,6,1,1024,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX# - * 说明: - * IW:标识符 - * BP28 : 命令字符 - * D3590D54:UNICODE编码,发送者名称 - * XXXX: 附加信息,在响应数据包时,将附加信息原样响应,类似流水号 - * 6:语音包分包总数 - * 1 :当前包数,第一包为1,第二包为2,。。。。。。同一个语音包的语音时间相同 - * 1024 :语音包长度 - * XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:当前音频数据, 每个音频数据包大小为1024字节,最后一包不足1024的取实际字节数 - * 语音包上传规则: - * 按包次序依次上传,上传后如果没有收到服务器的响应包,则继续上传该语音包。 - * 收到设备回复确认数据包接收成功状态后,继续开始依次上传下一个数据包。。。。。。 - * 如果设备回复确认数据包接收失败状态,则重复发送上一个数据包 - * 设备响应: IWAP28,D3590D54,XXXX,6,1,1# - * D3590D54:UNICODE编码,发送者名称 - * XXXX: 附加信息,原样返回 - * 6:语音包分包总数 - * 1:当前设备收到的是第几个包 - * 1:表示设备接受数据成功,0表示设备接受数据失败 - */ - String Name; - String appendIndex; - int packetCount; - int currentId; - int packetLen; - byte[] packetData; - - String[] msg= cmd.split(CMDSPLIT); - if (msg.length>=6){ - try { - Name = msg[1]; - appendIndex = msg[2]; - packetCount = Integer.parseInt(msg[3]); - currentId = Integer.parseInt(msg[4]); - packetLen = Integer.parseInt(msg[5]); - packetData = Util.subArray(bytes, msg[0].length() + msg[1].length() + msg[2].length() + msg[3].length() + msg[4].length() + msg[5].length() + 6, bytes.length - 1); - - StringBuffer stringBuffer = new StringBuffer(); - stringBuffer.append("recv BP28 name = ").append(Name) - .append(",appendIndex = ").append(appendIndex) - .append(",packetCount = ").append(packetCount) - .append(",currentId = ").append(currentId) - .append(",packetLen = ").append(packetLen) - .append(",packetDatalen = ").append(packetData.length); - - log(stringBuffer.toString()); - connection.send(AP28(Name, appendIndex, packetCount, currentId, 1)); - voicePacket.getInstance().appendVoice(Name, appendIndex, packetCount, currentId, packetLen, packetData); - log("================" + voicePacket.getInstance().toString()); - if (voicePacket.getInstance().isFinished()) { - - String dir = Environment.getExternalStorageDirectory() + "/Android/VoiceCache"; - String amrFilepath = Util.saveFile(voicePacket.getInstance().getVoicePacketBytes(), 0, voicePacket.getInstance().getVoicePacketLen(), new File(dir), "receive_" + voicePacket.getInstance().getPacketTime() + ".amr"); - ICLogger.i("save Amr file to " + amrFilepath); - voicePacket.getInstance().clearPacket(); - VoiceContent voiceContent = VoiceContent.placeHolderIn(Content.CONTACT_CATEGORY_GROUP, GROUP_ALL, amrFilepath); - - - final Uri uri2 = runtime.getDbHelper().insertMessage(voiceContent); - - //回复UI消息,表示已经接收到 - voiceContent.status = 3; - voiceContent.serverTime = TimeUtil.getSystemTime3(); - voiceContent.preview = String.valueOf(Util.getDuration(voiceContent.content)); - runtime.getDbHelper().updateMessage(voiceContent, uri2); - -// runtime.getContextProxy().sendBroadcast(ACTION_IMESSAGE, runtime); - - connection.DeliverCMDMessageToSystem("NewVoice", amrFilepath);//通知下面线程状态变化 - } - }catch (Exception e){ - ICLogger.e(e.getMessage(),e); - } - }else{ - log("handleBP28","format Error"); -// connection.send(genStringMessage("AP28",AP28(Name,appendIndex,packetCount,currentId,0))); - - } - - } - - public void sendBroadcast(String cmd, Runtime dev) { - - ComponentName componentName = new ComponentName("com.eqc.watch", "com.eqc.watch.launcher.ChatActivity"); - Intent intent = new Intent("android.intent.action.MAIN"); -// intent.putExtra("ACTIVITY_TYPE", 2); -// intent.addCategory("android.intent.category.DEFAULT"); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - intent.setComponent(componentName); - dev.getContextProxy().context.startActivity(intent); - } - - //白名单开关(下行协议号:BP84,响应:AP84) - public static StringMessage AP84(String index,int success){ - - //设备响应: IWAP80,080835,1# - //080835:指令流水号 - //1:表示设备执行成功,0 表示设备执行失败 - return genStringMessage("AP84",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP84)) - .append(CMDSPLIT).append(index) - .append(CMDSPLIT).append(success) - .append(CMDEND).toString()); - } - - public void handleBP84(String cmd,Connection connection){ -//示例: - //IWBP84,353456789012345,080835,1# - //说明: - //IW:标识符 - //BP84 : 命令字符 - //353456789012345:IMEI号,设备唯一ID - //080835 :指令流水号 - //1: 表示白名单开,0 表示白名单关 - String[] list=cmd.split(CMDSPLIT); - - if (list.length==4){ - String index=list[2]; - String whitelist_switch=list[3]; - connection.send(AP84(index,1)); - - if (whitelist_switch.equals("1")){ - Util.setSystemProperties("persist.sys.whitelist.enable","true"); - }else{ - Util.setSystemProperties("persist.sys.whitelist.enable","false"); - } - ICLogger.i("收到服务器指令:白名单"+(whitelist_switch.equals("1")?"开":"关")); - - }else{ - - ICLogger.i("BP84 format error!"); - } - - } - - //17.设置心率/血压测量周期(下行协议号:BP86,响应:AP86) - public static StringMessage AP86(String index){ - - //设备响应: IWAP86, 080835# - //080835:指令流水号 - return genStringMessage("AP86",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP86)) - .append(CMDSPLIT).append(index) - .append(CMDEND).toString()); - } - - public void handleBP86(String cmd,Connection connection,Runtime runtime){ - - //示例: - //IWBP86, 353456789012345, 080835,1,720# - //说明: - //IW:标识符 - //BP86 : 命令字符 - //353456789012345:IMEI号,设备唯一ID - //080835 :指令流水号 - //1: 表示心率周期;2 :表示血压周期 - //720: 表示720分钟 - - String[] list=cmd.split(CMDSPLIT); - - if (list.length==5){ - try { - String index = list[2]; - String type = list[3]; - String cycle = list[4]; - connection.send(AP86(index)); - ICLogger.i("收到服务器指令:设置" + (type.equals("1") ? "心率周期 " : "血压周期 ") + cycle + "分钟"); - - //发送重置PPGCycle的广播,会在CoreServer里面执行 - Intent intent = new Intent(); - intent.putExtra("PPGTestCycle", Integer.parseInt(cycle)); - runtime.getContextProxy().sendBrodcast(ACTION_HEATR_RATE_START, intent); - }catch (Exception e){ - ICLogger.e(e.getMessage(),e); - } - }else{ - ICLogger.i("BP86 format error!"); - } - - } - - //18.18.设置心率/血压阀值(下行协议号:BP89,响应:AP89) - public static StringMessage AP89(String index){ - - //设备响应: IWAP89, 080835# - //080835:指令流水号 - return genStringMessage("AP89",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP89)) - .append(CMDSPLIT).append(index) - .append(CMDEND).toString()); - } - - public void handleBP89(String cmd,Connection connection){ - - //示例: - //IWBP89, 353456789012345, 080835,50,90,80,90,110,140# - //说明: - //IW:标识符 - //BP89 : 命令字符 - //353456789012345:IMEI号,设备唯一ID - //080835 :指令流水号 - //50: 心率低阀值,低于该阀值上传心率,如果未设置,则留空 - //90: 心率高阀值,高于该阀值上传心率,如果未设置,则留空 - //80: 低压阀值,低压低于该阀值上传血压,如果未设置,则留空 - //90: 低压阀值,低压高于该阀值上传血压,如果未设置,则留空 - //110: 高压阀值,高压低于该阀值上传血压,如果未设置,则留空 - //140: 高压阀值,高压高于该阀值上传血压,如果未设置,则留空 - String[] list=cmd.split(CMDSPLIT); - if (list.length==9){ - String index=list[2]; - String PPGH=list[3]; - String PPGL=list[4]; - String BPH_H=list[5]; - String BPH_L=list[6]; - String BPL_H=list[7]; - String BPL_L=list[8]; - connection.send(AP89(index)); - ICLogger.i("收到服务器指令:心率/血压阀值 "+PPGH+","+PPGL+","+BPH_H+","+BPH_L+","+BPL_H+","+BPL_L); - }else{ - ICLogger.i("BP89 format error!"); - } - - } - - public static StringMessage AP93(String index){ - /*** - * 20.发送文字到手环(下行协议号:BP93,响应:AP93) - * 示例: - * IWBP93, 353456789012345, 080835,123456, 8fd9662f4f8b5b50,2,3# - * 说明: - * IW:标识符 - * BP93 : 命令字符 - * 353456789012345:IMEI号,设备唯一ID - * 080835 :指令流水号 - * 123456:文字来源系统流水号 - * 8fd9662f4f8b5b50: 这是例子(文字内容) - * 2:语音播报次数,取值范围0-3,0为不播报 - * 3:震动次数,取值范围为0-4, 0为不震动 - * 设备响应: IWAP93,080835# - * 080835: 设备响应的时候带上响应流水号 - * 说明: 本消息适用所有终端 - */ - return genStringMessage("AP93",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP93)) - .append(CMDSPLIT).append(index) - .append(CMDEND).toString()); - - } - - public void handleBP93(Connection connection,Runtime runtime , String cmd){ - /*** - * 20.发送文字到手环(下行协议号:BP93,响应:AP93) - * 示例: - * IWBP93, 353456789012345, 080835,123456, 8fd9662f4f8b5b50,2,3# - * 说明: - * IW:标识符 - * BP93 : 命令字符 - * 353456789012345:IMEI号,设备唯一ID - * 080835 :指令流水号 - * 123456:文字来源系统流水号 - * 8fd9662f4f8b5b50: 这是例子(文字内容) - * 2:语音播报次数,取值范围0-3,0为不播报 - * 3:震动次数,取值范围为0-4, 0为不震动 - * 设备响应: IWAP93,080835# - * 080835: 设备响应的时候带上响应流水号 - * 说明: 本消息适用所有终端 - */ - String[] cmdlist=cmd.split(","); - if (cmdlist.length == 7){ - String cmdindex=cmdlist[2]; - String msg_index_no=cmdlist[3]; - String txtmsg=cmdlist[4]; - String play_time=cmdlist[5]; - String vib_time=cmdlist[6]; - ICLogger.i("收到服务器文本 "+txtmsg+" 序号 "+msg_index_no+" , 播放 "+play_time+" 次,震动 "+vib_time+" 次!"); - StringBuilder sb=new StringBuilder(); - runtime.PushtxtMsg_srv_index=msg_index_no;//给回复AP94用 - sb.append(cmdindex).append(CMDSPLIT).append(TimeUtil.getSystemTimeyyyyMMddHHmmss()).append(CMDSPLIT).append(txtmsg); - - txtmsg=Util.decodeUnicode2Utf8(txtmsg); - StringMessage msg=AP93(cmdindex); - //设定当前工作模式及循环频率 - connection.send(msg); - runtime.PushtxtMsg_srv_index=msg_index_no;//给回复AP94用 - ICLogger.i("received Txt Msg "+txtmsg); - if(!Config.noPushTxtReadReply) { - Config.setLastUnReadMessage(runtime.getContextProxy().context, sb.toString()); //保存未读文档 - runtime.getContextProxy().sendMsgBroadcast(txtmsg,3); //msgType 3需要回复,0不需要回复 - }else{ - runtime.getContextProxy().sendMsgBroadcast(txtmsg,0); //msgType 3需要回复,0不需要回复 - } - runtime.getContextProxy().saveMstToSMSDB(txtmsg); - - }else{ - ICLogger.i("BP40 format error!"); - } - - } - - public static StringMessage AP94( ){ - /*** - * 15确认已读文字(上行协议号:AP94,响应:BP94) - * 示例: - * IWAP94,123456,1# - * 说明: - * IWAP94:标识符 - * APHCI: 命令字符 - * 123456: 文字来源系统流水号 - * 1:确认阅读、0:取消阅读 - * 平台响应: IWBP94# - * 表示平台已接收,可不作响应 - * 说明: 本消息适用所有终端 - */ - - //在UI逻辑中,只要有处理就都是已经阅读。所以不存在取消阅读的说法。 - return genStringMessage(cmdMap.get(CMD_TYPE.AP94),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP94)) - .append(CMDSPLIT).append(Runtime.PushtxtMsg_srv_index) - .append(CMDSPLIT).append("1") - .append(CMDEND).toString()); - - } - - - public void handleBP94(){ - - } - - public static StringMessage APWT(){ - - return genStringMessage("APWT",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APWT)).append(CMDEND).toString()); - - } - - public void handleBPWT(Connection connection,Runtime runtime , String cmd) { -/** - * 14同步天气(上行协议号:APWT,响应:BPWT) - * 示例: - * IWAPWT# - * 说明: - * IW:标识符 - * APWT : 命令字符 - * 平台响应: IWBPWT, 深圳, 2018-12-24 16:45:5, 2018-12-25,1, 3,1,晴, 2018-12-26, -1,4,2, 阴, 2018-12-27,3,7, 3,小雨# - * 实际返回需要转换为unicode: - * IWBPWT, 6df15733, 2018-12-24 16:45:5, 2018-12-25,1, 3, 1, 6674, 2018-12-26, -1,4, 2, 9634, 2018-12-27,3,7, 3, 5c0f96e8# - * 深圳,所在城市, - * 2018-12-24 16:45:51 预报时间 - * 2018-12-25: 当天日期 - * 1:当天最低温度,表示1度 - * 3:当天最高温度,表示3度 - * 1:天气大类(1-晴、2-多云、3-雨、4-雪、5-未知) - * 晴:当天天气小类,中文描述 - * 2018-12-26:第二天日期 - * -1:第二天最低温度,表示-1度 - * 4:第二天最高温度,表示4度 - * 2:天气大类(1-晴、2-多云、3-雨、4-雪、5-未知) - * 阴:第二天天气 - * 2018-12-27:第三天日期 - * 3:第三天最低温度,表示3度 - * 7:第三天最高温度,表示7度 - * 3:天气大类(1-晴、2-多云、3-雨、4-雪、5-未知) - * 小雨:第三天天气 - * 注:城市、天气为HEX的UNICODE编码,非明文; - * 在没有定位数据的情况下,则无法取到天气 - * 如果未取到天气,则相关栏位留空,注意城市也有可能为空 - * 说明: 本消息适用所有终端 - */ - String tmp,City,forecastTime,day1,day2,day3; - int temp_h_day1,temp_h_day2,temp_h_day3; - int temp_l_day1,temp_l_day2,temp_l_day3; - int temp_type_day1,temp_type_day2,temp_type_day3; - String temp_str_day1,temp_str_day2,temp_str_day3; - - temp_h_day1=temp_h_day2=temp_h_day3=0; - temp_l_day1=temp_l_day2=temp_l_day3=0; - temp_type_day1=temp_type_day2=temp_type_day3=1; - - - String list[]=cmd.split(CMDSPLIT); - - if (list.length==18){ - try { - City = Util.decodeUnicode2Utf8(list[1]); - forecastTime = list[2]; - day1 = list[3]; - tmp = list[4]; - if (Util.isNumeric(tmp.trim().replace("-",""))) { - temp_h_day1 = Integer.parseInt(tmp); - } - tmp = list[5]; - if (Util.isNumeric(tmp.trim().replace("-",""))) { - temp_l_day1 = Integer.parseInt(tmp); - } - tmp = list[6]; - if (Util.isNumeric(tmp.trim().replace("-",""))) { - temp_type_day1 = Integer.parseInt(tmp); - } - temp_str_day1=Util.decodeUnicode2Utf8(list[7]); - day2=list[8]; - tmp = list[9]; - if (Util.isNumeric(tmp.trim().replace("-",""))) { - temp_h_day2 = Integer.parseInt(tmp); - } - tmp = list[10]; - if (Util.isNumeric(tmp.trim().replace("-",""))) { - temp_l_day2 = Integer.parseInt(tmp); - } - tmp = list[11]; - if (Util.isNumeric(tmp.trim().replace("-",""))) { - temp_type_day2 = Integer.parseInt(tmp); - } - temp_str_day2=Util.decodeUnicode2Utf8(list[12]); - day3=list[13]; - tmp = list[14]; - if (Util.isNumeric(tmp.trim().replace("-",""))) { - temp_h_day3 = Integer.parseInt(tmp); - } - tmp = list[15]; - if (Util.isNumeric(tmp.trim().replace("-",""))) { - temp_l_day3 = Integer.parseInt(tmp); - } - tmp = list[16]; - if (Util.isNumeric(tmp.trim().replace("-",""))) { - temp_type_day3 = Integer.parseInt(tmp); - } - temp_str_day3=Util.decodeUnicode2Utf8(list[17]); - - ICLogger.i("天气预报城市 "+City+", 预报时间 "+forecastTime+",\n第一天 "+day1+", 最高温度 "+temp_h_day1+",最低温度 "+temp_l_day1+",天气类型 "+temp_type_day1+" "+temp_str_day1 - +", \n第二天 "+day2+", 最高温度 "+temp_h_day2+",最低温度 "+temp_l_day2+",天气类型 "+temp_type_day2+" "+temp_str_day2 - +", \n第三天 "+day3+", 最高温度 "+temp_h_day3+",最低温度 "+temp_l_day3+",天气类型 "+temp_type_day3+" "+temp_str_day3 ); - }catch (Exception e){ - e.printStackTrace(); - ICLogger.i("BPWT format error!"+e.getMessage()); - } - - }else{ - ICLogger.i("BPWT format error!"); - } - } - - - public boolean handleCmd(CMD_TYPE type, String cmd) { - - //普通非二进制命令用此函数处理 - boolean ret=true; - ICLogger.i("handleCmd "+type.name() + " strLen="+cmd.length()); - if (Config.LOG_TOFILE)ICLogger.logToFile("APILog", " recv " + cmd); - switch (type){ - case BP00: //登录包 - handleBP00(mRuntime,cmd); - ICLogger.i("服务器收到登录包AP00"); - mConnection.DeliverCMDMessageToSystem("login",cmd);//通知下面线程状态变化 - break; - case BP01: //gps定位包 - handleBP01(cmd); - ICLogger.i("服务器收到定位AP01"); - mConnection.DeliverCMDMessageToSystem("AP01",cmd);//通知下面线程服务器收到指令 - break; - case BP02:// wifi定位包 - handleBP02(cmd); - ICLogger.i("服务器收到定位AP02"); - mConnection.DeliverCMDMessageToSystem("AP02",cmd);//通知下面线程服务器收到指令 - break; - case BP03: //心跳包 - handleBP03(cmd); - ICLogger.i("服务器收到心跳包AP03"); - mConnection.DeliverCMDMessageToSystem("heartbeat",cmd);//通知下面线程状态变化 - break; - - case BP07: - //收到发送的语音包 - handleBP07(cmd,mConnection); - break; - case BP10: - //报警包 - mConnection.DeliverCMDMessageToSystem("AP10",cmd);//通知下面线程服务器收到指令 - break; - - case BPTM: - //校时命令 - handleBPTM(cmd); - ICLogger.i("服务器收到校时命令APTM"); - mConnection.DeliverCMDMessageToSystem("APTM",cmd);//通知下面线程服务器收到指令 - break; - case BP85://设置闹钟 - handleBP85(cmd,mConnection,mRuntime); - ICLogger.i("收到服务器设置闹钟命令BP85"); - mConnection.DeliverCMDMessageToSystem("AP85",cmd);//通知下面线程服务器收到指令 - break; - case BP33: - //设置工作模式 - handleBP33(mConnection,mRuntime,cmd); - mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化 - - break; - case BP34: - //设置工作模式 - handleBP34(mConnection,mRuntime,cmd); - mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化 - break; - case BP16: - //立即定位指令(长链接有效) - handleBP16(mConnection,mRuntime,cmd); - mConnection.DeliverCMDMessageToSystem("StartLocate",cmd);//通知下面线程状态变化 - break; - -// case BP05: //L02服务器不适用 -// //查询服务器语音 返回信息 -// API.handleBP05(cmd); -// break; - - case BP12: - //收到设置SOS号码 - handleBP12(mConnection,cmd,mRuntime); - ICLogger.i("收到服务器设置SOS号码命令BP12"); - break; - case BP14: - //收到设置白名单号码 - handleBP14(mConnection,cmd,mRuntime); - ICLogger.i("收到服务器设置白名单号码命令BP14"); - break; - case BP15: - handleBP15(cmd,mConnection,mRuntime); - ICLogger.i("收到服务器设置定位命令BP15"); - break; - case BP17: - //收到恢复出厂设置 - handleBP17(mConnection,cmd); - ICLogger.i("收到服务器恢复出厂设置命令BP17"); - mConnection.DeliverCMDMessageToSystem("FactoryReset",cmd);//通知下面线程状态变化 - break; - - case BP18: - //收到重启 - handleBP18(mConnection,cmd); - ICLogger.i("收到服务器重启命令BP18"); - mConnection.DeliverCMDMessageToSystem("Reboot",cmd);//通知下面线程状态变化 - break; - - case BP31: - //收到关机 - handleBP31(mConnection,cmd); - ICLogger.i("收到服务器关机命令BP31"); - mConnection.DeliverCMDMessageToSystem("poweroff",cmd);//通知下面线程状态变化 - break; - - case BPXL: - handleBPXL(cmd,mConnection); - ICLogger.i("收到服务器心率检测命令"); - if(mRuntime.check_stat_do_ppg_test()) HeartRateManager.triggerPPGtest(); - break; - case BPXY: - handleBPXY(cmd,mConnection); - ICLogger.i("收到服务器血压检测命令"); - if(mRuntime.check_stat_do_ppg_test()) HeartRateManager.triggerPPGtest(); - break; - case BPJZ: - handleBPJZ(cmd,mConnection,mRuntime); - ICLogger.i("收到服务器血压校准命令"); - break; - case BPHT: - ICLogger.i("服务器收到上传的心率血压APHT"); - mConnection.DeliverCMDMessageToSystem("APHT",cmd);//通知下面线程服务器收到指令 - break; - case BPHP: - ICLogger.i("服务器收到上传的心率血压血氧APHP"); - mConnection.DeliverCMDMessageToSystem("APHP",cmd);//通知下面线程服务器收到指令 - break; - - case BP50: - ICLogger.i("服务器收到体温AP50"); - mConnection.DeliverCMDMessageToSystem("AP50",cmd);//通知下面线程服务器收到指令 - break; - case BP84: - handleBP84(cmd,mConnection); - ICLogger.i("收到服务器白名单命令"); - break; - - case BP86: - //心率血压周期设置 - handleBP86(cmd,mConnection,mRuntime); - - break; - case BP89: - //心率/血压阀值 - handleBP89(cmd,mConnection); - break; - - case BP94: - handleBP94(); - mConnection.DeliverCMDMessageToSystem("AP94",cmd);//通知下面线程状态变化 - break; - case BP93: - //服务器下发文版 - handleBP93(mConnection,mRuntime,cmd); - break; - - case BPWT: - //心率/血压阀值 - handleBPWT(mConnection,mRuntime,cmd); - break; - - } - - return ret; - - } - - - public boolean handleCmd(CMD_TYPE type, String cmd, byte[] bytes) { - - //只有需要传递二级制数据的才需要这个函数,目前只有BP28需要 - - boolean ret=true; - ICLogger.i("handleCmd "+type.name() + " "+cmd+" bytelen="+bytes.length ); - if (Config.LOG_TOFILE) ICLogger.logToFile("APILog", " recv " +new String(bytes)); - switch (type) { - case BP28: - handleBP28(mConnection,cmd, mRuntime,bytes); - ICLogger.i("收到服务器语音BP28"); - mConnection.DeliverCMDMessageToSystem("BP28", "");//通知下面线程状态变化 - break; - } - return ret; - } - -} +package com.ic.protocols; + +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.os.Build; +import android.os.Environment; +import android.support.annotation.RequiresApi; +import android.text.TextUtils; + +import com.enqualcomm.support.Config; +import com.enqualcomm.support.CoreService; +import com.enqualcomm.support.R; +import com.enqualcomm.support.bean.Alarm; +import com.enqualcomm.support.bean.Contact; +import com.enqualcomm.support.bean.Content; +import com.enqualcomm.support.bean.ICLocation; +import com.enqualcomm.support.bean.Runtime; +import com.enqualcomm.support.bean.StringMessage; +import com.enqualcomm.support.bean.VoiceContent; +import com.enqualcomm.support.bean.voicePacket; +import com.enqualcomm.support.service.HeartRateManager; +import com.enqualcomm.support.utils.Connection; +import com.enqualcomm.support.utils.ICLogger; +import com.enqualcomm.support.utils.LanguageUtils; +import com.enqualcomm.support.utils.TimeUtil; +import com.enqualcomm.support.utils.Util; + +import java.io.File; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; + +import static com.enqualcomm.support.Constants.ACTION_HEATR_RATE_START; +import static com.enqualcomm.support.LocationClient.LOCATION_MODE; +import static com.enqualcomm.support.bean.Contact.GROUP_ALL; +import static java.lang.Math.abs; + +public class protocol_jiai { + private static final String TAG = "ICSrv." + protocol_jiai.class.getSimpleName(); + + private static final String CMDHEADER = "IW"; + private static final String CMDEND = "#"; + private static final String CMDSPLIT = ","; + public static final String defaultServerIP="watch.jiai.pro"; + public static final int defaultServerPort=8090; + + public enum CMD_TYPE { + /*终端发起*/ + AP00,//登录包 + BP00, + AP01,//混合定位 + BP01, + AP02,//多基站定位 + BP02, + AP92,//CDMA 混合定位 + BP92, + AP03,//心跳包 + BP03, + AP05,//语音查询接收 + BP05, + AP07,//语音上行 + BP07, + AP10,//报警与地址回复 + BP10, + AP49,//心率上传 + BP49, + AP50,//体温上传 + BP50, + APHT,//心率血压上传 + BPHT, + APHP,//心率血压血氧上传 + BPHP, + APTM,//基站校时及获取定位 + BPTM, + APWT,//同步天气 + BPWT, + AP94,//消息已读 + BP94, + /* 服务器发起*/ + AP12, + BP12,//SOS 号码设置 + AP14, + BP14,//设置联系人白名单 + AP15, + BP15,//设置定位周期 + AP16, + BP16,//立即定位 + AP17, + BP17,//恢复出厂设置 + AP18, + BP18,//重启设备 + AP21, + BP21,//设置计步开关 + AP28, + BP28, //语音下行 + AP31, + BP31,//关机 + AP33, + BP33,//工作模式 + AP34, + BP34,//自定义工作模式 + APXL, + BPXL,//测量心率 + APXY, + BPXY,//测量血压 + APJZ, + BPJZ,//血压校准 + AP84, + BP84,//白名单开关 + AP85, + BP85,//设置闹钟 + AP86, + BP86,//心率血压测试周期 + AP87, + BP87,//体温测试周期 + AP89, + BP89,//心率血压阀值设置 + AP93, + BP93,//服务器下发文本 + APXT, + BPXT,//服务器下发测量体温 + APLA, + BPLA,//切换语言 + UNKNOWN_CMD, + } + + private static HashMap cmdMap = null; + + static { + cmdMap = new HashMap(); + cmdMap.put(CMD_TYPE.AP00, "AP00"); + cmdMap.put(CMD_TYPE.BP00, "BP00"); + cmdMap.put(CMD_TYPE.AP01, "AP01"); + cmdMap.put(CMD_TYPE.BP01, "BP01"); + cmdMap.put(CMD_TYPE.AP02, "AP02"); + cmdMap.put(CMD_TYPE.BP02, "BP02"); + cmdMap.put(CMD_TYPE.AP92, "AP92"); + cmdMap.put(CMD_TYPE.BP92, "BP92"); + cmdMap.put(CMD_TYPE.AP03, "AP03"); + cmdMap.put(CMD_TYPE.BP03, "BP03"); + cmdMap.put(CMD_TYPE.AP05, "AP05"); + cmdMap.put(CMD_TYPE.BP05, "BP05"); + cmdMap.put(CMD_TYPE.AP07, "AP07"); + cmdMap.put(CMD_TYPE.BP07, "BP07"); + cmdMap.put(CMD_TYPE.AP10, "AP10"); + cmdMap.put(CMD_TYPE.BP10, "BP10"); + cmdMap.put(CMD_TYPE.AP49, "AP49"); + cmdMap.put(CMD_TYPE.BP49, "BP49"); + cmdMap.put(CMD_TYPE.AP50, "AP50"); + cmdMap.put(CMD_TYPE.BP50, "BP50"); + cmdMap.put(CMD_TYPE.APHT, "APHT"); + cmdMap.put(CMD_TYPE.BPHT, "BPHT"); + cmdMap.put(CMD_TYPE.APHP, "APHP"); + cmdMap.put(CMD_TYPE.BPHP, "BPHP"); + cmdMap.put(CMD_TYPE.APTM, "APTM"); + cmdMap.put(CMD_TYPE.BPTM, "BPTM"); + cmdMap.put(CMD_TYPE.APWT, "APWT"); + cmdMap.put(CMD_TYPE.BPWT, "BPWT"); + cmdMap.put(CMD_TYPE.AP94, "AP94"); + cmdMap.put(CMD_TYPE.BP94, "BP94"); + cmdMap.put(CMD_TYPE.AP12, "AP12"); + cmdMap.put(CMD_TYPE.BP12, "BP12"); + cmdMap.put(CMD_TYPE.AP14, "AP14"); + cmdMap.put(CMD_TYPE.BP14, "BP14"); + cmdMap.put(CMD_TYPE.AP15, "AP15"); + cmdMap.put(CMD_TYPE.BP15, "BP15"); + cmdMap.put(CMD_TYPE.AP16, "AP16"); + cmdMap.put(CMD_TYPE.BP16, "BP16"); + cmdMap.put(CMD_TYPE.AP17, "AP17"); + cmdMap.put(CMD_TYPE.BP17, "BP17"); + cmdMap.put(CMD_TYPE.AP18, "AP18"); + cmdMap.put(CMD_TYPE.BP18, "BP18"); + cmdMap.put(CMD_TYPE.AP21, "AP21"); + cmdMap.put(CMD_TYPE.BP21, "BP21"); + cmdMap.put(CMD_TYPE.AP28, "AP28"); + cmdMap.put(CMD_TYPE.BP28, "BP28"); + cmdMap.put(CMD_TYPE.AP31, "AP31"); + cmdMap.put(CMD_TYPE.BP31, "BP31"); + cmdMap.put(CMD_TYPE.AP33, "AP33"); + cmdMap.put(CMD_TYPE.BP33, "BP33"); + cmdMap.put(CMD_TYPE.AP34, "AP34"); + cmdMap.put(CMD_TYPE.BP34, "BP34"); + cmdMap.put(CMD_TYPE.APXL, "APXL"); + cmdMap.put(CMD_TYPE.BPXL, "BPXL"); + cmdMap.put(CMD_TYPE.APXY, "APXY"); + cmdMap.put(CMD_TYPE.BPXY, "BPXY"); + cmdMap.put(CMD_TYPE.APJZ, "APJZ"); + cmdMap.put(CMD_TYPE.BPJZ, "BPJZ"); + cmdMap.put(CMD_TYPE.AP84, "AP84"); + cmdMap.put(CMD_TYPE.BP84, "BP84"); + cmdMap.put(CMD_TYPE.AP85, "AP85"); + cmdMap.put(CMD_TYPE.BP85, "BP85"); + cmdMap.put(CMD_TYPE.AP86, "AP86"); + cmdMap.put(CMD_TYPE.BP86, "BP86"); + cmdMap.put(CMD_TYPE.AP87, "AP87"); + cmdMap.put(CMD_TYPE.BP87, "BP87"); + cmdMap.put(CMD_TYPE.AP89, "AP89"); + cmdMap.put(CMD_TYPE.BP89, "BP89"); + cmdMap.put(CMD_TYPE.AP93, "AP93"); + cmdMap.put(CMD_TYPE.BP93, "BP93"); + cmdMap.put(CMD_TYPE.APXT, "APXT"); + cmdMap.put(CMD_TYPE.BPXT, "BPXT"); + cmdMap.put(CMD_TYPE.APLA, "APLA"); + cmdMap.put(CMD_TYPE.BPLA, "BPLA"); + } + + private Connection mConnection=null; + private Runtime mRuntime=null; + + public protocol_jiai(Connection connect,Runtime runtime) { + mConnection=connect; + mRuntime=runtime; + + } + + private StringBuffer cmdbuf = new StringBuffer(); + + /* + 输入的字符串,如果有完整命令,返回 命令名 + 否则返回 空字符串 + */ + public static String isCmdStr(String msg) { + + int head_index = msg.indexOf(CMDHEADER); + if (head_index >= 0) { + int end_index = msg.indexOf("#", head_index); + if (end_index < 0) { + + return ""; + } + }else{ + return ""; + } + + for (CMD_TYPE key : cmdMap.keySet()) { + if (msg.startsWith(CMDHEADER + cmdMap.get(key))) { + ICLogger.i("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key)); + return cmdMap.get(key); + } + } + + return ""; + } + private void log(String msg) { + ICLogger.log(TAG, msg); + } + + private void log(String function, String msg) { + ICLogger.log(TAG, function, msg); + } + + + + /**/ + public static StringMessage genStringMessage(String cmdName, String msg){ + StringMessage sm=new StringMessage(new String[]{cmdName,msg}); + sm.refresh(msg); + sm.setDate(TimeUtil.getSystemDateYYMMDD(),TimeUtil.getSystemTimeHHmmss()); + return sm; + } + /* + 返回true 表示 cmd 全部解析成功 + 返回false表示 cmd至少有一条解析失败,失败的数据归入buffer,下一次识别接着使用 + 字符串通过#号进行识别。 + 每个字符串如果发现 #,却又没有Header,“IW”则会被丢弃 + */ + public boolean parserCmd(byte[] bytes) { + boolean iscmdComplete = false; + boolean ret = true; + String last_inCompletecmd = ""; + String cmd_msgbuf=new String(bytes); + log("bytes.size "+bytes.length); +// cmdbuf.append(cmd_msgbuf); + cmdbuf.append(cmd_msgbuf); + log("cmdbuf.size "+cmdbuf.length() +" "+cmdbuf.toString()); + /* + 如果不是 #结尾,就认为 接收数据不全,置位。 + */ + if (cmdbuf.toString().endsWith(CMDEND)) { + iscmdComplete = true; + } + String[] cmdlist = cmd_msgbuf.split(CMDEND); + int listlen = cmdlist.length; + log("listlen "+listlen); + /* + 如果解析出来的cmdlist不是空,且数据不是完整cmd则保留 最后一条数据到last_inCompletecmd + */ + if (cmdlist.length > 0 && iscmdComplete == false) { + listlen -= 1; + last_inCompletecmd = cmdlist[listlen]; + log("cmd not complete , " + last_inCompletecmd); + } + for (int i = 0; i < listlen; i++) { + for (CMD_TYPE key : cmdMap.keySet()) { + if (cmdlist[i].startsWith(CMDHEADER + cmdMap.get(key))) { + log("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key) + " , " + cmdlist[i]); + if (key == CMD_TYPE.BP28) { + //如果是BP28则 后面的数据是音频,需要保留 + byte[] amrBuf; + int amrLen = getBP28Amrlen(cmdlist[i] ); + if (bytes.length > amrLen) { + handleCmd(key, cmdlist[i], bytes); + } + } else { + handleCmd(key, cmdlist[i]); + } + } + } + } + + cmdbuf = new StringBuffer().append(last_inCompletecmd); + return ret; + } + public int getBP28Amrlen(String cmd) { + + String Name; + String appendIndex; + int packetCount; + int currentId; + int packetLen; + + + String[] msg=cmd.split(CMDSPLIT); + if (msg.length>=6){ + + try { + Name = msg[1]; + appendIndex = msg[2]; + packetCount = Integer.parseInt(msg[3]); + currentId = Integer.parseInt(msg[4]); + packetLen = Integer.parseInt(msg[5]); + + StringBuffer stringBuffer = new StringBuffer(); + stringBuffer.append("getBP28AmrLen name = ").append(Name) + .append(",appendIndex = ").append(appendIndex) + .append(",packetCount = ").append(packetCount) + .append(",currentId = ").append(currentId) + .append(",packetLen = ").append(packetLen); + + + log(stringBuffer.toString()); + return packetLen; + }catch (Exception e){ + ICLogger.e(e.getMessage(),e); + } + }else{ + log("getBP28AmrLen","format Error"); + + } + return -1; + } + /*登录*/ + public static StringMessage AP00(Runtime ds) { + //示例数据:IWAP00867155030001063# + return genStringMessage(cmdMap.get(CMD_TYPE.AP00),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP00)).append(ds.IMEI()).append(CMDEND).toString()); + } + + //处理 登录 BP00 + public void handleBP00(Runtime runtime,String cmd){ + String[] msg=cmd.split(CMDSPLIT); +// get Msg :IWBP00,20191229171933,8# (size)24 +// 12-30 01:19:33.861 6492-6492/com.enqualcomm.support I/ICSrv.protocolAPIHelper: found cmd keyid=BP00 ,keyname=BP00 , IWBP00,20191229171933,8 + + if (msg.length>=3) { + log("handleBP00", "Set Datetime " + msg[1]); + log("handleBP00", "Set TimeZone " + msg[2]); + + try { + Date datetime = TimeUtil.parseDatetiime(msg[1]); + int timezone = Integer.parseInt(msg[2]); + if (datetime != null) { + ICLogger.i("===" + TimeUtil.getDefaultTimeZone()); + TimeUtil.setTimeZone(timezone); + + + ICLogger.i("===" + TimeUtil.getDefaultTimeZone()); + TimeUtil.setSysDateTime(runtime.getContextProxy().context, datetime, timezone); + ICLogger.i("===" + TimeUtil.getDefaultTimeZone()); + + } +// Set Datetime 20200505112734 +// Set TimeZone 8 + }catch (Exception e){ + ICLogger.e(e.getMessage(),e); + } + }else{ + log("handleBP00","format Error"); + } + } + + + public static StringMessage AP03(Runtime ds) { + //示例数据:IWAP03,06000908000102,5555,30# IWAP03,000000null00000,0,0# + return genStringMessage(cmdMap.get(CMD_TYPE.AP03),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP03)).append(CMDSPLIT).append(String.format("%03d",abs(ds.getSignalStrength()))) + .append(ds.getGPSLocationStarNums()).append(ds.getBattery()).append("0") + .append(ds.getProtection()).append(ds.getWorkModeStr()).append(CMDSPLIT) + .append(ds.getTotalStepCount()).append(CMDSPLIT).append(ds.getRolltimes()).append(CMDEND).toString()); + } + //处理 心跳 BP03 + public void handleBP03(String cmd){ + + log("BP03心跳接收成功"); + } + + + public static StringMessage AP10(Runtime ds){ + + /** + * IWAP10080524A2232.9806N11404.9355E000.1 061830 323.87 060 009 080 0 05 02, + * 460,0,9520,3671, + * 00,zh-cn,00, + * 00为报警状态,00为无任何报警(01:SOS,02:低电,03:脱落报警,04:佩戴提醒,05/06:跌倒报警)) + * zh-cn:设备语言 + * 00:第一个0:是否需要回复地址信息,0:不回复,1回复. + * HOME|74-DE-2B-44-88-8C|97&HOME1|74-DE-2B-44-88-8C|97&HOME2|74-DE-2B-44-88-8C|97&HOME3|74-DE-2B-44-88-8C|97# + * IW标识符 + * AP10:命令字 + * 080524: 2008 年05 月24 + * A:“A”表示数据有效,”V”无效,如为V则取LBS数据 + * 2232.9806N11404.9355E000.1: 北纬22度32.9806分,东经114度04.9355分,速度为000.1 km/h,如经纬度无效,可默认全为0,如0000.0000N00000.0000E + * 061830: 格林尼治时间06 点18 分30 秒 + * 323.87:方向角323.87° + * 06000908000102:060为GSM信号,009为参与定位的卫星数,080为电池电量,0,保留位,01为设防状态,02为工作模式 ,(设防,工作模式如果为00,则代表无或未设置) + * 460,0,9520,3671 : LBS基站数据,MCC国家码,460为中国,0:MNC,0为移动,9520:LAC,十进制,3671,CID,十进制 + * 00为报警状态,00为无任何报警(01:SOS,02:低电,03:脱落报警,04:佩戴提醒,05:剪断报警,06:跌倒报警,07:心率异常, 08:心率过高, 09:心率过低,10:收缩压过高,11:收缩压过低,12:舒张压过高,13:舒张压过低,14:久坐提醒,15:非法解锁(剪断报警),16:锁定提醒(佩戴提醒),17:体温过高,18体温过低) + * zh-cn:设备语言 + * 00:第一个0:是否需要回复地址信息,0:不回复,1回复. + */ + return genStringMessage(cmdMap.get(CMD_TYPE.AP10),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP10)).append(TimeUtil.getShortDate()) + .append(ds.getGPSData()).append(TimeUtil.getShortTime()).append(ds.getGPSHeading()).append(String.format("%03d",abs(ds.getSignalStrength()))) + .append(ds.getGPSLocationStarNums()).append(ds.getBattery()).append("0") + .append(ds.getProtection()).append(ds.getWorkModeStr()).append(CMDSPLIT) + .append(ds.getLBSData()).append(CMDSPLIT) + .append(ds.getAlarmType()).append(CMDSPLIT) + .append(ds.getLanguage()).append(CMDSPLIT) + .append("00").append(CMDSPLIT) //不回复地址 + .append(ds.getWifiInfo()).append(CMDEND).toString()); + + } + + /*LBS+GPS混合定位*/ + public static StringMessage AP01(Runtime ds) { + //示例数据:IWAP01080524A2232.9806N11404.9355E000.1061830323.8706000908000102, + // 460,0,9520,3671, + // Home|74-DE-2B-44-88-8C|97& Home1|74-DE-2B-44-88-8C|97&Home2|74-DE-2B-44-88-8C|97& Home3|74-DE-2B-44-88-8C|97# +// IWAP01191230A2232.9807N11404.9355E000.1161320000.0006000910000000,460,00,9520,3671,# + return genStringMessage( cmdMap.get(CMD_TYPE.AP01),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP01)).append(TimeUtil.getShortDate()) + .append(ds.getGPSData()).append(TimeUtil.getShortTime()).append(ds.getGPSHeading()).append(String.format("%03d",abs(ds.getSignalStrength()))) + .append(ds.getGPSLocationStarNums()).append(ds.getBattery()).append("0") + .append(ds.getProtection()).append(ds.getWorkModeStr()).append(CMDSPLIT) + .append(ds.getLBSData()).append(CMDSPLIT).append(ds.getWifiInfo()).append(CMDEND).toString()); + } + + //处理 定位 BP01 + public void handleBP01(String cmd){ + log("BP01定位接收成功"); + } + + + + /*LBS+WiFi混合定位*/ + public static StringMessage AP02(Runtime ds) { + //示例数据:IWAP02, + // zh_cn, + // 0, + // 7, + // 460,0, + // 9520|3671|13,9520|3672|12,9520|3673|11,9520|3674|10,9520|3675|9,9520|3676|8,9520|3677|7, + // 4, + // 1|D8-24-BD-79-FA-1F|59&2|3C-46-D8-6D-CE-01|81&3|0C-4C-39-1A-7C-65|69&4|70-A8-E3-5D-D7-C0|65# +// IW标识符 +// AP02:命令字 +// zh_cn: 语言标志 +// 0:回复标识,为0时不回复地址,为 1 时,服务器回复地址信息 +// 7: 表示共有7组基站 +// 460: MCC 国家码 +// 0: MNC运营商代码 +// 9520|3671|10: LAC|CID|dbm表示一组基站信息,后面数量需和基站组数地应 10:dbm为信号强度多基站信号强度建议从高到低排列后上传,信号强度转正数:150 – abs(dbm) +// 4: 表示WIFI组数, +// 1|D8-24-BD-79-FA-1F|59: ssid|mac地址|信号强度,信号强度转正数:150 – abs(信号强度) + + int apsum=0; + String wifiinfo=ds.getWifiInfo(); + if (!wifiinfo.isEmpty()) { + String[] list = wifiinfo.split("&"); + apsum = list.length; + } + + ICLogger.i("Wifi ap sum "+apsum); + return genStringMessage(cmdMap.get(CMD_TYPE.AP02),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP02)).append(CMDSPLIT) + .append(ds.getLanguage()).append(CMDSPLIT) + .append(0).append(CMDSPLIT) //为0时不回复地址 + .append(ds.getLBSMultiStationData()).append(CMDSPLIT) //基站信息数据 + .append(apsum).append(CMDSPLIT).append(ds.getWifiInfo()).append(CMDEND).toString()); //wifi信息数据 + } + + //处理 定位 BP01 + public void handleBP02(String cmd){ + log("BP02定位接收成功"); + } + + + + public static StringMessage APXL(String id){ +//设备响应: IWAPXL,080835# + //080835:指令流水号 + return genStringMessage("APXL",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APXL)) + .append(CMDSPLIT).append(id) + .append(CMDEND).toString()); + } + + /** + * 测量心率 + * @param cmd + * @param connection + */ + public void handleBPXL(String cmd, Connection connection){ + //IWBPXL,353456789012345,080835# + //说明: + //IW:标识符 + //BPXL : 命令字符 + //353456789012345:IMEI号,设备唯一ID + //080835 :指令流水号 + //设备响应: IWAPXL,080835# + //080835:指令流水号 + String[] list=cmd.split(CMDSPLIT); + if (list.length==3){ + String index=list[2]; + String imei=list[1]; + ICLogger.i("Handle BPXL IMEI "+imei+",index "+index); + connection.send(APXL(index)); + }else{ + ICLogger.i("BPXL format error!"); + } + + } + + public static StringMessage APXY(String id){ +//设备响应: IWAPXY,080835# + //080835:指令流水号 + return genStringMessage("APXY",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APXY)) + .append(CMDSPLIT).append(id) + .append(CMDEND).toString()); + } + + /** + * 测量血压 + * @param cmd + * @param connection + */ + public void handleBPXY(String cmd,Connection connection){ + //IWBPXY,353456789012345,080835# + //说明: + //IW:标识符 + //BPXL : 命令字符 + //353456789012345:IMEI号,设备唯一ID + //080835 :指令流水号 + //设备响应: IWAPXY,080835# + //080835:指令流水号 + String[] list=cmd.split(CMDSPLIT); + if (list.length==3){ + String index=list[2]; + String imei=list[1]; + ICLogger.i("Handle BPXY IMEI "+imei+",index "+index); + connection.send(APXY(index)); + }else{ + ICLogger.i("BPXY format error!"); + } + + } + + + + public static StringMessage APJZ(String id,String BPH,String BPL,String Age,String Sex){ + //设备响应: IWAPJZ,792997,120,85,42,1# + //792997:指令流水号 + // 高压120,低压85,年龄42,1 男性 + return genStringMessage("APJZ",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APJZ)) + .append(CMDSPLIT).append(id) + .append(CMDSPLIT).append(BPH) + .append(CMDSPLIT).append(BPL) + .append(CMDSPLIT).append(Age) + .append(CMDSPLIT).append(Sex) + .append(CMDEND).toString()); + } + + /** + * + * @param cmd + * @param connection + * @param runtime + */ + public void handleBPJZ(String cmd,Connection connection,Runtime runtime){ + //cmdbuf.size 42 IWBPJZ,867155030001063,199600,120,85,45,1# 高压120,低压85,年龄45,男性 +// cmdbuf.size 42 IWBPJZ,867155030001063,909957,120,85,42,0# 高压120,低压85,年龄42,女性 + //IWBPJZ,353456789012345,080835,110,75# + //说明: + //IW:标识符 + //BPJZ : 命令字符 + //353456789012345:IMEI号,设备唯一ID + //110:高压值 + //75:低压值 + //080835 :指令流水号 + //设备响应: IWAPJZ,792997,120,85,42,1# + //792997:指令流水号 + String[] list=cmd.split(CMDSPLIT); + if (list.length==7){ + String index=list[2]; + String imei=list[1]; + String strBPH=list[3]; + String strBPL=list[4]; + String strAge=list[5]; + String strSex=list[6]; + + connection.send(APJZ(index,strBPH,strBPL,strAge,strSex)); + try { + runtime.getHRS().setXY_Ref(Integer.parseInt(strBPH), Integer.parseInt(strBPL), Integer.parseInt(strAge), Integer.parseInt(strSex)); + ICLogger.i("Handle BPJZ IMEI " + imei + ",index " + index + ", BPH " + strBPH + ", BPL " + strBPL + ", Age " + strAge + ", Sex " + (strSex.equals("1") ? "男" : "女")); + }catch (Exception e){ + ICLogger.e(e.getMessage(),e); + } + }else{ + ICLogger.i("BPXY format error!"); + } + } + + + + //重启 + + + public static StringMessage AP18(String index){ + return genStringMessage("AP18",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP18)) + .append(CMDSPLIT).append(index) + .append(CMDEND).toString()); + } + + public void handleBP18(Connection connection,String cmd) { + + // IWBP18,867155030001063,161723 + String[] cmdlist=cmd.split(CMDSPLIT); + if (cmdlist.length==3) { + + connection.send(AP18(cmdlist[2])); + + } + } + //恢复出厂设置 + + public static StringMessage AP17(String index){ + return genStringMessage("AP17",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP17)) + .append(CMDSPLIT).append(index) + .append(CMDEND).toString()); + } + public void handleBP17(Connection connection,String cmd) { + + // IWBP17,867155030001063,161723 + String[] cmdlist=cmd.split(CMDSPLIT); + if (cmdlist.length==3) { + + connection.send(AP17(cmdlist[2])); + + } + } + + //关机 + + + public static StringMessage AP31(String index){ + return genStringMessage("AP31",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP31)) + .append(CMDSPLIT).append(index) + .append(CMDEND).toString()); + } + public void handleBP31(Connection connection,String cmd) { + + // IWBP31,867155030001063,161723 + String[] cmdlist=cmd.split(CMDSPLIT); + if (cmdlist.length==3) { + + connection.send(AP31(cmdlist[2])); + + } + } + + //设置SOS号码 + public static StringMessage AP12(String index,String phNum1,String phNum2,String phNum3){ + return genStringMessage("AP12",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP12)) + .append(CMDSPLIT).append(index) + .append(CMDSPLIT).append(phNum1) + .append(CMDSPLIT).append(phNum2) + .append(CMDSPLIT).append(phNum3) + .append(CMDEND).toString()); + } + + //设置SOS号码 + public void handleBP12(Connection connection,String cmd,Runtime runtime){ + // IWBP12,353456789012345,080835,135XXXXXXXX,135XXXXXXXX,135XXXXXXXX# + String[] cmdlist=cmd.split(CMDSPLIT); + if (cmdlist.length>=3){ + String index=cmdlist[2]; + String phNum1=cmdlist.length==3?"":cmdlist[3]; + String phNum2=cmdlist.length>3?(cmdlist.length==4?"":cmdlist[4]):""; + String phNum3=(cmdlist.length>4)?(cmdlist.length==5? "":cmdlist[5]):""; + ICLogger.i(new StringBuffer().append("get Emegency Numbs "+phNum1+","+phNum2+","+phNum3).toString()); + connection.send(AP12(index,phNum1,phNum2,phNum3)); + + ArrayList contactArray=new ArrayList(); + if (!phNum1.isEmpty()) contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos1",phNum1)); + if (!phNum2.isEmpty()) contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos2",phNum2)); + if (!phNum3.isEmpty()) contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos3",phNum3)); + + runtime.getDbHelper().saveContacts(contactArray,false,false,false,false,false,true); + + }else{ + ICLogger.i(" BP12 format error!"); + } + } + + + public static StringMessage AP14(String index,String[] phnumbs){ + return genStringMessage("AP14",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP14)) + .append(CMDSPLIT).append(index) + .append(CMDSPLIT).append(phnumbs[0]) + .append(CMDSPLIT).append(phnumbs[1]) + .append(CMDSPLIT).append(phnumbs[2]) + .append(CMDSPLIT).append(phnumbs[3]) + .append(CMDSPLIT).append(phnumbs[4]) + .append(CMDSPLIT).append(phnumbs[5]) + .append(CMDSPLIT).append(phnumbs[6]) + .append(CMDSPLIT).append(phnumbs[7]) + .append(CMDSPLIT).append(phnumbs[8]) + .append(CMDSPLIT).append(phnumbs[9]) + .append(CMDEND).toString()); + } + //设置通讯录,白名单(10个) + public void handleBP14(Connection connection,String cmd , Runtime runtime){ +// IWBP14,867155030001063,357444,9b44529b|13554820016,,,,,,,,, +/** + * IWBP14,353456789012345,080835, + * D3590D54|135xxxxxxxxxx, + * D3590D54|135xxxxxxxxxx, + * D3590D54|135xxxxxxxxxx, + * D3590D54|135xxxxxxxxxx, + * D3590D54|135xxxxxxxxxx, + * D3590D54|135xxxxxxxxxx, + * D3590D54|135xxxxxxxxxx, + * D3590D54|135xxxxxxxxxx, + * D3590D54|135xxxxxxxxxx, + * D3590D54|135xxxxxxxxxx# + */ + String[] cmdlist=cmd.split(CMDSPLIT); + String[] phnums=new String[]{"","","","","","","","","",""}; + StringBuffer sb=new StringBuffer().append("recv phone Numbs "); + if (cmdlist.length>=3){ + switch (cmdlist.length){ + case 13: + phnums[9]=cmdlist[12]; + sb.append(phnums[9]).append(","); + case 12: + phnums[8]=cmdlist[11]; + sb.append(phnums[8]).append(","); + case 11: + phnums[7]=cmdlist[10]; + sb.append(phnums[7]).append(","); + case 10: + phnums[6]=cmdlist[9]; + sb.append(phnums[6]).append(","); + case 9: + phnums[5]=cmdlist[8]; + sb.append(phnums[5]).append(","); + case 8: + phnums[4]=cmdlist[7]; + sb.append(phnums[4]).append(","); + case 7: + phnums[3]=cmdlist[6]; + sb.append(phnums[3]).append(","); + case 6: + phnums[2]=cmdlist[5]; + sb.append(phnums[2]).append(","); + case 5: + phnums[1]=cmdlist[4]; + sb.append(phnums[1]).append(","); + case 4: + phnums[0]=cmdlist[3]; + sb.append(phnums[0]).append(","); + + } + + String index=cmdlist[2]; + ICLogger.i(sb.toString()); + connection.send(AP14(index,phnums)); + ArrayList contactArray=new ArrayList(); + for (int i=0; i< phnums.length;i++){ + String[] tmp= phnums[i].split("\\|"); + if (tmp.length==2){ + String name= Util.decodeUnicode2Utf8(tmp[0]); + String phonem=tmp[1]; + ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length+" , name="+name+",-"+phonem); + contactArray.add(new Contact(Contact.CATEGORY_CALL,name,phonem)); + }else{ + ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length); + + } + } +// contactArray.add(new Contact(Contact.CATEGORY_GROUP,"All","666")); +// contactArray.add(new Contact(Contact.CATEGORY_PARTNER,"PARTNER","666")); +// contactArray.add(new Contact(Contact.CATEGORY_CARE,"CARE","666")); +// contactArray.add(new Contact(Contact.CATEGORY_VOLTE,"VOLTE","666")); + + runtime.getDbHelper().saveContacts(contactArray,false,false,true,false,false,false); + + }else{ + ICLogger.i(" BP14 format error!"); + } + + } + + + + public static StringMessage AP85(Runtime ds,String cmddata){ +//示例数据:IWAP49,68## + return genStringMessage("AP85",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP85)) + .append(CMDSPLIT).append(cmddata) + .append(CMDEND).toString()); + + } + //设置闹钟 + public void handleBP85(String cmd , Connection connection,Runtime runtime){ +// IWBP85,867155030001063,155312,1,1,0235,12,1,1 +// IWBP85,867155030002145,945166,1,0, +// IWBP85,867155030001064,265960,1,1,1130,,1,1 +// IWBP85,353456789012345,080835,1,3, 0900,135,1,1@0900 ,135,1,2@0900 ,135,1,3# +//353456789012345:IMEI号,设备唯一ID +//080835 :指令流水号 +//1: 表示闹钟总开关,1为开,0 为关 +//3: 表示闹钟个数 +//0900 ,135,1,1,表示一组闹钟,0900表示早上09:00, 135表示周一周三周五,使用24小时制 +//1表示该组闹钟开启或关闭状态 1表示开启 0表示关闭 +//1表示吃药提醒 +//2 表示喝水提醒 +//3 表示久坐提醒 +//多组闹钟之间用”@”符号分隔 + + String imei="",cmdindex="0"/*指令流水号*/; + int all_alarmswitch=0 /*总开关 1为开,0 为关*/, + alarmswitch=0 /*1为开,0 为关*/, + alarmcount=0 /*表示闹钟个数*/; + String alarmtime="";//0900表示早上09:00 + int alarmtype=1; //1表示吃药提醒 , 2 表示喝水提醒 ,3 表示久坐提醒 + String repeat="";// 135表示周一周三周五,使用24小时制 + String[] datalist= cmd.split("@"); + ArrayList alarmlist=new ArrayList<>(); + + + if (datalist.length >0){ + + + for (int i =0 ; i< datalist.length;i++){ + String [] cmdarglist=datalist[i].split(","); + + if (i == 0){ + if (cmdarglist.length == 9){ + try { + imei = cmdarglist[1]; + cmdindex = cmdarglist[2]; + all_alarmswitch = Integer.parseInt(cmdarglist[3]); + alarmcount = Integer.parseInt(cmdarglist[4]); + alarmtime = cmdarglist[5]; + repeat = cmdarglist[6]; + alarmswitch = Integer.parseInt(cmdarglist[7]); + alarmtype = Integer.parseInt(cmdarglist[8]); + log(new StringBuilder("imei ").append(imei) + .append(", cmdindex ").append(cmdindex) + .append(", allswitch=").append(all_alarmswitch) + .append(", all alarm count=").append(alarmcount) + .toString() + ); + + log(new StringBuilder("alarmtime ").append(alarmtime) + .append(", relpeat ").append(repeat) + .append(", switch=").append(alarmswitch) + .append(", alarmtype=").append(alarmtype) + .toString() + ); + alarmlist.add(new Alarm("ST" + alarmtime.substring(0, 2) + "." + alarmtime.substring(2), "W" + repeat, "CON", alarmswitch == 1 ? "ON" : "OFF", "闹铃")); + }catch (Exception e){ + ICLogger.e(e.getMessage(),e); + } + }else if (cmdarglist.length == 5) { + try { + imei = cmdarglist[1]; + cmdindex = cmdarglist[2]; + all_alarmswitch = Integer.parseInt(cmdarglist[3]); + alarmcount = Integer.parseInt(cmdarglist[4]); + }catch (Exception e){ + ICLogger.e(e.getMessage(),e); + } + }else{ + log("data len is too small!"); + } + }else{ + if (cmdarglist.length == 4){ + try { + alarmtime = cmdarglist[0]; + repeat = cmdarglist[1]; + alarmswitch = Integer.parseInt(cmdarglist[2]); + alarmtype = Integer.parseInt(cmdarglist[3]); + + log(new StringBuilder("set alarmtime ").append(alarmtime) + .append(", relpeat ").append(repeat) + .append(", switch=").append(alarmswitch) + .append(", alarmtype=").append(alarmtype) + .toString() + ); + + alarmlist.add(new Alarm("ST" + alarmtime.substring(0, 2) + "." + alarmtime.substring(2), "W" + repeat, "CON", alarmswitch == 1 ? "ON" : "OFF", "闹铃")); + }catch (Exception e){ + ICLogger.e(e.getMessage(),e); + } + }else{ + log("data len is too small!"); + } + + } + }//循环获取alarm数据结束 + runtime.getDbHelper().saveAlarm(alarmlist); + + //do clean and set alarm things + + } +//IWBP85,867155030002145,410385,1,0,# + + String replacement=new StringBuilder("IWBP85,").append(imei).append(",").toString(); + String replycmd = cmd.replace(replacement,""); + ICLogger.i("gen reply "+replacement+" "+replycmd); + connection.send(AP85(runtime,replycmd)); + } + + +// AP05命令L02服务器不适用 +// public static String AP05(boolean recvFlag){ +// +//// IWAP05,1# +// return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP05)) +// .append(CMDSPLIT).append(recvFlag?1:0) +// .append(CMDEND).toString(); +// +// } +// +// +// public void handleBP05(String cmd){ +//// IWBP05,6# +// String[] cmdlist=cmd.split(CMDSPLIT); +// if (cmdlist.length>1){ +// ICLogger.i(" 服务器有 " +cmdlist[1]+" 条语音未接收!"); +// } +// } + + + + + public static byte[] AP07(String packetTime,int count,int index,int datalen,byte[] amrdata){ +//IWAP07,20140818064408,6,1,1024,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX# +//说明: +//IW:标识符 +//AP07 : 命令字符 +//20140818064408 :yyyyMMddHHmmss 格式的年月日时分秒,设备录音时间 +//6:语音包分包总数 +//1 :当前包数,第一包为1,第二包为2,。。。。。。同一个语音包的语音时间相同 +//1024 :语音包长度 +//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:当前音频数据, 每个音频数据包大小为1024字节,最后一包不足1024的取实际字节数 +//语音包上传规则: +//按包次序依次上传,上传后如果没有收到服务器的响应包,则继续上传该语音包。 +//收到设备回复确认数据包接收成功状态后,继续开始依次上传下一个数据包。。。。。。 +//如果设备回复确认数据包接收失败状态,则重复发送上一个数据包 + + + String sb=new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP07)) + .append(CMDSPLIT).append(packetTime) + .append(CMDSPLIT).append(count) + .append(CMDSPLIT).append(index) + .append(CMDSPLIT).append(datalen) + .append(CMDSPLIT).toString(); + + byte[] sentbuf=new byte[sb.length()+datalen+1]; + System.arraycopy(sb.getBytes(),0,sentbuf,0,sb.length()); + System.arraycopy(amrdata,0,sentbuf,sb.length(),datalen); + sentbuf[sb.length()+datalen]='#'; + + return sentbuf; + + } + + + public void handleBP07(String cmd , Connection connection ){ +//平台响应: IWBP07,20140818064408,6,1,1# +//20140818064408:设备语音时间,yyyyMMddHHmmss 格式的年月日时分秒 +//6:语音包分包总数 +//1:当前设备收到的是第几个包 +//1:表示服务器接受数据成功,0表示服务器接受数据失败 + String[] cmdlist=cmd.split(CMDSPLIT); + if (cmdlist.length==5){ + try { + String time = cmdlist[1]; + int packetCount = Integer.parseInt(cmdlist[2]); + int packetIndex = Integer.parseInt(cmdlist[3]); + int receiveSuccess = Integer.parseInt(cmdlist[4]); + ICLogger.i("服务器在" + time + " 收到语音 " + packetIndex + "/" + packetCount + " " + (receiveSuccess == 1 ? "成功" : "失敗")); + if (receiveSuccess == 1) { + //如果服务器接收 语音成功,则设置下一个要发送的语音包Index,当index == packetCount的时候表示所有包发送完毕,停止继续发送 + voicePacket.getInstanceSent().setCurrentIndexToSent(packetIndex); + } + //发送消息,再次检查要发送的语音包,确认其发送完毕 + connection.DeliverCMDMessageToSystem("SentVoicePacket", "SentVoicePacket"); + }catch (Exception e){ + ICLogger.e(e.getMessage(),e); + } + }else{ + ICLogger.i(" BP07 Format error!"); + } + } + + + + public static StringMessage AP33(String cmdindex,int workMode){ +//IWAP33,080835,1# +//080835:指令流水号 +//1:设置信息,供服务器同步 + return genStringMessage("AP33",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP33)) + .append(CMDSPLIT).append(cmdindex) + .append(CMDSPLIT).append(workMode) + .append(CMDEND).toString()); + } + + //设置工作模式 + public void handleBP33(Connection connection,Runtime runtime,String cmd){ + +// IWBP33,867155030001063,560555,1 +// IW:标识符 +// BP33 : 命令字符 +// 353456789012345:IMEI号,设备唯一ID +// 080835:指令流水号 +// 1:设备工作模式,1:正常模式,2:省电模式,3:紧急模式 + + String[] cmdlist=cmd.split(","); + if (cmdlist.length == 4){ + + try { + log("work mode " + cmdlist[3]); + int mod = Integer.parseInt(cmdlist[3]); + int Cycle = 900; + switch (mod) { + case ICLocation.NORMAL_MOD: + Cycle = 900; + break; + case ICLocation.LOWPOWER_MOD: + Cycle = 3600; + break; + case ICLocation.EMERGNECY_MOD: + case ICLocation.REALTIME_MOD: + Cycle = 60; + break; + + } + + StringMessage msg = AP33(cmdlist[2], mod); + //设定当前工作模式及循环频率 + connection.send(msg); + log("reply msg " + msg.isFromCache()); + log("LOCATION_MODE " + LOCATION_MODE + " mod " + mod); + Config.setLocationMode(runtime.getContextProxy().context, mod); + Config.setLocationCycle(runtime.getContextProxy().context, Cycle); + runtime.getLocationInstance().setLocation_cycle(Cycle); + runtime.getLocationInstance().setWorkingMod(mod); +// CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod()); + //此处设置好配置后,会在LocationClient通过消息开始执行及时定位操作。 + }catch (Exception e){ + ICLogger.e(e.getMessage(),e); + } + } + + } + + + public static StringMessage AP34(String cmdindex,int workMode){ +//IWAP34,588854,1# +//080835:指令流水号 +//8:模式 + return genStringMessage("AP34",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP34)) + .append(CMDSPLIT).append(cmdindex) + .append(CMDSPLIT).append(workMode) + .append(CMDEND).toString()); + } + + //设置自定义工作模式 + public void handleBP34(Connection connection,Runtime runtime,String cmd){ + +// IWBP34,867155030001063,588854,8,900,1# +// IW:标识符 +// BP33 : 命令字符 +// 353456789012345:IMEI号,设备唯一ID +// 080835:指令流水号 +// 1:设备工作模式,1:正常模式,2:省电模式,3:紧急模式 + + String[] cmdlist=cmd.split(","); + if (cmdlist.length == 6){ + + + log("work mode "+cmdlist[3]); + try { + int mod = Integer.parseInt(cmdlist[3]); + int Cycle = Integer.parseInt(cmdlist[4]); + int gpson = Integer.parseInt(cmdlist[5]); + + StringMessage msg = AP34(cmdlist[2], mod); + //设定当前工作模式及循环频率 + connection.send(msg); + + if (gpson == 1) { + mod = ICLocation.CUSTOM_MOD8_GPS; + } else { + mod = ICLocation.CUSTOM_MOD8_WIFI; + } + log("reply msg " + msg.isFromCache()); + log("LOCATION_MODE " + LOCATION_MODE + " mod " + mod + ", cycle = " + Cycle + ", GPS On= " + gpson); + Config.setLocationMode(runtime.getContextProxy().context, mod); + Config.setLocationCycle(runtime.getContextProxy().context, Cycle); + runtime.getLocationInstance().setLocation_cycle(Cycle); + runtime.getLocationInstance().setWorkingMod(mod); +// CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod()); + //此处设置好配置后,会在LocationClient通过消息开始执行及时定位操作。 + }catch (Exception e){ + ICLogger.e(e.getMessage(),e); + } + } + + } + + /** + * 心率上传,返回协议字串 + * @param ds + * @return + */ + public static StringMessage AP49(Runtime ds){ + //示例数据:IWAP49,68## + return genStringMessage(cmdMap.get(CMD_TYPE.AP49),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP49)) + .append(CMDSPLIT).append(ds.getHRS().getPPG()) + .append(CMDEND).toString()); + + } + +/*** + * 9温度数据上传(上行协议号:AP50,响应:BP50) + * 示例: + * IWAP50,36.7,90# + * 说明: + * IW:标识符 + * AP50 : 命令字符 + * 36.7:温度 + * 90:电量 + * 平台响应: IWBP50# + * 说明: 本消息适用所有终端 + */ +public static StringMessage AP50(Runtime ds){ + //示例数据:IWAP50,36.7,90# + return genStringMessage(cmdMap.get(CMD_TYPE.AP50),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP50)) + .append(CMDSPLIT).append(ds.tempInfo.currentBodyTemp) + .append(CMDSPLIT).append("100") + .append(CMDEND).toString()); + +} + + /** + * 返回上传心率血压的协议字串 + * @param ds + * @return + */ + public static StringMessage APHT(Runtime ds){ + //IWAPHT,60,130,85# + //说明: + //IW:标识符 + //APHT : 命令字符 + //60 : 表示心率 + //130: 血压高压 [收缩压] + //85 : 血压低压 [舒张压] + //平台响应: IWBPHT# + //表示平台已接收,可不作响应 + return genStringMessage(cmdMap.get(CMD_TYPE.APHT),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APHT)) + .append(CMDSPLIT).append(ds.getHRS().getPPG()) + .append(CMDSPLIT).append(ds.getHRS().getBPH()) + .append(CMDSPLIT).append(ds.getHRS().getBPL()) + .append(CMDEND).toString()); + } + public static StringMessage APHT(int ppg,int bph,int bpl){ + //IWAPHT,60,130,85# + //说明: + //IW:标识符 + //APHT : 命令字符 + //60 : 表示心率 + //130: 血压高压 [收缩压] + //85 : 血压低压 [舒张压] + //平台响应: IWBPHT# + //表示平台已接收,可不作响应 + return genStringMessage(cmdMap.get(CMD_TYPE.APHT),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APHT)) + .append(CMDSPLIT).append(ppg) + .append(CMDSPLIT).append(bph) + .append(CMDSPLIT).append(bpl) + .append(CMDEND).toString()); + } + public static StringMessage APHP(Runtime ds){ + //IWAPHP,60,130,85,95,90, , , , , , , , # + //IW:标识符 + //APHT : 命令字符 + //60 : 表示心率 + //130: 血压高压 [收缩压] + //85 : 血压低压 [舒张压] + //95:血氧 + //90:血糖 +// 本消息适用所有终端,其中需要每项指标不一定全部有值,如果无值,则留空 + return genStringMessage(cmdMap.get(protocol_ic.CMD_TYPE.APHP),new StringBuffer(CMDHEADER).append(cmdMap.get(protocol_ic.CMD_TYPE.APHP)) + .append(CMDSPLIT).append(ds.getHRS().getPPG()) + .append(CMDSPLIT).append(ds.getHRS().getBPH()) + .append(CMDSPLIT).append(ds.getHRS().getBPL()) + .append(CMDSPLIT).append(ds.getHRS().getSpo2()) + .append(CMDSPLIT).append(0) + .append(CMDSPLIT) + .append(CMDSPLIT) + .append(CMDSPLIT) + .append(CMDSPLIT) + .append(CMDSPLIT) + .append(CMDSPLIT) + .append(CMDSPLIT) + .append(CMDSPLIT) + .append(CMDEND).toString()); + } + public static StringMessage APHP(int ppg,int bph, int bpl, int spo2){ + //IWAPHP,60,130,85,95,90, , , , , , , , # + //IW:标识符 + //APHT : 命令字符 + //60 : 表示心率 + //130: 血压高压 [收缩压] + //85 : 血压低压 [舒张压] + //95:血氧 + //90:血糖 +// 本消息适用所有终端,其中需要每项指标不一定全部有值,如果无值,则留空 + return genStringMessage(cmdMap.get(protocol_ic.CMD_TYPE.APHP),new StringBuffer(CMDHEADER).append(cmdMap.get(protocol_ic.CMD_TYPE.APHP)) + .append(CMDSPLIT).append(ppg) + .append(CMDSPLIT).append(bph) + .append(CMDSPLIT).append(bpl) + .append(CMDSPLIT).append(spo2) + .append(CMDSPLIT).append(0) + .append(CMDSPLIT) + .append(CMDSPLIT) + .append(CMDSPLIT) + .append(CMDSPLIT) + .append(CMDSPLIT) + .append(CMDSPLIT) + .append(CMDSPLIT) + .append(CMDSPLIT) + .append(CMDEND).toString()); + } + + + public void handleBPHP(){ + + ICLogger.i("服务器收到APHP 心率血压血氧 !"); + + } + + //立即定位反馈 + public static StringMessage AP16(String cmdindex){ +//IWAP16,080835# +//080835:指令流水号 + return genStringMessage("AP16",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP16)) + .append(CMDSPLIT).append(cmdindex) + .append(CMDEND).toString()); + } + // 立即定位指令(长链接有效) + public void handleBP16(Connection connection,Runtime runtime,String cmd){ + //示例数据:IWBP16,867155030001063,335386 +// IWBP16,353456789012345,080835# +// 说明: +// IW:标识符 +// BP16 : 命令字符 +// 353456789012345:IMEI号,设备唯一ID +// 080835 :指令流水号 + String[] cmdlist = cmd.split(","); + if(cmdlist.length==3){ + log("imei "+cmdlist[1]+", cmdindex "+cmdlist[2]); + + connection.send(AP16(cmdlist[2])); + }else{ + log("error BP16 format"); + } + } + + + /*通过基站获取时间和坐标*/ + public static StringMessage APTM(Runtime ds){ + //示例数据:IWAPTM,460,0,9750,3613# + //说明: + //IW:标识符 + //APTM : 命令字符 + //460:MCC + //0: MNC + //9750: LAC + //3613: CID + + return genStringMessage(cmdMap.get(CMD_TYPE.APTM),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTM)) + .append(CMDSPLIT).append(ds.getLocationInstance().getMCC()) + .append(CMDSPLIT).append(ds.getLocationInstance().getMNC()) + .append(CMDSPLIT).append(ds.getLocationInstance().getLAC()) + .append(CMDSPLIT).append(ds.getLocationInstance().getGSMStationCID()) + .append(CMDEND).toString()); + + } + + public void handleBPTM(String cmd){ + //平台响应: IWBPTM,20160225090909,22.123456,113.654321# + //返回时间,格式为:yyyyMMddHHmmss ,为UTC0 时间 + //经纬度保留六位小数,若没取到则返回 0 + String[] list=cmd.split(CMDSPLIT); + + if(list.length==4){ + + String time=list[1]; + String lat=list[2]; + String lon=list[3]; + ICLogger.i("BPTM , time="+time+", lat="+lat+", lon="+lon); + }else{ + ICLogger.i("BPTM format error"); + } + + + } + + public static StringMessage AP15(String index){ +//IWAP15, 080835# +//080835:指令流水号 + return genStringMessage("AP15",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP15)) + .append(CMDSPLIT).append(index) + .append(CMDEND).toString()); + } + + //设置定位周期 + public void handleBP15(String cmd ,Connection connection,Runtime runtime){ +// IWBP15, 353456789012345, 080835, 30# +// 353456789012345:IMEI号,设备唯一ID +// 080835 :指令流水号 +// 30: 表示频率为30分钟 + + String[] list=cmd.split(CMDSPLIT); + + if(list.length==4){ + try { + String index = list[2]; + String time = list[3]; + connection.send(AP15(index)); + ICLogger.i("BP15 , 定位周期=" + time + "秒"); + + Config.setLocationMode(runtime.getContextProxy().context, ICLocation.CUSTOM_MOD8_GPS); + Config.setLocationCycle(runtime.getContextProxy().context, Integer.parseInt(time)); + runtime.getLocationInstance().setWorkingMod(Config.getLocationMode(runtime.getContextProxy().context)); + runtime.getLocationInstance().setLocation_cycle(Config.getLocationCycle(runtime.getContextProxy().context)); + //set AlarmCycle and trigger Location + CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod()); + }catch (Exception e){ + ICLogger.e(e.getMessage(),e); + } + }else{ + ICLogger.i("BP15 format error"); + } + + } + + + + + + + /*语音下行反馈*/ + public static StringMessage AP28(String name, String msg, int packagecount, int currentpackageindex, int received_success) { + //示例数据:IWAP28,D3590D54,xxxx,6,1,1# + return genStringMessage("AP28",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP28)) + .append(CMDSPLIT).append(name) + .append(CMDSPLIT).append(msg) + .append(CMDSPLIT).append(packagecount) + .append(CMDSPLIT).append(currentpackageindex) + .append(CMDSPLIT).append(received_success) + .append(CMDEND).toString()); + } + + //处理 BP28 语音消息 + public void handleBP28(Connection connection,String cmd,Runtime runtime,byte[] bytes) { + //log("handleBP28 msg"+cmd); +/** + * IWBP28, D3590D54,XXXX,6,1,1024,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX# + * 说明: + * IW:标识符 + * BP28 : 命令字符 + * D3590D54:UNICODE编码,发送者名称 + * XXXX: 附加信息,在响应数据包时,将附加信息原样响应,类似流水号 + * 6:语音包分包总数 + * 1 :当前包数,第一包为1,第二包为2,。。。。。。同一个语音包的语音时间相同 + * 1024 :语音包长度 + * XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:当前音频数据, 每个音频数据包大小为1024字节,最后一包不足1024的取实际字节数 + * 语音包上传规则: + * 按包次序依次上传,上传后如果没有收到服务器的响应包,则继续上传该语音包。 + * 收到设备回复确认数据包接收成功状态后,继续开始依次上传下一个数据包。。。。。。 + * 如果设备回复确认数据包接收失败状态,则重复发送上一个数据包 + * 设备响应: IWAP28,D3590D54,XXXX,6,1,1# + * D3590D54:UNICODE编码,发送者名称 + * XXXX: 附加信息,原样返回 + * 6:语音包分包总数 + * 1:当前设备收到的是第几个包 + * 1:表示设备接受数据成功,0表示设备接受数据失败 + */ + String Name; + String appendIndex; + int packetCount; + int currentId; + int packetLen; + byte[] packetData; + + String[] msg= cmd.split(CMDSPLIT); + if (msg.length>=6){ + try { + Name = msg[1]; + appendIndex = msg[2]; + packetCount = Integer.parseInt(msg[3]); + currentId = Integer.parseInt(msg[4]); + packetLen = Integer.parseInt(msg[5]); + packetData = Util.subArray(bytes, msg[0].length() + msg[1].length() + msg[2].length() + msg[3].length() + msg[4].length() + msg[5].length() + 6, bytes.length - 1); + + StringBuffer stringBuffer = new StringBuffer(); + stringBuffer.append("recv BP28 name = ").append(Name) + .append(",appendIndex = ").append(appendIndex) + .append(",packetCount = ").append(packetCount) + .append(",currentId = ").append(currentId) + .append(",packetLen = ").append(packetLen) + .append(",packetDatalen = ").append(packetData.length); + + log(stringBuffer.toString()); + connection.send(AP28(Name, appendIndex, packetCount, currentId, 1)); + voicePacket.getInstance().appendVoice(Name, appendIndex, packetCount, currentId, packetLen, packetData); + log("================" + voicePacket.getInstance().toString()); + if (voicePacket.getInstance().isFinished()) { + + String dir = Environment.getExternalStorageDirectory() + "/Android/VoiceCache"; + String amrFilepath = Util.saveFile(voicePacket.getInstance().getVoicePacketBytes(), 0, voicePacket.getInstance().getVoicePacketLen(), new File(dir), "receive_" + voicePacket.getInstance().getPacketTime() + ".amr"); + ICLogger.i("save Amr file to " + amrFilepath); + voicePacket.getInstance().clearPacket(); + VoiceContent voiceContent = VoiceContent.placeHolderIn(Content.CONTACT_CATEGORY_GROUP, GROUP_ALL, amrFilepath); + + + final Uri uri2 = runtime.getDbHelper().insertMessage(voiceContent); + + //回复UI消息,表示已经接收到 + voiceContent.status = 3; + voiceContent.serverTime = TimeUtil.getSystemTime3(); + voiceContent.preview = String.valueOf(Util.getDuration(voiceContent.content)); + runtime.getDbHelper().updateMessage(voiceContent, uri2); + +// runtime.getContextProxy().sendBroadcast(ACTION_IMESSAGE, runtime); + + connection.DeliverCMDMessageToSystem("NewVoice", amrFilepath);//通知下面线程状态变化 + } + }catch (Exception e){ + ICLogger.e(e.getMessage(),e); + } + }else{ + log("handleBP28","format Error"); +// connection.send(genStringMessage("AP28",AP28(Name,appendIndex,packetCount,currentId,0))); + + } + + } + + public void sendBroadcast(String cmd, Runtime dev) { + + ComponentName componentName = new ComponentName("com.eqc.watch", "com.eqc.watch.launcher.ChatActivity"); + Intent intent = new Intent("android.intent.action.MAIN"); +// intent.putExtra("ACTIVITY_TYPE", 2); +// intent.addCategory("android.intent.category.DEFAULT"); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.setComponent(componentName); + dev.getContextProxy().context.startActivity(intent); + } + + //白名单开关(下行协议号:BP84,响应:AP84) + public static StringMessage AP84(String index,int success){ + + //设备响应: IWAP80,080835,1# + //080835:指令流水号 + //1:表示设备执行成功,0 表示设备执行失败 + return genStringMessage("AP84",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP84)) + .append(CMDSPLIT).append(index) + .append(CMDSPLIT).append(success) + .append(CMDEND).toString()); + } + + public void handleBP84(String cmd,Connection connection){ +//示例: + //IWBP84,353456789012345,080835,1# + //说明: + //IW:标识符 + //BP84 : 命令字符 + //353456789012345:IMEI号,设备唯一ID + //080835 :指令流水号 + //1: 表示白名单开,0 表示白名单关 + String[] list=cmd.split(CMDSPLIT); + + if (list.length==4){ + String index=list[2]; + String whitelist_switch=list[3]; + connection.send(AP84(index,1)); + + if (whitelist_switch.equals("1")){ + Util.setSystemProperties("persist.sys.whitelist.enable","true"); + }else{ + Util.setSystemProperties("persist.sys.whitelist.enable","false"); + } + ICLogger.i("收到服务器指令:白名单"+(whitelist_switch.equals("1")?"开":"关")); + + }else{ + + ICLogger.i("BP84 format error!"); + } + + } + + //17.设置心率/血压测量周期(下行协议号:BP86,响应:AP86) + public static StringMessage AP86(String index){ + + //设备响应: IWAP86, 080835# + //080835:指令流水号 + return genStringMessage("AP86",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP86)) + .append(CMDSPLIT).append(index) + .append(CMDEND).toString()); + } + + public void handleBP86(String cmd,Connection connection,Runtime runtime){ + + //示例: + //IWBP86, 353456789012345, 080835,1,720# + //说明: + //IW:标识符 + //BP86 : 命令字符 + //353456789012345:IMEI号,设备唯一ID + //080835 :指令流水号 + //1: 表示心率周期;2 :表示血压周期 + //720: 表示720分钟 + + String[] list=cmd.split(CMDSPLIT); + + if (list.length==5){ + try { + String index = list[2]; + String type = list[3]; + String cycle = list[4]; + connection.send(AP86(index)); + ICLogger.i("收到服务器指令:设置" + (type.equals("1") ? "心率周期 " : "血压周期 ") + cycle + "分钟"); + + //发送重置PPGCycle的广播,会在CoreServer里面执行 + Intent intent = new Intent(); + intent.putExtra("PPGTestCycle", Integer.parseInt(cycle)); + runtime.getContextProxy().sendBrodcast(ACTION_HEATR_RATE_START, intent); + }catch (Exception e){ + ICLogger.e(e.getMessage(),e); + } + }else{ + ICLogger.i("BP86 format error!"); + } + + } + + //18.18.设置心率/血压阀值(下行协议号:BP89,响应:AP89) + public static StringMessage AP89(String index){ + + //设备响应: IWAP89, 080835# + //080835:指令流水号 + return genStringMessage("AP89",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP89)) + .append(CMDSPLIT).append(index) + .append(CMDEND).toString()); + } + + public void handleBP89(String cmd,Connection connection){ + + //示例: + //IWBP89, 353456789012345, 080835,50,90,80,90,110,140# + //说明: + //IW:标识符 + //BP89 : 命令字符 + //353456789012345:IMEI号,设备唯一ID + //080835 :指令流水号 + //50: 心率低阀值,低于该阀值上传心率,如果未设置,则留空 + //90: 心率高阀值,高于该阀值上传心率,如果未设置,则留空 + //80: 低压阀值,低压低于该阀值上传血压,如果未设置,则留空 + //90: 低压阀值,低压高于该阀值上传血压,如果未设置,则留空 + //110: 高压阀值,高压低于该阀值上传血压,如果未设置,则留空 + //140: 高压阀值,高压高于该阀值上传血压,如果未设置,则留空 + String[] list=cmd.split(CMDSPLIT); + if (list.length==9){ + String index=list[2]; + String PPGH=list[3]; + String PPGL=list[4]; + String BPH_H=list[5]; + String BPH_L=list[6]; + String BPL_H=list[7]; + String BPL_L=list[8]; + connection.send(AP89(index)); + ICLogger.i("收到服务器指令:心率/血压阀值 "+PPGH+","+PPGL+","+BPH_H+","+BPH_L+","+BPL_H+","+BPL_L); + }else{ + ICLogger.i("BP89 format error!"); + } + + } + + public static StringMessage AP93(String index){ + /*** + * 20.发送文字到手环(下行协议号:BP93,响应:AP93) + * 示例: + * IWBP93, 353456789012345, 080835,123456, 8fd9662f4f8b5b50,2,3# + * 说明: + * IW:标识符 + * BP93 : 命令字符 + * 353456789012345:IMEI号,设备唯一ID + * 080835 :指令流水号 + * 123456:文字来源系统流水号 + * 8fd9662f4f8b5b50: 这是例子(文字内容) + * 2:语音播报次数,取值范围0-3,0为不播报 + * 3:震动次数,取值范围为0-4, 0为不震动 + * 设备响应: IWAP93,080835# + * 080835: 设备响应的时候带上响应流水号 + * 说明: 本消息适用所有终端 + */ + return genStringMessage("AP93",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP93)) + .append(CMDSPLIT).append(index) + .append(CMDEND).toString()); + + } + + public void handleBP93(Connection connection,Runtime runtime , String cmd){ + /*** + * 20.发送文字到手环(下行协议号:BP93,响应:AP93) + * 示例: + * IWBP93, 353456789012345, 080835,123456, 8fd9662f4f8b5b50,2,3# + * 说明: + * IW:标识符 + * BP93 : 命令字符 + * 353456789012345:IMEI号,设备唯一ID + * 080835 :指令流水号 + * 123456:文字来源系统流水号 + * 8fd9662f4f8b5b50: 这是例子(文字内容) + * 2:语音播报次数,取值范围0-3,0为不播报 + * 3:震动次数,取值范围为0-4, 0为不震动 + * 设备响应: IWAP93,080835# + * 080835: 设备响应的时候带上响应流水号 + * 说明: 本消息适用所有终端 + */ + String[] cmdlist=cmd.split(","); + if (cmdlist.length == 7){ + String cmdindex=cmdlist[2]; + String msg_index_no=cmdlist[3]; + String txtmsg=cmdlist[4]; + String play_time=cmdlist[5]; + String vib_time=cmdlist[6]; + ICLogger.i("收到服务器文本 "+txtmsg+" 序号 "+msg_index_no+" , 播放 "+play_time+" 次,震动 "+vib_time+" 次!"); + StringBuilder sb=new StringBuilder(); + runtime.PushtxtMsg_srv_index=msg_index_no;//给回复AP94用 + sb.append(cmdindex).append(CMDSPLIT).append(TimeUtil.getSystemTimeyyyyMMddHHmmss()).append(CMDSPLIT).append(txtmsg); + + txtmsg=Util.decodeUnicode2Utf8(txtmsg); + StringMessage msg=AP93(cmdindex); + //设定当前工作模式及循环频率 + connection.send(msg); + runtime.PushtxtMsg_srv_index=msg_index_no;//给回复AP94用 + ICLogger.i("received Txt Msg "+txtmsg); + if(!Config.noPushTxtReadReply) { + Config.setLastUnReadMessage(runtime.getContextProxy().context, sb.toString()); //保存未读文档 + runtime.getContextProxy().sendMsgBroadcast(txtmsg,3); //msgType 3需要回复,0不需要回复 + }else{ + runtime.getContextProxy().sendMsgBroadcast(txtmsg,0); //msgType 3需要回复,0不需要回复 + } + runtime.getContextProxy().saveMstToSMSDB(txtmsg); + + }else{ + ICLogger.i("BP40 format error!"); + } + + } + + public static StringMessage AP94( ){ + /*** + * 15确认已读文字(上行协议号:AP94,响应:BP94) + * 示例: + * IWAP94,123456,1# + * 说明: + * IWAP94:标识符 + * APHCI: 命令字符 + * 123456: 文字来源系统流水号 + * 1:确认阅读、0:取消阅读 + * 平台响应: IWBP94# + * 表示平台已接收,可不作响应 + * 说明: 本消息适用所有终端 + */ + + //在UI逻辑中,只要有处理就都是已经阅读。所以不存在取消阅读的说法。 + return genStringMessage(cmdMap.get(CMD_TYPE.AP94),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP94)) + .append(CMDSPLIT).append(Runtime.PushtxtMsg_srv_index) + .append(CMDSPLIT).append("1") + .append(CMDEND).toString()); + + } + + + public void handleBP94(){ + + } + + public static StringMessage APWT(){ + + return genStringMessage("APWT",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APWT)).append(CMDEND).toString()); + + } + + public void handleBPWT(Connection connection,Runtime runtime , String cmd) { +/** + * 14同步天气(上行协议号:APWT,响应:BPWT) + * 示例: + * IWAPWT# + * 说明: + * IW:标识符 + * APWT : 命令字符 + * 平台响应: IWBPWT, 深圳, 2018-12-24 16:45:5, 2018-12-25,1, 3,1,晴, 2018-12-26, -1,4,2, 阴, 2018-12-27,3,7, 3,小雨# + * 实际返回需要转换为unicode: + * IWBPWT, 6df15733, 2018-12-24 16:45:5, 2018-12-25,1, 3, 1, 6674, 2018-12-26, -1,4, 2, 9634, 2018-12-27,3,7, 3, 5c0f96e8# + * 深圳,所在城市, + * 2018-12-24 16:45:51 预报时间 + * 2018-12-25: 当天日期 + * 1:当天最低温度,表示1度 + * 3:当天最高温度,表示3度 + * 1:天气大类(1-晴、2-多云、3-雨、4-雪、5-未知) + * 晴:当天天气小类,中文描述 + * 2018-12-26:第二天日期 + * -1:第二天最低温度,表示-1度 + * 4:第二天最高温度,表示4度 + * 2:天气大类(1-晴、2-多云、3-雨、4-雪、5-未知) + * 阴:第二天天气 + * 2018-12-27:第三天日期 + * 3:第三天最低温度,表示3度 + * 7:第三天最高温度,表示7度 + * 3:天气大类(1-晴、2-多云、3-雨、4-雪、5-未知) + * 小雨:第三天天气 + * 注:城市、天气为HEX的UNICODE编码,非明文; + * 在没有定位数据的情况下,则无法取到天气 + * 如果未取到天气,则相关栏位留空,注意城市也有可能为空 + * 说明: 本消息适用所有终端 + */ + String tmp,City,forecastTime,day1,day2,day3; + int temp_h_day1,temp_h_day2,temp_h_day3; + int temp_l_day1,temp_l_day2,temp_l_day3; + int temp_type_day1,temp_type_day2,temp_type_day3; + String temp_str_day1,temp_str_day2,temp_str_day3; + + temp_h_day1=temp_h_day2=temp_h_day3=0; + temp_l_day1=temp_l_day2=temp_l_day3=0; + temp_type_day1=temp_type_day2=temp_type_day3=1; + + + String list[]=cmd.split(CMDSPLIT); + + if (list.length==18){ + try { + City = Util.decodeUnicode2Utf8(list[1]); + forecastTime = list[2]; + day1 = list[3]; + tmp = list[4]; + if (Util.isNumeric(tmp.trim().replace("-",""))) { + temp_h_day1 = Integer.parseInt(tmp); + } + tmp = list[5]; + if (Util.isNumeric(tmp.trim().replace("-",""))) { + temp_l_day1 = Integer.parseInt(tmp); + } + tmp = list[6]; + if (Util.isNumeric(tmp.trim().replace("-",""))) { + temp_type_day1 = Integer.parseInt(tmp); + } + temp_str_day1=Util.decodeUnicode2Utf8(list[7]); + day2=list[8]; + tmp = list[9]; + if (Util.isNumeric(tmp.trim().replace("-",""))) { + temp_h_day2 = Integer.parseInt(tmp); + } + tmp = list[10]; + if (Util.isNumeric(tmp.trim().replace("-",""))) { + temp_l_day2 = Integer.parseInt(tmp); + } + tmp = list[11]; + if (Util.isNumeric(tmp.trim().replace("-",""))) { + temp_type_day2 = Integer.parseInt(tmp); + } + temp_str_day2=Util.decodeUnicode2Utf8(list[12]); + day3=list[13]; + tmp = list[14]; + if (Util.isNumeric(tmp.trim().replace("-",""))) { + temp_h_day3 = Integer.parseInt(tmp); + } + tmp = list[15]; + if (Util.isNumeric(tmp.trim().replace("-",""))) { + temp_l_day3 = Integer.parseInt(tmp); + } + tmp = list[16]; + if (Util.isNumeric(tmp.trim().replace("-",""))) { + temp_type_day3 = Integer.parseInt(tmp); + } + temp_str_day3=Util.decodeUnicode2Utf8(list[17]); + + ICLogger.i("天气预报城市 "+City+", 预报时间 "+forecastTime+",\n第一天 "+day1+", 最高温度 "+temp_h_day1+",最低温度 "+temp_l_day1+",天气类型 "+temp_type_day1+" "+temp_str_day1 + +", \n第二天 "+day2+", 最高温度 "+temp_h_day2+",最低温度 "+temp_l_day2+",天气类型 "+temp_type_day2+" "+temp_str_day2 + +", \n第三天 "+day3+", 最高温度 "+temp_h_day3+",最低温度 "+temp_l_day3+",天气类型 "+temp_type_day3+" "+temp_str_day3 ); + }catch (Exception e){ + e.printStackTrace(); + ICLogger.i("BPWT format error!"+e.getMessage()); + } + + }else{ + ICLogger.i("BPWT format error!"); + } + } + + + public static StringMessage APLA(String index){ + + return genStringMessage("APLA",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APLA)) + .append(CMDSPLIT).append(index) + .append(CMDEND).toString()); + + } + + public void handleBPLA(Connection connection, Runtime runtime , String cmd){ + /*** + *IWBPLA,353456789012345,577569,1# + * 说明: + * IW:标识符 + * BPLA : 命令字符 + * 353456789012345:IMEI号,设备唯一ID + * 577569:指令流水号 + * 1: 要切换的语言 1是意大利语,2是德语,3是法语 + * 设备响应: IWAPLA,080835# + * 080835:指令流水号 + */ + String[] cmdlist=cmd.split(","); + if (cmdlist.length == 4){ + String cmdindex=cmdlist[2]; + String msg_index_no=cmdlist[3]; + StringMessage msg=APLA(cmdindex); + connection.send(msg); + LanguageUtils.changeLanguageByIndex(runtime.getContextProxy().context,msg_index_no); + + }else{ + ICLogger.i("BP40 format error!"); + } + + } + + public boolean handleCmd(CMD_TYPE type, String cmd) { + + //普通非二进制命令用此函数处理 + boolean ret=true; + ICLogger.i("handleCmd "+type.name() + " strLen="+cmd.length()); + if (Config.LOG_TOFILE)ICLogger.logToFile("APILog", " recv " + cmd); + switch (type){ + case BP00: //登录包 + handleBP00(mRuntime,cmd); + ICLogger.i("服务器收到登录包AP00"); + mConnection.DeliverCMDMessageToSystem("login",cmd);//通知下面线程状态变化 + break; + case BP01: //gps定位包 + handleBP01(cmd); + ICLogger.i("服务器收到定位AP01"); + mConnection.DeliverCMDMessageToSystem("AP01",cmd);//通知下面线程服务器收到指令 + break; + case BP02:// wifi定位包 + handleBP02(cmd); + ICLogger.i("服务器收到定位AP02"); + mConnection.DeliverCMDMessageToSystem("AP02",cmd);//通知下面线程服务器收到指令 + break; + case BP03: //心跳包 + handleBP03(cmd); + ICLogger.i("服务器收到心跳包AP03"); + mConnection.DeliverCMDMessageToSystem("heartbeat",cmd);//通知下面线程状态变化 + break; + + case BP07: + //收到发送的语音包 + handleBP07(cmd,mConnection); + break; + case BP10: + //报警包 + mConnection.DeliverCMDMessageToSystem("AP10",cmd);//通知下面线程服务器收到指令 + break; + + case BPTM: + //校时命令 + handleBPTM(cmd); + ICLogger.i("服务器收到校时命令APTM"); + mConnection.DeliverCMDMessageToSystem("APTM",cmd);//通知下面线程服务器收到指令 + break; + case BP85://设置闹钟 + handleBP85(cmd,mConnection,mRuntime); + ICLogger.i("收到服务器设置闹钟命令BP85"); + mConnection.DeliverCMDMessageToSystem("AP85",cmd);//通知下面线程服务器收到指令 + break; + case BP33: + //设置工作模式 + handleBP33(mConnection,mRuntime,cmd); + mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化 + + break; + case BP34: + //设置工作模式 + handleBP34(mConnection,mRuntime,cmd); + mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化 + break; + case BP16: + //立即定位指令(长链接有效) + handleBP16(mConnection,mRuntime,cmd); + mConnection.DeliverCMDMessageToSystem("StartLocate",cmd);//通知下面线程状态变化 + break; + +// case BP05: //L02服务器不适用 +// //查询服务器语音 返回信息 +// API.handleBP05(cmd); +// break; + + case BP12: + //收到设置SOS号码 + handleBP12(mConnection,cmd,mRuntime); + ICLogger.i("收到服务器设置SOS号码命令BP12"); + break; + case BP14: + //收到设置白名单号码 + handleBP14(mConnection,cmd,mRuntime); + ICLogger.i("收到服务器设置白名单号码命令BP14"); + break; + case BP15: + handleBP15(cmd,mConnection,mRuntime); + ICLogger.i("收到服务器设置定位命令BP15"); + break; + case BP17: + //收到恢复出厂设置 + handleBP17(mConnection,cmd); + ICLogger.i("收到服务器恢复出厂设置命令BP17"); + mConnection.DeliverCMDMessageToSystem("FactoryReset",cmd);//通知下面线程状态变化 + break; + + case BP18: + //收到重启 + handleBP18(mConnection,cmd); + ICLogger.i("收到服务器重启命令BP18"); + mConnection.DeliverCMDMessageToSystem("Reboot",cmd);//通知下面线程状态变化 + break; + + case BP31: + //收到关机 + handleBP31(mConnection,cmd); + ICLogger.i("收到服务器关机命令BP31"); + mConnection.DeliverCMDMessageToSystem("poweroff",cmd);//通知下面线程状态变化 + break; + + case BPXL: + handleBPXL(cmd,mConnection); + ICLogger.i("收到服务器心率检测命令"); + if(mRuntime.check_stat_do_ppg_test()) HeartRateManager.triggerPPGtest(); + break; + case BPXY: + handleBPXY(cmd,mConnection); + ICLogger.i("收到服务器血压检测命令"); + if(mRuntime.check_stat_do_ppg_test()) HeartRateManager.triggerPPGtest(); + break; + case BPJZ: + handleBPJZ(cmd,mConnection,mRuntime); + ICLogger.i("收到服务器血压校准命令"); + break; + case BPHT: + ICLogger.i("服务器收到上传的心率血压APHT"); + mConnection.DeliverCMDMessageToSystem("APHT",cmd);//通知下面线程服务器收到指令 + break; + case BPHP: + ICLogger.i("服务器收到上传的心率血压血氧APHP"); + mConnection.DeliverCMDMessageToSystem("APHP",cmd);//通知下面线程服务器收到指令 + break; + + case BP50: + ICLogger.i("服务器收到体温AP50"); + mConnection.DeliverCMDMessageToSystem("AP50",cmd);//通知下面线程服务器收到指令 + break; + case BP84: + handleBP84(cmd,mConnection); + ICLogger.i("收到服务器白名单命令"); + break; + + case BP86: + //心率血压周期设置 + handleBP86(cmd,mConnection,mRuntime); + + break; + case BP89: + //心率/血压阀值 + handleBP89(cmd,mConnection); + break; + + case BP94: + handleBP94(); + mConnection.DeliverCMDMessageToSystem("AP94",cmd);//通知下面线程状态变化 + break; + case BP93: + //服务器下发文版 + handleBP93(mConnection,mRuntime,cmd); + break; + + case BPWT: + //心率/血压阀值 + handleBPWT(mConnection,mRuntime,cmd); + break; + + case BPLA: + //changeLaunguag + handleBPLA(mConnection,mRuntime,cmd); + break; + } + + return ret; + + } + + + public boolean handleCmd(CMD_TYPE type, String cmd, byte[] bytes) { + + //只有需要传递二级制数据的才需要这个函数,目前只有BP28需要 + + boolean ret=true; + ICLogger.i("handleCmd "+type.name() + " "+cmd+" bytelen="+bytes.length ); + if (Config.LOG_TOFILE) ICLogger.logToFile("APILog", " recv " +new String(bytes)); + switch (type) { + case BP28: + handleBP28(mConnection,cmd, mRuntime,bytes); + ICLogger.i("收到服务器语音BP28"); + mConnection.DeliverCMDMessageToSystem("BP28", "");//通知下面线程状态变化 + break; + } + return ret; + } + +} diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 01217f63..4f8ed821 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -136,4 +136,15 @@ 久坐提醒 久坐提醒 + + + + English + 日本語 + ภาษาไทย + 简体中文 + 繁體中文 + 意大利 + 法语 + 德语 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c12d0772..d4303234 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -139,4 +139,16 @@ 久坐提醒 Sedentary reminder ! + + + English + 日本語 + ภาษาไทย + 简体中文 + 繁體中文 + 意大利 + 法语 + 德语 + + diff --git a/local.properties b/local.properties index 8a96cc0a..e6bf80bf 100644 --- a/local.properties +++ b/local.properties @@ -4,5 +4,5 @@ # Location of the SDK. This is only used by Gradle. # For customization when using a Version Control System, please read the # header note. -#Tue Dec 15 20:47:39 CST 2020 -sdk.dir=D\:\\Android\\Sdk +#Wed Dec 16 16:41:45 CST 2020 +sdk.dir=C\:\\Users\\incar\\AppData\\Local\\Android\\Sdk -- 2.17.1