--- /dev/null
+package com.ic.protocols;\r
+\r
+import android.content.ComponentName;\r
+import android.content.Intent;\r
+import android.net.Uri;\r
+import android.os.Environment;\r
+\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.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.NettyConnection;\r
+import com.enqualcomm.support.utils.TimeUtil;\r
+import com.enqualcomm.support.utils.Util;\r
+\r
+import java.io.File;\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 com.enqualcomm.support.bean.Contact.GROUP_ALL;\r
+import static java.lang.Math.abs;\r
+\r
+public class protocol_beehome {\r
+ private static final String TAG = "ICSrv." + protocol_jiai.class.getSimpleName();\r
+\r
+ private static final String CMDHEADER = "IW";\r
+ private static final String CMDEND = "#";\r
+ private static final String CMDSPLIT = ",";\r
+ public enum CMD_TYPE {\r
+ /*终端发起*/\r
+ AP00,//登录包\r
+ BP00,\r
+ AP01,//混合定位\r
+ BP01,\r
+ AP02,//多基站定位\r
+ BP02,\r
+ AP92,//CDMA 混合定位\r
+ BP92,\r
+ AP03,//心跳包\r
+ BP03,\r
+ AP05,//语音查询接收\r
+ BP05,\r
+ AP07,//语音上行\r
+ BP07,\r
+ AP10,//报警与地址回复\r
+ BP10,\r
+ AP49,//心率上传\r
+ BP49,\r
+ APHT,//心率血压上传\r
+ BPHT,\r
+ APTM,//基站校时及获取定位\r
+ BPTM,\r
+ /* 服务器发起*/\r
+ AP12,\r
+ BP12,//SOS 号码设置\r
+ AP14,\r
+ BP14,//设置联系人白名单\r
+ AP15,\r
+ BP15,//设置定位周期\r
+ AP16,\r
+ BP16,//立即定位\r
+ AP17,\r
+ BP17,//恢复出厂设置\r
+ AP18,\r
+ BP18,//重启设备\r
+ AP21,\r
+ BP21,//设置计步开关\r
+ AP28,\r
+ BP28, //语音下行\r
+ AP31,\r
+ BP31,//关机\r
+ AP33,\r
+ BP33,//工作模式\r
+ AP34,\r
+ BP34,//自定义工作模式\r
+ APXL,\r
+ BPXL,//测量心率\r
+ APXY,\r
+ BPXY,//测量血压\r
+ APJZ,\r
+ BPJZ,//血压校准\r
+ AP84,\r
+ BP84,//白名单开关\r
+ AP85,\r
+ BP85,//设置闹钟\r
+ AP86,\r
+ BP86,//心率血压测试周期\r
+ AP89,\r
+ BP89,//心率血压阀值设置\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.AP00, "AP00");\r
+ cmdMap.put(CMD_TYPE.BP00, "BP00");\r
+ cmdMap.put(CMD_TYPE.AP01, "AP01");\r
+ cmdMap.put(CMD_TYPE.BP01, "BP01");\r
+ cmdMap.put(CMD_TYPE.AP02, "AP02");\r
+ cmdMap.put(CMD_TYPE.BP02, "BP02");\r
+ cmdMap.put(CMD_TYPE.AP92, "AP92");\r
+ cmdMap.put(CMD_TYPE.BP92, "BP92");\r
+ cmdMap.put(CMD_TYPE.AP03, "AP03");\r
+ cmdMap.put(CMD_TYPE.BP03, "BP03");\r
+ cmdMap.put(CMD_TYPE.AP05, "AP05");\r
+ cmdMap.put(CMD_TYPE.BP05, "BP05");\r
+ cmdMap.put(CMD_TYPE.AP07, "AP07");\r
+ cmdMap.put(CMD_TYPE.BP07, "BP07");\r
+ cmdMap.put(CMD_TYPE.AP10, "AP10");\r
+ cmdMap.put(CMD_TYPE.BP10, "BP10");\r
+ cmdMap.put(CMD_TYPE.AP49, "AP49");\r
+ cmdMap.put(CMD_TYPE.BP49, "BP49");\r
+ cmdMap.put(CMD_TYPE.APHT, "APHT");\r
+ cmdMap.put(CMD_TYPE.BPHT, "BPHT");\r
+ cmdMap.put(CMD_TYPE.APTM, "APTM");\r
+ cmdMap.put(CMD_TYPE.BPTM, "BPTM");\r
+ cmdMap.put(CMD_TYPE.AP12, "AP12");\r
+ cmdMap.put(CMD_TYPE.BP12, "BP12");\r
+ cmdMap.put(CMD_TYPE.AP14, "AP14");\r
+ cmdMap.put(CMD_TYPE.BP14, "BP14");\r
+ cmdMap.put(CMD_TYPE.AP15, "AP15");\r
+ cmdMap.put(CMD_TYPE.BP15, "BP15");\r
+ cmdMap.put(CMD_TYPE.AP16, "AP16");\r
+ cmdMap.put(CMD_TYPE.BP16, "BP16");\r
+ cmdMap.put(CMD_TYPE.AP17, "AP17");\r
+ cmdMap.put(CMD_TYPE.BP17, "BP17");\r
+ cmdMap.put(CMD_TYPE.AP18, "AP18");\r
+ cmdMap.put(CMD_TYPE.BP18, "BP18");\r
+ cmdMap.put(CMD_TYPE.AP21, "AP21");\r
+ cmdMap.put(CMD_TYPE.BP21, "BP21");\r
+ cmdMap.put(CMD_TYPE.AP28, "AP28");\r
+ cmdMap.put(CMD_TYPE.BP28, "BP28");\r
+ cmdMap.put(CMD_TYPE.AP31, "AP31");\r
+ cmdMap.put(CMD_TYPE.BP31, "BP31");\r
+ cmdMap.put(CMD_TYPE.AP33, "AP33");\r
+ cmdMap.put(CMD_TYPE.BP33, "BP33");\r
+ cmdMap.put(CMD_TYPE.AP34, "AP34");\r
+ cmdMap.put(CMD_TYPE.BP34, "BP34");\r
+ cmdMap.put(CMD_TYPE.APXL, "APXL");\r
+ cmdMap.put(CMD_TYPE.BPXL, "BPXL");\r
+ cmdMap.put(CMD_TYPE.APXY, "APXY");\r
+ cmdMap.put(CMD_TYPE.BPXY, "BPXY");\r
+ cmdMap.put(CMD_TYPE.APJZ, "APJZ");\r
+ cmdMap.put(CMD_TYPE.BPJZ, "BPJZ");\r
+ cmdMap.put(CMD_TYPE.AP84, "AP84");\r
+ cmdMap.put(CMD_TYPE.BP84, "BP84");\r
+ cmdMap.put(CMD_TYPE.AP85, "AP85");\r
+ cmdMap.put(CMD_TYPE.BP85, "BP85");\r
+ cmdMap.put(CMD_TYPE.AP86, "AP86");\r
+ cmdMap.put(CMD_TYPE.BP86, "BP86");\r
+ cmdMap.put(CMD_TYPE.AP89, "AP89");\r
+ cmdMap.put(CMD_TYPE.BP89, "BP89");\r
+ }\r
+\r
+\r
+ private NettyConnection mConnection=null;\r
+ private Runtime mRuntime=null;\r
+\r
+ public protocol_beehome(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
+ int head_index = msg.indexOf(CMDHEADER);\r
+ if (head_index >= 0) {\r
+ int end_index = msg.indexOf("#", head_index);\r
+ if (end_index >= 0) {\r
+ return true;\r
+ }\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
+ /**/\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
+ 返回true 表示 cmd 全部解析成功\r
+ 返回false表示 cmd至少有一条解析失败,失败的数据归入buffer,下一次识别接着使用\r
+ 字符串通过#号进行识别。\r
+ 每个字符串如果发现 #,却又没有Header,“IW”则会被丢弃\r
+ */\r
+ public boolean parserCmd(byte[] bytes) {\r
+ boolean iscmdComplete = false;\r
+ boolean ret = true;\r
+ String last_inCompletecmd = "";\r
+ String cmd_msgbuf=new String(bytes);\r
+ log("bytes.size "+bytes.length);\r
+// cmdbuf.append(cmd_msgbuf);\r
+ cmdbuf.append(cmd_msgbuf);\r
+ log("cmdbuf.size "+cmdbuf.length() +" "+cmdbuf.toString());\r
+ /*\r
+ 如果不是 #结尾,就认为 接收数据不全,置位。\r
+ */\r
+ if (cmdbuf.toString().endsWith(CMDEND)) {\r
+ iscmdComplete = true;\r
+ }\r
+ String[] cmdlist = cmd_msgbuf.split(CMDEND);\r
+ int listlen = cmdlist.length;\r
+ log("listlen "+listlen);\r
+ /*\r
+ 如果解析出来的cmdlist不是空,且数据不是完整cmd则保留 最后一条数据到last_inCompletecmd\r
+ */\r
+ if (cmdlist.length > 0 && iscmdComplete == false) {\r
+ listlen -= 1;\r
+ last_inCompletecmd = cmdlist[listlen];\r
+ log("cmd not complete , " + last_inCompletecmd);\r
+ }\r
+ for (int i = 0; i < listlen; i++) {\r
+ for (CMD_TYPE key : cmdMap.keySet()) {\r
+ if (cmdlist[i].startsWith(CMDHEADER + cmdMap.get(key))) {\r
+ log("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key) + " , " + cmdlist[i]);\r
+ if (key == CMD_TYPE.BP28) {\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
+ handleCmd(key, cmdlist[i]);\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ cmdbuf = new StringBuffer().append(last_inCompletecmd);\r
+ return ret;\r
+ }\r
+ public int getBP28Amrlen(String cmd) {\r
+\r
+ String Name;\r
+ String appendIndex;\r
+ int packetCount;\r
+ int currentId;\r
+ int packetLen;\r
+\r
+\r
+ String[] msg=cmd.split(CMDSPLIT);\r
+ if (msg.length>=6){\r
+\r
+ Name=msg[1];\r
+ appendIndex=msg[2];\r
+ packetCount= Integer.valueOf(msg[3]);\r
+ currentId= Integer.valueOf(msg[4]);\r
+ packetLen= Integer.valueOf(msg[5]);\r
+\r
+ StringBuffer stringBuffer=new StringBuffer();\r
+ stringBuffer.append("getBP28AmrLen name = ").append(Name)\r
+ .append(",appendIndex = ").append(appendIndex)\r
+ .append(",packetCount = ").append(packetCount)\r
+ .append(",currentId = ").append(currentId)\r
+ .append(",packetLen = ").append(packetLen);\r
+\r
+\r
+ log( stringBuffer.toString());\r
+ return packetLen;\r
+ }else{\r
+ log("getBP28AmrLen","format Error");\r
+\r
+ }\r
+ return -1;\r
+ }\r
+ /*登录*/\r
+ public static String AP00(Runtime ds) {\r
+ //示例数据:IWAP00867155030001063#\r
+ return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP00)).append(ds.IMEI()).append(CMDEND).toString();\r
+ }\r
+\r
+ //处理 登录 BP00\r
+ public void handleBP00(Runtime runtime,String cmd){\r
+ String[] msg=cmd.split(CMDSPLIT);\r
+// get Msg :IWBP00,20191229171933,8# (size)24\r
+// 12-30 01:19:33.861 6492-6492/com.enqualcomm.support I/ICSrv.protocolAPIHelper: found cmd keyid=BP00 ,keyname=BP00 , IWBP00,20191229171933,8\r
+\r
+ if (msg.length>=3) {\r
+ log("handleBP00", "Set Datetime " + msg[1]);\r
+ log("handleBP00", "Set TimeZone " + msg[2]);\r
+\r
+ Date datetime= TimeUtil.parseDatetiime(msg[1]);\r
+ int timezone=Integer.parseInt(msg[2]);\r
+ if (datetime!=null){\r
+ ICLogger.i("==="+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
+ log("handleBP00","format Error");\r
+ }\r
+ }\r
+\r
+\r
+ public static String AP03(Runtime ds) {\r
+ //示例数据:IWAP03,06000908000102,5555,30# IWAP03,000000null00000,0,0#\r
+ return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP03)).append(CMDSPLIT).append(String.format("%03d",abs(ds.getSignalStrength())))\r
+ .append(ds.getGPSLocationStarNums()).append(ds.getBattery()).append("0")\r
+ .append(ds.getProtection()).append(ds.getWorkModeStr()).append(CMDSPLIT)\r
+ .append(ds.getTotalStepCount()).append(CMDSPLIT).append(ds.getRolltimes()).append(CMDEND).toString();\r
+ }\r
+ //处理 心跳 BP03\r
+ public void handleBP03(String cmd){\r
+\r
+ log("BP03心跳接收成功");\r
+ }\r
+\r
+\r
+ public static String AP10(Runtime ds){\r
+\r
+ /**\r
+ * IWAP10080524A2232.9806N11404.9355E000.1061830323.8706000908000502,\r
+ * 460,0,9520,3671,\r
+ * 00,zh-cn,00,\r
+ * 00为报警状态,00为无任何报警(01:SOS,02:低电,03:脱落报警,04:佩戴提醒,05/06:跌倒报警))\r
+ * zh-cn:设备语言\r
+ * 00:第一个0:是否需要回复地址信息,0:不回复,1回复.\r
+ * HOME|74-DE-2B-44-88-8C|97&HOME1|74-DE-2B-44-88-8C|97&HOME2|74-DE-2B-44-88-8C|97&HOME3|74-DE-2B-44-88-8C|97#\r
+ */\r
+ return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP10)).append(TimeUtil.getShortDate())\r
+ .append(ds.getGPSData()).append(TimeUtil.getShortTime()).append(ds.getGPSHeading()).append(String.format("%03d",abs(ds.getSignalStrength())))\r
+ .append(ds.getGPSLocationStarNums()).append(ds.getBattery()).append("0")\r
+ .append(ds.getProtection()).append(ds.getWorkModeStr()).append(CMDSPLIT)\r
+ .append(ds.getLBSData()).append(CMDSPLIT)\r
+ .append(ds.getAlarmType()).append(CMDSPLIT)\r
+ .append(ds.getLanguage()).append(CMDSPLIT)\r
+ .append("00").append(CMDSPLIT) //不回复地址\r
+ .append(ds.getWifiInfo()).append(CMDEND).toString();\r
+\r
+ }\r
+\r
+ /*LBS+GPS混合定位*/\r
+ public static String AP01(Runtime ds) {\r
+ //示例数据:IWAP01080524A2232.9806N11404.9355E000.1061830323.8706000908000102,\r
+ // 460,0,9520,3671,\r
+ // Home|74-DE-2B-44-88-8C|97& Home1|74-DE-2B-44-88-8C|97&Home2|74-DE-2B-44-88-8C|97& Home3|74-DE-2B-44-88-8C|97#\r
+// IWAP01191230A2232.9807N11404.9355E000.1161320000.0006000910000000,460,00,9520,3671,#\r
+ return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP01)).append(TimeUtil.getShortDate())\r
+ .append(ds.getGPSData()).append(TimeUtil.getShortTime()).append(ds.getGPSHeading()).append(String.format("%03d",abs(ds.getSignalStrength())))\r
+ .append(ds.getGPSLocationStarNums()).append(ds.getBattery()).append("0")\r
+ .append(ds.getProtection()).append(ds.getWorkModeStr()).append(CMDSPLIT)\r
+ .append(ds.getLBSData()).append(CMDSPLIT).append(ds.getWifiInfo()).append(CMDEND).toString();\r
+ }\r
+\r
+ //处理 定位 BP01\r
+ public void handleBP01(String cmd){\r
+ log("BP01定位接收成功");\r
+ }\r
+\r
+\r
+\r
+ /*LBS+WiFi混合定位*/\r
+ public static String AP02(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.AP02)).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 handleBP02(String cmd){\r
+ log("BP02定位接收成功");\r
+ }\r
+\r
+\r
+\r
+ public static String APXL(String id){\r
+//设备响应: IWAPXL,080835#\r
+ //080835:指令流水号\r
+ return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APXL))\r
+ .append(CMDSPLIT).append(id)\r
+ .append(CMDEND).toString();\r
+ }\r
+\r
+ /**\r
+ * 测量心率\r
+ * @param cmd\r
+ * @param connection\r
+ */\r
+ public void handleBPXL(String cmd, Connection connection){\r
+ //IWBPXL,353456789012345,080835#\r
+ //说明:\r
+ //IW:标识符\r
+ //BPXL : 命令字符\r
+ //353456789012345:IMEI号,设备唯一ID\r
+ //080835 :指令流水号\r
+ //设备响应: IWAPXL,080835#\r
+ //080835:指令流水号\r
+ String[] list=cmd.split(CMDSPLIT);\r
+ if (list.length==3){\r
+ String index=list[2];\r
+ String imei=list[1];\r
+ ICLogger.i("Handle BPXL IMEI "+imei+",index "+index);\r
+ connection.send(genStringMessage("APXL",APXL(index)));\r
+ }else{\r
+ ICLogger.i("BPXL format error!");\r
+ }\r
+\r
+ }\r
+\r
+ public static String APXY(String id){\r
+//设备响应: IWAPXY,080835#\r
+ //080835:指令流水号\r
+ return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APXY))\r
+ .append(CMDSPLIT).append(id)\r
+ .append(CMDEND).toString();\r
+ }\r
+\r
+ /**\r
+ * 测量血压\r
+ * @param cmd\r
+ * @param connection\r
+ */\r
+ public void handleBPXY(String cmd,Connection connection){\r
+ //IWBPXY,353456789012345,080835#\r
+ //说明:\r
+ //IW:标识符\r
+ //BPXL : 命令字符\r
+ //353456789012345:IMEI号,设备唯一ID\r
+ //080835 :指令流水号\r
+ //设备响应: IWAPXY,080835#\r
+ //080835:指令流水号\r
+ String[] list=cmd.split(CMDSPLIT);\r
+ if (list.length==3){\r
+ String index=list[2];\r
+ String imei=list[1];\r
+ ICLogger.i("Handle BPXY IMEI "+imei+",index "+index);\r
+ connection.send(genStringMessage("APXY",APXY(index)));\r
+ }else{\r
+ ICLogger.i("BPXY format error!");\r
+ }\r
+\r
+ }\r
+\r
+\r
+\r
+ public static String APJZ(String id,String BPH,String BPL,String Age,String Sex){\r
+ //设备响应: IWAPJZ,792997,120,85,42,1#\r
+ //792997:指令流水号\r
+ // 高压120,低压85,年龄42,1 男性\r
+ return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APJZ))\r
+ .append(CMDSPLIT).append(id)\r
+ .append(CMDSPLIT).append(BPH)\r
+ .append(CMDSPLIT).append(BPL)\r
+ .append(CMDSPLIT).append(Age)\r
+ .append(CMDSPLIT).append(Sex)\r
+ .append(CMDEND).toString();\r
+ }\r
+\r
+ /**\r
+ *\r
+ * @param cmd\r
+ * @param connection\r
+ * @param runtime\r
+ */\r
+ public void handleBPJZ(String cmd,Connection connection,Runtime runtime){\r
+ //cmdbuf.size 42 IWBPJZ,867155030001063,199600,120,85,45,1# 高压120,低压85,年龄45,男性\r
+// cmdbuf.size 42 IWBPJZ,867155030001063,909957,120,85,42,0# 高压120,低压85,年龄42,女性\r
+ //IWBPJZ,353456789012345,080835,110,75#\r
+ //说明:\r
+ //IW:标识符\r
+ //BPJZ : 命令字符\r
+ //353456789012345:IMEI号,设备唯一ID\r
+ //110:高压值\r
+ //75:低压值\r
+ //080835 :指令流水号\r
+ //设备响应: IWAPJZ,792997,120,85,42,1#\r
+ //792997:指令流水号\r
+ String[] list=cmd.split(CMDSPLIT);\r
+ if (list.length==7){\r
+ String index=list[2];\r
+ String imei=list[1];\r
+ String strBPH=list[3];\r
+ String strBPL=list[4];\r
+ String strAge=list[5];\r
+ String strSex=list[6];\r
+\r
+ connection.send(genStringMessage("APJZ",APJZ(index,strBPH,strBPL,strAge,strSex)));\r
+ runtime.getHRS().setXY_Ref(Integer.valueOf(strBPH),Integer.valueOf(strBPL),Integer.valueOf(strAge),Integer.valueOf(strSex));\r
+ ICLogger.i("Handle BPJZ IMEI "+imei+",index "+index+", BPH "+strBPH+", BPL "+strBPL+", Age "+ strAge +", Sex "+ (strSex.equals("1")?"男":"女"));\r
+ }else{\r
+ ICLogger.i("BPXY format error!");\r
+ }\r
+ }\r
+\r
+\r
+\r
+ //重启\r
+\r
+\r
+ public static String AP18(String index){\r
+ return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP18))\r
+ .append(CMDSPLIT).append(index)\r
+ .append(CMDEND).toString();\r
+ }\r
+\r
+ public void handleBP18(Connection connection,String cmd) {\r
+\r
+ // IWBP18,867155030001063,161723\r
+ String[] cmdlist=cmd.split(CMDSPLIT);\r
+ if (cmdlist.length==3) {\r
+\r
+ connection.send(genStringMessage("AP18",AP18(cmdlist[2])));\r
+\r
+ }\r
+ }\r
+ //恢复出厂设置\r
+\r
+ public static String AP17(String index){\r
+ return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP17))\r
+ .append(CMDSPLIT).append(index)\r
+ .append(CMDEND).toString();\r
+ }\r
+ public void handleBP17(Connection connection,String cmd) {\r
+\r
+ // IWBP17,867155030001063,161723\r
+ String[] cmdlist=cmd.split(CMDSPLIT);\r
+ if (cmdlist.length==3) {\r
+\r
+ connection.send(genStringMessage("AP17",AP17(cmdlist[2])));\r
+\r
+ }\r
+ }\r
+\r
+ //关机\r
+\r
+\r
+ public static String AP31(String index){\r
+ return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP31))\r
+ .append(CMDSPLIT).append(index)\r
+ .append(CMDEND).toString();\r
+ }\r
+ public void handleBP31(Connection connection,String cmd) {\r
+\r
+ // IWBP31,867155030001063,161723\r
+ String[] cmdlist=cmd.split(CMDSPLIT);\r
+ if (cmdlist.length==3) {\r
+\r
+ connection.send(genStringMessage("AP31",AP31(cmdlist[2])));\r
+\r
+ }\r
+ }\r
+\r
+ //设置SOS号码\r
+ public static String AP12(String index,String phNum1,String phNum2,String phNum3){\r
+ return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP12))\r
+ .append(CMDSPLIT).append(index)\r
+ .append(CMDSPLIT).append(phNum1)\r
+ .append(CMDSPLIT).append(phNum2)\r
+ .append(CMDSPLIT).append(phNum3)\r
+ .append(CMDEND).toString();\r
+ }\r
+\r
+ //设置SOS号码\r
+ public void handleBP12(Connection connection,String cmd,Runtime runtime){\r
+ // IWBP12,353456789012345,080835,135XXXXXXXX,135XXXXXXXX,135XXXXXXXX#\r
+ String[] cmdlist=cmd.split(CMDSPLIT);\r
+ if (cmdlist.length>=3){\r
+ String index=cmdlist[2];\r
+ String phNum1=cmdlist.length==3?"":cmdlist[3];\r
+ String phNum2=cmdlist.length>3?(cmdlist.length==4?"":cmdlist[4]):"";\r
+ String phNum3=(cmdlist.length>4)?(cmdlist.length==5? "":cmdlist[5]):"";\r
+ ICLogger.i(new StringBuffer().append("get Emegency Numbs "+phNum1+","+phNum2+","+phNum3).toString());\r
+ connection.send(genStringMessage("AP12",AP12(index,phNum1,phNum2,phNum3)));\r
+\r
+ ArrayList<Contact> contactArray=new ArrayList<Contact>();\r
+ if (!phNum1.isEmpty()) contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos1",phNum1));\r
+ if (!phNum2.isEmpty()) contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos2",phNum2));\r
+ if (!phNum3.isEmpty()) contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos3",phNum3));\r
+\r
+ runtime.getDbHelper().saveContacts(contactArray,false,false,false,false,false,true);\r
+\r
+ }else{\r
+ ICLogger.i(" BP12 format error!");\r
+ }\r
+ }\r
+\r
+\r
+ public static String AP14(String index,String[] phnumbs){\r
+ return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP14))\r
+ .append(CMDSPLIT).append(index)\r
+ .append(CMDSPLIT).append(phnumbs[0])\r
+ .append(CMDSPLIT).append(phnumbs[1])\r
+ .append(CMDSPLIT).append(phnumbs[2])\r
+ .append(CMDSPLIT).append(phnumbs[3])\r
+ .append(CMDSPLIT).append(phnumbs[4])\r
+ .append(CMDSPLIT).append(phnumbs[5])\r
+ .append(CMDSPLIT).append(phnumbs[6])\r
+ .append(CMDSPLIT).append(phnumbs[7])\r
+ .append(CMDSPLIT).append(phnumbs[8])\r
+ .append(CMDSPLIT).append(phnumbs[9])\r
+ .append(CMDEND).toString();\r
+ }\r
+ //设置通讯录,白名单(10个)\r
+ public void handleBP14(Connection connection,String cmd , Runtime runtime){\r
+// IWBP14,867155030001063,357444,9b44529b|13554820016,,,,,,,,,\r
+/**\r
+ * IWBP14,353456789012345,080835,\r
+ * D3590D54|135xxxxxxxxxx,\r
+ * D3590D54|135xxxxxxxxxx,\r
+ * D3590D54|135xxxxxxxxxx,\r
+ * D3590D54|135xxxxxxxxxx,\r
+ * D3590D54|135xxxxxxxxxx,\r
+ * D3590D54|135xxxxxxxxxx,\r
+ * D3590D54|135xxxxxxxxxx,\r
+ * D3590D54|135xxxxxxxxxx,\r
+ * D3590D54|135xxxxxxxxxx,\r
+ * D3590D54|135xxxxxxxxxx#\r
+ */\r
+ String[] cmdlist=cmd.split(CMDSPLIT);\r
+ String[] phnums=new String[]{"","","","","","","","","",""};\r
+ StringBuffer sb=new StringBuffer().append("recv phone Numbs ");\r
+ if (cmdlist.length>=3){\r
+ switch (cmdlist.length){\r
+ case 13:\r
+ phnums[9]=cmdlist[12];\r
+ sb.append(phnums[9]).append(",");\r
+ case 12:\r
+ phnums[8]=cmdlist[11];\r
+ sb.append(phnums[8]).append(",");\r
+ case 11:\r
+ phnums[7]=cmdlist[10];\r
+ sb.append(phnums[7]).append(",");\r
+ case 10:\r
+ phnums[6]=cmdlist[9];\r
+ sb.append(phnums[6]).append(",");\r
+ case 9:\r
+ phnums[5]=cmdlist[8];\r
+ sb.append(phnums[5]).append(",");\r
+ case 8:\r
+ phnums[4]=cmdlist[7];\r
+ sb.append(phnums[4]).append(",");\r
+ case 7:\r
+ phnums[3]=cmdlist[6];\r
+ sb.append(phnums[3]).append(",");\r
+ case 6:\r
+ phnums[2]=cmdlist[5];\r
+ sb.append(phnums[2]).append(",");\r
+ case 5:\r
+ phnums[1]=cmdlist[4];\r
+ sb.append(phnums[1]).append(",");\r
+ case 4:\r
+ phnums[0]=cmdlist[3];\r
+ sb.append(phnums[0]).append(",");\r
+\r
+ }\r
+\r
+ String index=cmdlist[2];\r
+ ICLogger.i(sb.toString());\r
+ connection.send(genStringMessage("AP14",AP14(index,phnums)));\r
+ ArrayList<Contact> contactArray=new ArrayList<Contact>();\r
+ for (int i=0; i< phnums.length;i++){\r
+ String[] tmp= phnums[i].split("\\|");\r
+ if (tmp.length==2){\r
+ String name= Util.decodeUnicode2Utf8(tmp[0]);\r
+ String phonem=tmp[1];\r
+ ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length+" , name="+name+",-"+phonem);\r
+ contactArray.add(new Contact(Contact.CATEGORY_CALL,name,phonem));\r
+ }else{\r
+ ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length);\r
+\r
+ }\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
+\r
+ }else{\r
+ ICLogger.i(" BP14 format error!");\r
+ }\r
+\r
+ }\r
+\r
+\r
+\r
+ public static String AP85(Runtime ds,String cmddata){\r
+//示例数据:IWAP49,68##\r
+ return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP85))\r
+ .append(CMDSPLIT).append(cmddata)\r
+ .append(CMDEND).toString();\r
+\r
+ }\r
+ //设置闹钟\r
+ public void handleBP85(String cmd , Connection connection,Runtime runtime){\r
+// IWBP85,867155030001063,155312,1,1,0235,12,1,1\r
+// IWBP85,867155030002145,945166,1,0,\r
+// IWBP85,867155030001064,265960,1,1,1130,,1,1\r
+// IWBP85,353456789012345,080835,1,3, 0900,135,1,1@0900 ,135,1,2@0900 ,135,1,3#\r
+//353456789012345:IMEI号,设备唯一ID\r
+//080835 :指令流水号\r
+//1: 表示闹钟总开关,1为开,0 为关\r
+//3: 表示闹钟个数\r
+//0900 ,135,1,1,表示一组闹钟,0900表示早上09:00, 135表示周一周三周五,使用24小时制\r
+//1表示该组闹钟开启或关闭状态 1表示开启 0表示关闭\r
+//1表示吃药提醒\r
+//2 表示喝水提醒\r
+//3 表示久坐提醒\r
+//多组闹钟之间用”@”符号分隔\r
+\r
+ String imei="",cmdindex="0"/*指令流水号*/;\r
+ int all_alarmswitch=0 /*总开关 1为开,0 为关*/,\r
+ alarmswitch=0 /*1为开,0 为关*/,\r
+ alarmcount=0 /*表示闹钟个数*/;\r
+ String alarmtime="";//0900表示早上09:00\r
+ int alarmtype=1; //1表示吃药提醒 , 2 表示喝水提醒 ,3 表示久坐提醒\r
+ String repeat="";// 135表示周一周三周五,使用24小时制\r
+ String[] datalist= cmd.split("@");\r
+ ArrayList<Alarm> alarmlist=new ArrayList<>();\r
+ if (datalist.length >0){\r
+ for (int i =0 ; i< datalist.length;i++){\r
+ String [] cmdarglist=datalist[i].split(",");\r
+\r
+ if (i == 0){\r
+ if (cmdarglist.length == 9){\r
+ imei=cmdarglist[1];\r
+ cmdindex=cmdarglist[2];\r
+ all_alarmswitch=Integer.valueOf(cmdarglist[3]);\r
+ alarmcount=Integer.valueOf(cmdarglist[4]);\r
+ alarmtime=cmdarglist[5];\r
+ repeat=cmdarglist[6];\r
+ alarmswitch=Integer.valueOf(cmdarglist[7]);\r
+ alarmtype = Integer.valueOf(cmdarglist[8]);\r
+ log(new StringBuilder("imei ").append(imei)\r
+ .append(", cmdindex ").append(cmdindex)\r
+ .append(", allswitch=").append(all_alarmswitch)\r
+ .append(", all alarm count=").append(alarmcount)\r
+ .toString()\r
+ );\r
+\r
+ log(new StringBuilder("alarmtime ").append(alarmtime)\r
+ .append(", relpeat ").append(repeat)\r
+ .append(", switch=").append(alarmswitch)\r
+ .append(", alarmtype=").append(alarmtype)\r
+ .toString()\r
+ );\r
+ alarmlist.add(new Alarm("ST"+alarmtime.substring(0,2)+"."+alarmtime.substring(2),"W"+repeat,"CON",alarmswitch==1?"ON":"OFF","闹铃"));\r
+\r
+ }else if (cmdarglist.length == 5) {\r
+ imei=cmdarglist[1];\r
+ cmdindex=cmdarglist[2];\r
+ all_alarmswitch=Integer.valueOf(cmdarglist[3]);\r
+ alarmcount=Integer.valueOf(cmdarglist[4]);\r
+ }else{\r
+ log("data len is too small!");\r
+ }\r
+ }else{\r
+ if (cmdarglist.length == 4){\r
+ alarmtime=cmdarglist[0];\r
+ repeat=cmdarglist[1];\r
+ alarmswitch=Integer.valueOf(cmdarglist[2]);\r
+ alarmtype = Integer.valueOf(cmdarglist[3]);\r
+\r
+ log(new StringBuilder("set alarmtime ").append(alarmtime)\r
+ .append(", relpeat ").append(repeat)\r
+ .append(", switch=").append(alarmswitch)\r
+ .append(", alarmtype=").append(alarmtype)\r
+ .toString()\r
+ );\r
+\r
+ alarmlist.add(new Alarm("ST"+alarmtime.substring(0,2)+"."+alarmtime.substring(2),"W"+repeat,"CON",alarmswitch==1?"ON":"OFF","闹铃"));\r
+\r
+ }else{\r
+ log("data len is too small!");\r
+ }\r
+\r
+ }\r
+ }//循环获取alarm数据结束\r
+ runtime.getDbHelper().saveAlarm(alarmlist);\r
+\r
+ //do clean and set alarm things\r
+\r
+ }\r
+//IWBP85,867155030002145,410385,1,0,#\r
+\r
+ String replacement=new StringBuilder("IWBP85,").append(imei).append(",").toString();\r
+ String replycmd = cmd.replace(replacement,"");\r
+ ICLogger.i("gen reply "+replacement+" "+replycmd);\r
+ connection.send(genStringMessage("AP85",AP85(runtime,replycmd)));\r
+ }\r
+\r
+\r
+// AP05命令L02服务器不适用\r
+// public static String AP05(boolean recvFlag){\r
+//\r
+//// IWAP05,1#\r
+// return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP05))\r
+// .append(CMDSPLIT).append(recvFlag?1:0)\r
+// .append(CMDEND).toString();\r
+//\r
+// }\r
+//\r
+//\r
+// public void handleBP05(String cmd){\r
+//// IWBP05,6#\r
+// String[] cmdlist=cmd.split(CMDSPLIT);\r
+// if (cmdlist.length>1){\r
+// ICLogger.i(" 服务器有 " +cmdlist[1]+" 条语音未接收!");\r
+// }\r
+// }\r
+\r
+\r
+\r
+\r
+ public static byte[] AP07(String packetTime,int count,int index,int datalen,byte[] amrdata){\r
+//IWAP07,20140818064408,6,1,1024,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#\r
+//说明:\r
+//IW:标识符\r
+//AP07 : 命令字符\r
+//20140818064408 :yyyyMMddHHmmss 格式的年月日时分秒,设备录音时间\r
+//6:语音包分包总数\r
+//1 :当前包数,第一包为1,第二包为2,。。。。。。同一个语音包的语音时间相同\r
+//1024 :语音包长度\r
+//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:当前音频数据, 每个音频数据包大小为1024字节,最后一包不足1024的取实际字节数\r
+//语音包上传规则:\r
+//按包次序依次上传,上传后如果没有收到服务器的响应包,则继续上传该语音包。\r
+//收到设备回复确认数据包接收成功状态后,继续开始依次上传下一个数据包。。。。。。\r
+//如果设备回复确认数据包接收失败状态,则重复发送上一个数据包\r
+\r
+\r
+ String sb=new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP07))\r
+ .append(CMDSPLIT).append(packetTime)\r
+ .append(CMDSPLIT).append(count)\r
+ .append(CMDSPLIT).append(index)\r
+ .append(CMDSPLIT).append(datalen)\r
+ .append(CMDSPLIT).toString();\r
+\r
+ byte[] sentbuf=new byte[sb.length()+datalen+1];\r
+ System.arraycopy(sb.getBytes(),0,sentbuf,0,sb.length());\r
+ System.arraycopy(amrdata,0,sentbuf,sb.length(),datalen);\r
+ sentbuf[sb.length()+datalen]='#';\r
+\r
+ return sentbuf;\r
+\r
+ }\r
+\r
+\r
+ public void handleBP07(String cmd , NettyConnection connection ){\r
+//平台响应: IWBP07,20140818064408,6,1,1#\r
+//20140818064408:设备语音时间,yyyyMMddHHmmss 格式的年月日时分秒\r
+//6:语音包分包总数\r
+//1:当前设备收到的是第几个包\r
+//1:表示服务器接受数据成功,0表示服务器接受数据失败\r
+ String[] cmdlist=cmd.split(CMDSPLIT);\r
+ if (cmdlist.length==5){\r
+ String time=cmdlist[1];\r
+ int packetCount=Integer.valueOf(cmdlist[2]);\r
+ int packetIndex=Integer.valueOf(cmdlist[3]);\r
+ int receiveSuccess=Integer.valueOf(cmdlist[4]);\r
+ ICLogger.i("服务器在"+time+" 收到语音 "+packetIndex+"/"+packetCount+" "+ (receiveSuccess==1?"成功":"失敗"));\r
+ if (receiveSuccess == 1){\r
+ //如果服务器接收 语音成功,则设置下一个要发送的语音包Index,当index == packetCount的时候表示所有包发送完毕,停止继续发送\r
+ voicePacket.getInstanceSent().setCurrentIndexToSent(packetIndex);\r
+ }\r
+ //发送消息,再次检查要发送的语音包,确认其发送完毕\r
+ connection.DeliverCMDMessageToSystem("BP07","SentVoicePacket");\r
+\r
+ }else{\r
+ ICLogger.i(" BP07 Format error!");\r
+ }\r
+ }\r
+\r
+\r
+\r
+ public static String AP33(String cmdindex,int workMode){\r
+//IWAP33,080835,1#\r
+//080835:指令流水号\r
+//1:设置信息,供服务器同步\r
+ return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP33))\r
+ .append(CMDSPLIT).append(cmdindex)\r
+ .append(CMDSPLIT).append(workMode)\r
+ .append(CMDEND).toString();\r
+ }\r
+\r
+ //设置工作模式\r
+ public void handleBP33(Connection connection,Runtime runtime,String cmd){\r
+\r
+// IWBP33,867155030001063,560555,1\r
+// IW:标识符\r
+// BP33 : 命令字符\r
+// 353456789012345:IMEI号,设备唯一ID\r
+// 080835:指令流水号\r
+// 1:设备工作模式,1:正常模式,2:省电模式,3:紧急模式\r
+\r
+ String[] cmdlist=cmd.split(",");\r
+ if (cmdlist.length == 4){\r
+\r
+\r
+ log("work mode "+cmdlist[3]);\r
+ int mod=Integer.valueOf(cmdlist[3]);\r
+ int Cycle=900;\r
+ switch(mod){\r
+ case ICLocation.NORMAL_MOD:\r
+ Cycle=900;\r
+ break;\r
+ case ICLocation.LOWPOWER_MOD:\r
+ Cycle=3600;\r
+ break;\r
+ case ICLocation.EMERGNECY_MOD:\r
+ case ICLocation.REALTIME_MOD:\r
+ Cycle=60;\r
+ break;\r
+\r
+ }\r
+\r
+ String msg=AP33(cmdlist[2],mod);\r
+ //设定当前工作模式及循环频率\r
+ connection.send(genStringMessage("AP33",msg));\r
+ log("reply msg "+msg);\r
+ log("LOCATION_MODE "+LOCATION_MODE+" mod "+ mod);\r
+ Config.setLocationMode(runtime.getContextProxy().context,mod);\r
+ Config.setLocationCycle(runtime.getContextProxy().context,Cycle);\r
+ runtime.getLocationInstance().setLocation_cycle(Cycle);\r
+ runtime.getLocationInstance().setWorkingMod(mod);\r
+// CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod());\r
+ //此处设置好配置后,会在LocationClient通过消息开始执行及时定位操作。\r
+ }\r
+\r
+ }\r
+\r
+\r
+ public static String AP34(String cmdindex,int workMode){\r
+//IWAP34,588854,1#\r
+//080835:指令流水号\r
+//8:模式\r
+ return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP34))\r
+ .append(CMDSPLIT).append(cmdindex)\r
+ .append(CMDSPLIT).append(workMode)\r
+ .append(CMDEND).toString();\r
+ }\r
+\r
+ //设置自定义工作模式\r
+ public void handleBP34(Connection connection,Runtime runtime,String cmd){\r
+\r
+// IWBP34,867155030001063,588854,8,900,1#\r
+// IW:标识符\r
+// BP33 : 命令字符\r
+// 353456789012345:IMEI号,设备唯一ID\r
+// 080835:指令流水号\r
+// 1:设备工作模式,1:正常模式,2:省电模式,3:紧急模式\r
+\r
+ String[] cmdlist=cmd.split(",");\r
+ if (cmdlist.length == 6){\r
+\r
+\r
+ log("work mode "+cmdlist[3]);\r
+ int mod=Integer.valueOf(cmdlist[3]);\r
+ int Cycle=Integer.valueOf(cmdlist[4]);\r
+ int gpson=Integer.valueOf(cmdlist[5]);\r
+\r
+ String msg=AP34(cmdlist[2],mod);\r
+ //设定当前工作模式及循环频率\r
+ connection.send(genStringMessage("AP34",msg));\r
+\r
+ if(gpson==1){\r
+ mod=ICLocation.CUSTOM_MOD8_GPS;\r
+ }else{\r
+ mod=ICLocation.CUSTOM_MOD8_WIFI;\r
+ }\r
+ log("reply msg "+msg);\r
+ log("LOCATION_MODE "+LOCATION_MODE+" mod "+ mod + ", cycle = "+Cycle+", GPS On= "+gpson);\r
+ Config.setLocationMode(runtime.getContextProxy().context,mod);\r
+ Config.setLocationCycle(runtime.getContextProxy().context,Cycle);\r
+ runtime.getLocationInstance().setLocation_cycle(Cycle);\r
+ runtime.getLocationInstance().setWorkingMod(mod);\r
+// CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod());\r
+ //此处设置好配置后,会在LocationClient通过消息开始执行及时定位操作。\r
+ }\r
+\r
+ }\r
+\r
+ /**\r
+ * 心率上传,返回协议字串\r
+ * @param ds\r
+ * @return\r
+ */\r
+ public static String AP49(Runtime ds){\r
+ //示例数据:IWAP49,68##\r
+ return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP49))\r
+ .append(CMDSPLIT).append(ds.getHRS().getPPG())\r
+ .append(CMDEND).toString();\r
+\r
+ }\r
+\r
+\r
+\r
+\r
+ /**\r
+ * 返回上传心率血压的协议字串\r
+ * @param ds\r
+ * @return\r
+ */\r
+ public static String APHT(Runtime ds){\r
+ //IWAPHT,60,130,85#\r
+ //说明:\r
+ //IW:标识符\r
+ //APHT : 命令字符\r
+ //60 : 表示心率\r
+ //130: 血压高压 [收缩压]\r
+ //85 : 血压低压 [舒张压]\r
+ //平台响应: IWBPHT#\r
+ //表示平台已接收,可不作响应\r
+ return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APHT))\r
+ .append(CMDSPLIT).append(ds.getHRS().getPPG())\r
+ .append(CMDSPLIT).append(ds.getHRS().getBPH())\r
+ .append(CMDSPLIT).append(ds.getHRS().getBPL())\r
+ .append(CMDEND).toString();\r
+ }\r
+ public static String APHT(String ppg,String bph,String bpl){\r
+ //IWAPHT,60,130,85#\r
+ //说明:\r
+ //IW:标识符\r
+ //APHT : 命令字符\r
+ //60 : 表示心率\r
+ //130: 血压高压 [收缩压]\r
+ //85 : 血压低压 [舒张压]\r
+ //平台响应: IWBPHT#\r
+ //表示平台已接收,可不作响应\r
+ return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APHT))\r
+ .append(CMDSPLIT).append(ppg)\r
+ .append(CMDSPLIT).append(bph)\r
+ .append(CMDSPLIT).append(bpl)\r
+ .append(CMDEND).toString();\r
+ }\r
+\r
+\r
+ //立即定位反馈\r
+ public static String AP16(String cmdindex){\r
+//IWAP16,080835#\r
+//080835:指令流水号\r
+ return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP16))\r
+ .append(CMDSPLIT).append(cmdindex)\r
+ .append(CMDEND).toString();\r
+ }\r
+ // 立即定位指令(长链接有效)\r
+ public void handleBP16(Connection connection,Runtime runtime,String cmd){\r
+ //示例数据:IWBP16,867155030001063,335386\r
+// IWBP16,353456789012345,080835#\r
+// 说明:\r
+// IW:标识符\r
+// BP16 : 命令字符\r
+// 353456789012345:IMEI号,设备唯一ID\r
+// 080835 :指令流水号\r
+ String[] cmdlist = cmd.split(",");\r
+ if(cmdlist.length==3){\r
+ log("imei "+cmdlist[1]+", cmdindex "+cmdlist[2]);\r
+\r
+ connection.send(genStringMessage("AP16",AP16(cmdlist[2])));\r
+ }else{\r
+ log("error BP16 format");\r
+ }\r
+ }\r
+\r
+\r
+ /*通过基站获取时间和坐标*/\r
+ public static String APTM(Runtime ds){\r
+ //示例数据:IWAPTM,460,0,9750,3613#\r
+ //说明:\r
+ //IW:标识符\r
+ //APTM : 命令字符\r
+ //460:MCC\r
+ //0: MNC\r
+ //9750: LAC\r
+ //3613: CID\r
+\r
+ return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTM))\r
+ .append(CMDSPLIT).append(ds.getLocationInstance().getMCC())\r
+ .append(CMDSPLIT).append(ds.getLocationInstance().getMNC())\r
+ .append(CMDSPLIT).append(ds.getLocationInstance().getLAC())\r
+ .append(CMDSPLIT).append(ds.getLocationInstance().getGSMStationCID())\r
+ .append(CMDEND).toString();\r
+\r
+ }\r
+\r
+ public void handleBPTM(String cmd){\r
+ //平台响应: IWBPTM,20160225090909,22.123456,113.654321#\r
+ //返回时间,格式为:yyyyMMddHHmmss ,为UTC0 时间\r
+ //经纬度保留六位小数,若没取到则返回 0\r
+ String[] list=cmd.split(CMDSPLIT);\r
+\r
+ if(list.length==4){\r
+\r
+ String time=list[1];\r
+ String lat=list[2];\r
+ String lon=list[3];\r
+ ICLogger.i("BPTM , time="+time+", lat="+lat+", lon="+lon);\r
+ }else{\r
+ ICLogger.i("BPTM format error");\r
+ }\r
+\r
+\r
+ }\r
+\r
+ public static String AP15(String index){\r
+//IWAP15, 080835#\r
+//080835:指令流水号\r
+ return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP15))\r
+ .append(CMDSPLIT).append(index)\r
+ .append(CMDEND).toString();\r
+ }\r
+\r
+ //设置定位周期\r
+ public void handleBP15(String cmd ,Connection connection,Runtime runtime){\r
+// IWBP15, 353456789012345, 080835, 30#\r
+// 353456789012345:IMEI号,设备唯一ID\r
+// 080835 :指令流水号\r
+// 30: 表示频率为30分钟\r
+\r
+ String[] list=cmd.split(CMDSPLIT);\r
+\r
+ if(list.length==4){\r
+ String index=list[2];\r
+ String time=list[3];\r
+ connection.send(genStringMessage("AP15",AP15(index)));\r
+ ICLogger.i("BP15 , 定位周期="+time+"秒");\r
+\r
+ Config.setLocationMode(runtime.getContextProxy().context, ICLocation.CUSTOM_MOD8_GPS);\r
+ Config.setLocationCycle(runtime.getContextProxy().context,Integer.valueOf(time));\r
+ runtime.getLocationInstance().setWorkingMod(Config.getLocationMode(runtime.getContextProxy().context));\r
+ runtime.getLocationInstance().setLocation_cycle(Config.getLocationCycle(runtime.getContextProxy().context));\r
+ //set AlarmCycle and trigger Location\r
+ CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod());\r
+ }else{\r
+ ICLogger.i("BP15 format error");\r
+ }\r
+\r
+ }\r
+\r
+\r
+\r
+\r
+\r
+\r
+ /*语音下行反馈*/\r
+ public static String AP28(String name, String msg, int packagecount, int currentpackageindex, int received_success) {\r
+ //示例数据:IWAP28,D3590D54,xxxx,6,1,1#\r
+ return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP28))\r
+ .append(CMDSPLIT).append(name)\r
+ .append(CMDSPLIT).append(msg)\r
+ .append(CMDSPLIT).append(packagecount)\r
+ .append(CMDSPLIT).append(currentpackageindex)\r
+ .append(CMDSPLIT).append(received_success)\r
+ .append(CMDEND).toString();\r
+ }\r
+\r
+ //处理 BP28 语音消息\r
+ public void handleBP28(NettyConnection connection,String cmd,Runtime runtime,byte[] bytes) {\r
+ //log("handleBP28 msg"+cmd);\r
+/**\r
+ * IWBP28, D3590D54,XXXX,6,1,1024,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#\r
+ * 说明:\r
+ * IW:标识符\r
+ * BP28 : 命令字符\r
+ * D3590D54:UNICODE编码,发送者名称\r
+ * XXXX: 附加信息,在响应数据包时,将附加信息原样响应,类似流水号\r
+ * 6:语音包分包总数\r
+ * 1 :当前包数,第一包为1,第二包为2,。。。。。。同一个语音包的语音时间相同\r
+ * 1024 :语音包长度\r
+ * XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:当前音频数据, 每个音频数据包大小为1024字节,最后一包不足1024的取实际字节数\r
+ * 语音包上传规则:\r
+ * 按包次序依次上传,上传后如果没有收到服务器的响应包,则继续上传该语音包。\r
+ * 收到设备回复确认数据包接收成功状态后,继续开始依次上传下一个数据包。。。。。。\r
+ * 如果设备回复确认数据包接收失败状态,则重复发送上一个数据包\r
+ * 设备响应: IWAP28,D3590D54,XXXX,6,1,1#\r
+ * D3590D54:UNICODE编码,发送者名称\r
+ * XXXX: 附加信息,原样返回\r
+ * 6:语音包分包总数\r
+ * 1:当前设备收到的是第几个包\r
+ * 1:表示设备接受数据成功,0表示设备接受数据失败\r
+ */\r
+ String Name;\r
+ String appendIndex;\r
+ int packetCount;\r
+ int currentId;\r
+ int packetLen;\r
+ byte[] packetData;\r
+\r
+ String[] msg= cmd.split(CMDSPLIT);\r
+ if (msg.length>=6){\r
+\r
+ Name=msg[1];\r
+ appendIndex=msg[2];\r
+ packetCount= Integer.valueOf(msg[3]);\r
+ currentId= Integer.valueOf(msg[4]);\r
+ packetLen= Integer.valueOf(msg[5]);\r
+ packetData= Util.subArray(bytes,msg[0].length()+msg[1].length()+msg[2].length()+msg[3].length()+msg[4].length()+msg[5].length()+6,bytes.length-1);\r
+\r
+ StringBuffer stringBuffer=new StringBuffer();\r
+ stringBuffer.append("recv BP28 name = ").append(Name)\r
+ .append(",appendIndex = ").append(appendIndex)\r
+ .append(",packetCount = ").append(packetCount)\r
+ .append(",currentId = ").append(currentId)\r
+ .append(",packetLen = ").append(packetLen)\r
+ .append(",packetDatalen = ").append(packetData.length);\r
+\r
+ log( stringBuffer.toString());\r
+ connection.send(genStringMessage("AP28",AP28(Name,appendIndex,packetCount,currentId,1)));\r
+ voicePacket.getInstance().appendVoice(Name,appendIndex,packetCount,currentId,packetLen,packetData);\r
+ log("================"+voicePacket.getInstance().toString());\r
+ if (voicePacket.getInstance().isFinished())\r
+ {\r
+\r
+ String dir = Environment.getExternalStorageDirectory()+ "/Android/VoiceCache";\r
+ String amrFilepath=Util.saveFile(voicePacket.getInstance().getVoicePacketBytes(),0,voicePacket.getInstance().getVoicePacketLen(),new File(dir),"receive_"+voicePacket.getInstance().getPacketTime()+".amr");\r
+ ICLogger.i("save Amr file to "+amrFilepath);\r
+ voicePacket.getInstance().clearPacket();\r
+ VoiceContent voiceContent=VoiceContent.placeHolderIn(Content.CONTACT_CATEGORY_GROUP,GROUP_ALL,amrFilepath);\r
+\r
+\r
+ final Uri uri2 = runtime.getDbHelper().insertMessage( voiceContent);\r
+\r
+ //回复UI消息,表示已经接收到\r
+ voiceContent.status = 3;\r
+ voiceContent.serverTime = TimeUtil.getSystemTime3();\r
+ voiceContent.preview = String.valueOf(Util.getDuration(voiceContent.content));\r
+ runtime.getDbHelper().updateMessage(voiceContent, uri2);\r
+\r
+// runtime.getContextProxy().sendBroadcast(ACTION_IMESSAGE, runtime);\r
+\r
+ connection.DeliverCMDMessageToSystem("NewVoice", "");//通知下面线程状态变化\r
+ }\r
+\r
+ }else{\r
+ log("handleBP28","format Error");\r
+// connection.send(genStringMessage("AP28",AP28(Name,appendIndex,packetCount,currentId,0)));\r
+\r
+ }\r
+\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
+ //白名单开关(下行协议号:BP84,响应:AP84)\r
+ public static String AP84(String index,int success){\r
+\r
+ //设备响应: IWAP80,080835,1#\r
+ //080835:指令流水号\r
+ //1:表示设备执行成功,0 表示设备执行失败\r
+ return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP84))\r
+ .append(CMDSPLIT).append(index)\r
+ .append(CMDSPLIT).append(success)\r
+ .append(CMDEND).toString();\r
+ }\r
+\r
+ public void handleBP84(String cmd,Connection connection){\r
+//示例:\r
+ //IWBP84,353456789012345,080835,1#\r
+ //说明:\r
+ //IW:标识符\r
+ //BP84 : 命令字符\r
+ //353456789012345:IMEI号,设备唯一ID\r
+ //080835 :指令流水号\r
+ //1: 表示白名单开,0 表示白名单关\r
+ String[] list=cmd.split(CMDSPLIT);\r
+\r
+ if (list.length==4){\r
+ String index=list[2];\r
+ String whitelist_switch=list[3];\r
+ connection.send(genStringMessage("AP84",AP84(index,1)));\r
+\r
+ if (whitelist_switch.equals("1")){\r
+ Util.setSystemProperties("persist.sys.whitelist.enable","true");\r
+ }else{\r
+ Util.setSystemProperties("persist.sys.whitelist.enable","false");\r
+ }\r
+ ICLogger.i("收到服务器指令:白名单"+(whitelist_switch.equals("1")?"开":"关"));\r
+\r
+ }else{\r
+\r
+ ICLogger.i("BP84 format error!");\r
+ }\r
+\r
+ }\r
+\r
+ //17.设置心率/血压测量周期(下行协议号:BP86,响应:AP86)\r
+ public static String AP86(String index){\r
+\r
+ //设备响应: IWAP86, 080835#\r
+ //080835:指令流水号\r
+ return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP86))\r
+ .append(CMDSPLIT).append(index)\r
+ .append(CMDEND).toString();\r
+ }\r
+\r
+ public void handleBP86(String cmd,Connection connection,Runtime runtime){\r
+\r
+ //示例:\r
+ //IWBP86, 353456789012345, 080835,1,720#\r
+ //说明:\r
+ //IW:标识符\r
+ //BP86 : 命令字符\r
+ //353456789012345:IMEI号,设备唯一ID\r
+ //080835 :指令流水号\r
+ //1: 表示心率周期;2 :表示血压周期\r
+ //720: 表示720分钟\r
+\r
+ String[] list=cmd.split(CMDSPLIT);\r
+\r
+ if (list.length==5){\r
+ String index=list[2];\r
+ String type=list[3];\r
+ String cycle=list[4];\r
+ connection.send(genStringMessage("AP86",AP86(index)));\r
+ ICLogger.i("收到服务器指令:设置"+(type.equals("1")?"心率周期 ":"血压周期 ")+cycle+"分钟");\r
+\r
+ //发送重置PPGCycle的广播,会在CoreServer里面执行\r
+ Intent intent = new Intent();\r
+ intent.putExtra("PPGTestCycle",Integer.valueOf(cycle));\r
+ runtime.getContextProxy().sendBrodcast(ACTION_HEATR_RATE_START,intent);\r
+ }else{\r
+ ICLogger.i("BP86 format error!");\r
+ }\r
+\r
+ }\r
+\r
+ //18.18.设置心率/血压阀值(下行协议号:BP89,响应:AP89)\r
+ public static String AP89(String index){\r
+\r
+ //设备响应: IWAP89, 080835#\r
+ //080835:指令流水号\r
+ return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP89))\r
+ .append(CMDSPLIT).append(index)\r
+ .append(CMDEND).toString();\r
+ }\r
+\r
+ public void handleBP89(String cmd,Connection connection){\r
+\r
+ //示例:\r
+ //IWBP89, 353456789012345, 080835,50,90,80,90,110,140#\r
+ //说明:\r
+ //IW:标识符\r
+ //BP89 : 命令字符\r
+ //353456789012345:IMEI号,设备唯一ID\r
+ //080835 :指令流水号\r
+ //50: 心率低阀值,低于该阀值上传心率,如果未设置,则留空\r
+ //90: 心率高阀值,高于该阀值上传心率,如果未设置,则留空\r
+ //80: 低压阀值,低压低于该阀值上传血压,如果未设置,则留空\r
+ //90: 低压阀值,低压高于该阀值上传血压,如果未设置,则留空\r
+ //110: 高压阀值,高压低于该阀值上传血压,如果未设置,则留空\r
+ //140: 高压阀值,高压高于该阀值上传血压,如果未设置,则留空\r
+ String[] list=cmd.split(CMDSPLIT);\r
+ if (list.length==9){\r
+ String index=list[2];\r
+ String PPGH=list[3];\r
+ String PPGL=list[4];\r
+ String BPH_H=list[5];\r
+ String BPH_L=list[6];\r
+ String BPL_H=list[7];\r
+ String BPL_L=list[8];\r
+ connection.send(genStringMessage("AP89",AP89(index)));\r
+ ICLogger.i("收到服务器指令:心率/血压阀值 "+PPGH+","+PPGL+","+BPH_H+","+BPH_L+","+BPL_H+","+BPL_L);\r
+ }else{\r
+ ICLogger.i("BP89 format error!");\r
+ }\r
+\r
+ }\r
+ public boolean handleCmd(CMD_TYPE type, String cmd) {\r
+\r
+ //普通非二进制命令用此函数处理\r
+ boolean ret=true;\r
+ ICLogger.i("handleCmd "+type.name() + " strLen="+cmd.length());\r
+ if (Config.LOG_TOFILE)ICLogger.logToFile("APILog", " recv " + cmd);\r
+ switch (type){\r
+ case BP00: //登录包\r
+ handleBP00(mRuntime,cmd);\r
+ ICLogger.i("服务器收到登录包AP00");\r
+ mConnection.DeliverCMDMessageToSystem("BP00",cmd);//通知下面线程状态变化\r
+ break;\r
+ case BP01: //gps定位包\r
+ handleBP01(cmd);\r
+ ICLogger.i("服务器收到定位AP01");\r
+ mConnection.DeliverCMDMessageToSystem("IWAP01",cmd);//通知下面线程状态变化\r
+ break;\r
+ case BP02:// wifi定位包\r
+ handleBP02(cmd);\r
+ ICLogger.i("服务器收到定位AP02");\r
+ mConnection.DeliverCMDMessageToSystem("IWAP02",cmd);//通知下面线程状态变化\r
+ break;\r
+ case BP03: //心跳包\r
+ handleBP03(cmd);\r
+ ICLogger.i("服务器收到心跳包AP03");\r
+ mConnection.DeliverCMDMessageToSystem("BP03",cmd);//通知下面线程状态变化\r
+ break;\r
+\r
+ case BP07:\r
+ //收到发送的语音包\r
+ handleBP07(cmd,mConnection);\r
+ break;\r
+ case BP10:\r
+ //报警包\r
+ mConnection.DeliverCMDMessageToSystem("IWAP10",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 BP33:\r
+ //设置工作模式\r
+ handleBP33(mConnection,mRuntime,cmd);\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
+ case BP16:\r
+ //立即定位指令(长链接有效)\r
+ handleBP16(mConnection,mRuntime,cmd);\r
+ mConnection.DeliverCMDMessageToSystem("StartLocate",cmd);//通知下面线程状态变化\r
+ break;\r
+\r
+// case BP05: //L02服务器不适用\r
+// //查询服务器语音 返回信息\r
+// API.handleBP05(cmd);\r
+// break;\r
+\r
+ case BP12:\r
+ //收到设置SOS号码\r
+ handleBP12(mConnection,cmd,mRuntime);\r
+ ICLogger.i("收到服务器设置SOS号码命令BP12");\r
+ break;\r
+ case BP14:\r
+ //收到设置白名单号码\r
+ handleBP14(mConnection,cmd,mRuntime);\r
+ ICLogger.i("收到服务器设置白名单号码命令BP14");\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 BP31:\r
+ //收到关机\r
+ handleBP31(mConnection,cmd);\r
+ ICLogger.i("收到服务器关机命令BP31");\r
+ mConnection.DeliverCMDMessageToSystem("poweroff",cmd);//通知下面线程状态变化\r
+ break;\r
+\r
+ case BPXL:\r
+ handleBPXL(cmd,mConnection);\r
+ ICLogger.i("收到服务器心率检测命令");\r
+ HeartRateManager.triggerPPGtest();\r
+ break;\r
+ case BPXY:\r
+ handleBPXY(cmd,mConnection);\r
+ ICLogger.i("收到服务器血压检测命令");\r
+ HeartRateManager.triggerPPGtest();\r
+ break;\r
+ case BPJZ:\r
+ handleBPJZ(cmd,mConnection,mRuntime);\r
+ ICLogger.i("收到服务器血压校准命令");\r
+ break;\r
+ case BPHT:\r
+ ICLogger.i("服务器收到上传的心率血压");\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
+// ICLogger.i("");\r
+ break;\r
+ case BP89:\r
+ //心率/血压阀值\r
+ handleBP89(cmd,mConnection);\r
+ break;\r
+ }\r
+\r
+ return ret;\r
+\r
+ }\r
+\r
+\r
+ public boolean handleCmd(CMD_TYPE type, String cmd, byte[] bytes) {\r
+\r
+ //只有需要传递二级制数据的才需要这个函数,目前只有BP28需要\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 BP28:\r
+ handleBP28(mConnection,cmd, mRuntime,bytes);\r
+ ICLogger.i("收到服务器语音BP28");\r
+ mConnection.DeliverCMDMessageToSystem("BP28", "");//通知下面线程状态变化\r
+ break;\r
+ }\r
+ return ret;\r
+ }\r
+}\r
-package com.enqualcomm.support.adapter;\r
+package com.ic.protocols;\r
\r
import android.content.ComponentName;\r
import android.content.Intent;\r
import android.net.Uri;\r
import android.os.Environment;\r
-import android.os.Messenger;\r
-import android.util.Log;\r
\r
import com.enqualcomm.support.Config;\r
-import com.enqualcomm.support.Constants;\r
-import com.enqualcomm.support.LocationClient;\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.StringMessage;\r
import com.enqualcomm.support.bean.VoiceContent;\r
import com.enqualcomm.support.bean.voicePacket;\r
-import com.enqualcomm.support.CoreService;\r
-import com.enqualcomm.support.service.Deliver;\r
+import com.enqualcomm.support.service.HeartRateManager;\r
import com.enqualcomm.support.utils.Connection;\r
-import com.enqualcomm.support.utils.DBHelper;\r
import com.enqualcomm.support.utils.ICLogger;\r
import com.enqualcomm.support.utils.NettyConnection;\r
-import com.enqualcomm.support.utils.ProcessReceiver;\r
-import com.enqualcomm.support.utils.ServiceUtil;\r
-import com.enqualcomm.support.utils.SharPreferenceUtil;\r
import com.enqualcomm.support.utils.TimeUtil;\r
import com.enqualcomm.support.utils.Util;\r
\r
import java.io.File;\r
-import java.sql.Time;\r
import java.util.ArrayList;\r
import java.util.Date;\r
import java.util.HashMap;\r
\r
-import static com.enqualcomm.support.Constants.ACTION_EQC_ALARM;\r
import static com.enqualcomm.support.Constants.ACTION_HEATR_RATE_START;\r
-import static com.enqualcomm.support.Constants.ACTION_IMESSAGE;\r
-import static com.enqualcomm.support.LocationClient.LOCATION_CYCLE;\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 protocolAPIHelper {\r
- private static final String TAG = "ICSrv." + protocolAPIHelper.class.getSimpleName();\r
+public class protocol_jiai {\r
+ private static final String TAG = "ICSrv." + protocol_jiai.class.getSimpleName();\r
\r
private static final String CMDHEADER = "IW";\r
private static final String CMDEND = "#";\r
private static final String CMDSPLIT = ",";\r
- private CmdHandler cmdHandler=null;\r
public enum CMD_TYPE {\r
/*终端发起*/\r
AP00,//登录包\r
cmdMap.put(CMD_TYPE.BP89, "BP89");\r
}\r
\r
- public protocolAPIHelper(CmdHandler handler) {\r
+ private NettyConnection mConnection=null;\r
+ private Runtime mRuntime=null;\r
+\r
+ public protocol_jiai(NettyConnection connect,Runtime runtime) {\r
+ mConnection=connect;\r
+ mRuntime=runtime;\r
\r
- cmdHandler=handler;\r
}\r
\r
private StringBuffer cmdbuf = new StringBuffer();\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
+ 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
返回true 表示 cmd 全部解析成功\r
byte[] amrBuf;\r
int amrLen = getBP28Amrlen(cmdlist[i] );\r
if (bytes.length > amrLen) {\r
- if (cmdHandler != null)\r
- cmdHandler.handleCmd(key, cmdlist[i], bytes);\r
+ handleCmd(key, cmdlist[i], bytes);\r
}\r
} else {\r
- if (cmdHandler!=null) cmdHandler.handleCmd(key, cmdlist[i]);\r
+ handleCmd(key, cmdlist[i]);\r
}\r
}\r
}\r
log("handleBP00", "Set Datetime " + msg[1]);\r
log("handleBP00", "Set TimeZone " + msg[2]);\r
\r
- Date datetime=TimeUtil.parseDatetiime(msg[1]);\r
+ Date datetime= TimeUtil.parseDatetiime(msg[1]);\r
int timezone=Integer.parseInt(msg[2]);\r
if (datetime!=null){\r
ICLogger.i("==="+TimeUtil.getDefaultTimeZone());\r
* @param cmd\r
* @param connection\r
*/\r
- public void handleBPXL(String cmd,Connection connection){\r
+ public void handleBPXL(String cmd, Connection connection){\r
//IWBPXL,353456789012345,080835#\r
//说明:\r
//IW:标识符\r
String index=list[2];\r
String imei=list[1];\r
ICLogger.i("Handle BPXL IMEI "+imei+",index "+index);\r
- connection.send(protocolAPIHelper.genStringMessage("APXL",APXL(index)));\r
+ connection.send(genStringMessage("APXL",APXL(index)));\r
}else{\r
ICLogger.i("BPXL format error!");\r
}\r
String index=list[2];\r
String imei=list[1];\r
ICLogger.i("Handle BPXY IMEI "+imei+",index "+index);\r
- connection.send(protocolAPIHelper.genStringMessage("APXY",APXY(index)));\r
+ connection.send(genStringMessage("APXY",APXY(index)));\r
}else{\r
ICLogger.i("BPXY format error!");\r
}\r
String strAge=list[5];\r
String strSex=list[6];\r
\r
- connection.send(protocolAPIHelper.genStringMessage("APJZ",APJZ(index,strBPH,strBPL,strAge,strSex)));\r
+ connection.send(genStringMessage("APJZ",APJZ(index,strBPH,strBPL,strAge,strSex)));\r
runtime.getHRS().setXY_Ref(Integer.valueOf(strBPH),Integer.valueOf(strBPL),Integer.valueOf(strAge),Integer.valueOf(strSex));\r
ICLogger.i("Handle BPJZ IMEI "+imei+",index "+index+", BPH "+strBPH+", BPL "+strBPL+", Age "+ strAge +", Sex "+ (strSex.equals("1")?"男":"女"));\r
}else{\r
}\r
}\r
\r
- //设置SOS号码\r
+ //设置SOS号码\r
public static String AP12(String index,String phNum1,String phNum2,String phNum3){\r
return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP12))\r
.append(CMDSPLIT).append(index)\r
.append(CMDSPLIT).append(phnumbs[9])\r
.append(CMDEND).toString();\r
}\r
-//设置通讯录,白名单(10个)\r
+ //设置通讯录,白名单(10个)\r
public void handleBP14(Connection connection,String cmd , Runtime runtime){\r
// IWBP14,867155030001063,357444,9b44529b|13554820016,,,,,,,,,\r
/**\r
connection.send(genStringMessage("AP14",AP14(index,phnums)));\r
ArrayList<Contact> contactArray=new ArrayList<Contact>();\r
for (int i=0; i< phnums.length;i++){\r
- String[] tmp= phnums[i].split("\\|");\r
- if (tmp.length==2){\r
- String name=Util.decodeUnicode2Utf8(tmp[0]);\r
- String phonem=tmp[1];\r
- ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length+" , name="+name+",-"+phonem);\r
- contactArray.add(new Contact(Contact.CATEGORY_CALL,name,phonem));\r
- }else{\r
- ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length);\r
-\r
- }\r
+ String[] tmp= phnums[i].split("\\|");\r
+ if (tmp.length==2){\r
+ String name= Util.decodeUnicode2Utf8(tmp[0]);\r
+ String phonem=tmp[1];\r
+ ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length+" , name="+name+",-"+phonem);\r
+ contactArray.add(new Contact(Contact.CATEGORY_CALL,name,phonem));\r
+ }else{\r
+ ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length);\r
+\r
+ }\r
}\r
// contactArray.add(new Contact(Contact.CATEGORY_GROUP,"All","666"));\r
// contactArray.add(new Contact(Contact.CATEGORY_PARTNER,"PARTNER","666"));\r
.append(CMDEND).toString();\r
\r
}\r
-//设置闹钟\r
+ //设置闹钟\r
public void handleBP85(String cmd , Connection connection,Runtime runtime){\r
// IWBP85,867155030001063,155312,1,1,0235,12,1,1\r
// IWBP85,867155030002145,945166,1,0,\r
\r
}\r
\r
-public static String AP15(String index){\r
+ public static String AP15(String index){\r
//IWAP15, 080835#\r
//080835:指令流水号\r
- return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP15))\r
- .append(CMDSPLIT).append(index)\r
- .append(CMDEND).toString();\r
-}\r
+ return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP15))\r
+ .append(CMDSPLIT).append(index)\r
+ .append(CMDEND).toString();\r
+ }\r
\r
//设置定位周期\r
public void handleBP15(String cmd ,Connection connection,Runtime runtime){\r
if(list.length==4){\r
String index=list[2];\r
String time=list[3];\r
- connection.send(protocolAPIHelper.genStringMessage("AP15",AP15(index)));\r
- ICLogger.i("BP15 , 定位周期="+time+"分钟");\r
+ connection.send(genStringMessage("AP15",AP15(index)));\r
+ ICLogger.i("BP15 , 定位周期="+time+"秒");\r
\r
Config.setLocationMode(runtime.getContextProxy().context, ICLocation.CUSTOM_MOD8_GPS);\r
Config.setLocationCycle(runtime.getContextProxy().context,Integer.valueOf(time));\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
+ 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
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\r
+ intent.setComponent(componentName);\r
+ dev.getContextProxy().context.startActivity(intent);\r
}\r
\r
//白名单开关(下行协议号:BP84,响应:AP84)\r
if (list.length==4){\r
String index=list[2];\r
String whitelist_switch=list[3];\r
- connection.send(protocolAPIHelper.genStringMessage("AP84",AP84(index,1)));\r
+ connection.send(genStringMessage("AP84",AP84(index,1)));\r
\r
if (whitelist_switch.equals("1")){\r
Util.setSystemProperties("persist.sys.whitelist.enable","true");\r
String index=list[2];\r
String type=list[3];\r
String cycle=list[4];\r
- connection.send(protocolAPIHelper.genStringMessage("AP86",AP86(index)));\r
+ connection.send(genStringMessage("AP86",AP86(index)));\r
ICLogger.i("收到服务器指令:设置"+(type.equals("1")?"心率周期 ":"血压周期 ")+cycle+"分钟");\r
\r
//发送重置PPGCycle的广播,会在CoreServer里面执行\r
String BPH_L=list[6];\r
String BPL_H=list[7];\r
String BPL_L=list[8];\r
- connection.send(protocolAPIHelper.genStringMessage("AP89",AP89(index)));\r
+ connection.send(genStringMessage("AP89",AP89(index)));\r
ICLogger.i("收到服务器指令:心率/血压阀值 "+PPGH+","+PPGL+","+BPH_H+","+BPH_L+","+BPL_H+","+BPL_L);\r
}else{\r
ICLogger.i("BP89 format error!");\r
}\r
\r
}\r
- public interface CmdHandler\r
- {\r
+ public boolean handleCmd(CMD_TYPE type, String cmd) {\r
+\r
+ //普通非二进制命令用此函数处理\r
+ boolean ret=true;\r
+ ICLogger.i("handleCmd "+type.name() + " strLen="+cmd.length());\r
+ if (Config.LOG_TOFILE)ICLogger.logToFile("APILog", " recv " + cmd);\r
+ switch (type){\r
+ case BP00: //登录包\r
+ handleBP00(mRuntime,cmd);\r
+ ICLogger.i("服务器收到登录包AP00");\r
+ mConnection.DeliverCMDMessageToSystem("BP00",cmd);//通知下面线程状态变化\r
+ break;\r
+ case BP01: //gps定位包\r
+ handleBP01(cmd);\r
+ ICLogger.i("服务器收到定位AP01");\r
+ mConnection.DeliverCMDMessageToSystem("IWAP01",cmd);//通知下面线程状态变化\r
+ break;\r
+ case BP02:// wifi定位包\r
+ handleBP02(cmd);\r
+ ICLogger.i("服务器收到定位AP02");\r
+ mConnection.DeliverCMDMessageToSystem("IWAP02",cmd);//通知下面线程状态变化\r
+ break;\r
+ case BP03: //心跳包\r
+ handleBP03(cmd);\r
+ ICLogger.i("服务器收到心跳包AP03");\r
+ mConnection.DeliverCMDMessageToSystem("BP03",cmd);//通知下面线程状态变化\r
+ break;\r
+\r
+ case BP07:\r
+ //收到发送的语音包\r
+ handleBP07(cmd,mConnection);\r
+ break;\r
+ case BP10:\r
+ //报警包\r
+ mConnection.DeliverCMDMessageToSystem("IWAP10",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 BP33:\r
+ //设置工作模式\r
+ handleBP33(mConnection,mRuntime,cmd);\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
+ case BP16:\r
+ //立即定位指令(长链接有效)\r
+ handleBP16(mConnection,mRuntime,cmd);\r
+ mConnection.DeliverCMDMessageToSystem("StartLocate",cmd);//通知下面线程状态变化\r
+ break;\r
+\r
+// case BP05: //L02服务器不适用\r
+// //查询服务器语音 返回信息\r
+// API.handleBP05(cmd);\r
+// break;\r
+\r
+ case BP12:\r
+ //收到设置SOS号码\r
+ handleBP12(mConnection,cmd,mRuntime);\r
+ ICLogger.i("收到服务器设置SOS号码命令BP12");\r
+ break;\r
+ case BP14:\r
+ //收到设置白名单号码\r
+ handleBP14(mConnection,cmd,mRuntime);\r
+ ICLogger.i("收到服务器设置白名单号码命令BP14");\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 BP31:\r
+ //收到关机\r
+ handleBP31(mConnection,cmd);\r
+ ICLogger.i("收到服务器关机命令BP31");\r
+ mConnection.DeliverCMDMessageToSystem("poweroff",cmd);//通知下面线程状态变化\r
+ break;\r
+\r
+ case BPXL:\r
+ handleBPXL(cmd,mConnection);\r
+ ICLogger.i("收到服务器心率检测命令");\r
+ HeartRateManager.triggerPPGtest();\r
+ break;\r
+ case BPXY:\r
+ handleBPXY(cmd,mConnection);\r
+ ICLogger.i("收到服务器血压检测命令");\r
+ HeartRateManager.triggerPPGtest();\r
+ break;\r
+ case BPJZ:\r
+ handleBPJZ(cmd,mConnection,mRuntime);\r
+ ICLogger.i("收到服务器血压校准命令");\r
+ break;\r
+ case BPHT:\r
+ ICLogger.i("服务器收到上传的心率血压");\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
+// ICLogger.i("");\r
+ break;\r
+ case BP89:\r
+ //心率/血压阀值\r
+ handleBP89(cmd,mConnection);\r
+ break;\r
+ }\r
+\r
+ return ret;\r
+\r
+ }\r
+\r
+\r
+ public boolean handleCmd(CMD_TYPE type, String cmd, byte[] bytes) {\r
\r
- boolean handleCmd(CMD_TYPE type, String cmd);\r
- boolean handleCmd(CMD_TYPE type, String cmd,byte[] bytes);\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 BP28:\r
+ handleBP28(mConnection,cmd, mRuntime,bytes);\r
+ ICLogger.i("收到服务器语音BP28");\r
+ mConnection.DeliverCMDMessageToSystem("BP28", "");//通知下面线程状态变化\r
+ break;\r
+ }\r
+ return ret;\r
}\r
\r
}\r