protocol mqtt
authorsnickersun <snickersun@qq.com>
Mon, 31 Aug 2020 00:05:05 +0000 (08:05 +0800)
committersnickersun <snickersun@qq.com>
Mon, 31 Aug 2020 00:05:05 +0000 (08:05 +0800)
采用UTC time作为协议时间(去掉时区)
添加 LGZONE 执行逻辑及时间设置逻辑。

app/src/main/java/com/enqualcomm/support/toolActivity.java
app/src/main/java/com/enqualcomm/support/utils/TimeUtil.java
app/src/main/java/com/ic/protocols/protocolAPIHelper.java
app/src/main/java/com/ic/protocols/protocol_mqtt.java

index 0d624e9..21ccb12 100644 (file)
@@ -10,6 +10,7 @@ import android.widget.Button;
 \r
 import com.enqualcomm.support.utils.SimSignalUtil;\r
 import com.enqualcomm.support.utils.Util;\r
+import com.ic.protocols.protocol_mqtt;\r
 //import com.ic.protocols.protocol_mqtt_client;\r
 \r
 import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;\r
@@ -32,6 +33,8 @@ public class toolActivity extends Activity {
         btnmod1.setOnClickListener(new View.OnClickListener() {\r
             @Override\r
             public void onClick(View view) {\r
+//                protocol_mqtt.handleLGZONE(null,CoreService.getInstance().runtime,"001D,-8,08:00:00,2016-01-12");\r
+\r
                 Intent intent=new Intent();\r
                 intent.putExtra("smsCmd","#setlocation#=1,30#");\r
                 CoreService.getInstance().runtime.getContextProxy().sendBrodcast("com.enqualcomm.support.SMSCMD",intent);\r
index a8e8866..b9b45e3 100644 (file)
@@ -45,6 +45,31 @@ public class TimeUtil {
   public static String getSystemTimeHHmmss(){\r
     return (new SimpleDateFormat("HHmmss")).format(new Date(System.currentTimeMillis()));\r
   }\r
+\r
+  public static String getUTCSystemDateYYMMDD(){\r
+    return (new SimpleDateFormat("yyMMdd")).format(new Date(System.currentTimeMillis()-TimeZone.getDefault().getRawOffset()));\r
+  }\r
+  public static String getUTCSystemTimeHHmmss(){\r
+    return (new SimpleDateFormat("HHmmss")).format(new Date(System.currentTimeMillis()-TimeZone.getDefault().getRawOffset()));\r
+  }\r
+  public static Date parseDatetiime(String date,String time){\r
+\r
+//    SimpleDateFormat dff = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.ENGLISH);//输入的被转化的时间格式\r
+    SimpleDateFormat df1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//需要转化成的时间格式 08:00:00,2016-01-12\r
+//    SimpleDateFormat df2 = new SimpleDateFormat("yyyyMMddHHmmssSSS");\r
+//    SimpleDateFormat df3 = new SimpleDateFormat("yyyyMMddHHmmss");\r
+    Date date1 = null;\r
+    try {\r
+      date1 = df1.parse(date+" "+time);\r
+      return date1;\r
+    } catch (ParseException e) {\r
+      e.printStackTrace();\r
+      return null;\r
+    }\r
+//    String str1 = df1.format(date1);\r
+//    String str2 = df2.format(date1);\r
+\r
+  }\r
   public static Date parseDatetiime(String datetimeStr){\r
 \r
 //    SimpleDateFormat dff = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.ENGLISH);//输入的被转化的时间格式\r
@@ -333,5 +358,23 @@ public class TimeUtil {
     long date2_ms=parseDatetiime(dateAfter_yyyyMMDDhhmmss).getTime();\r
     return (date2_ms-date1_ms)/60000 ;\r
   }\r
+\r
+\r
+\r
+\r
+  public static void testUTCSystemtime(){\r
+\r
+    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式\r
+\r
+\r
+    long currentTime=System.currentTimeMillis()-TimeZone.getDefault().getRawOffset();\r
+    ICLogger.i("UTC currentTime = "+df.format(new Date(currentTime)));\r
+     currentTime=Calendar.getInstance().getTimeInMillis();\r
+    ICLogger.i("currentTime = "+df.format(new Date(currentTime)));\r
+    currentTime=new Date().getTime();\r
+\r
+\r
+\r
+  }\r
 }\r
 \r
index 95a4045..3333efb 100644 (file)
@@ -121,7 +121,7 @@ public class protocolAPIHelper {
                 ret=protocol_fzd.PING();\r
                 break;\r
             case Config.PROTOCOL_MQTT:\r
-                ret=null;\r
+                ret=protocol_mqtt.LGZONE(runtime);\r
                 break;\r
         }\r
         return ret;\r
index a42384b..5a362d8 100644 (file)
@@ -19,6 +19,7 @@ import com.enqualcomm.support.utils.Util;
 import com.enqualcomm.support.utils.regexUtil;\r
 \r
 import java.util.ArrayList;\r
+import java.util.Date;\r
 import java.util.HashMap;\r
 \r
 import static com.enqualcomm.support.LocationClient.LOCATION_MODE;\r
@@ -33,16 +34,17 @@ public class protocol_mqtt {
     private static final String CMDEND = "]";\r
     private static final String CMDSPLIT = ",";\r
 \r
-    public static final String defaultServerIP="47.106.237.76";\r
-    public static final int defaultServerPort=1883;\r
+    public static final String defaultServerIP = "47.106.237.76";\r
+    public static final int defaultServerPort = 1883;\r
+\r
+    public static final String projName = "WBG100";\r
+    public static final String protocolVersion = "v1";\r
+    public static final String mqttKey = "QWER15WTF156OQRT1230";\r
+    public static String MQTT_CLIENT_TOPIC_HEADER = "";\r
 \r
-    public static final String projName="WBG100";\r
-    public static final String protocolVersion="v1";\r
-    public static final String mqttKey="QWER15WTF156OQRT1230";\r
-    public static String MQTT_CLIENT_TOPIC_HEADER="";\r
     public enum CMD_TYPE {\r
-     //   cmd_type     含义\r
-      //          终端主动上传\r
+        //   cmd_type  含义\r
+        //          终端主动上传\r
         BREQ,       // 手表请求绑定(新增)\r
         KA,         // 心跳连接\r
         LGZONE,     // 获取服务器端时间\r
@@ -52,7 +54,7 @@ public class protocol_mqtt {
         heart,      // 终端心率上传\r
         blood,      // 上传血压数据\r
         oxygen,     // 上传血氧数据\r
-       // 平台主动下发\r
+        // 平台主动下发\r
         UPLOAD,     // 数据上传间隔设置\r
         hrtstart,   // 设置心率、血氧、血压上传频率\r
         wdstart,    // 设置体温上传频率\r
@@ -93,12 +95,12 @@ public class protocol_mqtt {
 \r
     }\r
 \r
-    private Connection mConnection=null;\r
-    private Runtime mRuntime=null;\r
+    private Connection mConnection = null;\r
+    private Runtime mRuntime = null;\r
 \r
     public protocol_mqtt(Connection connect, Runtime runtime) {\r
-        mConnection=connect;\r
-        mRuntime=runtime;\r
+        mConnection = connect;\r
+        mRuntime = runtime;\r
 \r
     }\r
 \r
@@ -115,92 +117,94 @@ public class protocol_mqtt {
 \r
 \r
     /**/\r
-    public static StringMessage genStringMessage(String cmdName, String msg){\r
-        StringMessage sm=new StringMessage(new String[]{cmdName,msg});\r
+    public static StringMessage genStringMessage(String cmdName, String msg) {\r
+        StringMessage sm = new StringMessage(new String[]{cmdName, msg});\r
         sm.refresh(msg);\r
         return sm;\r
     }\r
 \r
 \r
-    public static String isCmdStr(StringMessage msg){\r
+    public static String isCmdStr(StringMessage msg) {\r
 \r
-        String imei="";\r
-        if(CoreService.getInstance()!=null)\r
-            imei=CoreService.getInstance().getRuntime().IMEI();\r
-        String cmdtype = msg.cmd().replace(projName+"/"+protocolVersion+"/","").replace("/"+imei,"");\r
-        ICLogger.i("mqtt isCmdStr topic "+msg.cmd()+" ,cmd "+cmdtype);\r
+        String imei = "";\r
+        if (CoreService.getInstance() != null)\r
+            imei = CoreService.getInstance().getRuntime().IMEI();\r
+        String cmdtype = msg.cmd().replace(projName + "/" + protocolVersion + "/", "").replace("/" + imei, "");\r
+        ICLogger.i("mqtt isCmdStr topic " + msg.cmd() + " ,cmd " + cmdtype);\r
         for (CMD_TYPE key : cmdMap.keySet()) {\r
-            ICLogger.i("mqtt isCmdStr cmd "+msg.cmd()+" key "+cmdMap.get(key));\r
-            if (cmdMap.get(key).equals(cmdtype)){\r
+            ICLogger.i("mqtt isCmdStr cmd " + msg.cmd() + " key " + cmdMap.get(key));\r
+            if (cmdMap.get(key).equals(cmdtype)) {\r
                 return cmdtype;\r
             }\r
         }\r
         return "";\r
     }\r
+\r
     /*\r
     返回true 表示 cmd 全部解析成功\r
     返回false表示 cmd至少有一条解析失败,失败的数据归入buffer,下一次识别接着使用\r
     字符串通过#号进行识别。\r
     每个字符串如果发现 #,却又没有Header,“IW”则会被丢弃\r
      */\r
-    public boolean parserCmd(String cmdtype,byte[] bytes) {\r
-        String cmd_msgbuf=new String(bytes);\r
-        log("bytes.size "+bytes.length);\r
+    public boolean parserCmd(String cmdtype, byte[] bytes) {\r
+        String cmd_msgbuf = new String(bytes);\r
+        log("bytes.size " + bytes.length);\r
         cmdbuf.append(cmd_msgbuf);\r
-        log("cmdbuf.size "+cmdbuf.length() +" "+cmdbuf.toString());\r
-        cmd_msgbuf=cmd_msgbuf.replace(CMDHEADER,"").replace(CMDEND,"");\r
+        log("cmdbuf.size " + cmdbuf.length() + " " + cmdbuf.toString());\r
+        cmd_msgbuf = cmd_msgbuf.replace(CMDHEADER, "").replace(CMDEND, "");\r
         for (CMD_TYPE key : cmdMap.keySet()) {\r
-            if (cmdMap.get(key).toString().equals(cmdtype)){\r
-                handleCmd(key, cmdtype,cmd_msgbuf);\r
+            if (cmdMap.get(key).toString().equals(cmdtype)) {\r
+                handleCmd(key, cmdtype, cmd_msgbuf);\r
                 return true;\r
             }\r
         }\r
         return false;\r
     }\r
 \r
-    private static String getHexLen(int len){\r
-        StringBuilder sb=new StringBuilder();\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
+        if (hv.length() == 1) {\r
             sb.append(0).append(0).append(0);\r
-        }else if (hv.length()==2){\r
+        } else if (hv.length() == 2) {\r
             sb.append(0).append(0);\r
-        }else if (hv.length()==3){\r
+        } else if (hv.length() == 3) {\r
             sb.append(0);\r
         }\r
         sb.append(hv);\r
         return sb.toString();\r
     }\r
-     public static StringMessage genMqttCMDMsg(String cmdtype, String data,String imei){\r
-        StringBuilder sb=new StringBuilder();\r
-        int len=data.length()+1;//长度计算要包括逗号\r
+\r
+    public static StringMessage genMqttCMDMsg(String cmdtype, String data, String imei) {\r
+        StringBuilder sb = new StringBuilder();\r
+        int len = data.length() + 1;//长度计算要包括逗号\r
         sb.append(CMDHEADER).append(getHexLen(len)).append(CMDSPLIT).append(data).append(CMDEND);\r
-         StringBuilder sbtopic=new StringBuilder();\r
-         sbtopic.append(projName)\r
-                 .append("/").append(protocolVersion)\r
-                 .append("/").append(cmdtype)\r
-                 .append("/").append(imei);\r
+        StringBuilder sbtopic = new StringBuilder();\r
+        sbtopic.append(projName)\r
+                .append("/").append(protocolVersion)\r
+                .append("/").append(cmdtype)\r
+                .append("/").append(imei);\r
 \r
-        return genStringMessage(sbtopic.toString(),sb.toString());\r
+        return genStringMessage(sbtopic.toString(), sb.toString());\r
     }\r
 \r
 \r
     /**\r
      * 终端发布(平台订阅):\r
      * 终端向“WBG100/v1/BREQ/ID_手表IMEI”的主题发布   [LEN,MQTT注册时的账号及密码的密文]\r
-     *\r
+     * <p>\r
      * 实例: 若手表IMEI号为334588000000156,\r
      * MQTT注册时的账号及密码的密文为:QWER15WTF156OQRT1230\r
      * 则向WBG100/v1/BREQ/ID_334588000000156的主题发布[0016,QWER15WTF156OQRT1230]\r
-     * */\r
-    public static StringMessage BREQ(Runtime runtime){\r
+     */\r
+    public static StringMessage BREQ(Runtime runtime) {\r
 \r
-        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.BREQ), mqttKey,runtime.IMEI());\r
+        return genMqttCMDMsg(cmdMap.get(CMD_TYPE.BREQ), mqttKey, runtime.IMEI());\r
     }\r
 \r
 \r
-    public static void handleBREQ(Runtime runtime,String data){\r
+    public static void handleBREQ(Runtime runtime, String data) {\r
 /***\r
  * 回应的消息为:[LEN,区域id,绑定的区域纬度,N/S,经度,E/W,beacon mac_1,beacon mac_2,beacon mac_3,…,beacon mac_n]\r
  *\r
@@ -211,19 +215,23 @@ public class protocol_mqtt {
  * 先判断子主题是否为:BREQ\r
  * 是,则消息为:[003F,123456789,22.570512,N,113.8623267,E,5947ffff0001, 5947ffff0002]\r
  */\r
-        String[] list=data.split(CMDSPLIT);\r
-        if (list.length>=7){\r
-            runtime.bleInfo.ble_area_id=list[1];\r
-            runtime.bleInfo.gps_n=list[2];\r
-            runtime.bleInfo.gps_e=list[4];\r
+        String[] list = data.split(CMDSPLIT);\r
+        if (list.length >= 7) {\r
+            runtime.bleInfo.ble_area_id = list[1];\r
+            runtime.bleInfo.gps_n = list[2];\r
+            runtime.bleInfo.gps_e = list[4];\r
             runtime.bleInfo.btMacList.clear();\r
-            for (int i=6;i< list.length;i++){\r
+            StringBuilder sb = new StringBuilder();\r
+            sb.append("登录绑定 区域码" + list[1] + " ,GPS " + list[2] + "N," + list[4] + "E, BtMacs ");\r
+            for (int i = 6; i < list.length; i++) {\r
                 runtime.bleInfo.btMacList.add(list[i]);\r
+                sb.append(",").append(list[i]);\r
             }\r
+            ICLogger.i(sb.toString());\r
         }\r
     }\r
 \r
-    public static StringMessage KA(Runtime runtime){\r
+    public static StringMessage KA(Runtime runtime) {\r
 \r
         /***\r
          * 终端向“WBG100/v1/KA/ID_手表IMEI”的主题发布   [LEN, 日期,步数,翻滚次数,电量百分数,区域id]\r
@@ -236,14 +244,14 @@ public class protocol_mqtt {
          * 平台发布的子主题为:KA\r
          * 回应的消息为:[LEN,KA]\r
          */\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()).append(CMDSPLIT)\r
-        .append(runtime.bleInfo.ble_area_id);\r
-        return genMqttCMDMsg(cmd,sb.toString(),runtime.IMEI());\r
+        StringBuilder sb = new StringBuilder();\r
+        String cmd = cmdMap.get(CMD_TYPE.KA);\r
+        sb.append(TimeUtil.getUTCSystemDateYYMMDD()).append(CMDSPLIT)\r
+                .append(runtime.getTotalStepCount()).append(CMDSPLIT)\r
+                .append(runtime.getRolltimes()).append(CMDSPLIT)\r
+                .append(runtime.getBattery()).append(CMDSPLIT)\r
+                .append(runtime.bleInfo.ble_area_id);\r
+        return genMqttCMDMsg(cmd, sb.toString(), runtime.IMEI());\r
     }\r
 \r
     /*LBS+GPS混合定位*/\r
@@ -280,29 +288,104 @@ public class protocol_mqtt {
          */\r
 \r
 \r
-        StringBuilder sb=new StringBuilder();\r
-        String cmd=cmdMap.get(CMD_TYPE.UD);\r
-        sb.append(TimeUtil.getSystemDateYYMMDD()).append(CMDSPLIT)\r
-                .append(TimeUtil.getSystemTimeHHmmss()).append(CMDSPLIT)\r
+        StringBuilder sb = new StringBuilder();\r
+        String cmd = cmdMap.get(CMD_TYPE.UD);\r
+        sb.append(TimeUtil.getUTCSystemDateYYMMDD()).append(CMDSPLIT)\r
+                .append(TimeUtil.getUTCSystemTimeHHmmss()).append(CMDSPLIT)\r
                 .append(runtime.getFZDGPSData()).append(CMDSPLIT)\r
-                .append(String.format("%03d",abs(runtime.getSignalStrength()))).append(CMDSPLIT)\r
+                .append(String.format("%03d", abs(runtime.getSignalStrength()))).append(CMDSPLIT)\r
                 .append(runtime.getBattery()).append(CMDSPLIT)\r
                 .append(runtime.getTotalStepCount()).append(CMDSPLIT)\r
                 .append(runtime.getRolltimes()).append(CMDSPLIT)\r
                 .append(runtime.getFZDDevStatus()).append(CMDSPLIT)\r
                 .append(runtime.getFZDLBSMultiStationData()).append(CMDSPLIT)\r
                 .append(runtime.getFZDWifiData()).append(CMDSPLIT)\r
-                .append(runtime.bleInfo.is_in_area?"1":"0").append(CMDSPLIT)\r
+                .append(runtime.bleInfo.is_in_area ? "1" : "0").append(CMDSPLIT)\r
                 .append(runtime.bleInfo.ble_area_id);\r
-        return genMqttCMDMsg(cmd,sb.toString(),runtime.IMEI());\r
+        return genMqttCMDMsg(cmd, sb.toString(), runtime.IMEI());\r
     }\r
 \r
 \r
     //处理 定位 BP01\r
-    public void handleUD2(String cmd){\r
+    public void handleUD2(String cmd) {\r
         log("BP02定位接收成功");\r
     }\r
 \r
+    public static StringMessage LGZONE(Runtime runtime){\r
+        /***\r
+         * 获取服务器端时间(LGZONE)\r
+         * 终端发布(平台订阅):\r
+         * 终端向“WBG100/v1/LGZONE/ID_手表IMEI”的主题发布   [LEN,区域id]\r
+         *\r
+         * 实例:若手表IMEI号为334588000000156,请求绑定时下发的区域id为123456789,\r
+         * 则向WBG100/v1/LGZONE/ID_334588000000156的主题发布 [0009,123456789]\r
+         *\r
+         * 终端订阅(平台发布):\r
+         * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,会收到平台的回应\r
+         * 平台发布的子主题为:LGZONE\r
+         * 回应的消息为:[LEN, 时区,时间,日期]\r
+         *\r
+         * 实例: 若手表IMEI号为334588000000156,绑定的区域为123456789,\r
+         * 则终端订阅“WBG100/v1/ID_334588000000156/+”的主题列表,会收到平台的回应\r
+         * 先判断子主题是否为:LGZONE\r
+         * 是,则消息为:[001D,+8,08:00:00,2016-01-12]\r
+         * 实例表示:东八区,上午8 点整\r
+\r
+         */\r
+        StringBuilder sb = new StringBuilder();\r
+        String cmd = cmdMap.get(CMD_TYPE.LGZONE);\r
+        sb.append(runtime.bleInfo.ble_area_id);\r
+        return genMqttCMDMsg(cmd, sb.toString(), runtime.IMEI());\r
+\r
+    }\r
+    public void handleLGZONE(Connection connection,Runtime runtime, String data){\r
+\r
+    /***\r
+     * 获取服务器端时间(LGZONE)\r
+     * 终端发布(平台订阅):\r
+     * 终端向“WBG100/v1/LGZONE/ID_手表IMEI”的主题发布   [LEN,区域id]\r
+     *\r
+     * 实例:若手表IMEI号为334588000000156,请求绑定时下发的区域id为123456789,\r
+     * 则向WBG100/v1/LGZONE/ID_334588000000156的主题发布 [0009,123456789]\r
+     *\r
+     * 终端订阅(平台发布):\r
+     * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,会收到平台的回应\r
+     * 平台发布的子主题为:LGZONE\r
+     * 回应的消息为:[LEN, 时区,时间,日期]\r
+     *\r
+     * 实例: 若手表IMEI号为334588000000156,绑定的区域为123456789,\r
+     * 则终端订阅“WBG100/v1/ID_334588000000156/+”的主题列表,会收到平台的回应\r
+     * 先判断子主题是否为:LGZONE\r
+     * 是,则消息为:[001D,+8,08:00:00,2016-01-12]\r
+     * 实例表示:东八区,上午8 点整\r
+\r
+     */\r
+        String[] list=data.split(CMDSPLIT);\r
+        if (list.length==4){\r
+            String timeZone=list[1];\r
+            String date=list[3];\r
+            String time=list[2];\r
+            Date datetime= TimeUtil.parseDatetiime(date,time);\r
+            int timezone=Integer.parseInt(timeZone.replace("+",""));\r
+            if (datetime!=null){\r
+                ICLogger.i("==="+timezone+" "+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
+            ICLogger.i("LGZONE Format Error!");\r
+        }\r
+\r
+\r
+    }\r
 //\r
 //    public static String UPLOAD(){\r
 //\r