1、修改protocol_ic 中的 APTU 格式。
authorsnickersun <scy@incartech.cn>
Wed, 29 Jul 2020 08:15:59 +0000 (16:15 +0800)
committersnickersun <scy@incartech.cn>
Wed, 29 Jul 2020 08:15:59 +0000 (16:15 +0800)
2、添加protocol_fzd, 使protocolAPIHelper 同时兼容 jiai,beehome,ic,fzd 四种协议。 当前实现了fzd 整个协议格式解析逻辑,以及LK,KA 两个指令。

14 files changed:
app/src/main/java/com/enqualcomm/support/MainActivity.java
app/src/main/java/com/enqualcomm/support/bean/Runtime.java
app/src/main/java/com/enqualcomm/support/service/Deliver.java
app/src/main/java/com/enqualcomm/support/service/Initialize.java
app/src/main/java/com/enqualcomm/support/service/KeepAlive.java
app/src/main/java/com/enqualcomm/support/utils/MD5.java [new file with mode: 0644]
app/src/main/java/com/enqualcomm/support/utils/TimeUtil.java
app/src/main/java/com/enqualcomm/support/utils/Util.java
app/src/main/java/com/enqualcomm/support/utils/regexUtil.java [new file with mode: 0644]
app/src/main/java/com/ic/protocols/protocolAPIHelper.java
app/src/main/java/com/ic/protocols/protocol_beehome.java
app/src/main/java/com/ic/protocols/protocol_fzd.java
app/src/main/java/com/ic/protocols/protocol_ic.java
app/src/main/java/com/ic/protocols/protocol_jiai.java

index 5597658..829e971 100644 (file)
@@ -16,6 +16,7 @@ import com.enqualcomm.support.utils.Util;
 import java.util.concurrent.ScheduledThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 
+import chestnut.utils.RegexUtils;
 import rx.Observable;
 import rx.functions.Action1;
 
index 24f392d..e46d1cb 100644 (file)
@@ -24,7 +24,7 @@ public class Runtime {
 \r
  public int SignalStrength;\r
 \r
-  \r
+  public boolean BindingStatus=false;\r
   private String battery="000";\r
 \r
   private int batteryVoltage=0;\r
index 6232f95..2a58bb1 100644 (file)
@@ -144,12 +144,20 @@ public class Deliver extends AbstractConnectionService {
     delaySendMSG.run();\r
 //    mSendMSGHandler.sendEmptyMessage(1);\r
   }\r
-\r
   private static boolean NeedCheckServerResponse=true;\r
   private static boolean ServerResponsed=false;\r
   private static String needCheckResponseCMD=null;\r
   private static int CheckCount=0;\r
 \r
+  private static void checkNeedServerResponse(String cmd){\r
+      if (cmd!=null && Config.protocol_no==Config.PROTOCOL_FZD  &&\r
+              (protocolAPIHelper.isCmdStr(cmd).equals("UD") || protocolAPIHelper.isCmdStr(cmd).equals("UD2"))){\r
+        NeedCheckServerResponse=false;\r
+      }else{\r
+        NeedCheckServerResponse=true;\r
+      }\r
+  }\r
+\r
   public static boolean getAndSendMsgFromQueue(){\r
     boolean ret=false;\r
     if (mRuntime.getUseQueue()) {\r
@@ -162,7 +170,13 @@ public class Deliver extends AbstractConnectionService {
         //如果没有数据从缓存中尝试读取\r
 //        if (queue.isEmpty())\r
 //          loadMessage2Queue();\r
+\r
+        //检查刚刚发送出去的包是否需要检查server response\r
+        checkNeedServerResponse(needCheckResponseCMD);\r
+\r
+        //如果需要,且没有服务器反馈\r
         if (NeedCheckServerResponse==true && ServerResponsed==false){\r
+          //刚刚发送的包不为空,且检测次数小于3,则保留数据,进行下一次重试。\r
           if (needCheckResponseCMD!=null && CheckCount < 3) {\r
             //如果cmd有效,且尝试次数小于3, 没有收到反馈的情况下,可以重新插入queue进行下一次尝试!\r
             ICLogger.i("checkSrvResponse "+CheckCount+" times for "+needCheckResponseCMD);\r
@@ -175,7 +189,7 @@ public class Deliver extends AbstractConnectionService {
                 ICLogger.logToFile("APILog", "response failed retry !  " +CheckCount+" " + needCheckResponseCMD);\r
             }\r
             CheckCount++;\r
-          }else{\r
+          }else{ //否则 可能是还没有发送过数据,或者超过重试次数,继续提取queue中数据进行发送\r
             ICLogger.i("checkSrvResponse CheckCount="+CheckCount+" Timeout or cmd is null, skip ");\r
             if (Config.LOG_TOFILE)\r
               ICLogger.logToFile("APILog", "response timeout skip!  " + needCheckResponseCMD);\r
@@ -194,11 +208,10 @@ public class Deliver extends AbstractConnectionService {
               if (checkNetwork()) {\r
                 connection.sendMsg(cmd);\r
 //                stringMessage = queue.poll();\r
-\r
+                needCheckResponseCMD=cmd;\r
                 //如果需要Check\r
                 if (NeedCheckServerResponse==true){\r
                     ICLogger.i("checkSrvResponse "+cmd);\r
-                    needCheckResponseCMD=cmd;\r
                     ServerResponsed=false;\r
                 }\r
                 ret=true;\r
@@ -314,21 +327,18 @@ public static void sendLocationMSG( String Msg){
     if (NeedCheckServerResponse==true){\r
 \r
       if(needCheckResponseCMD!=null) {\r
-        if( cmd.equals(needCheckResponseCMD.substring(0,6))){\r
-\r
-          ICLogger.i("checkSrvResponse "+cmd+" "+needCheckResponseCMD.substring(0,6)+" is responsed!");\r
+        if( cmd.equals(protocolAPIHelper.isCmdStr (needCheckResponseCMD))){\r
+          ICLogger.i("checkSrvResponse "+cmd+" "+protocolAPIHelper.isCmdStr (needCheckResponseCMD)+" is responsed!");\r
           ServerResponsed=true;\r
           CheckCount=0;\r
         }\r
       }\r
     }\r
     ICLogger.i("Deliver receive cmd " + paramStringMessage.cmd());\r
-    if (cmd.equals("BP07") || cmd.equals("SentVoicePacket")) {\r
+    if (cmd.equals("SentVoicePacket") ) {\r
       //收到BP07 表示服务器收到一个voicePacket 分包成功,开始检查下一个包是否存在需要发送。\r
       //收到SentVoicePacket 表示 有一个VoiceMessage要发送,需要从第0个包开始发送语音分包。\r
-\r
       voicePacket voicepacket = voicePacket.getInstanceSent();\r
-\r
       if (voicepacket.getCurrentIndexToSent() < voicepacket.getPacketCount()) {\r
         ICLogger.i("voicepacket " + voicepacket.getName() + " " + voicepacket.getPacketTime() + " send " + (voicepacket.getCurrentIndexToSent() + 1) + "/" + voicepacket.getPacketCount());\r
         ((NettyConnection) mConnection).sendMsg(\r
@@ -401,7 +411,7 @@ public static void sendLocationMSG( String Msg){
         }\r
       });\r
       return true;\r
-    } else if ("BP03".equals(paramStringMessage.cmd())) {\r
+    } else if ("heartbeat".equals(paramStringMessage.cmd())) {\r
       //每次心跳,查询一下 是否有语音消息需要接收。\r
 //      paramConnection.send(protocolAPIHelper.genStringMessage("AP05",protocolAPIHelper.AP05(true)));\r
     } else if ("NewVoice".equals(paramStringMessage.cmd()))\r
index 8bf4f4d..9a6884c 100644 (file)
@@ -90,7 +90,7 @@ public class Initialize extends AbstractConnectionService {
   public boolean onReceive(StringMessage paramStringMessage, Connection paramConnection, Runtime paramRuntime) {\r
     if (this.initOK)\r
       return false; \r
-    if (paramStringMessage.cmd().equals("BP00")) {\r
+    if (paramStringMessage.cmd().equals("login")) {\r
       this.initOK = true;\r
 //      try {\r
 //        paramRuntime.setKey(((JSONObject)(new JSONTokener(paramStringMessage.all()[1])).nextValue()).getString("KEY"));\r
index 8ba5fc0..d16deb7 100644 (file)
@@ -111,9 +111,9 @@ public class KeepAlive extends AbstractConnectionService {
           boolean ret=DeviceInfoUtil.updateImei(mRuntime);\r
           ICLogger.i("Update IMEI "+ret);\r
           if (is_login_send_success)\r
-            connection.send(protocolAPIHelper.genStringMessage("heart", protocolAPIHelper.getHeartbeatMSG(mRuntime)));\r
+            connection.send(protocolAPIHelper.genStringMessage("heartbeat", protocolAPIHelper.getHeartbeatMSG(mRuntime)));\r
           else\r
-            connection.send(protocolAPIHelper.genStringMessage("heart", protocolAPIHelper.getLoginMSG(mRuntime)));\r
+            connection.send(protocolAPIHelper.genStringMessage("heartbeat", protocolAPIHelper.getLoginMSG(mRuntime)));\r
 \r
         }\r
       }\r
@@ -286,7 +286,7 @@ public class KeepAlive extends AbstractConnectionService {
 \r
     //这个是正常心跳包,暂时不能认为服务器连接时失败的,所以正常发送检测。\r
     //发送心跳包\r
-    connection.send(protocolAPIHelper.genStringMessage("heart",protocolAPIHelper.getHeartbeatMSG(paramRuntime)));\r
+    connection.send(protocolAPIHelper.genStringMessage("heartbeat",protocolAPIHelper.getHeartbeatMSG(paramRuntime)));\r
         //发送完心跳后,开始检查服务器响应\r
     startResponseCheckTimer();\r
 \r
@@ -295,10 +295,9 @@ public class KeepAlive extends AbstractConnectionService {
 \r
   public boolean onReceive(StringMessage paramStringMessage, Connection paramConnection, Runtime paramRuntime) {\r
 //    this.idleTimeMillis = SystemClock.elapsedRealtime();\r
-    if ("heart".equals(paramStringMessage.cmd())) {\r
+    if ("heartbeat".equals(paramStringMessage.cmd())) {\r
       AlarmWakeUp.isNeedWakeUpAlarm(paramRuntime);\r
-      return true;\r
-    }else if ("BP03".equals(paramStringMessage.cmd())){\r
+\r
 //      收到心跳才认为是已经连接了服务器\r
       paramRuntime.setServerProtocolConnected(true);\r
 //      isConnected = true;\r
@@ -313,7 +312,7 @@ public class KeepAlive extends AbstractConnectionService {
         LocationClient.setForceLocation(1);\r
         CoreService.getInstance().setLocationAlarm(paramRuntime.getLocationInstance().getWorkingMod());\r
       }\r
-    }else   if (paramStringMessage.cmd().equals("BP00")) {\r
+    }else   if (paramStringMessage.cmd().equals("login")) {\r
       //广播服务器连接成功的消息\r
      // paramRuntime.getContextProxy().sendBroadcastServerConnectionChanged(true);\r
       //登录包收到就停止重链接服务器\r
@@ -328,7 +327,7 @@ public class KeepAlive extends AbstractConnectionService {
         public void call(Long param1Long) {\r
           //这时重新连接服务器才进行的连接,理论上close已经设置false,此次可以认为协议定然断开,所以设置为false作为双重保险。\r
           mRuntime.setServerProtocolConnected(false);\r
-          connection.send(protocolAPIHelper.genStringMessage("heart",protocolAPIHelper.getHeartbeatMSG(paramRuntime)));\r
+          connection.send(protocolAPIHelper.genStringMessage("heartbeat",protocolAPIHelper.getHeartbeatMSG(paramRuntime)));\r
           //发送完心跳后,开始检查服务器响应\r
           startResponseCheckTimer();\r
         }\r
diff --git a/app/src/main/java/com/enqualcomm/support/utils/MD5.java b/app/src/main/java/com/enqualcomm/support/utils/MD5.java
new file mode 100644 (file)
index 0000000..6de9921
--- /dev/null
@@ -0,0 +1,87 @@
+package com.enqualcomm.support.utils;\r
+\r
+import android.util.Log;\r
+\r
+import java.io.File;\r
+import java.io.FileInputStream;\r
+import java.io.FileNotFoundException;\r
+import java.io.IOException;\r
+import java.math.BigInteger;\r
+import java.security.MessageDigest;\r
+import java.security.NoSuchAlgorithmException;\r
+\r
+public class MD5 {\r
+    static String TAG = "MD5";\r
+\r
+    public static String getCMDStringMD5(String src){\r
+\r
+            if (src.isEmpty()) {\r
+                return "";\r
+            }\r
+            MessageDigest md5 = null;\r
+            try {\r
+                md5 = MessageDigest.getInstance("MD5");\r
+                byte[] bytes = md5.digest(src.getBytes());\r
+                String result = "";\r
+                for (byte b : bytes) {\r
+                    String temp = Integer.toHexString(b & 0xff);\r
+                    if (temp.length() == 1) {\r
+                        temp = "0" + temp;\r
+                    }\r
+                    result += temp;\r
+                }\r
+                return result;\r
+            } catch (NoSuchAlgorithmException e) {\r
+                e.printStackTrace();\r
+            }\r
+            return "";\r
+    }\r
+    public static String createMd5(String str) {\r
+        MessageDigest mMDigest;\r
+        FileInputStream Input;\r
+        File file = new File(str);\r
+        byte buffer[] = new byte[1024];\r
+        int len;\r
+        if (!file.exists())\r
+            return null;\r
+        try {\r
+            mMDigest = MessageDigest.getInstance("MD5");\r
+            Input = new FileInputStream(file);\r
+            while ((len = Input.read(buffer, 0, 1024)) != -1) {\r
+                mMDigest.update(buffer, 0, len);\r
+            }\r
+            Input.close();\r
+        } catch (NoSuchAlgorithmException e) {\r
+            // TODO Auto-generated catch block\r
+            e.printStackTrace();\r
+            return null;\r
+        } catch (FileNotFoundException e) {\r
+            // TODO Auto-generated catch block\r
+            e.printStackTrace();\r
+            return null;\r
+        } catch (IOException e) {\r
+            // TODO Auto-generated catch block\r
+            e.printStackTrace();\r
+            return null;\r
+        }\r
+        BigInteger mBInteger = new BigInteger(1, mMDigest.digest());\r
+        Log.v(TAG, "create_MD5=" + mBInteger.toString(16));\r
+        return mBInteger.toString(16);\r
+\r
+    }\r
+\r
+    public static boolean checkMd5(String Md5, String file) {\r
+\r
+        if (Md5!=null) {\r
+            String str = createMd5(file);\r
+            Log.d(TAG, "md5sum = " + str);\r
+            if (Md5.compareTo(str) == 0)\r
+                return true;\r
+            else\r
+                return false;\r
+        }else\r
+        {\r
+            return true;\r
+        }\r
+    }\r
+}\r
index 4e2f0d1..7dd0cf2 100644 (file)
@@ -38,7 +38,9 @@ public class TimeUtil {
   \r
   public static String getSystemTime4(long paramLong) { return (new SimpleDateFormat("yyyyMMdd")).format(new Date(paramLong)); }\r
 \r
-\r
+  public static String getSystemDateYYMMDD(){\r
+    return (new SimpleDateFormat("yyMMdd")).format(new Date(System.currentTimeMillis()));\r
+  }\r
 \r
   public static Date parseDatetiime(String datetimeStr){\r
 \r
index b6d02a0..e655c51 100644 (file)
@@ -935,6 +935,37 @@ public class Util {
     return ret;\r
   }\r
 \r
-\r
+  public static String bytesToHexString(byte[] src) {\r
+    StringBuilder stringBuilder = new StringBuilder("");\r
+    if (src == null || src.length <= 0) {\r
+      return null;\r
+    }\r
+    for (int i = 0; i < src.length; i++) {\r
+      int v = src[i] & 0xFF;\r
+      String hv = Integer.toHexString(v);\r
+      if (hv.length() < 2) {\r
+        stringBuilder.append(0);\r
+      }\r
+      stringBuilder.append(hv);\r
+    }\r
+    return stringBuilder.toString();\r
+  }\r
+  public static byte[] hexStringToBytes(String hexString) {\r
+    if (hexString == null || hexString.equals("")) {\r
+      return null;\r
+    }\r
+    hexString = hexString.toUpperCase();\r
+    int length = hexString.length() / 2;\r
+    char[] hexChars = hexString.toCharArray();\r
+    byte[] d = new byte[length];\r
+    for (int i = 0; i < length; i++) {\r
+      int pos = i * 2;\r
+      d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));\r
+    }\r
+    return d;\r
+  }\r
+  private static byte charToByte(char c) {\r
+    return (byte) "0123456789ABCDEF".indexOf(c);\r
+  }\r
 }\r
 \r
diff --git a/app/src/main/java/com/enqualcomm/support/utils/regexUtil.java b/app/src/main/java/com/enqualcomm/support/utils/regexUtil.java
new file mode 100644 (file)
index 0000000..d9e7fd7
--- /dev/null
@@ -0,0 +1,161 @@
+package com.enqualcomm.support.utils;\r
+\r
+import java.util.regex.Matcher;\r
+import java.util.regex.Pattern;\r
+\r
+/***********************************************\r
+ * 正则表达式工具\r
+ *\r
+ * @author chen.lin\r
+ * @version 1.0\r
+ ************************************************/\r
+\r
+public class regexUtil {\r
+\r
+        public static final Pattern PATTERN_FZD_CMD_HEADER= Pattern\r
+                .compile("\\[IC\\*\\d{15}\\*\\d*\\*[a-zA-Z0-9]+$");\r
+        /**\r
+         * 车牌号码Pattern\r
+         */\r
+        public static final Pattern PLATE_NUMBER_PATTERN = Pattern\r
+                .compile("^[\u0391-\uFFE5]{1}[a-zA-Z0-9]{6}$");\r
+\r
+        /**\r
+         * 证件号码Pattern\r
+         */\r
+        public static final Pattern ID_CODE_PATTERN = Pattern\r
+                .compile("^[a-zA-Z0-9]+$");\r
+\r
+        /**\r
+         * 编码Pattern\r
+         */\r
+        public static final Pattern CODE_PATTERN = Pattern\r
+                .compile("^[a-zA-Z0-9]+$");\r
+\r
+        /**\r
+         * 固定电话编码Pattern\r
+         */\r
+        public static final Pattern PHONE_NUMBER_PATTERN = Pattern\r
+                .compile("0\\d{2,3}-[0-9]+");\r
+\r
+        /**\r
+         * 邮政编码Pattern\r
+         */\r
+        public static final Pattern POST_CODE_PATTERN = Pattern.compile("\\d{6}");\r
+\r
+        /**\r
+         * 面积Pattern\r
+         */\r
+        public static final Pattern AREA_PATTERN = Pattern.compile("\\d*.?\\d*");\r
+\r
+        /**\r
+         * 手机号码Pattern\r
+         */\r
+        public static final Pattern MOBILE_NUMBER_PATTERN = Pattern\r
+                .compile("\\d{11}");\r
+\r
+        /**\r
+         * 银行帐号Pattern\r
+         */\r
+        public static final Pattern ACCOUNT_NUMBER_PATTERN = Pattern\r
+                .compile("\\d{16,21}");\r
+\r
+        /**\r
+         * 车牌号码是否正确\r
+         *\r
+         * @param s\r
+         * @return\r
+         */\r
+        public static boolean isPlateNumber(String s) {\r
+            Matcher m = PLATE_NUMBER_PATTERN.matcher(s);\r
+            return m.matches();\r
+        }\r
+\r
+        /**\r
+         * 证件号码是否正确\r
+         *\r
+         * @param s\r
+         * @return\r
+         */\r
+        public static boolean isIDCode(String s) {\r
+            Matcher m = ID_CODE_PATTERN.matcher(s);\r
+            return m.matches();\r
+        }\r
+\r
+        /**\r
+         * 编码是否正确\r
+         *\r
+         * @param s\r
+         * @return\r
+         */\r
+        public static boolean isCode(String s) {\r
+            Matcher m = CODE_PATTERN.matcher(s);\r
+            return m.matches();\r
+        }\r
+\r
+        /**\r
+         * 固话编码是否正确\r
+         *\r
+         * @param s\r
+         * @return\r
+         */\r
+        public static boolean isPhoneNumber(String s) {\r
+            Matcher m = PHONE_NUMBER_PATTERN.matcher(s);\r
+            return m.matches();\r
+        }\r
+\r
+        /**\r
+         * 邮政编码是否正确\r
+         *\r
+         * @param s\r
+         * @return\r
+         */\r
+        public static boolean isPostCode(String s) {\r
+            Matcher m = POST_CODE_PATTERN.matcher(s);\r
+            return m.matches();\r
+        }\r
+\r
+        /**\r
+         * 面积是否正确\r
+         *\r
+         * @param s\r
+         * @return\r
+         */\r
+        public static boolean isArea(String s) {\r
+            Matcher m = AREA_PATTERN.matcher(s);\r
+            return m.matches();\r
+        }\r
+\r
+        /**\r
+         * 手机号码否正确\r
+         *\r
+         * @param s\r
+         * @return\r
+         */\r
+        public static boolean isMobileNumber(String s) {\r
+            Matcher m = MOBILE_NUMBER_PATTERN.matcher(s);\r
+            return m.matches();\r
+        }\r
+\r
+        /**\r
+         * 银行账号否正确\r
+         *\r
+         * @param s\r
+         * @return\r
+         */\r
+        public static boolean isAccountNumber(String s) {\r
+            Matcher m = ACCOUNT_NUMBER_PATTERN.matcher(s);\r
+            return m.matches();\r
+        }\r
+\r
+\r
+        public static boolean isFZDCMD(String s){\r
+            Matcher m = PLATE_NUMBER_PATTERN.matcher(s);\r
+            return m.matches();\r
+        }\r
+\r
+        public static boolean isFZDCMD(String cmd, String s){\r
+           return Pattern.compile("\\[IC\\*\\d{15}\\*\\d*\\*"+cmd).matcher(s).matches();\r
+        }\r
+\r
+}\r
index ee0a6ed..62e9f1d 100644 (file)
@@ -55,6 +55,27 @@ public class protocolAPIHelper {
         return sm;\r
     }\r
 \r
+\r
+    public static String isCmdStr(String msg){\r
+\r
+        String ret="";\r
+        switch(Config.protocol_no)\r
+        {\r
+            case Config.PROTOCOL_JIAI:\r
+                ret=protocol_jiai.isCmdStr(msg);\r
+                break;\r
+            case Config.PROTOCOL_BEEHOME:\r
+                ret=protocol_beehome.isCmdStr(msg);\r
+                break;\r
+            case Config.PROTOCOL_IC:\r
+                ret=protocol_ic.isCmdStr(msg);\r
+                break;\r
+            case Config.PROTOCOL_FZD:\r
+                ret=protocol_fzd.isCmdStr(msg);\r
+                break;\r
+        }\r
+        return ret;\r
+    }\r
     public static String getTemperatureMSG(double temp_adusted,double body_temp){\r
         String ret="";\r
         switch(Config.protocol_no)\r
@@ -108,7 +129,7 @@ public class protocolAPIHelper {
                 ret=protocol_ic.AP00(runtime);\r
                 break;\r
             case Config.PROTOCOL_FZD:\r
-                ret="";\r
+                ret=protocol_fzd.LK();\r
                 break;\r
         }\r
         return ret;\r
@@ -128,7 +149,7 @@ public class protocolAPIHelper {
                 ret=protocol_ic.AP03(runtime);\r
                 break;\r
             case Config.PROTOCOL_FZD:\r
-                ret="";\r
+                ret=protocol_fzd.KA(runtime);\r
                 break;\r
         }\r
         return ret;\r
@@ -184,10 +205,10 @@ public class protocolAPIHelper {
                 ret=protocol_beehome.AP07(packetTime,count,index,datalen,amrdata);\r
                 break;\r
             case Config.PROTOCOL_IC:\r
-                ret=protocol_ic.AP07(packetTime,count,index,datalen,amrdata);\r
+                ret=protocol_ic.APTU(packetTime,1,1,count,index,datalen,amrdata);\r
                 break;\r
             case Config.PROTOCOL_FZD:\r
-                ret=protocol_fzd.AP07(packetTime,count,index,datalen,amrdata);\r
+                ret=null;//protocol_fzd.AP07(packetTime,count,index,datalen,amrdata);\r
                 break;\r
         }\r
         return ret;\r
index 4bb945f..1a49f29 100644 (file)
@@ -215,18 +215,30 @@ public class protocol_beehome {
     private StringBuffer cmdbuf = new StringBuffer();\r
 \r
     /*\r
-    输入的字符串,如果有完整命令,返回 true\r
-    否则返回 false\r
+    输入的字符串,如果有完整命令,返回 命令名\r
+    否则返回 空字符串\r
      */\r
-    public boolean isCmdStr(String msg) {\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
-                return true;\r
+            if (end_index < 0) {\r
+\r
+                return "";\r
             }\r
+        }else{\r
+            return "";\r
         }\r
-        return false;\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
@@ -976,7 +988,7 @@ public class protocol_beehome {
                 voicePacket.getInstanceSent().setCurrentIndexToSent(packetIndex);\r
             }\r
             //发送消息,再次检查要发送的语音包,确认其发送完毕\r
-            connection.DeliverCMDMessageToSystem("BP07","SentVoicePacket");\r
+            connection.DeliverCMDMessageToSystem("SentVoicePacket","SentVoicePacket");\r
 \r
         }else{\r
             ICLogger.i(" BP07 Format error!");\r
@@ -1831,22 +1843,22 @@ public class protocol_beehome {
             case BP00: //登录包\r
                 handleBP00(mRuntime,cmd);\r
                 ICLogger.i("服务器收到登录包AP00");\r
-                mConnection.DeliverCMDMessageToSystem("BP00",cmd);//通知下面线程状态变化\r
+                mConnection.DeliverCMDMessageToSystem("login",cmd);//通知下面线程状态变化\r
                 break;\r
             case BP01: //gps定位包\r
                 handleBP01(cmd);\r
                 ICLogger.i("服务器收到定位AP01");\r
-                mConnection.DeliverCMDMessageToSystem("IWAP01",cmd);//通知下面线程状态变化\r
+                mConnection.DeliverCMDMessageToSystem("AP01",cmd);//通知下面线程状态变化\r
                 break;\r
             case BP02:// wifi定位包\r
                 handleBP02(cmd);\r
                 ICLogger.i("服务器收到定位AP02");\r
-                mConnection.DeliverCMDMessageToSystem("IWAP02",cmd);//通知下面线程状态变化\r
+                mConnection.DeliverCMDMessageToSystem("AP02",cmd);//通知下面线程状态变化\r
                 break;\r
             case BP03: //心跳包\r
                 handleBP03(cmd);\r
                 ICLogger.i("服务器收到心跳包AP03");\r
-                mConnection.DeliverCMDMessageToSystem("BP03",cmd);//通知下面线程状态变化\r
+                mConnection.DeliverCMDMessageToSystem("heartbeat",cmd);//通知下面线程状态变化\r
                 break;\r
 \r
             case BP07:\r
@@ -1855,7 +1867,7 @@ public class protocol_beehome {
                 break;\r
             case BP10:\r
                 //报警包\r
-                mConnection.DeliverCMDMessageToSystem("IWAP10",cmd);//通知下面线程状态变化\r
+                mConnection.DeliverCMDMessageToSystem("AP10",cmd);//通知下面线程状态变化\r
                 break;\r
 \r
             case BPTM:\r
@@ -1948,7 +1960,7 @@ public class protocol_beehome {
                 break;\r
             case BPHT:\r
                 ICLogger.i("服务器收到上传的心率血压");\r
-                mConnection.DeliverCMDMessageToSystem("IWAPHT",cmd);//通知下面线程状态变化\r
+                mConnection.DeliverCMDMessageToSystem("APHT",cmd);//通知下面线程状态变化\r
                 break;\r
             case BP84:\r
                 handleBP84(cmd,mConnection);\r
@@ -1980,11 +1992,11 @@ public class protocol_beehome {
 \r
             case BPTP:\r
                 handleBPTP();\r
-                mConnection.DeliverCMDMessageToSystem("IWAPTP",cmd);//通知下面线程状态变化\r
+                mConnection.DeliverCMDMessageToSystem("APTP",cmd);//通知下面线程状态变化\r
                 break;\r
             case BPHP:\r
                 handleBPHP();\r
-                mConnection.DeliverCMDMessageToSystem("IWAPHP",cmd);//通知下面线程状态变化\r
+                mConnection.DeliverCMDMessageToSystem("APHP",cmd);//通知下面线程状态变化\r
                 break;\r
             case BPX1://设置 心率血压血氧修正值\r
                 handleBPX1(cmd,mConnection,mRuntime);\r
index da7d5d3..0d95a13 100644 (file)
@@ -1,10 +1,12 @@
 package com.ic.protocols;\r
 \r
 import android.content.ComponentName;\r
+import android.content.IClipboard;\r
 import android.content.Intent;\r
 import android.net.Uri;\r
 import android.os.Environment;\r
 \r
+import com.android.internal.telephony.uicc.RuimFileHandler;\r
 import com.enqualcomm.support.Config;\r
 import com.enqualcomm.support.CoreService;\r
 import com.enqualcomm.support.bean.Alarm;\r
@@ -18,14 +20,18 @@ import com.enqualcomm.support.bean.voicePacket;
 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.TimeUtil;\r
 import com.enqualcomm.support.utils.Util;\r
+import com.enqualcomm.support.utils.regexUtil;\r
 \r
 import java.io.File;\r
 import java.util.ArrayList;\r
 import java.util.HashMap;\r
 \r
+import chestnut.utils.PhoneUtils;\r
+\r
 import static com.enqualcomm.support.Constants.ACTION_HEATR_RATE_START;\r
 import static com.enqualcomm.support.LocationClient.LOCATION_MODE;\r
 import static com.enqualcomm.support.bean.Contact.GROUP_ALL;\r
@@ -34,74 +40,52 @@ import static java.lang.Math.abs;
 public class protocol_fzd {\r
     private static final String TAG = "ICSrv." + protocol_fzd.class.getSimpleName();\r
     private static final String PrivKEY = "XMQcHi0lGIdru6xzW7lygBwBT8N0c09P";\r
-    private static final String CMDHEADER = "IC";\r
-    private static final String CMDEND = "#";\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="zd.xcloudtech.com";\r
+    public static final String defaultServerIP="fzd.xcloudtech.com";\r
     public static final int defaultServerPort=9000;\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
+        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,//temp\r
         /* 服务器发起*/\r
-        AP12,\r
-        BP12,//SOS 号码设置\r
-        AP14,\r
-        BP14,//设置联系人白名单\r
-        AP15,\r
-        BP15,//设置定位周期\r
-        AP16,\r
-        BP16,//立即定位\r
-        AP17,\r
-        BP17,//恢复出厂设置\r
-        AP18,\r
-        BP18,//重启设备\r
-        AP21,\r
-        BP21,//设置计步开关\r
-        AP28,\r
-        BP28, //语音下行\r
-        AP31,\r
-        BP31,//关机\r
-        AP33,\r
-        BP33,//工作模式\r
-        AP34,\r
-        BP34,//自定义工作模式\r
-        APXL,\r
-        BPXL,//测量心率\r
-        APXY,\r
-        BPXY,//测量血压\r
-        APJZ,\r
-        BPJZ,//血压校准\r
-        AP84,\r
-        BP84,//白名单开关\r
-        AP85,\r
-        BP85,//设置闹钟\r
-        AP86,\r
-        BP86,//心率血压测试周期\r
-        AP89,\r
-        BP89,//心率血压阀值设置\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
         UNKNOWN_CMD,\r
     }\r
 \r
@@ -109,64 +93,39 @@ public class protocol_fzd {
 \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.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.AP89, "AP89");\r
-        cmdMap.put(CMD_TYPE.BP89, "BP89");\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
     }\r
 \r
     private NettyConnection mConnection=null;\r
@@ -180,24 +139,26 @@ public class protocol_fzd {
 \r
     private StringBuffer cmdbuf = new StringBuffer();\r
 \r
-    /*\r
-    输入的字符串,如果有完整命令,返回 true\r
-    否则返回 false\r
-     */\r
-    public boolean isCmdStr(String msg) {\r
-        /***\r
-         * IC*\r
-         */\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
-                return true;\r
-            }\r
-        }\r
-        return false;\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
@@ -215,6 +176,22 @@ public class protocol_fzd {
         return sm;\r
     }\r
 \r
+    /*\r
+    输入的字符串,如果有完整命令,返回 命令名\r
+    否则返回 空字符串\r
+     */\r
+    public static String isCmdStr(String msg) {\r
+        if (regexUtil.isFZDCMD(msg)) {\r
+            for (CMD_TYPE key : cmdMap.keySet()) {\r
+                if (regexUtil.isFZDCMD(cmdMap.get(key), msg)) { //如果是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
@@ -222,171 +199,144 @@ public class protocol_fzd {
     每个字符串如果发现 #,却又没有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
+        int  cmdindex =cmd_msgbuf.indexOf(CMDHEADER+CMDCOMPANY+CMDHEADERSPLIT);\r
+        if (cmdindex>0) { //如果开头不是CMDHEADER但是包含CMDHEADER则删除前面的数据\r
+            String cmd=cmd_msgbuf.substring(cmdindex);\r
+            cmd_msgbuf=cmd;\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
+        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 (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
+               // 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(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
+\r
+\r
+                        handleCmd(key, 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
-\r
-        cmdbuf = new StringBuffer().append(last_inCompletecmd);\r
-        return ret;\r
+        sb.append(hv);\r
+        return sb.toString();\r
     }\r
-    public int getBP28Amrlen(String cmd) {\r
-\r
-        String Name;\r
-        String appendIndex;\r
-        int packetCount;\r
-        int currentId;\r
-        int packetLen;\r
+    private static String genHeader(int len,String cmd){\r
 \r
+        if (CoreService.getInstance()==null)\r
+            return "";\r
 \r
-        String[] msg=cmd.split(CMDSPLIT);\r
-        if (msg.length>=6){\r
-\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
+        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
-            log( stringBuffer.toString());\r
-            return packetLen;\r
-        }else{\r
-            log("getBP28AmrLen","format Error");\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
-        }\r
-        return -1;\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 AP00(Runtime ds) {\r
-        //示例数据:IWAP00867155030001063#\r
-        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP00)).append(ds.IMEI()).append(CMDEND).toString();\r
+    public static String LK() {\r
+        /*IC*YYYYYYYYYYYYYYY*LEN*LK*/\r
+        return genFZDCMD(cmdMap.get(CMD_TYPE.LK));\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
-//            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
-\r
-        }else{\r
-            log("handleBP00","format Error");\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 String AP03(Runtime ds) {\r
-        //示例数据:IWAP03,06000908000102,5555,30#  IWAP03,000000null00000,0,0#\r
-        return 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
+    public static void handlePing(Runtime runtime,String cmd){\r
+//        [IC*YYYYYYYYYYYYYYY*LEN*PING,是否绑定(0 表示未绑定,1 表示绑定)]\r
+//        实例:[IC*334588000000156*0006*PING,0]或[IC*334588000000156*0006*PING,1]\r
+        String[] cmdlist=cmd.split(CMDSPLIT);\r
+        if (cmdlist.length==2){\r
+            int bind=Integer.parseInt(cmdlist[1]);\r
+            if (bind==0){\r
+                ICLogger.i("设备未绑定!");\r
+                runtime.BindingStatus=false;\r
+            }else{\r
+                ICLogger.i("设备已绑定!");\r
+                runtime.BindingStatus=true;\r
+            }\r
+        }\r
     }\r
-    //处理 心跳 BP03\r
-    public void handleBP03(String cmd){\r
 \r
-        log("BP03心跳接收成功");\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 static String AP10(Runtime ds){\r
 \r
-        /**\r
-         * IWAP10080524A2232.9806N11404.9355E000.1  061830  323.87  060 009 080 0 05 02,\r
-         * 460,0,9520,3671,\r
-         * 00,zh-cn,00,\r
-         * 00为报警状态,00为无任何报警(01:SOS,02:低电,03:脱落报警,04:佩戴提醒,05/06:跌倒报警))\r
-         * zh-cn:设备语言\r
-         * 00:第一个0:是否需要回复地址信息,0:不回复,1回复.\r
-         * HOME|74-DE-2B-44-88-8C|97&HOME1|74-DE-2B-44-88-8C|97&HOME2|74-DE-2B-44-88-8C|97&HOME3|74-DE-2B-44-88-8C|97#\r
-         * IW标识符\r
-         * AP10:命令字\r
-         * 080524: 2008 年05 月24\r
-         * A:“A”表示数据有效,”V”无效,如为V则取LBS数据\r
-         * 2232.9806N11404.9355E000.1: 北纬22度32.9806分,东经114度04.9355分,速度为000.1 km/h,如经纬度无效,可默认全为0,如0000.0000N00000.0000E\r
-         * 061830: 格林尼治时间06 点18 分30 秒\r
-         * 323.87:方向角323.87°\r
-         * 06000908000102:060为GSM信号,009为参与定位的卫星数,080为电池电量,0,保留位,01为设防状态,02为工作模式 ,(设防,工作模式如果为00,则代表无或未设置)\r
-         * 460,0,9520,3671 : LBS基站数据,MCC国家码,460为中国,0:MNC,0为移动,9520:LAC,十进制,3671,CID,十进制\r
-         * 00为报警状态,00为无任何报警(01:SOS,02:低电,03:脱落报警,04:佩戴提醒,05:剪断报警,06:跌倒报警,07:心率异常, 08:心率过高, 09:心率过低,10:收缩压过高,11:收缩压过低,12:舒张压过高,13:舒张压过低,14:久坐提醒,15:非法解锁(剪断报警),16:锁定提醒(佩戴提醒),17:体温过高,18体温过低)\r
-         * zh-cn:设备语言\r
-         * 00:第一个0:是否需要回复地址信息,0:不回复,1回复.\r
-         */\r
-        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP10)).append(TimeUtil.getShortDate())\r
-                .append(ds.getGPSData()).append(TimeUtil.getShortTime()).append(ds.getGPSHeading()).append(String.format("%03d",abs(ds.getSignalStrength())))\r
-                .append(ds.getGPSLocationStarNums()).append(ds.getBattery()).append("0")\r
-                .append(ds.getProtection()).append(ds.getWorkModeStr()).append(CMDSPLIT)\r
-                .append(ds.getLBSData()).append(CMDSPLIT)\r
-                .append(ds.getAlarmType()).append(CMDSPLIT)\r
-                .append(ds.getLanguage()).append(CMDSPLIT)\r
-                .append("00").append(CMDSPLIT)  //不回复地址\r
-                .append(ds.getWifiInfo()).append(CMDEND).toString();\r
-\r
-    }\r
 \r
     /*LBS+GPS混合定位*/\r
     public static String AP01(Runtime ds) {\r
@@ -394,7 +344,7 @@ public class protocol_fzd {
         // 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 new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP01)).append(TimeUtil.getShortDate())\r
+        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.LK)).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
@@ -437,7 +387,7 @@ public class protocol_fzd {
         }\r
 \r
         ICLogger.i("Wifi ap sum "+apsum);\r
-        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP02)).append(CMDSPLIT)\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
@@ -451,871 +401,6 @@ public class protocol_fzd {
 \r
 \r
 \r
-    public static String APXL(String id){\r
-//设备响应:      IWAPXL,080835#\r
-        //080835:指令流水号\r
-        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APXL))\r
-                .append(CMDSPLIT).append(id)\r
-                .append(CMDEND).toString();\r
-    }\r
-\r
-    /**\r
-     * 测量心率\r
-     * @param cmd\r
-     * @param connection\r
-     */\r
-    public void handleBPXL(String cmd, Connection connection){\r
-        //IWBPXL,353456789012345,080835#\r
-        //说明:\r
-        //IW:标识符\r
-        //BPXL : 命令字符\r
-        //353456789012345:IMEI号,设备唯一ID\r
-        //080835 :指令流水号\r
-        //设备响应:      IWAPXL,080835#\r
-        //080835:指令流水号\r
-        String[] list=cmd.split(CMDSPLIT);\r
-        if (list.length==3){\r
-            String index=list[2];\r
-            String imei=list[1];\r
-            ICLogger.i("Handle BPXL IMEI "+imei+",index "+index);\r
-            connection.send(genStringMessage("APXL",APXL(index)));\r
-        }else{\r
-            ICLogger.i("BPXL format error!");\r
-        }\r
-\r
-    }\r
-\r
-    public static String APXY(String id){\r
-//设备响应:      IWAPXY,080835#\r
-        //080835:指令流水号\r
-        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APXY))\r
-                .append(CMDSPLIT).append(id)\r
-                .append(CMDEND).toString();\r
-    }\r
-\r
-    /**\r
-     * 测量血压\r
-     * @param cmd\r
-     * @param connection\r
-     */\r
-    public void handleBPXY(String cmd,Connection connection){\r
-        //IWBPXY,353456789012345,080835#\r
-        //说明:\r
-        //IW:标识符\r
-        //BPXL : 命令字符\r
-        //353456789012345:IMEI号,设备唯一ID\r
-        //080835 :指令流水号\r
-        //设备响应:      IWAPXY,080835#\r
-        //080835:指令流水号\r
-        String[] list=cmd.split(CMDSPLIT);\r
-        if (list.length==3){\r
-            String index=list[2];\r
-            String imei=list[1];\r
-            ICLogger.i("Handle BPXY IMEI "+imei+",index "+index);\r
-            connection.send(genStringMessage("APXY",APXY(index)));\r
-        }else{\r
-            ICLogger.i("BPXY format error!");\r
-        }\r
-\r
-    }\r
-\r
-\r
-\r
-    public static String 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 new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APJZ))\r
-                .append(CMDSPLIT).append(id)\r
-                .append(CMDSPLIT).append(BPH)\r
-                .append(CMDSPLIT).append(BPL)\r
-                .append(CMDSPLIT).append(Age)\r
-                .append(CMDSPLIT).append(Sex)\r
-                .append(CMDEND).toString();\r
-    }\r
-\r
-    /**\r
-     *\r
-     * @param cmd\r
-     * @param connection\r
-     * @param runtime\r
-     */\r
-    public void handleBPJZ(String cmd,Connection connection,Runtime runtime){\r
-        //cmdbuf.size 42 IWBPJZ,867155030001063,199600,120,85,45,1#   高压120,低压85,年龄45,男性\r
-//        cmdbuf.size 42 IWBPJZ,867155030001063,909957,120,85,42,0#  高压120,低压85,年龄42,女性\r
-        //IWBPJZ,353456789012345,080835,110,75#\r
-        //说明:\r
-        //IW:标识符\r
-        //BPJZ : 命令字符\r
-        //353456789012345:IMEI号,设备唯一ID\r
-        //110:高压值\r
-        //75:低压值\r
-        //080835 :指令流水号\r
-        //设备响应:      IWAPJZ,792997,120,85,42,1#\r
-        //792997:指令流水号\r
-        String[] list=cmd.split(CMDSPLIT);\r
-        if (list.length==7){\r
-            String index=list[2];\r
-            String imei=list[1];\r
-            String strBPH=list[3];\r
-            String strBPL=list[4];\r
-            String strAge=list[5];\r
-            String strSex=list[6];\r
-\r
-            connection.send(genStringMessage("APJZ",APJZ(index,strBPH,strBPL,strAge,strSex)));\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
-        }else{\r
-            ICLogger.i("BPXY format error!");\r
-        }\r
-    }\r
-\r
-\r
-\r
-    //重启\r
-\r
-\r
-    public static String AP18(String index){\r
-        return 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(genStringMessage("AP18",AP18(cmdlist[2])));\r
-\r
-        }\r
-    }\r
-    //恢复出厂设置\r
-\r
-    public static String AP17(String index){\r
-        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP17))\r
-                .append(CMDSPLIT).append(index)\r
-                .append(CMDEND).toString();\r
-    }\r
-    public void handleBP17(Connection connection,String cmd) {\r
-\r
-        //    IWBP17,867155030001063,161723\r
-        String[] cmdlist=cmd.split(CMDSPLIT);\r
-        if (cmdlist.length==3) {\r
-\r
-            connection.send(genStringMessage("AP17",AP17(cmdlist[2])));\r
-\r
-        }\r
-    }\r
-\r
-    //关机\r
-\r
-\r
-    public static String AP31(String index){\r
-        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP31))\r
-                .append(CMDSPLIT).append(index)\r
-                .append(CMDEND).toString();\r
-    }\r
-    public void handleBP31(Connection connection,String cmd) {\r
-\r
-        //    IWBP31,867155030001063,161723\r
-        String[] cmdlist=cmd.split(CMDSPLIT);\r
-        if (cmdlist.length==3) {\r
-\r
-            connection.send(genStringMessage("AP31",AP31(cmdlist[2])));\r
-\r
-        }\r
-    }\r
-\r
-    //设置SOS号码\r
-    public static String AP12(String index,String phNum1,String phNum2,String phNum3){\r
-        return 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(genStringMessage("AP12",AP12(index,phNum1,phNum2,phNum3)));\r
-\r
-            ArrayList<Contact> contactArray=new ArrayList<Contact>();\r
-            if (!phNum1.isEmpty())  contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos1",phNum1));\r
-            if (!phNum2.isEmpty())  contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos2",phNum2));\r
-            if (!phNum3.isEmpty())  contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos3",phNum3));\r
-\r
-            runtime.getDbHelper().saveContacts(contactArray,false,false,false,false,false,true);\r
-\r
-        }else{\r
-            ICLogger.i(" BP12 format error!");\r
-        }\r
-    }\r
-\r
-\r
-    public static String  AP14(String index,String[] phnumbs){\r
-        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP14))\r
-                .append(CMDSPLIT).append(index)\r
-                .append(CMDSPLIT).append(phnumbs[0])\r
-                .append(CMDSPLIT).append(phnumbs[1])\r
-                .append(CMDSPLIT).append(phnumbs[2])\r
-                .append(CMDSPLIT).append(phnumbs[3])\r
-                .append(CMDSPLIT).append(phnumbs[4])\r
-                .append(CMDSPLIT).append(phnumbs[5])\r
-                .append(CMDSPLIT).append(phnumbs[6])\r
-                .append(CMDSPLIT).append(phnumbs[7])\r
-                .append(CMDSPLIT).append(phnumbs[8])\r
-                .append(CMDSPLIT).append(phnumbs[9])\r
-                .append(CMDEND).toString();\r
-    }\r
-    //设置通讯录,白名单(10个)\r
-    public void handleBP14(Connection connection,String cmd , Runtime runtime){\r
-//        IWBP14,867155030001063,357444,9b44529b|13554820016,,,,,,,,,\r
-/**\r
- * IWBP14,353456789012345,080835,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx#\r
- */\r
-        String[] cmdlist=cmd.split(CMDSPLIT);\r
-        String[] phnums=new String[]{"","","","","","","","","",""};\r
-        StringBuffer sb=new StringBuffer().append("recv phone Numbs ");\r
-        if (cmdlist.length>=3){\r
-            switch (cmdlist.length){\r
-                case 13:\r
-                    phnums[9]=cmdlist[12];\r
-                    sb.append(phnums[9]).append(",");\r
-                case 12:\r
-                    phnums[8]=cmdlist[11];\r
-                    sb.append(phnums[8]).append(",");\r
-                case 11:\r
-                    phnums[7]=cmdlist[10];\r
-                    sb.append(phnums[7]).append(",");\r
-                case 10:\r
-                    phnums[6]=cmdlist[9];\r
-                    sb.append(phnums[6]).append(",");\r
-                case 9:\r
-                    phnums[5]=cmdlist[8];\r
-                    sb.append(phnums[5]).append(",");\r
-                case 8:\r
-                    phnums[4]=cmdlist[7];\r
-                    sb.append(phnums[4]).append(",");\r
-                case 7:\r
-                    phnums[3]=cmdlist[6];\r
-                    sb.append(phnums[3]).append(",");\r
-                case 6:\r
-                    phnums[2]=cmdlist[5];\r
-                    sb.append(phnums[2]).append(",");\r
-                case 5:\r
-                    phnums[1]=cmdlist[4];\r
-                    sb.append(phnums[1]).append(",");\r
-                case 4:\r
-                    phnums[0]=cmdlist[3];\r
-                    sb.append(phnums[0]).append(",");\r
-\r
-            }\r
-\r
-            String index=cmdlist[2];\r
-            ICLogger.i(sb.toString());\r
-            connection.send(genStringMessage("AP14",AP14(index,phnums)));\r
-            ArrayList<Contact> contactArray=new ArrayList<Contact>();\r
-            for (int i=0; i< phnums.length;i++){\r
-                String[] tmp= phnums[i].split("\\|");\r
-                if (tmp.length==2){\r
-                    String name= Util.decodeUnicode2Utf8(tmp[0]);\r
-                    String phonem=tmp[1];\r
-                    ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length+" , name="+name+",-"+phonem);\r
-                    contactArray.add(new Contact(Contact.CATEGORY_CALL,name,phonem));\r
-                }else{\r
-                    ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length);\r
-\r
-                }\r
-            }\r
-//            contactArray.add(new Contact(Contact.CATEGORY_GROUP,"All","666"));\r
-//            contactArray.add(new Contact(Contact.CATEGORY_PARTNER,"PARTNER","666"));\r
-//            contactArray.add(new Contact(Contact.CATEGORY_CARE,"CARE","666"));\r
-//            contactArray.add(new Contact(Contact.CATEGORY_VOLTE,"VOLTE","666"));\r
-\r
-            runtime.getDbHelper().saveContacts(contactArray,false,false,true,false,false,false);\r
-\r
-        }else{\r
-            ICLogger.i(" BP14 format error!");\r
-        }\r
-\r
-    }\r
-\r
-\r
-\r
-    public static String AP85(Runtime ds,String cmddata){\r
-//示例数据:IWAP49,68##\r
-        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP85))\r
-                .append(CMDSPLIT).append(cmddata)\r
-                .append(CMDEND).toString();\r
-\r
-    }\r
-    //设置闹钟\r
-    public void handleBP85(String cmd , Connection connection,Runtime runtime){\r
-//        IWBP85,867155030001063,155312,1,1,0235,12,1,1\r
-//        IWBP85,867155030002145,945166,1,0,\r
-//        IWBP85,867155030001064,265960,1,1,1130,,1,1\r
-//        IWBP85,353456789012345,080835,1,3, 0900,135,1,1@0900 ,135,1,2@0900 ,135,1,3#\r
-//353456789012345:IMEI号,设备唯一ID\r
-//080835 :指令流水号\r
-//1: 表示闹钟总开关,1为开,0 为关\r
-//3: 表示闹钟个数\r
-//0900 ,135,1,1,表示一组闹钟,0900表示早上09:00, 135表示周一周三周五,使用24小时制\r
-//1表示该组闹钟开启或关闭状态   1表示开启  0表示关闭\r
-//1表示吃药提醒\r
-//2 表示喝水提醒\r
-//3 表示久坐提醒\r
-//多组闹钟之间用”@”符号分隔\r
-\r
-        String imei="",cmdindex="0"/*指令流水号*/;\r
-        int     all_alarmswitch=0 /*总开关 1为开,0 为关*/,\r
-                alarmswitch=0 /*1为开,0 为关*/,\r
-                alarmcount=0 /*表示闹钟个数*/;\r
-        String alarmtime="";//0900表示早上09:00\r
-        int alarmtype=1; //1表示吃药提醒 , 2 表示喝水提醒 ,3 表示久坐提醒\r
-        String repeat="";// 135表示周一周三周五,使用24小时制\r
-        String[] datalist= cmd.split("@");\r
-        ArrayList<Alarm> alarmlist=new ArrayList<>();\r
-        if (datalist.length >0){\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
-\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(genStringMessage("AP85",AP85(runtime,replycmd)));\r
-    }\r
-\r
-\r
-// AP05命令L02服务器不适用\r
-//    public static String AP05(boolean recvFlag){\r
-//\r
-////        IWAP05,1#\r
-//        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP05))\r
-//                .append(CMDSPLIT).append(recvFlag?1:0)\r
-//                .append(CMDEND).toString();\r
-//\r
-//    }\r
-//\r
-//\r
-//    public void handleBP05(String cmd){\r
-////        IWBP05,6#\r
-//        String[] cmdlist=cmd.split(CMDSPLIT);\r
-//        if (cmdlist.length>1){\r
-//            ICLogger.i(" 服务器有 " +cmdlist[1]+" 条语音未接收!");\r
-//        }\r
-//    }\r
-\r
-\r
-\r
-\r
-    public static byte[] AP07(String  packetTime,int count,int index,int datalen,byte[] amrdata){\r
-//IWAP07,20140818064408,6,1,1024,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#\r
-//说明:\r
-//IW:标识符\r
-//AP07 : 命令字符\r
-//20140818064408 :yyyyMMddHHmmss 格式的年月日时分秒,设备录音时间\r
-//6:语音包分包总数\r
-//1 :当前包数,第一包为1,第二包为2,。。。。。。同一个语音包的语音时间相同\r
-//1024 :语音包长度\r
-//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:当前音频数据, 每个音频数据包大小为1024字节,最后一包不足1024的取实际字节数\r
-//语音包上传规则:\r
-//按包次序依次上传,上传后如果没有收到服务器的响应包,则继续上传该语音包。\r
-//收到设备回复确认数据包接收成功状态后,继续开始依次上传下一个数据包。。。。。。\r
-//如果设备回复确认数据包接收失败状态,则重复发送上一个数据包\r
-\r
-\r
-        String sb=new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP07))\r
-                .append(CMDSPLIT).append(packetTime)\r
-                .append(CMDSPLIT).append(count)\r
-                .append(CMDSPLIT).append(index)\r
-                .append(CMDSPLIT).append(datalen)\r
-                .append(CMDSPLIT).toString();\r
-\r
-        byte[] sentbuf=new byte[sb.length()+datalen+1];\r
-        System.arraycopy(sb.getBytes(),0,sentbuf,0,sb.length());\r
-        System.arraycopy(amrdata,0,sentbuf,sb.length(),datalen);\r
-        sentbuf[sb.length()+datalen]='#';\r
-\r
-        return sentbuf;\r
-\r
-    }\r
-\r
-\r
-    public void handleBP07(String cmd , NettyConnection 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
-            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("BP07","SentVoicePacket");\r
-\r
-        }else{\r
-            ICLogger.i(" BP07 Format error!");\r
-        }\r
-    }\r
-\r
-\r
-\r
-    public static String AP33(String cmdindex,int workMode){\r
-//IWAP33,080835,1#\r
-//080835:指令流水号\r
-//1:设置信息,供服务器同步\r
-        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP33))\r
-                .append(CMDSPLIT).append(cmdindex)\r
-                .append(CMDSPLIT).append(workMode)\r
-                .append(CMDEND).toString();\r
-    }\r
-\r
-    //设置工作模式\r
-    public void handleBP33(Connection connection,Runtime runtime,String cmd){\r
-\r
-//    IWBP33,867155030001063,560555,1\r
-//        IW:标识符\r
-//        BP33 : 命令字符\r
-//        353456789012345:IMEI号,设备唯一ID\r
-//        080835:指令流水号\r
-//        1:设备工作模式,1:正常模式,2:省电模式,3:紧急模式\r
-\r
-        String[] cmdlist=cmd.split(",");\r
-        if (cmdlist.length == 4){\r
-\r
-\r
-            log("work mode "+cmdlist[3]);\r
-            int mod=Integer.parseInt(cmdlist[3]);\r
-            int Cycle=900;\r
-            switch(mod){\r
-                case ICLocation.NORMAL_MOD:\r
-                    Cycle=900;\r
-                    break;\r
-                case ICLocation.LOWPOWER_MOD:\r
-                    Cycle=3600;\r
-                    break;\r
-                case ICLocation.EMERGNECY_MOD:\r
-                case ICLocation.REALTIME_MOD:\r
-                    Cycle=60;\r
-                    break;\r
-\r
-            }\r
-\r
-            String msg=AP33(cmdlist[2],mod);\r
-            //设定当前工作模式及循环频率\r
-            connection.send(genStringMessage("AP33",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
-        }\r
-\r
-    }\r
-\r
-\r
-    public static String AP34(String cmdindex,int workMode){\r
-//IWAP34,588854,1#\r
-//080835:指令流水号\r
-//8:模式\r
-        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP34))\r
-                .append(CMDSPLIT).append(cmdindex)\r
-                .append(CMDSPLIT).append(workMode)\r
-                .append(CMDEND).toString();\r
-    }\r
-\r
-    //设置自定义工作模式\r
-    public void handleBP34(Connection connection,Runtime runtime,String cmd){\r
-\r
-//    IWBP34,867155030001063,588854,8,900,1#\r
-//        IW:标识符\r
-//        BP33 : 命令字符\r
-//        353456789012345:IMEI号,设备唯一ID\r
-//        080835:指令流水号\r
-//        1:设备工作模式,1:正常模式,2:省电模式,3:紧急模式\r
-\r
-        String[] cmdlist=cmd.split(",");\r
-        if (cmdlist.length == 6){\r
-\r
-\r
-            log("work mode "+cmdlist[3]);\r
-            int mod=Integer.parseInt(cmdlist[3]);\r
-            int Cycle=Integer.parseInt(cmdlist[4]);\r
-            int gpson=Integer.parseInt(cmdlist[5]);\r
-\r
-            String msg=AP34(cmdlist[2],mod);\r
-            //设定当前工作模式及循环频率\r
-            connection.send(genStringMessage("AP34",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
-        }\r
-\r
-    }\r
-\r
-    /**\r
-     * 心率上传,返回协议字串\r
-     * @param ds\r
-     * @return\r
-     */\r
-    public static String AP49(Runtime ds){\r
-        //示例数据:IWAP49,68##\r
-        return 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
-     * 返回上传心率血压的协议字串\r
-     * @param ds\r
-     * @return\r
-     */\r
-    public static String APHT(Runtime ds){\r
-        //IWAPHT,60,130,85#\r
-        //说明:\r
-        //IW:标识符\r
-        //APHT : 命令字符\r
-        //60 : 表示心率\r
-        //130: 血压高压 [收缩压]\r
-        //85 : 血压低压 [舒张压]\r
-        //平台响应:      IWBPHT#\r
-        //表示平台已接收,可不作响应\r
-        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APHT))\r
-                .append(CMDSPLIT).append(ds.getHRS().getPPG())\r
-                .append(CMDSPLIT).append(ds.getHRS().getBPH())\r
-                .append(CMDSPLIT).append(ds.getHRS().getBPL())\r
-                .append(CMDEND).toString();\r
-    }\r
-    public static String 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 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 String AP16(String  cmdindex){\r
-//IWAP16,080835#\r
-//080835:指令流水号\r
-        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP16))\r
-                .append(CMDSPLIT).append(cmdindex)\r
-                .append(CMDEND).toString();\r
-    }\r
-    //    立即定位指令(长链接有效)\r
-    public void handleBP16(Connection connection,Runtime runtime,String cmd){\r
-        //示例数据:IWBP16,867155030001063,335386\r
-//        IWBP16,353456789012345,080835#\r
-//        说明:\r
-//        IW:标识符\r
-//        BP16 : 命令字符\r
-//        353456789012345:IMEI号,设备唯一ID\r
-//        080835 :指令流水号\r
-        String[] cmdlist = cmd.split(",");\r
-        if(cmdlist.length==3){\r
-            log("imei "+cmdlist[1]+", cmdindex "+cmdlist[2]);\r
-\r
-            connection.send(genStringMessage("AP16",AP16(cmdlist[2])));\r
-        }else{\r
-            log("error BP16 format");\r
-        }\r
-    }\r
-\r
-\r
-    /*通过基站获取时间和坐标*/\r
-    public static String 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 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 String AP15(String index){\r
-//IWAP15, 080835#\r
-//080835:指令流水号\r
-        return 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
-            String index=list[2];\r
-            String time=list[3];\r
-            connection.send(genStringMessage("AP15",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
-        }else{\r
-            ICLogger.i("BP15 format error");\r
-        }\r
-\r
-    }\r
-\r
-\r
-\r
-\r
-\r
-\r
-    /*语音下行反馈*/\r
-    public static String AP28(String name, String msg, int packagecount, int currentpackageindex, int received_success) {\r
-        //示例数据:IWAP28,D3590D54,xxxx,6,1,1#\r
-        return 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(NettyConnection 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
-            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(genStringMessage("AP28",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
-\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
-\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
@@ -1328,130 +413,6 @@ public class protocol_fzd {
         dev.getContextProxy().context.startActivity(intent);\r
     }\r
 \r
-    //白名单开关(下行协议号:BP84,响应:AP84)\r
-    public static String AP84(String index,int success){\r
-\r
-        //设备响应:      IWAP80,080835,1#\r
-        //080835:指令流水号\r
-        //1:表示设备执行成功,0 表示设备执行失败\r
-        return 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(genStringMessage("AP84",AP84(index,1)));\r
-\r
-            if (whitelist_switch.equals("1")){\r
-                Util.setSystemProperties("persist.sys.whitelist.enable","true");\r
-            }else{\r
-                Util.setSystemProperties("persist.sys.whitelist.enable","false");\r
-            }\r
-            ICLogger.i("收到服务器指令:白名单"+(whitelist_switch.equals("1")?"开":"关"));\r
-\r
-        }else{\r
-\r
-            ICLogger.i("BP84 format error!");\r
-        }\r
-\r
-    }\r
-\r
-    //17.设置心率/血压测量周期(下行协议号:BP86,响应:AP86)\r
-    public static String AP86(String index){\r
-\r
-        //设备响应:      IWAP86, 080835#\r
-        //080835:指令流水号\r
-        return 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
-            String index=list[2];\r
-            String type=list[3];\r
-            String cycle=list[4];\r
-            connection.send(genStringMessage("AP86",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
-        }else{\r
-            ICLogger.i("BP86 format error!");\r
-        }\r
-\r
-    }\r
-\r
-    //18.18.设置心率/血压阀值(下行协议号:BP89,响应:AP89)\r
-    public static String AP89(String index){\r
-\r
-        //设备响应:      IWAP89, 080835#\r
-        //080835:指令流水号\r
-        return 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(genStringMessage("AP89",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
     public boolean handleCmd(CMD_TYPE type, String cmd) {\r
 \r
         //普通非二进制命令用此函数处理\r
@@ -1459,135 +420,206 @@ public class protocol_fzd {
         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("BP00",cmd);//通知下面线程状态变化\r
-                break;\r
-            case BP01: //gps定位包\r
-                handleBP01(cmd);\r
-                ICLogger.i("服务器收到定位AP01");\r
-                mConnection.DeliverCMDMessageToSystem("IWAP01",cmd);//通知下面线程状态变化\r
+            case LK: //登录包\r
+                ICLogger.i("服务器收到登录包LK");\r
+                mConnection.DeliverCMDMessageToSystem("login",cmd);//通知下面线程状态变化\r
                 break;\r
-            case BP02:// wifi定位包\r
-                handleBP02(cmd);\r
-                ICLogger.i("服务器收到定位AP02");\r
-                mConnection.DeliverCMDMessageToSystem("IWAP02",cmd);//通知下面线程状态变化\r
-                break;\r
-            case BP03: //心跳包\r
-                handleBP03(cmd);\r
-                ICLogger.i("服务器收到心跳包AP03");\r
-                mConnection.DeliverCMDMessageToSystem("BP03",cmd);//通知下面线程状态变化\r
-                break;\r
-\r
-            case BP07:\r
-                //收到发送的语音包\r
-                handleBP07(cmd,mConnection);\r
-                break;\r
-            case BP10:\r
-                //报警包\r
-                mConnection.DeliverCMDMessageToSystem("IWAP10",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
+            case KA:\r
+//                                handleBP03(cmd);\r
+                ICLogger.i("服务器收到心跳包KA");\r
+                mConnection.DeliverCMDMessageToSystem("heartbeat",cmd);//通知下面线程状态变化\r
                 break;\r
 \r
-            case BPXL:\r
-                handleBPXL(cmd,mConnection);\r
-                ICLogger.i("收到服务器心率检测命令");\r
-                HeartRateManager.triggerPPGtest();\r
-                break;\r
-            case BPXY:\r
-                handleBPXY(cmd,mConnection);\r
-                ICLogger.i("收到服务器血压检测命令");\r
-                HeartRateManager.triggerPPGtest();\r
-                break;\r
-            case BPJZ:\r
-                handleBPJZ(cmd,mConnection,mRuntime);\r
-                ICLogger.i("收到服务器血压校准命令");\r
-                break;\r
-            case BPHT:\r
-                ICLogger.i("服务器收到上传的心率血压");\r
-                break;\r
-            case BP84:\r
-                handleBP84(cmd,mConnection);\r
-                ICLogger.i("收到服务器白名单命令");\r
+            case PING:\r
+                handlePing(mRuntime,cmd);\r
+                ICLogger.i("服务器返回Ping绑定信息");\r
                 break;\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
+//                HeartRateManager.triggerPPGtest();\r
+//                break;\r
+//            case BPXY:\r
+//                handleBPXY(cmd,mConnection);\r
+//                ICLogger.i("收到服务器血压检测命令");\r
+//                HeartRateManager.triggerPPGtest();\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("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
-            case BP86:\r
-                //心率血压周期设置\r
-                handleBP86(cmd,mConnection,mRuntime);\r
-//                                ICLogger.i("");\r
-                break;\r
-            case BP89:\r
-                //心率/血压阀值\r
-                handleBP89(cmd,mConnection);\r
-                break;\r
         }\r
 \r
         return ret;\r
@@ -1603,8 +635,8 @@ public class protocol_fzd {
         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
+            case LK:\r
+            //    handleBP28(mConnection,cmd, mRuntime,bytes);\r
                 ICLogger.i("收到服务器语音BP28");\r
                 mConnection.DeliverCMDMessageToSystem("BP28", "");//通知下面线程状态变化\r
                 break;\r
index 041ca16..f7cd176 100644 (file)
@@ -226,18 +226,30 @@ public class protocol_ic {
     private StringBuffer cmdbuf = new StringBuffer();\r
 \r
     /*\r
-    输入的字符串,如果有完整命令,返回 true\r
-    否则返回 false\r
+    输入的字符串,如果有完整命令,返回 命令名\r
+    否则返回 空字符串\r
      */\r
-    public boolean isCmdStr(String msg) {\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
-                return true;\r
+            if (end_index < 0) {\r
+\r
+                return "";\r
             }\r
+        }else{\r
+            return "";\r
         }\r
-        return false;\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
@@ -986,7 +998,7 @@ public class protocol_ic {
                 voicePacket.getInstanceSent().setCurrentIndexToSent(packetIndex);\r
             }\r
             //发送消息,再次检查要发送的语音包,确认其发送完毕\r
-            connection.DeliverCMDMessageToSystem("BP07","SentVoicePacket");\r
+            connection.DeliverCMDMessageToSystem("SentVoicePacket","SentVoicePacket");\r
 \r
         }else{\r
             ICLogger.i(" BP07 Format error!");\r
@@ -1950,25 +1962,22 @@ public class protocol_ic {
          * 收到设备回复确认数据包接收成功状态后,继续开始依次上传下一个数据包。。。。。。\r
          * 如果设备回复确认数据包接收失败状态,则重复发送上一个数据包\r
          */\r
-\r
-\r
-        String sb=new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP07))\r
-                .append(CMDSPLIT).append(6654111)\r
+        String sb=new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTU))\r
+                .append(CMDSPLIT)\r
                 .append(CMDSPLIT).append(packetTime)\r
                 .append(CMDSPLIT).append(filetype)\r
                 .append(CMDSPLIT).append(datatype)\r
                 .append(CMDSPLIT).append(count)\r
                 .append(CMDSPLIT).append(index)\r
-                .append(CMDSPLIT).append(datalen)\r
+                .append(CMDSPLIT).append(datalen*2)\r
                 .append(CMDSPLIT).toString();\r
 \r
-        byte[] sentbuf=new byte[sb.length()+datalen+1];\r
+        byte[] sentbuf=new byte[sb.length()+datalen*2+1];\r
+        byte[] amrdata2=Util.bytesToHexString(amrdata).getBytes();\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
+        System.arraycopy(amrdata2,0,sentbuf,sb.length(),datalen*2);\r
+        sentbuf[sb.length()+datalen*2]='#';\r
         return sentbuf;\r
-\r
     }\r
 \r
 \r
@@ -2005,7 +2014,7 @@ public class protocol_ic {
                 voicePacket.getInstanceSent().setCurrentIndexToSent(packetIndex);\r
             }\r
             //发送消息,再次检查要发送的语音包,确认其发送完毕\r
-            connection.DeliverCMDMessageToSystem("BPTU","SentBPFilePacket");\r
+            connection.DeliverCMDMessageToSystem("SentVoicePacket","SentBPFilePacket");\r
 \r
         }else{\r
             ICLogger.i(" BPTU Format error!");\r
@@ -2025,22 +2034,22 @@ public class protocol_ic {
             case BP00: //登录包\r
                 handleBP00(mRuntime,cmd);\r
                 ICLogger.i("服务器收到登录包AP00");\r
-                mConnection.DeliverCMDMessageToSystem("BP00",cmd);//通知下面线程状态变化\r
+                mConnection.DeliverCMDMessageToSystem("login",cmd);//通知下面线程状态变化\r
                 break;\r
             case BP01: //gps定位包\r
                 handleBP01(cmd);\r
                 ICLogger.i("服务器收到定位AP01");\r
-                mConnection.DeliverCMDMessageToSystem("IWAP01",cmd);//通知下面线程状态变化\r
+                mConnection.DeliverCMDMessageToSystem("AP01",cmd);//通知下面线程状态变化\r
                 break;\r
             case BP02:// wifi定位包\r
                 handleBP02(cmd);\r
                 ICLogger.i("服务器收到定位AP02");\r
-                mConnection.DeliverCMDMessageToSystem("IWAP02",cmd);//通知下面线程状态变化\r
+                mConnection.DeliverCMDMessageToSystem("AP02",cmd);//通知下面线程状态变化\r
                 break;\r
             case BP03: //心跳包\r
                 handleBP03(cmd);\r
                 ICLogger.i("服务器收到心跳包AP03");\r
-                mConnection.DeliverCMDMessageToSystem("BP03",cmd);//通知下面线程状态变化\r
+                mConnection.DeliverCMDMessageToSystem("heartbeat",cmd);//通知下面线程状态变化\r
                 break;\r
 \r
             case BP07:\r
@@ -2049,7 +2058,7 @@ public class protocol_ic {
                 break;\r
             case BP10:\r
                 //报警包\r
-                mConnection.DeliverCMDMessageToSystem("IWAP10",cmd);//通知下面线程状态变化\r
+                mConnection.DeliverCMDMessageToSystem("AP10",cmd);//通知下面线程状态变化\r
                 break;\r
 \r
             case BPTM:\r
@@ -2142,7 +2151,7 @@ public class protocol_ic {
                 break;\r
             case BPHT:\r
                 ICLogger.i("服务器收到上传的心率血压");\r
-                mConnection.DeliverCMDMessageToSystem("IWAPHT",cmd);//通知下面线程状态变化\r
+                mConnection.DeliverCMDMessageToSystem("APHT",cmd);//通知下面线程状态变化\r
                 break;\r
             case BP84:\r
                 handleBP84(cmd,mConnection);\r
@@ -2164,17 +2173,17 @@ public class protocol_ic {
             case BP89:\r
                 //心率/血压阀值\r
                 handleBP89(cmd,mConnection);\r
-                mConnection.DeliverCMDMessageToSystem("IWAP89",cmd);//通知下面线程状态变化\r
+                mConnection.DeliverCMDMessageToSystem("AP89",cmd);//通知下面线程状态变化\r
                 break;\r
 \r
             case BPTE: //设置测试体温\r
                 handleBPTE(cmd,mConnection,mRuntime);\r
-                mConnection.DeliverCMDMessageToSystem("IWAPTE",cmd);//通知下面线程状态变化\r
+                mConnection.DeliverCMDMessageToSystem("APTE",cmd);//通知下面线程状态变化\r
                 break;\r
 \r
             case BPTP:\r
                 handleBPTP();\r
-                mConnection.DeliverCMDMessageToSystem("IWAPTP",cmd);//通知下面线程状态变化\r
+                mConnection.DeliverCMDMessageToSystem("APTP",cmd);//通知下面线程状态变化\r
                 break;\r
             case BPHP:\r
                 handleBPHP();\r
@@ -2183,29 +2192,29 @@ public class protocol_ic {
             case BPX1://设置 心率血压血氧修正值\r
                 handleBPX1(cmd,mConnection,mRuntime);\r
                 ICLogger.i("收到服务器设置 心率血压血氧修正值BPX1");\r
-                mConnection.DeliverCMDMessageToSystem("IWAPX1",cmd);//通知下面线程状态变化\r
+                mConnection.DeliverCMDMessageToSystem("APX1",cmd);//通知下面线程状态变化\r
                 break;\r
 \r
             case BPS4: //提醒设置(时间段) 主要为久坐设置提醒时长。\r
                 handleBPS4(cmd,mConnection,mRuntime);\r
                 ICLogger.i("收到 提醒设置(时间段)");\r
-                mConnection.DeliverCMDMessageToSystem("IWAPS4",cmd);//通知下面线程状态变化\r
+                mConnection.DeliverCMDMessageToSystem("APS4",cmd);//通知下面线程状态变化\r
                 break;\r
             case BPDE:\r
                 handleBPDE(mConnection,cmd,mRuntime);\r
                 ICLogger.i(" 收到 进出围栏通知!");\r
-                mConnection.DeliverCMDMessageToSystem("IWAPDE",cmd);//通知下面线程状态变化\r
+                mConnection.DeliverCMDMessageToSystem("APDE",cmd);//通知下面线程状态变化\r
                 break;\r
 \r
             case BPTU:\r
                 handleBPTU(cmd, mConnection);\r
                 ICLogger.i("收到服务器 图片语音 消息 BPTU");\r
-                mConnection.DeliverCMDMessageToSystem("BPTU", "");//通知下面线程状态变化\r
+            //    mConnection.DeliverCMDMessageToSystem("APTU", "");//通知下面线程状态变化\r
                 break;\r
             case BPDF:\r
                 handleBPDF(mConnection,cmd,mRuntime);\r
                 ICLogger.i(" 收到 体温阈值设置!");\r
-                mConnection.DeliverCMDMessageToSystem("IWAPDF",cmd);//通知下面线程状态变化\r
+                mConnection.DeliverCMDMessageToSystem("APDF",cmd);//通知下面线程状态变化\r
                 break;\r
         }\r
 \r
@@ -2224,7 +2233,7 @@ public class protocol_ic {
             case BP28:\r
                 handleBP28(mConnection,cmd, mRuntime,bytes);\r
                 ICLogger.i("收到服务器语音BP28");\r
-                mConnection.DeliverCMDMessageToSystem("BP28", "");//通知下面线程状态变化\r
+//                mConnection.DeliverCMDMessageToSystem("BP28", "");//通知下面线程状态变化\r
                 break;\r
         }\r
         return ret;\r
index bd72d1f..77a92fe 100644 (file)
@@ -181,20 +181,31 @@ public class protocol_jiai {
     private StringBuffer cmdbuf = new StringBuffer();\r
 \r
     /*\r
-    输入的字符串,如果有完整命令,返回 true\r
-    否则返回 false\r
+    输入的字符串,如果有完整命令,返回 命令名\r
+    否则返回 空字符串\r
      */\r
-    public boolean isCmdStr(String msg) {\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
-                return true;\r
+            if (end_index < 0) {\r
+\r
+                return "";\r
             }\r
+        }else{\r
+            return "";\r
         }\r
-        return false;\r
-    }\r
 \r
+        for (CMD_TYPE key : cmdMap.keySet()) {\r
+            if (msg.startsWith(CMDHEADER + cmdMap.get(key))) {\r
+                ICLogger.i("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key));\r
+                return cmdMap.get(key);\r
+            }\r
+        }\r
+\r
+        return "";\r
+    }\r
     private void log(String msg) {\r
         ICLogger.log(TAG, msg);\r
     }\r
@@ -938,7 +949,7 @@ public class protocol_jiai {
                 voicePacket.getInstanceSent().setCurrentIndexToSent(packetIndex);\r
             }\r
             //发送消息,再次检查要发送的语音包,确认其发送完毕\r
-            connection.DeliverCMDMessageToSystem("BP07","SentVoicePacket");\r
+            connection.DeliverCMDMessageToSystem("SentVoicePacket","SentVoicePacket");\r
 \r
         }else{\r
             ICLogger.i(" BP07 Format error!");\r
@@ -1458,22 +1469,22 @@ public class protocol_jiai {
             case BP00: //登录包\r
                 handleBP00(mRuntime,cmd);\r
                 ICLogger.i("服务器收到登录包AP00");\r
-                mConnection.DeliverCMDMessageToSystem("BP00",cmd);//通知下面线程状态变化\r
+                mConnection.DeliverCMDMessageToSystem("login",cmd);//通知下面线程状态变化\r
                 break;\r
             case BP01: //gps定位包\r
                 handleBP01(cmd);\r
                 ICLogger.i("服务器收到定位AP01");\r
-                mConnection.DeliverCMDMessageToSystem("IWAP01",cmd);//通知下面线程状态变化\r
+                mConnection.DeliverCMDMessageToSystem("AP01",cmd);//通知下面线程状态变化\r
                 break;\r
             case BP02:// wifi定位包\r
                 handleBP02(cmd);\r
                 ICLogger.i("服务器收到定位AP02");\r
-                mConnection.DeliverCMDMessageToSystem("IWAP02",cmd);//通知下面线程状态变化\r
+                mConnection.DeliverCMDMessageToSystem("AP02",cmd);//通知下面线程状态变化\r
                 break;\r
             case BP03: //心跳包\r
                 handleBP03(cmd);\r
                 ICLogger.i("服务器收到心跳包AP03");\r
-                mConnection.DeliverCMDMessageToSystem("BP03",cmd);//通知下面线程状态变化\r
+                mConnection.DeliverCMDMessageToSystem("heartbeat",cmd);//通知下面线程状态变化\r
                 break;\r
 \r
             case BP07:\r
@@ -1482,7 +1493,7 @@ public class protocol_jiai {
                 break;\r
             case BP10:\r
                 //报警包\r
-                mConnection.DeliverCMDMessageToSystem("IWAP10",cmd);//通知下面线程状态变化\r
+                mConnection.DeliverCMDMessageToSystem("AP10",cmd);//通知下面线程状态变化\r
                 break;\r
 \r
             case BPTM:\r