--- /dev/null
+package com.ic.protocols;\r
+\r
+import android.content.ComponentName;\r
+import android.content.Intent;\r
+\r
+import com.enqualcomm.support.Config;\r
+import com.enqualcomm.support.CoreService;\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.NettyConnection;\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.HashMap;\r
+\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 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
+ Time,//获取服务器时间\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
+ 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.Time, "Time");\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
+ }\r
+\r
+ private NettyConnection mConnection=null;\r
+ private Runtime mRuntime=null;\r
+\r
+ public protocol_mqtt(NettyConnection 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
+ 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 String 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 sb.toString();\r
+ }\r
+ public static String 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 sb.toString();\r
+ }\r
+ /*登录*/\r
+ public static String LK() {\r
+ /*IC*YYYYYYYYYYYYYYY*LEN*LK*/\r
+ return genFZDCMD(cmdMap.get(CMD_TYPE.LK));\r
+ }\r
+\r
+ /**\r
+ * 绑定\r
+ * */\r
+ public static String 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
+ 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
+\r
+ }\r
+\r
+ public static String 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
+ /*LBS+GPS混合定位*/\r
+ public static String 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()).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 String UPLOAD(){\r
+\r
+ return genFZDCMD(cmdMap.get(CMD_TYPE.UPLOAD));\r
+ }\r
+\r
+ public void handleUPLOAD(Connection connection,Runtime runtime,String cmd,String data){\r
+ connection.send(genStringMessage("UPLOAD",UPLOAD()));\r
+ int timesecond=Integer.parseInt(data);\r
+ int mod=runtime.getLocationInstance().getWorkingMod();\r
+ log("LOCATION_MODE "+LOCATION_MODE+" mod "+ mod);\r
+ Config.setLocationMode(runtime.getContextProxy().context,mod);\r
+ Config.setLocationCycle(runtime.getContextProxy().context,timesecond);\r
+ runtime.getLocationInstance().setLocation_cycle(timesecond);\r
+ runtime.getLocationInstance().setWorkingMod(mod);\r
+// CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod());\r
+ //此处设置好配置后,会在LocationClient通过消息开始执行及时定位操作。\r
+\r
+ }\r
+\r
+ public static String heart(int hrt){\r
+ return genFZDCMD(cmdMap.get(CMD_TYPE.heart),String.valueOf(hrt));\r
+ }\r
+ public static String oxygen(int ox){\r
+ return genFZDCMD(cmdMap.get(CMD_TYPE.oxygen),String.valueOf(ox));\r
+ }\r
+\r
+ public static String blood(int pbl,int pbh){\r
+ String data=pbh+CMDSPLIT+pbl;\r
+ return genFZDCMD(cmdMap.get(CMD_TYPE.blood),data);\r
+ }\r
+\r
+ public static String temp(double temp){\r
+ return genFZDCMD(cmdMap.get(CMD_TYPE.temp),String.format("%.1f",temp));\r
+ }\r
+ public static String POWEROFF(){\r
+ return genFZDCMD(cmdMap.get(CMD_TYPE.POWEROFF));\r
+ }\r
+ public void handlePOWEROFF(Connection connection) {\r
+\r
+ connection.send(genStringMessage("POWEROFF",POWEROFF()));\r
+ }\r
+ public static String CR(){\r
+ return genFZDCMD(cmdMap.get(CMD_TYPE.CR));\r
+ }\r
+ public void handleCR(Connection connection) {\r
+\r
+ connection.send(genStringMessage("CR",CR()));\r
+ }\r
+ public static String bldstart(){\r
+ return genFZDCMD(cmdMap.get(CMD_TYPE.bldstart));\r
+ }\r
+ public void handleBldstart(Connection connection) {\r
+\r
+ connection.send(genStringMessage("bldstart",bldstart()));\r
+ }\r
+ public static String wdstart(){\r
+ return genFZDCMD(cmdMap.get(CMD_TYPE.wdstart));\r
+ }\r
+ public void handleWdstart(Connection connection,Runtime runtime ,String data) {\r
+\r
+ connection.send(genStringMessage("wdstart",wdstart()));\r
+ int freq=Integer.parseInt(data);\r
+\r
+\r
+ Config.setTemperatureTestCycle(runtime,freq);\r
+ CoreService.getInstance().setTempAlarm();\r
+\r
+ TemperatureUtil.doTempTestInThread();\r
+//\r
+// double wrist_temp,body_temp;\r
+// wrist_temp= TemperatureUtil.get_temp_value_adjusted();\r
+// body_temp=TemperatureUtil.getBodyTemp(wrist_temp,26.0f);\r
+// String temperatureMsg=temp(body_temp);\r
+// connection.send(genStringMessage("temp",temperatureMsg));\r
+ }\r
+ public static String hrtstart(){\r
+ return genFZDCMD(cmdMap.get(CMD_TYPE.hrtstart));\r
+ }\r
+ public void handleHrtstart(Connection connection) {\r
+\r
+ connection.send(genStringMessage("hrtstart",hrtstart()));\r
+ }\r
+ public static String FIND(){\r
+ return genFZDCMD(cmdMap.get(CMD_TYPE.FIND));\r
+ }\r
+ public void handleFIND(Connection connection) {\r
+\r
+ connection.send(genStringMessage("FIND",FIND()));\r
+ }\r
+ public static String SOS(){\r
+ return genFZDCMD(cmdMap.get(CMD_TYPE.SOS));\r
+ }\r
+\r
+\r
+ public void handleSOS(Connection connection,Runtime runtime,String cmd,String data) {\r
+\r
+ connection.send(genStringMessage("SOS",SOS()));\r
+ if (data!=null && data.length()>0) {\r
+ String list[] = data.split(CMDSPLIT);\r
+ if (list.length==1){\r
+ ArrayList<Contact> contactArray=new ArrayList<Contact>();\r
+ if (regexUtil.isMobileNumber( list[0]) || regexUtil.isPhoneNumber(list[0]))\r
+ {\r
+ contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos1",list[0]));\r
+ ICLogger.i("find SOS1 number "+list[0]);\r
+ }\r
+ }else if (list.length==2){\r
+\r
+ ArrayList<Contact> contactArray=new ArrayList<Contact>();\r
+ if (regexUtil.isMobileNumber( list[0]) || regexUtil.isPhoneNumber(list[0]))\r
+ {\r
+ contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos1",list[0]));\r
+ ICLogger.i("find SOS1 number "+list[0]);\r
+ }\r
+ if (regexUtil.isMobileNumber( list[1]) || regexUtil.isPhoneNumber(list[1]))\r
+ {\r
+ contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos2",list[1]));\r
+ ICLogger.i("find SOS2 number "+list[1]);\r
+ }\r
+\r
+ runtime.getDbHelper().saveContacts(contactArray,false,false,false,false,false,true);\r
+\r
+ }\r
+ }\r
+\r
+\r
+ }\r
+ public static String 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(genStringMessage("PHL",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 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
+ HeartRateManager.triggerPPGtest();\r
+ break;\r
+ case bldstart:\r
+ handleBldstart(mConnection);\r
+ ICLogger.i("收到服务器血压检测命令");\r
+ 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 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