protocol_jiai 添加语言切换命令 BPLA
authorsnickersun <scy@incartech.cn>
Mon, 21 Dec 2020 10:26:05 +0000 (18:26 +0800)
committersnickersun <scy@incartech.cn>
Mon, 21 Dec 2020 10:26:05 +0000 (18:26 +0800)
app/src/main/AndroidManifest.xml
app/src/main/java/com/enqualcomm/support/ICSmsManager.java
app/src/main/java/com/enqualcomm/support/bean/Runtime.java
app/src/main/java/com/ic/protocols/protocol_jiai.java
app/src/main/res/values-zh-rCN/strings.xml
app/src/main/res/values/strings.xml
local.properties

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