From: snickersun Date: Tue, 18 Aug 2020 15:56:29 +0000 (+0800) Subject: 添加protocol_mqtt.java 协议解析库,暂时为fzd的复本。 X-Git-Url: http://git.snicker.com.cn/Users/apple/Desktop/static/gitweb.css?a=commitdiff_plain;h=e63939be611cfbe328506b10a46370728ef76540;p=protocol_srv.git 添加protocol_mqtt.java 协议解析库,暂时为fzd的复本。 --- diff --git a/app/src/main/java/com/enqualcomm/support/Config.java b/app/src/main/java/com/enqualcomm/support/Config.java index 5a32f7ee..7752df82 100644 --- a/app/src/main/java/com/enqualcomm/support/Config.java +++ b/app/src/main/java/com/enqualcomm/support/Config.java @@ -479,6 +479,7 @@ public class Config { public static final int PROTOCOL_BEEHOME=1; public static final int PROTOCOL_IC=2; public static final int PROTOCOL_FZD=3; + public static final int PROTOCOL_MQTT=4; public static int protocol_no=getProtocolNumber(); public static int getProtocolNumber(){ @@ -499,13 +500,15 @@ public class Config { case PROTOCOL_FZD: ICLogger.i("协议 FZD"); break; - + case PROTOCOL_MQTT: + ICLogger.i("协议 MQTT"); + break; default: - ICLogger.i("协议版本 目前支持0,1,2,3 。"); + ICLogger.i("协议版本 目前支持0,1,2,3,4 。"); break; } }else{ - ICLogger.i("协议版本要是数字,目前支持0,1,2 。"); + ICLogger.i("协议版本要是数字,目前支持0,1,2,3,4 。"); } protocol_no=ret; return ret; diff --git a/app/src/main/java/com/ic/protocols/protocolAPIHelper.java b/app/src/main/java/com/ic/protocols/protocolAPIHelper.java index 14ad1879..5d0c6e28 100644 --- a/app/src/main/java/com/ic/protocols/protocolAPIHelper.java +++ b/app/src/main/java/com/ic/protocols/protocolAPIHelper.java @@ -14,6 +14,7 @@ public class protocolAPIHelper { private static protocol_beehome protocolbeehome_handler=null; private static protocol_ic protocolic_handler=null; private static protocol_fzd protocolfzd_handler=null; + private static protocol_mqtt protocolmqtt_handler=null; public protocolAPIHelper(NettyConnection connect,Runtime runtime) { ICLogger.i("init Protocol "+Config.getProtocolNumber()); @@ -25,6 +26,8 @@ public class protocolAPIHelper { protocolic_handler=new protocol_ic(connect,runtime); if (protocolfzd_handler==null) protocolfzd_handler=new protocol_fzd(connect,runtime); + if (protocolmqtt_handler==null) + protocolmqtt_handler=new protocol_mqtt(connect,runtime); } private static boolean is_protocol_not_Initialled(){ @@ -53,6 +56,9 @@ public class protocolAPIHelper { case Config.PROTOCOL_FZD: protocolfzd_handler.parserCmd(bytes); break; + case Config.PROTOCOL_MQTT: + protocolmqtt_handler.parserCmd(bytes); + break; } return true; } @@ -80,6 +86,9 @@ public class protocolAPIHelper { case Config.PROTOCOL_FZD: ret=protocol_fzd.isCmdStr(msg); break; + case Config.PROTOCOL_MQTT: + ret=protocol_mqtt.isCmdStr(msg); + break; } return ret; } @@ -101,6 +110,9 @@ public class protocolAPIHelper { case Config.PROTOCOL_FZD: ret=protocol_fzd.PING(); break; + case Config.PROTOCOL_MQTT: + ret=protocol_mqtt.PING(); + break; } return ret; } @@ -122,6 +134,9 @@ public class protocolAPIHelper { case Config.PROTOCOL_FZD: ret=protocol_fzd.temp(body_temp); break; + case Config.PROTOCOL_MQTT: + ret=protocol_mqtt.temp(body_temp); + break; } return ret; } @@ -142,6 +157,9 @@ public class protocolAPIHelper { case Config.PROTOCOL_FZD: ret=""; break; + case Config.PROTOCOL_MQTT: + ret=""; + break; } return ret; } @@ -163,6 +181,9 @@ public class protocolAPIHelper { case Config.PROTOCOL_FZD: ret=protocol_fzd.LK(); break; + case Config.PROTOCOL_MQTT: + ret=protocol_mqtt.LK(); + break; } return ret; } @@ -184,6 +205,9 @@ public class protocolAPIHelper { case Config.PROTOCOL_FZD: ret=protocol_fzd.KA(runtime); break; + case Config.PROTOCOL_MQTT: + ret=protocol_mqtt.KA(runtime); + break; } return ret; } @@ -205,6 +229,9 @@ public class protocolAPIHelper { case Config.PROTOCOL_FZD: ret=protocol_fzd.UD(runtime); break; + case Config.PROTOCOL_MQTT: + ret=protocol_mqtt.UD(runtime); + break; } return ret; } @@ -225,6 +252,9 @@ public class protocolAPIHelper { case Config.PROTOCOL_FZD: ret=protocol_fzd.UD(runtime); break; + case Config.PROTOCOL_MQTT: + ret=protocol_mqtt.UD(runtime); + break; } return ret; } @@ -246,6 +276,9 @@ public class protocolAPIHelper { case Config.PROTOCOL_FZD: ret=null;//protocol_fzd.AP07(packetTime,count,index,datalen,amrdata); break; + case Config.PROTOCOL_MQTT: + ret=null;//protocol_fzd.AP07(packetTime,count,index,datalen,amrdata); + break; } return ret; } @@ -266,6 +299,9 @@ public class protocolAPIHelper { case Config.PROTOCOL_FZD: ret=""; break; + case Config.PROTOCOL_MQTT: + ret=""; + break; } return ret; } @@ -286,6 +322,9 @@ public class protocolAPIHelper { case Config.PROTOCOL_FZD: ret=""; break; + case Config.PROTOCOL_MQTT: + ret=""; + break; } return ret; } @@ -307,6 +346,9 @@ public class protocolAPIHelper { case Config.PROTOCOL_FZD: ret=protocol_fzd.blood(pbl,pbh); break; + case Config.PROTOCOL_MQTT: + ret=protocol_mqtt.blood(pbl,pbh); + break; } return ret; } @@ -328,6 +370,9 @@ public class protocolAPIHelper { case Config.PROTOCOL_FZD: ret=protocol_fzd.oxygen(ox); break; + case Config.PROTOCOL_MQTT: + ret=protocol_mqtt.oxygen(ox); + break; } return ret; } @@ -348,6 +393,9 @@ public class protocolAPIHelper { case Config.PROTOCOL_FZD: ret=protocol_fzd.heart(ppg); break; + case Config.PROTOCOL_MQTT: + ret=protocol_mqtt.heart(ppg); + break; } return ret; } @@ -369,6 +417,9 @@ public class protocolAPIHelper { case Config.PROTOCOL_FZD: ret=""; break; + case Config.PROTOCOL_MQTT: + ret=""; + break; } return ret; } @@ -391,6 +442,9 @@ public class protocolAPIHelper { case Config.PROTOCOL_FZD: ret=protocol_fzd.defaultServerIP; break; + case Config.PROTOCOL_MQTT: + ret=protocol_mqtt.defaultServerIP; + break; } return ret; } @@ -411,6 +465,9 @@ public class protocolAPIHelper { case Config.PROTOCOL_FZD: ret=protocol_fzd.defaultServerPort; break; + case Config.PROTOCOL_MQTT: + ret=protocol_mqtt.defaultServerPort; + break; } return ret; } @@ -431,6 +488,9 @@ public class protocolAPIHelper { case Config.PROTOCOL_FZD: ret=""; break; + case Config.PROTOCOL_MQTT: + ret=""; + break; } return ret; } diff --git a/app/src/main/java/com/ic/protocols/protocol_mqtt.java b/app/src/main/java/com/ic/protocols/protocol_mqtt.java new file mode 100644 index 00000000..6175da4b --- /dev/null +++ b/app/src/main/java/com/ic/protocols/protocol_mqtt.java @@ -0,0 +1,851 @@ +package com.ic.protocols; + +import android.content.ComponentName; +import android.content.Intent; + +import com.enqualcomm.support.Config; +import com.enqualcomm.support.CoreService; +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.NettyConnection; +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.HashMap; + +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 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,//报警数据上传 + Time,//获取服务器时间 + 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,//心率上传 + UNKNOWN_CMD, + } + + private static HashMap cmdMap = null; + + static { + cmdMap = new HashMap(); + 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.Time, "Time"); + 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"); + } + + private NettyConnection mConnection=null; + private Runtime mRuntime=null; + + public protocol_mqtt(NettyConnection 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); + 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 String 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 sb.toString(); + } + public static String 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 sb.toString(); + } + /*登录*/ + public static String LK() { + /*IC*YYYYYYYYYYYYYYY*LEN*LK*/ + return genFZDCMD(cmdMap.get(CMD_TYPE.LK)); + } + + /** + * 绑定 + * */ + public static String 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] + int bind=Integer.parseInt(data); + if (bind==0){ + ICLogger.i("设备未绑定!"); + runtime.BindingStatus=false; + }else{ + ICLogger.i("设备已绑定!"); + runtime.BindingStatus=true; + } + + } + + public static String 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){ + + } + + /*LBS+GPS混合定位*/ + public static String 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()).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 String UPLOAD(){ + + return genFZDCMD(cmdMap.get(CMD_TYPE.UPLOAD)); + } + + public void handleUPLOAD(Connection connection,Runtime runtime,String cmd,String data){ + connection.send(genStringMessage("UPLOAD",UPLOAD())); + 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通过消息开始执行及时定位操作。 + + } + + public static String heart(int hrt){ + return genFZDCMD(cmdMap.get(CMD_TYPE.heart),String.valueOf(hrt)); + } + public static String oxygen(int ox){ + return genFZDCMD(cmdMap.get(CMD_TYPE.oxygen),String.valueOf(ox)); + } + + public static String blood(int pbl,int pbh){ + String data=pbh+CMDSPLIT+pbl; + return genFZDCMD(cmdMap.get(CMD_TYPE.blood),data); + } + + public static String temp(double temp){ + return genFZDCMD(cmdMap.get(CMD_TYPE.temp),String.format("%.1f",temp)); + } + public static String POWEROFF(){ + return genFZDCMD(cmdMap.get(CMD_TYPE.POWEROFF)); + } + public void handlePOWEROFF(Connection connection) { + + connection.send(genStringMessage("POWEROFF",POWEROFF())); + } + public static String CR(){ + return genFZDCMD(cmdMap.get(CMD_TYPE.CR)); + } + public void handleCR(Connection connection) { + + connection.send(genStringMessage("CR",CR())); + } + public static String bldstart(){ + return genFZDCMD(cmdMap.get(CMD_TYPE.bldstart)); + } + public void handleBldstart(Connection connection) { + + connection.send(genStringMessage("bldstart",bldstart())); + } + public static String wdstart(){ + return genFZDCMD(cmdMap.get(CMD_TYPE.wdstart)); + } + public void handleWdstart(Connection connection,Runtime runtime ,String data) { + + connection.send(genStringMessage("wdstart",wdstart())); + int freq=Integer.parseInt(data); + + + Config.setTemperatureTestCycle(runtime,freq); + CoreService.getInstance().setTempAlarm(); + + TemperatureUtil.doTempTestInThread(); +// +// 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 String hrtstart(){ + return genFZDCMD(cmdMap.get(CMD_TYPE.hrtstart)); + } + public void handleHrtstart(Connection connection) { + + connection.send(genStringMessage("hrtstart",hrtstart())); + } + public static String FIND(){ + return genFZDCMD(cmdMap.get(CMD_TYPE.FIND)); + } + public void handleFIND(Connection connection) { + + connection.send(genStringMessage("FIND",FIND())); + } + public static String SOS(){ + return genFZDCMD(cmdMap.get(CMD_TYPE.SOS)); + } + + + public void handleSOS(Connection connection,Runtime runtime,String cmd,String data) { + + connection.send(genStringMessage("SOS",SOS())); + if (data!=null && data.length()>0) { + String list[] = data.split(CMDSPLIT); + if (list.length==1){ + ArrayList contactArray=new ArrayList(); + 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 contactArray=new ArrayList(); + 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 String 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 contactArray=new ArrayList(); + for(int i=0; i