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
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
heart, // 终端心率上传\r
blood, // 上传血压数据\r
oxygen, // 上传血氧数据\r
- // 平台主动下发\r
+ // 平台主动下发\r
UPLOAD, // 数据上传间隔设置\r
hrtstart, // 设置心率、血氧、血压上传频率\r
wdstart, // 设置体温上传频率\r
\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
\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
* 先判断子主题是否为: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
* 平台发布的子主题为: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
*/\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