添加protocol_mqtt.java 协议解析库,暂时为fzd的复本。
authorsnickersun <scy@incartech.cn>
Tue, 18 Aug 2020 15:56:29 +0000 (23:56 +0800)
committersnickersun <scy@incartech.cn>
Tue, 18 Aug 2020 15:56:29 +0000 (23:56 +0800)
app/src/main/java/com/enqualcomm/support/Config.java
app/src/main/java/com/ic/protocols/protocolAPIHelper.java
app/src/main/java/com/ic/protocols/protocol_mqtt.java [new file with mode: 0644]

index 5a32f7e..7752df8 100644 (file)
@@ -479,6 +479,7 @@ public class Config {
   public static final int PROTOCOL_BEEHOME=1;\r
   public static final int PROTOCOL_IC=2;\r
   public static final int PROTOCOL_FZD=3;\r
+  public static final int PROTOCOL_MQTT=4;\r
 \r
   public static int protocol_no=getProtocolNumber();\r
   public static int getProtocolNumber(){\r
@@ -499,13 +500,15 @@ public class Config {
         case PROTOCOL_FZD:\r
           ICLogger.i("协议 FZD");\r
           break;\r
-\r
+        case PROTOCOL_MQTT:\r
+          ICLogger.i("协议 MQTT");\r
+          break;\r
         default:\r
-          ICLogger.i("协议版本 目前支持0,1,2,3 。");\r
+          ICLogger.i("协议版本 目前支持0,1,2,3,4 。");\r
           break;\r
       }\r
     }else{\r
-      ICLogger.i("协议版本要是数字,目前支持0,1,2 。");\r
+      ICLogger.i("协议版本要是数字,目前支持0,1,2,3,4 。");\r
     }\r
     protocol_no=ret;\r
     return ret;\r
index 14ad187..5d0c6e2 100644 (file)
@@ -14,6 +14,7 @@ public class protocolAPIHelper {
     private static protocol_beehome protocolbeehome_handler=null;\r
     private static protocol_ic protocolic_handler=null;\r
     private static protocol_fzd protocolfzd_handler=null;\r
+    private static protocol_mqtt protocolmqtt_handler=null;\r
 \r
     public protocolAPIHelper(NettyConnection connect,Runtime runtime) {\r
         ICLogger.i("init Protocol "+Config.getProtocolNumber());\r
@@ -25,6 +26,8 @@ public class protocolAPIHelper {
             protocolic_handler=new protocol_ic(connect,runtime);\r
         if (protocolfzd_handler==null)\r
             protocolfzd_handler=new protocol_fzd(connect,runtime);\r
+        if (protocolmqtt_handler==null)\r
+            protocolmqtt_handler=new protocol_mqtt(connect,runtime);\r
     }\r
 \r
     private static boolean is_protocol_not_Initialled(){\r
@@ -53,6 +56,9 @@ public class protocolAPIHelper {
             case Config.PROTOCOL_FZD:\r
                 protocolfzd_handler.parserCmd(bytes);\r
                 break;\r
+            case Config.PROTOCOL_MQTT:\r
+                protocolmqtt_handler.parserCmd(bytes);\r
+                break;\r
         }\r
         return true;\r
     }\r
@@ -80,6 +86,9 @@ public class protocolAPIHelper {
             case Config.PROTOCOL_FZD:\r
                 ret=protocol_fzd.isCmdStr(msg);\r
                 break;\r
+            case Config.PROTOCOL_MQTT:\r
+                ret=protocol_mqtt.isCmdStr(msg);\r
+                break;\r
         }\r
         return ret;\r
     }\r
@@ -101,6 +110,9 @@ public class protocolAPIHelper {
             case Config.PROTOCOL_FZD:\r
                 ret=protocol_fzd.PING();\r
                 break;\r
+            case Config.PROTOCOL_MQTT:\r
+                ret=protocol_mqtt.PING();\r
+                break;\r
         }\r
         return ret;\r
     }\r
@@ -122,6 +134,9 @@ public class protocolAPIHelper {
             case Config.PROTOCOL_FZD:\r
                 ret=protocol_fzd.temp(body_temp);\r
                 break;\r
+            case Config.PROTOCOL_MQTT:\r
+                ret=protocol_mqtt.temp(body_temp);\r
+                break;\r
         }\r
         return ret;\r
     }\r
@@ -142,6 +157,9 @@ public class protocolAPIHelper {
             case Config.PROTOCOL_FZD:\r
                 ret="";\r
                 break;\r
+            case Config.PROTOCOL_MQTT:\r
+                ret="";\r
+                break;\r
         }\r
         return ret;\r
     }\r
@@ -163,6 +181,9 @@ public class protocolAPIHelper {
             case Config.PROTOCOL_FZD:\r
                 ret=protocol_fzd.LK();\r
                 break;\r
+            case Config.PROTOCOL_MQTT:\r
+                ret=protocol_mqtt.LK();\r
+                break;\r
         }\r
         return ret;\r
     }\r
@@ -184,6 +205,9 @@ public class protocolAPIHelper {
             case Config.PROTOCOL_FZD:\r
                 ret=protocol_fzd.KA(runtime);\r
                 break;\r
+            case Config.PROTOCOL_MQTT:\r
+                ret=protocol_mqtt.KA(runtime);\r
+                break;\r
         }\r
         return ret;\r
     }\r
@@ -205,6 +229,9 @@ public class protocolAPIHelper {
             case Config.PROTOCOL_FZD:\r
                 ret=protocol_fzd.UD(runtime);\r
                 break;\r
+            case Config.PROTOCOL_MQTT:\r
+                ret=protocol_mqtt.UD(runtime);\r
+                break;\r
         }\r
         return ret;\r
     }\r
@@ -225,6 +252,9 @@ public class protocolAPIHelper {
             case Config.PROTOCOL_FZD:\r
                 ret=protocol_fzd.UD(runtime);\r
                 break;\r
+            case Config.PROTOCOL_MQTT:\r
+                ret=protocol_mqtt.UD(runtime);\r
+                break;\r
         }\r
         return ret;\r
     }\r
@@ -246,6 +276,9 @@ public class protocolAPIHelper {
             case Config.PROTOCOL_FZD:\r
                 ret=null;//protocol_fzd.AP07(packetTime,count,index,datalen,amrdata);\r
                 break;\r
+            case Config.PROTOCOL_MQTT:\r
+                ret=null;//protocol_fzd.AP07(packetTime,count,index,datalen,amrdata);\r
+                break;\r
         }\r
         return ret;\r
     }\r
@@ -266,6 +299,9 @@ public class protocolAPIHelper {
             case Config.PROTOCOL_FZD:\r
                 ret="";\r
                 break;\r
+            case Config.PROTOCOL_MQTT:\r
+                ret="";\r
+                break;\r
         }\r
         return ret;\r
     }\r
@@ -286,6 +322,9 @@ public class protocolAPIHelper {
             case Config.PROTOCOL_FZD:\r
                 ret="";\r
                 break;\r
+            case Config.PROTOCOL_MQTT:\r
+                ret="";\r
+                break;\r
         }\r
         return ret;\r
     }\r
@@ -307,6 +346,9 @@ public class protocolAPIHelper {
             case Config.PROTOCOL_FZD:\r
                 ret=protocol_fzd.blood(pbl,pbh);\r
                 break;\r
+            case Config.PROTOCOL_MQTT:\r
+                ret=protocol_mqtt.blood(pbl,pbh);\r
+                break;\r
         }\r
         return ret;\r
     }\r
@@ -328,6 +370,9 @@ public class protocolAPIHelper {
             case Config.PROTOCOL_FZD:\r
                 ret=protocol_fzd.oxygen(ox);\r
                 break;\r
+            case Config.PROTOCOL_MQTT:\r
+                ret=protocol_mqtt.oxygen(ox);\r
+                break;\r
         }\r
         return ret;\r
     }\r
@@ -348,6 +393,9 @@ public class protocolAPIHelper {
             case Config.PROTOCOL_FZD:\r
                 ret=protocol_fzd.heart(ppg);\r
                 break;\r
+            case Config.PROTOCOL_MQTT:\r
+                ret=protocol_mqtt.heart(ppg);\r
+                break;\r
         }\r
         return ret;\r
     }\r
@@ -369,6 +417,9 @@ public class protocolAPIHelper {
             case Config.PROTOCOL_FZD:\r
                 ret="";\r
                 break;\r
+            case Config.PROTOCOL_MQTT:\r
+                ret="";\r
+                break;\r
         }\r
         return ret;\r
     }\r
@@ -391,6 +442,9 @@ public class protocolAPIHelper {
             case Config.PROTOCOL_FZD:\r
                 ret=protocol_fzd.defaultServerIP;\r
                 break;\r
+            case Config.PROTOCOL_MQTT:\r
+                ret=protocol_mqtt.defaultServerIP;\r
+                break;\r
         }\r
         return ret;\r
     }\r
@@ -411,6 +465,9 @@ public class protocolAPIHelper {
             case Config.PROTOCOL_FZD:\r
                 ret=protocol_fzd.defaultServerPort;\r
                 break;\r
+            case Config.PROTOCOL_MQTT:\r
+                ret=protocol_mqtt.defaultServerPort;\r
+                break;\r
         }\r
         return ret;\r
     }\r
@@ -431,6 +488,9 @@ public class protocolAPIHelper {
             case Config.PROTOCOL_FZD:\r
                 ret="";\r
                 break;\r
+            case Config.PROTOCOL_MQTT:\r
+                ret="";\r
+                break;\r
         }\r
         return ret;\r
     }\r
diff --git a/app/src/main/java/com/ic/protocols/protocol_mqtt.java b/app/src/main/java/com/ic/protocols/protocol_mqtt.java
new file mode 100644 (file)
index 0000000..6175da4
--- /dev/null
@@ -0,0 +1,851 @@
+package com.ic.protocols;\r
+\r
+import android.content.ComponentName;\r
+import android.content.Intent;\r
+\r
+import com.enqualcomm.support.Config;\r
+import com.enqualcomm.support.CoreService;\r
+import com.enqualcomm.support.bean.Contact;\r
+import com.enqualcomm.support.bean.Runtime;\r
+import com.enqualcomm.support.bean.StringMessage;\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.MD5;\r
+import com.enqualcomm.support.utils.NettyConnection;\r
+import com.enqualcomm.support.utils.TemperatureUtil;\r
+import com.enqualcomm.support.utils.TimeUtil;\r
+import com.enqualcomm.support.utils.Util;\r
+import com.enqualcomm.support.utils.regexUtil;\r
+\r
+import java.util.ArrayList;\r
+import java.util.HashMap;\r
+\r
+import static com.enqualcomm.support.LocationClient.LOCATION_MODE;\r
+import static java.lang.Math.abs;\r
+\r
+//import android.content.IClipboard;\r
+//import com.android.internal.telephony.uicc.RuimFileHandler;\r
+\r
+public class protocol_mqtt {\r
+    private static final String TAG = "ICSrv." + protocol_mqtt.class.getSimpleName();\r
+    private static final String PrivKEY = "XMQcHi0lGIdru6xzW7lygBwBT8N0c09P";\r
+    private static final String CMDHEADER = "[";\r
+    private static final String CMDCOMPANY="IC";\r
+    private static final String CMDEND = "]";\r
+    private static final String CMDHEADERSPLIT = "*";\r
+    private static final String CMDSPLIT = ",";\r
+\r
+    public static final String defaultServerIP="api.xcloudtech.com";\r
+    public static final int defaultServerPort=9000;\r
+\r
+    public enum CMD_TYPE {\r
+        /*终端发起*/\r
+        //链路保持数据\r
+        LK,//登录\r
+        PING,//绑定查询\r
+        KA,//心跳包\r
+        UD,//位置上传\r
+        UD2,//盲点位置上传\r
+        AL,//报警数据上传\r
+        Time,//获取服务器时间\r
+        WT,//获取天气\r
+        img,//上传图片\r
+        VOICE,//上传语音\r
+        WG,//请求位置信息\r
+        DLT,//解绑\r
+        temp,//体温上传\r
+        /* 服务器发起*/\r
+        UPLOAD,//数据上传间隔设置\r
+        CENTER,//中心号码设置\r
+        CALL, //拨打电话\r
+        MONITOR,//监听\r
+        SOS,//SOS 号码设置\r
+        FACTORY,//恢复出厂设置\r
+        SOSSMS,//SOS 短信报警开关\r
+        LOWBAT,//低电短信报警开关\r
+        VERNO,//版本查询\r
+        CR,//定位指令\r
+        POWEROFF,//关机指令\r
+        REMOVE,//取下手环报警开关\r
+        REMOVESMS,//取下手表短信报警开关\r
+        PEDO,//计步功能开关\r
+        SILENCETIME,//免打扰时间段设置\r
+        SILENCETIME2, //免打扰时间段设置\r
+        SLEEPTIME,//翻转检测时间段设置\r
+        FIND,//找手表指令\r
+        REMIND,//闹钟设置指令\r
+        TK,//对讲功能(微聊发送语音)\r
+        PHL,//设置电话本+白名单(最多 50 条)\r
+        wdstart,//远程测温\r
+        bldstart,//远程测血压\r
+        hrtstart,//远程测量心率\r
+        BOOTOFF,//定时关机\r
+        oxygen,//血氧上传\r
+        blood,//血压上传\r
+        heart,//心率上传\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.LK, "LK");\r
+        cmdMap.put(CMD_TYPE.PING, "PING");\r
+        cmdMap.put(CMD_TYPE.KA, "KA");\r
+        cmdMap.put(CMD_TYPE.UD, "UD");\r
+        cmdMap.put(CMD_TYPE.UD2, "UD2");\r
+        cmdMap.put(CMD_TYPE.AL, "AL");\r
+        cmdMap.put(CMD_TYPE.Time, "Time");\r
+        cmdMap.put(CMD_TYPE.WT, "WT");\r
+        cmdMap.put(CMD_TYPE.img, "img");\r
+        cmdMap.put(CMD_TYPE.VOICE, "VOICE");\r
+        cmdMap.put(CMD_TYPE.WG, "WG");\r
+        cmdMap.put(CMD_TYPE.DLT, "DLT");\r
+        cmdMap.put(CMD_TYPE.temp, "temp");\r
+        cmdMap.put(CMD_TYPE.UPLOAD, "UPLOAD");\r
+        cmdMap.put(CMD_TYPE.CENTER, "CENTER");\r
+        cmdMap.put(CMD_TYPE.CALL, "CALL");\r
+        cmdMap.put(CMD_TYPE.MONITOR, "MONITOR");\r
+        cmdMap.put(CMD_TYPE.SOS, "SOS");\r
+        cmdMap.put(CMD_TYPE.FACTORY, "FACTORY");\r
+        cmdMap.put(CMD_TYPE.SOSSMS, "SOSSMS");\r
+        cmdMap.put(CMD_TYPE.LOWBAT, "LOWBAT");\r
+        cmdMap.put(CMD_TYPE.VERNO, "VERNO");\r
+        cmdMap.put(CMD_TYPE.CR, "CR");\r
+        cmdMap.put(CMD_TYPE.POWEROFF, "POWEROFF");\r
+        cmdMap.put(CMD_TYPE.REMOVE, "REMOVE");\r
+        cmdMap.put(CMD_TYPE.REMOVESMS, "REMOVESMS");\r
+        cmdMap.put(CMD_TYPE.PEDO, "PEDO");\r
+        cmdMap.put(CMD_TYPE.SILENCETIME, "SILENCETIME");\r
+        cmdMap.put(CMD_TYPE.SILENCETIME2, "SILENCETIME2");\r
+        cmdMap.put(CMD_TYPE.SLEEPTIME, "SLEEPTIME");\r
+        cmdMap.put(CMD_TYPE.FIND, "FIND");\r
+        cmdMap.put(CMD_TYPE.REMIND, "REMIND");\r
+        cmdMap.put(CMD_TYPE.TK, "TK");\r
+        cmdMap.put(CMD_TYPE.PHL, "PHL");\r
+        cmdMap.put(CMD_TYPE.wdstart, "wdstart");\r
+        cmdMap.put(CMD_TYPE.bldstart, "bldstart");\r
+        cmdMap.put(CMD_TYPE.hrtstart, "hrtstart");\r
+        cmdMap.put(CMD_TYPE.BOOTOFF, "BOOTOFF");\r
+        cmdMap.put(CMD_TYPE.oxygen, "oxygen");\r
+        cmdMap.put(CMD_TYPE.blood, "blood");\r
+        cmdMap.put(CMD_TYPE.heart, "heart");\r
+    }\r
+\r
+    private NettyConnection mConnection=null;\r
+    private Runtime mRuntime=null;\r
+\r
+    public protocol_mqtt(NettyConnection connect, Runtime runtime) {\r
+        mConnection=connect;\r
+        mRuntime=runtime;\r
+\r
+    }\r
+\r
+    private StringBuffer cmdbuf = new StringBuffer();\r
+\r
+//    /*\r
+//    输入的字符串,如果有完整命令,返回 true\r
+//    否则返回 false\r
+//     */\r
+//    public boolean isCmdStr(String msg) {\r
+//        /***\r
+//         * IC*334588000000156*LEN*FALLDOWN\r
+//         */\r
+//        String cmd;\r
+//        int index=msg.indexOf(CMDSPLIT);\r
+//        if (index > 0){\r
+//            cmd = msg.substring(0,index);\r
+//        }else{\r
+//            cmd = msg;\r
+//        }\r
+//        if (regexUtil.isFZDCMD(cmd) ) {\r
+//            return true;\r
+//        }\r
+//        return false;\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
+        return sm;\r
+    }\r
+\r
+    /*\r
+    输入的字符串,如果有完整命令,返回 命令名\r
+    否则返回 空字符串\r
+     */\r
+    public static String isCmdStr(String msg) {\r
+        String cmd_msgbuf=msg;\r
+        int  cmdindex =cmd_msgbuf.indexOf(CMDCOMPANY+CMDHEADERSPLIT);\r
+        if (cmdindex>0) { //如果开头不是CMDHEADER但是包含CMDHEADER则删除前面的数据\r
+            String cmd=cmd_msgbuf.substring(cmdindex);\r
+            cmd_msgbuf=cmd;\r
+        }\r
+        cmdindex=cmd_msgbuf.indexOf(CMDEND);\r
+        if(cmdindex>0){\r
+            String cmd=cmd_msgbuf.substring(0,cmdindex);\r
+            cmd_msgbuf=cmd;\r
+        }\r
+        cmdindex=cmd_msgbuf.indexOf(CMDSPLIT);\r
+        if(cmdindex>0){\r
+            String cmd=cmd_msgbuf.substring(0,cmdindex);\r
+            cmd_msgbuf=cmd;\r
+        }\r
+\r
+        if (regexUtil.isFZDCMD(cmd_msgbuf)) {\r
+            for (CMD_TYPE key : cmdMap.keySet()) {\r
+                if (regexUtil.isFZDCMD(cmdMap.get(key), cmd_msgbuf)) { //如果是FZD命令,则进行处理,否则保留数据动\r
+                    ICLogger.i("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key));\r
+                    return cmdMap.get(key);\r
+                }\r
+            }\r
+            return "";\r
+        }else\r
+            return "";\r
+    }\r
+    /*\r
+    返回true 表示 cmd 全部解析成功\r
+    返回false表示 cmd至少有一条解析失败,失败的数据归入buffer,下一次识别接着使用\r
+    字符串通过#号进行识别。\r
+    每个字符串如果发现 #,却又没有Header,“IW”则会被丢弃\r
+     */\r
+    public boolean parserCmd(byte[] bytes) {\r
+        String cmd_msgbuf=new String(bytes);\r
+        log("bytes.size "+bytes.length);\r
+        cmdbuf.append(cmd_msgbuf);\r
+        log("cmdbuf.size "+cmdbuf.length() +" "+cmdbuf.toString());\r
+        int  cmdindex =cmd_msgbuf.indexOf(CMDCOMPANY+CMDHEADERSPLIT);\r
+        if (cmdindex>0) { //如果开头不是CMDHEADER但是包含CMDHEADER则删除前面的数据\r
+            String cmd=cmd_msgbuf.substring(cmdindex);\r
+            cmd_msgbuf=cmd;\r
+        }\r
+        cmdindex=cmd_msgbuf.indexOf(CMDEND);\r
+        if(cmdindex>0){\r
+            String cmd=cmd_msgbuf.substring(0,cmdindex);\r
+            cmd_msgbuf=cmd;\r
+        }\r
+        cmdindex=cmd_msgbuf.indexOf(CMDSPLIT);\r
+        if(cmdindex>0){\r
+            String cmd=cmd_msgbuf.substring(0,cmdindex);\r
+            cmd_msgbuf=cmd;\r
+        }\r
+        if (cmdbuf.toString().split(CMDCOMPANY+CMDHEADERSPLIT).length>1)\r
+        {\r
+            ICLogger.i("More than 1 cmd in buffer ! just log it");\r
+        }\r
+            for (CMD_TYPE key : cmdMap.keySet()) {\r
+               // ICLogger.i("key "+cmdMap.get(key)+" cmdbuf "+cmd_msgbuf);\r
+                if (regexUtil.isFZDCMD(cmdMap.get(key),cmd_msgbuf)) { //如果是FZD命令,则进行处理,否则保留数据动\r
+                    String data=cmdbuf.toString().replace(CMDHEADER,"").replace(cmd_msgbuf,"").replace(CMDEND,"");\r
+//                    ICLogger.i("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key) + " ,  " + cmdbuf.toString() + "  "+cmd_msgbuf  + " data "+data );\r
+//                    if (key == CMD_TYPE.TK) {\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
+                        if (data.startsWith(CMDSPLIT)) data=data.substring(1);\r
+                        handleCmd(key, cmd_msgbuf,data);\r
+                        cmdbuf.delete(0,cmdbuf.length());//处理后清空\r
+//                    }\r
+                }\r
+            }\r
+        return true;\r
+    }\r
+\r
+    private static String getHexLen(int len){\r
+        StringBuilder sb=new StringBuilder();\r
+        int v = len & 0xFFFF;\r
+        String hv = Integer.toHexString(v);\r
+        if (hv.length() ==1 ) {\r
+            sb.append(0).append(0).append(0);\r
+        }else if (hv.length()==2){\r
+            sb.append(0).append(0);\r
+        }else if (hv.length()==3){\r
+            sb.append(0);\r
+        }\r
+        sb.append(hv);\r
+        return sb.toString();\r
+    }\r
+    private static String genHeader(int len,String cmd){\r
+\r
+        if (CoreService.getInstance()==null)\r
+            return "";\r
+\r
+        String imei =CoreService.getInstance().getRuntime().IMEI();\r
+        return new StringBuilder().append(CMDCOMPANY).append(CMDHEADERSPLIT)\r
+                .append(imei).append(CMDHEADERSPLIT)\r
+                .append(getHexLen(len)).append(CMDHEADERSPLIT).append(cmd).toString();\r
+    }\r
+\r
+    private static String keyheader(String cmd,int len){\r
+        String header=genHeader(len,cmd);\r
+        String key= MD5.getCMDStringMD5(header+PrivKEY);\r
+        return key;\r
+    }\r
+\r
+    public static String genFZDCMD( String CMD){\r
+        StringBuilder sb=new StringBuilder();\r
+        int len=CMD.length();\r
+        String header=genHeader(len,CMD);\r
+        String keyheader=keyheader(CMD,len);\r
+        sb.append(CMDHEADER).append(keyheader).append(header).append(CMDEND);\r
+        return sb.toString();\r
+    }\r
+    public static String genFZDCMD( String CMD,String data){\r
+        StringBuilder sb=new StringBuilder();\r
+        String data_buf=CMD+CMDSPLIT+data;\r
+        int data_buf_len=data_buf.length();\r
+        String header=genHeader(data_buf_len,CMD);\r
+        String keyheader=keyheader(CMD,data_buf_len);//计算header md5值\r
+        sb.append(CMDHEADER).append(keyheader).append(header).append(CMDSPLIT).append(data).append(CMDEND);\r
+        return sb.toString();\r
+    }\r
+    /*登录*/\r
+    public static String LK() {\r
+        /*IC*YYYYYYYYYYYYYYY*LEN*LK*/\r
+        return genFZDCMD(cmdMap.get(CMD_TYPE.LK));\r
+    }\r
+\r
+    /**\r
+     * 绑定\r
+     * */\r
+    public static String PING(){\r
+//        IC*YYYYYYYYYYYYYYY*LEN*PING\r
+        return genFZDCMD(cmdMap.get(CMD_TYPE.PING));\r
+    }\r
+\r
+\r
+    public static void handlePing(Runtime runtime,String data){\r
+//        [IC*YYYYYYYYYYYYYYY*LEN*PING,是否绑定(0 表示未绑定,1 表示绑定)]\r
+//        实例:[IC*334588000000156*0006*PING,0]或[IC*334588000000156*0006*PING,1]\r
+        int bind=Integer.parseInt(data);\r
+        if (bind==0){\r
+            ICLogger.i("设备未绑定!");\r
+            runtime.BindingStatus=false;\r
+        }else{\r
+            ICLogger.i("设备已绑定!");\r
+            runtime.BindingStatus=true;\r
+        }\r
+\r
+    }\r
+\r
+    public static String KA(Runtime runtime){\r
+//[IC*YYYYYYYYYYYYYYY*LEN*KA,日期,步数,翻滚次数,电量百分数] 实例:[IC*334588000000156*0014*KA,120414,50,100,100]\r
+        StringBuilder sb=new StringBuilder();\r
+        String cmd=cmdMap.get(CMD_TYPE.KA);\r
+        sb.append(TimeUtil.getSystemDateYYMMDD()).append(CMDSPLIT)\r
+        .append(runtime.getTotalStepCount()).append(CMDSPLIT)\r
+        .append(runtime.getRolltimes()).append(CMDSPLIT)\r
+        .append(runtime.getBattery());\r
+        return genFZDCMD(cmd,sb.toString());\r
+    }\r
+\r
+\r
+    public void handleKA(Runtime runtime,String data){\r
+\r
+    }\r
+\r
+    /*LBS+GPS混合定位*/\r
+    public static String UD(Runtime runtime) {\r
+        /***\r
+         * [IC*334588000000156*00CD*UD,180916,025723,A,22.570733,N,113.8626083,E,0.00,249.5,0.0,6,100, 60,0,0,00000010,7,255,460,1,9529,21809,158,9529,63555,133,9529,63554,129,9529,21405,126,95\r
+         * 29,21242,124,9529,21151,120,9529,63556,119,0]\r
+         * 说明:\r
+         * 数据内容:\r
+         * UD,命令号\r
+         * 180916,日期(年月日)(0 时区),表示 0 时区的二零一八年九月十六号\r
+         *\r
+         * 025723,时间(时分秒)(0 时区),表示 0 时区的两点五十七分二十三秒A,gps 定位有效\r
+         * 22.570733,纬度\r
+         * N,纬度表示113.8626083,经度\r
+         * E,经度表示0.00,速度\r
+         * 249.5,方向\r
+         * 0.0,海拔\r
+         * 6,卫星个数\r
+         *\r
+         * 100,gsm 信号强度\r
+         * 60,电量\r
+         * 0,计步数\r
+         * 0,翻转次数\r
+         * 00000010,终端状态,数据为 16 进制,解析成二进制为 0000 0000 0000 0000 0000 0000 0001 0000\r
+         * 前面 4 个字节表示状态,后面 4 个字节表示报警,数据中第 4 位为 1,对照文档最后的数据解析,表示手表静止状态。详细可参看文档最后部分。\r
+         * 7,基站个数\r
+         * 255,460,1,9529,21809,158,9529,63555,133,9529,63554,129,9529,21405,126,9529,21242,124,9529,\r
+         * 21151,120,9529,63556,119,基站信息\r
+         * 0,WiFi 个数\r
+         *\r
+         */\r
+\r
+\r
+        StringBuilder sb=new StringBuilder();\r
+        String cmd=cmdMap.get(CMD_TYPE.UD);\r
+        sb.append(TimeUtil.getSystemDateYYMMDD()).append(CMDSPLIT)\r
+                .append(TimeUtil.getSystemTimeHHmmss()).append(CMDSPLIT)\r
+                .append(runtime.getFZDGPSData()).append(CMDSPLIT)\r
+                .append(String.format("%03d",abs(runtime.getSignalStrength()))).append(CMDSPLIT)\r
+                .append(runtime.getBattery()).append(CMDSPLIT)\r
+                .append(runtime.getTotalStepCount()).append(CMDSPLIT)\r
+                .append(runtime.getRolltimes()).append(CMDSPLIT)\r
+                .append(runtime.getFZDDevStatus()).append(CMDSPLIT)\r
+                .append(runtime.getFZDLBSMultiStationData()).append(CMDSPLIT)\r
+                .append(runtime.getFZDWifiData());\r
+\r
+        return genFZDCMD(cmd,sb.toString());\r
+    }\r
+\r
+\r
+    /*LBS+WiFi混合定位*/\r
+    public static String UD2(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 new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.LK)).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 handleUD2(String cmd){\r
+        log("BP02定位接收成功");\r
+    }\r
+\r
+\r
+    public static String UPLOAD(){\r
+\r
+        return  genFZDCMD(cmdMap.get(CMD_TYPE.UPLOAD));\r
+    }\r
+\r
+    public void handleUPLOAD(Connection connection,Runtime runtime,String cmd,String data){\r
+            connection.send(genStringMessage("UPLOAD",UPLOAD()));\r
+            int timesecond=Integer.parseInt(data);\r
+            int mod=runtime.getLocationInstance().getWorkingMod();\r
+        log("LOCATION_MODE  "+LOCATION_MODE+" mod "+ mod);\r
+        Config.setLocationMode(runtime.getContextProxy().context,mod);\r
+        Config.setLocationCycle(runtime.getContextProxy().context,timesecond);\r
+        runtime.getLocationInstance().setLocation_cycle(timesecond);\r
+        runtime.getLocationInstance().setWorkingMod(mod);\r
+//            CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod());\r
+        //此处设置好配置后,会在LocationClient通过消息开始执行及时定位操作。\r
+\r
+    }\r
+\r
+    public static String heart(int hrt){\r
+        return genFZDCMD(cmdMap.get(CMD_TYPE.heart),String.valueOf(hrt));\r
+    }\r
+    public static String oxygen(int ox){\r
+        return genFZDCMD(cmdMap.get(CMD_TYPE.oxygen),String.valueOf(ox));\r
+    }\r
+\r
+    public static String blood(int pbl,int pbh){\r
+        String data=pbh+CMDSPLIT+pbl;\r
+        return genFZDCMD(cmdMap.get(CMD_TYPE.blood),data);\r
+    }\r
+\r
+    public static String temp(double temp){\r
+        return genFZDCMD(cmdMap.get(CMD_TYPE.temp),String.format("%.1f",temp));\r
+    }\r
+    public static String POWEROFF(){\r
+        return genFZDCMD(cmdMap.get(CMD_TYPE.POWEROFF));\r
+    }\r
+    public void handlePOWEROFF(Connection connection) {\r
+\r
+        connection.send(genStringMessage("POWEROFF",POWEROFF()));\r
+    }\r
+    public static String CR(){\r
+        return genFZDCMD(cmdMap.get(CMD_TYPE.CR));\r
+    }\r
+    public void handleCR(Connection connection) {\r
+\r
+        connection.send(genStringMessage("CR",CR()));\r
+    }\r
+    public static String bldstart(){\r
+        return genFZDCMD(cmdMap.get(CMD_TYPE.bldstart));\r
+    }\r
+    public void handleBldstart(Connection connection) {\r
+\r
+        connection.send(genStringMessage("bldstart",bldstart()));\r
+    }\r
+    public static String wdstart(){\r
+        return genFZDCMD(cmdMap.get(CMD_TYPE.wdstart));\r
+    }\r
+    public void handleWdstart(Connection connection,Runtime runtime ,String data) {\r
+\r
+        connection.send(genStringMessage("wdstart",wdstart()));\r
+        int freq=Integer.parseInt(data);\r
+\r
+\r
+        Config.setTemperatureTestCycle(runtime,freq);\r
+        CoreService.getInstance().setTempAlarm();\r
+\r
+        TemperatureUtil.doTempTestInThread();\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=temp(body_temp);\r
+//        connection.send(genStringMessage("temp",temperatureMsg));\r
+    }\r
+    public static String hrtstart(){\r
+        return genFZDCMD(cmdMap.get(CMD_TYPE.hrtstart));\r
+    }\r
+    public void handleHrtstart(Connection connection) {\r
+\r
+        connection.send(genStringMessage("hrtstart",hrtstart()));\r
+    }\r
+    public static String FIND(){\r
+        return genFZDCMD(cmdMap.get(CMD_TYPE.FIND));\r
+    }\r
+    public void handleFIND(Connection connection) {\r
+\r
+        connection.send(genStringMessage("FIND",FIND()));\r
+    }\r
+    public static String SOS(){\r
+        return genFZDCMD(cmdMap.get(CMD_TYPE.SOS));\r
+    }\r
+\r
+\r
+    public void handleSOS(Connection connection,Runtime runtime,String cmd,String data) {\r
+\r
+        connection.send(genStringMessage("SOS",SOS()));\r
+        if (data!=null && data.length()>0) {\r
+            String list[] = data.split(CMDSPLIT);\r
+            if (list.length==1){\r
+                ArrayList<Contact> contactArray=new ArrayList<Contact>();\r
+                if (regexUtil.isMobileNumber( list[0]) || regexUtil.isPhoneNumber(list[0]))\r
+               {\r
+                   contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos1",list[0]));\r
+                   ICLogger.i("find SOS1 number "+list[0]);\r
+               }\r
+            }else if (list.length==2){\r
+\r
+                ArrayList<Contact> contactArray=new ArrayList<Contact>();\r
+                if (regexUtil.isMobileNumber( list[0]) || regexUtil.isPhoneNumber(list[0]))\r
+                {\r
+                    contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos1",list[0]));\r
+                    ICLogger.i("find SOS1 number "+list[0]);\r
+                }\r
+                if (regexUtil.isMobileNumber( list[1]) || regexUtil.isPhoneNumber(list[1]))\r
+                {\r
+                    contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos2",list[1]));\r
+                    ICLogger.i("find SOS2 number "+list[1]);\r
+                }\r
+\r
+                runtime.getDbHelper().saveContacts(contactArray,false,false,false,false,false,true);\r
+\r
+            }\r
+        }\r
+\r
+\r
+    }\r
+    public static String PHL(){\r
+        return genFZDCMD(cmdMap.get(CMD_TYPE.PHL));\r
+    }\r
+\r
+    public void handlePHL(Connection connection,Runtime runtime,String cmd,String data){\r
+        /***\r
+         * [IC*334588000000156*len*PHL,号码,名字,号码,名字,号码,名字,号码,名字,号码,名字] len:发送长度 16 进制表示 占用 2 个字节\r
+         * 号码:ascii 字符 名字:Unicode 编码\r
+         * 该接口融合了白名单和电话本的功能,最多对应 50 组号码与名字,号码不超过 20 个 ascii 字符, 姓名不超过 10 个 Unicode 字符。\r
+         * 示 例 : [IC*334588000000156*0010*PHL,110,5F204E09]\r
+         * 5F204E09--->张三,是使用 unicode 编码\r
+         * 终端回复:[IC*334588000000156*0003*PHL]\r
+         */\r
+\r
+            String list[]=data.split(CMDSPLIT);\r
+            int listlen=list.length;\r
+            boolean ispared=  (( listlen >0) && (listlen%2 == 0));\r
+            if (ispared){\r
+                ArrayList<Contact> contactArray=new ArrayList<Contact>();\r
+                for(int i=0; i<listlen;i+=2){\r
+                    String phonem=list[i];\r
+                    String name = Util.decodeUnicode2Utf8(list[i+1]);\r
+                    ICLogger.i(i/2 +" 姓名 "+name+", 电话 "+phonem);\r
+                    contactArray.add(new Contact(Contact.CATEGORY_CALL,name,phonem));\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
+            }else{\r
+                ICLogger.i("没有电话本!执行清除操作!");\r
+            }\r
+            connection.send(genStringMessage("PHL",PHL()));\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
+    public boolean handleCmd(CMD_TYPE type, String cmd , String data) {\r
+\r
+        //普通非二进制命令用此函数处理\r
+        boolean ret=true;\r
+        ICLogger.i("handleCmd "+type.name() + " strLen="+data.length());\r
+        if (Config.LOG_TOFILE)ICLogger.logToFile("APILog", " recv " + cmd +" "+ data);\r
+        switch (type){\r
+            case LK: //登录包\r
+                ICLogger.i("服务器收到登录包LK");\r
+                mConnection.DeliverCMDMessageToSystem("login",cmd);//通知下面线程状态变化\r
+                break;\r
+            case KA:\r
+                ICLogger.i("服务器收到心跳包KA");\r
+                mConnection.DeliverCMDMessageToSystem("heartbeat",cmd);//通知下面线程状态变化\r
+                break;\r
+\r
+            case PING:\r
+                handlePing(mRuntime,data);\r
+                ICLogger.i("服务器返回Ping绑定信息");\r
+                break;\r
+            case CR:\r
+                //立即定位指令(长链接有效)\r
+                handleCR(mConnection);\r
+                mConnection.DeliverCMDMessageToSystem("StartLocate",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 UPLOAD:\r
+                //设置工作模式\r
+                handleUPLOAD(mConnection,mRuntime,cmd,data);\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
+//\r
+////                            case BP05: //L02服务器不适用\r
+////                                //查询服务器语音 返回信息\r
+////                                API.handleBP05(cmd);\r
+////                                break;\r
+//\r
+            case SOS:\r
+                //收到设置SOS号码\r
+                handleSOS(mConnection,mRuntime,cmd,data);\r
+                ICLogger.i("收到服务器设置SOS号码命令BP12");\r
+                break;\r
+            case PHL:\r
+                //收到设置白名单号码\r
+                ICLogger.i("收到服务器设置白名单号码命令BP14");\r
+                handlePHL(mConnection,mRuntime,cmd,data);\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 POWEROFF:\r
+                //收到关机\r
+                handlePOWEROFF(mConnection);\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 hrtstart:\r
+                handleHrtstart(mConnection);\r
+                ICLogger.i("收到服务器心率检测命令");\r
+                HeartRateManager.triggerPPGtest();\r
+                break;\r
+            case bldstart:\r
+                handleBldstart(mConnection);\r
+                ICLogger.i("收到服务器血压检测命令");\r
+                HeartRateManager.triggerPPGtest();\r
+                break;\r
+            case wdstart:\r
+                handleWdstart(mConnection,mRuntime,data);\r
+                ICLogger.i("收到服务器体温测试及设置命令");\r
+                break;\r
+            case blood:\r
+                ICLogger.i("服务器收到上传的血压");\r
+                mConnection.DeliverCMDMessageToSystem("blood",cmd);//通知下面线程状态变化\r
+                break;\r
+            case oxygen:\r
+                ICLogger.i("服务器收到上传的血氧");\r
+                mConnection.DeliverCMDMessageToSystem("oxygen",cmd);//通知下面线程状态变化\r
+                break;\r
+            case temp:\r
+                ICLogger.i("服务器收到上传的体温");\r
+                mConnection.DeliverCMDMessageToSystem("temp",cmd);//通知下面线程状态变化\r
+                break;\r
+            case heart:\r
+                ICLogger.i("服务器收到上传的心率heart");\r
+                mConnection.DeliverCMDMessageToSystem("heart",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 FIND:\r
+                //收到查找设备消息\r
+                handleFIND(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("IWAPHP",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
+//            case BPDE:\r
+//                handleBPDE(mConnection,cmd,mRuntime);\r
+//                ICLogger.i(" 收到 进出围栏通知!");\r
+//                mConnection.DeliverCMDMessageToSystem("APDE",cmd);//通知下面线程状态变化\r
+//                break;\r
+//\r
+//            case BPTU:\r
+//                handleBPTU(cmd, mConnection);\r
+//                ICLogger.i("收到服务器 图片语音 消息 BPTU");\r
+//                //    mConnection.DeliverCMDMessageToSystem("APTU", "");//通知下面线程状态变化\r
+//                break;\r
+//            case BPDF:\r
+//                handleBPDF(mConnection,cmd,mRuntime);\r
+//                ICLogger.i(" 收到 体温阈值设置!");\r
+//                mConnection.DeliverCMDMessageToSystem("APDF",cmd);//通知下面线程状态变化\r
+//                break;\r
+\r
+        }\r
+\r
+        return ret;\r
+\r
+    }\r
+\r
+\r
+    public boolean handleCmd(CMD_TYPE type, String cmd, byte[] bytes) {\r
+\r
+        //只有需要传递二级制数据的才需要这个函数,目前只有BP28需要\r
+\r
+        boolean ret=true;\r
+        ICLogger.i("handleCmd "+type.name() + " "+cmd+" bytelen="+bytes.length );\r
+        if (Config.LOG_TOFILE) ICLogger.logToFile("APILog", " recv " +new String(bytes));\r
+        switch (type) {\r
+            case LK:\r
+            //    handleBP28(mConnection,cmd, mRuntime,bytes);\r
+                ICLogger.i("收到服务器语音BP28");\r
+                mConnection.DeliverCMDMessageToSystem("BP28", "");//通知下面线程状态变化\r
+                break;\r
+        }\r
+        return ret;\r
+    }\r
+\r
+}\r