1、心跳 Alarm改为HeartBeatAlarm,使代码更好读
authorsnickersun <scy@incartech.cn>
Tue, 12 Jan 2021 02:59:56 +0000 (10:59 +0800)
committersnickersun <scy@incartech.cn>
Tue, 12 Jan 2021 02:59:56 +0000 (10:59 +0800)
2、ThreadPool 改newInstance为 GetInstance
3、去掉各个协议中 心率测试周期设置时的broadcast消息,改为直接调用setHeartRateAlarm,减少消息阻塞造成的任务延迟。
4、InputEventReader中 编译问题
5、Util.java中添加  byteArray4ToInt intToByteArray4等函数,InputEventReader中使用。
6、去掉之前antiPoling 计划的代码,poling要在驱动中实现才靠谱。

14 files changed:
app/src/main/AndroidManifest.xml
app/src/main/java/com/enqualcomm/support/Config.java
app/src/main/java/com/enqualcomm/support/Constants.java
app/src/main/java/com/enqualcomm/support/CoreService.java
app/src/main/java/com/enqualcomm/support/bean/Runtime.java
app/src/main/java/com/enqualcomm/support/service/HeartRateManager.java
app/src/main/java/com/enqualcomm/support/service/InputEventReader.java
app/src/main/java/com/enqualcomm/support/utils/TemperatureUtil.java
app/src/main/java/com/enqualcomm/support/utils/ThreadPool.java
app/src/main/java/com/enqualcomm/support/utils/Util.java
app/src/main/java/com/ic/protocols/protocol_beehome.java
app/src/main/java/com/ic/protocols/protocol_ic.java
app/src/main/java/com/ic/protocols/protocol_jiai.java
app/src/main/java/com/ic/protocols/protocol_mqtt.java

index 12727f6..ac0fa20 100644 (file)
             <intent-filter>
                 <action android:name="com.enqualcomm.support.startsrv" />
                 <action android:name="com.enqualcomm.support.ACTION_ALARM" />
-                <action android:name="com.enqualcomm.support.HEART_ALARM" />
-                <action android:name="com.enqualcomm.support.ANTI_ALARM" />
+                <action android:name="com.enqualcomm.support.HEARTBEAT_ALARM" />
                 <action android:name="com.enqualcomm.support.TEMP_ALARM" />
                 <action android:name="com.enqualcomm.support.PRACTICE_ALARM" />
                 <action android:name="com.eqc.heartrate.action.SILENT_START" />
index 036845b..1775504 100644 (file)
@@ -165,7 +165,6 @@ public class Config {
   final static String KeyBPLadust="KeyBPLAdjust";
   final static String KeySPo2adust="KeySPo2Adjust";
 
-  final static String KeyPolingCycleCheckAnti="PolingCycleCheckAnti";
   final static String KeyBleScanCycle="BleScanCycle";
 
   final static String KeyLastUnReadMessage="UnreadMsg";
@@ -187,15 +186,6 @@ public class Config {
     return SharPreferenceUtil.getPrefInt(context,KeyMasterVolume,15);
   }
 
-
-  public static void setCheckAntiPolingCycle(Context context, int cycle){
-    SharPreferenceUtil.setPrefInt(context,KeyPolingCycleCheckAnti,cycle);
-  }
-
-  public static int getCheckAntiPolingCycle(Context context){
-    return SharPreferenceUtil.getPrefInt(context,KeyPolingCycleCheckAnti,0);
-  }
-
   public static void setBleScanCycle(Context context, int cycle){
     SharPreferenceUtil.setPrefInt(context,KeyBleScanCycle,cycle);
   }
index ac7efc2..c73ef31 100644 (file)
@@ -47,6 +47,7 @@ public interface Constants {
 
     String ACTION_HEATR_RATE_START = "com.eqc.heartrate.action.SILENT_START";
     String ACTION_CHECK_ANTIOFF_EVENT = "com.ic.action.CHECK_ANTIOFF_EVENT";
+    String ACTION_CHECK_CUTOFF_EVENT = "com.ic.action.CHECK_CUTOFF_EVENT";
 
     String ACTION_IMESSAGE = "action.message";
 
@@ -135,9 +136,8 @@ public interface Constants {
 
     String FLAG = "flag";
 
-    String ANTI_ALARM = "com.enqualcomm.support.ANTI_ALARM";
     String TEMP_ALARM = "com.enqualcomm.support.TEMP_ALARM";
-    String HEART_ALARM = "com.enqualcomm.support.HEART_ALARM";
+    String HEARTBEAT_ALARM = "com.enqualcomm.support.HEARTBEAT_ALARM";
 
     int IDLE_MODE_CHANGED = 102;
 
index f7d4253..4e44359 100644 (file)
@@ -70,6 +70,7 @@ import static com.enqualcomm.support.Constants.ACTION_ALARM_ADD_DATAPOINTS;
 import static com.enqualcomm.support.Constants.ACTION_ALARM_ALARM_CHANGE;
 import static com.enqualcomm.support.Constants.ACTION_ALARM_BLE_SCAN;
 import static com.enqualcomm.support.Constants.ACTION_CHECK_ANTIOFF_EVENT;
+import static com.enqualcomm.support.Constants.ACTION_CHECK_CUTOFF_EVENT;
 import static com.enqualcomm.support.Constants.ACTION_EQC_ALARM;
 import static com.enqualcomm.support.Constants.ACTION_HEATR_RATE_START;
 import static com.enqualcomm.support.Constants.ACTION_LOCAL_SOS_ACTION;
@@ -77,10 +78,10 @@ import static com.enqualcomm.support.Constants.ACTION_LOCATION_ALARM;
 import static com.enqualcomm.support.Constants.ACTION_QUERY_WEATHER;
 import static com.enqualcomm.support.Constants.ACTION_SEND_EMEGENCY_LOCATION_START;
 import static com.enqualcomm.support.Constants.ACTION_SEND_EMEGENCY_LOCATION_STOP;
-import static com.enqualcomm.support.Constants.ANTI_ALARM;
+
 import static com.enqualcomm.support.Constants.FROM_ALARM;
 import static com.enqualcomm.support.Constants.FROM_SERVER;
-import static com.enqualcomm.support.Constants.HEART_ALARM;
+import static com.enqualcomm.support.Constants.HEARTBEAT_ALARM;
 import static com.enqualcomm.support.Constants.KEY_SAVE_STEP_COUNT;
 import static com.enqualcomm.support.Constants.KEY_STEP_COUNT;
 import static com.enqualcomm.support.Constants.STEP_COUNT_ALARM_ACTION;
@@ -168,7 +169,7 @@ public class CoreService extends Service {
             //只有需要确定绝对时间点启动的Alarm需要重置,相对时间点的Alarm不需要重置。防止永远不能正常登陆。
             setSleepAlarm();
             setWakeAlarm();
-//            setHeartAlarm();
+//            setHeartBeatAlarm();
 //           setHeartRateDetectAlarm(runtime.getPpgTestCycle());
             setWeatherAlarm();
             runtime.getContextProxy().sendBroadcast(ACTION_ALARM_ALARM_CHANGE, runtime); //更新Alarm
@@ -922,7 +923,7 @@ public class CoreService extends Service {
 
 
         //网络协议心跳时间
-        setHeartAlarm();
+        setHeartBeatAlarm();
 
         //设置心率检测频率
         setHeartRateDetectAlarm(runtime.getPpgTestCycle()); //3分钟一次
@@ -936,16 +937,8 @@ public class CoreService extends Service {
         setLocationAlarm(runtime.getLocationInstance().getWorkingMod());
 
         //设置温度测量间隔时间
-
         setTempAlarm(false);
 
-
-        //初始化佩戴检测
-        runtime.anti_test_cycle_minutes = Config.getCheckAntiPolingCycle(this);
-        if (runtime.anti_test_cycle_minutes > 0) {
-            //   setAntiAlarm();
-        }
-
         //初始化蓝牙检测
         runtime.bleInfo.bleScanCycle = Config.getBleScanCycle(this);
         if (Config.BLEScanProtocol == 1 && runtime.bleInfo.bleScanCycle > 0) {
@@ -1139,7 +1132,7 @@ public class CoreService extends Service {
             ICLogger.i(stringBuilder.toString());
 //            if (ACTION_ALARM.equals(paramIntent.getAction())) {
 
-            if (HEART_ALARM.equals(paramIntent.getAction())) {
+            if (HEARTBEAT_ALARM.equals(paramIntent.getAction())) {
                 //发送心跳间隔广播给其他应用
                 this.runtime.getContextProxy().sendBroadcast(ACTION_EQC_ALARM, this.runtime);
                 this.connectionServiceChain.processAlarmClock(this.connection, this.runtime);
@@ -1173,7 +1166,7 @@ public class CoreService extends Service {
                 }
                 //检测电池电量 并上报低电报警
                 batteryUtil.getBatteryLevel(this);
-                setHeartAlarm();
+                setHeartBeatAlarm();
                 if (Config.LOG_TOFILE)
                     ICLogger.logToFile("alarmCycle", "HEART_ALARM alarmCycle  ");
                 return Service.START_STICKY;
@@ -1268,20 +1261,6 @@ public class CoreService extends Service {
                 is_allowed_in_sleep_mode = 1;
                 setWakeAlarm();
                 return Service.START_STICKY;
-            } else if (ANTI_ALARM.equals(paramIntent.getAction())) {
-                //测试是否佩戴
-                antiservice.CheckAntiByPoling();
-                if (Config.LOG_TOFILE)
-                    ICLogger.logToFile("alarmCycle", "ANTI_ALARM alarmCycle  ");
-                setAntiAlarm();
-
-                return Service.START_STICKY;
-//                if (this.mKeepAlive != null) {
-//
-//                    if (connection.isServerConnected() && runtime.isServerProtocolConnected()) {
-//                    }
-//                    return Service.START_STICKY;
-//                }
             } else if (TEMP_ALARM.equals(paramIntent.getAction())) {
 
                 setTempAlarm(false);
@@ -1334,8 +1313,9 @@ public class CoreService extends Service {
             } else if (ACTION_CHECK_ANTIOFF_EVENT.equals(paramIntent.getAction())) {
                 //只在中断式检测过程中延时用
                 antiservice.check_ant_event();
+            }else if (ACTION_CHECK_CUTOFF_EVENT.equals(paramIntent.getAction())){
+                antiservice.check_cut_event();
             }
-
             this.invokeHandlerServiceChain.processUserRequest(paramIntent, this.connection, this.runtime);
 
         }
@@ -1442,14 +1422,14 @@ public class CoreService extends Service {
 
     }
 
-    public void setHeartAlarm() {
+    public void setHeartBeatAlarm() {
 //        int mod=runtime.getLocationInstance().getWorkingMod();
         StringBuilder sb = new StringBuilder();
         int cycle = runtime.getHeartBeatCycle();
 
         //心跳指令默认设置
-        AlarmHelper.setRealTimeAlarm(runtime.getContextProxy().context, cycle, HEART_ALARM);
-        sb.append(" setHeartAlarm  " + HEART_ALARM + ", cycle " + cycle +" minutes");
+        AlarmHelper.setRealTimeAlarm(runtime.getContextProxy().context, cycle, HEARTBEAT_ALARM);
+        sb.append(" setHeartBeatAlarm  " + HEARTBEAT_ALARM + ", cycle " + cycle +" minutes");
 //        locationClient.triggerLocationProcess();
         ICLogger.i(sb.toString());
         FileOutputUtil.fileOutput(runtime.getCacheDir(), "alarmCycle", sb.toString());
@@ -1457,19 +1437,6 @@ public class CoreService extends Service {
 //        AlarmHelper.setRealTimeAlarm(runtime.getContextProxy().context,1, HEART_ALARM);
     }
 
-    public void setAntiAlarm() {
-//        int mod=runtime.getLocationInstance().getWorkingMod();
-        StringBuilder sb = new StringBuilder();
-        int cycle = runtime.anti_test_cycle_minutes;
-        if (cycle > 1) {
-            AlarmHelper.setRealTimeAlarm(runtime.getContextProxy().context, cycle, ANTI_ALARM);
-        }
-        sb.append(" setHeartAlarm  " + ANTI_ALARM + ", cycle " + cycle+" minutes");
-
-        ICLogger.i(sb.toString());
-        FileOutputUtil.fileOutput(runtime.getCacheDir(), "alarmCycle", sb.toString());
-    }
-
     public void setTempAlarm(boolean fromServerCmd) {
         StringBuilder sb = new StringBuilder();
         int cycle = runtime.temp_test_Cycle_Seconds;
index d2456c3..d42b5ab 100644 (file)
@@ -17,7 +17,6 @@ public class Runtime {
     private boolean debugflag = false;
 
     public int temp_test_Cycle_Seconds = 60 * 60;
-    public int anti_test_cycle_minutes = 30;
 
     public static String PushtxtMsg_srv_index = "";
 
index b55b290..d16cde8 100644 (file)
@@ -246,6 +246,8 @@ public class HeartRateManager extends AbstractInvokeHandlerService {
         runtime.getContextProxy().context.sendBroadcast(intent);
     }
 
+
+    //由于消息阻塞,暂时不用此种消息处理方式了
     private final BroadcastReceiver PPGStartReceiver = new BroadcastReceiver() {
         public void onReceive(Context param1Context, Intent param1Intent) {
             if (ACTION_HEATR_RATE_START.equals(param1Intent.getAction())) {
@@ -279,12 +281,12 @@ public class HeartRateManager extends AbstractInvokeHandlerService {
     }
 
     public void onAttach(Connection paramConnection, Runtime paramRuntime) {
-        regReceiver();
+//        regReceiver();
     }
 
     public void onDetach(Connection paramConnection, Runtime paramRuntime) {
         ICLogger.d("onDetach...");
-        unRegReceiver();
+//        unRegReceiver();
         //取消服务注册
         try {
             heartRateSensorService.unRegisterCallback(mRemoteCallback);
index 596114d..bcb643b 100644 (file)
@@ -179,7 +179,6 @@ public class InputEventReader {
                     FileInputStream br=new FileInputStream(antipath);
                     byte buf[]=new byte[50];
                     int len=0;
-                    br.available()
                     while(true){
                         len=br.read(buf);
                         if(len>0) {
index cfebf21..89ae10a 100644 (file)
@@ -152,7 +152,7 @@ public class TemperatureUtil {
 
 
     public void doTempTestInThread(int from) {
-        ThreadPool.newInstance().submitThreadPool(() -> DoTempTest(from));
+        ThreadPool.getInstance().submitThreadPool(() -> DoTempTest(from));
     }
 
     public static final String ACTION_TEMP_RESULT = "com.ic.action.temp_result";
index 5879c7f..cb3cf2d 100644 (file)
@@ -15,7 +15,7 @@ final public class ThreadPool {
     }
 
 
-    public static ThreadPool newInstance() {
+    public static ThreadPool getInstance() {
         if (instance == null) {
             synchronized (ThreadPool.class) {
                 if (instance == null) {
index 2594970..41a8c4c 100644 (file)
@@ -37,6 +37,7 @@ import java.io.UnsupportedEncodingException;
 import java.lang.reflect.Method;
 import java.net.InetAddress;
 import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
 import java.nio.charset.Charset;
 import java.util.ArrayList;
 import java.util.Enumeration;
@@ -1159,5 +1160,58 @@ public class Util {
   private static byte charToByte(char c) {
     return (byte) "0123456789ABCDEF".indexOf(c);
   }
+
+  public static int byteArray4ToInt(byte[] b) {
+    return   b[3] & 0xFF |
+            (b[2] & 0xFF) << 8 |
+            (b[1] & 0xFF) << 16 |
+            (b[0] & 0xFF) << 24;
+  }
+  public static byte[] intToByteArray4(int a) {
+    return new byte[] {
+            (byte) ((a >> 24) & 0xFF),
+            (byte) ((a >> 16) & 0xFF),
+            (byte) ((a >> 8) & 0xFF),
+            (byte) (a & 0xFF)
+    };
+  }
+
+  /**
+   * 将字节数组转为long<br>
+   * 如果input为null,或offset指定的剩余数组长度不足8字节则抛出异常
+   * @param input
+   * @param offset 起始偏移量
+   * @param littleEndian 输入数组是否小端模式
+   * @return
+   */
+  public static long longFrom8Bytes(byte[] input, int offset, boolean littleEndian){
+    if(offset <0 || offset+8>input.length)
+      throw new IllegalArgumentException(String.format("less than 8 bytes from index %d  is insufficient for long",offset));
+    long value=0;
+    for(int  count=0;count<8;++count){
+      int shift=(littleEndian?count:(7-count))<<3;
+      value |=((long)0xff<< shift) & ((long)input[offset+count] << shift);
+    }
+    return value;
+  }
+
+  /**
+   * 利用 {@link java.nio.ByteBuffer}实现byte[]转long
+   * @param input
+   * @param offset
+   * @param littleEndian 输入数组是否小端模式
+   * @return
+   */
+  public static long bytesToLong(byte[] input, int offset, boolean littleEndian) {
+    if(offset <0 || offset+8>input.length)
+      throw new IllegalArgumentException(String.format("less than 8 bytes from index %d  is insufficient for long",offset));
+    ByteBuffer buffer = ByteBuffer.wrap(input,offset,8);
+    if(littleEndian){
+      // ByteBuffer.order(ByteOrder) 方法指定字节序,即大小端模式(BIG_ENDIAN/LITTLE_ENDIAN)
+      // ByteBuffer 默认为大端(BIG_ENDIAN)模式
+      buffer.order(ByteOrder.LITTLE_ENDIAN);
+    }
+    return buffer.getLong();
+  }
 }
 
index f59f2e1..2b12c26 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
-\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.TemperatureUtil;\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.Constants.FROM_SERVER;\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_beehome {\r
-    private static final String TAG = "ICSrv." + protocol_beehome.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 = "en.beehome360.com";\r
-    public static final int defaultServerPort = 5018;\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
-        APHT,//心率血压上传\r
-        BPHT,\r
-        APTM,//基站校时及获取定位\r
-        BPTM,\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
-        AP40,\r
-        BP40,//下发文本\r
-        AP68,\r
-        BP68,//绑定解绑\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
-        AP88,\r
-        BP88,//查找手表\r
-        AP89,\r
-        BP89,//心率血压阀值设置\r
-        APTE,\r
-        BPTE,//体温间隔设置\r
-        APTP,\r
-        BPTP,//体温上行\r
-        APX1,\r
-        BPX1,//心率血压血氧修正\r
-        APS4,\r
-        BPS4,//提醒设置(时间段)\r
-        APHP,//上报心率血压血氧\r
-        BPHP,\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.APHT, "APHT");\r
-        cmdMap.put(CMD_TYPE.BPHT, "BPHT");\r
-        cmdMap.put(CMD_TYPE.APTM, "APTM");\r
-        cmdMap.put(CMD_TYPE.BPTM, "BPTM");\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.AP40, "AP40");\r
-        cmdMap.put(CMD_TYPE.BP40, "BP40");\r
-        cmdMap.put(CMD_TYPE.AP68, "AP68");\r
-        cmdMap.put(CMD_TYPE.BP68, "BP68");\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.AP88, "AP88");\r
-        cmdMap.put(CMD_TYPE.BP88, "BP88");\r
-        cmdMap.put(CMD_TYPE.AP89, "AP89");\r
-        cmdMap.put(CMD_TYPE.BP89, "BP89");\r
-        cmdMap.put(CMD_TYPE.APTE, "APTE");\r
-        cmdMap.put(CMD_TYPE.BPTE, "BPTE");\r
-        cmdMap.put(CMD_TYPE.APTP, "APTP");\r
-        cmdMap.put(CMD_TYPE.BPTP, "BPTP");\r
-        cmdMap.put(CMD_TYPE.APX1, "APX1");\r
-        cmdMap.put(CMD_TYPE.BPX1, "BPX1");\r
-        cmdMap.put(CMD_TYPE.APS4, "APS4");\r
-        cmdMap.put(CMD_TYPE.BPS4, "BPS4");\r
-        cmdMap.put(CMD_TYPE.APHP, "APHP");\r
-        cmdMap.put(CMD_TYPE.BPHP, "BPHP");\r
-\r
-    }\r
-\r
-\r
-    private Connection mConnection = null;\r
-    private Runtime mRuntime = null;\r
-\r
-    public protocol_beehome(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
-\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
-    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
-    /*\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
-\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
-    /*登录*/\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
-        //IW: 标识符\r
-        //AP03:命令字\r
-        //设备在静止时,可以通过该指令与平台保持连接和解决静态漂移\r
-        //06000908000102:\r
-        //060为GSM信号,\r
-        //009为参与定位的卫星数,\r
-        //080为电池电量,\r
-        //0 为保留位,\r
-        //01为设防状态,此处由两位十六进制表示,无取值时为 00 ,长度必需为两位,一共 8个bit 表示8种状态,各bit定义如下:(未列出的为当前未使用, 1表示有效 ,0 表示无效)\r
-        //Bit0 设防状态<手表无效>\r
-        //Bit1 为 1 表示夜灯为开,为0 夜灯为 关\r
-        //02为工作模式 ,(设防,工作模式如果为00,则代表无或未设置)\r
-        //5555: 计步步数,每次到达 9999 后重 0 开始计 (此处 9999 为示例,可以为2字节int 然后溢出归零)\r
-        //30: 翻滚次数\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
-\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.1061830323.8706000908000502,\r
-         * 460,0,9520,3671,\r
-         * 00,zh-cn,00,\r
-         * 00为报警状态,00为无任何报警(01:SOS,02:低电,03:脱落报警,04:佩戴提醒,05/06:跌倒报警)) IC,即爱\r
-         * 00为报警状态,00为无任何报警(01:SOS,02:低电,03:脱落报警,04:佩戴提醒,05:剪断报警,06:跌倒报警,07:心率异常, 08:心率过高, 09:心率过低,10收缩压过高,11收缩压过低,12舒张压过高,13舒张压过低)\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
-         */\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())\r
-                .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
-    /*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
-    public static StringMessage APXL(String id) {\r
-//设备响应:      IWAPXL,080835#\r
-        //080835:指令流水号\r
-        return genStringMessage(cmdMap.get(CMD_TYPE.APXL), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APXL))\r
-                .append(CMDSPLIT).append(id)\r
-                .append(CMDEND).toString());\r
-    }\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(cmdMap.get(CMD_TYPE.APXY), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APXY))\r
-                .append(CMDSPLIT).append(id)\r
-                .append(CMDEND).toString());\r
-    }\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
-    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(cmdMap.get(CMD_TYPE.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
-     * @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
-    public static StringMessage AP18(String index) {\r
-        return genStringMessage(cmdMap.get(CMD_TYPE.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(cmdMap.get(CMD_TYPE.AP17), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP17))\r
-                .append(CMDSPLIT).append(index)\r
-                .append(CMDEND).toString());\r
-    }\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(cmdMap.get(CMD_TYPE.AP31), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP31))\r
-                .append(CMDSPLIT).append(index)\r
-                .append(CMDEND).toString());\r
-    }\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(cmdMap.get(CMD_TYPE.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())\r
-                contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos1", phNum1));\r
-            if (!phNum2.isEmpty())\r
-                contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos2", phNum2));\r
-            if (!phNum3.isEmpty())\r
-                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(cmdMap.get(CMD_TYPE.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
-\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
-    public static StringMessage AP85(Runtime ds, String cmddata) {\r
-//示例数据:IWAP49,68##\r
-        return genStringMessage(cmdMap.get(CMD_TYPE.AP85), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP85))\r
-                .append(CMDSPLIT).append(cmddata)\r
-                .append(CMDEND).toString());\r
-\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
-        if (datalist.length > 0) {\r
-            try {\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
-                            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
-\r
-                        } else if (cmdarglist.length == 5) {\r
-                            imei = cmdarglist[1];\r
-                            cmdindex = cmdarglist[2];\r
-                            all_alarmswitch = Integer.parseInt(cmdarglist[3]);\r
-                            alarmcount = Integer.parseInt(cmdarglist[4]);\r
-                        } else {\r
-                            log("data len is too small!");\r
-                        }\r
-                    } else {\r
-                        if (cmdarglist.length == 4) {\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
-\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
-            } catch (Exception e) {\r
-                ICLogger.e(e.getMessage(), e);\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
-    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
-    public static StringMessage AP33(String cmdindex, int workMode) {\r
-//IWAP33,080835,1#\r
-//080835:指令流水号\r
-//1:设置信息,供服务器同步\r
-        return genStringMessage(cmdMap.get(CMD_TYPE.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
-            log("com.ic.work mode " + cmdlist[3]);\r
-            try {\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);\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(cmdMap.get(CMD_TYPE.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("com.ic.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);\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
-    public void handleBP40(Connection connection, Runtime runtime, String cmd) {\r
-\r
-//        IWBP40,353456789012345,080835,XXXXXXXXXXXXXX#\r
-//        IW:标识符\r
-//        BP40 : 命令字符\r
-//        353456789012345:IMEI号,设备唯一ID\r
-//        080835 :指令流水号\r
-//        XXXXXXXXXXXX : 表示文字内容GB2312编码\r
-\r
-\r
-        String[] cmdlist = cmd.split(",");\r
-        if (cmdlist.length == 4) {\r
-            String cmdindex = cmdlist[2];\r
-            String txtmsg = cmdlist[3];\r
-\r
-            txtmsg = Util.UrlGB2312ToUTF8(txtmsg);\r
-            StringMessage msg = AP40(cmdindex, 1);\r
-            //设定当前工作模式及循环频率\r
-            connection.send(msg);\r
-            ICLogger.i("received Txt Msg " + txtmsg);\r
-            runtime.getContextProxy().sendMsgBroadcast(txtmsg, 0);\r
-            runtime.getContextProxy().saveMstToSMSDB(txtmsg);\r
-        } else {\r
-            ICLogger.i("BP40 format error!");\r
-        }\r
-    }\r
-\r
-    public static StringMessage AP40(String cmdindex, int success) {\r
-\r
-//        IWAP40,080835,1#\r
-//        080835:指令流水号\r
-//        1:表示设备接受数据成功,0表示设备接受数据失败\r
-        return genStringMessage(cmdMap.get(CMD_TYPE.AP40), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP40))\r
-                .append(CMDSPLIT).append(cmdindex)\r
-                .append(CMDSPLIT).append(success)\r
-                .append(CMDEND).toString());\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
-    /**\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
-\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
-\r
-\r
-    //立即定位反馈\r
-    public static StringMessage AP16(String cmdindex) {\r
-//IWAP16,080835#\r
-//080835:指令流水号\r
-        return genStringMessage(cmdMap.get(CMD_TYPE.AP16), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP16))\r
-                .append(CMDSPLIT).append(cmdindex)\r
-                .append(CMDEND).toString());\r
-    }\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(cmdMap.get(CMD_TYPE.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
-    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(cmdMap.get(CMD_TYPE.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
-\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
-\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(cmdMap.get(CMD_TYPE.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.绑定解绑(下行协议号:BP68,响应:AP68)\r
-    public static StringMessage AP68(String index) {\r
-\r
-        //设备响应:      IWAP86, 080835#\r
-        //080835:指令流水号\r
-        return genStringMessage(cmdMap.get(CMD_TYPE.AP68), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP68))\r
-                .append(CMDSPLIT).append(index)\r
-                .append(CMDEND).toString());\r
-    }\r
-\r
-    public void handleBP68(String cmd, Connection connection, Runtime runtime) {\r
-\r
-        //示例:\r
-        //IWBP68,353456789012345,080835,1#\r
-        //说明:\r
-        //IW:标识符\r
-        //BP68 : 命令字符\r
-        //353456789012345:IMEI号,设备唯一ID\r
-        //080835 :指令流水号\r
-        //1 : 表示设备为激活状态(绑定成功) 0:表示设备为未激活状态(解绑成功)\r
-\r
-        String[] list = cmd.split(CMDSPLIT);\r
-\r
-        if (list.length == 4) {\r
-            String index = list[2];\r
-            String type = list[3];\r
-            connection.send(AP68(index));\r
-            ICLogger.i("收到服务器消息:" + (type.equals("1") ? "绑定成功 " : "未激活或者解绑"));\r
-\r
-        } else {\r
-            ICLogger.i("BP86 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(cmdMap.get(CMD_TYPE.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
-    public static StringMessage AP88(String index) {\r
-        //设备响应:      IWAP88, 080835#\r
-        //080835:指令流水号\r
-        return genStringMessage(cmdMap.get(CMD_TYPE.AP88), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP88))\r
-                .append(CMDSPLIT).append(index)\r
-                .append(CMDEND).toString());\r
-    }\r
-\r
-    public static void handleBP88(String cmd, Connection connection) {\r
-//        IWBP88,080835#\r
-        String[] list = cmd.split(CMDSPLIT);\r
-\r
-        if (list.length == 2) {\r
-            String index = list[1];\r
-            connection.send(AP88(index));\r
-            ICLogger.i("收到服务器消息:查询设备");\r
-\r
-        } else {\r
-            ICLogger.i("BP88 format error!");\r
-        }\r
-    }\r
-\r
-    //18.18.设置心率/血压阀值(下行协议号:BP89,响应:AP89)\r
-    public static StringMessage AP89(String index) {\r
-\r
-        //设备响应:      IWAP89, 080835#\r
-        //080835:指令流水号\r
-        return genStringMessage(cmdMap.get(CMD_TYPE.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
-    //体温间隔测量 (后台测试体温)(下行协议号:BPTE,响应:APTE)\r
-    public static StringMessage APTE(String index, int freq) {\r
-\r
-        //设备响应:      IWAPTE,080835,60#\r
-        //080835:指令流水号\r
-        //1:表示设备接受数据成功,0表示设备接受数据失败\r
-        return genStringMessage(cmdMap.get(CMD_TYPE.APTE), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTE))\r
-                .append(CMDSPLIT).append(index)\r
-                .append(CMDSPLIT).append(freq)\r
-                .append(CMDEND).toString());\r
-    }\r
-\r
-    public void handleBPTE(String cmd, Connection connection, Runtime runtime) {\r
-\r
-        //示例:\r
-        //IWBPTE,353456789012345,080835,60#\r
-        //说明:\r
-        //IW:标识符\r
-        //BPTE : 命令字符\r
-        //353456789012345:IMEI号,设备唯一ID\r
-        //080835 :指令流水号\r
-        //60 : 上传间隔,单位分钟(60分钟上传一次体温,终端收到后立即开始测量一次并重置定时器)\r
-        String[] list = cmd.split(CMDSPLIT);\r
-        if (list.length == 4) {\r
-            try {\r
-                String index = list[2];\r
-                String freqstr = list[3];\r
-                int freq = Integer.parseInt(freqstr);\r
-                connection.send(APTE(index, freq));\r
-                ICLogger.i("收到服务器指令:测量体温 " + freq + "分钟一次。");\r
-                Config.setTemperatureTestCycle(runtime, freq * 60);\r
-                CoreService.getInstance().setTempAlarm(true);\r
-\r
-                if (runtime.check_stat_do_temp_test())\r
-                    TemperatureUtil.getInstance().doTempTestInThread(FROM_SERVER);\r
-            } catch (Exception e) {\r
-                ICLogger.e(e.getMessage(), e);\r
-            }\r
-//            double wrist_temp,body_temp;\r
-//            wrist_temp=TemperatureUtil.get_temp_value_adjusted();\r
-//            body_temp=TemperatureUtil.getBodyTemp(wrist_temp,26.0f);\r
-//            String temperatureMsg=APTP(wrist_temp,body_temp);\r
-//            connection.send(genStringMessage("APTP",temperatureMsg));\r
-//            ICLogger.i("发送体温测量值 "+temperatureMsg);\r
-        } else {\r
-            ICLogger.i("BP89 format error!");\r
-        }\r
-\r
-    }\r
-\r
-    //体温上行(上行协议号:APTP,响应:BPTP)\r
-    public static StringMessage APTP(double wrist_temp, double body_temp) {\r
-\r
-        //设备:    IWAPTP,36.3,33,132#\r
-        //IW:标识符\r
-        //APTP : 命令字符\r
-        //35.3:测量体温 (摄氏度)\r
-        //33,132:温补用的参数,此处不用,可以用0 来代替。\r
-        return genStringMessage(cmdMap.get(CMD_TYPE.APTP), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTP))\r
-                .append(CMDSPLIT).append(String.format("%1$.2f", wrist_temp))\r
-                .append(CMDSPLIT).append(String.format("%1$.2f", body_temp))\r
-                .append(CMDSPLIT).append(0)\r
-                .append(CMDEND).toString());\r
-    }\r
-\r
-    public void handleBPTP() {\r
-\r
-        ICLogger.d("BPTP 服务器收到体温数据!");\r
-\r
-    }\r
-\r
-\r
-    public static StringMessage APX1(String id) {\r
-        //设备响应:      IWAPX1, 080835#\r
-        //080835:指令流水号\r
-        return genStringMessage(cmdMap.get(CMD_TYPE.APX1), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APX1))\r
-                .append(CMDSPLIT).append(id)\r
-                .append(CMDEND).toString());\r
-    }\r
-\r
-    /**\r
-     * @param cmd\r
-     * @param connection\r
-     * @param runtime\r
-     */\r
-    public void handleBPX1(String cmd, Connection connection, Runtime runtime) {\r
-        //IWBPX1,353456789012345,080835,2,1,-3,0#\r
-        //说明:\r
-//        IW:标识符\r
-//        BPX1 : 命令字符\r
-//        353456789012345:IMEI号,设备唯一ID\r
-//        080835 :指令流水号\r
-//        2: 心率修正值\r
-//        1:高压修正值\r
-//                -3:低压修正值\r
-//        0:血氧修正值\r
-        String[] list = cmd.split(CMDSPLIT);\r
-        if (list.length == 7) {\r
-            String index = list[2];\r
-            String imei = list[1];\r
-            String strXL = list[3];\r
-            String strBPH = list[4];\r
-            String strBPL = list[5];\r
-            String strSpO2 = list[6];\r
-\r
-            connection.send(APX1(index));\r
-\r
-            try {\r
-                int ppg_adjust, bph_adjust, bpl_adjust, spo2_adjust;\r
-                ppg_adjust = Integer.parseInt(strXL);\r
-                bph_adjust = Integer.parseInt(strBPH);\r
-                bpl_adjust = Integer.parseInt(strBPL);\r
-                spo2_adjust = Integer.parseInt(strSpO2);\r
-\r
-                runtime.getHRS().setAdjust(ppg_adjust, bph_adjust, bpl_adjust, spo2_adjust);\r
-                Config.setPPGAdjust(mRuntime.getContextProxy().context, ppg_adjust);\r
-                Config.setBPHAdjust(mRuntime.getContextProxy().context, bph_adjust);\r
-                Config.setBPLAdjust(mRuntime.getContextProxy().context, bpl_adjust);\r
-                Config.setSPo2Adjust(mRuntime.getContextProxy().context, spo2_adjust);\r
-\r
-                ICLogger.i("Handle BPX1 IMEI " + imei + ",index " + index + ", BPH " + strBPH + ", BPL " + strBPL + ", PPG " + strXL + ", Sp02 " + strSpO2);\r
-            } catch (Exception e) {\r
-                ICLogger.e(e.getMessage(), e);\r
-            }\r
-        } else {\r
-            ICLogger.i("BPX1 format error!");\r
-        }\r
-    }\r
-\r
-\r
-    public static StringMessage APS4(String id) {\r
-        //设备响应:      IWAPS4,080835#\r
-        //080835:指令流水号\r
-        return genStringMessage(cmdMap.get(CMD_TYPE.APS4), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APS4))\r
-                .append(CMDSPLIT).append(id)\r
-                .append(CMDEND).toString());\r
-    }\r
-\r
-    /**\r
-     * 主要为久坐设置提醒时长。\r
-     *\r
-     * @param cmd\r
-     * @param connection\r
-     * @param runtime\r
-     */\r
-    public void handleBPS4(String cmd, Connection connection, Runtime runtime) {\r
-        //IWBPS4,353456789012345,080835,1|1234567|0900|1100|180, 2|1234567|0900|1100|180, 1|1234567|0900|1100|180#\r
-        //说明:\r
-//        IW:标识符\r
-//        BPS4: 命令字符\r
-//        353456789012345:设备IMEI或者ID\r
-//        080835 :指令流水号\r
-//        1|1234567|0900|1100|180:类型(1久坐,2喝水)|重复周期|开始时间|结束时间|时间间隔(单位秒)\r
-//        重复周期、开始结束时间格式 参考BP85闹钟设置,\r
-//#:结尾标识符\r
-        String[] list = cmd.split(CMDSPLIT);\r
-        if (list.length >= 4) {\r
-\r
-            String index = list[2];\r
-            String imei = list[1];\r
-            connection.send(APS4(index));\r
-\r
-            String setting1;\r
-            switch (list.length) {\r
-                case 10:\r
-                    setting1 = list[9];\r
-                    ICLogger.i("set 7th alarm " + setting1);\r
-                case 9:\r
-                    setting1 = list[8];\r
-                    ICLogger.i("set 6th alarm " + setting1);\r
-                case 8:\r
-                    setting1 = list[7];\r
-                    ICLogger.i("set 5th alarm " + setting1);\r
-                case 7:\r
-                    setting1 = list[6];\r
-                    ICLogger.i("set 4th alarm " + setting1);\r
-                case 6:\r
-                    setting1 = list[5];\r
-                    ICLogger.i("set 3rd alarm " + setting1);\r
-                case 5:\r
-                    setting1 = list[4];\r
-                    ICLogger.i("set 2nt alarm " + setting1);\r
-                case 4:\r
-                    setting1 = list[3];\r
-                    ICLogger.i("set 1st alarm " + setting1);\r
-                    break;\r
-            }\r
-\r
-            ICLogger.i("Handle BPX1 IMEI " + imei + ",index " + index + ", get " + (list.length - 3) + " settings");\r
-        } else {\r
-            ICLogger.i("BPX1 format error!");\r
-        }\r
-    }\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(CMD_TYPE.APHP), new StringBuffer(CMDHEADER).append(cmdMap.get(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
-\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(CMD_TYPE.APHP), new StringBuffer(CMDHEADER).append(cmdMap.get(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
-    public void handleBPHP() {\r
-\r
-        ICLogger.i("服务器收到APHP 心率血压血氧 !");\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
-            case BP40:\r
-                //服务器推送文本\r
-                handleBP40(mConnection, mRuntime, cmd);\r
-                ICLogger.i("收到服务器推送文本消息");\r
-                mConnection.DeliverCMDMessageToSystem("showTxt", cmd);//通知下面线程状态变化\r
-                break;\r
-\r
-            case BPXL:\r
-                handleBPXL(cmd, mConnection);\r
-                ICLogger.i("收到服务器心率检测命令");\r
-                if (mRuntime.check_stat_do_ppg_test())\r
-                    HeartRateManager.getInstance().triggerPPGTest(FROM_SERVER);\r
-                break;\r
-            case BPXY:\r
-                handleBPXY(cmd, mConnection);\r
-                ICLogger.i("收到服务器血压检测命令");\r
-                if (mRuntime.check_stat_do_ppg_test())\r
-                    HeartRateManager.getInstance().triggerPPGTest(FROM_SERVER);\r
-                break;\r
-            case BPJZ:\r
-                handleBPJZ(cmd, mConnection, mRuntime);\r
-                ICLogger.i("收到服务器血压校准命令");\r
-                break;\r
-            case BPHT:\r
-                ICLogger.i("服务器收到上传的心率血压");\r
-                mConnection.DeliverCMDMessageToSystem("APHT", 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
-                mConnection.DeliverCMDMessageToSystem("AP86", cmd);//通知下面线程状态变化\r
-\r
-                break;\r
-\r
-            case BP88:\r
-                //收到查找设备消息\r
-                handleBP88(cmd, mConnection);\r
-                mConnection.DeliverCMDMessageToSystem("findDev", cmd);//通知下面线程状态变化\r
-                break;\r
-            case BP89:\r
-                //心率/血压阀值\r
-                handleBP89(cmd, mConnection);\r
-                mConnection.DeliverCMDMessageToSystem("AP89", cmd);//通知下面线程状态变化\r
-                break;\r
-\r
-            case BPTE: //设置测试体温\r
-                handleBPTE(cmd, mConnection, mRuntime);\r
-                mConnection.DeliverCMDMessageToSystem("APTE", cmd);//通知下面线程状态变化\r
-                break;\r
-\r
-            case BPTP:\r
-                handleBPTP();\r
-                mConnection.DeliverCMDMessageToSystem("APTP", cmd);//通知下面线程状态变化\r
-                break;\r
-            case BPHP:\r
-                handleBPHP();\r
-                mConnection.DeliverCMDMessageToSystem("APHP", cmd);//通知下面线程状态变化\r
-                break;\r
-            case BPX1://设置 心率血压血氧修正值\r
-                handleBPX1(cmd, mConnection, mRuntime);\r
-                ICLogger.i("收到服务器设置 心率血压血氧修正值BPX1");\r
-                mConnection.DeliverCMDMessageToSystem("APX1", cmd);//通知下面线程状态变化\r
-                break;\r
-\r
-            case BPS4: //提醒设置(时间段) 主要为久坐设置提醒时长。\r
-                handleBPS4(cmd, mConnection, mRuntime);\r
-                ICLogger.i("收到 提醒设置(时间段)");\r
-                mConnection.DeliverCMDMessageToSystem("APS4", cmd);//通知下面线程状态变化\r
-                break;\r
-        }\r
-\r
-        return ret;\r
-\r
-    }\r
-\r
-\r
-    public boolean handleCmd(CMD_TYPE type, String cmd, byte[] bytes) {\r
-\r
-        //只有需要传递二级制数据的才需要这个函数,目前只有BP28需要\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
+package com.ic.protocols;
+
+import android.content.ComponentName;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Environment;
+
+import com.enqualcomm.support.Config;
+import com.enqualcomm.support.CoreService;
+import com.enqualcomm.support.bean.Alarm;
+import com.enqualcomm.support.bean.Contact;
+import com.enqualcomm.support.bean.Content;
+import com.enqualcomm.support.bean.ICLocation;
+import com.enqualcomm.support.bean.Runtime;
+import com.enqualcomm.support.bean.StringMessage;
+import com.enqualcomm.support.bean.VoiceContent;
+import com.enqualcomm.support.bean.voicePacket;
+import com.enqualcomm.support.service.HeartRateManager;
+import com.enqualcomm.support.utils.Connection;
+import com.enqualcomm.support.utils.ICLogger;
+import com.enqualcomm.support.utils.TemperatureUtil;
+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.Constants.FROM_SERVER;
+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_beehome {
+    private static final String TAG = "ICSrv." + protocol_beehome.class.getSimpleName();
+
+    private static final String CMDHEADER = "IW";
+    private static final String CMDEND = "#";
+    private static final String CMDSPLIT = ",";
+    public static final String defaultServerIP = "en.beehome360.com";
+    public static final int defaultServerPort = 5018;
+
+    public enum CMD_TYPE {
+        /*终端发起*/
+        AP00,//登录包
+        BP00,
+        AP01,//混合定位
+        BP01,
+        AP02,//多基站定位
+        BP02,
+        AP92,//CDMA 混合定位
+        BP92,
+        AP03,//心跳包
+        BP03,
+        AP05,//语音查询接收
+        BP05,
+        AP07,//语音上行
+        BP07,
+        AP10,//报警与地址回复
+        BP10,
+        AP49,//心率上传
+        BP49,
+        APHT,//心率血压上传
+        BPHT,
+        APTM,//基站校时及获取定位
+        BPTM,
+        /* 服务器发起*/
+        AP12,
+        BP12,//SOS 号码设置
+        AP14,
+        BP14,//设置联系人白名单
+        AP15,
+        BP15,//设置定位周期
+        AP16,
+        BP16,//立即定位
+        AP17,
+        BP17,//恢复出厂设置
+        AP18,
+        BP18,//重启设备
+        AP21,
+        BP21,//设置计步开关
+        AP28,
+        BP28, //语音下行
+        AP31,
+        BP31,//关机
+        AP33,
+        BP33,//工作模式
+        AP34,
+        BP34,//自定义工作模式
+        AP40,
+        BP40,//下发文本
+        AP68,
+        BP68,//绑定解绑
+        APXL,
+        BPXL,//测量心率
+        APXY,
+        BPXY,//测量血压
+        APJZ,
+        BPJZ,//血压校准
+        AP84,
+        BP84,//白名单开关
+        AP85,
+        BP85,//设置闹钟
+        AP86,
+        BP86,//绑定解绑
+        AP88,
+        BP88,//查找手表
+        AP89,
+        BP89,//心率血压阀值设置
+        APTE,
+        BPTE,//体温间隔设置
+        APTP,
+        BPTP,//体温上行
+        APX1,
+        BPX1,//心率血压血氧修正
+        APS4,
+        BPS4,//提醒设置(时间段)
+        APHP,//上报心率血压血氧
+        BPHP,
+        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.APHT, "APHT");
+        cmdMap.put(CMD_TYPE.BPHT, "BPHT");
+        cmdMap.put(CMD_TYPE.APTM, "APTM");
+        cmdMap.put(CMD_TYPE.BPTM, "BPTM");
+        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.AP40, "AP40");
+        cmdMap.put(CMD_TYPE.BP40, "BP40");
+        cmdMap.put(CMD_TYPE.AP68, "AP68");
+        cmdMap.put(CMD_TYPE.BP68, "BP68");
+        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.AP88, "AP88");
+        cmdMap.put(CMD_TYPE.BP88, "BP88");
+        cmdMap.put(CMD_TYPE.AP89, "AP89");
+        cmdMap.put(CMD_TYPE.BP89, "BP89");
+        cmdMap.put(CMD_TYPE.APTE, "APTE");
+        cmdMap.put(CMD_TYPE.BPTE, "BPTE");
+        cmdMap.put(CMD_TYPE.APTP, "APTP");
+        cmdMap.put(CMD_TYPE.BPTP, "BPTP");
+        cmdMap.put(CMD_TYPE.APX1, "APX1");
+        cmdMap.put(CMD_TYPE.BPX1, "BPX1");
+        cmdMap.put(CMD_TYPE.APS4, "APS4");
+        cmdMap.put(CMD_TYPE.BPS4, "BPS4");
+        cmdMap.put(CMD_TYPE.APHP, "APHP");
+        cmdMap.put(CMD_TYPE.BPHP, "BPHP");
+
+    }
+
+
+    private Connection mConnection = null;
+    private Runtime mRuntime = null;
+
+    public protocol_beehome(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#
+        //IW: 标识符
+        //AP03:命令字
+        //设备在静止时,可以通过该指令与平台保持连接和解决静态漂移
+        //06000908000102:
+        //060为GSM信号,
+        //009为参与定位的卫星数,
+        //080为电池电量,
+        //0 为保留位,
+        //01为设防状态,此处由两位十六进制表示,无取值时为 00 ,长度必需为两位,一共 8个bit 表示8种状态,各bit定义如下:(未列出的为当前未使用, 1表示有效 ,0 表示无效)
+        //Bit0 设防状态<手表无效>
+        //Bit1 为 1 表示夜灯为开,为0 夜灯为 关
+        //02为工作模式 ,(设防,工作模式如果为00,则代表无或未设置)
+        //5555: 计步步数,每次到达 9999 后重 0 开始计 (此处 9999 为示例,可以为2字节int 然后溢出归零)
+        //30: 翻滚次数
+        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.1061830323.8706000908000502,
+         * 460,0,9520,3671,
+         * 00,zh-cn,00,
+         * 00为报警状态,00为无任何报警(01:SOS,02:低电,03:脱落报警,04:佩戴提醒,05/06:跌倒报警)) IC,即爱
+         * 00为报警状态,00为无任何报警(01:SOS,02:低电,03:脱落报警,04:佩戴提醒,05:剪断报警,06:跌倒报警,07:心率异常, 08:心率过高, 09:心率过低,10收缩压过高,11收缩压过低,12舒张压过高,13舒张压过低)
+         * 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#
+         */
+        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(cmdMap.get(CMD_TYPE.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(cmdMap.get(CMD_TYPE.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(cmdMap.get(CMD_TYPE.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(cmdMap.get(CMD_TYPE.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(cmdMap.get(CMD_TYPE.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(cmdMap.get(CMD_TYPE.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(cmdMap.get(CMD_TYPE.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(cmdMap.get(CMD_TYPE.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(cmdMap.get(CMD_TYPE.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) {
+            try {
+                for (int i = 0; i < datalist.length; i++) {
+                    String[] cmdarglist = datalist[i].split(",");
+
+                    if (i == 0) {
+                        if (cmdarglist.length == 9) {
+                            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", "闹铃"));
+
+                        } else if (cmdarglist.length == 5) {
+                            imei = cmdarglist[1];
+                            cmdindex = cmdarglist[2];
+                            all_alarmswitch = Integer.parseInt(cmdarglist[3]);
+                            alarmcount = Integer.parseInt(cmdarglist[4]);
+                        } else {
+                            log("data len is too small!");
+                        }
+                    } else {
+                        if (cmdarglist.length == 4) {
+                            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", "闹铃"));
+
+                        } else {
+                            log("data len is too small!");
+                        }
+
+                    }
+                }//循环获取alarm数据结束
+                runtime.getDbHelper().saveAlarm(alarmlist);
+
+                //do clean and set alarm things
+            } catch (Exception e) {
+                ICLogger.e(e.getMessage(), e);
+            }
+        }
+//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(cmdMap.get(CMD_TYPE.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) {
+            log("com.ic.work mode " + cmdlist[3]);
+            try {
+                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);
+                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(cmdMap.get(CMD_TYPE.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("com.ic.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);
+                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);
+            }
+        }
+
+    }
+
+    public void handleBP40(Connection connection, Runtime runtime, String cmd) {
+
+//        IWBP40,353456789012345,080835,XXXXXXXXXXXXXX#
+//        IW:标识符
+//        BP40 : 命令字符
+//        353456789012345:IMEI号,设备唯一ID
+//        080835 :指令流水号
+//        XXXXXXXXXXXX : 表示文字内容GB2312编码
+
+
+        String[] cmdlist = cmd.split(",");
+        if (cmdlist.length == 4) {
+            String cmdindex = cmdlist[2];
+            String txtmsg = cmdlist[3];
+
+            txtmsg = Util.UrlGB2312ToUTF8(txtmsg);
+            StringMessage msg = AP40(cmdindex, 1);
+            //设定当前工作模式及循环频率
+            connection.send(msg);
+            ICLogger.i("received Txt Msg " + txtmsg);
+            runtime.getContextProxy().sendMsgBroadcast(txtmsg, 0);
+            runtime.getContextProxy().saveMstToSMSDB(txtmsg);
+        } else {
+            ICLogger.i("BP40 format error!");
+        }
+    }
+
+    public static StringMessage AP40(String cmdindex, int success) {
+
+//        IWAP40,080835,1#
+//        080835:指令流水号
+//        1:表示设备接受数据成功,0表示设备接受数据失败
+        return genStringMessage(cmdMap.get(CMD_TYPE.AP40), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP40))
+                .append(CMDSPLIT).append(cmdindex)
+                .append(CMDSPLIT).append(success)
+                .append(CMDEND).toString());
+    }
+
+
+    /**
+     * 心率上传,返回协议字串
+     *
+     * @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());
+
+    }
+
+
+    /**
+     * 返回上传心率血压的协议字串
+     *
+     * @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 AP16(String cmdindex) {
+//IWAP16,080835#
+//080835:指令流水号
+        return genStringMessage(cmdMap.get(CMD_TYPE.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(cmdMap.get(CMD_TYPE.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(cmdMap.get(CMD_TYPE.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(cmdMap.get(CMD_TYPE.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.绑定解绑(下行协议号:BP68,响应:AP68)
+    public static StringMessage AP68(String index) {
+
+        //设备响应:      IWAP86, 080835#
+        //080835:指令流水号
+        return genStringMessage(cmdMap.get(CMD_TYPE.AP68), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP68))
+                .append(CMDSPLIT).append(index)
+                .append(CMDEND).toString());
+    }
+
+    public void handleBP68(String cmd, Connection connection, Runtime runtime) {
+
+        //示例:
+        //IWBP68,353456789012345,080835,1#
+        //说明:
+        //IW:标识符
+        //BP68 : 命令字符
+        //353456789012345:IMEI号,设备唯一ID
+        //080835 :指令流水号
+        //1 : 表示设备为激活状态(绑定成功) 0:表示设备为未激活状态(解绑成功)
+
+        String[] list = cmd.split(CMDSPLIT);
+
+        if (list.length == 4) {
+            String index = list[2];
+            String type = list[3];
+            connection.send(AP68(index));
+            ICLogger.i("收到服务器消息:" + (type.equals("1") ? "绑定成功 " : "未激活或者解绑"));
+
+        } else {
+            ICLogger.i("BP86 format error!");
+        }
+
+    }
+
+    //17.设置心率/血压测量周期(下行协议号:BP86,响应:AP86)
+    public static StringMessage AP86(String index) {
+
+        //设备响应:      IWAP86, 080835#
+        //080835:指令流水号
+        return genStringMessage(cmdMap.get(CMD_TYPE.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里面执行
+                CoreService.getInstance().setHeartRateDetectAlarm(Integer.parseInt(cycle));
+//                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!");
+        }
+
+    }
+
+    public static StringMessage AP88(String index) {
+        //设备响应:      IWAP88, 080835#
+        //080835:指令流水号
+        return genStringMessage(cmdMap.get(CMD_TYPE.AP88), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP88))
+                .append(CMDSPLIT).append(index)
+                .append(CMDEND).toString());
+    }
+
+    public static void handleBP88(String cmd, Connection connection) {
+//        IWBP88,080835#
+        String[] list = cmd.split(CMDSPLIT);
+
+        if (list.length == 2) {
+            String index = list[1];
+            connection.send(AP88(index));
+            ICLogger.i("收到服务器消息:查询设备");
+
+        } else {
+            ICLogger.i("BP88 format error!");
+        }
+    }
+
+    //18.18.设置心率/血压阀值(下行协议号:BP89,响应:AP89)
+    public static StringMessage AP89(String index) {
+
+        //设备响应:      IWAP89, 080835#
+        //080835:指令流水号
+        return genStringMessage(cmdMap.get(CMD_TYPE.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!");
+        }
+
+    }
+
+    //体温间隔测量 (后台测试体温)(下行协议号:BPTE,响应:APTE)
+    public static StringMessage APTE(String index, int freq) {
+
+        //设备响应:      IWAPTE,080835,60#
+        //080835:指令流水号
+        //1:表示设备接受数据成功,0表示设备接受数据失败
+        return genStringMessage(cmdMap.get(CMD_TYPE.APTE), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTE))
+                .append(CMDSPLIT).append(index)
+                .append(CMDSPLIT).append(freq)
+                .append(CMDEND).toString());
+    }
+
+    public void handleBPTE(String cmd, Connection connection, Runtime runtime) {
+
+        //示例:
+        //IWBPTE,353456789012345,080835,60#
+        //说明:
+        //IW:标识符
+        //BPTE : 命令字符
+        //353456789012345:IMEI号,设备唯一ID
+        //080835 :指令流水号
+        //60 : 上传间隔,单位分钟(60分钟上传一次体温,终端收到后立即开始测量一次并重置定时器)
+        String[] list = cmd.split(CMDSPLIT);
+        if (list.length == 4) {
+            try {
+                String index = list[2];
+                String freqstr = list[3];
+                int freq = Integer.parseInt(freqstr);
+                connection.send(APTE(index, freq));
+                ICLogger.i("收到服务器指令:测量体温 " + freq + "分钟一次。");
+                Config.setTemperatureTestCycle(runtime, freq * 60);
+                CoreService.getInstance().setTempAlarm(true);
+
+                if (runtime.check_stat_do_temp_test())
+                    TemperatureUtil.getInstance().doTempTestInThread(FROM_SERVER);
+            } catch (Exception e) {
+                ICLogger.e(e.getMessage(), e);
+            }
+//            double wrist_temp,body_temp;
+//            wrist_temp=TemperatureUtil.get_temp_value_adjusted();
+//            body_temp=TemperatureUtil.getBodyTemp(wrist_temp,26.0f);
+//            String temperatureMsg=APTP(wrist_temp,body_temp);
+//            connection.send(genStringMessage("APTP",temperatureMsg));
+//            ICLogger.i("发送体温测量值 "+temperatureMsg);
+        } else {
+            ICLogger.i("BP89 format error!");
+        }
+
+    }
+
+    //体温上行(上行协议号:APTP,响应:BPTP)
+    public static StringMessage APTP(double wrist_temp, double body_temp) {
+
+        //设备:    IWAPTP,36.3,33,132#
+        //IW:标识符
+        //APTP : 命令字符
+        //35.3:测量体温 (摄氏度)
+        //33,132:温补用的参数,此处不用,可以用0 来代替。
+        return genStringMessage(cmdMap.get(CMD_TYPE.APTP), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTP))
+                .append(CMDSPLIT).append(String.format("%1$.2f", wrist_temp))
+                .append(CMDSPLIT).append(String.format("%1$.2f", body_temp))
+                .append(CMDSPLIT).append(0)
+                .append(CMDEND).toString());
+    }
+
+    public void handleBPTP() {
+
+        ICLogger.d("BPTP 服务器收到体温数据!");
+
+    }
+
+
+    public static StringMessage APX1(String id) {
+        //设备响应:      IWAPX1, 080835#
+        //080835:指令流水号
+        return genStringMessage(cmdMap.get(CMD_TYPE.APX1), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APX1))
+                .append(CMDSPLIT).append(id)
+                .append(CMDEND).toString());
+    }
+
+    /**
+     * @param cmd
+     * @param connection
+     * @param runtime
+     */
+    public void handleBPX1(String cmd, Connection connection, Runtime runtime) {
+        //IWBPX1,353456789012345,080835,2,1,-3,0#
+        //说明:
+//        IW:标识符
+//        BPX1 : 命令字符
+//        353456789012345:IMEI号,设备唯一ID
+//        080835 :指令流水号
+//        2: 心率修正值
+//        1:高压修正值
+//                -3:低压修正值
+//        0:血氧修正值
+        String[] list = cmd.split(CMDSPLIT);
+        if (list.length == 7) {
+            String index = list[2];
+            String imei = list[1];
+            String strXL = list[3];
+            String strBPH = list[4];
+            String strBPL = list[5];
+            String strSpO2 = list[6];
+
+            connection.send(APX1(index));
+
+            try {
+                int ppg_adjust, bph_adjust, bpl_adjust, spo2_adjust;
+                ppg_adjust = Integer.parseInt(strXL);
+                bph_adjust = Integer.parseInt(strBPH);
+                bpl_adjust = Integer.parseInt(strBPL);
+                spo2_adjust = Integer.parseInt(strSpO2);
+
+                runtime.getHRS().setAdjust(ppg_adjust, bph_adjust, bpl_adjust, spo2_adjust);
+                Config.setPPGAdjust(mRuntime.getContextProxy().context, ppg_adjust);
+                Config.setBPHAdjust(mRuntime.getContextProxy().context, bph_adjust);
+                Config.setBPLAdjust(mRuntime.getContextProxy().context, bpl_adjust);
+                Config.setSPo2Adjust(mRuntime.getContextProxy().context, spo2_adjust);
+
+                ICLogger.i("Handle BPX1 IMEI " + imei + ",index " + index + ", BPH " + strBPH + ", BPL " + strBPL + ", PPG " + strXL + ", Sp02 " + strSpO2);
+            } catch (Exception e) {
+                ICLogger.e(e.getMessage(), e);
+            }
+        } else {
+            ICLogger.i("BPX1 format error!");
+        }
+    }
+
+
+    public static StringMessage APS4(String id) {
+        //设备响应:      IWAPS4,080835#
+        //080835:指令流水号
+        return genStringMessage(cmdMap.get(CMD_TYPE.APS4), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APS4))
+                .append(CMDSPLIT).append(id)
+                .append(CMDEND).toString());
+    }
+
+    /**
+     * 主要为久坐设置提醒时长。
+     *
+     * @param cmd
+     * @param connection
+     * @param runtime
+     */
+    public void handleBPS4(String cmd, Connection connection, Runtime runtime) {
+        //IWBPS4,353456789012345,080835,1|1234567|0900|1100|180, 2|1234567|0900|1100|180, 1|1234567|0900|1100|180#
+        //说明:
+//        IW:标识符
+//        BPS4: 命令字符
+//        353456789012345:设备IMEI或者ID
+//        080835 :指令流水号
+//        1|1234567|0900|1100|180:类型(1久坐,2喝水)|重复周期|开始时间|结束时间|时间间隔(单位秒)
+//        重复周期、开始结束时间格式 参考BP85闹钟设置,
+//#:结尾标识符
+        String[] list = cmd.split(CMDSPLIT);
+        if (list.length >= 4) {
+
+            String index = list[2];
+            String imei = list[1];
+            connection.send(APS4(index));
+
+            String setting1;
+            switch (list.length) {
+                case 10:
+                    setting1 = list[9];
+                    ICLogger.i("set 7th alarm " + setting1);
+                case 9:
+                    setting1 = list[8];
+                    ICLogger.i("set 6th alarm " + setting1);
+                case 8:
+                    setting1 = list[7];
+                    ICLogger.i("set 5th alarm " + setting1);
+                case 7:
+                    setting1 = list[6];
+                    ICLogger.i("set 4th alarm " + setting1);
+                case 6:
+                    setting1 = list[5];
+                    ICLogger.i("set 3rd alarm " + setting1);
+                case 5:
+                    setting1 = list[4];
+                    ICLogger.i("set 2nt alarm " + setting1);
+                case 4:
+                    setting1 = list[3];
+                    ICLogger.i("set 1st alarm " + setting1);
+                    break;
+            }
+
+            ICLogger.i("Handle BPX1 IMEI " + imei + ",index " + index + ", get " + (list.length - 3) + " settings");
+        } else {
+            ICLogger.i("BPX1 format error!");
+        }
+    }
+
+    public static StringMessage APHP(Runtime ds) {
+        //IWAPHP,60,130,85,95,90, , , , , , , , #
+        //IW:标识符
+        //APHT : 命令字符
+        //60 : 表示心率
+        //130: 血压高压 [收缩压]
+        //85 : 血压低压 [舒张压]
+        //95:血氧
+        //90:血糖
+//        本消息适用所有终端,其中需要每项指标不一定全部有值,如果无值,则留空
+        return genStringMessage(cmdMap.get(CMD_TYPE.APHP), new StringBuffer(CMDHEADER).append(cmdMap.get(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(CMD_TYPE.APHP), new StringBuffer(CMDHEADER).append(cmdMap.get(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 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 BP40:
+                //服务器推送文本
+                handleBP40(mConnection, mRuntime, cmd);
+                ICLogger.i("收到服务器推送文本消息");
+                mConnection.DeliverCMDMessageToSystem("showTxt", cmd);//通知下面线程状态变化
+                break;
+
+            case BPXL:
+                handleBPXL(cmd, mConnection);
+                ICLogger.i("收到服务器心率检测命令");
+                if (mRuntime.check_stat_do_ppg_test())
+                    HeartRateManager.getInstance().triggerPPGTest(FROM_SERVER);
+                break;
+            case BPXY:
+                handleBPXY(cmd, mConnection);
+                ICLogger.i("收到服务器血压检测命令");
+                if (mRuntime.check_stat_do_ppg_test())
+                    HeartRateManager.getInstance().triggerPPGTest(FROM_SERVER);
+                break;
+            case BPJZ:
+                handleBPJZ(cmd, mConnection, mRuntime);
+                ICLogger.i("收到服务器血压校准命令");
+                break;
+            case BPHT:
+                ICLogger.i("服务器收到上传的心率血压");
+                mConnection.DeliverCMDMessageToSystem("APHT", cmd);//通知下面线程状态变化
+                break;
+            case BP84:
+                handleBP84(cmd, mConnection);
+                ICLogger.i("收到服务器白名单命令");
+                break;
+
+            case BP86:
+                //绑定解绑消息
+                handleBP86(cmd, mConnection, mRuntime);
+                mConnection.DeliverCMDMessageToSystem("AP86", cmd);//通知下面线程状态变化
+
+                break;
+
+            case BP88:
+                //收到查找设备消息
+                handleBP88(cmd, mConnection);
+                mConnection.DeliverCMDMessageToSystem("findDev", cmd);//通知下面线程状态变化
+                break;
+            case BP89:
+                //心率/血压阀值
+                handleBP89(cmd, mConnection);
+                mConnection.DeliverCMDMessageToSystem("AP89", cmd);//通知下面线程状态变化
+                break;
+
+            case BPTE: //设置测试体温
+                handleBPTE(cmd, mConnection, mRuntime);
+                mConnection.DeliverCMDMessageToSystem("APTE", cmd);//通知下面线程状态变化
+                break;
+
+            case BPTP:
+                handleBPTP();
+                mConnection.DeliverCMDMessageToSystem("APTP", cmd);//通知下面线程状态变化
+                break;
+            case BPHP:
+                handleBPHP();
+                mConnection.DeliverCMDMessageToSystem("APHP", cmd);//通知下面线程状态变化
+                break;
+            case BPX1://设置 心率血压血氧修正值
+                handleBPX1(cmd, mConnection, mRuntime);
+                ICLogger.i("收到服务器设置 心率血压血氧修正值BPX1");
+                mConnection.DeliverCMDMessageToSystem("APX1", cmd);//通知下面线程状态变化
+                break;
+
+            case BPS4: //提醒设置(时间段) 主要为久坐设置提醒时长。
+                handleBPS4(cmd, mConnection, mRuntime);
+                ICLogger.i("收到 提醒设置(时间段)");
+                mConnection.DeliverCMDMessageToSystem("APS4", 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 a8e89c9..03327f9 100644 (file)
@@ -1707,11 +1707,12 @@ public class protocol_ic {
 
             try {
                 //发送重置PPGCycle的广播,会在CoreServer里面执行
-                Intent intent = new Intent();
-                intent.putExtra("PPGTestCycle", Integer.parseInt(cycle));
-                intent.setFlags(FLAG_INCLUDE_STOPPED_PACKAGES);
-                intent.setFlags(FLAG_ACTIVITY_NEW_TASK);
-                runtime.getContextProxy().sendBrodcast(ACTION_HEATR_RATE_START, intent);
+                CoreService.getInstance().setHeartRateDetectAlarm(Integer.parseInt(cycle));
+//                Intent intent = new Intent();
+//                intent.putExtra("PPGTestCycle", Integer.parseInt(cycle));
+//                intent.setFlags(FLAG_INCLUDE_STOPPED_PACKAGES);
+//                intent.setFlags(FLAG_ACTIVITY_NEW_TASK);
+//                runtime.getContextProxy().sendBrodcast(ACTION_HEATR_RATE_START, intent);
             } catch (Exception e) {
                 ICLogger.e(e.getMessage(), e);
             }
index ad82be4..0599eed 100644 (file)
@@ -1566,9 +1566,10 @@ public class protocol_jiai {
                 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);
+                CoreService.getInstance().setHeartRateDetectAlarm(Integer.parseInt(cycle));
+//                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);
             }
index 182c7d6..105ce0b 100644 (file)
@@ -614,11 +614,11 @@ public class protocol_mqtt {
                 try {
                     int cycle_int = Integer.parseInt(cycle.trim());
                     ICLogger.i("收到服务器指令:设置心率血压周期 " + cycle + "秒" + cycle_int / 60 + "分钟");
-
+                    CoreService.getInstance().setHeartRateDetectAlarm(cycle_int/60);
                     //发送重置PPGCycle的广播,会在CoreServer里面执行
-                    Intent intent = new Intent();
-                    intent.putExtra("PPGTestCycle", cycle_int / 60);
-                    runtime.getContextProxy().sendBrodcast(ACTION_HEATR_RATE_START, intent);
+//                    Intent intent = new Intent();
+//                    intent.putExtra("PPGTestCycle", cycle_int / 60);
+//                    runtime.getContextProxy().sendBrodcast(ACTION_HEATR_RATE_START, intent);
                 } catch (Exception e) {
                     ICLogger.e(e.getMessage(), e);
                 }