From: snickersun Date: Mon, 31 Aug 2020 00:05:05 +0000 (+0800) Subject: protocol mqtt X-Git-Url: http://git.snicker.com.cn/?a=commitdiff_plain;h=54c5c39e4484aea902faaabf605b7634c18282ee;p=protocol_srv.git protocol mqtt 采用UTC time作为协议时间(去掉时区) 添加 LGZONE 执行逻辑及时间设置逻辑。 --- diff --git a/app/src/main/java/com/enqualcomm/support/toolActivity.java b/app/src/main/java/com/enqualcomm/support/toolActivity.java index 0d624e91..21ccb125 100644 --- a/app/src/main/java/com/enqualcomm/support/toolActivity.java +++ b/app/src/main/java/com/enqualcomm/support/toolActivity.java @@ -10,6 +10,7 @@ import android.widget.Button; import com.enqualcomm.support.utils.SimSignalUtil; import com.enqualcomm.support.utils.Util; +import com.ic.protocols.protocol_mqtt; //import com.ic.protocols.protocol_mqtt_client; import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; @@ -32,6 +33,8 @@ public class toolActivity extends Activity { btnmod1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { +// protocol_mqtt.handleLGZONE(null,CoreService.getInstance().runtime,"001D,-8,08:00:00,2016-01-12"); + Intent intent=new Intent(); intent.putExtra("smsCmd","#setlocation#=1,30#"); CoreService.getInstance().runtime.getContextProxy().sendBrodcast("com.enqualcomm.support.SMSCMD",intent); diff --git a/app/src/main/java/com/enqualcomm/support/utils/TimeUtil.java b/app/src/main/java/com/enqualcomm/support/utils/TimeUtil.java index a8e8866b..b9b45e34 100644 --- a/app/src/main/java/com/enqualcomm/support/utils/TimeUtil.java +++ b/app/src/main/java/com/enqualcomm/support/utils/TimeUtil.java @@ -45,6 +45,31 @@ public class TimeUtil { public static String getSystemTimeHHmmss(){ return (new SimpleDateFormat("HHmmss")).format(new Date(System.currentTimeMillis())); } + + public static String getUTCSystemDateYYMMDD(){ + return (new SimpleDateFormat("yyMMdd")).format(new Date(System.currentTimeMillis()-TimeZone.getDefault().getRawOffset())); + } + public static String getUTCSystemTimeHHmmss(){ + return (new SimpleDateFormat("HHmmss")).format(new Date(System.currentTimeMillis()-TimeZone.getDefault().getRawOffset())); + } + public static Date parseDatetiime(String date,String time){ + +// SimpleDateFormat dff = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.ENGLISH);//输入的被转化的时间格式 + SimpleDateFormat df1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//需要转化成的时间格式 08:00:00,2016-01-12 +// SimpleDateFormat df2 = new SimpleDateFormat("yyyyMMddHHmmssSSS"); +// SimpleDateFormat df3 = new SimpleDateFormat("yyyyMMddHHmmss"); + Date date1 = null; + try { + date1 = df1.parse(date+" "+time); + return date1; + } catch (ParseException e) { + e.printStackTrace(); + return null; + } +// String str1 = df1.format(date1); +// String str2 = df2.format(date1); + + } public static Date parseDatetiime(String datetimeStr){ // SimpleDateFormat dff = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.ENGLISH);//输入的被转化的时间格式 @@ -333,5 +358,23 @@ public class TimeUtil { long date2_ms=parseDatetiime(dateAfter_yyyyMMDDhhmmss).getTime(); return (date2_ms-date1_ms)/60000 ; } + + + + + public static void testUTCSystemtime(){ + + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式 + + + long currentTime=System.currentTimeMillis()-TimeZone.getDefault().getRawOffset(); + ICLogger.i("UTC currentTime = "+df.format(new Date(currentTime))); + currentTime=Calendar.getInstance().getTimeInMillis(); + ICLogger.i("currentTime = "+df.format(new Date(currentTime))); + currentTime=new Date().getTime(); + + + + } } diff --git a/app/src/main/java/com/ic/protocols/protocolAPIHelper.java b/app/src/main/java/com/ic/protocols/protocolAPIHelper.java index 95a4045e..3333efbc 100644 --- a/app/src/main/java/com/ic/protocols/protocolAPIHelper.java +++ b/app/src/main/java/com/ic/protocols/protocolAPIHelper.java @@ -121,7 +121,7 @@ public class protocolAPIHelper { ret=protocol_fzd.PING(); break; case Config.PROTOCOL_MQTT: - ret=null; + ret=protocol_mqtt.LGZONE(runtime); break; } return ret; diff --git a/app/src/main/java/com/ic/protocols/protocol_mqtt.java b/app/src/main/java/com/ic/protocols/protocol_mqtt.java index a42384b1..5a362d80 100644 --- a/app/src/main/java/com/ic/protocols/protocol_mqtt.java +++ b/app/src/main/java/com/ic/protocols/protocol_mqtt.java @@ -19,6 +19,7 @@ import com.enqualcomm.support.utils.Util; import com.enqualcomm.support.utils.regexUtil; import java.util.ArrayList; +import java.util.Date; import java.util.HashMap; import static com.enqualcomm.support.LocationClient.LOCATION_MODE; @@ -33,16 +34,17 @@ public class protocol_mqtt { private static final String CMDEND = "]"; private static final String CMDSPLIT = ","; - public static final String defaultServerIP="47.106.237.76"; - public static final int defaultServerPort=1883; + public static final String defaultServerIP = "47.106.237.76"; + public static final int defaultServerPort = 1883; + + public static final String projName = "WBG100"; + public static final String protocolVersion = "v1"; + public static final String mqttKey = "QWER15WTF156OQRT1230"; + public static String MQTT_CLIENT_TOPIC_HEADER = ""; - public static final String projName="WBG100"; - public static final String protocolVersion="v1"; - public static final String mqttKey="QWER15WTF156OQRT1230"; - public static String MQTT_CLIENT_TOPIC_HEADER=""; public enum CMD_TYPE { - // cmd_type 含义 - // 终端主动上传 + // cmd_type 含义 + // 终端主动上传 BREQ, // 手表请求绑定(新增) KA, // 心跳连接 LGZONE, // 获取服务器端时间 @@ -52,7 +54,7 @@ public class protocol_mqtt { heart, // 终端心率上传 blood, // 上传血压数据 oxygen, // 上传血氧数据 - // 平台主动下发 + // 平台主动下发 UPLOAD, // 数据上传间隔设置 hrtstart, // 设置心率、血氧、血压上传频率 wdstart, // 设置体温上传频率 @@ -93,12 +95,12 @@ public class protocol_mqtt { } - private Connection mConnection=null; - private Runtime mRuntime=null; + private Connection mConnection = null; + private Runtime mRuntime = null; public protocol_mqtt(Connection connect, Runtime runtime) { - mConnection=connect; - mRuntime=runtime; + mConnection = connect; + mRuntime = runtime; } @@ -115,92 +117,94 @@ public class protocol_mqtt { /**/ - public static StringMessage genStringMessage(String cmdName, String msg){ - StringMessage sm=new StringMessage(new String[]{cmdName,msg}); + public static StringMessage genStringMessage(String cmdName, String msg) { + StringMessage sm = new StringMessage(new String[]{cmdName, msg}); sm.refresh(msg); return sm; } - public static String isCmdStr(StringMessage msg){ + public static String isCmdStr(StringMessage msg) { - String imei=""; - if(CoreService.getInstance()!=null) - imei=CoreService.getInstance().getRuntime().IMEI(); - String cmdtype = msg.cmd().replace(projName+"/"+protocolVersion+"/","").replace("/"+imei,""); - ICLogger.i("mqtt isCmdStr topic "+msg.cmd()+" ,cmd "+cmdtype); + String imei = ""; + if (CoreService.getInstance() != null) + imei = CoreService.getInstance().getRuntime().IMEI(); + String cmdtype = msg.cmd().replace(projName + "/" + protocolVersion + "/", "").replace("/" + imei, ""); + ICLogger.i("mqtt isCmdStr topic " + msg.cmd() + " ,cmd " + cmdtype); for (CMD_TYPE key : cmdMap.keySet()) { - ICLogger.i("mqtt isCmdStr cmd "+msg.cmd()+" key "+cmdMap.get(key)); - if (cmdMap.get(key).equals(cmdtype)){ + ICLogger.i("mqtt isCmdStr cmd " + msg.cmd() + " key " + cmdMap.get(key)); + if (cmdMap.get(key).equals(cmdtype)) { return cmdtype; } } return ""; } + /* 返回true 表示 cmd 全部解析成功 返回false表示 cmd至少有一条解析失败,失败的数据归入buffer,下一次识别接着使用 字符串通过#号进行识别。 每个字符串如果发现 #,却又没有Header,“IW”则会被丢弃 */ - public boolean parserCmd(String cmdtype,byte[] bytes) { - String cmd_msgbuf=new String(bytes); - log("bytes.size "+bytes.length); + public boolean parserCmd(String cmdtype, byte[] bytes) { + String cmd_msgbuf = new String(bytes); + log("bytes.size " + bytes.length); cmdbuf.append(cmd_msgbuf); - log("cmdbuf.size "+cmdbuf.length() +" "+cmdbuf.toString()); - cmd_msgbuf=cmd_msgbuf.replace(CMDHEADER,"").replace(CMDEND,""); + log("cmdbuf.size " + cmdbuf.length() + " " + cmdbuf.toString()); + cmd_msgbuf = cmd_msgbuf.replace(CMDHEADER, "").replace(CMDEND, ""); for (CMD_TYPE key : cmdMap.keySet()) { - if (cmdMap.get(key).toString().equals(cmdtype)){ - handleCmd(key, cmdtype,cmd_msgbuf); + if (cmdMap.get(key).toString().equals(cmdtype)) { + handleCmd(key, cmdtype, cmd_msgbuf); return true; } } return false; } - private static String getHexLen(int len){ - StringBuilder sb=new StringBuilder(); + private static String getHexLen(int len) { + StringBuilder sb = new StringBuilder(); int v = len & 0xFFFF; String hv = Integer.toHexString(v); - if (hv.length() ==1 ) { + if (hv.length() == 1) { sb.append(0).append(0).append(0); - }else if (hv.length()==2){ + } else if (hv.length() == 2) { sb.append(0).append(0); - }else if (hv.length()==3){ + } else if (hv.length() == 3) { sb.append(0); } sb.append(hv); return sb.toString(); } - public static StringMessage genMqttCMDMsg(String cmdtype, String data,String imei){ - StringBuilder sb=new StringBuilder(); - int len=data.length()+1;//长度计算要包括逗号 + + public static StringMessage genMqttCMDMsg(String cmdtype, String data, String imei) { + StringBuilder sb = new StringBuilder(); + int len = data.length() + 1;//长度计算要包括逗号 sb.append(CMDHEADER).append(getHexLen(len)).append(CMDSPLIT).append(data).append(CMDEND); - StringBuilder sbtopic=new StringBuilder(); - sbtopic.append(projName) - .append("/").append(protocolVersion) - .append("/").append(cmdtype) - .append("/").append(imei); + StringBuilder sbtopic = new StringBuilder(); + sbtopic.append(projName) + .append("/").append(protocolVersion) + .append("/").append(cmdtype) + .append("/").append(imei); - return genStringMessage(sbtopic.toString(),sb.toString()); + return genStringMessage(sbtopic.toString(), sb.toString()); } /** * 终端发布(平台订阅): * 终端向“WBG100/v1/BREQ/ID_手表IMEI”的主题发布 [LEN,MQTT注册时的账号及密码的密文] - * + *

* 实例: 若手表IMEI号为334588000000156, * MQTT注册时的账号及密码的密文为:QWER15WTF156OQRT1230 * 则向WBG100/v1/BREQ/ID_334588000000156的主题发布[0016,QWER15WTF156OQRT1230] - * */ - public static StringMessage BREQ(Runtime runtime){ + */ + public static StringMessage BREQ(Runtime runtime) { - return genMqttCMDMsg(cmdMap.get(CMD_TYPE.BREQ), mqttKey,runtime.IMEI()); + return genMqttCMDMsg(cmdMap.get(CMD_TYPE.BREQ), mqttKey, runtime.IMEI()); } - public static void handleBREQ(Runtime runtime,String data){ + public static void handleBREQ(Runtime runtime, String data) { /*** * 回应的消息为:[LEN,区域id,绑定的区域纬度,N/S,经度,E/W,beacon mac_1,beacon mac_2,beacon mac_3,…,beacon mac_n] * @@ -211,19 +215,23 @@ public class protocol_mqtt { * 先判断子主题是否为:BREQ * 是,则消息为:[003F,123456789,22.570512,N,113.8623267,E,5947ffff0001, 5947ffff0002] */ - String[] list=data.split(CMDSPLIT); - if (list.length>=7){ - runtime.bleInfo.ble_area_id=list[1]; - runtime.bleInfo.gps_n=list[2]; - runtime.bleInfo.gps_e=list[4]; + String[] list = data.split(CMDSPLIT); + if (list.length >= 7) { + runtime.bleInfo.ble_area_id = list[1]; + runtime.bleInfo.gps_n = list[2]; + runtime.bleInfo.gps_e = list[4]; runtime.bleInfo.btMacList.clear(); - for (int i=6;i< list.length;i++){ + StringBuilder sb = new StringBuilder(); + sb.append("登录绑定 区域码" + list[1] + " ,GPS " + list[2] + "N," + list[4] + "E, BtMacs "); + for (int i = 6; i < list.length; i++) { runtime.bleInfo.btMacList.add(list[i]); + sb.append(",").append(list[i]); } + ICLogger.i(sb.toString()); } } - public static StringMessage KA(Runtime runtime){ + public static StringMessage KA(Runtime runtime) { /*** * 终端向“WBG100/v1/KA/ID_手表IMEI”的主题发布 [LEN, 日期,步数,翻滚次数,电量百分数,区域id] @@ -236,14 +244,14 @@ public class protocol_mqtt { * 平台发布的子主题为:KA * 回应的消息为:[LEN,KA] */ - StringBuilder sb=new StringBuilder(); - String cmd=cmdMap.get(CMD_TYPE.KA); - sb.append(TimeUtil.getSystemDateYYMMDD()).append(CMDSPLIT) - .append(runtime.getTotalStepCount()).append(CMDSPLIT) - .append(runtime.getRolltimes()).append(CMDSPLIT) - .append(runtime.getBattery()).append(CMDSPLIT) - .append(runtime.bleInfo.ble_area_id); - return genMqttCMDMsg(cmd,sb.toString(),runtime.IMEI()); + StringBuilder sb = new StringBuilder(); + String cmd = cmdMap.get(CMD_TYPE.KA); + sb.append(TimeUtil.getUTCSystemDateYYMMDD()).append(CMDSPLIT) + .append(runtime.getTotalStepCount()).append(CMDSPLIT) + .append(runtime.getRolltimes()).append(CMDSPLIT) + .append(runtime.getBattery()).append(CMDSPLIT) + .append(runtime.bleInfo.ble_area_id); + return genMqttCMDMsg(cmd, sb.toString(), runtime.IMEI()); } /*LBS+GPS混合定位*/ @@ -280,29 +288,104 @@ public class protocol_mqtt { */ - StringBuilder sb=new StringBuilder(); - String cmd=cmdMap.get(CMD_TYPE.UD); - sb.append(TimeUtil.getSystemDateYYMMDD()).append(CMDSPLIT) - .append(TimeUtil.getSystemTimeHHmmss()).append(CMDSPLIT) + StringBuilder sb = new StringBuilder(); + String cmd = cmdMap.get(CMD_TYPE.UD); + sb.append(TimeUtil.getUTCSystemDateYYMMDD()).append(CMDSPLIT) + .append(TimeUtil.getUTCSystemTimeHHmmss()).append(CMDSPLIT) .append(runtime.getFZDGPSData()).append(CMDSPLIT) - .append(String.format("%03d",abs(runtime.getSignalStrength()))).append(CMDSPLIT) + .append(String.format("%03d", abs(runtime.getSignalStrength()))).append(CMDSPLIT) .append(runtime.getBattery()).append(CMDSPLIT) .append(runtime.getTotalStepCount()).append(CMDSPLIT) .append(runtime.getRolltimes()).append(CMDSPLIT) .append(runtime.getFZDDevStatus()).append(CMDSPLIT) .append(runtime.getFZDLBSMultiStationData()).append(CMDSPLIT) .append(runtime.getFZDWifiData()).append(CMDSPLIT) - .append(runtime.bleInfo.is_in_area?"1":"0").append(CMDSPLIT) + .append(runtime.bleInfo.is_in_area ? "1" : "0").append(CMDSPLIT) .append(runtime.bleInfo.ble_area_id); - return genMqttCMDMsg(cmd,sb.toString(),runtime.IMEI()); + return genMqttCMDMsg(cmd, sb.toString(), runtime.IMEI()); } //处理 定位 BP01 - public void handleUD2(String cmd){ + public void handleUD2(String cmd) { log("BP02定位接收成功"); } + public static StringMessage LGZONE(Runtime runtime){ + /*** + * 获取服务器端时间(LGZONE) + * 终端发布(平台订阅): + * 终端向“WBG100/v1/LGZONE/ID_手表IMEI”的主题发布 [LEN,区域id] + * + * 实例:若手表IMEI号为334588000000156,请求绑定时下发的区域id为123456789, + * 则向WBG100/v1/LGZONE/ID_334588000000156的主题发布 [0009,123456789] + * + * 终端订阅(平台发布): + * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,会收到平台的回应 + * 平台发布的子主题为:LGZONE + * 回应的消息为:[LEN, 时区,时间,日期] + * + * 实例: 若手表IMEI号为334588000000156,绑定的区域为123456789, + * 则终端订阅“WBG100/v1/ID_334588000000156/+”的主题列表,会收到平台的回应 + * 先判断子主题是否为:LGZONE + * 是,则消息为:[001D,+8,08:00:00,2016-01-12] + * 实例表示:东八区,上午8 点整 + + */ + StringBuilder sb = new StringBuilder(); + String cmd = cmdMap.get(CMD_TYPE.LGZONE); + sb.append(runtime.bleInfo.ble_area_id); + return genMqttCMDMsg(cmd, sb.toString(), runtime.IMEI()); + + } + public void handleLGZONE(Connection connection,Runtime runtime, String data){ + + /*** + * 获取服务器端时间(LGZONE) + * 终端发布(平台订阅): + * 终端向“WBG100/v1/LGZONE/ID_手表IMEI”的主题发布 [LEN,区域id] + * + * 实例:若手表IMEI号为334588000000156,请求绑定时下发的区域id为123456789, + * 则向WBG100/v1/LGZONE/ID_334588000000156的主题发布 [0009,123456789] + * + * 终端订阅(平台发布): + * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,会收到平台的回应 + * 平台发布的子主题为:LGZONE + * 回应的消息为:[LEN, 时区,时间,日期] + * + * 实例: 若手表IMEI号为334588000000156,绑定的区域为123456789, + * 则终端订阅“WBG100/v1/ID_334588000000156/+”的主题列表,会收到平台的回应 + * 先判断子主题是否为:LGZONE + * 是,则消息为:[001D,+8,08:00:00,2016-01-12] + * 实例表示:东八区,上午8 点整 + + */ + String[] list=data.split(CMDSPLIT); + if (list.length==4){ + String timeZone=list[1]; + String date=list[3]; + String time=list[2]; + Date datetime= TimeUtil.parseDatetiime(date,time); + int timezone=Integer.parseInt(timeZone.replace("+","")); + if (datetime!=null){ + ICLogger.i("==="+timezone+" "+TimeUtil.getDefaultTimeZone()); + TimeUtil.setTimeZone(timezone); + + + ICLogger.i("==="+TimeUtil.getDefaultTimeZone()); + TimeUtil.setSysDateTime(runtime.getContextProxy().context,datetime,timezone); + ICLogger.i("==="+TimeUtil.getDefaultTimeZone()); + + } +// Set Datetime 20200505112734 +// Set TimeZone 8 + + }else{ + ICLogger.i("LGZONE Format Error!"); + } + + + } // // public static String UPLOAD(){ //