-package com.ic.protocols;\r
-\r
-import android.content.ComponentName;\r
-//import android.content.IClipboard;\r
-import android.content.Intent;\r
-import android.net.Uri;\r
-import android.os.Environment;\r
-\r
-//import com.android.internal.telephony.uicc.RuimFileHandler;\r
-import com.enqualcomm.support.Config;\r
-import com.enqualcomm.support.CoreService;\r
-import com.enqualcomm.support.bean.Alarm;\r
-import com.enqualcomm.support.bean.Contact;\r
-import com.enqualcomm.support.bean.Content;\r
-import com.enqualcomm.support.bean.HealthInfo;\r
-import com.enqualcomm.support.bean.ICLocation;\r
-import com.enqualcomm.support.bean.Runtime;\r
-import com.enqualcomm.support.bean.StringMessage;\r
-import com.enqualcomm.support.bean.VoiceContent;\r
-import com.enqualcomm.support.bean.voicePacket;\r
-import com.enqualcomm.support.service.HeartRateManager;\r
-import com.enqualcomm.support.utils.Connection;\r
-import com.enqualcomm.support.utils.ICLogger;\r
-import com.enqualcomm.support.utils.MD5;\r
-import com.enqualcomm.support.utils.TemperatureUtil;\r
-import com.enqualcomm.support.utils.TimeUtil;\r
-import com.enqualcomm.support.utils.Util;\r
-import com.enqualcomm.support.utils.regexUtil;\r
-\r
-import java.io.File;\r
-import java.util.ArrayList;\r
-import java.util.Date;\r
-import java.util.HashMap;\r
-\r
-import chestnut.utils.PhoneUtils;\r
-\r
-import static com.enqualcomm.support.Constants.ACTION_HEATR_RATE_START;\r
-import static com.enqualcomm.support.LocationClient.LOCATION_MODE;\r
-import static com.enqualcomm.support.bean.Contact.GROUP_ALL;\r
-import static java.lang.Math.abs;\r
-\r
-public class protocol_fzd {\r
- private static final String TAG = "ICSrv." + protocol_fzd.class.getSimpleName();\r
- private static final String PrivKEY = "XMQcHi0lGIdru6xzW7lygBwBT8N0c09P";\r
- private static final String CMDHEADER = "[";\r
- private static final String CMDCOMPANY="IC";\r
- private static final String CMDEND = "]";\r
- private static final String CMDHEADERSPLIT = "*";\r
- private static final String CMDSPLIT = ",";\r
-\r
- public static final String defaultServerIP="api.xcloudtech.com";\r
- public static final int defaultServerPort=9000;\r
-\r
- public enum CMD_TYPE {\r
- /*终端发起*/\r
- //链路保持数据\r
- LK,//登录\r
- PING,//绑定查询\r
- KA,//心跳包\r
- UD,//位置上传\r
- UD2,//盲点位置上传\r
- AL,//报警数据上传\r
- LGZONE,//获取服务器时区时间\r
- WT,//获取天气\r
- img,//上传图片\r
- VOICE,//上传语音\r
- WG,//请求位置信息\r
- DLT,//解绑\r
- temp,//体温上传\r
- /* 服务器发起*/\r
- UPLOAD,//数据上传间隔设置\r
- CENTER,//中心号码设置\r
- CALL, //拨打电话\r
- MONITOR,//监听\r
- SOS,//SOS 号码设置\r
- FACTORY,//恢复出厂设置\r
- SOSSMS,//SOS 短信报警开关\r
- LOWBAT,//低电短信报警开关\r
- VERNO,//版本查询\r
- CR,//定位指令\r
- POWEROFF,//关机指令\r
- REMOVE,//取下手环报警开关\r
- REMOVESMS,//取下手表短信报警开关\r
- PEDO,//计步功能开关\r
- SILENCETIME,//免打扰时间段设置\r
- SILENCETIME2, //免打扰时间段设置\r
- SLEEPTIME,//翻转检测时间段设置\r
- FIND,//找手表指令\r
- REMIND,//闹钟设置指令\r
- TK,//对讲功能(微聊发送语音)\r
- PHL,//设置电话本+白名单(最多 50 条)\r
- wdstart,//远程测温\r
- bldstart,//远程测血压\r
- hrtstart,//远程测量心率\r
- BOOTOFF,//定时关机\r
- oxygen,//血氧上传\r
- blood,//血压上传\r
- heart,//心率上传\r
- PRACTICE,//自由锻炼数据上传\r
- UNKNOWN_CMD,\r
- }\r
-\r
- private static HashMap<CMD_TYPE, String> cmdMap = null;\r
-\r
- static {\r
- cmdMap = new HashMap<CMD_TYPE, String>();\r
- cmdMap.put(CMD_TYPE.LK, "LK");\r
- cmdMap.put(CMD_TYPE.PING, "PING");\r
- cmdMap.put(CMD_TYPE.KA, "KA");\r
- cmdMap.put(CMD_TYPE.UD, "UD");\r
- cmdMap.put(CMD_TYPE.UD2, "UD2");\r
- cmdMap.put(CMD_TYPE.AL, "AL");\r
- cmdMap.put(CMD_TYPE.LGZONE, "LGZONE");\r
- cmdMap.put(CMD_TYPE.WT, "WT");\r
- cmdMap.put(CMD_TYPE.img, "img");\r
- cmdMap.put(CMD_TYPE.VOICE, "VOICE");\r
- cmdMap.put(CMD_TYPE.WG, "WG");\r
- cmdMap.put(CMD_TYPE.DLT, "DLT");\r
- cmdMap.put(CMD_TYPE.temp, "temp");\r
- cmdMap.put(CMD_TYPE.UPLOAD, "UPLOAD");\r
- cmdMap.put(CMD_TYPE.CENTER, "CENTER");\r
- cmdMap.put(CMD_TYPE.CALL, "CALL");\r
- cmdMap.put(CMD_TYPE.MONITOR, "MONITOR");\r
- cmdMap.put(CMD_TYPE.SOS, "SOS");\r
- cmdMap.put(CMD_TYPE.FACTORY, "FACTORY");\r
- cmdMap.put(CMD_TYPE.SOSSMS, "SOSSMS");\r
- cmdMap.put(CMD_TYPE.LOWBAT, "LOWBAT");\r
- cmdMap.put(CMD_TYPE.VERNO, "VERNO");\r
- cmdMap.put(CMD_TYPE.CR, "CR");\r
- cmdMap.put(CMD_TYPE.POWEROFF, "POWEROFF");\r
- cmdMap.put(CMD_TYPE.REMOVE, "REMOVE");\r
- cmdMap.put(CMD_TYPE.REMOVESMS, "REMOVESMS");\r
- cmdMap.put(CMD_TYPE.PEDO, "PEDO");\r
- cmdMap.put(CMD_TYPE.SILENCETIME, "SILENCETIME");\r
- cmdMap.put(CMD_TYPE.SILENCETIME2, "SILENCETIME2");\r
- cmdMap.put(CMD_TYPE.SLEEPTIME, "SLEEPTIME");\r
- cmdMap.put(CMD_TYPE.FIND, "FIND");\r
- cmdMap.put(CMD_TYPE.REMIND, "REMIND");\r
- cmdMap.put(CMD_TYPE.TK, "TK");\r
- cmdMap.put(CMD_TYPE.PHL, "PHL");\r
- cmdMap.put(CMD_TYPE.wdstart, "wdstart");\r
- cmdMap.put(CMD_TYPE.bldstart, "bldstart");\r
- cmdMap.put(CMD_TYPE.hrtstart, "hrtstart");\r
- cmdMap.put(CMD_TYPE.BOOTOFF, "BOOTOFF");\r
- cmdMap.put(CMD_TYPE.oxygen, "oxygen");\r
- cmdMap.put(CMD_TYPE.blood, "blood");\r
- cmdMap.put(CMD_TYPE.heart, "heart");\r
- cmdMap.put(CMD_TYPE.PRACTICE, "PRACTICE");\r
- }\r
-\r
- private Connection mConnection=null;\r
- private Runtime mRuntime=null;\r
-\r
- public protocol_fzd(Connection connect, Runtime runtime) {\r
- mConnection=connect;\r
- mRuntime=runtime;\r
-\r
- }\r
-\r
- private StringBuffer cmdbuf = new StringBuffer();\r
-\r
-// /*\r
-// 输入的字符串,如果有完整命令,返回 true\r
-// 否则返回 false\r
-// */\r
-// public boolean isCmdStr(String msg) {\r
-// /***\r
-// * IC*334588000000156*LEN*FALLDOWN\r
-// */\r
-// String cmd;\r
-// int index=msg.indexOf(CMDSPLIT);\r
-// if (index > 0){\r
-// cmd = msg.substring(0,index);\r
-// }else{\r
-// cmd = msg;\r
-// }\r
-// if (regexUtil.isFZDCMD(cmd) ) {\r
-// return true;\r
-// }\r
-// return false;\r
-// }\r
-\r
- private void log(String msg) {\r
- ICLogger.log(TAG, msg);\r
- }\r
-\r
- private void log(String function, String msg) {\r
- ICLogger.log(TAG, function, msg);\r
- }\r
-\r
-\r
- /**/\r
- public static StringMessage genStringMessage(String cmdName, String msg){\r
- StringMessage sm=new StringMessage(new String[]{cmdName,msg});\r
- sm.refresh(msg);\r
- sm.setDate(TimeUtil.getSystemDateYYMMDD(),TimeUtil.getSystemTimeHHmmss());\r
- return sm;\r
- }\r
-\r
- /*\r
- 输入的字符串,如果有完整命令,返回 命令名\r
- 否则返回 空字符串\r
- */\r
- public static String isCmdStr(String msg) {\r
- String cmd_msgbuf=msg;\r
- int cmdindex =cmd_msgbuf.indexOf(CMDCOMPANY+CMDHEADERSPLIT);\r
- if (cmdindex>0) { //如果开头不是CMDHEADER但是包含CMDHEADER则删除前面的数据\r
- String cmd=cmd_msgbuf.substring(cmdindex);\r
- cmd_msgbuf=cmd;\r
- }\r
- cmdindex=cmd_msgbuf.indexOf(CMDEND);\r
- if(cmdindex>0){\r
- String cmd=cmd_msgbuf.substring(0,cmdindex);\r
- cmd_msgbuf=cmd;\r
- }\r
- cmdindex=cmd_msgbuf.indexOf(CMDSPLIT);\r
- if(cmdindex>0){\r
- String cmd=cmd_msgbuf.substring(0,cmdindex);\r
- cmd_msgbuf=cmd;\r
- }\r
-\r
- if (regexUtil.isFZDCMD(cmd_msgbuf)) {\r
- for (CMD_TYPE key : cmdMap.keySet()) {\r
- if (regexUtil.isFZDCMD(cmdMap.get(key), cmd_msgbuf)) { //如果是FZD命令,则进行处理,否则保留数据动\r
- ICLogger.i("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key));\r
- return cmdMap.get(key);\r
- }\r
- }\r
- return "";\r
- }else\r
- return "";\r
- }\r
- /*\r
- 返回true 表示 cmd 全部解析成功\r
- 返回false表示 cmd至少有一条解析失败,失败的数据归入buffer,下一次识别接着使用\r
- 字符串通过#号进行识别。\r
- 每个字符串如果发现 #,却又没有Header,“IW”则会被丢弃\r
- */\r
- public boolean parserCmd(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
- int cmdindex =cmd_msgbuf.indexOf(CMDCOMPANY+CMDHEADERSPLIT);\r
- if (cmdindex>0) { //如果开头不是CMDHEADER但是包含CMDHEADER则删除前面的数据\r
- String cmd=cmd_msgbuf.substring(cmdindex);\r
- cmd_msgbuf=cmd;\r
- }\r
- cmdindex=cmd_msgbuf.indexOf(CMDEND);\r
- if(cmdindex>0){\r
- String cmd=cmd_msgbuf.substring(0,cmdindex);\r
- cmd_msgbuf=cmd;\r
- }\r
- cmdindex=cmd_msgbuf.indexOf(CMDSPLIT);\r
- if(cmdindex>0){\r
- String cmd=cmd_msgbuf.substring(0,cmdindex);\r
- cmd_msgbuf=cmd;\r
- }\r
- if (cmdbuf.toString().split(CMDCOMPANY+CMDHEADERSPLIT).length>1)\r
- {\r
- ICLogger.i("More than 1 cmd in buffer ! just log it");\r
- }\r
- for (CMD_TYPE key : cmdMap.keySet()) {\r
- // ICLogger.i("key "+cmdMap.get(key)+" cmdbuf "+cmd_msgbuf);\r
- if (regexUtil.isFZDCMD(cmdMap.get(key),cmd_msgbuf)) { //如果是FZD命令,则进行处理,否则保留数据动\r
- String data=cmdbuf.toString().replace(CMDHEADER,"").replace(cmd_msgbuf,"").replace(CMDEND,"");\r
-// ICLogger.i("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key) + " , " + cmdbuf.toString() + " "+cmd_msgbuf + " data "+data );\r
-// if (key == CMD_TYPE.TK) {\r
-// //如果是BP28则 后面的数据是音频,需要保留\r
-// byte[] amrBuf;\r
-// int amrLen = getBP28Amrlen(cmdlist[i] );\r
-// if (bytes.length > amrLen) {\r
-// handleCmd(key, cmdlist[i], bytes);\r
-// }\r
-// } else {\r
- if (data.startsWith(CMDSPLIT)) data=data.substring(1);\r
- handleCmd(key, cmd_msgbuf,data);\r
- cmdbuf.delete(0,cmdbuf.length());//处理后清空\r
-// }\r
- }\r
- }\r
- return true;\r
- }\r
-\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
- sb.append(0).append(0).append(0);\r
- }else if (hv.length()==2){\r
- sb.append(0).append(0);\r
- }else if (hv.length()==3){\r
- sb.append(0);\r
- }\r
- sb.append(hv);\r
- return sb.toString();\r
- }\r
- private static String genHeader(int len,String cmd){\r
-\r
- if (CoreService.getInstance()==null)\r
- return "";\r
-\r
- String imei =CoreService.getInstance().getRuntime().IMEI();\r
- return new StringBuilder().append(CMDCOMPANY).append(CMDHEADERSPLIT)\r
- .append(imei).append(CMDHEADERSPLIT)\r
- .append(getHexLen(len)).append(CMDHEADERSPLIT).append(cmd).toString();\r
- }\r
-\r
- private static String keyheader(String cmd,int len){\r
- String header=genHeader(len,cmd);\r
- String key= MD5.getCMDStringMD5(header+PrivKEY);\r
- return key;\r
- }\r
-\r
- public static StringMessage genFZDCMD( String CMD){\r
- StringBuilder sb=new StringBuilder();\r
- int len=CMD.length();\r
- String header=genHeader(len,CMD);\r
- String keyheader=keyheader(CMD,len);\r
- sb.append(CMDHEADER).append(keyheader).append(header).append(CMDEND);\r
- return genStringMessage(CMD,sb.toString());\r
- }\r
- public static StringMessage genFZDCMD( String CMD,String data){\r
- StringBuilder sb=new StringBuilder();\r
- String data_buf=CMD+CMDSPLIT+data;\r
- int data_buf_len=data_buf.length();\r
- String header=genHeader(data_buf_len,CMD);\r
- String keyheader=keyheader(CMD,data_buf_len);//计算header md5值\r
- sb.append(CMDHEADER).append(keyheader).append(header).append(CMDSPLIT).append(data).append(CMDEND);\r
- return genStringMessage(CMD,sb.toString());\r
- }\r
- /*登录*/\r
- public static StringMessage LK() {\r
- /*IC*YYYYYYYYYYYYYYY*LEN*LK*/\r
- return genFZDCMD(cmdMap.get(CMD_TYPE.LK));\r
- }\r
-\r
- /**\r
- * 绑定\r
- * */\r
- public static StringMessage PING(){\r
-// IC*YYYYYYYYYYYYYYY*LEN*PING\r
- return genFZDCMD(cmdMap.get(CMD_TYPE.PING));\r
- }\r
-\r
-\r
- public static void handlePing(Runtime runtime,String data){\r
-// [IC*YYYYYYYYYYYYYYY*LEN*PING,是否绑定(0 表示未绑定,1 表示绑定)]\r
-// 实例:[IC*334588000000156*0006*PING,0]或[IC*334588000000156*0006*PING,1]\r
- try {\r
- int bind = Integer.parseInt(data);\r
- if (bind == 0) {\r
- ICLogger.i("设备未绑定!");\r
- runtime.BindingStatus = false;\r
- } else {\r
- ICLogger.i("设备已绑定!");\r
- runtime.BindingStatus = true;\r
- }\r
- }catch (Exception e){\r
- ICLogger.e(e.getMessage(),e);\r
- }\r
-\r
- }\r
-\r
- public static StringMessage KA(Runtime runtime){\r
-//[IC*YYYYYYYYYYYYYYY*LEN*KA,日期,步数,翻滚次数,电量百分数] 实例:[IC*334588000000156*0014*KA,120414,50,100,100]\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());\r
- return genFZDCMD(cmd,sb.toString());\r
- }\r
-\r
-\r
- public void handleKA(Runtime runtime,String data){\r
-\r
- }\r
-\r
-\r
- public static StringMessage LGZONE(Runtime runtime) {\r
- return genFZDCMD(cmdMap.get(CMD_TYPE.LGZONE));\r
- }\r
- public void handleLGZONE(Runtime runtime, String data){\r
-\r
- /***\r
- * 平台回复:[XT*YYYYYYYYYYYYYYY*LEN*LGZONE,时区,时间,日期]\r
- * 实例: [XT*1234567890*001D*LGZONE,+8,08:00:00,2016-01-12]\r
- */\r
- String[] list=data.split(CMDSPLIT);\r
- if (list.length==3){\r
- String timeZone=list[0].trim();\r
- String date=list[2].trim();\r
- String time=list[1].trim();\r
- Date datetime= TimeUtil.parseDatetiime(date,time);\r
- int timezone;\r
- try\r
- {\r
- timezone=Integer.parseInt(timeZone.replace("+","").trim());\r
- }catch (Exception e){\r
- ICLogger.e("timezone",e);\r
- timezone=8;\r
- }\r
-\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
-// Set Datetime 20200505112734\r
-// Set TimeZone 8\r
-\r
- }else{\r
- ICLogger.i("LGZONE Format Error!");\r
- }\r
-\r
-\r
- }\r
-\r
-\r
- /*LBS+GPS混合定位*/\r
- public static StringMessage UD(Runtime runtime) {\r
- /***\r
- * [IC*334588000000156*00CD*UD,180916,025723,A,22.570733,N,113.8626083,E,0.00,249.5,0.0,6,100, 60,0,0,00000010,7,255,460,1,9529,21809,158,9529,63555,133,9529,63554,129,9529,21405,126,95\r
- * 29,21242,124,9529,21151,120,9529,63556,119,0]\r
- * 说明:\r
- * 数据内容:\r
- * UD,命令号\r
- * 180916,日期(年月日)(0 时区),表示 0 时区的二零一八年九月十六号\r
- *\r
- * 025723,时间(时分秒)(0 时区),表示 0 时区的两点五十七分二十三秒A,gps 定位有效\r
- * 22.570733,纬度\r
- * N,纬度表示113.8626083,经度\r
- * E,经度表示0.00,速度\r
- * 249.5,方向\r
- * 0.0,海拔\r
- * 6,卫星个数\r
- *\r
- * 100,gsm 信号强度\r
- * 60,电量\r
- * 0,计步数\r
- * 0,翻转次数\r
- * 00000010,终端状态,数据为 16 进制,解析成二进制为 0000 0000 0000 0000 0000 0000 0001 0000\r
- * 前面 4 个字节表示状态,后面 4 个字节表示报警,数据中第 4 位为 1,对照文档最后的数据解析,表示手表静止状态。详细可参看文档最后部分。\r
- * 7,基站个数\r
- * 255,460,1,9529,21809,158,9529,63555,133,9529,63554,129,9529,21405,126,9529,21242,124,9529,\r
- * 21151,120,9529,63556,119,基站信息\r
- * 0,WiFi 个数\r
- *\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
- .append(runtime.getFZDGPSData()).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(runtime)).append(CMDSPLIT)\r
- .append(runtime.getFZDLBSMultiStationData()).append(CMDSPLIT)\r
- .append(runtime.getFZDWifiData());\r
-\r
- return genFZDCMD(cmd,sb.toString());\r
- }\r
-\r
-\r
- /*LBS+WiFi混合定位*/\r
- public static String UD2(Runtime ds) {\r
- //示例数据:IWAP02,\r
- // zh_cn,\r
- // 0,\r
- // 7,\r
- // 460,0,\r
- // 9520|3671|13,9520|3672|12,9520|3673|11,9520|3674|10,9520|3675|9,9520|3676|8,9520|3677|7,\r
- // 4,\r
- // 1|D8-24-BD-79-FA-1F|59&2|3C-46-D8-6D-CE-01|81&3|0C-4C-39-1A-7C-65|69&4|70-A8-E3-5D-D7-C0|65#\r
-// IW标识符\r
-// AP02:命令字\r
-// zh_cn: 语言标志\r
-// 0:回复标识,为0时不回复地址,为 1 时,服务器回复地址信息\r
-// 7: 表示共有7组基站\r
-// 460: MCC 国家码\r
-// 0: MNC运营商代码\r
-// 9520|3671|10: LAC|CID|dbm表示一组基站信息,后面数量需和基站组数地应 10:dbm为信号强度多基站信号强度建议从高到低排列后上传,信号强度转正数:150 – abs(dbm)\r
-// 4: 表示WIFI组数,\r
-// 1|D8-24-BD-79-FA-1F|59: ssid|mac地址|信号强度,信号强度转正数:150 – abs(信号强度)\r
-\r
- int apsum=0;\r
- String wifiinfo=ds.getWifiInfo();\r
- if (!wifiinfo.isEmpty()) {\r
- String[] list = wifiinfo.split("&");\r
- apsum = list.length;\r
- }\r
-\r
- ICLogger.i("Wifi ap sum "+apsum);\r
- return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.LK)).append(CMDSPLIT)\r
- .append(ds.getLanguage()).append(CMDSPLIT)\r
- .append(0).append(CMDSPLIT) //为0时不回复地址\r
- .append(ds.getLBSMultiStationData()).append(CMDSPLIT) //基站信息数据\r
- .append(apsum).append(CMDSPLIT).append(ds.getWifiInfo()).append(CMDEND).toString(); //wifi信息数据\r
- }\r
-\r
- //处理 定位 BP01\r
- public void handleUD2(String cmd){\r
- log("BP02定位接收成功");\r
- }\r
-\r
-\r
- public static StringMessage AL(Runtime runtime){\r
- /***\r
- * [IC*334588000000156*00CD*AL,180916,064153,A,22.570512,N,113.8623267,E,0.00,154.8,0.0,11,10 0,100,0,0,00100018,7,0,460,1,9529,21809,155,9529,21242,132,9529,21405,131,9529,63554,131,9\r
- * 529,63555,130,9529,63556,118,9529,21869,116,0,12.4]\r
- * 平台回复:\r
- * [IC*YYYYYYYYYYYYYYY*LEN*AL]\r
- * 实例:[IC*334588000000156*0002*AL]\r
- * 说明:终端产生警情后发送报警信息到平台,若终端没有收到回复,则定时上报直到收到报警确认为止.\r
- */\r
-\r
- StringBuilder sb=new StringBuilder();\r
- String cmd=cmdMap.get(CMD_TYPE.AL);\r
- sb.append(TimeUtil.getSystemDateYYMMDD()).append(CMDSPLIT)\r
- .append(TimeUtil.getSystemTimeHHmmss()).append(CMDSPLIT)\r
- .append(runtime.getFZDGPSData()).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(runtime)).append(CMDSPLIT)\r
- .append(runtime.getFZDLBSMultiStationData()).append(CMDSPLIT)\r
- .append(runtime.getFZDWifiData());\r
-\r
- return genFZDCMD(cmd,sb.toString());\r
- }\r
-\r
- public static StringMessage 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(UPLOAD());\r
- try {\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
- }catch (Exception e){\r
- ICLogger.e(e.getMessage(),e);\r
- }\r
- }\r
-\r
- public static StringMessage heart(int hrt){\r
- return genFZDCMD(cmdMap.get(CMD_TYPE.heart),String.valueOf(hrt));\r
- }\r
- public static StringMessage oxygen(int ox){\r
- return genFZDCMD(cmdMap.get(CMD_TYPE.oxygen),String.valueOf(ox));\r
- }\r
-\r
- public static StringMessage 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 StringMessage temp(double temp){\r
- return genFZDCMD(cmdMap.get(CMD_TYPE.temp),String.format("%.1f",temp));\r
- }\r
- public static StringMessage POWEROFF(){\r
- return genFZDCMD(cmdMap.get(CMD_TYPE.POWEROFF));\r
- }\r
- public void handlePOWEROFF(Connection connection) {\r
-\r
- connection.send(POWEROFF());\r
- }\r
- public static StringMessage CR(){\r
- return genFZDCMD(cmdMap.get(CMD_TYPE.CR));\r
- }\r
- public void handleCR(Connection connection) {\r
-\r
- connection.send(CR());\r
- }\r
- public static StringMessage bldstart(){\r
- return genFZDCMD(cmdMap.get(CMD_TYPE.bldstart));\r
- }\r
- public void handleBldstart(Connection connection) {\r
-\r
- connection.send(bldstart());\r
- }\r
- public static StringMessage wdstart(){\r
- return genFZDCMD(cmdMap.get(CMD_TYPE.wdstart));\r
- }\r
- public void handleWdstart(Connection connection,Runtime runtime ,String data) {\r
-\r
- connection.send(wdstart());\r
- try {\r
- int freq = Integer.parseInt(data);\r
-\r
-\r
- Config.setTemperatureTestCycle(runtime, freq);\r
- CoreService.getInstance().setTempAlarm();\r
-\r
- if(runtime.check_stat_do_temp_test()) TemperatureUtil.doTempTestInThread();\r
- }catch (Exception e){\r
- ICLogger.e(e.getMessage(),e);\r
- }\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 StringMessage hrtstart(){\r
- return genFZDCMD(cmdMap.get(CMD_TYPE.hrtstart));\r
- }\r
- public void handleHrtstart(Connection connection) {\r
-\r
- connection.send(hrtstart());\r
- }\r
- public static StringMessage FIND(){\r
- return genFZDCMD(cmdMap.get(CMD_TYPE.FIND));\r
- }\r
- public void handleFIND(Connection connection) {\r
-\r
- connection.send(FIND());\r
- }\r
- public static StringMessage 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(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
- public static StringMessage PHL(){\r
- return genFZDCMD(cmdMap.get(CMD_TYPE.PHL));\r
- }\r
-\r
- public void handlePHL(Connection connection,Runtime runtime,String cmd,String data){\r
- /***\r
- * [IC*334588000000156*len*PHL,号码,名字,号码,名字,号码,名字,号码,名字,号码,名字] len:发送长度 16 进制表示 占用 2 个字节\r
- * 号码:ascii 字符 名字:Unicode 编码\r
- * 该接口融合了白名单和电话本的功能,最多对应 50 组号码与名字,号码不超过 20 个 ascii 字符, 姓名不超过 10 个 Unicode 字符。\r
- * 示 例 : [IC*334588000000156*0010*PHL,110,5F204E09]\r
- * 5F204E09--->张三,是使用 unicode 编码\r
- * 终端回复:[IC*334588000000156*0003*PHL]\r
- */\r
-\r
- String list[]=data.split(CMDSPLIT);\r
- int listlen=list.length;\r
- boolean ispared= (( listlen >0) && (listlen%2 == 0));\r
- if (ispared){\r
- ArrayList<Contact> contactArray=new ArrayList<Contact>();\r
- for(int i=0; i<listlen;i+=2){\r
- String phonem=list[i];\r
- String name = Util.decodeUnicode2Utf8(list[i+1]);\r
- ICLogger.i(i/2 +" 姓名 "+name+", 电话 "+phonem);\r
- contactArray.add(new Contact(Contact.CATEGORY_CALL,name,phonem));\r
- }\r
-// contactArray.add(new Contact(Contact.CATEGORY_GROUP,"All","666"));\r
-// contactArray.add(new Contact(Contact.CATEGORY_PARTNER,"PARTNER","666"));\r
-// contactArray.add(new Contact(Contact.CATEGORY_CARE,"CARE","666"));\r
-// contactArray.add(new Contact(Contact.CATEGORY_VOLTE,"VOLTE","666"));\r
-\r
- runtime.getDbHelper().saveContacts(contactArray,false,false,true,false,false,false);\r
- }else{\r
- ICLogger.i("没有电话本!执行清除操作!");\r
- }\r
- connection.send(PHL());\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
- Intent intent = new Intent("android.intent.action.MAIN");\r
-// intent.putExtra("ACTIVITY_TYPE", 2);\r
-// intent.addCategory("android.intent.category.DEFAULT");\r
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\r
- intent.setComponent(componentName);\r
- dev.getContextProxy().context.startActivity(intent);\r
- }\r
-\r
- public static StringMessage PRACTICE(HealthInfo healthInfo){\r
- if (healthInfo!=null && healthInfo.getInfoCount()>0)\r
- return genFZDCMD(cmdMap.get(CMD_TYPE.PRACTICE),String.valueOf(healthInfo.getBufferDataStr()));\r
- else\r
- return null;\r
- }\r
-\r
- public boolean handleCmd(CMD_TYPE type, String cmd , String data) {\r
-\r
- //普通非二进制命令用此函数处理\r
- boolean ret=true;\r
- ICLogger.i("handleCmd "+type.name() + " strLen="+data.length());\r
- if (Config.LOG_TOFILE)ICLogger.logToFile("APILog", " recv " + cmd +" "+ data);\r
- switch (type){\r
- case LK: //登录包\r
- ICLogger.i("服务器收到登录包LK");\r
- mConnection.DeliverCMDMessageToSystem("login",cmd);//通知下面线程状态变化\r
- break;\r
- case KA:\r
- ICLogger.i("服务器收到心跳包KA");\r
- mConnection.DeliverCMDMessageToSystem("heartbeat",cmd);//通知下面线程状态变化\r
- break;\r
-\r
- case PING:\r
- handlePing(mRuntime,data);\r
- ICLogger.i("服务器返回Ping绑定信息");\r
- break;\r
- case CR:\r
- //立即定位指令(长链接有效)\r
- handleCR(mConnection);\r
- mConnection.DeliverCMDMessageToSystem("StartLocate",cmd);//通知下面线程状态变化\r
- break;\r
-\r
-// case BP07:\r
-// //收到发送的语音包\r
-// handleBP07(cmd,mConnection);\r
-// break;\r
-// case BP10:\r
-// //报警包\r
-// mConnection.DeliverCMDMessageToSystem("AP10",cmd);//通知下面线程状态变化\r
-// break;\r
-//\r
-// case BPTM:\r
-// //校时命令\r
-// handleBPTM(cmd);\r
-// ICLogger.i("服务器收到校时命令APTM");\r
-// mConnection.DeliverCMDMessageToSystem("APTM",cmd);//通知下面线程状态变化\r
-// break;\r
-// case BP85://设置闹钟\r
-// handleBP85(cmd,mConnection,mRuntime);\r
-// 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 BP34:\r
-// //设置工作模式\r
-// handleBP34(mConnection,mRuntime,cmd);\r
-// mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化\r
-// break;\r
-//\r
-//// case BP05: //L02服务器不适用\r
-//// //查询服务器语音 返回信息\r
-//// 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 PHL:\r
- //收到设置白名单号码\r
- ICLogger.i("收到服务器设置白名单号码命令BP14");\r
- handlePHL(mConnection,mRuntime,cmd,data);\r
- break;\r
-// case BP15:\r
-// 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
-//\r
-// case BP18:\r
-// //收到重启\r
-// handleBP18(mConnection,cmd);\r
-// ICLogger.i("收到服务器重启命令BP18");\r
-// mConnection.DeliverCMDMessageToSystem("Reboot",cmd);//通知下面线程状态变化\r
-// break;\r
-//\r
- case POWEROFF:\r
- //收到关机\r
- handlePOWEROFF(mConnection);\r
- ICLogger.i("收到服务器关机命令BP31");\r
- mConnection.DeliverCMDMessageToSystem("poweroff",cmd);//通知下面线程状态变化\r
- break;\r
-// case BP40:\r
-// //服务器推送文本\r
-// handleBP40(mConnection,mRuntime,cmd);\r
-// ICLogger.i("收到服务器推送文本消息");\r
-// mConnection.DeliverCMDMessageToSystem("showTxt",cmd);//通知下面线程状态变化\r
-// break;\r
-//\r
- case hrtstart:\r
- handleHrtstart(mConnection);\r
- ICLogger.i("收到服务器心率检测命令");\r
- if(mRuntime.check_stat_do_ppg_test()) HeartRateManager.triggerPPGtest();\r
- break;\r
- case bldstart:\r
- handleBldstart(mConnection);\r
- ICLogger.i("收到服务器血压检测命令");\r
- if(mRuntime.check_stat_do_ppg_test()) HeartRateManager.triggerPPGtest();\r
- break;\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 LGZONE:\r
- ICLogger.i("收到服务器时间 LGZONE "+data);\r
- handleLGZONE(mRuntime,data);\r
- break;\r
-// case BP84:\r
-// handleBP84(cmd,mConnection);\r
-// ICLogger.i("收到服务器白名单命令");\r
-// break;\r
-//\r
-// case BP86:\r
-// //绑定解绑消息\r
-// handleBP86(cmd,mConnection,mRuntime);\r
-// mConnection.DeliverCMDMessageToSystem("AP86",cmd);//通知下面线程状态变化\r
-//\r
-// break;\r
-//\r
- case FIND:\r
- //收到查找设备消息\r
- handleFIND(mConnection);\r
- mConnection.DeliverCMDMessageToSystem("findDev",cmd);//通知下面线程状态变化\r
- break;\r
-// case BP89:\r
-// //心率/血压阀值\r
-// handleBP89(cmd,mConnection);\r
-// mConnection.DeliverCMDMessageToSystem("AP89",cmd);//通知下面线程状态变化\r
-// break;\r
-//\r
-// case BPTE: //设置测试体温\r
-// handleBPTE(cmd,mConnection,mRuntime);\r
-// mConnection.DeliverCMDMessageToSystem("APTE",cmd);//通知下面线程状态变化\r
-// break;\r
-//\r
-// case BPTP:\r
-// handleBPTP();\r
-// mConnection.DeliverCMDMessageToSystem("APTP",cmd);//通知下面线程状态变化\r
-// break;\r
-// case BPHP:\r
-// handleBPHP();\r
-// mConnection.DeliverCMDMessageToSystem("IWAPHP",cmd);//通知下面线程状态变化\r
-// break;\r
-// case BPX1://设置 心率血压血氧修正值\r
-// handleBPX1(cmd,mConnection,mRuntime);\r
-// ICLogger.i("收到服务器设置 心率血压血氧修正值BPX1");\r
-// mConnection.DeliverCMDMessageToSystem("APX1",cmd);//通知下面线程状态变化\r
-// break;\r
-//\r
-// case BPS4: //提醒设置(时间段) 主要为久坐设置提醒时长。\r
-// handleBPS4(cmd,mConnection,mRuntime);\r
-// ICLogger.i("收到 提醒设置(时间段)");\r
-// mConnection.DeliverCMDMessageToSystem("APS4",cmd);//通知下面线程状态变化\r
-// break;\r
-// case BPDE:\r
-// handleBPDE(mConnection,cmd,mRuntime);\r
-// ICLogger.i(" 收到 进出围栏通知!");\r
-// mConnection.DeliverCMDMessageToSystem("APDE",cmd);//通知下面线程状态变化\r
-// break;\r
-//\r
-// case BPTU:\r
-// handleBPTU(cmd, mConnection);\r
-// ICLogger.i("收到服务器 图片语音 消息 BPTU");\r
-// // mConnection.DeliverCMDMessageToSystem("APTU", "");//通知下面线程状态变化\r
-// break;\r
-// case BPDF:\r
-// handleBPDF(mConnection,cmd,mRuntime);\r
-// ICLogger.i(" 收到 体温阈值设置!");\r
-// mConnection.DeliverCMDMessageToSystem("APDF",cmd);//通知下面线程状态变化\r
-// break;\r
-\r
- }\r
-\r
- return ret;\r
-\r
- }\r
-\r
-\r
- public boolean handleCmd(CMD_TYPE type, String cmd, byte[] bytes) {\r
-\r
- //只有需要传递二级制数据的才需要这个函数,目前只有BP28需要\r
-\r
- boolean ret=true;\r
- ICLogger.i("handleCmd "+type.name() + " "+cmd+" bytelen="+bytes.length );\r
- if (Config.LOG_TOFILE) ICLogger.logToFile("APILog", " recv " +new String(bytes));\r
- switch (type) {\r
- case LK:\r
- // handleBP28(mConnection,cmd, mRuntime,bytes);\r
- ICLogger.i("收到服务器语音BP28");\r
- mConnection.DeliverCMDMessageToSystem("BP28", "");//通知下面线程状态变化\r
- break;\r
- }\r
- return ret;\r
- }\r
-\r
-}\r
+package com.ic.protocols;
+
+import android.content.ComponentName;
+//import android.content.IClipboard;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Environment;
+
+//import com.android.internal.telephony.uicc.RuimFileHandler;
+import com.enqualcomm.support.Config;
+import com.enqualcomm.support.CoreService;
+import com.enqualcomm.support.bean.Alarm;
+import com.enqualcomm.support.bean.Contact;
+import com.enqualcomm.support.bean.Content;
+import com.enqualcomm.support.bean.HealthInfo;
+import com.enqualcomm.support.bean.ICLocation;
+import com.enqualcomm.support.bean.Runtime;
+import com.enqualcomm.support.bean.StringMessage;
+import com.enqualcomm.support.bean.VoiceContent;
+import com.enqualcomm.support.bean.voicePacket;
+import com.enqualcomm.support.service.HeartRateManager;
+import com.enqualcomm.support.utils.Connection;
+import com.enqualcomm.support.utils.ICLogger;
+import com.enqualcomm.support.utils.MD5;
+import com.enqualcomm.support.utils.TemperatureUtil;
+import com.enqualcomm.support.utils.TimeUtil;
+import com.enqualcomm.support.utils.Util;
+import com.enqualcomm.support.utils.regexUtil;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+
+import chestnut.utils.PhoneUtils;
+
+import static com.enqualcomm.support.Constants.ACTION_HEATR_RATE_START;
+import static com.enqualcomm.support.LocationClient.LOCATION_MODE;
+import static com.enqualcomm.support.bean.Contact.GROUP_ALL;
+import static java.lang.Math.abs;
+
+public class protocol_fzd {
+ private static final String TAG = "ICSrv." + protocol_fzd.class.getSimpleName();
+ private static final String PrivKEY = "XMQcHi0lGIdru6xzW7lygBwBT8N0c09P";
+ private static final String CMDHEADER = "[";
+ private static final String CMDCOMPANY="IC";
+ private static final String CMDEND = "]";
+ private static final String CMDHEADERSPLIT = "*";
+ private static final String CMDSPLIT = ",";
+
+ public static final String defaultServerIP="api.xcloudtech.com";
+ public static final int defaultServerPort=9000;
+
+ public enum CMD_TYPE {
+ /*终端发起*/
+ //链路保持数据
+ LK,//登录
+ PING,//绑定查询
+ KA,//心跳包
+ UD,//位置上传
+ UD2,//盲点位置上传
+ AL,//报警数据上传
+ LGZONE,//获取服务器时区时间
+ WT,//获取天气
+ img,//上传图片
+ VOICE,//上传语音
+ WG,//请求位置信息
+ DLT,//解绑
+ temp,//体温上传
+ /* 服务器发起*/
+ UPLOAD,//数据上传间隔设置
+ CENTER,//中心号码设置
+ CALL, //拨打电话
+ MONITOR,//监听
+ SOS,//SOS 号码设置
+ FACTORY,//恢复出厂设置
+ SOSSMS,//SOS 短信报警开关
+ LOWBAT,//低电短信报警开关
+ VERNO,//版本查询
+ CR,//定位指令
+ POWEROFF,//关机指令
+ REMOVE,//取下手环报警开关
+ REMOVESMS,//取下手表短信报警开关
+ PEDO,//计步功能开关
+ SILENCETIME,//免打扰时间段设置
+ SILENCETIME2, //免打扰时间段设置
+ SLEEPTIME,//翻转检测时间段设置
+ FIND,//找手表指令
+ REMIND,//闹钟设置指令
+ TK,//对讲功能(微聊发送语音)
+ PHL,//设置电话本+白名单(最多 50 条)
+ wdstart,//远程测温
+ bldstart,//远程测血压
+ hrtstart,//远程测量心率
+ BOOTOFF,//定时关机
+ oxygen,//血氧上传
+ blood,//血压上传
+ heart,//心率上传
+ PRACTICE,//自由锻炼数据上传
+ UNKNOWN_CMD,
+ }
+
+ private static HashMap<CMD_TYPE, String> cmdMap = null;
+
+ static {
+ cmdMap = new HashMap<CMD_TYPE, String>();
+ cmdMap.put(CMD_TYPE.LK, "LK");
+ cmdMap.put(CMD_TYPE.PING, "PING");
+ cmdMap.put(CMD_TYPE.KA, "KA");
+ cmdMap.put(CMD_TYPE.UD, "UD");
+ cmdMap.put(CMD_TYPE.UD2, "UD2");
+ cmdMap.put(CMD_TYPE.AL, "AL");
+ cmdMap.put(CMD_TYPE.LGZONE, "LGZONE");
+ cmdMap.put(CMD_TYPE.WT, "WT");
+ cmdMap.put(CMD_TYPE.img, "img");
+ cmdMap.put(CMD_TYPE.VOICE, "VOICE");
+ cmdMap.put(CMD_TYPE.WG, "WG");
+ cmdMap.put(CMD_TYPE.DLT, "DLT");
+ cmdMap.put(CMD_TYPE.temp, "temp");
+ cmdMap.put(CMD_TYPE.UPLOAD, "UPLOAD");
+ cmdMap.put(CMD_TYPE.CENTER, "CENTER");
+ cmdMap.put(CMD_TYPE.CALL, "CALL");
+ cmdMap.put(CMD_TYPE.MONITOR, "MONITOR");
+ cmdMap.put(CMD_TYPE.SOS, "SOS");
+ cmdMap.put(CMD_TYPE.FACTORY, "FACTORY");
+ cmdMap.put(CMD_TYPE.SOSSMS, "SOSSMS");
+ cmdMap.put(CMD_TYPE.LOWBAT, "LOWBAT");
+ cmdMap.put(CMD_TYPE.VERNO, "VERNO");
+ cmdMap.put(CMD_TYPE.CR, "CR");
+ cmdMap.put(CMD_TYPE.POWEROFF, "POWEROFF");
+ cmdMap.put(CMD_TYPE.REMOVE, "REMOVE");
+ cmdMap.put(CMD_TYPE.REMOVESMS, "REMOVESMS");
+ cmdMap.put(CMD_TYPE.PEDO, "PEDO");
+ cmdMap.put(CMD_TYPE.SILENCETIME, "SILENCETIME");
+ cmdMap.put(CMD_TYPE.SILENCETIME2, "SILENCETIME2");
+ cmdMap.put(CMD_TYPE.SLEEPTIME, "SLEEPTIME");
+ cmdMap.put(CMD_TYPE.FIND, "FIND");
+ cmdMap.put(CMD_TYPE.REMIND, "REMIND");
+ cmdMap.put(CMD_TYPE.TK, "TK");
+ cmdMap.put(CMD_TYPE.PHL, "PHL");
+ cmdMap.put(CMD_TYPE.wdstart, "wdstart");
+ cmdMap.put(CMD_TYPE.bldstart, "bldstart");
+ cmdMap.put(CMD_TYPE.hrtstart, "hrtstart");
+ cmdMap.put(CMD_TYPE.BOOTOFF, "BOOTOFF");
+ cmdMap.put(CMD_TYPE.oxygen, "oxygen");
+ cmdMap.put(CMD_TYPE.blood, "blood");
+ cmdMap.put(CMD_TYPE.heart, "heart");
+ cmdMap.put(CMD_TYPE.PRACTICE, "PRACTICE");
+ }
+
+ private Connection mConnection=null;
+ private Runtime mRuntime=null;
+
+ public protocol_fzd(Connection connect, Runtime runtime) {
+ mConnection=connect;
+ mRuntime=runtime;
+
+ }
+
+ private StringBuffer cmdbuf = new StringBuffer();
+
+// /*
+// 输入的字符串,如果有完整命令,返回 true
+// 否则返回 false
+// */
+// public boolean isCmdStr(String msg) {
+// /***
+// * IC*334588000000156*LEN*FALLDOWN
+// */
+// String cmd;
+// int index=msg.indexOf(CMDSPLIT);
+// if (index > 0){
+// cmd = msg.substring(0,index);
+// }else{
+// cmd = msg;
+// }
+// if (regexUtil.isFZDCMD(cmd) ) {
+// return true;
+// }
+// return false;
+// }
+
+ private void log(String msg) {
+ ICLogger.log(TAG, msg);
+ }
+
+ private void log(String function, String msg) {
+ ICLogger.log(TAG, function, msg);
+ }
+
+
+ /**/
+ public static StringMessage genStringMessage(String cmdName, String msg){
+ StringMessage sm=new StringMessage(new String[]{cmdName,msg});
+ sm.refresh(msg);
+ sm.setDate(TimeUtil.getSystemDateYYMMDD(),TimeUtil.getSystemTimeHHmmss());
+ return sm;
+ }
+
+ /*
+ 输入的字符串,如果有完整命令,返回 命令名
+ 否则返回 空字符串
+ */
+ public static String isCmdStr(String msg) {
+ String cmd_msgbuf=msg;
+ int cmdindex =cmd_msgbuf.indexOf(CMDCOMPANY+CMDHEADERSPLIT);
+ if (cmdindex>0) { //如果开头不是CMDHEADER但是包含CMDHEADER则删除前面的数据
+ String cmd=cmd_msgbuf.substring(cmdindex);
+ cmd_msgbuf=cmd;
+ }
+ cmdindex=cmd_msgbuf.indexOf(CMDEND);
+ if(cmdindex>0){
+ String cmd=cmd_msgbuf.substring(0,cmdindex);
+ cmd_msgbuf=cmd;
+ }
+ cmdindex=cmd_msgbuf.indexOf(CMDSPLIT);
+ if(cmdindex>0){
+ String cmd=cmd_msgbuf.substring(0,cmdindex);
+ cmd_msgbuf=cmd;
+ }
+
+ if (regexUtil.isFZDCMD(cmd_msgbuf)) {
+ for (CMD_TYPE key : cmdMap.keySet()) {
+ if (regexUtil.isFZDCMD(cmdMap.get(key), cmd_msgbuf)) { //如果是FZD命令,则进行处理,否则保留数据动
+ ICLogger.i("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key));
+ return cmdMap.get(key);
+ }
+ }
+ return "";
+ }else
+ return "";
+ }
+ /*
+ 返回true 表示 cmd 全部解析成功
+ 返回false表示 cmd至少有一条解析失败,失败的数据归入buffer,下一次识别接着使用
+ 字符串通过#号进行识别。
+ 每个字符串如果发现 #,却又没有Header,“IW”则会被丢弃
+ */
+ public boolean parserCmd(byte[] bytes) {
+ String cmd_msgbuf=new String(bytes);
+ log("bytes.size "+bytes.length);
+ cmdbuf.append(cmd_msgbuf);
+ log("cmdbuf.size "+cmdbuf.length() +" "+cmdbuf.toString());
+ int cmdindex =cmd_msgbuf.indexOf(CMDCOMPANY+CMDHEADERSPLIT);
+ if (cmdindex>0) { //如果开头不是CMDHEADER但是包含CMDHEADER则删除前面的数据
+ String cmd=cmd_msgbuf.substring(cmdindex);
+ cmd_msgbuf=cmd;
+ }
+ cmdindex=cmd_msgbuf.indexOf(CMDEND);
+ if(cmdindex>0){
+ String cmd=cmd_msgbuf.substring(0,cmdindex);
+ cmd_msgbuf=cmd;
+ }
+ cmdindex=cmd_msgbuf.indexOf(CMDSPLIT);
+ if(cmdindex>0){
+ String cmd=cmd_msgbuf.substring(0,cmdindex);
+ cmd_msgbuf=cmd;
+ }
+ if (cmdbuf.toString().split(CMDCOMPANY+CMDHEADERSPLIT).length>1)
+ {
+ ICLogger.i("More than 1 cmd in buffer ! just log it");
+ }
+ for (CMD_TYPE key : cmdMap.keySet()) {
+ // ICLogger.i("key "+cmdMap.get(key)+" cmdbuf "+cmd_msgbuf);
+ if (regexUtil.isFZDCMD(cmdMap.get(key),cmd_msgbuf)) { //如果是FZD命令,则进行处理,否则保留数据动
+ String data=cmdbuf.toString().replace(CMDHEADER,"").replace(cmd_msgbuf,"").replace(CMDEND,"");
+// ICLogger.i("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key) + " , " + cmdbuf.toString() + " "+cmd_msgbuf + " data "+data );
+// if (key == CMD_TYPE.TK) {
+// //如果是BP28则 后面的数据是音频,需要保留
+// byte[] amrBuf;
+// int amrLen = getBP28Amrlen(cmdlist[i] );
+// if (bytes.length > amrLen) {
+// handleCmd(key, cmdlist[i], bytes);
+// }
+// } else {
+ if (data.startsWith(CMDSPLIT)) data=data.substring(1);
+ handleCmd(key, cmd_msgbuf,data);
+ cmdbuf.delete(0,cmdbuf.length());//处理后清空
+// }
+ }
+ }
+ return true;
+ }
+
+ private static String getHexLen(int len){
+ StringBuilder sb=new StringBuilder();
+ int v = len & 0xFFFF;
+ String hv = Integer.toHexString(v);
+ if (hv.length() ==1 ) {
+ sb.append(0).append(0).append(0);
+ }else if (hv.length()==2){
+ sb.append(0).append(0);
+ }else if (hv.length()==3){
+ sb.append(0);
+ }
+ sb.append(hv);
+ return sb.toString();
+ }
+ private static String genHeader(int len,String cmd){
+
+ if (CoreService.getInstance()==null)
+ return "";
+
+ String imei =CoreService.getInstance().getRuntime().IMEI();
+ return new StringBuilder().append(CMDCOMPANY).append(CMDHEADERSPLIT)
+ .append(imei).append(CMDHEADERSPLIT)
+ .append(getHexLen(len)).append(CMDHEADERSPLIT).append(cmd).toString();
+ }
+
+ private static String keyheader(String cmd,int len){
+ String header=genHeader(len,cmd);
+ String key= MD5.getCMDStringMD5(header+PrivKEY);
+ return key;
+ }
+
+ public static StringMessage genFZDCMD( String CMD){
+ StringBuilder sb=new StringBuilder();
+ int len=CMD.length();
+ String header=genHeader(len,CMD);
+ String keyheader=keyheader(CMD,len);
+ sb.append(CMDHEADER).append(keyheader).append(header).append(CMDEND);
+ return genStringMessage(CMD,sb.toString());
+ }
+ public static StringMessage genFZDCMD( String CMD,String data){
+ StringBuilder sb=new StringBuilder();
+ String data_buf=CMD+CMDSPLIT+data;
+ int data_buf_len=data_buf.length();
+ String header=genHeader(data_buf_len,CMD);
+ String keyheader=keyheader(CMD,data_buf_len);//计算header md5值
+ sb.append(CMDHEADER).append(keyheader).append(header).append(CMDSPLIT).append(data).append(CMDEND);
+ return genStringMessage(CMD,sb.toString());
+ }
+ /*登录*/
+ public static StringMessage LK() {
+ /*IC*YYYYYYYYYYYYYYY*LEN*LK*/
+ return genFZDCMD(cmdMap.get(CMD_TYPE.LK));
+ }
+
+ /**
+ * 绑定
+ * */
+ public static StringMessage PING(){
+// IC*YYYYYYYYYYYYYYY*LEN*PING
+ return genFZDCMD(cmdMap.get(CMD_TYPE.PING));
+ }
+
+
+ public static void handlePing(Runtime runtime,String data){
+// [IC*YYYYYYYYYYYYYYY*LEN*PING,是否绑定(0 表示未绑定,1 表示绑定)]
+// 实例:[IC*334588000000156*0006*PING,0]或[IC*334588000000156*0006*PING,1]
+ try {
+ int bind = Integer.parseInt(data);
+ if (bind == 0) {
+ ICLogger.i("设备未绑定!");
+ runtime.BindingStatus = false;
+ } else {
+ ICLogger.i("设备已绑定!");
+ runtime.BindingStatus = true;
+ }
+ }catch (Exception e){
+ ICLogger.e(e.getMessage(),e);
+ }
+
+ }
+
+ public static StringMessage KA(Runtime runtime){
+//[IC*YYYYYYYYYYYYYYY*LEN*KA,日期,步数,翻滚次数,电量百分数] 实例:[IC*334588000000156*0014*KA,120414,50,100,100]
+ 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());
+ return genFZDCMD(cmd,sb.toString());
+ }
+
+
+ public void handleKA(Runtime runtime,String data){
+
+ }
+
+
+ public static StringMessage LGZONE(Runtime runtime) {
+ return genFZDCMD(cmdMap.get(CMD_TYPE.LGZONE));
+ }
+ public void handleLGZONE(Runtime runtime, String data){
+
+ /***
+ * 平台回复:[XT*YYYYYYYYYYYYYYY*LEN*LGZONE,时区,时间,日期]
+ * 实例: [XT*1234567890*001D*LGZONE,+8,08:00:00,2016-01-12]
+ */
+ String[] list=data.split(CMDSPLIT);
+ if (list.length==3){
+ String timeZone=list[0].trim();
+ String date=list[2].trim();
+ String time=list[1].trim();
+ Date datetime= TimeUtil.parseDatetiime(date,time);
+ int timezone;
+ try
+ {
+ timezone=Integer.parseInt(timeZone.replace("+","").trim());
+ }catch (Exception e){
+ ICLogger.e("timezone",e);
+ timezone=8;
+ }
+
+ 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!");
+ }
+
+
+ }
+
+
+ /*LBS+GPS混合定位*/
+ public static StringMessage UD(Runtime runtime) {
+ /***
+ * [IC*334588000000156*00CD*UD,180916,025723,A,22.570733,N,113.8626083,E,0.00,249.5,0.0,6,100, 60,0,0,00000010,7,255,460,1,9529,21809,158,9529,63555,133,9529,63554,129,9529,21405,126,95
+ * 29,21242,124,9529,21151,120,9529,63556,119,0]
+ * 说明:
+ * 数据内容:
+ * UD,命令号
+ * 180916,日期(年月日)(0 时区),表示 0 时区的二零一八年九月十六号
+ *
+ * 025723,时间(时分秒)(0 时区),表示 0 时区的两点五十七分二十三秒A,gps 定位有效
+ * 22.570733,纬度
+ * N,纬度表示113.8626083,经度
+ * E,经度表示0.00,速度
+ * 249.5,方向
+ * 0.0,海拔
+ * 6,卫星个数
+ *
+ * 100,gsm 信号强度
+ * 60,电量
+ * 0,计步数
+ * 0,翻转次数
+ * 00000010,终端状态,数据为 16 进制,解析成二进制为 0000 0000 0000 0000 0000 0000 0001 0000
+ * 前面 4 个字节表示状态,后面 4 个字节表示报警,数据中第 4 位为 1,对照文档最后的数据解析,表示手表静止状态。详细可参看文档最后部分。
+ * 7,基站个数
+ * 255,460,1,9529,21809,158,9529,63555,133,9529,63554,129,9529,21405,126,9529,21242,124,9529,
+ * 21151,120,9529,63556,119,基站信息
+ * 0,WiFi 个数
+ *
+ */
+
+
+ StringBuilder sb=new StringBuilder();
+ String cmd=cmdMap.get(CMD_TYPE.UD);
+ sb.append(TimeUtil.getSystemDateYYMMDD()).append(CMDSPLIT)
+ .append(TimeUtil.getSystemTimeHHmmss()).append(CMDSPLIT)
+ .append(runtime.getFZDGPSData()).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(runtime)).append(CMDSPLIT)
+ .append(runtime.getFZDLBSMultiStationData()).append(CMDSPLIT)
+ .append(runtime.getFZDWifiData());
+
+ return genFZDCMD(cmd,sb.toString());
+ }
+
+
+ /*LBS+WiFi混合定位*/
+ public static String UD2(Runtime ds) {
+ //示例数据:IWAP02,
+ // zh_cn,
+ // 0,
+ // 7,
+ // 460,0,
+ // 9520|3671|13,9520|3672|12,9520|3673|11,9520|3674|10,9520|3675|9,9520|3676|8,9520|3677|7,
+ // 4,
+ // 1|D8-24-BD-79-FA-1F|59&2|3C-46-D8-6D-CE-01|81&3|0C-4C-39-1A-7C-65|69&4|70-A8-E3-5D-D7-C0|65#
+// IW标识符
+// AP02:命令字
+// zh_cn: 语言标志
+// 0:回复标识,为0时不回复地址,为 1 时,服务器回复地址信息
+// 7: 表示共有7组基站
+// 460: MCC 国家码
+// 0: MNC运营商代码
+// 9520|3671|10: LAC|CID|dbm表示一组基站信息,后面数量需和基站组数地应 10:dbm为信号强度多基站信号强度建议从高到低排列后上传,信号强度转正数:150 – abs(dbm)
+// 4: 表示WIFI组数,
+// 1|D8-24-BD-79-FA-1F|59: ssid|mac地址|信号强度,信号强度转正数:150 – abs(信号强度)
+
+ int apsum=0;
+ String wifiinfo=ds.getWifiInfo();
+ if (!wifiinfo.isEmpty()) {
+ String[] list = wifiinfo.split("&");
+ apsum = list.length;
+ }
+
+ ICLogger.i("Wifi ap sum "+apsum);
+ return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.LK)).append(CMDSPLIT)
+ .append(ds.getLanguage()).append(CMDSPLIT)
+ .append(0).append(CMDSPLIT) //为0时不回复地址
+ .append(ds.getLBSMultiStationData()).append(CMDSPLIT) //基站信息数据
+ .append(apsum).append(CMDSPLIT).append(ds.getWifiInfo()).append(CMDEND).toString(); //wifi信息数据
+ }
+
+ //处理 定位 BP01
+ public void handleUD2(String cmd){
+ log("BP02定位接收成功");
+ }
+
+
+ public static StringMessage AL(Runtime runtime){
+ /***
+ * [IC*334588000000156*00CD*AL,180916,064153,A,22.570512,N,113.8623267,E,0.00,154.8,0.0,11,10 0,100,0,0,00100018,7,0,460,1,9529,21809,155,9529,21242,132,9529,21405,131,9529,63554,131,9
+ * 529,63555,130,9529,63556,118,9529,21869,116,0,12.4]
+ * 平台回复:
+ * [IC*YYYYYYYYYYYYYYY*LEN*AL]
+ * 实例:[IC*334588000000156*0002*AL]
+ * 说明:终端产生警情后发送报警信息到平台,若终端没有收到回复,则定时上报直到收到报警确认为止.
+ */
+
+ StringBuilder sb=new StringBuilder();
+ String cmd=cmdMap.get(CMD_TYPE.AL);
+ sb.append(TimeUtil.getSystemDateYYMMDD()).append(CMDSPLIT)
+ .append(TimeUtil.getSystemTimeHHmmss()).append(CMDSPLIT)
+ .append(runtime.getFZDGPSData()).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(runtime)).append(CMDSPLIT)
+ .append(runtime.getFZDLBSMultiStationData()).append(CMDSPLIT)
+ .append(runtime.getFZDWifiData());
+
+ return genFZDCMD(cmd,sb.toString());
+ }
+
+ public static StringMessage UPLOAD(){
+
+ return genFZDCMD(cmdMap.get(CMD_TYPE.UPLOAD));
+ }
+
+ public void handleUPLOAD(Connection connection,Runtime runtime,String cmd,String data){
+ connection.send(UPLOAD());
+ try {
+ int timesecond = Integer.parseInt(data);
+ int mod = runtime.getLocationInstance().getWorkingMod();
+ log("LOCATION_MODE " + LOCATION_MODE + " mod " + mod);
+ Config.setLocationMode(runtime.getContextProxy().context, mod);
+ Config.setLocationCycle(runtime.getContextProxy().context, timesecond);
+ runtime.getLocationInstance().setLocation_cycle(timesecond);
+ runtime.getLocationInstance().setWorkingMod(mod);
+// CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod());
+ //此处设置好配置后,会在LocationClient通过消息开始执行及时定位操作。
+ }catch (Exception e){
+ ICLogger.e(e.getMessage(),e);
+ }
+ }
+
+ public static StringMessage heart(int hrt){
+ return genFZDCMD(cmdMap.get(CMD_TYPE.heart),String.valueOf(hrt));
+ }
+ public static StringMessage oxygen(int ox){
+ return genFZDCMD(cmdMap.get(CMD_TYPE.oxygen),String.valueOf(ox));
+ }
+
+ public static StringMessage blood(int pbl,int pbh){
+ String data=pbh+CMDSPLIT+pbl;
+ return genFZDCMD(cmdMap.get(CMD_TYPE.blood),data);
+ }
+
+ public static StringMessage temp(double temp){
+ return genFZDCMD(cmdMap.get(CMD_TYPE.temp),String.format("%.1f",temp));
+ }
+ public static StringMessage POWEROFF(){
+ return genFZDCMD(cmdMap.get(CMD_TYPE.POWEROFF));
+ }
+ public void handlePOWEROFF(Connection connection) {
+
+ connection.send(POWEROFF());
+ }
+ public static StringMessage CR(){
+ return genFZDCMD(cmdMap.get(CMD_TYPE.CR));
+ }
+ public void handleCR(Connection connection) {
+
+ connection.send(CR());
+ }
+ public static StringMessage bldstart(){
+ return genFZDCMD(cmdMap.get(CMD_TYPE.bldstart));
+ }
+ public void handleBldstart(Connection connection) {
+
+ connection.send(bldstart());
+ }
+ public static StringMessage wdstart(){
+ return genFZDCMD(cmdMap.get(CMD_TYPE.wdstart));
+ }
+ public void handleWdstart(Connection connection,Runtime runtime ,String data) {
+
+ connection.send(wdstart());
+ try {
+ int freq = Integer.parseInt(data);
+
+
+ Config.setTemperatureTestCycle(runtime, freq);
+ CoreService.getInstance().setTempAlarm();
+
+ if(runtime.check_stat_do_temp_test()) TemperatureUtil.doTempTestInThread();
+ }catch (Exception e){
+ ICLogger.e(e.getMessage(),e);
+ }
+//
+// double wrist_temp,body_temp;
+// wrist_temp= TemperatureUtil.get_temp_value_adjusted();
+// body_temp=TemperatureUtil.getBodyTemp(wrist_temp,26.0f);
+// String temperatureMsg=temp(body_temp);
+// connection.send(genStringMessage("temp",temperatureMsg));
+ }
+ public static StringMessage hrtstart(){
+ return genFZDCMD(cmdMap.get(CMD_TYPE.hrtstart));
+ }
+ public void handleHrtstart(Connection connection) {
+
+ connection.send(hrtstart());
+ }
+ public static StringMessage FIND(){
+ return genFZDCMD(cmdMap.get(CMD_TYPE.FIND));
+ }
+ public void handleFIND(Connection connection) {
+
+ connection.send(FIND());
+ }
+ public static StringMessage SOS(){
+ return genFZDCMD(cmdMap.get(CMD_TYPE.SOS));
+ }
+
+
+ public void handleSOS(Connection connection,Runtime runtime,String cmd,String data) {
+
+ connection.send(SOS());
+ if (data!=null && data.length()>0) {
+ String list[] = data.split(CMDSPLIT);
+ if (list.length==1){
+ ArrayList<Contact> contactArray=new ArrayList<Contact>();
+ if (regexUtil.isMobileNumber( list[0]) || regexUtil.isPhoneNumber(list[0]))
+ {
+ contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos1",list[0]));
+ ICLogger.i("find SOS1 number "+list[0]);
+ }
+ }else if (list.length==2){
+
+ ArrayList<Contact> contactArray=new ArrayList<Contact>();
+ if (regexUtil.isMobileNumber( list[0]) || regexUtil.isPhoneNumber(list[0]))
+ {
+ contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos1",list[0]));
+ ICLogger.i("find SOS1 number "+list[0]);
+ }
+ if (regexUtil.isMobileNumber( list[1]) || regexUtil.isPhoneNumber(list[1]))
+ {
+ contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos2",list[1]));
+ ICLogger.i("find SOS2 number "+list[1]);
+ }
+
+ runtime.getDbHelper().saveContacts(contactArray,false,false,false,false,false,true);
+
+ }
+ }
+
+
+ }
+ public static StringMessage PHL(){
+ return genFZDCMD(cmdMap.get(CMD_TYPE.PHL));
+ }
+
+ public void handlePHL(Connection connection,Runtime runtime,String cmd,String data){
+ /***
+ * [IC*334588000000156*len*PHL,号码,名字,号码,名字,号码,名字,号码,名字,号码,名字] len:发送长度 16 进制表示 占用 2 个字节
+ * 号码:ascii 字符 名字:Unicode 编码
+ * 该接口融合了白名单和电话本的功能,最多对应 50 组号码与名字,号码不超过 20 个 ascii 字符, 姓名不超过 10 个 Unicode 字符。
+ * 示 例 : [IC*334588000000156*0010*PHL,110,5F204E09]
+ * 5F204E09--->张三,是使用 unicode 编码
+ * 终端回复:[IC*334588000000156*0003*PHL]
+ */
+
+ String list[]=data.split(CMDSPLIT);
+ int listlen=list.length;
+ boolean ispared= (( listlen >0) && (listlen%2 == 0));
+ if (ispared){
+ ArrayList<Contact> contactArray=new ArrayList<Contact>();
+ for(int i=0; i<listlen;i+=2){
+ String phonem=list[i];
+ String name = Util.decodeUnicode2Utf8(list[i+1]);
+ ICLogger.i(i/2 +" 姓名 "+name+", 电话 "+phonem);
+ contactArray.add(new Contact(Contact.CATEGORY_CALL,name,phonem));
+ }
+// contactArray.add(new Contact(Contact.CATEGORY_GROUP,"All","666"));
+// contactArray.add(new Contact(Contact.CATEGORY_PARTNER,"PARTNER","666"));
+// contactArray.add(new Contact(Contact.CATEGORY_CARE,"CARE","666"));
+// contactArray.add(new Contact(Contact.CATEGORY_VOLTE,"VOLTE","666"));
+
+ runtime.getDbHelper().saveContacts(contactArray,false,false,true,false,false,false);
+ }else{
+ ICLogger.i("没有电话本!执行清除操作!");
+ }
+ connection.send(PHL());
+ }
+
+ public void sendBroadcast(String cmd, Runtime dev) {
+
+ ComponentName componentName = new ComponentName("com.eqc.watch", "com.eqc.watch.launcher.ChatActivity");
+ Intent intent = new Intent("android.intent.action.MAIN");
+// intent.putExtra("ACTIVITY_TYPE", 2);
+// intent.addCategory("android.intent.category.DEFAULT");
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ intent.setComponent(componentName);
+ dev.getContextProxy().context.startActivity(intent);
+ }
+
+ public static StringMessage PRACTICE(HealthInfo healthInfo){
+ if (healthInfo!=null && healthInfo.getInfoCount()>0)
+ return genFZDCMD(cmdMap.get(CMD_TYPE.PRACTICE),String.valueOf(healthInfo.getBufferDataStr()));
+ else
+ return null;
+ }
+
+ public boolean handleCmd(CMD_TYPE type, String cmd , String data) {
+
+ //普通非二进制命令用此函数处理
+ boolean ret=true;
+ ICLogger.i("handleCmd "+type.name() + " strLen="+data.length());
+ if (Config.LOG_TOFILE)ICLogger.logToFile("APILog", " recv " + cmd +" "+ data);
+ switch (type){
+ case LK: //登录包
+ ICLogger.i("服务器收到登录包LK");
+ mConnection.DeliverCMDMessageToSystem("login",cmd);//通知下面线程状态变化
+ break;
+ case KA:
+ ICLogger.i("服务器收到心跳包KA");
+ mConnection.DeliverCMDMessageToSystem("heartbeat",cmd);//通知下面线程状态变化
+ break;
+ case AL:
+ mConnection.DeliverCMDMessageToSystem("AL",cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+ break;
+ case PRACTICE:
+ mConnection.DeliverCMDMessageToSystem("PRACTICE",cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+ break;
+ case PING:
+ handlePing(mRuntime,data);
+ ICLogger.i("服务器返回Ping绑定信息");
+ break;
+ case CR:
+ //立即定位指令(长链接有效)
+ handleCR(mConnection);
+ mConnection.DeliverCMDMessageToSystem("StartLocate",cmd);//通知下面线程状态变化
+ break;
+
+// case BP07:
+// //收到发送的语音包
+// handleBP07(cmd,mConnection);
+// break;
+// case BP10:
+// //报警包
+// mConnection.DeliverCMDMessageToSystem("AP10",cmd);//通知下面线程状态变化
+// break;
+//
+// case BPTM:
+// //校时命令
+// handleBPTM(cmd);
+// ICLogger.i("服务器收到校时命令APTM");
+// mConnection.DeliverCMDMessageToSystem("APTM",cmd);//通知下面线程状态变化
+// break;
+// case BP85://设置闹钟
+// handleBP85(cmd,mConnection,mRuntime);
+// ICLogger.i("收到服务器设置闹钟命令BP85");
+// mConnection.DeliverCMDMessageToSystem("AP85",cmd);//通知下面线程状态变化
+// break;
+ case UPLOAD:
+ //设置工作模式
+ handleUPLOAD(mConnection,mRuntime,cmd,data);
+ mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化
+//
+// break;
+// case BP34:
+// //设置工作模式
+// handleBP34(mConnection,mRuntime,cmd);
+// mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化
+// break;
+//
+//// case BP05: //L02服务器不适用
+//// //查询服务器语音 返回信息
+//// API.handleBP05(cmd);
+//// break;
+//
+ case SOS:
+ //收到设置SOS号码
+ handleSOS(mConnection,mRuntime,cmd,data);
+ ICLogger.i("收到服务器设置SOS号码命令BP12");
+ break;
+ case PHL:
+ //收到设置白名单号码
+ ICLogger.i("收到服务器设置白名单号码命令BP14");
+ handlePHL(mConnection,mRuntime,cmd,data);
+ break;
+// case BP15:
+// handleBP15(cmd,mConnection,mRuntime);
+// ICLogger.i("收到服务器设置定位命令BP15");
+// break;
+// case BP17:
+// //收到恢复出厂设置
+// handleBP17(mConnection,cmd);
+// ICLogger.i("收到服务器恢复出厂设置命令BP17");
+// mConnection.DeliverCMDMessageToSystem("FactoryReset",cmd);//通知下面线程状态变化
+// break;
+//
+// case BP18:
+// //收到重启
+// handleBP18(mConnection,cmd);
+// ICLogger.i("收到服务器重启命令BP18");
+// mConnection.DeliverCMDMessageToSystem("Reboot",cmd);//通知下面线程状态变化
+// break;
+//
+ case POWEROFF:
+ //收到关机
+ handlePOWEROFF(mConnection);
+ ICLogger.i("收到服务器关机命令BP31");
+ mConnection.DeliverCMDMessageToSystem("poweroff",cmd);//通知下面线程状态变化
+ break;
+// case BP40:
+// //服务器推送文本
+// handleBP40(mConnection,mRuntime,cmd);
+// ICLogger.i("收到服务器推送文本消息");
+// mConnection.DeliverCMDMessageToSystem("showTxt",cmd);//通知下面线程状态变化
+// break;
+//
+ case hrtstart:
+ handleHrtstart(mConnection);
+ ICLogger.i("收到服务器心率检测命令");
+ if(mRuntime.check_stat_do_ppg_test()) HeartRateManager.triggerPPGtest();
+ break;
+ case bldstart:
+ handleBldstart(mConnection);
+ ICLogger.i("收到服务器血压检测命令");
+ if(mRuntime.check_stat_do_ppg_test()) HeartRateManager.triggerPPGtest();
+ break;
+ case wdstart:
+ handleWdstart(mConnection,mRuntime,data);
+ ICLogger.i("收到服务器体温测试及设置命令");
+ break;
+ case blood:
+ ICLogger.i("服务器收到上传的血压");
+ mConnection.DeliverCMDMessageToSystem("blood",cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+ break;
+ case oxygen:
+ ICLogger.i("服务器收到上传的血氧");
+ mConnection.DeliverCMDMessageToSystem("oxygen",cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+ break;
+ case temp:
+ ICLogger.i("服务器收到上传的体温");
+ mConnection.DeliverCMDMessageToSystem("temp",cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+ break;
+ case heart:
+ ICLogger.i("服务器收到上传的心率heart");
+ mConnection.DeliverCMDMessageToSystem("heart",cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+ break;
+ case LGZONE:
+ ICLogger.i("收到服务器时间 LGZONE "+data);
+ handleLGZONE(mRuntime,data);
+ break;
+// case BP84:
+// handleBP84(cmd,mConnection);
+// ICLogger.i("收到服务器白名单命令");
+// break;
+//
+// case BP86:
+// //绑定解绑消息
+// handleBP86(cmd,mConnection,mRuntime);
+// mConnection.DeliverCMDMessageToSystem("AP86",cmd);//通知下面线程状态变化
+//
+// break;
+//
+ case FIND:
+ //收到查找设备消息
+ handleFIND(mConnection);
+ mConnection.DeliverCMDMessageToSystem("findDev",cmd);//通知下面线程状态变化
+ break;
+// case BP89:
+// //心率/血压阀值
+// handleBP89(cmd,mConnection);
+// mConnection.DeliverCMDMessageToSystem("AP89",cmd);//通知下面线程状态变化
+// break;
+//
+// case BPTE: //设置测试体温
+// handleBPTE(cmd,mConnection,mRuntime);
+// mConnection.DeliverCMDMessageToSystem("APTE",cmd);//通知下面线程状态变化
+// break;
+//
+// case BPTP:
+// handleBPTP();
+// mConnection.DeliverCMDMessageToSystem("APTP",cmd);//通知下面线程状态变化
+// break;
+// case BPHP:
+// handleBPHP();
+// mConnection.DeliverCMDMessageToSystem("IWAPHP",cmd);//通知下面线程状态变化
+// break;
+// case BPX1://设置 心率血压血氧修正值
+// handleBPX1(cmd,mConnection,mRuntime);
+// ICLogger.i("收到服务器设置 心率血压血氧修正值BPX1");
+// mConnection.DeliverCMDMessageToSystem("APX1",cmd);//通知下面线程状态变化
+// break;
+//
+// case BPS4: //提醒设置(时间段) 主要为久坐设置提醒时长。
+// handleBPS4(cmd,mConnection,mRuntime);
+// ICLogger.i("收到 提醒设置(时间段)");
+// mConnection.DeliverCMDMessageToSystem("APS4",cmd);//通知下面线程状态变化
+// break;
+// case BPDE:
+// handleBPDE(mConnection,cmd,mRuntime);
+// ICLogger.i(" 收到 进出围栏通知!");
+// mConnection.DeliverCMDMessageToSystem("APDE",cmd);//通知下面线程状态变化
+// break;
+//
+// case BPTU:
+// handleBPTU(cmd, mConnection);
+// ICLogger.i("收到服务器 图片语音 消息 BPTU");
+// // mConnection.DeliverCMDMessageToSystem("APTU", "");//通知下面线程状态变化
+// break;
+// case BPDF:
+// handleBPDF(mConnection,cmd,mRuntime);
+// ICLogger.i(" 收到 体温阈值设置!");
+// mConnection.DeliverCMDMessageToSystem("APDF",cmd);//通知下面线程状态变化
+// break;
+
+ }
+
+ return ret;
+
+ }
+
+
+ public boolean handleCmd(CMD_TYPE type, String cmd, byte[] bytes) {
+
+ //只有需要传递二级制数据的才需要这个函数,目前只有BP28需要
+
+ boolean ret=true;
+ ICLogger.i("handleCmd "+type.name() + " "+cmd+" bytelen="+bytes.length );
+ if (Config.LOG_TOFILE) ICLogger.logToFile("APILog", " recv " +new String(bytes));
+ switch (type) {
+ case LK:
+ // handleBP28(mConnection,cmd, mRuntime,bytes);
+ ICLogger.i("收到服务器语音BP28");
+ mConnection.DeliverCMDMessageToSystem("BP28", "");//通知下面线程状态变化
+ break;
+ }
+ return ret;
+ }
+
+}
-package com.ic.protocols;\r
-\r
-import android.content.ComponentName;\r
-import android.content.Intent;\r
-import android.text.TextUtils;\r
-\r
-import com.enqualcomm.support.Config;\r
-import com.enqualcomm.support.CoreService;\r
-import com.enqualcomm.support.adapter.BTHelper;\r
-import com.enqualcomm.support.bean.Contact;\r
-import com.enqualcomm.support.bean.Runtime;\r
-import com.enqualcomm.support.bean.StringMessage;\r
-import com.enqualcomm.support.service.HeartRateManager;\r
-import com.enqualcomm.support.utils.Connection;\r
-import com.enqualcomm.support.utils.ICLogger;\r
-import com.enqualcomm.support.utils.MD5;\r
-import com.enqualcomm.support.utils.TemperatureUtil;\r
-import com.enqualcomm.support.utils.TimeUtil;\r
-import com.enqualcomm.support.utils.Util;\r
-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.Constants.ACTION_HEATR_RATE_START;\r
-import static com.enqualcomm.support.LocationClient.LOCATION_MODE;\r
-import static java.lang.Math.abs;\r
-\r
-//import android.content.IClipboard;\r
-//import com.android.internal.telephony.uicc.RuimFileHandler;\r
-\r
-public class protocol_mqtt {\r
- private static final String TAG = "ICSrv." + protocol_mqtt.class.getSimpleName();\r
- private static final String CMDHEADER = "[";\r
- private static final String CMDEND = "]";\r
- private static final String CMDSPLIT = ",";\r
-\r
- public static final String defaultTestServerIP = "47.106.237.76";\r
- public static final String defaultServerIP = "mq0.waveon.cn";\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 final String username="yq_watch";\r
- public static final String passwd="yq_watch@yg2020";\r
- public static String MQTT_CLIENT_TOPIC_HEADER = "";\r
-\r
- public enum CMD_TYPE {\r
- // cmd_type 含义\r
- // 终端主动上传\r
- BREQ, // 手表请求绑定(新增)\r
- KA, // 心跳连接\r
- LGZONE, // 获取服务器端时间\r
- UD, // 位置数据上报\r
- AL, // 报警位置数据上报\r
- ALARM, // 报警数据上报\r
- temp, // 上传体温数据\r
- heart, // 终端心率上传\r
- blood, // 上传血压数据\r
- oxygen, // 上传血氧数据\r
- // 平台主动下发\r
- UPLOAD, // 数据上传间隔设置\r
- hrtstart, // 设置心率、血氧、血压上传频率\r
- wdstart, // 设置体温上传频率\r
- CENTER, // 中心号码设置\r
- MONITOR, // 监听\r
- SOS, // 设置SOS 号码\r
- FACTORY, // 恢复出厂设置\r
- REMOVE, // 取下手环报警开关\r
- PEDO, // 计步功能开关\r
- MSGDOWN, // 消息下发到指定手表(新增)\r
- UNKNOWN_CMD,\r
- }\r
-\r
- private static HashMap<CMD_TYPE, String> cmdMap = null;\r
-\r
- static {\r
- cmdMap = new HashMap<CMD_TYPE, String>();\r
- cmdMap.put(CMD_TYPE.BREQ, "BREQ");\r
- cmdMap.put(CMD_TYPE.KA, "KA");\r
- cmdMap.put(CMD_TYPE.LGZONE, "LGZONE");\r
- cmdMap.put(CMD_TYPE.UD, "UD");\r
- cmdMap.put(CMD_TYPE.AL, "AL");\r
- cmdMap.put(CMD_TYPE.ALARM, "ALARM");\r
- cmdMap.put(CMD_TYPE.temp, "temp");\r
- cmdMap.put(CMD_TYPE.heart, "heart");\r
- cmdMap.put(CMD_TYPE.blood, "blood");\r
- cmdMap.put(CMD_TYPE.oxygen, "oxygen");\r
- //下发\r
- cmdMap.put(CMD_TYPE.UPLOAD, "UPLOAD");\r
- cmdMap.put(CMD_TYPE.hrtstart, "hrtstart");\r
- cmdMap.put(CMD_TYPE.wdstart, "wdstart");\r
- cmdMap.put(CMD_TYPE.CENTER, "CENTER");\r
- cmdMap.put(CMD_TYPE.MONITOR, "MONITOR");\r
- cmdMap.put(CMD_TYPE.SOS, "SOS");\r
- cmdMap.put(CMD_TYPE.FACTORY, "FACTORY");\r
- cmdMap.put(CMD_TYPE.REMOVE, "REMOVE");\r
- cmdMap.put(CMD_TYPE.PEDO, "PEDO");\r
- cmdMap.put(CMD_TYPE.MSGDOWN, "MSGDOWN");\r
-\r
- }\r
-\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
-\r
- }\r
-\r
- private StringBuffer cmdbuf = new StringBuffer();\r
-\r
-\r
- private void log(String msg) {\r
- ICLogger.log(TAG, msg);\r
- }\r
-\r
- private void log(String function, String msg) {\r
- ICLogger.log(TAG, function, msg);\r
- }\r
-\r
-\r
- /**/\r
- public static StringMessage genStringMessage(String cmdName, String msg) {\r
- StringMessage sm = new StringMessage(new String[]{cmdName, msg});\r
- sm.refresh(msg);\r
- sm.setDate(TimeUtil.getSystemDateYYMMDD(),TimeUtil.getSystemTimeHHmmss());\r
- return sm;\r
- }\r
-\r
-\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
- for (CMD_TYPE key : cmdMap.keySet()) {\r
-// ICLogger.i("mqtt isCmdStr cmd " + msg.cmd()+" " +cmdtype +" key " + cmdMap.get(key));\r
- if (cmdMap.get(key).equals(cmdtype)) {\r
-// ICLogger.i("Find cmd "+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(cmdtype+" bytes.size " + bytes.length+" "+cmd_msgbuf);\r
-// cmdbuf.append(cmd_msgbuf);\r
-// log("cmdbuf.size " + cmdbuf.length() + " " + cmdbuf.toString());\r
-\r
-// String[] cmdlist=cmdbuf.toString().split(CMDEND+CMDHEADER);\r
-\r
-// for ( String cmditem : cmdlist ) {\r
- cmd_msgbuf = cmd_msgbuf.replace(CMDHEADER, "").replace(CMDEND, "").replace("'","");\r
- for (CMD_TYPE key : cmdMap.keySet()) {\r
- if (cmdMap.get(key).toString().equals(cmdtype)) {\r
- handleCmd(key, cmdtype, cmd_msgbuf);\r
- return true;\r
- }\r
- }\r
-// }\r
-\r
- return false;\r
- }\r
-\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
- sb.append(0).append(0).append(0);\r
- } else if (hv.length() == 2) {\r
- sb.append(0).append(0);\r
- } else if (hv.length() == 3) {\r
- sb.append(0);\r
- }\r
- sb.append(hv);\r
- return sb.toString();\r
- }\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
- ;\r
- return genStringMessage(sbtopic.toString(), sb.toString());\r
- }\r
-\r
-\r
- /**\r
- * 终端发布(平台订阅):\r
- * 终端向“WBG100/v1/BREQ/ID_手表IMEI”的主题发布 [LEN,MQTT注册时的账号及密码的密文]\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
- return genMqttCMDMsg(cmdMap.get(CMD_TYPE.BREQ), mqttKey, runtime.IMEI());\r
- }\r
-\r
-\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
- * 实例: 若手表IMEI号为334588000000156,绑定的区域为123456789,\r
- * 经纬度为:22.570512,N,113.8623267,E,\r
- * beacon mac:0x5947ffff0001, 5947ffff0002\r
- * 则终端订阅“WBG100/v1/ID_334588000000156/+”的主题列表,会收到平台的回应\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].trim();\r
- runtime.bleInfo.gps_n = list[2].trim();\r
- runtime.bleInfo.gps_e = list[4].trim();\r
- runtime.bleInfo.btMacList.clear();\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].trim().toLowerCase());\r
- sb.append(",").append(list[i]);\r
- }\r
- ICLogger.i(sb.toString());\r
- }\r
- }\r
-\r
- public static StringMessage KA(Runtime runtime) {\r
-\r
- /***\r
- * 终端向“WBG100/v1/KA/ID_手表IMEI”的主题发布 [LEN, 日期,步数,翻滚次数,电量百分数,区域id]\r
- *\r
- * 实例:若手表IMEI号为334588000000156,请求绑定时下发的区域id为123456789,\r
- * 则向WBG100/v1/KA/ID_334588000000156的主题发布 [001B,120414,50,100,100, 123456789]\r
- *\r
- * 终端订阅(平台发布):\r
- * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,会收到平台的回应\r
- * 平台发布的子主题为:KA\r
- * 回应的消息为:[LEN,KA]\r
- */\r
- if(runtime.bleInfo.ble_area_id.isEmpty()){\r
- return null;\r
- }\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
- public static StringMessage UD(Runtime runtime) {\r
- /***\r
- * [LEN,定位数据,区域id]\r
- *\r
- * 实例:若手表IMEI号为334588000000156,请求绑定时下发的区域id为123456789,\r
- * 则向WBG100/v1/LGZONE/ID_334588000000156的主题发布\r
- * [00D7,180916,025723,A,22.570733,N,113.8626083,E,0.00,249.5,0.0,6,100,\r
- * 60,0,0,00000010,7,255,460,1,9529,21809,158,9529,63555,133,9529,63554,129,9529,21405,126,9529,21242,124,9529,21151,120,9529,63556,119,0,123456789]\r
- * 说明:\r
- * 数据内容:\r
- * 180916,日期(年月日)(0 时区),表示0 时区的二零一八年九月十六号\r
- * 025723,时间(时分秒)(0 时区),表示0 时区的两点五十七分二十三秒\r
- * A,gps 定位有效\r
- * 22.570733,纬度\r
- * N,纬度表示\r
- * 113.8626083,经度\r
- * E,经度表示\r
- * 0.00,速度\r
- * 249.5,方向\r
- * 0.0,海拔\r
- * 6,卫星个数\r
- * 100,gsm 信号强度\r
- * 60,电量\r
- * 0,计步数\r
- * 0,翻转次数\r
- * 00000010,终端状态,数据为16 进制,解析成二进制为0000 0000 0000 0000 0000 0000 0001 0000 前面4 个字节表示状态,后面4 个字节表示报警,数据中第4 位为1,对照文档最后的数据解析,表示手表静止状态。详细可参看文档最后部分。\r
- * 7,基站个数\r
- * 255,460,1,9529,21809,158,9529,63555,133,9529,63554,129,9529,21405,126,9529,21242,124,9529,21151,120,9529,63556,119,基站信息\r
- * 0,WiFi 个数\r
- * 123456789,为区域id\r
- */\r
-\r
- if(runtime.bleInfo.ble_area_id.isEmpty()){\r
- ICLogger.i("not Bind, skip send Location!");\r
- return null;\r
- }\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.getMqttGPSData()).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(runtime)).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.ble_area_id);\r
- return genMqttCMDMsg(cmd, sb.toString(), runtime.IMEI());\r
- }\r
-\r
-\r
- //处理 定位 BP01\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
- if(runtime.bleInfo.ble_area_id.isEmpty()){\r
- return null;\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].trim();\r
- String date=list[3].trim();\r
- String time=list[2].trim();\r
- Date datetime= TimeUtil.parseDatetiime(date,time);\r
-\r
- int timezone;\r
- try\r
- {\r
- timezone=Integer.parseInt(timeZone.replace("+","").trim());\r
- }catch (Exception e){\r
- ICLogger.e("timezone",e);\r
- timezone=8;\r
- }\r
-\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 StringMessage AL(Runtime runtime){\r
-/***\r
- * 报警数据上报(AL)\r
- * 终端发布(平台订阅):\r
- * 终端向“WBG100/v1/AL/ID_手表IMEI”的主题发布 [LEN,位置数据(见附录一),区域id]\r
- *\r
- * 终端订阅(平台发布):\r
- * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,会收到平台的回应\r
- * 平台发布的子主题为:AL\r
- * 回应的消息为:[LEN, AL]\r
- *\r
- * 说明:终端产生警情后发送报警信息到平台,若终端没有收到回复,则定时上报直到收到报警确认为止.\r
- */\r
- if(runtime.bleInfo.ble_area_id.isEmpty()){\r
- return null;\r
- }\r
- StringBuilder sb = new StringBuilder();\r
- String cmd = cmdMap.get(CMD_TYPE.AL);\r
- sb.append(TimeUtil.getUTCSystemDateYYMMDD())\r
- .append(CMDSPLIT).append(TimeUtil.getUTCSystemTimeHHmmss())\r
- .append(CMDSPLIT).append(runtime.getMqttGPSData())\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(runtime))\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 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].trim())) {\r
- try {\r
- int timesecond = Integer.parseInt(list[1].trim());\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
- }catch (Exception e){\r
- ICLogger.e(e.getMessage(),e);\r
- }\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.trim())){\r
- try {\r
- int cycle_int = Integer.parseInt(cycle.trim());\r
- ICLogger.i("收到服务器指令:设置体温上传频率 " + cycle + "秒");\r
-\r
- Config.setTemperatureTestCycle(runtime, cycle_int);\r
- CoreService.getInstance().setTempAlarm();\r
- if(runtime.check_stat_do_temp_test()) TemperatureUtil.doTempTestInThread();\r
- }catch (Exception e){\r
- ICLogger.e(e.getMessage(),e);\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 genMqttCMDMsg(cmdMap.get(CMD_TYPE.hrtstart),runtime.bleInfo.ble_area_id,runtime.IMEI());\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.trim())){\r
- try {\r
- int cycle_int = Integer.parseInt(cycle.trim());\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
- }catch (Exception e){\r
- ICLogger.e(e.getMessage(),e);\r
- }\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
- *\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
- Intent intent = new Intent("android.intent.action.MAIN");\r
-// intent.putExtra("ACTIVITY_TYPE", 2);\r
-// intent.addCategory("android.intent.category.DEFAULT");\r
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\r
- intent.setComponent(componentName);\r
- dev.getContextProxy().context.startActivity(intent);\r
- }\r
-\r
- public boolean handleCmd(CMD_TYPE type, String cmd , String data) {\r
-\r
- //普通非二进制命令用此函数处理\r
- boolean ret=true;\r
- ICLogger.i("mqtt handleCmd "+type.name() + " strLen="+data.length());\r
-\r
- switch (type){\r
-\r
- case KA:\r
- ICLogger.i("服务器收到心跳包KA");\r
- mConnection.DeliverCMDMessageToSystem("heartbeat",cmd);//通知下面线程状态变化\r
- break;\r
-\r
- case BREQ:\r
- handleBREQ(mRuntime,data);\r
- //ICLogger.i("服务器返回Ping绑定信息");\r
- ICLogger.i("服务器收到登录包BREQ");\r
- mConnection.DeliverCMDMessageToSystem("login",cmd);//通知下面线程状态变化\r
- break;\r
- case LGZONE:\r
- handleLGZONE(mConnection,mRuntime,data);\r
- break;\r
-\r
- case UD:\r
- 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
-// mConnection.DeliverCMDMessageToSystem("StartLocate",cmd);//通知下面线程状态变化\r
-// break;\r
-\r
-// case BP07:\r
-// //收到发送的语音包\r
-// handleBP07(cmd,mConnection);\r
-// break;\r
-// case BP10:\r
-// //报警包\r
-// mConnection.DeliverCMDMessageToSystem("AP10",cmd);//通知下面线程状态变化\r
-// break;\r
-//\r
-// case BPTM:\r
-// //校时命令\r
-// handleBPTM(cmd);\r
-// ICLogger.i("服务器收到校时命令APTM");\r
-// mConnection.DeliverCMDMessageToSystem("APTM",cmd);//通知下面线程状态变化\r
-// break;\r
-// case BP85://设置闹钟\r
-// handleBP85(cmd,mConnection,mRuntime);\r
-// 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 BP34:\r
-// //设置工作模式\r
-// handleBP34(mConnection,mRuntime,cmd);\r
-// mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化\r
-// break;\r
-//\r
-//// case BP05: //L02服务器不适用\r
-//// //查询服务器语音 返回信息\r
-//// 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 PHL:\r
-// //收到设置白名单号码\r
-// ICLogger.i("收到服务器设置白名单号码命令BP14");\r
-// handlePHL(mConnection,mRuntime,cmd,data);\r
-// break;\r
-// case BP15:\r
-// handleBP15(cmd,mConnection,mRuntime);\r
-// ICLogger.i("收到服务器设置定位命令BP15");\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
-// handleBP18(mConnection,cmd);\r
-// ICLogger.i("收到服务器重启命令BP18");\r
-// mConnection.DeliverCMDMessageToSystem("Reboot",cmd);//通知下面线程状态变化\r
-// break;\r
-//\r
-\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,mRuntime,data);\r
- ICLogger.i("收到服务器心率检测命令");\r
- if(mRuntime.check_stat_do_ppg_test()) 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
-// break;\r
-//\r
-// case BP86:\r
-// //绑定解绑消息\r
-// handleBP86(cmd,mConnection,mRuntime);\r
-// mConnection.DeliverCMDMessageToSystem("AP86",cmd);//通知下面线程状态变化\r
-//\r
-// break;\r
-//\r
-\r
-\r
-// case BP89:\r
-// //心率/血压阀值\r
-// handleBP89(cmd,mConnection);\r
-// mConnection.DeliverCMDMessageToSystem("AP89",cmd);//通知下面线程状态变化\r
-// break;\r
-//\r
-// case BPTE: //设置测试体温\r
-// handleBPTE(cmd,mConnection,mRuntime);\r
-// mConnection.DeliverCMDMessageToSystem("APTE",cmd);//通知下面线程状态变化\r
-// break;\r
-//\r
-// case BPTP:\r
-// handleBPTP();\r
-// mConnection.DeliverCMDMessageToSystem("APTP",cmd);//通知下面线程状态变化\r
-// break;\r
-// case BPHP:\r
-// handleBPHP();\r
-// mConnection.DeliverCMDMessageToSystem("IWAPHP",cmd);//通知下面线程状态变化\r
-// break;\r
-// case BPX1://设置 心率血压血氧修正值\r
-// handleBPX1(cmd,mConnection,mRuntime);\r
-// ICLogger.i("收到服务器设置 心率血压血氧修正值BPX1");\r
-// mConnection.DeliverCMDMessageToSystem("APX1",cmd);//通知下面线程状态变化\r
-// break;\r
-//\r
-// case BPS4: //提醒设置(时间段) 主要为久坐设置提醒时长。\r
-// handleBPS4(cmd,mConnection,mRuntime);\r
-// ICLogger.i("收到 提醒设置(时间段)");\r
-// mConnection.DeliverCMDMessageToSystem("APS4",cmd);//通知下面线程状态变化\r
-// break;\r
-// case BPDE:\r
-// handleBPDE(mConnection,cmd,mRuntime);\r
-// ICLogger.i(" 收到 进出围栏通知!");\r
-// mConnection.DeliverCMDMessageToSystem("APDE",cmd);//通知下面线程状态变化\r
-// break;\r
-//\r
-// case BPTU:\r
-// handleBPTU(cmd, mConnection);\r
-// ICLogger.i("收到服务器 图片语音 消息 BPTU");\r
-// // mConnection.DeliverCMDMessageToSystem("APTU", "");//通知下面线程状态变化\r
-// break;\r
-// case BPDF:\r
-// handleBPDF(mConnection,cmd,mRuntime);\r
-// ICLogger.i(" 收到 体温阈值设置!");\r
-// mConnection.DeliverCMDMessageToSystem("APDF",cmd);//通知下面线程状态变化\r
-// break;\r
-\r
- }\r
-\r
- return ret;\r
-\r
- }\r
-\r
-\r
- public boolean handleCmd(CMD_TYPE type, String cmd, byte[] bytes) {\r
-\r
- //只有需要传递二级制数据的才需要这个函数,目前只有BP28需要\r
-\r
- boolean ret=true;\r
- ICLogger.i("handleCmd "+type.name() + " "+cmd+" bytelen="+bytes.length );\r
- if (Config.LOG_TOFILE) ICLogger.logToFile("APILog", " recv " +new String(bytes));\r
-// switch (type) {\r
-// case LK:\r
-// // handleBP28(mConnection,cmd, mRuntime,bytes);\r
-// ICLogger.i("收到服务器语音BP28");\r
-// mConnection.DeliverCMDMessageToSystem("BP28", "");//通知下面线程状态变化\r
-// break;\r
-// }\r
- return ret;\r
- }\r
-\r
-}\r
+package com.ic.protocols;
+
+import android.content.ComponentName;
+import android.content.Intent;
+import android.text.TextUtils;
+
+import com.enqualcomm.support.Config;
+import com.enqualcomm.support.CoreService;
+import com.enqualcomm.support.adapter.BTHelper;
+import com.enqualcomm.support.bean.Contact;
+import com.enqualcomm.support.bean.Runtime;
+import com.enqualcomm.support.bean.StringMessage;
+import com.enqualcomm.support.service.HeartRateManager;
+import com.enqualcomm.support.utils.Connection;
+import com.enqualcomm.support.utils.ICLogger;
+import com.enqualcomm.support.utils.MD5;
+import com.enqualcomm.support.utils.TemperatureUtil;
+import com.enqualcomm.support.utils.TimeUtil;
+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.Constants.ACTION_HEATR_RATE_START;
+import static com.enqualcomm.support.LocationClient.LOCATION_MODE;
+import static java.lang.Math.abs;
+
+//import android.content.IClipboard;
+//import com.android.internal.telephony.uicc.RuimFileHandler;
+
+public class protocol_mqtt {
+ private static final String TAG = "ICSrv." + protocol_mqtt.class.getSimpleName();
+ private static final String CMDHEADER = "[";
+ private static final String CMDEND = "]";
+ private static final String CMDSPLIT = ",";
+
+ public static final String defaultTestServerIP = "47.106.237.76";
+ public static final String defaultServerIP = "mq0.waveon.cn";
+ 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 final String username="yq_watch";
+ public static final String passwd="yq_watch@yg2020";
+ public static String MQTT_CLIENT_TOPIC_HEADER = "";
+
+ public enum CMD_TYPE {
+ // cmd_type 含义
+ // 终端主动上传
+ BREQ, // 手表请求绑定(新增)
+ KA, // 心跳连接
+ LGZONE, // 获取服务器端时间
+ UD, // 位置数据上报
+ AL, // 报警位置数据上报
+ ALARM, // 报警数据上报
+ temp, // 上传体温数据
+ heart, // 终端心率上传
+ blood, // 上传血压数据
+ oxygen, // 上传血氧数据
+ // 平台主动下发
+ UPLOAD, // 数据上传间隔设置
+ hrtstart, // 设置心率、血氧、血压上传频率
+ wdstart, // 设置体温上传频率
+ CENTER, // 中心号码设置
+ MONITOR, // 监听
+ SOS, // 设置SOS 号码
+ FACTORY, // 恢复出厂设置
+ REMOVE, // 取下手环报警开关
+ PEDO, // 计步功能开关
+ MSGDOWN, // 消息下发到指定手表(新增)
+ UNKNOWN_CMD,
+ }
+
+ private static HashMap<CMD_TYPE, String> cmdMap = null;
+
+ static {
+ cmdMap = new HashMap<CMD_TYPE, String>();
+ cmdMap.put(CMD_TYPE.BREQ, "BREQ");
+ cmdMap.put(CMD_TYPE.KA, "KA");
+ cmdMap.put(CMD_TYPE.LGZONE, "LGZONE");
+ cmdMap.put(CMD_TYPE.UD, "UD");
+ cmdMap.put(CMD_TYPE.AL, "AL");
+ cmdMap.put(CMD_TYPE.ALARM, "ALARM");
+ cmdMap.put(CMD_TYPE.temp, "temp");
+ cmdMap.put(CMD_TYPE.heart, "heart");
+ cmdMap.put(CMD_TYPE.blood, "blood");
+ cmdMap.put(CMD_TYPE.oxygen, "oxygen");
+ //下发
+ cmdMap.put(CMD_TYPE.UPLOAD, "UPLOAD");
+ cmdMap.put(CMD_TYPE.hrtstart, "hrtstart");
+ cmdMap.put(CMD_TYPE.wdstart, "wdstart");
+ cmdMap.put(CMD_TYPE.CENTER, "CENTER");
+ cmdMap.put(CMD_TYPE.MONITOR, "MONITOR");
+ cmdMap.put(CMD_TYPE.SOS, "SOS");
+ cmdMap.put(CMD_TYPE.FACTORY, "FACTORY");
+ cmdMap.put(CMD_TYPE.REMOVE, "REMOVE");
+ cmdMap.put(CMD_TYPE.PEDO, "PEDO");
+ cmdMap.put(CMD_TYPE.MSGDOWN, "MSGDOWN");
+
+ }
+
+ private Connection mConnection = null;
+ private Runtime mRuntime = null;
+
+ public protocol_mqtt(Connection connect, Runtime runtime) {
+ mConnection = connect;
+ mRuntime = runtime;
+
+ }
+
+ private StringBuffer cmdbuf = new StringBuffer();
+
+
+ private void log(String msg) {
+ ICLogger.log(TAG, msg);
+ }
+
+ private void log(String function, String msg) {
+ ICLogger.log(TAG, function, msg);
+ }
+
+
+ /**/
+ public static StringMessage genStringMessage(String cmdName, String msg) {
+ StringMessage sm = new StringMessage(new String[]{cmdName, msg});
+ sm.refresh(msg);
+ sm.setDate(TimeUtil.getSystemDateYYMMDD(),TimeUtil.getSystemTimeHHmmss());
+ return sm;
+ }
+
+
+ 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);
+ for (CMD_TYPE key : cmdMap.keySet()) {
+// ICLogger.i("mqtt isCmdStr cmd " + msg.cmd()+" " +cmdtype +" key " + cmdMap.get(key));
+ if (cmdMap.get(key).equals(cmdtype)) {
+// ICLogger.i("Find cmd "+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(cmdtype+" bytes.size " + bytes.length+" "+cmd_msgbuf);
+// cmdbuf.append(cmd_msgbuf);
+// log("cmdbuf.size " + cmdbuf.length() + " " + cmdbuf.toString());
+
+// String[] cmdlist=cmdbuf.toString().split(CMDEND+CMDHEADER);
+
+// for ( String cmditem : cmdlist ) {
+ cmd_msgbuf = cmd_msgbuf.replace(CMDHEADER, "").replace(CMDEND, "").replace("'","");
+ for (CMD_TYPE key : cmdMap.keySet()) {
+ 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();
+ int v = len & 0xFFFF;
+ String hv = Integer.toHexString(v);
+ if (hv.length() == 1) {
+ sb.append(0).append(0).append(0);
+ } else if (hv.length() == 2) {
+ sb.append(0).append(0);
+ } 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;//长度计算要包括逗号
+ 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)
+ ;
+ return genStringMessage(sbtopic.toString(), sb.toString());
+ }
+
+
+ /**
+ * 终端发布(平台订阅):
+ * 终端向“WBG100/v1/BREQ/ID_手表IMEI”的主题发布 [LEN,MQTT注册时的账号及密码的密文]
+ * <p>
+ * 实例: 若手表IMEI号为334588000000156,
+ * MQTT注册时的账号及密码的密文为:QWER15WTF156OQRT1230
+ * 则向WBG100/v1/BREQ/ID_334588000000156的主题发布[0016,QWER15WTF156OQRT1230]
+ */
+ public static StringMessage BREQ(Runtime runtime) {
+ return genMqttCMDMsg(cmdMap.get(CMD_TYPE.BREQ), mqttKey, runtime.IMEI());
+ }
+
+
+ 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]
+ *
+ * 实例: 若手表IMEI号为334588000000156,绑定的区域为123456789,
+ * 经纬度为:22.570512,N,113.8623267,E,
+ * beacon mac:0x5947ffff0001, 5947ffff0002
+ * 则终端订阅“WBG100/v1/ID_334588000000156/+”的主题列表,会收到平台的回应
+ * 先判断子主题是否为: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].trim();
+ runtime.bleInfo.gps_n = list[2].trim();
+ runtime.bleInfo.gps_e = list[4].trim();
+ runtime.bleInfo.btMacList.clear();
+ 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].trim().toLowerCase());
+ sb.append(",").append(list[i]);
+ }
+ ICLogger.i(sb.toString());
+ }
+ }
+
+ public static StringMessage KA(Runtime runtime) {
+
+ /***
+ * 终端向“WBG100/v1/KA/ID_手表IMEI”的主题发布 [LEN, 日期,步数,翻滚次数,电量百分数,区域id]
+ *
+ * 实例:若手表IMEI号为334588000000156,请求绑定时下发的区域id为123456789,
+ * 则向WBG100/v1/KA/ID_334588000000156的主题发布 [001B,120414,50,100,100, 123456789]
+ *
+ * 终端订阅(平台发布):
+ * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,会收到平台的回应
+ * 平台发布的子主题为:KA
+ * 回应的消息为:[LEN,KA]
+ */
+ if(runtime.bleInfo.ble_area_id.isEmpty()){
+ return null;
+ }
+ 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混合定位*/
+ public static StringMessage UD(Runtime runtime) {
+ /***
+ * [LEN,定位数据,区域id]
+ *
+ * 实例:若手表IMEI号为334588000000156,请求绑定时下发的区域id为123456789,
+ * 则向WBG100/v1/LGZONE/ID_334588000000156的主题发布
+ * [00D7,180916,025723,A,22.570733,N,113.8626083,E,0.00,249.5,0.0,6,100,
+ * 60,0,0,00000010,7,255,460,1,9529,21809,158,9529,63555,133,9529,63554,129,9529,21405,126,9529,21242,124,9529,21151,120,9529,63556,119,0,123456789]
+ * 说明:
+ * 数据内容:
+ * 180916,日期(年月日)(0 时区),表示0 时区的二零一八年九月十六号
+ * 025723,时间(时分秒)(0 时区),表示0 时区的两点五十七分二十三秒
+ * A,gps 定位有效
+ * 22.570733,纬度
+ * N,纬度表示
+ * 113.8626083,经度
+ * E,经度表示
+ * 0.00,速度
+ * 249.5,方向
+ * 0.0,海拔
+ * 6,卫星个数
+ * 100,gsm 信号强度
+ * 60,电量
+ * 0,计步数
+ * 0,翻转次数
+ * 00000010,终端状态,数据为16 进制,解析成二进制为0000 0000 0000 0000 0000 0000 0001 0000 前面4 个字节表示状态,后面4 个字节表示报警,数据中第4 位为1,对照文档最后的数据解析,表示手表静止状态。详细可参看文档最后部分。
+ * 7,基站个数
+ * 255,460,1,9529,21809,158,9529,63555,133,9529,63554,129,9529,21405,126,9529,21242,124,9529,21151,120,9529,63556,119,基站信息
+ * 0,WiFi 个数
+ * 123456789,为区域id
+ */
+
+ if(runtime.bleInfo.ble_area_id.isEmpty()){
+ ICLogger.i("not Bind, skip send Location!");
+ return null;
+ }
+ StringBuilder sb = new StringBuilder();
+ String cmd = cmdMap.get(CMD_TYPE.UD);
+ sb.append(TimeUtil.getUTCSystemDateYYMMDD()).append(CMDSPLIT)
+ .append(TimeUtil.getUTCSystemTimeHHmmss()).append(CMDSPLIT)
+ .append(runtime.getMqttGPSData()).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(runtime)).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.ble_area_id);
+ return genMqttCMDMsg(cmd, sb.toString(), runtime.IMEI());
+ }
+
+
+ //处理 定位 BP01
+ 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 点整
+
+ */
+ if(runtime.bleInfo.ble_area_id.isEmpty()){
+ return null;
+ }
+ 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].trim();
+ String date=list[3].trim();
+ String time=list[2].trim();
+ Date datetime= TimeUtil.parseDatetiime(date,time);
+
+ int timezone;
+ try
+ {
+ timezone=Integer.parseInt(timeZone.replace("+","").trim());
+ }catch (Exception e){
+ ICLogger.e("timezone",e);
+ timezone=8;
+ }
+
+ 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 StringMessage AL(Runtime runtime){
+/***
+ * 报警数据上报(AL)
+ * 终端发布(平台订阅):
+ * 终端向“WBG100/v1/AL/ID_手表IMEI”的主题发布 [LEN,位置数据(见附录一),区域id]
+ *
+ * 终端订阅(平台发布):
+ * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,会收到平台的回应
+ * 平台发布的子主题为:AL
+ * 回应的消息为:[LEN, AL]
+ *
+ * 说明:终端产生警情后发送报警信息到平台,若终端没有收到回复,则定时上报直到收到报警确认为止.
+ */
+ if(runtime.bleInfo.ble_area_id.isEmpty()){
+ return null;
+ }
+ StringBuilder sb = new StringBuilder();
+ String cmd = cmdMap.get(CMD_TYPE.AL);
+ sb.append(TimeUtil.getUTCSystemDateYYMMDD())
+ .append(CMDSPLIT).append(TimeUtil.getUTCSystemTimeHHmmss())
+ .append(CMDSPLIT).append(runtime.getMqttGPSData())
+ .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(runtime))
+ .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.ble_area_id);
+ return genMqttCMDMsg(cmd, sb.toString(), runtime.IMEI());
+
+ }
+
+
+ public static StringMessage UPLOAD(Runtime runtime){
+
+
+ return genMqttCMDMsg(cmdMap.get(CMD_TYPE.UPLOAD),runtime.bleInfo.ble_area_id,runtime.IMEI());
+ }
+
+ public void handleUPLOAD(Connection connection,Runtime runtime,String cmd,String data){
+ /**
+ * 数据上传间隔设置(UPLOAD)
+ * 平台发布(终端订阅):
+ * 平台向“WBG100/v1/ID_手表IMEI/UPLOAD”的主题发布 [LEN, 时间间隔]
+ * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为UPLOAD
+ *
+ * 终端发布(平台订阅):
+ * 终端收到数据,向“WBG100/v1/ID_手表IMEI/UPLOAD”的主题发布回应
+ * [LEN,区域id]
+ */
+ connection.send(UPLOAD(runtime));
+ String[] list=data.split(CMDSPLIT);
+ if (TextUtils.isDigitsOnly(list[1].trim())) {
+ try {
+ int timesecond = Integer.parseInt(list[1].trim());
+ int mod = runtime.getLocationInstance().getWorkingMod();
+ log("LOCATION_MODE " + LOCATION_MODE + " mod " + mod + " cycle " + timesecond);
+ Config.setLocationMode(runtime.getContextProxy().context, mod);
+ Config.setLocationCycle(runtime.getContextProxy().context, timesecond);
+ runtime.getLocationInstance().setLocation_cycle(timesecond);
+ runtime.getLocationInstance().setWorkingMod(mod);
+ CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod());
+ }catch (Exception e){
+ ICLogger.e(e.getMessage(),e);
+ }
+ //此处设置好配置后,会在LocationClient通过消息开始执行及时定位操作。
+ }else{
+ ICLogger.i("UPLOAD format error!");
+ }
+ }
+
+ public static StringMessage heart(int hrt,Runtime runtime){
+ /***
+ * 终端心率上传(heart)
+ * 终端发布(平台订阅):
+ * 终端向“WBG100/v1/heart/ID_手表IMEI”的主题发布 [LEN,x,区域id]
+ * x 表示每分钟的心跳次数
+ *
+ * 平台不需要回复
+ * 说明:终端按照设定间隔上报,不需要平台回复.
+ */
+ return genMqttCMDMsg(cmdMap.get(CMD_TYPE.heart),String.valueOf(hrt),runtime.IMEI());
+ }
+ public static StringMessage oxygen(int ox ,Runtime runtime){
+ /***
+ *
+ * 上传血氧数据(oxygen)
+ * 终端发布(平台订阅):
+ * 终端向“WBG100/v1/oxygen/ID_手表IMEI”的主题发布 [LEN,x,区域id]
+ * x 表示血氧饱和度
+ *
+ * 平台不需要回复
+ * 说明:终端按照设定间隔上报,不需要平台回复.
+ */
+ return genMqttCMDMsg(cmdMap.get(CMD_TYPE.oxygen),String.valueOf(ox),runtime.IMEI());
+ }
+
+ public static StringMessage blood(int pbl,int pbh, Runtime runtime){
+ /***
+ * 上传血压数据(blood)
+ * 终端发布(平台订阅):
+ * 终端向“WBG100/v1/blood/ID_手表IMEI”的主题发布 [LEN,x,y,区域id]
+ * x 是收缩压(高压)
+ * y 是舒张压(低压)
+ *
+ * 平台不需要回复
+ * 说明:终端按照设定间隔上报,不需要平台回复.
+ *
+ */
+ String data=pbh+CMDSPLIT+pbl;
+ return genMqttCMDMsg(cmdMap.get(CMD_TYPE.blood),data,runtime.IMEI());
+ }
+
+ public static StringMessage temp(double temp,Runtime runtime){
+ /***
+ * 上传体温数据(temp)
+ * 终端发布(平台订阅):
+ * 终端向“WBG100/v1/temp/ID_手表IMEI”的主题发布 [LEN,x.x,区域id]
+ * X.X: 当前测到温度值,若测到温度为36.2,则 x.x=36.2
+ *
+ * 平台不需要回复
+ * 说明:终端按照设定间隔上报,不需要平台回复.
+ */
+
+ return genMqttCMDMsg(cmdMap.get(CMD_TYPE.temp),String.format("%.1f",temp ),runtime.IMEI());
+ }
+
+ public static StringMessage wdstart(Runtime runtime){
+ return genMqttCMDMsg(cmdMap.get(CMD_TYPE.wdstart),runtime.bleInfo.ble_area_id,runtime.IMEI());
+ }
+ public void handleWdstart(Connection connection,Runtime runtime ,String data) {
+
+/***
+ * 设置体温上传频率(wdstart)
+ * 平台向“WBG100/v1/ID_手表IMEI/wdstart”的主题发布 [LEN, x]
+ * x 为上传间隔时间,单位秒,连续上传时最小时间不小于300 秒,最大不超过65535.
+ * x 为1 则代表终端心率单次上传,上传完后自动关闭。
+ * x 为0 则代表终端心率上传关闭。
+ * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为wdstart
+ *
+ * 终端发布(平台订阅):
+ * 终端收到数据,向“WBG100/v1/ID_手表IMEI/ wdstart”的主题发布回应
+ * [LEN,区域id]
+ */
+ connection.send(wdstart(runtime));
+ String[] list=data.split(CMDSPLIT);
+ if (list.length==2){
+ String cycle=list[1];
+ if (TextUtils.isDigitsOnly(cycle.trim())){
+ try {
+ int cycle_int = Integer.parseInt(cycle.trim());
+ ICLogger.i("收到服务器指令:设置体温上传频率 " + cycle + "秒");
+
+ Config.setTemperatureTestCycle(runtime, cycle_int);
+ CoreService.getInstance().setTempAlarm();
+ if(runtime.check_stat_do_temp_test()) TemperatureUtil.doTempTestInThread();
+ }catch (Exception e){
+ ICLogger.e(e.getMessage(),e);
+ }
+ }else
+ {
+ ICLogger.i("wdstart Format Error!");
+ }
+ }else
+ {
+ ICLogger.i("wdstart Format Error!");
+ }
+ }
+ public static StringMessage hrtstart(Runtime runtime){
+ return genMqttCMDMsg(cmdMap.get(CMD_TYPE.hrtstart),runtime.bleInfo.ble_area_id,runtime.IMEI());
+ }
+ public void handleHrtstart(Connection connection,Runtime runtime, String data) {
+ /***
+ * 设置心率、血氧、血压上传频率(hrtstart)
+ * 平台发布(终端订阅):
+ * 平台向“WBG100/v1/ID_手表IMEI/hrtstart”的主题发布 [LEN, x]
+ * x 为上传间隔时间,单位秒,连续上传时最小时间不小于300 秒,最大不超过65535.
+ * x 为1 则代表终端心率单次上传,上传完后自动关闭。
+ * x 为0 则代表终端心率上传关闭。
+ * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为hrtstart
+ *
+ * 终端发布(平台订阅):
+ * 终端收到数据,向“WBG100/v1/ID_手表IMEI/ hrtstart”的主题发布回应
+ * [LEN,区域id]
+ */
+ connection.send(hrtstart(runtime));
+ String[] list=data.split(CMDSPLIT);
+ if (list.length==2){
+ String cycle=list[1];
+ if (TextUtils.isDigitsOnly(cycle.trim())){
+ try {
+ int cycle_int = Integer.parseInt(cycle.trim());
+ ICLogger.i("收到服务器指令:设置心率血压周期 " + cycle + "秒" + cycle_int / 60 + "分钟");
+
+ //发送重置PPGCycle的广播,会在CoreServer里面执行
+ Intent intent = new Intent();
+ intent.putExtra("PPGTestCycle", cycle_int / 60);
+ runtime.getContextProxy().sendBrodcast(ACTION_HEATR_RATE_START, intent);
+ }catch (Exception e){
+ ICLogger.e(e.getMessage(),e);
+ }
+ }else
+ {
+ ICLogger.i("Hrtstart Format Error!");
+ }
+
+ }else{
+ ICLogger.i("Hrtstart Format Error!");
+ }
+
+ }
+
+ public static StringMessage SOS(Runtime runtime){
+ return genMqttCMDMsg(cmdMap.get(CMD_TYPE.SOS),runtime.bleInfo.ble_area_id,runtime.IMEI());
+ }
+
+
+ public void handleSOS(Connection connection,Runtime runtime,String cmd,String data) {
+/***
+ * 设置SOS 号码(SOS)
+ * 平台发布(终端订阅):
+ * 平台向“WBG100/v1/ID_手表IMEI/SOS”的主题发布 [LEN,电话号码,电话号码]
+ * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为SOS
+ *
+ * 终端发布(平台订阅):
+ * 终端收到数据,向“WBG100/v1/ID_手表IMEI/SOS”的主题发布回应
+ * [LEN,区域id]
+ *
+ * 说明:设置SOS 号码后,触发sos 警情时,终端向设置的几个号码拨打电话,一直没有接听,则循环拨打两轮,接听后则不再继续拨打电话,同时发送报警短信给2 个sos 号码.
+ */
+ connection.send(SOS(runtime));
+ if (data!=null && data.length()>0) {
+ String list[] = data.split(CMDSPLIT);
+ if (list.length==2){
+ ArrayList<Contact> contactArray=new ArrayList<Contact>();
+ if (regexUtil.isMobileNumber( list[1]) || regexUtil.isPhoneNumber(list[1]))
+ {
+ contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos1",list[1]));
+ ICLogger.i("find SOS1 number "+list[1]);
+ runtime.getDbHelper().saveContacts(contactArray,false,false,false,false,false,true);
+ }
+ }else if (list.length==3){
+
+ ArrayList<Contact> contactArray=new ArrayList<Contact>();
+ if (regexUtil.isMobileNumber( list[1]) || regexUtil.isPhoneNumber(list[1]))
+ {
+ contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos1",list[1]));
+ ICLogger.i("find SOS1 number "+list[1]);
+ }
+ if (regexUtil.isMobileNumber( list[2]) || regexUtil.isPhoneNumber(list[2]))
+ {
+ contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos2",list[2]));
+ ICLogger.i("find SOS2 number "+list[2]);
+ }
+
+ runtime.getDbHelper().saveContacts(contactArray,false,false,false,false,false,true);
+
+ }else{
+ ICLogger.i("SOS Format Error!");
+ }
+ }else
+ ICLogger.i("SOS Format Error!");
+
+
+ }
+
+ public static StringMessage FACTORY(Runtime runtime){
+ return genMqttCMDMsg(cmdMap.get(CMD_TYPE.FACTORY),runtime.bleInfo.ble_area_id,runtime.IMEI());
+ }
+
+
+ public void handleFactory(Connection connection,Runtime runtime,String cmd,String data) {
+/***
+ * 恢复出厂设置(FACTORY)
+ * 平台发布(终端订阅):
+ * 平台向“WBG100/v1/ID_手表IMEI/FACTORY”的主题发布 [LEN,FACTORY]
+ * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为FACTORY
+ *
+ * 终端发布(平台订阅):
+ * 终端收到数据,向“WBG100/v1/ID_手表IMEI/FACTORY”的主题发布回应
+ * [LEN,区域id]
+ *
+ * 说明:终端恢复出厂设置,里面设置的号码都将清空
+ */
+ connection.send(FACTORY(runtime));
+ }
+
+
+ public static StringMessage MSGDOWN(Runtime runtime,String index){
+ String data=new StringBuffer(index).append(CMDSPLIT).append(runtime.bleInfo.ble_area_id).toString();
+ return genMqttCMDMsg(cmdMap.get(CMD_TYPE.MSGDOWN),data,runtime.IMEI());
+ }
+
+
+ public void handleMSGDOWN(Connection connection,Runtime runtime,String cmd,String data) {
+
+/**
+ * 消息下发到指定手表(MSGDOWN)
+ * 平台发布(终端订阅):
+ * 平台向“WBG100/v1/ID_手表IMEI/MSGDOWN”的主题发布 [LEN,包序号,具体消息]
+ *
+ * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为MSGDOWN
+ *
+ * 终端发布(平台订阅):
+ * 终端收到数据,向“WBG100/v1/ID_手表IMEI/MSGDOWN”的主题发布回应
+ * [LEN,包序号,区域id]
+ *
+ * 说明:
+ * 终端回应的包序号与平台发送的包序号一致,每次发送平台包需要加1,确保每包消息的包序号唯一。
+ * 具体消息为英文,ASCII格式,长度不超过512个字节
+ */
+
+ String[] cmdlist=data.split(CMDSPLIT);
+ if (cmdlist.length == 3){
+ String cmdindex=cmdlist[1];
+ String txtmsg=cmdlist[2];
+ StringMessage msg=MSGDOWN(runtime,cmdindex);
+ connection.send(msg);
+ ICLogger.i("received Txt Msg "+txtmsg);
+ runtime.getContextProxy().sendMsgBroadcast(txtmsg,0);
+ runtime.getContextProxy().saveMstToSMSDB(txtmsg);
+ }else{
+ ICLogger.i("MSGDOWN format error!");
+ }
+ }
+ public static StringMessage REMOVE(Runtime runtime){
+ return genMqttCMDMsg(cmdMap.get(CMD_TYPE.REMOVE),runtime.bleInfo.ble_area_id,runtime.IMEI());
+ }
+
+
+ public void handleREMOVE(Connection connection,Runtime runtime,String cmd,String data) {
+
+ /**
+ * 取下手环报警开关(REMOVE)
+ * 平台发布(终端订阅):
+ * 平台向“WBG100/v1/ID_手表IMEI/REMOVE”的主题发布 [LEN,0 或者1]
+ * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为REMOVE
+ *
+ * 终端发布(平台订阅):
+ * 终端收到数据,向“WBG100/v1/ID_手表IMEI/REMOVE”的主题发布回应
+ * [LEN,区域id]
+ *
+ * 说明:手表拆除报警的开关,1 打开,0 关闭.
+ */
+ connection.send(REMOVE(runtime));
+ String[] cmdlist=data.split(CMDSPLIT);
+ if (cmdlist.length == 2){
+ String cmdindex=cmdlist[1];
+ ICLogger.i("设置REMOVE "+cmdindex);
+ }else{
+ ICLogger.i("REMOVE format error!");
+ }
+ }
+
+ public static StringMessage PEDO(Runtime runtime){
+ return genMqttCMDMsg(cmdMap.get(CMD_TYPE.PEDO),runtime.bleInfo.ble_area_id,runtime.IMEI());
+ }
+
+
+ public void handlePEDO(Connection connection,Runtime runtime,String cmd,String data) {
+
+ /***
+ * 计步功能开关(PEDO)
+ * 平台发布(终端订阅):
+ * 平台向“WBG100/v1/ID_手表IMEI/PEDO”的主题发布 [LEN,0 或者1]
+ * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为PEDO
+ *
+ * 终端发布(平台订阅):
+ * 终端收到数据,向“WBG100/v1/ID_手表IMEI/PEDO”的主题发布回应
+ * [LEN,区域id]
+ *
+ * 说明: 终端计步功能的开关.1 打开,0 关闭
+ */
+ connection.send(PEDO(runtime));
+ String[] cmdlist=data.split(CMDSPLIT);
+ if (cmdlist.length == 2){
+ String cmdindex=cmdlist[1];
+ ICLogger.i("设置PEDO "+cmdindex);
+ }else{
+ ICLogger.i("PEDO format error!");
+ }
+ }
+
+ public static StringMessage MONITOR(Runtime runtime){
+ return genMqttCMDMsg(cmdMap.get(CMD_TYPE.MONITOR),runtime.bleInfo.ble_area_id,runtime.IMEI());
+ }
+
+
+ public void handleMONITOR(Connection connection,Runtime runtime,String cmd,String data) {
+
+ /***
+ 监听(MONITOR)
+ 平台发布(终端订阅):
+ 平台向“WBG100/v1/ID_手表IMEI/MONITOR”的主题发布 [LEN,电话号码]
+ 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为MONITOR
+
+ 终端发布(平台订阅):
+ 终端收到数据,向“WBG100/v1/ID_手表IMEI/ MONITOR”的主题发布回应
+ [LEN,区域id]
+
+ 说明:终端收到该指令后会自动回拨给设置的电话号码,电话号码为CENTER时,回拨给中心号码.
+ */
+ connection.send(MONITOR(runtime));
+ String[] cmdlist=data.split(CMDSPLIT);
+ if (cmdlist.length == 2){
+ String cmdindex=cmdlist[1];
+ ICLogger.i("设置MONITOR 号码 "+cmdindex);
+ }else{
+ ICLogger.i("MONITOR format error!");
+ }
+ }
+
+
+ public static StringMessage CENTER(Runtime runtime){
+ return genMqttCMDMsg(cmdMap.get(CMD_TYPE.CENTER),runtime.bleInfo.ble_area_id,runtime.IMEI());
+ }
+
+
+ public void handleCENTER(Connection connection,Runtime runtime,String cmd,String data) {
+
+ /***
+ 中心号码设置(CENTER)
+ 平台发布(终端订阅):
+ 平台向“WBG100/v1/ID_手表IMEI/CENTER”的主题发布 [LEN,电话号码]
+ 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为CENTER
+
+ 终端发布(平台订阅):
+ 终端收到数据,向“WBG100/v1/ID_手表IMEI/CENTER”的主题发布回应
+ [LEN,区域id]
+ 说明:设置中心号码,通过该手机号码可发送短信指令。同时终端的各种报警短信会发送到该号码的手机上面
+ */
+ connection.send(CENTER(runtime));
+ String[] cmdlist=data.split(CMDSPLIT);
+ if (cmdlist.length == 2){
+ String cmdindex=cmdlist[1];
+ ICLogger.i("设置CENTER 号码 "+cmdindex);
+ }else{
+ ICLogger.i("CENTER format error!");
+ }
+ }
+ public void sendBroadcast(String cmd, Runtime dev) {
+
+ ComponentName componentName = new ComponentName("com.eqc.watch", "com.eqc.watch.launcher.ChatActivity");
+ Intent intent = new Intent("android.intent.action.MAIN");
+// intent.putExtra("ACTIVITY_TYPE", 2);
+// intent.addCategory("android.intent.category.DEFAULT");
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ intent.setComponent(componentName);
+ dev.getContextProxy().context.startActivity(intent);
+ }
+
+ public boolean handleCmd(CMD_TYPE type, String cmd , String data) {
+
+ //普通非二进制命令用此函数处理
+ boolean ret=true;
+ ICLogger.i("mqtt handleCmd "+type.name() + " strLen="+data.length());
+
+ switch (type){
+
+ case KA:
+ ICLogger.i("服务器收到心跳包KA");
+ mConnection.DeliverCMDMessageToSystem("heartbeat",cmd);//通知下面线程状态变化
+ break;
+
+ case BREQ:
+ handleBREQ(mRuntime,data);
+ //ICLogger.i("服务器返回Ping绑定信息");
+ ICLogger.i("服务器收到登录包BREQ");
+ mConnection.DeliverCMDMessageToSystem("login",cmd);//通知下面线程状态变化
+ break;
+ case LGZONE:
+ handleLGZONE(mConnection,mRuntime,data);
+ break;
+
+ case UD:
+ mConnection.DeliverCMDMessageToSystem("UD",cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+ break;
+
+ case AL:
+ mConnection.DeliverCMDMessageToSystem("AL",cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+ break;
+
+ case PEDO:
+ handlePEDO(mConnection,mRuntime,cmd,data);
+ mConnection.DeliverCMDMessageToSystem("PEDO",cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+ break;
+
+ case REMOVE:
+ handleREMOVE(mConnection,mRuntime,cmd,data);
+ mConnection.DeliverCMDMessageToSystem("REMOVE",cmd);//通知下面线程状态变化
+ break;
+ case CENTER:
+ handleCENTER(mConnection,mRuntime,cmd,data);
+ mConnection.DeliverCMDMessageToSystem("CENTER",cmd);//通知下面线程状态变化
+
+ break;
+ case MONITOR:
+ handleMONITOR(mConnection,mRuntime,cmd,data);
+ mConnection.DeliverCMDMessageToSystem("MONITOR",cmd);//通知下面线程状态变化
+
+ break;
+// case CR:
+// //立即定位指令(长链接有效)
+// handleCR(mConnection);
+// mConnection.DeliverCMDMessageToSystem("StartLocate",cmd);//通知下面线程状态变化
+// break;
+
+// case BP07:
+// //收到发送的语音包
+// handleBP07(cmd,mConnection);
+// break;
+// case BP10:
+// //报警包
+// mConnection.DeliverCMDMessageToSystem("AP10",cmd);//通知下面线程状态变化
+// break;
+//
+// case BPTM:
+// //校时命令
+// handleBPTM(cmd);
+// ICLogger.i("服务器收到校时命令APTM");
+// mConnection.DeliverCMDMessageToSystem("APTM",cmd);//通知下面线程状态变化
+// break;
+// case BP85://设置闹钟
+// handleBP85(cmd,mConnection,mRuntime);
+// ICLogger.i("收到服务器设置闹钟命令BP85");
+// mConnection.DeliverCMDMessageToSystem("AP85",cmd);//通知下面线程状态变化
+// break;
+ case UPLOAD:
+ //设置工作模式
+ handleUPLOAD(mConnection,mRuntime,cmd,data);
+ mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化
+
+ break;
+// case BP34:
+// //设置工作模式
+// handleBP34(mConnection,mRuntime,cmd);
+// mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化
+// break;
+//
+//// case BP05: //L02服务器不适用
+//// //查询服务器语音 返回信息
+//// API.handleBP05(cmd);
+//// break;
+//
+ case SOS:
+ //收到设置SOS号码
+ handleSOS(mConnection,mRuntime,cmd,data);
+ ICLogger.i("收到服务器设置SOS号码命令BP12");
+ break;
+// case PHL:
+// //收到设置白名单号码
+// ICLogger.i("收到服务器设置白名单号码命令BP14");
+// handlePHL(mConnection,mRuntime,cmd,data);
+// break;
+// case BP15:
+// handleBP15(cmd,mConnection,mRuntime);
+// ICLogger.i("收到服务器设置定位命令BP15");
+// break;
+ case FACTORY:
+ //收到恢复出厂设置
+ handleFactory(mConnection,mRuntime,cmd,data);
+ ICLogger.i("收到服务器恢复出厂设置命令");
+ mConnection.DeliverCMDMessageToSystem("FactoryReset",cmd);//通知下面线程状态变化
+ break;
+//
+// case BP18:
+// //收到重启
+// handleBP18(mConnection,cmd);
+// ICLogger.i("收到服务器重启命令BP18");
+// mConnection.DeliverCMDMessageToSystem("Reboot",cmd);//通知下面线程状态变化
+// break;
+//
+
+ case MSGDOWN:
+ //服务器推送文本
+ handleMSGDOWN(mConnection,mRuntime,cmd,data);
+ ICLogger.i("收到服务器推送文本消息");
+// mConnection.DeliverCMDMessageToSystem("showTxt",cmd);//通知下面线程状态变化
+ break;
+
+ case hrtstart:
+ handleHrtstart(mConnection,mRuntime,data);
+ ICLogger.i("收到服务器心率检测命令");
+ if(mRuntime.check_stat_do_ppg_test()) HeartRateManager.triggerPPGtest();
+ break;
+
+ case wdstart:
+ handleWdstart(mConnection,mRuntime,data);
+ ICLogger.i("收到服务器体温测试及设置命令");
+ break;
+ case blood:
+ ICLogger.i("服务器收到上传的血压");
+ mConnection.DeliverCMDMessageToSystem("blood",cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+ break;
+ case oxygen:
+ ICLogger.i("服务器收到上传的血氧");
+ mConnection.DeliverCMDMessageToSystem("oxygen",cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+ break;
+ case temp:
+ ICLogger.i("服务器收到上传的体温");
+ mConnection.DeliverCMDMessageToSystem("temp",cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+ break;
+ case heart:
+ ICLogger.i("服务器收到上传的心率heart");
+ mConnection.DeliverCMDMessageToSystem("heart",cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了
+ break;
+// case BP84:
+// handleBP84(cmd,mConnection);
+// ICLogger.i("收到服务器白名单命令");
+// break;
+//
+// case BP86:
+// //绑定解绑消息
+// handleBP86(cmd,mConnection,mRuntime);
+// mConnection.DeliverCMDMessageToSystem("AP86",cmd);//通知下面线程状态变化
+//
+// break;
+//
+
+
+// case BP89:
+// //心率/血压阀值
+// handleBP89(cmd,mConnection);
+// mConnection.DeliverCMDMessageToSystem("AP89",cmd);//通知下面线程状态变化
+// break;
+//
+// case BPTE: //设置测试体温
+// handleBPTE(cmd,mConnection,mRuntime);
+// mConnection.DeliverCMDMessageToSystem("APTE",cmd);//通知下面线程状态变化
+// break;
+//
+// case BPTP:
+// handleBPTP();
+// mConnection.DeliverCMDMessageToSystem("APTP",cmd);//通知下面线程状态变化
+// break;
+// case BPHP:
+// handleBPHP();
+// mConnection.DeliverCMDMessageToSystem("IWAPHP",cmd);//通知下面线程状态变化
+// break;
+// case BPX1://设置 心率血压血氧修正值
+// handleBPX1(cmd,mConnection,mRuntime);
+// ICLogger.i("收到服务器设置 心率血压血氧修正值BPX1");
+// mConnection.DeliverCMDMessageToSystem("APX1",cmd);//通知下面线程状态变化
+// break;
+//
+// case BPS4: //提醒设置(时间段) 主要为久坐设置提醒时长。
+// handleBPS4(cmd,mConnection,mRuntime);
+// ICLogger.i("收到 提醒设置(时间段)");
+// mConnection.DeliverCMDMessageToSystem("APS4",cmd);//通知下面线程状态变化
+// break;
+// case BPDE:
+// handleBPDE(mConnection,cmd,mRuntime);
+// ICLogger.i(" 收到 进出围栏通知!");
+// mConnection.DeliverCMDMessageToSystem("APDE",cmd);//通知下面线程状态变化
+// break;
+//
+// case BPTU:
+// handleBPTU(cmd, mConnection);
+// ICLogger.i("收到服务器 图片语音 消息 BPTU");
+// // mConnection.DeliverCMDMessageToSystem("APTU", "");//通知下面线程状态变化
+// break;
+// case BPDF:
+// handleBPDF(mConnection,cmd,mRuntime);
+// ICLogger.i(" 收到 体温阈值设置!");
+// mConnection.DeliverCMDMessageToSystem("APDF",cmd);//通知下面线程状态变化
+// break;
+
+ }
+
+ return ret;
+
+ }
+
+
+ public boolean handleCmd(CMD_TYPE type, String cmd, byte[] bytes) {
+
+ //只有需要传递二级制数据的才需要这个函数,目前只有BP28需要
+
+ boolean ret=true;
+ ICLogger.i("handleCmd "+type.name() + " "+cmd+" bytelen="+bytes.length );
+ if (Config.LOG_TOFILE) ICLogger.logToFile("APILog", " recv " +new String(bytes));
+// switch (type) {
+// case LK:
+// // handleBP28(mConnection,cmd, mRuntime,bytes);
+// ICLogger.i("收到服务器语音BP28");
+// mConnection.DeliverCMDMessageToSystem("BP28", "");//通知下面线程状态变化
+// break;
+// }
+ return ret;
+ }
+
+}