release ICProtocol8.1_V915_2108162337_release.apk
authorsnickersun <snickersun@qq.com>
Mon, 16 Aug 2021 15:38:43 +0000 (23:38 +0800)
committersnickersun <snickersun@qq.com>
Mon, 16 Aug 2021 15:38:43 +0000 (23:38 +0800)
添加RESET指令解析。
增加对不支持指令的处理,防止阻塞。

app/release/ICProtocol8.1_V915_2108162337_release.apk [moved from app/release/ICProtocol8.1_V909_2108140014_release.apk with 77% similarity]
app/release/output.json
app/src/main/java/com/ic/protocolSrv/MainActivity.java
app/src/main/java/com/ic/protocols/protocol_fzd.java
app/version_code.properties
local.properties

similarity index 77%
rename from app/release/ICProtocol8.1_V909_2108140014_release.apk
rename to app/release/ICProtocol8.1_V915_2108162337_release.apk
index 9974f1c..2d3cc3c 100644 (file)
Binary files a/app/release/ICProtocol8.1_V909_2108140014_release.apk and b/app/release/ICProtocol8.1_V915_2108162337_release.apk differ
index 7181bc3..6f15e44 100644 (file)
@@ -1 +1 @@
-[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":913,"versionName":"2108161121","enabled":true,"outputFile":"ICProtocol8.1_V913_2108161121_release.apk","fullName":"release","baseName":"release"},"path":"ICProtocol8.1_V913_2108161121_release.apk","properties":{}}]
\ No newline at end of file
+[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":915,"versionName":"2108162337","enabled":true,"outputFile":"ICProtocol8.1_V915_2108162337_release.apk","fullName":"release","baseName":"release"},"path":"ICProtocol8.1_V915_2108162337_release.apk","properties":{}}]
\ No newline at end of file
index abea3c2..da2a051 100644 (file)
@@ -23,6 +23,7 @@ import com.ic.protocolSrv.utils.ImageUtil;
 import com.ic.protocolSrv.utils.TimeUtil;
 import com.ic.protocolSrv.utils.Util;
 import com.ic.protocolSrv.utils.regexUtil;
+import com.ic.protocols.protocol_fzd;
 
 import java.io.BufferedOutputStream;
 import java.io.File;
@@ -113,16 +114,82 @@ public class MainActivity extends Activity {
 //
 //        ICLogger.i(" lat="+latitude+",lon="+longitude);
 
-        ICLogger.d("DW*860359001000040*0006*PING is "+regexUtil.isFZDCompanyCMD("DW","DW*860359001000040*0006*PING"));
+      //  ICLogger.d("DW*860359001000040*0006*PING is "+regexUtil.isFZDCompanyCMD("DW","DW*860359001000040*0006*PING"));
 
         TextView tv_version=(TextView)findViewById(R.id.textViewVersion);
         tv_version.setText(DeviceInfoUtil.getVersionCode(this)+"-"+DeviceInfoUtil.getVersionName(this));
 //        testpic();
         //AESCipher.test2();
 
-    }
-
+//        String cmdbuf="[IC*860359001000040*0005*RESET][IC*860359001000040*0002*CR][IC*860359001000040*0002*CR][IC*860359001000040*0008*POWEROFF][IC*860359001000040*0002*KA][IC*860359001000040*0002*KA][IC*860359001000040*0002*KA][IC*860359001000040*0002*KA][IC*860359001000040*0002*KA][IC*860359001000040*0002*KA][IC*860359001000040*0002*KA][IC*860359001000040*0002*LK][IC*860359001000040*0002*LK][IC*860359001000040*0002*LK]";
 
+//        parserCmd(cmdbuf.getBytes());
+    }
+    private static final String CMD_HEADER = "[";
+    private static final String CMD_COMPANY = "IC";
+    //    private static final String CMD_COMPANY = "DW";
+    private static final String CMD_END = "]";
+    private static final String CMD_HEADER_SPLIT = "*";
+    private static final String CMD_SPLIT = ",";
+    StringBuffer cmdbuf = new StringBuffer();
+
+    public boolean parserCmd(byte[] bytes) {
+        ICLogger.d("bytes.size " + bytes.length);
+        cmdbuf.append( new String(bytes));
+        ICLogger.d("cmdbuf.size " + cmdbuf.length() + " " + cmdbuf.toString());
+         while( cmdbuf.indexOf(CMD_HEADER)>=0 && cmdbuf.indexOf(CMD_END)>0 ) {
+             String cmd_msgbuf = "";
+             int cmdindexHead = cmdbuf.indexOf(CMD_HEADER);
+             int cmdindexEnd = cmdbuf.indexOf(CMD_END);
+             if (cmdindexEnd > 0 && cmdindexHead >= 0 && cmdindexEnd > cmdindexHead) {
+                 cmd_msgbuf = cmdbuf.substring(cmdindexHead + 1, cmdindexEnd);
+                 //至少属于正常放走丢协议 格式 ,继续进行分析处理
+             } else {
+                 //非放走丢格式可能是数据不全,等下一条信息进来
+                 ICLogger.d("not correct FZD cmd! ");
+                 break;
+             }
+
+//            if (cmdbuf.toString().split(CMD_COMPANY + CMD_HEADER_SPLIT).length > 1) {
+//                ICLogger.d("More than 1 cmd in buffer ! just log it");
+//            }
+             String cmdname = protocol_fzd.isCmdStr(cmd_msgbuf);
+             if (!cmdname.trim().isEmpty()) { //返回为非空,证明是可识别的FZD指令
+                 for (protocol_fzd.CMD_TYPE key : protocol_fzd.cmdMap.keySet()) {
+
+//                     ICLogger.d("key " + protocol_fzd.cmdMap.get(key) + " " + cmdname + " cmdbuf " + cmd_msgbuf);
+                     if (protocol_fzd.cmdMap.get(key).equals(cmdname)) { //如果是FZD命令,则进行处理,否则保留数据动
+
+//                    ICLogger.d("key is == > " + key);
+//                    if (key == CMD_TYPE.TK) {
+//                        handlerGroupChatVoiceContent(totalByte);
+//                    } else if (key == CMD_TYPE.TKOne) {
+//                        handlerOneChatVoiceContent(totalByte);
+//                    } else if (key == CMD_TYPE.TKIMG) {
+//                        handleImage(totalByte);
+//                    }
+//                    else
+                         {
+                             int cmdindexmid = cmd_msgbuf.indexOf(CMD_HEADER_SPLIT + cmdname);
+                             String cmddata = cmd_msgbuf.substring(cmdindexmid + CMD_HEADER_SPLIT.length() + cmdname.length());
+                             if (cmddata.startsWith(CMD_SPLIT)) cmddata = cmddata.substring(1);
+                             ICLogger.d("handleCmd key " + key + " cmdname " + cmdname + " data " + cmddata);
+                             //handleCmd(key, cmdname, cmddata);
+                         }
+                         cmdbuf.delete(0, cmd_msgbuf.length() + 2);//处理后清空
+
+                         break;
+                     }
+                 }
+
+             }else{//走到这里,已经证明是fzd格式,但未找到cmd,说明不支持cmd,跳过处理,这条数据也是必须从buffer里清除的。
+                 ICLogger.d("no cmd found ! skip cmd " + cmd_msgbuf);
+                 cmdbuf.delete(0, cmd_msgbuf.length() + 2);
+             }
+         }
+        ICLogger.d("parserCmd done");
+        return true;
+    }
     private void testBLE(){
         btHelper= BTHelper.CreateInstance(CoreService.getInstance().runtime, new BTHelper.BTScanCallback() {
                     @Override
index 805c3c2..10a3fc4 100644 (file)
@@ -94,7 +94,8 @@ public class protocol_fzd {
     private static final String CMD_HEADER_SPLIT = "*";
     private static final String CMD_SPLIT = ",";
     private static final boolean doEncryption = Util.getSystemProperties("persist.sys.encrypt_fzd", "false").equals("true");
-    public static final String defaultServerIP = "fzd.xcloudtech.com";
+//    public static final String defaultServerIP = "fzd.xcloudtech.com";   //测试服务器
+    public static final String defaultServerIP = "api.xcloudtech.com";  //正式服务器
     public static final int defaultServerPort = 9000;
     private final SharedPreferences sharedPreferences;
     private final Handler mHandler;
@@ -398,6 +399,7 @@ public class protocol_fzd {
         VERNO,//版本查询
         PPR,//解除好友关系
         CR,//定位指令
+        RESET,//重启手表
         POWEROFF,//关机指令
         REMOVE,//取下手环报警开关
         WLKEY,//白名单功能开关
@@ -439,7 +441,7 @@ public class protocol_fzd {
         profile,//情景模式
     }
 
-    private static HashMap<CMD_TYPE, String> cmdMap = null;
+    public static HashMap<CMD_TYPE, String> cmdMap = null;
 
     static {
         cmdMap = new HashMap<>();
@@ -512,6 +514,7 @@ public class protocol_fzd {
         cmdMap.put(CMD_TYPE.TALK, "TALK");
         cmdMap.put(CMD_TYPE.AGTALK, "AGTALK");
         cmdMap.put(CMD_TYPE.CALLING, "CALLING");
+        cmdMap.put(CMD_TYPE.RESET, "RESET");
     }
 
     private Connection mConnection = null;
@@ -571,6 +574,7 @@ public class protocol_fzd {
             String cmd = cmd_msgbuf.substring(0, cmdindex);
             cmd_msgbuf = cmd;
         }
+        ICLogger.d("cmd_msgbuf "+cmd_msgbuf);
         if (regexUtil.isFZDCompanyCMD(CMD_COMPANY,cmd_msgbuf)) {
             for (CMD_TYPE key : cmdMap.keySet()) {
                 if (regexUtil.isFZDCompanyCMD(CMD_COMPANY,cmdMap.get(key), cmd_msgbuf)) { //如果是FZD命令,则进行处理,否则保留数据动
@@ -580,9 +584,14 @@ public class protocol_fzd {
             }
             return "";
         } else
+        {
+//            ICLogger.d("not fzd cmd format !");
             return "";
+        }
+
     }
 
+
     //[6fb043e7f6bb5f107319e3f3822d7124IC*860316012050026*0126*UD,210318,163421,
     // A,33.0227161,N,114.0202817,E,2.98,0.0,0.0,5,039,
     // 095,35,00,0100018,5,1,460,00,18899,190839372,44,18899,
@@ -613,26 +622,31 @@ public class protocol_fzd {
        每个字符串如果发现 #,却又没有Header,“IW”则会被丢弃
         */
     public boolean parserCmd(byte[] bytes) {
-
         ICLogger.d("bytes.size " + bytes.length);
         cmdbuf.append( new String(bytes));
         ICLogger.d("cmdbuf.size " + cmdbuf.length() + " " + cmdbuf.toString());
-
-        while( !isCmdStr(cmdbuf.toString()).isEmpty()) {
+        while( cmdbuf.indexOf(CMD_HEADER)>=0 && cmdbuf.indexOf(CMD_END)>0 ) {
             String cmd_msgbuf = "";
             int cmdindexHead = cmdbuf.indexOf(CMD_HEADER);
             int cmdindexEnd = cmdbuf.indexOf(CMD_END);
-            if (cmdindexEnd > 0 && cmdindexHead >= 0) {
-                cmd_msgbuf = cmdbuf.substring(cmdindexHead+1, cmdindexEnd);
+            if (cmdindexEnd > 0 && cmdindexHead >= 0 && cmdindexEnd > cmdindexHead) {
+                cmd_msgbuf = cmdbuf.substring(cmdindexHead + 1, cmdindexEnd);
+                //至少属于正常放走丢协议 格式 ,继续进行分析处理
+            } else {
+                //非放走丢格式可能是数据不全,等下一条信息进来
+                ICLogger.d("not correct FZD cmd! ");
+                break;
             }
 
 //            if (cmdbuf.toString().split(CMD_COMPANY + CMD_HEADER_SPLIT).length > 1) {
 //                ICLogger.d("More than 1 cmd in buffer ! just log it");
 //            }
-            String cmdname=isCmdStr(cmd_msgbuf);
-            for (CMD_TYPE key : cmdMap.keySet()) {
-//                ICLogger.d("key " + cmdMap.get(key) +" "+cmdname+" cmdbuf " + cmd_msgbuf);
-                if (cmdMap.get(key).equals(cmdname)) { //如果是FZD命令,则进行处理,否则保留数据动
+            String cmdname = protocol_fzd.isCmdStr(cmd_msgbuf);
+            if (!cmdname.trim().isEmpty()) { //返回为非空,证明是可识别的FZD指令
+                for (protocol_fzd.CMD_TYPE key : protocol_fzd.cmdMap.keySet()) {
+
+//                     ICLogger.d("key " + protocol_fzd.cmdMap.get(key) + " " + cmdname + " cmdbuf " + cmd_msgbuf);
+                    if (protocol_fzd.cmdMap.get(key).equals(cmdname)) { //如果是FZD命令,则进行处理,否则保留数据动
 
 //                    ICLogger.d("key is == > " + key);
 //                    if (key == CMD_TYPE.TK) {
@@ -643,19 +657,27 @@ public class protocol_fzd {
 //                        handleImage(totalByte);
 //                    }
 //                    else
-                    {
+                        {
+                            int cmdindexmid = cmd_msgbuf.indexOf(CMD_HEADER_SPLIT + cmdname);
+                            String cmddata = cmd_msgbuf.substring(cmdindexmid + CMD_HEADER_SPLIT.length() + cmdname.length());
+                            if (cmddata.startsWith(CMD_SPLIT)) cmddata = cmddata.substring(1);
+//                            ICLogger.d("handleCmd key " + key + " cmdname " + cmdname + " data " + cmddata);
+                            handleCmd(key, cmdname, cmddata);
+                        }
+                        cmdbuf.delete(0, cmd_msgbuf.length() + 2);//处理后清空
 
-                        handleCmd(key, cmdname, cmd_msgbuf);
+                        break;
                     }
-                    cmdbuf.delete(0, cmd_msgbuf.length()+2);//处理后清空
-                    break;
                 }
+
+            }else{//走到这里,已经证明是fzd格式,但未找到cmd,说明不支持cmd,跳过处理,这条数据也是必须从buffer里清除的。
+                ICLogger.d("no cmd found ! skip cmd " + cmd_msgbuf);
+                cmdbuf.delete(0, cmd_msgbuf.length() + 2);
             }
         }
         ICLogger.d("parserCmd done");
         return true;
     }
-
     /**
      * 图片下发
      *
@@ -1286,6 +1308,13 @@ public class protocol_fzd {
     public void handlePOWEROFF(Connection connection) {
         connection.send(POWEROFF());
     }
+    public static StringMessage RESET() {
+        return genFZDCMD(cmdMap.get(CMD_TYPE.RESET));
+    }
+
+    public void handleRESET(Connection connection) {
+        connection.send(RESET());
+    }
 
     public static StringMessage CR() {
         return genFZDCMD(cmdMap.get(CMD_TYPE.CR));
@@ -1600,6 +1629,13 @@ public class protocol_fzd {
                 ICLogger.i("收到服务器设置白名单号码命令PHL");
                 handlePHL(mConnection, mRuntime, cmd, data);
                 break;
+            case RESET:
+                //收到重启指令
+                handleRESET(mConnection);
+                ICLogger.i("收到服务器重启命令RESET");
+                //通知下面线程状态变化
+                mConnection.DeliverCMDMessageToSystem("Reboot", cmd);
+                break;
             case POWEROFF:
                 //收到关机
                 handlePOWEROFF(mConnection);
index bd68068..d237a80 100644 (file)
@@ -1,2 +1,2 @@
-#Mon Aug 16 11:21:47 CST 2021\r
-VERSION_CODE=913\r
+#Mon Aug 16 23:37:10 CST 2021\r
+VERSION_CODE=915\r
index db57af9..25ace50 100644 (file)
@@ -4,5 +4,5 @@
 # Location of the SDK. This is only used by Gradle.\r
 # For customization when using a Version Control System, please read the\r
 # header note.\r
-#Thu Jul 22 07:04:36 CST 2021\r
-sdk.dir=C\:\\Users\\incar\\AppData\\Local\\Android\\Sdk\r
+#Fri Aug 13 23:14:24 CST 2021\r
+sdk.dir=D\:\\Android\\Sdk\r