protocol mqtt
authorsnickersun <snickersun@qq.com>
Mon, 31 Aug 2020 23:58:40 +0000 (07:58 +0800)
committersnickersun <snickersun@qq.com>
Mon, 31 Aug 2020 23:58:40 +0000 (07:58 +0800)
完成协议YG-WBG100 蓝牙GPS手表通讯协议_v1.2 指定的所有功能解析。

app/src/main/java/com/enqualcomm/support/bean/Runtime.java
app/src/main/java/com/ic/protocols/protocol_mqtt.java

index 945a99f..fd68618 100644 (file)
@@ -152,6 +152,11 @@ public class Runtime {
     return alarmType;\r
   }\r
 \r
+\r
+  public String fzdAlarmStatus="00000000";\r
+  public String getDeviceAlarmStatusFZD(){\r
+      return fzdAlarmStatus;\r
+  }\r
   //0 代表没有出围栏,如果出围栏则置1,每次报警再加1\r
   public int Fence_Warning_flag=0;\r
 \r
index 9d7d2dd..859ebb3 100644 (file)
@@ -22,6 +22,7 @@ import java.util.ArrayList;
 import java.util.Date;\r
 import java.util.HashMap;\r
 \r
+import static com.enqualcomm.support.Constants.ACTION_HEATR_RATE_START;\r
 import static com.enqualcomm.support.LocationClient.LOCATION_MODE;\r
 import static java.lang.Math.abs;\r
 \r
@@ -430,114 +431,421 @@ public class protocol_mqtt {
         }\r
         StringBuilder sb = new StringBuilder();\r
         String cmd = cmdMap.get(CMD_TYPE.AL);\r
-        sb.append(runtime.bleInfo.ble_area_id);\r
+        sb.append(TimeUtil.getUTCSystemDateYYMMDD())\r
+                .append(CMDSPLIT).append(TimeUtil.getUTCSystemTimeHHmmss())\r
+//                .append(CMDSPLIT).append(runtime.getDeviceAlarmStatusFZD())\r
+                .append(CMDSPLIT).append(runtime.getFZDGPSData())\r
+                .append(CMDSPLIT).append(String.format("%03d", abs(runtime.getSignalStrength())))\r
+                .append(CMDSPLIT).append(runtime.getBattery())\r
+                .append(CMDSPLIT).append(runtime.getTotalStepCount())\r
+                .append(CMDSPLIT).append(runtime.getRolltimes())\r
+                .append(CMDSPLIT).append(runtime.getFZDDevStatus())\r
+                .append(CMDSPLIT).append(runtime.getFZDLBSMultiStationData())\r
+                .append(CMDSPLIT).append(runtime.getFZDWifiData())\r
+                .append(CMDSPLIT).append(runtime.bleInfo.is_in_area ? "1" : "0")\r
+                .append(CMDSPLIT).append(runtime.bleInfo.ble_area_id);\r
         return genMqttCMDMsg(cmd, sb.toString(), runtime.IMEI());\r
 \r
     }\r
 \r
-//\r
-//    public static String UPLOAD(){\r
-//\r
-//        return  genFZDCMD(cmdMap.get(CMD_TYPE.UPLOAD));\r
-//    }\r
-//\r
-//    public void handleUPLOAD(Connection connection,Runtime runtime,String cmd,String data){\r
-//            connection.send(genStringMessage("UPLOAD",UPLOAD()));\r
-//            int timesecond=Integer.parseInt(data);\r
-//            int mod=runtime.getLocationInstance().getWorkingMod();\r
-//        log("LOCATION_MODE  "+LOCATION_MODE+" mod "+ mod);\r
-//        Config.setLocationMode(runtime.getContextProxy().context,mod);\r
-//        Config.setLocationCycle(runtime.getContextProxy().context,timesecond);\r
-//        runtime.getLocationInstance().setLocation_cycle(timesecond);\r
-//        runtime.getLocationInstance().setWorkingMod(mod);\r
-////            CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod());\r
-//        //此处设置好配置后,会在LocationClient通过消息开始执行及时定位操作。\r
-//\r
-//    }\r
-//\r
-//    public static String heart(int hrt){\r
-//        return genFZDCMD(cmdMap.get(CMD_TYPE.heart),String.valueOf(hrt));\r
-//    }\r
-//    public static String oxygen(int ox){\r
-//        return genFZDCMD(cmdMap.get(CMD_TYPE.oxygen),String.valueOf(ox));\r
-//    }\r
-//\r
-//    public static String blood(int pbl,int pbh){\r
-//        String data=pbh+CMDSPLIT+pbl;\r
-//        return genFZDCMD(cmdMap.get(CMD_TYPE.blood),data);\r
-//    }\r
-//\r
-//    public static String temp(double temp){\r
-//        return genFZDCMD(cmdMap.get(CMD_TYPE.temp),String.format("%.1f",temp));\r
-//    }\r
-//\r
-//    public static String wdstart(){\r
-//        return genFZDCMD(cmdMap.get(CMD_TYPE.wdstart));\r
-//    }\r
-//    public void handleWdstart(Connection connection,Runtime runtime ,String data) {\r
-//\r
-//        connection.send(genStringMessage("wdstart",wdstart()));\r
-//        int freq=Integer.parseInt(data);\r
-//\r
-//\r
-//        Config.setTemperatureTestCycle(runtime,freq);\r
-//        CoreService.getInstance().setTempAlarm();\r
-//\r
-//        TemperatureUtil.doTempTestInThread();\r
-////\r
-////        double wrist_temp,body_temp;\r
-////        wrist_temp= TemperatureUtil.get_temp_value_adjusted();\r
-////        body_temp=TemperatureUtil.getBodyTemp(wrist_temp,26.0f);\r
-////        String temperatureMsg=temp(body_temp);\r
-////        connection.send(genStringMessage("temp",temperatureMsg));\r
-//    }\r
-//    public static String hrtstart(){\r
-//        return genFZDCMD(cmdMap.get(CMD_TYPE.hrtstart));\r
-//    }\r
-//    public void handleHrtstart(Connection connection) {\r
-//\r
-//        connection.send(genStringMessage("hrtstart",hrtstart()));\r
-//    }\r
-//\r
-//    public static String SOS(){\r
-//        return genFZDCMD(cmdMap.get(CMD_TYPE.SOS));\r
-//    }\r
-//\r
-//\r
-//    public void handleSOS(Connection connection,Runtime runtime,String cmd,String data) {\r
-//\r
-//        connection.send(genStringMessage("SOS",SOS()));\r
-//        if (data!=null && data.length()>0) {\r
-//            String list[] = data.split(CMDSPLIT);\r
-//            if (list.length==1){\r
-//                ArrayList<Contact> contactArray=new ArrayList<Contact>();\r
-//                if (regexUtil.isMobileNumber( list[0]) || regexUtil.isPhoneNumber(list[0]))\r
-//               {\r
-//                   contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos1",list[0]));\r
-//                   ICLogger.i("find SOS1 number "+list[0]);\r
-//               }\r
-//            }else if (list.length==2){\r
-//\r
-//                ArrayList<Contact> contactArray=new ArrayList<Contact>();\r
-//                if (regexUtil.isMobileNumber( list[0]) || regexUtil.isPhoneNumber(list[0]))\r
-//                {\r
-//                    contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos1",list[0]));\r
-//                    ICLogger.i("find SOS1 number "+list[0]);\r
-//                }\r
-//                if (regexUtil.isMobileNumber( list[1]) || regexUtil.isPhoneNumber(list[1]))\r
-//                {\r
-//                    contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos2",list[1]));\r
-//                    ICLogger.i("find SOS2 number "+list[1]);\r
-//                }\r
-//\r
-//                runtime.getDbHelper().saveContacts(contactArray,false,false,false,false,false,true);\r
-//\r
-//            }\r
-//        }\r
-//\r
-//\r
-//    }\r
 \r
+    public static StringMessage UPLOAD(Runtime runtime){\r
+\r
+\r
+        return  genMqttCMDMsg(cmdMap.get(CMD_TYPE.UPLOAD),runtime.bleInfo.ble_area_id,runtime.IMEI());\r
+    }\r
+\r
+    public void handleUPLOAD(Connection connection,Runtime runtime,String cmd,String data){\r
+        /**\r
+         * 数据上传间隔设置(UPLOAD)\r
+         * 平台发布(终端订阅):\r
+         * 平台向“WBG100/v1/ID_手表IMEI/UPLOAD”的主题发布 [LEN, 时间间隔]\r
+         * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为UPLOAD\r
+         *\r
+         * 终端发布(平台订阅):\r
+         * 终端收到数据,向“WBG100/v1/ID_手表IMEI/UPLOAD”的主题发布回应\r
+         * [LEN,区域id]\r
+         */\r
+            connection.send(UPLOAD(runtime));\r
+            String[] list=data.split(CMDSPLIT);\r
+            if (TextUtils.isDigitsOnly(list[1])) {\r
+                int timesecond = Integer.parseInt(list[1]);\r
+                int mod = runtime.getLocationInstance().getWorkingMod();\r
+                log("LOCATION_MODE  " + LOCATION_MODE + " mod " + mod +" cycle "+timesecond);\r
+                Config.setLocationMode(runtime.getContextProxy().context, mod);\r
+                Config.setLocationCycle(runtime.getContextProxy().context, timesecond);\r
+                runtime.getLocationInstance().setLocation_cycle(timesecond);\r
+                runtime.getLocationInstance().setWorkingMod(mod);\r
+                 CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod());\r
+                //此处设置好配置后,会在LocationClient通过消息开始执行及时定位操作。\r
+            }else{\r
+                ICLogger.i("UPLOAD format error!");\r
+            }\r
+    }\r
+\r
+    public static StringMessage heart(int hrt,Runtime runtime){\r
+        /***\r
+         * 终端心率上传(heart)\r
+         * 终端发布(平台订阅):\r
+         * 终端向“WBG100/v1/heart/ID_手表IMEI”的主题发布   [LEN,x,区域id]\r
+         * x 表示每分钟的心跳次数\r
+         *\r
+         * 平台不需要回复\r
+         * 说明:终端按照设定间隔上报,不需要平台回复.\r
+         */\r
+        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.heart),String.valueOf(hrt),runtime.IMEI());\r
+    }\r
+    public static StringMessage oxygen(int ox ,Runtime runtime){\r
+        /***\r
+         *\r
+         * 上传血氧数据(oxygen)\r
+         * 终端发布(平台订阅):\r
+         * 终端向“WBG100/v1/oxygen/ID_手表IMEI”的主题发布   [LEN,x,区域id]\r
+         * x 表示血氧饱和度\r
+         *\r
+         * 平台不需要回复\r
+         * 说明:终端按照设定间隔上报,不需要平台回复.\r
+         */\r
+        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.oxygen),String.valueOf(ox),runtime.IMEI());\r
+    }\r
+\r
+    public static StringMessage blood(int pbl,int pbh, Runtime runtime){\r
+        /***\r
+         *   上传血压数据(blood)\r
+         *     终端发布(平台订阅):\r
+         *     终端向“WBG100/v1/blood/ID_手表IMEI”的主题发布   [LEN,x,y,区域id]\r
+         *    x 是收缩压(高压)\r
+         *  y 是舒张压(低压)\r
+         *\r
+         *    平台不需要回复\r
+         *    说明:终端按照设定间隔上报,不需要平台回复.\r
+         *\r
+         */\r
+        String data=pbh+CMDSPLIT+pbl;\r
+        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.blood),data,runtime.IMEI());\r
+    }\r
+\r
+    public static StringMessage temp(double temp,Runtime runtime){\r
+        /***\r
+         * 上传体温数据(temp)\r
+         * 终端发布(平台订阅):\r
+         * 终端向“WBG100/v1/temp/ID_手表IMEI”的主题发布   [LEN,x.x,区域id]\r
+         * X.X: 当前测到温度值,若测到温度为36.2,则 x.x=36.2\r
+         *\r
+         * 平台不需要回复\r
+         * 说明:终端按照设定间隔上报,不需要平台回复.\r
+         */\r
+\r
+        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.temp),String.format("%.1f",temp ),runtime.IMEI());\r
+    }\r
+\r
+    public static StringMessage wdstart(Runtime runtime){\r
+        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.wdstart),runtime.bleInfo.ble_area_id,runtime.IMEI());\r
+    }\r
+    public void handleWdstart(Connection connection,Runtime runtime ,String data) {\r
+\r
+/***\r
+ * 设置体温上传频率(wdstart)\r
+ * 平台向“WBG100/v1/ID_手表IMEI/wdstart”的主题发布 [LEN, x]\r
+ * x 为上传间隔时间,单位秒,连续上传时最小时间不小于300 秒,最大不超过65535.\r
+ * x 为1 则代表终端心率单次上传,上传完后自动关闭。\r
+ * x 为0 则代表终端心率上传关闭。\r
+ * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为wdstart\r
+ *\r
+ * 终端发布(平台订阅):\r
+ * 终端收到数据,向“WBG100/v1/ID_手表IMEI/ wdstart”的主题发布回应\r
+ * [LEN,区域id]\r
+ */\r
+        connection.send(wdstart(runtime));\r
+        String[] list=data.split(CMDSPLIT);\r
+        if (list.length==2){\r
+            String cycle=list[1];\r
+            if (TextUtils.isDigitsOnly(cycle)){\r
+                int cycle_int=Integer.parseInt(cycle);\r
+                ICLogger.i("收到服务器指令:设置体温上传频率 "+cycle+"秒");\r
+\r
+                Config.setTemperatureTestCycle(runtime,cycle_int);\r
+                CoreService.getInstance().setTempAlarm();\r
+                TemperatureUtil.doTempTestInThread();\r
+\r
+            }else\r
+            {\r
+                ICLogger.i("wdstart Format Error!");\r
+            }\r
+        }else\r
+        {\r
+            ICLogger.i("wdstart Format Error!");\r
+        }\r
+    }\r
+    public static StringMessage hrtstart(Runtime runtime){\r
+        return genStringMessage(cmdMap.get(CMD_TYPE.hrtstart),runtime.bleInfo.ble_area_id);\r
+    }\r
+    public void handleHrtstart(Connection connection,Runtime runtime, String data) {\r
+        /***\r
+         * 设置心率、血氧、血压上传频率(hrtstart)\r
+         * 平台发布(终端订阅):\r
+         * 平台向“WBG100/v1/ID_手表IMEI/hrtstart”的主题发布 [LEN, x]\r
+         * x 为上传间隔时间,单位秒,连续上传时最小时间不小于300 秒,最大不超过65535.\r
+         * x 为1 则代表终端心率单次上传,上传完后自动关闭。\r
+         * x 为0 则代表终端心率上传关闭。\r
+         * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为hrtstart\r
+         *\r
+         * 终端发布(平台订阅):\r
+         * 终端收到数据,向“WBG100/v1/ID_手表IMEI/ hrtstart”的主题发布回应\r
+         * [LEN,区域id]\r
+         */\r
+        connection.send(hrtstart(runtime));\r
+        String[] list=data.split(CMDSPLIT);\r
+        if (list.length==2){\r
+            String cycle=list[1];\r
+            if (TextUtils.isDigitsOnly(cycle)){\r
+                int cycle_int=Integer.parseInt(cycle);\r
+                ICLogger.i("收到服务器指令:设置心率血压周期 "+cycle+"秒"+cycle_int/60+"分钟");\r
+\r
+                //发送重置PPGCycle的广播,会在CoreServer里面执行\r
+                Intent intent = new Intent();\r
+                intent.putExtra("PPGTestCycle",cycle_int/60);\r
+                runtime.getContextProxy().sendBrodcast(ACTION_HEATR_RATE_START,intent);\r
+            }else\r
+            {\r
+                ICLogger.i("Hrtstart Format Error!");\r
+            }\r
+\r
+        }else{\r
+            ICLogger.i("Hrtstart Format Error!");\r
+        }\r
+\r
+    }\r
+\r
+    public static StringMessage SOS(Runtime runtime){\r
+        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.SOS),runtime.bleInfo.ble_area_id,runtime.IMEI());\r
+    }\r
+\r
+\r
+    public void handleSOS(Connection connection,Runtime runtime,String cmd,String data) {\r
+/***\r
+ * 设置SOS 号码(SOS)\r
+ * 平台发布(终端订阅):\r
+ * 平台向“WBG100/v1/ID_手表IMEI/SOS”的主题发布 [LEN,电话号码,电话号码]\r
+ * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为SOS\r
+ *\r
+ * 终端发布(平台订阅):\r
+ * 终端收到数据,向“WBG100/v1/ID_手表IMEI/SOS”的主题发布回应\r
+ * [LEN,区域id]\r
+ *\r
+ * 说明:设置SOS 号码后,触发sos 警情时,终端向设置的几个号码拨打电话,一直没有接听,则循环拨打两轮,接听后则不再继续拨打电话,同时发送报警短信给2 个sos 号码.\r
+ */\r
+        connection.send(SOS(runtime));\r
+        if (data!=null && data.length()>0) {\r
+            String list[] = data.split(CMDSPLIT);\r
+            if (list.length==2){\r
+                ArrayList<Contact> contactArray=new ArrayList<Contact>();\r
+                if (regexUtil.isMobileNumber( list[1]) || regexUtil.isPhoneNumber(list[1]))\r
+               {\r
+                   contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos1",list[1]));\r
+                   ICLogger.i("find SOS1 number "+list[1]);\r
+                   runtime.getDbHelper().saveContacts(contactArray,false,false,false,false,false,true);\r
+               }\r
+            }else if (list.length==3){\r
+\r
+                ArrayList<Contact> contactArray=new ArrayList<Contact>();\r
+                if (regexUtil.isMobileNumber( list[1]) || regexUtil.isPhoneNumber(list[1]))\r
+                {\r
+                    contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos1",list[1]));\r
+                    ICLogger.i("find SOS1 number "+list[1]);\r
+                }\r
+                if (regexUtil.isMobileNumber( list[2]) || regexUtil.isPhoneNumber(list[2]))\r
+                {\r
+                    contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos2",list[2]));\r
+                    ICLogger.i("find SOS2 number "+list[2]);\r
+                }\r
+\r
+                runtime.getDbHelper().saveContacts(contactArray,false,false,false,false,false,true);\r
+\r
+            }else{\r
+                ICLogger.i("SOS Format Error!");\r
+            }\r
+        }else\r
+            ICLogger.i("SOS Format Error!");\r
+\r
+\r
+    }\r
+\r
+    public static StringMessage FACTORY(Runtime runtime){\r
+        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.FACTORY),runtime.bleInfo.ble_area_id,runtime.IMEI());\r
+    }\r
+\r
+\r
+    public void handleFactory(Connection connection,Runtime runtime,String cmd,String data) {\r
+/***\r
+ * 恢复出厂设置(FACTORY)\r
+ * 平台发布(终端订阅):\r
+ * 平台向“WBG100/v1/ID_手表IMEI/FACTORY”的主题发布 [LEN,FACTORY]\r
+ * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为FACTORY\r
+ *\r
+ * 终端发布(平台订阅):\r
+ * 终端收到数据,向“WBG100/v1/ID_手表IMEI/FACTORY”的主题发布回应\r
+ * [LEN,区域id]\r
+ *\r
+ * 说明:终端恢复出厂设置,里面设置的号码都将清空\r
+ */\r
+        connection.send(FACTORY(runtime));\r
+    }\r
+\r
+\r
+    public static StringMessage MSGDOWN(Runtime runtime,String index){\r
+        String data=new StringBuffer(index).append(CMDSPLIT).append(runtime.bleInfo.ble_area_id).toString();\r
+        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.MSGDOWN),data,runtime.IMEI());\r
+    }\r
+\r
+\r
+    public void handleMSGDOWN(Connection connection,Runtime runtime,String cmd,String data) {\r
+\r
+/**\r
+ * 消息下发到指定手表(MSGDOWN)\r
+ * 平台发布(终端订阅):\r
+ * 平台向“WBG100/v1/ID_手表IMEI/MSGDOWN”的主题发布 [LEN,包序号,具体消息]\r
+ * 具体消息采用 Unicode 编码下发给终端,例如,“你好”转为Unicode通常为“\u4f60\u597d”,实际传输要去掉\u,即传输具体消息为“4f60597d”\r
+ *\r
+ * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为MSGDOWN\r
+ *\r
+ * 终端发布(平台订阅):\r
+ * 终端收到数据,向“WBG100/v1/ID_手表IMEI/MSGDOWN”的主题发布回应\r
+ * [LEN,包序号,区域id]\r
+ *\r
+ * 说明:\r
+ * 终端回应的包序号与平台发送的包序号一致,每次发送平台包需要加1,确保每包消息的包序号唯一。\r
+ * 具体消息为英文,ASCII格式,长度不超过512个字节\r
+ */\r
+\r
+        String[] cmdlist=data.split(CMDSPLIT);\r
+        if (cmdlist.length == 3){\r
+            String cmdindex=cmdlist[1];\r
+            String txtmsg=cmdlist[2];\r
+            StringMessage msg=MSGDOWN(runtime,cmdindex);\r
+            connection.send(msg);\r
+            ICLogger.i("received Txt Msg "+txtmsg);\r
+            runtime.getContextProxy().sendMsgBroadcast(txtmsg,0);\r
+            runtime.getContextProxy().saveMstToSMSDB(txtmsg);\r
+        }else{\r
+            ICLogger.i("MSGDOWN format error!");\r
+        }\r
+    }\r
+    public static StringMessage REMOVE(Runtime runtime){\r
+        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.REMOVE),runtime.bleInfo.ble_area_id,runtime.IMEI());\r
+    }\r
+\r
+\r
+    public void handleREMOVE(Connection connection,Runtime runtime,String cmd,String data) {\r
+\r
+        /**\r
+         * 取下手环报警开关(REMOVE)\r
+         * 平台发布(终端订阅):\r
+         * 平台向“WBG100/v1/ID_手表IMEI/REMOVE”的主题发布 [LEN,0 或者1]\r
+         * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为REMOVE\r
+         *\r
+         * 终端发布(平台订阅):\r
+         * 终端收到数据,向“WBG100/v1/ID_手表IMEI/REMOVE”的主题发布回应\r
+         * [LEN,区域id]\r
+         *\r
+         * 说明:手表拆除报警的开关,1 打开,0 关闭.\r
+         */\r
+        connection.send(REMOVE(runtime));\r
+        String[] cmdlist=data.split(CMDSPLIT);\r
+        if (cmdlist.length == 2){\r
+            String cmdindex=cmdlist[1];\r
+            ICLogger.i("设置REMOVE "+cmdindex);\r
+        }else{\r
+            ICLogger.i("REMOVE format error!");\r
+        }\r
+    }\r
+\r
+    public static StringMessage PEDO(Runtime runtime){\r
+        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.PEDO),runtime.bleInfo.ble_area_id,runtime.IMEI());\r
+    }\r
+\r
+\r
+    public void handlePEDO(Connection connection,Runtime runtime,String cmd,String data) {\r
+\r
+        /***\r
+         * 计步功能开关(PEDO)\r
+         * 平台发布(终端订阅):\r
+         * 平台向“WBG100/v1/ID_手表IMEI/PEDO”的主题发布 [LEN,0 或者1]\r
+         * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为PEDO\r
+         *\r
+         * 终端发布(平台订阅):\r
+         * 终端收到数据,向“WBG100/v1/ID_手表IMEI/PEDO”的主题发布回应\r
+         * [LEN,区域id]\r
+         *\r
+         * 说明: 终端计步功能的开关.1 打开,0 关闭\r
+         */\r
+        connection.send(PEDO(runtime));\r
+        String[] cmdlist=data.split(CMDSPLIT);\r
+        if (cmdlist.length == 2){\r
+            String cmdindex=cmdlist[1];\r
+            ICLogger.i("设置PEDO "+cmdindex);\r
+        }else{\r
+            ICLogger.i("PEDO format error!");\r
+        }\r
+    }\r
+\r
+    public static StringMessage MONITOR(Runtime runtime){\r
+        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.MONITOR),runtime.bleInfo.ble_area_id,runtime.IMEI());\r
+    }\r
+\r
+\r
+    public void handleMONITOR(Connection connection,Runtime runtime,String cmd,String data) {\r
+\r
+        /***\r
+         监听(MONITOR)\r
+         平台发布(终端订阅):\r
+         平台向“WBG100/v1/ID_手表IMEI/MONITOR”的主题发布 [LEN,电话号码]\r
+         终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为MONITOR\r
+\r
+         终端发布(平台订阅):\r
+         终端收到数据,向“WBG100/v1/ID_手表IMEI/ MONITOR”的主题发布回应\r
+         [LEN,区域id]\r
+\r
+         说明:终端收到该指令后会自动回拨给设置的电话号码,电话号码为CENTER时,回拨给中心号码.\r
+         */\r
+        connection.send(MONITOR(runtime));\r
+        String[] cmdlist=data.split(CMDSPLIT);\r
+        if (cmdlist.length == 2){\r
+            String cmdindex=cmdlist[1];\r
+            ICLogger.i("设置MONITOR 号码 "+cmdindex);\r
+        }else{\r
+            ICLogger.i("MONITOR format error!");\r
+        }\r
+    }\r
+\r
+\r
+    public static StringMessage CENTER(Runtime runtime){\r
+        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.CENTER),runtime.bleInfo.ble_area_id,runtime.IMEI());\r
+    }\r
+\r
+\r
+    public void handleCENTER(Connection connection,Runtime runtime,String cmd,String data) {\r
+\r
+        /***\r
+         中心号码设置(CENTER)\r
+         平台发布(终端订阅):\r
+         平台向“WBG100/v1/ID_手表IMEI/CENTER”的主题发布 [LEN,电话号码]\r
+         终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为CENTER\r
+\r
+         终端发布(平台订阅):\r
+         终端收到数据,向“WBG100/v1/ID_手表IMEI/CENTER”的主题发布回应\r
+         [LEN,区域id]\r
+         说明:设置中心号码,通过该手机号码可发送短信指令。同时终端的各种报警短信会发送到该号码的手机上面\r
+         */\r
+        connection.send(CENTER(runtime));\r
+        String[] cmdlist=data.split(CMDSPLIT);\r
+        if (cmdlist.length == 2){\r
+            String cmdindex=cmdlist[1];\r
+            ICLogger.i("设置CENTER 号码 "+cmdindex);\r
+        }else{\r
+            ICLogger.i("CENTER format error!");\r
+        }\r
+    }\r
     public void sendBroadcast(String cmd, Runtime dev) {\r
 \r
         ComponentName componentName = new ComponentName("com.eqc.watch", "com.eqc.watch.launcher.ChatActivity");\r
@@ -576,6 +884,29 @@ public class protocol_mqtt {
                 mConnection.DeliverCMDMessageToSystem("UD",cmd);//通知下面线程状态变化\r
                 break;\r
 \r
+            case AL:\r
+                mConnection.DeliverCMDMessageToSystem("AL",cmd);//通知下面线程状态变化\r
+                break;\r
+\r
+            case PEDO:\r
+                handlePEDO(mConnection,mRuntime,cmd,data);\r
+                mConnection.DeliverCMDMessageToSystem("PEDO",cmd);//通知下面线程状态变化\r
+                break;\r
+\r
+            case REMOVE:\r
+                handleREMOVE(mConnection,mRuntime,cmd,data);\r
+                mConnection.DeliverCMDMessageToSystem("REMOVE",cmd);//通知下面线程状态变化\r
+                break;\r
+            case CENTER:\r
+                handleCENTER(mConnection,mRuntime,cmd,data);\r
+                mConnection.DeliverCMDMessageToSystem("CENTER",cmd);//通知下面线程状态变化\r
+\r
+                break;\r
+            case MONITOR:\r
+                handleMONITOR(mConnection,mRuntime,cmd,data);\r
+                mConnection.DeliverCMDMessageToSystem("MONITOR",cmd);//通知下面线程状态变化\r
+\r
+                break;\r
 //            case CR:\r
 //                //立即定位指令(长链接有效)\r
 //                handleCR(mConnection);\r
@@ -602,12 +933,12 @@ public class protocol_mqtt {
 //                ICLogger.i("收到服务器设置闹钟命令BP85");\r
 //                mConnection.DeliverCMDMessageToSystem("AP85",cmd);//通知下面线程状态变化\r
 //                break;\r
-//            case UPLOAD:\r
-//                //设置工作模式\r
-//                handleUPLOAD(mConnection,mRuntime,cmd,data);\r
-//                mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化\r
-//\r
-//                break;\r
+            case UPLOAD:\r
+                //设置工作模式\r
+                handleUPLOAD(mConnection,mRuntime,cmd,data);\r
+                mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化\r
+\r
+                break;\r
 //            case BP34:\r
 //                //设置工作模式\r
 //                handleBP34(mConnection,mRuntime,cmd);\r
@@ -619,11 +950,11 @@ public class protocol_mqtt {
 ////                                API.handleBP05(cmd);\r
 ////                                break;\r
 //\r
-//            case SOS:\r
-//                //收到设置SOS号码\r
-//                handleSOS(mConnection,mRuntime,cmd,data);\r
-//                ICLogger.i("收到服务器设置SOS号码命令BP12");\r
-//                break;\r
+            case SOS:\r
+                //收到设置SOS号码\r
+                handleSOS(mConnection,mRuntime,cmd,data);\r
+                ICLogger.i("收到服务器设置SOS号码命令BP12");\r
+                break;\r
 //            case PHL:\r
 //                //收到设置白名单号码\r
 //                ICLogger.i("收到服务器设置白名单号码命令BP14");\r
@@ -633,12 +964,12 @@ public class protocol_mqtt {
 //                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
+            case FACTORY:\r
+                //收到恢复出厂设置\r
+                handleFactory(mConnection,mRuntime,cmd,data);\r
+                ICLogger.i("收到服务器恢复出厂设置命令");\r
+                mConnection.DeliverCMDMessageToSystem("FactoryReset",cmd);//通知下面线程状态变化\r
+                break;\r
 //\r
 //            case BP18:\r
 //                //收到重启\r
@@ -648,39 +979,39 @@ public class protocol_mqtt {
 //                break;\r
 //\r
 \r
-//            case BP40:\r
-//                //服务器推送文本\r
-//                handleBP40(mConnection,mRuntime,cmd);\r
-//                ICLogger.i("收到服务器推送文本消息");\r
+            case MSGDOWN:\r
+                //服务器推送文本\r
+                handleMSGDOWN(mConnection,mRuntime,cmd,data);\r
+                ICLogger.i("收到服务器推送文本消息");\r
 //                mConnection.DeliverCMDMessageToSystem("showTxt",cmd);//通知下面线程状态变化\r
-//                break;\r
-//\r
-//            case hrtstart:\r
-//                handleHrtstart(mConnection);\r
-//                ICLogger.i("收到服务器心率检测命令");\r
-//                HeartRateManager.triggerPPGtest();\r
-//                break;\r
-//\r
-//            case wdstart:\r
-//                handleWdstart(mConnection,mRuntime,data);\r
-//                ICLogger.i("收到服务器体温测试及设置命令");\r
-//                break;\r
-//            case blood:\r
-//                ICLogger.i("服务器收到上传的血压");\r
-//                mConnection.DeliverCMDMessageToSystem("blood",cmd);//通知下面线程状态变化\r
-//                break;\r
-//            case oxygen:\r
-//                ICLogger.i("服务器收到上传的血氧");\r
-//                mConnection.DeliverCMDMessageToSystem("oxygen",cmd);//通知下面线程状态变化\r
-//                break;\r
-//            case temp:\r
-//                ICLogger.i("服务器收到上传的体温");\r
-//                mConnection.DeliverCMDMessageToSystem("temp",cmd);//通知下面线程状态变化\r
-//                break;\r
-//            case heart:\r
-//                ICLogger.i("服务器收到上传的心率heart");\r
-//                mConnection.DeliverCMDMessageToSystem("heart",cmd);//通知下面线程状态变化\r
-//                break;\r
+                break;\r
+\r
+            case hrtstart:\r
+                handleHrtstart(mConnection,mRuntime,data);\r
+                ICLogger.i("收到服务器心率检测命令");\r
+                HeartRateManager.triggerPPGtest();\r
+                break;\r
+\r
+            case wdstart:\r
+                handleWdstart(mConnection,mRuntime,data);\r
+                ICLogger.i("收到服务器体温测试及设置命令");\r
+                break;\r
+            case blood:\r
+                ICLogger.i("服务器收到上传的血压");\r
+                mConnection.DeliverCMDMessageToSystem("blood",cmd);//通知下面线程状态变化\r
+                break;\r
+            case oxygen:\r
+                ICLogger.i("服务器收到上传的血氧");\r
+                mConnection.DeliverCMDMessageToSystem("oxygen",cmd);//通知下面线程状态变化\r
+                break;\r
+            case temp:\r
+                ICLogger.i("服务器收到上传的体温");\r
+                mConnection.DeliverCMDMessageToSystem("temp",cmd);//通知下面线程状态变化\r
+                break;\r
+            case heart:\r
+                ICLogger.i("服务器收到上传的心率heart");\r
+                mConnection.DeliverCMDMessageToSystem("heart",cmd);//通知下面线程状态变化\r
+                break;\r
 //            case BP84:\r
 //                handleBP84(cmd,mConnection);\r
 //                ICLogger.i("收到服务器白名单命令");\r