From: snickersun Date: Thu, 3 Dec 2020 01:55:02 +0000 (+0800) Subject: release L02protocolV2 V722 X-Git-Url: http://git.snicker.com.cn/sitemap.xml?a=commitdiff_plain;h=23c6ae53c7c63f84a100f4e77b167f4322430c6a;p=protocol_srv.git release L02protocolV2 V722 1、蓝牙上报,去掉mac中的: 2、protocol_ic 蓝牙APBR收到服务器反馈处理, 3、放走丢的AL, PRACTICE 协议同样需要处理服务器反馈。 --- diff --git a/app/release/ICSer_V720_2012011924_release.apk b/app/release/ICSer_V722_2012030950_release.apk similarity index 78% rename from app/release/ICSer_V720_2012011924_release.apk rename to app/release/ICSer_V722_2012030950_release.apk index a8a8f39b..37548246 100644 Binary files a/app/release/ICSer_V720_2012011924_release.apk and b/app/release/ICSer_V722_2012030950_release.apk differ diff --git a/app/release/output.json b/app/release/output.json index 3814e48e..7a6e6f13 100644 --- a/app/release/output.json +++ b/app/release/output.json @@ -1 +1 @@ -[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":720,"versionName":"2012011924","enabled":true,"outputFile":"ICSer_V720_2012011924_release.apk","fullName":"release","baseName":"release"},"path":"ICSer_V720_2012011924_release.apk","properties":{}}] \ No newline at end of file +[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":722,"versionName":"2012030950","enabled":true,"outputFile":"ICSer_V722_2012030950_release.apk","fullName":"release","baseName":"release"},"path":"ICSer_V722_2012030950_release.apk","properties":{}}] \ No newline at end of file diff --git a/app/src/main/java/com/ic/protocols/protocol_fzd.java b/app/src/main/java/com/ic/protocols/protocol_fzd.java index e2110337..5d396c95 100644 --- a/app/src/main/java/com/ic/protocols/protocol_fzd.java +++ b/app/src/main/java/com/ic/protocols/protocol_fzd.java @@ -1,959 +1,964 @@ -package com.ic.protocols; - -import android.content.ComponentName; -//import android.content.IClipboard; -import android.content.Intent; -import android.net.Uri; -import android.os.Environment; - -//import com.android.internal.telephony.uicc.RuimFileHandler; -import com.enqualcomm.support.Config; -import com.enqualcomm.support.CoreService; -import com.enqualcomm.support.bean.Alarm; -import com.enqualcomm.support.bean.Contact; -import com.enqualcomm.support.bean.Content; -import com.enqualcomm.support.bean.HealthInfo; -import com.enqualcomm.support.bean.ICLocation; -import com.enqualcomm.support.bean.Runtime; -import com.enqualcomm.support.bean.StringMessage; -import com.enqualcomm.support.bean.VoiceContent; -import com.enqualcomm.support.bean.voicePacket; -import com.enqualcomm.support.service.HeartRateManager; -import com.enqualcomm.support.utils.Connection; -import com.enqualcomm.support.utils.ICLogger; -import com.enqualcomm.support.utils.MD5; -import com.enqualcomm.support.utils.TemperatureUtil; -import com.enqualcomm.support.utils.TimeUtil; -import com.enqualcomm.support.utils.Util; -import com.enqualcomm.support.utils.regexUtil; - -import java.io.File; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; - -import chestnut.utils.PhoneUtils; - -import static com.enqualcomm.support.Constants.ACTION_HEATR_RATE_START; -import static com.enqualcomm.support.LocationClient.LOCATION_MODE; -import static com.enqualcomm.support.bean.Contact.GROUP_ALL; -import static java.lang.Math.abs; - -public class protocol_fzd { - private static final String TAG = "ICSrv." + protocol_fzd.class.getSimpleName(); - private static final String PrivKEY = "XMQcHi0lGIdru6xzW7lygBwBT8N0c09P"; - private static final String CMDHEADER = "["; - private static final String CMDCOMPANY="IC"; - private static final String CMDEND = "]"; - private static final String CMDHEADERSPLIT = "*"; - private static final String CMDSPLIT = ","; - - public static final String defaultServerIP="api.xcloudtech.com"; - public static final int defaultServerPort=9000; - - public enum CMD_TYPE { - /*终端发起*/ - //链路保持数据 - LK,//登录 - PING,//绑定查询 - KA,//心跳包 - UD,//位置上传 - UD2,//盲点位置上传 - AL,//报警数据上传 - LGZONE,//获取服务器时区时间 - WT,//获取天气 - img,//上传图片 - VOICE,//上传语音 - WG,//请求位置信息 - DLT,//解绑 - temp,//体温上传 - /* 服务器发起*/ - UPLOAD,//数据上传间隔设置 - CENTER,//中心号码设置 - CALL, //拨打电话 - MONITOR,//监听 - SOS,//SOS 号码设置 - FACTORY,//恢复出厂设置 - SOSSMS,//SOS 短信报警开关 - LOWBAT,//低电短信报警开关 - VERNO,//版本查询 - CR,//定位指令 - POWEROFF,//关机指令 - REMOVE,//取下手环报警开关 - REMOVESMS,//取下手表短信报警开关 - PEDO,//计步功能开关 - SILENCETIME,//免打扰时间段设置 - SILENCETIME2, //免打扰时间段设置 - SLEEPTIME,//翻转检测时间段设置 - FIND,//找手表指令 - REMIND,//闹钟设置指令 - TK,//对讲功能(微聊发送语音) - PHL,//设置电话本+白名单(最多 50 条) - wdstart,//远程测温 - bldstart,//远程测血压 - hrtstart,//远程测量心率 - BOOTOFF,//定时关机 - oxygen,//血氧上传 - blood,//血压上传 - heart,//心率上传 - PRACTICE,//自由锻炼数据上传 - UNKNOWN_CMD, - } - - private static HashMap 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.LGZONE, "LGZONE"); - cmdMap.put(CMD_TYPE.WT, "WT"); - cmdMap.put(CMD_TYPE.img, "img"); - cmdMap.put(CMD_TYPE.VOICE, "VOICE"); - cmdMap.put(CMD_TYPE.WG, "WG"); - cmdMap.put(CMD_TYPE.DLT, "DLT"); - cmdMap.put(CMD_TYPE.temp, "temp"); - cmdMap.put(CMD_TYPE.UPLOAD, "UPLOAD"); - cmdMap.put(CMD_TYPE.CENTER, "CENTER"); - cmdMap.put(CMD_TYPE.CALL, "CALL"); - cmdMap.put(CMD_TYPE.MONITOR, "MONITOR"); - cmdMap.put(CMD_TYPE.SOS, "SOS"); - cmdMap.put(CMD_TYPE.FACTORY, "FACTORY"); - cmdMap.put(CMD_TYPE.SOSSMS, "SOSSMS"); - cmdMap.put(CMD_TYPE.LOWBAT, "LOWBAT"); - cmdMap.put(CMD_TYPE.VERNO, "VERNO"); - cmdMap.put(CMD_TYPE.CR, "CR"); - cmdMap.put(CMD_TYPE.POWEROFF, "POWEROFF"); - cmdMap.put(CMD_TYPE.REMOVE, "REMOVE"); - cmdMap.put(CMD_TYPE.REMOVESMS, "REMOVESMS"); - cmdMap.put(CMD_TYPE.PEDO, "PEDO"); - cmdMap.put(CMD_TYPE.SILENCETIME, "SILENCETIME"); - cmdMap.put(CMD_TYPE.SILENCETIME2, "SILENCETIME2"); - cmdMap.put(CMD_TYPE.SLEEPTIME, "SLEEPTIME"); - cmdMap.put(CMD_TYPE.FIND, "FIND"); - cmdMap.put(CMD_TYPE.REMIND, "REMIND"); - cmdMap.put(CMD_TYPE.TK, "TK"); - cmdMap.put(CMD_TYPE.PHL, "PHL"); - cmdMap.put(CMD_TYPE.wdstart, "wdstart"); - cmdMap.put(CMD_TYPE.bldstart, "bldstart"); - cmdMap.put(CMD_TYPE.hrtstart, "hrtstart"); - cmdMap.put(CMD_TYPE.BOOTOFF, "BOOTOFF"); - cmdMap.put(CMD_TYPE.oxygen, "oxygen"); - cmdMap.put(CMD_TYPE.blood, "blood"); - cmdMap.put(CMD_TYPE.heart, "heart"); - cmdMap.put(CMD_TYPE.PRACTICE, "PRACTICE"); - } - - private Connection mConnection=null; - private Runtime mRuntime=null; - - public protocol_fzd(Connection connect, Runtime runtime) { - mConnection=connect; - mRuntime=runtime; - - } - - private StringBuffer cmdbuf = new StringBuffer(); - -// /* -// 输入的字符串,如果有完整命令,返回 true -// 否则返回 false -// */ -// public boolean isCmdStr(String msg) { -// /*** -// * IC*334588000000156*LEN*FALLDOWN -// */ -// String cmd; -// int index=msg.indexOf(CMDSPLIT); -// if (index > 0){ -// cmd = msg.substring(0,index); -// }else{ -// cmd = msg; -// } -// if (regexUtil.isFZDCMD(cmd) ) { -// return true; -// } -// return false; -// } - - private void log(String msg) { - ICLogger.log(TAG, msg); - } - - private void log(String function, String msg) { - ICLogger.log(TAG, function, msg); - } - - - /**/ - public static StringMessage genStringMessage(String cmdName, String msg){ - StringMessage sm=new StringMessage(new String[]{cmdName,msg}); - sm.refresh(msg); - sm.setDate(TimeUtil.getSystemDateYYMMDD(),TimeUtil.getSystemTimeHHmmss()); - return sm; - } - - /* - 输入的字符串,如果有完整命令,返回 命令名 - 否则返回 空字符串 - */ - public static String isCmdStr(String msg) { - String cmd_msgbuf=msg; - int cmdindex =cmd_msgbuf.indexOf(CMDCOMPANY+CMDHEADERSPLIT); - if (cmdindex>0) { //如果开头不是CMDHEADER但是包含CMDHEADER则删除前面的数据 - String cmd=cmd_msgbuf.substring(cmdindex); - cmd_msgbuf=cmd; - } - cmdindex=cmd_msgbuf.indexOf(CMDEND); - if(cmdindex>0){ - String cmd=cmd_msgbuf.substring(0,cmdindex); - cmd_msgbuf=cmd; - } - cmdindex=cmd_msgbuf.indexOf(CMDSPLIT); - if(cmdindex>0){ - String cmd=cmd_msgbuf.substring(0,cmdindex); - cmd_msgbuf=cmd; - } - - if (regexUtil.isFZDCMD(cmd_msgbuf)) { - for (CMD_TYPE key : cmdMap.keySet()) { - if (regexUtil.isFZDCMD(cmdMap.get(key), cmd_msgbuf)) { //如果是FZD命令,则进行处理,否则保留数据动 - ICLogger.i("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key)); - return cmdMap.get(key); - } - } - return ""; - }else - return ""; - } - /* - 返回true 表示 cmd 全部解析成功 - 返回false表示 cmd至少有一条解析失败,失败的数据归入buffer,下一次识别接着使用 - 字符串通过#号进行识别。 - 每个字符串如果发现 #,却又没有Header,“IW”则会被丢弃 - */ - public boolean parserCmd(byte[] bytes) { - String cmd_msgbuf=new String(bytes); - log("bytes.size "+bytes.length); - cmdbuf.append(cmd_msgbuf); - log("cmdbuf.size "+cmdbuf.length() +" "+cmdbuf.toString()); - int cmdindex =cmd_msgbuf.indexOf(CMDCOMPANY+CMDHEADERSPLIT); - if (cmdindex>0) { //如果开头不是CMDHEADER但是包含CMDHEADER则删除前面的数据 - String cmd=cmd_msgbuf.substring(cmdindex); - cmd_msgbuf=cmd; - } - cmdindex=cmd_msgbuf.indexOf(CMDEND); - if(cmdindex>0){ - String cmd=cmd_msgbuf.substring(0,cmdindex); - cmd_msgbuf=cmd; - } - cmdindex=cmd_msgbuf.indexOf(CMDSPLIT); - if(cmdindex>0){ - String cmd=cmd_msgbuf.substring(0,cmdindex); - cmd_msgbuf=cmd; - } - if (cmdbuf.toString().split(CMDCOMPANY+CMDHEADERSPLIT).length>1) - { - ICLogger.i("More than 1 cmd in buffer ! just log it"); - } - for (CMD_TYPE key : cmdMap.keySet()) { - // ICLogger.i("key "+cmdMap.get(key)+" cmdbuf "+cmd_msgbuf); - if (regexUtil.isFZDCMD(cmdMap.get(key),cmd_msgbuf)) { //如果是FZD命令,则进行处理,否则保留数据动 - String data=cmdbuf.toString().replace(CMDHEADER,"").replace(cmd_msgbuf,"").replace(CMDEND,""); -// ICLogger.i("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key) + " , " + cmdbuf.toString() + " "+cmd_msgbuf + " data "+data ); -// if (key == CMD_TYPE.TK) { -// //如果是BP28则 后面的数据是音频,需要保留 -// byte[] amrBuf; -// int amrLen = getBP28Amrlen(cmdlist[i] ); -// if (bytes.length > amrLen) { -// handleCmd(key, cmdlist[i], bytes); -// } -// } else { - if (data.startsWith(CMDSPLIT)) data=data.substring(1); - handleCmd(key, cmd_msgbuf,data); - cmdbuf.delete(0,cmdbuf.length());//处理后清空 -// } - } - } - return true; - } - - private static String getHexLen(int len){ - StringBuilder sb=new StringBuilder(); - int v = len & 0xFFFF; - String hv = Integer.toHexString(v); - if (hv.length() ==1 ) { - sb.append(0).append(0).append(0); - }else if (hv.length()==2){ - sb.append(0).append(0); - }else if (hv.length()==3){ - sb.append(0); - } - sb.append(hv); - return sb.toString(); - } - private static String genHeader(int len,String cmd){ - - if (CoreService.getInstance()==null) - return ""; - - String imei =CoreService.getInstance().getRuntime().IMEI(); - return new StringBuilder().append(CMDCOMPANY).append(CMDHEADERSPLIT) - .append(imei).append(CMDHEADERSPLIT) - .append(getHexLen(len)).append(CMDHEADERSPLIT).append(cmd).toString(); - } - - private static String keyheader(String cmd,int len){ - String header=genHeader(len,cmd); - String key= MD5.getCMDStringMD5(header+PrivKEY); - return key; - } - - public static StringMessage genFZDCMD( String CMD){ - StringBuilder sb=new StringBuilder(); - int len=CMD.length(); - String header=genHeader(len,CMD); - String keyheader=keyheader(CMD,len); - sb.append(CMDHEADER).append(keyheader).append(header).append(CMDEND); - return genStringMessage(CMD,sb.toString()); - } - public static StringMessage genFZDCMD( String CMD,String data){ - StringBuilder sb=new StringBuilder(); - String data_buf=CMD+CMDSPLIT+data; - int data_buf_len=data_buf.length(); - String header=genHeader(data_buf_len,CMD); - String keyheader=keyheader(CMD,data_buf_len);//计算header md5值 - sb.append(CMDHEADER).append(keyheader).append(header).append(CMDSPLIT).append(data).append(CMDEND); - return genStringMessage(CMD,sb.toString()); - } - /*登录*/ - public static StringMessage LK() { - /*IC*YYYYYYYYYYYYYYY*LEN*LK*/ - return genFZDCMD(cmdMap.get(CMD_TYPE.LK)); - } - - /** - * 绑定 - * */ - public static StringMessage PING(){ -// IC*YYYYYYYYYYYYYYY*LEN*PING - return genFZDCMD(cmdMap.get(CMD_TYPE.PING)); - } - - - public static void handlePing(Runtime runtime,String data){ -// [IC*YYYYYYYYYYYYYYY*LEN*PING,是否绑定(0 表示未绑定,1 表示绑定)] -// 实例:[IC*334588000000156*0006*PING,0]或[IC*334588000000156*0006*PING,1] - try { - int bind = Integer.parseInt(data); - if (bind == 0) { - ICLogger.i("设备未绑定!"); - runtime.BindingStatus = false; - } else { - ICLogger.i("设备已绑定!"); - runtime.BindingStatus = true; - } - }catch (Exception e){ - ICLogger.e(e.getMessage(),e); - } - - } - - public static StringMessage KA(Runtime runtime){ -//[IC*YYYYYYYYYYYYYYY*LEN*KA,日期,步数,翻滚次数,电量百分数] 实例:[IC*334588000000156*0014*KA,120414,50,100,100] - StringBuilder sb=new StringBuilder(); - String cmd=cmdMap.get(CMD_TYPE.KA); - sb.append(TimeUtil.getSystemDateYYMMDD()).append(CMDSPLIT) - .append(runtime.getTotalStepCount()).append(CMDSPLIT) - .append(runtime.getRolltimes()).append(CMDSPLIT) - .append(runtime.getBattery()); - return genFZDCMD(cmd,sb.toString()); - } - - - public void handleKA(Runtime runtime,String data){ - - } - - - public static StringMessage LGZONE(Runtime runtime) { - return genFZDCMD(cmdMap.get(CMD_TYPE.LGZONE)); - } - public void handleLGZONE(Runtime runtime, String data){ - - /*** - * 平台回复:[XT*YYYYYYYYYYYYYYY*LEN*LGZONE,时区,时间,日期] - * 实例: [XT*1234567890*001D*LGZONE,+8,08:00:00,2016-01-12] - */ - String[] list=data.split(CMDSPLIT); - if (list.length==3){ - String timeZone=list[0].trim(); - String date=list[2].trim(); - String time=list[1].trim(); - Date datetime= TimeUtil.parseDatetiime(date,time); - int timezone; - try - { - timezone=Integer.parseInt(timeZone.replace("+","").trim()); - }catch (Exception e){ - ICLogger.e("timezone",e); - timezone=8; - } - - if (datetime!=null){ - ICLogger.i("==="+timezone+" "+TimeUtil.getDefaultTimeZone()); - TimeUtil.setTimeZone(timezone); - - - ICLogger.i("==="+TimeUtil.getDefaultTimeZone()); - TimeUtil.setSysDateTime(runtime.getContextProxy().context,datetime,timezone); - ICLogger.i("==="+TimeUtil.getDefaultTimeZone()); - } -// Set Datetime 20200505112734 -// Set TimeZone 8 - - }else{ - ICLogger.i("LGZONE Format Error!"); - } - - - } - - - /*LBS+GPS混合定位*/ - public static StringMessage UD(Runtime runtime) { - /*** - * [IC*334588000000156*00CD*UD,180916,025723,A,22.570733,N,113.8626083,E,0.00,249.5,0.0,6,100, 60,0,0,00000010,7,255,460,1,9529,21809,158,9529,63555,133,9529,63554,129,9529,21405,126,95 - * 29,21242,124,9529,21151,120,9529,63556,119,0] - * 说明: - * 数据内容: - * UD,命令号 - * 180916,日期(年月日)(0 时区),表示 0 时区的二零一八年九月十六号 - * - * 025723,时间(时分秒)(0 时区),表示 0 时区的两点五十七分二十三秒A,gps 定位有效 - * 22.570733,纬度 - * N,纬度表示113.8626083,经度 - * E,经度表示0.00,速度 - * 249.5,方向 - * 0.0,海拔 - * 6,卫星个数 - * - * 100,gsm 信号强度 - * 60,电量 - * 0,计步数 - * 0,翻转次数 - * 00000010,终端状态,数据为 16 进制,解析成二进制为 0000 0000 0000 0000 0000 0000 0001 0000 - * 前面 4 个字节表示状态,后面 4 个字节表示报警,数据中第 4 位为 1,对照文档最后的数据解析,表示手表静止状态。详细可参看文档最后部分。 - * 7,基站个数 - * 255,460,1,9529,21809,158,9529,63555,133,9529,63554,129,9529,21405,126,9529,21242,124,9529, - * 21151,120,9529,63556,119,基站信息 - * 0,WiFi 个数 - * - */ - - - StringBuilder sb=new StringBuilder(); - String cmd=cmdMap.get(CMD_TYPE.UD); - sb.append(TimeUtil.getSystemDateYYMMDD()).append(CMDSPLIT) - .append(TimeUtil.getSystemTimeHHmmss()).append(CMDSPLIT) - .append(runtime.getFZDGPSData()).append(CMDSPLIT) - .append(String.format("%03d",abs(runtime.getSignalStrength()))).append(CMDSPLIT) - .append(runtime.getBattery()).append(CMDSPLIT) - .append(runtime.getTotalStepCount()).append(CMDSPLIT) - .append(runtime.getRolltimes()).append(CMDSPLIT) - .append(runtime.getFZDDevStatus(runtime)).append(CMDSPLIT) - .append(runtime.getFZDLBSMultiStationData()).append(CMDSPLIT) - .append(runtime.getFZDWifiData()); - - return genFZDCMD(cmd,sb.toString()); - } - - - /*LBS+WiFi混合定位*/ - public static String UD2(Runtime ds) { - //示例数据:IWAP02, - // zh_cn, - // 0, - // 7, - // 460,0, - // 9520|3671|13,9520|3672|12,9520|3673|11,9520|3674|10,9520|3675|9,9520|3676|8,9520|3677|7, - // 4, - // 1|D8-24-BD-79-FA-1F|59&2|3C-46-D8-6D-CE-01|81&3|0C-4C-39-1A-7C-65|69&4|70-A8-E3-5D-D7-C0|65# -// IW标识符 -// AP02:命令字 -// zh_cn: 语言标志 -// 0:回复标识,为0时不回复地址,为 1 时,服务器回复地址信息 -// 7: 表示共有7组基站 -// 460: MCC 国家码 -// 0: MNC运营商代码 -// 9520|3671|10: LAC|CID|dbm表示一组基站信息,后面数量需和基站组数地应 10:dbm为信号强度多基站信号强度建议从高到低排列后上传,信号强度转正数:150 – abs(dbm) -// 4: 表示WIFI组数, -// 1|D8-24-BD-79-FA-1F|59: ssid|mac地址|信号强度,信号强度转正数:150 – abs(信号强度) - - int apsum=0; - String wifiinfo=ds.getWifiInfo(); - if (!wifiinfo.isEmpty()) { - String[] list = wifiinfo.split("&"); - apsum = list.length; - } - - ICLogger.i("Wifi ap sum "+apsum); - return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.LK)).append(CMDSPLIT) - .append(ds.getLanguage()).append(CMDSPLIT) - .append(0).append(CMDSPLIT) //为0时不回复地址 - .append(ds.getLBSMultiStationData()).append(CMDSPLIT) //基站信息数据 - .append(apsum).append(CMDSPLIT).append(ds.getWifiInfo()).append(CMDEND).toString(); //wifi信息数据 - } - - //处理 定位 BP01 - public void handleUD2(String cmd){ - log("BP02定位接收成功"); - } - - - public static StringMessage AL(Runtime runtime){ - /*** - * [IC*334588000000156*00CD*AL,180916,064153,A,22.570512,N,113.8623267,E,0.00,154.8,0.0,11,10 0,100,0,0,00100018,7,0,460,1,9529,21809,155,9529,21242,132,9529,21405,131,9529,63554,131,9 - * 529,63555,130,9529,63556,118,9529,21869,116,0,12.4] - * 平台回复: - * [IC*YYYYYYYYYYYYYYY*LEN*AL] - * 实例:[IC*334588000000156*0002*AL] - * 说明:终端产生警情后发送报警信息到平台,若终端没有收到回复,则定时上报直到收到报警确认为止. - */ - - StringBuilder sb=new StringBuilder(); - String cmd=cmdMap.get(CMD_TYPE.AL); - sb.append(TimeUtil.getSystemDateYYMMDD()).append(CMDSPLIT) - .append(TimeUtil.getSystemTimeHHmmss()).append(CMDSPLIT) - .append(runtime.getFZDGPSData()).append(CMDSPLIT) - .append(String.format("%03d",abs(runtime.getSignalStrength()))).append(CMDSPLIT) - .append(runtime.getBattery()).append(CMDSPLIT) - .append(runtime.getTotalStepCount()).append(CMDSPLIT) - .append(runtime.getRolltimes()).append(CMDSPLIT) - .append(runtime.getFZDDevStatus(runtime)).append(CMDSPLIT) - .append(runtime.getFZDLBSMultiStationData()).append(CMDSPLIT) - .append(runtime.getFZDWifiData()); - - return genFZDCMD(cmd,sb.toString()); - } - - public static StringMessage UPLOAD(){ - - return genFZDCMD(cmdMap.get(CMD_TYPE.UPLOAD)); - } - - public void handleUPLOAD(Connection connection,Runtime runtime,String cmd,String data){ - connection.send(UPLOAD()); - try { - int timesecond = Integer.parseInt(data); - int mod = runtime.getLocationInstance().getWorkingMod(); - log("LOCATION_MODE " + LOCATION_MODE + " mod " + mod); - Config.setLocationMode(runtime.getContextProxy().context, mod); - Config.setLocationCycle(runtime.getContextProxy().context, timesecond); - runtime.getLocationInstance().setLocation_cycle(timesecond); - runtime.getLocationInstance().setWorkingMod(mod); -// CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod()); - //此处设置好配置后,会在LocationClient通过消息开始执行及时定位操作。 - }catch (Exception e){ - ICLogger.e(e.getMessage(),e); - } - } - - public static StringMessage heart(int hrt){ - return genFZDCMD(cmdMap.get(CMD_TYPE.heart),String.valueOf(hrt)); - } - public static StringMessage oxygen(int ox){ - return genFZDCMD(cmdMap.get(CMD_TYPE.oxygen),String.valueOf(ox)); - } - - public static StringMessage blood(int pbl,int pbh){ - String data=pbh+CMDSPLIT+pbl; - return genFZDCMD(cmdMap.get(CMD_TYPE.blood),data); - } - - public static StringMessage temp(double temp){ - return genFZDCMD(cmdMap.get(CMD_TYPE.temp),String.format("%.1f",temp)); - } - public static StringMessage POWEROFF(){ - return genFZDCMD(cmdMap.get(CMD_TYPE.POWEROFF)); - } - public void handlePOWEROFF(Connection connection) { - - connection.send(POWEROFF()); - } - public static StringMessage CR(){ - return genFZDCMD(cmdMap.get(CMD_TYPE.CR)); - } - public void handleCR(Connection connection) { - - connection.send(CR()); - } - public static StringMessage bldstart(){ - return genFZDCMD(cmdMap.get(CMD_TYPE.bldstart)); - } - public void handleBldstart(Connection connection) { - - connection.send(bldstart()); - } - public static StringMessage wdstart(){ - return genFZDCMD(cmdMap.get(CMD_TYPE.wdstart)); - } - public void handleWdstart(Connection connection,Runtime runtime ,String data) { - - connection.send(wdstart()); - try { - int freq = Integer.parseInt(data); - - - Config.setTemperatureTestCycle(runtime, freq); - CoreService.getInstance().setTempAlarm(); - - if(runtime.check_stat_do_temp_test()) TemperatureUtil.doTempTestInThread(); - }catch (Exception e){ - ICLogger.e(e.getMessage(),e); - } -// -// double wrist_temp,body_temp; -// wrist_temp= TemperatureUtil.get_temp_value_adjusted(); -// body_temp=TemperatureUtil.getBodyTemp(wrist_temp,26.0f); -// String temperatureMsg=temp(body_temp); -// connection.send(genStringMessage("temp",temperatureMsg)); - } - public static StringMessage hrtstart(){ - return genFZDCMD(cmdMap.get(CMD_TYPE.hrtstart)); - } - public void handleHrtstart(Connection connection) { - - connection.send(hrtstart()); - } - public static StringMessage FIND(){ - return genFZDCMD(cmdMap.get(CMD_TYPE.FIND)); - } - public void handleFIND(Connection connection) { - - connection.send(FIND()); - } - public static StringMessage SOS(){ - return genFZDCMD(cmdMap.get(CMD_TYPE.SOS)); - } - - - public void handleSOS(Connection connection,Runtime runtime,String cmd,String data) { - - connection.send(SOS()); - if (data!=null && data.length()>0) { - String list[] = data.split(CMDSPLIT); - if (list.length==1){ - ArrayList 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 StringMessage PHL(){ - return genFZDCMD(cmdMap.get(CMD_TYPE.PHL)); - } - - public void handlePHL(Connection connection,Runtime runtime,String cmd,String data){ - /*** - * [IC*334588000000156*len*PHL,号码,名字,号码,名字,号码,名字,号码,名字,号码,名字] len:发送长度 16 进制表示 占用 2 个字节 - * 号码:ascii 字符 名字:Unicode 编码 - * 该接口融合了白名单和电话本的功能,最多对应 50 组号码与名字,号码不超过 20 个 ascii 字符, 姓名不超过 10 个 Unicode 字符。 - * 示 例 : [IC*334588000000156*0010*PHL,110,5F204E09] - * 5F204E09--->张三,是使用 unicode 编码 - * 终端回复:[IC*334588000000156*0003*PHL] - */ - - String list[]=data.split(CMDSPLIT); - int listlen=list.length; - boolean ispared= (( listlen >0) && (listlen%2 == 0)); - if (ispared){ - ArrayList contactArray=new ArrayList(); - for(int i=0; i0) - return genFZDCMD(cmdMap.get(CMD_TYPE.PRACTICE),String.valueOf(healthInfo.getBufferDataStr())); - else - return null; - } - - public boolean handleCmd(CMD_TYPE type, String cmd , String data) { - - //普通非二进制命令用此函数处理 - boolean ret=true; - ICLogger.i("handleCmd "+type.name() + " strLen="+data.length()); - if (Config.LOG_TOFILE)ICLogger.logToFile("APILog", " recv " + cmd +" "+ data); - switch (type){ - case LK: //登录包 - ICLogger.i("服务器收到登录包LK"); - mConnection.DeliverCMDMessageToSystem("login",cmd);//通知下面线程状态变化 - break; - case KA: - ICLogger.i("服务器收到心跳包KA"); - mConnection.DeliverCMDMessageToSystem("heartbeat",cmd);//通知下面线程状态变化 - break; - - case PING: - handlePing(mRuntime,data); - ICLogger.i("服务器返回Ping绑定信息"); - break; - case CR: - //立即定位指令(长链接有效) - handleCR(mConnection); - mConnection.DeliverCMDMessageToSystem("StartLocate",cmd);//通知下面线程状态变化 - break; - -// case BP07: -// //收到发送的语音包 -// handleBP07(cmd,mConnection); -// break; -// case BP10: -// //报警包 -// mConnection.DeliverCMDMessageToSystem("AP10",cmd);//通知下面线程状态变化 -// break; -// -// case BPTM: -// //校时命令 -// handleBPTM(cmd); -// ICLogger.i("服务器收到校时命令APTM"); -// mConnection.DeliverCMDMessageToSystem("APTM",cmd);//通知下面线程状态变化 -// break; -// case BP85://设置闹钟 -// handleBP85(cmd,mConnection,mRuntime); -// ICLogger.i("收到服务器设置闹钟命令BP85"); -// mConnection.DeliverCMDMessageToSystem("AP85",cmd);//通知下面线程状态变化 -// break; - case UPLOAD: - //设置工作模式 - handleUPLOAD(mConnection,mRuntime,cmd,data); - mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化 -// -// break; -// case BP34: -// //设置工作模式 -// handleBP34(mConnection,mRuntime,cmd); -// mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化 -// break; -// -//// case BP05: //L02服务器不适用 -//// //查询服务器语音 返回信息 -//// API.handleBP05(cmd); -//// break; -// - case SOS: - //收到设置SOS号码 - handleSOS(mConnection,mRuntime,cmd,data); - ICLogger.i("收到服务器设置SOS号码命令BP12"); - break; - case PHL: - //收到设置白名单号码 - ICLogger.i("收到服务器设置白名单号码命令BP14"); - handlePHL(mConnection,mRuntime,cmd,data); - break; -// case BP15: -// handleBP15(cmd,mConnection,mRuntime); -// ICLogger.i("收到服务器设置定位命令BP15"); -// break; -// case BP17: -// //收到恢复出厂设置 -// handleBP17(mConnection,cmd); -// ICLogger.i("收到服务器恢复出厂设置命令BP17"); -// mConnection.DeliverCMDMessageToSystem("FactoryReset",cmd);//通知下面线程状态变化 -// break; -// -// case BP18: -// //收到重启 -// handleBP18(mConnection,cmd); -// ICLogger.i("收到服务器重启命令BP18"); -// mConnection.DeliverCMDMessageToSystem("Reboot",cmd);//通知下面线程状态变化 -// break; -// - case POWEROFF: - //收到关机 - handlePOWEROFF(mConnection); - ICLogger.i("收到服务器关机命令BP31"); - mConnection.DeliverCMDMessageToSystem("poweroff",cmd);//通知下面线程状态变化 - break; -// case BP40: -// //服务器推送文本 -// handleBP40(mConnection,mRuntime,cmd); -// ICLogger.i("收到服务器推送文本消息"); -// mConnection.DeliverCMDMessageToSystem("showTxt",cmd);//通知下面线程状态变化 -// break; -// - case hrtstart: - handleHrtstart(mConnection); - ICLogger.i("收到服务器心率检测命令"); - if(mRuntime.check_stat_do_ppg_test()) HeartRateManager.triggerPPGtest(); - break; - case bldstart: - handleBldstart(mConnection); - ICLogger.i("收到服务器血压检测命令"); - if(mRuntime.check_stat_do_ppg_test()) HeartRateManager.triggerPPGtest(); - break; - case wdstart: - handleWdstart(mConnection,mRuntime,data); - ICLogger.i("收到服务器体温测试及设置命令"); - break; - case blood: - ICLogger.i("服务器收到上传的血压"); - mConnection.DeliverCMDMessageToSystem("blood",cmd);//通知下面线程状态变化 - break; - case oxygen: - ICLogger.i("服务器收到上传的血氧"); - mConnection.DeliverCMDMessageToSystem("oxygen",cmd);//通知下面线程状态变化 - break; - case temp: - ICLogger.i("服务器收到上传的体温"); - mConnection.DeliverCMDMessageToSystem("temp",cmd);//通知下面线程状态变化 - break; - case heart: - ICLogger.i("服务器收到上传的心率heart"); - mConnection.DeliverCMDMessageToSystem("heart",cmd);//通知下面线程状态变化 - break; - case LGZONE: - ICLogger.i("收到服务器时间 LGZONE "+data); - handleLGZONE(mRuntime,data); - break; -// case BP84: -// handleBP84(cmd,mConnection); -// ICLogger.i("收到服务器白名单命令"); -// break; -// -// case BP86: -// //绑定解绑消息 -// handleBP86(cmd,mConnection,mRuntime); -// mConnection.DeliverCMDMessageToSystem("AP86",cmd);//通知下面线程状态变化 -// -// break; -// - case FIND: - //收到查找设备消息 - handleFIND(mConnection); - mConnection.DeliverCMDMessageToSystem("findDev",cmd);//通知下面线程状态变化 - break; -// case BP89: -// //心率/血压阀值 -// handleBP89(cmd,mConnection); -// mConnection.DeliverCMDMessageToSystem("AP89",cmd);//通知下面线程状态变化 -// break; -// -// case BPTE: //设置测试体温 -// handleBPTE(cmd,mConnection,mRuntime); -// mConnection.DeliverCMDMessageToSystem("APTE",cmd);//通知下面线程状态变化 -// break; -// -// case BPTP: -// handleBPTP(); -// mConnection.DeliverCMDMessageToSystem("APTP",cmd);//通知下面线程状态变化 -// break; -// case BPHP: -// handleBPHP(); -// mConnection.DeliverCMDMessageToSystem("IWAPHP",cmd);//通知下面线程状态变化 -// break; -// case BPX1://设置 心率血压血氧修正值 -// handleBPX1(cmd,mConnection,mRuntime); -// ICLogger.i("收到服务器设置 心率血压血氧修正值BPX1"); -// mConnection.DeliverCMDMessageToSystem("APX1",cmd);//通知下面线程状态变化 -// break; -// -// case BPS4: //提醒设置(时间段) 主要为久坐设置提醒时长。 -// handleBPS4(cmd,mConnection,mRuntime); -// ICLogger.i("收到 提醒设置(时间段)"); -// mConnection.DeliverCMDMessageToSystem("APS4",cmd);//通知下面线程状态变化 -// break; -// case BPDE: -// handleBPDE(mConnection,cmd,mRuntime); -// ICLogger.i(" 收到 进出围栏通知!"); -// mConnection.DeliverCMDMessageToSystem("APDE",cmd);//通知下面线程状态变化 -// break; -// -// case BPTU: -// handleBPTU(cmd, mConnection); -// ICLogger.i("收到服务器 图片语音 消息 BPTU"); -// // mConnection.DeliverCMDMessageToSystem("APTU", "");//通知下面线程状态变化 -// break; -// case BPDF: -// handleBPDF(mConnection,cmd,mRuntime); -// ICLogger.i(" 收到 体温阈值设置!"); -// mConnection.DeliverCMDMessageToSystem("APDF",cmd);//通知下面线程状态变化 -// break; - - } - - return ret; - - } - - - public boolean handleCmd(CMD_TYPE type, String cmd, byte[] bytes) { - - //只有需要传递二级制数据的才需要这个函数,目前只有BP28需要 - - boolean ret=true; - ICLogger.i("handleCmd "+type.name() + " "+cmd+" bytelen="+bytes.length ); - if (Config.LOG_TOFILE) ICLogger.logToFile("APILog", " recv " +new String(bytes)); - switch (type) { - case LK: - // handleBP28(mConnection,cmd, mRuntime,bytes); - ICLogger.i("收到服务器语音BP28"); - mConnection.DeliverCMDMessageToSystem("BP28", "");//通知下面线程状态变化 - break; - } - return ret; - } - -} +package com.ic.protocols; + +import android.content.ComponentName; +//import android.content.IClipboard; +import android.content.Intent; +import android.net.Uri; +import android.os.Environment; + +//import com.android.internal.telephony.uicc.RuimFileHandler; +import com.enqualcomm.support.Config; +import com.enqualcomm.support.CoreService; +import com.enqualcomm.support.bean.Alarm; +import com.enqualcomm.support.bean.Contact; +import com.enqualcomm.support.bean.Content; +import com.enqualcomm.support.bean.HealthInfo; +import com.enqualcomm.support.bean.ICLocation; +import com.enqualcomm.support.bean.Runtime; +import com.enqualcomm.support.bean.StringMessage; +import com.enqualcomm.support.bean.VoiceContent; +import com.enqualcomm.support.bean.voicePacket; +import com.enqualcomm.support.service.HeartRateManager; +import com.enqualcomm.support.utils.Connection; +import com.enqualcomm.support.utils.ICLogger; +import com.enqualcomm.support.utils.MD5; +import com.enqualcomm.support.utils.TemperatureUtil; +import com.enqualcomm.support.utils.TimeUtil; +import com.enqualcomm.support.utils.Util; +import com.enqualcomm.support.utils.regexUtil; + +import java.io.File; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; + +import chestnut.utils.PhoneUtils; + +import static com.enqualcomm.support.Constants.ACTION_HEATR_RATE_START; +import static com.enqualcomm.support.LocationClient.LOCATION_MODE; +import static com.enqualcomm.support.bean.Contact.GROUP_ALL; +import static java.lang.Math.abs; + +public class protocol_fzd { + private static final String TAG = "ICSrv." + protocol_fzd.class.getSimpleName(); + private static final String PrivKEY = "XMQcHi0lGIdru6xzW7lygBwBT8N0c09P"; + private static final String CMDHEADER = "["; + private static final String CMDCOMPANY="IC"; + private static final String CMDEND = "]"; + private static final String CMDHEADERSPLIT = "*"; + private static final String CMDSPLIT = ","; + + public static final String defaultServerIP="api.xcloudtech.com"; + public static final int defaultServerPort=9000; + + public enum CMD_TYPE { + /*终端发起*/ + //链路保持数据 + LK,//登录 + PING,//绑定查询 + KA,//心跳包 + UD,//位置上传 + UD2,//盲点位置上传 + AL,//报警数据上传 + LGZONE,//获取服务器时区时间 + WT,//获取天气 + img,//上传图片 + VOICE,//上传语音 + WG,//请求位置信息 + DLT,//解绑 + temp,//体温上传 + /* 服务器发起*/ + UPLOAD,//数据上传间隔设置 + CENTER,//中心号码设置 + CALL, //拨打电话 + MONITOR,//监听 + SOS,//SOS 号码设置 + FACTORY,//恢复出厂设置 + SOSSMS,//SOS 短信报警开关 + LOWBAT,//低电短信报警开关 + VERNO,//版本查询 + CR,//定位指令 + POWEROFF,//关机指令 + REMOVE,//取下手环报警开关 + REMOVESMS,//取下手表短信报警开关 + PEDO,//计步功能开关 + SILENCETIME,//免打扰时间段设置 + SILENCETIME2, //免打扰时间段设置 + SLEEPTIME,//翻转检测时间段设置 + FIND,//找手表指令 + REMIND,//闹钟设置指令 + TK,//对讲功能(微聊发送语音) + PHL,//设置电话本+白名单(最多 50 条) + wdstart,//远程测温 + bldstart,//远程测血压 + hrtstart,//远程测量心率 + BOOTOFF,//定时关机 + oxygen,//血氧上传 + blood,//血压上传 + heart,//心率上传 + PRACTICE,//自由锻炼数据上传 + UNKNOWN_CMD, + } + + private static HashMap 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.LGZONE, "LGZONE"); + cmdMap.put(CMD_TYPE.WT, "WT"); + cmdMap.put(CMD_TYPE.img, "img"); + cmdMap.put(CMD_TYPE.VOICE, "VOICE"); + cmdMap.put(CMD_TYPE.WG, "WG"); + cmdMap.put(CMD_TYPE.DLT, "DLT"); + cmdMap.put(CMD_TYPE.temp, "temp"); + cmdMap.put(CMD_TYPE.UPLOAD, "UPLOAD"); + cmdMap.put(CMD_TYPE.CENTER, "CENTER"); + cmdMap.put(CMD_TYPE.CALL, "CALL"); + cmdMap.put(CMD_TYPE.MONITOR, "MONITOR"); + cmdMap.put(CMD_TYPE.SOS, "SOS"); + cmdMap.put(CMD_TYPE.FACTORY, "FACTORY"); + cmdMap.put(CMD_TYPE.SOSSMS, "SOSSMS"); + cmdMap.put(CMD_TYPE.LOWBAT, "LOWBAT"); + cmdMap.put(CMD_TYPE.VERNO, "VERNO"); + cmdMap.put(CMD_TYPE.CR, "CR"); + cmdMap.put(CMD_TYPE.POWEROFF, "POWEROFF"); + cmdMap.put(CMD_TYPE.REMOVE, "REMOVE"); + cmdMap.put(CMD_TYPE.REMOVESMS, "REMOVESMS"); + cmdMap.put(CMD_TYPE.PEDO, "PEDO"); + cmdMap.put(CMD_TYPE.SILENCETIME, "SILENCETIME"); + cmdMap.put(CMD_TYPE.SILENCETIME2, "SILENCETIME2"); + cmdMap.put(CMD_TYPE.SLEEPTIME, "SLEEPTIME"); + cmdMap.put(CMD_TYPE.FIND, "FIND"); + cmdMap.put(CMD_TYPE.REMIND, "REMIND"); + cmdMap.put(CMD_TYPE.TK, "TK"); + cmdMap.put(CMD_TYPE.PHL, "PHL"); + cmdMap.put(CMD_TYPE.wdstart, "wdstart"); + cmdMap.put(CMD_TYPE.bldstart, "bldstart"); + cmdMap.put(CMD_TYPE.hrtstart, "hrtstart"); + cmdMap.put(CMD_TYPE.BOOTOFF, "BOOTOFF"); + cmdMap.put(CMD_TYPE.oxygen, "oxygen"); + cmdMap.put(CMD_TYPE.blood, "blood"); + cmdMap.put(CMD_TYPE.heart, "heart"); + cmdMap.put(CMD_TYPE.PRACTICE, "PRACTICE"); + } + + private Connection mConnection=null; + private Runtime mRuntime=null; + + public protocol_fzd(Connection connect, Runtime runtime) { + mConnection=connect; + mRuntime=runtime; + + } + + private StringBuffer cmdbuf = new StringBuffer(); + +// /* +// 输入的字符串,如果有完整命令,返回 true +// 否则返回 false +// */ +// public boolean isCmdStr(String msg) { +// /*** +// * IC*334588000000156*LEN*FALLDOWN +// */ +// String cmd; +// int index=msg.indexOf(CMDSPLIT); +// if (index > 0){ +// cmd = msg.substring(0,index); +// }else{ +// cmd = msg; +// } +// if (regexUtil.isFZDCMD(cmd) ) { +// return true; +// } +// return false; +// } + + private void log(String msg) { + ICLogger.log(TAG, msg); + } + + private void log(String function, String msg) { + ICLogger.log(TAG, function, msg); + } + + + /**/ + public static StringMessage genStringMessage(String cmdName, String msg){ + StringMessage sm=new StringMessage(new String[]{cmdName,msg}); + sm.refresh(msg); + sm.setDate(TimeUtil.getSystemDateYYMMDD(),TimeUtil.getSystemTimeHHmmss()); + return sm; + } + + /* + 输入的字符串,如果有完整命令,返回 命令名 + 否则返回 空字符串 + */ + public static String isCmdStr(String msg) { + String cmd_msgbuf=msg; + int cmdindex =cmd_msgbuf.indexOf(CMDCOMPANY+CMDHEADERSPLIT); + if (cmdindex>0) { //如果开头不是CMDHEADER但是包含CMDHEADER则删除前面的数据 + String cmd=cmd_msgbuf.substring(cmdindex); + cmd_msgbuf=cmd; + } + cmdindex=cmd_msgbuf.indexOf(CMDEND); + if(cmdindex>0){ + String cmd=cmd_msgbuf.substring(0,cmdindex); + cmd_msgbuf=cmd; + } + cmdindex=cmd_msgbuf.indexOf(CMDSPLIT); + if(cmdindex>0){ + String cmd=cmd_msgbuf.substring(0,cmdindex); + cmd_msgbuf=cmd; + } + + if (regexUtil.isFZDCMD(cmd_msgbuf)) { + for (CMD_TYPE key : cmdMap.keySet()) { + if (regexUtil.isFZDCMD(cmdMap.get(key), cmd_msgbuf)) { //如果是FZD命令,则进行处理,否则保留数据动 + ICLogger.i("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key)); + return cmdMap.get(key); + } + } + return ""; + }else + return ""; + } + /* + 返回true 表示 cmd 全部解析成功 + 返回false表示 cmd至少有一条解析失败,失败的数据归入buffer,下一次识别接着使用 + 字符串通过#号进行识别。 + 每个字符串如果发现 #,却又没有Header,“IW”则会被丢弃 + */ + public boolean parserCmd(byte[] bytes) { + String cmd_msgbuf=new String(bytes); + log("bytes.size "+bytes.length); + cmdbuf.append(cmd_msgbuf); + log("cmdbuf.size "+cmdbuf.length() +" "+cmdbuf.toString()); + int cmdindex =cmd_msgbuf.indexOf(CMDCOMPANY+CMDHEADERSPLIT); + if (cmdindex>0) { //如果开头不是CMDHEADER但是包含CMDHEADER则删除前面的数据 + String cmd=cmd_msgbuf.substring(cmdindex); + cmd_msgbuf=cmd; + } + cmdindex=cmd_msgbuf.indexOf(CMDEND); + if(cmdindex>0){ + String cmd=cmd_msgbuf.substring(0,cmdindex); + cmd_msgbuf=cmd; + } + cmdindex=cmd_msgbuf.indexOf(CMDSPLIT); + if(cmdindex>0){ + String cmd=cmd_msgbuf.substring(0,cmdindex); + cmd_msgbuf=cmd; + } + if (cmdbuf.toString().split(CMDCOMPANY+CMDHEADERSPLIT).length>1) + { + ICLogger.i("More than 1 cmd in buffer ! just log it"); + } + for (CMD_TYPE key : cmdMap.keySet()) { + // ICLogger.i("key "+cmdMap.get(key)+" cmdbuf "+cmd_msgbuf); + if (regexUtil.isFZDCMD(cmdMap.get(key),cmd_msgbuf)) { //如果是FZD命令,则进行处理,否则保留数据动 + String data=cmdbuf.toString().replace(CMDHEADER,"").replace(cmd_msgbuf,"").replace(CMDEND,""); +// ICLogger.i("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key) + " , " + cmdbuf.toString() + " "+cmd_msgbuf + " data "+data ); +// if (key == CMD_TYPE.TK) { +// //如果是BP28则 后面的数据是音频,需要保留 +// byte[] amrBuf; +// int amrLen = getBP28Amrlen(cmdlist[i] ); +// if (bytes.length > amrLen) { +// handleCmd(key, cmdlist[i], bytes); +// } +// } else { + if (data.startsWith(CMDSPLIT)) data=data.substring(1); + handleCmd(key, cmd_msgbuf,data); + cmdbuf.delete(0,cmdbuf.length());//处理后清空 +// } + } + } + return true; + } + + private static String getHexLen(int len){ + StringBuilder sb=new StringBuilder(); + int v = len & 0xFFFF; + String hv = Integer.toHexString(v); + if (hv.length() ==1 ) { + sb.append(0).append(0).append(0); + }else if (hv.length()==2){ + sb.append(0).append(0); + }else if (hv.length()==3){ + sb.append(0); + } + sb.append(hv); + return sb.toString(); + } + private static String genHeader(int len,String cmd){ + + if (CoreService.getInstance()==null) + return ""; + + String imei =CoreService.getInstance().getRuntime().IMEI(); + return new StringBuilder().append(CMDCOMPANY).append(CMDHEADERSPLIT) + .append(imei).append(CMDHEADERSPLIT) + .append(getHexLen(len)).append(CMDHEADERSPLIT).append(cmd).toString(); + } + + private static String keyheader(String cmd,int len){ + String header=genHeader(len,cmd); + String key= MD5.getCMDStringMD5(header+PrivKEY); + return key; + } + + public static StringMessage genFZDCMD( String CMD){ + StringBuilder sb=new StringBuilder(); + int len=CMD.length(); + String header=genHeader(len,CMD); + String keyheader=keyheader(CMD,len); + sb.append(CMDHEADER).append(keyheader).append(header).append(CMDEND); + return genStringMessage(CMD,sb.toString()); + } + public static StringMessage genFZDCMD( String CMD,String data){ + StringBuilder sb=new StringBuilder(); + String data_buf=CMD+CMDSPLIT+data; + int data_buf_len=data_buf.length(); + String header=genHeader(data_buf_len,CMD); + String keyheader=keyheader(CMD,data_buf_len);//计算header md5值 + sb.append(CMDHEADER).append(keyheader).append(header).append(CMDSPLIT).append(data).append(CMDEND); + return genStringMessage(CMD,sb.toString()); + } + /*登录*/ + public static StringMessage LK() { + /*IC*YYYYYYYYYYYYYYY*LEN*LK*/ + return genFZDCMD(cmdMap.get(CMD_TYPE.LK)); + } + + /** + * 绑定 + * */ + public static StringMessage PING(){ +// IC*YYYYYYYYYYYYYYY*LEN*PING + return genFZDCMD(cmdMap.get(CMD_TYPE.PING)); + } + + + public static void handlePing(Runtime runtime,String data){ +// [IC*YYYYYYYYYYYYYYY*LEN*PING,是否绑定(0 表示未绑定,1 表示绑定)] +// 实例:[IC*334588000000156*0006*PING,0]或[IC*334588000000156*0006*PING,1] + try { + int bind = Integer.parseInt(data); + if (bind == 0) { + ICLogger.i("设备未绑定!"); + runtime.BindingStatus = false; + } else { + ICLogger.i("设备已绑定!"); + runtime.BindingStatus = true; + } + }catch (Exception e){ + ICLogger.e(e.getMessage(),e); + } + + } + + public static StringMessage KA(Runtime runtime){ +//[IC*YYYYYYYYYYYYYYY*LEN*KA,日期,步数,翻滚次数,电量百分数] 实例:[IC*334588000000156*0014*KA,120414,50,100,100] + StringBuilder sb=new StringBuilder(); + String cmd=cmdMap.get(CMD_TYPE.KA); + sb.append(TimeUtil.getSystemDateYYMMDD()).append(CMDSPLIT) + .append(runtime.getTotalStepCount()).append(CMDSPLIT) + .append(runtime.getRolltimes()).append(CMDSPLIT) + .append(runtime.getBattery()); + return genFZDCMD(cmd,sb.toString()); + } + + + public void handleKA(Runtime runtime,String data){ + + } + + + public static StringMessage LGZONE(Runtime runtime) { + return genFZDCMD(cmdMap.get(CMD_TYPE.LGZONE)); + } + public void handleLGZONE(Runtime runtime, String data){ + + /*** + * 平台回复:[XT*YYYYYYYYYYYYYYY*LEN*LGZONE,时区,时间,日期] + * 实例: [XT*1234567890*001D*LGZONE,+8,08:00:00,2016-01-12] + */ + String[] list=data.split(CMDSPLIT); + if (list.length==3){ + String timeZone=list[0].trim(); + String date=list[2].trim(); + String time=list[1].trim(); + Date datetime= TimeUtil.parseDatetiime(date,time); + int timezone; + try + { + timezone=Integer.parseInt(timeZone.replace("+","").trim()); + }catch (Exception e){ + ICLogger.e("timezone",e); + timezone=8; + } + + if (datetime!=null){ + ICLogger.i("==="+timezone+" "+TimeUtil.getDefaultTimeZone()); + TimeUtil.setTimeZone(timezone); + + + ICLogger.i("==="+TimeUtil.getDefaultTimeZone()); + TimeUtil.setSysDateTime(runtime.getContextProxy().context,datetime,timezone); + ICLogger.i("==="+TimeUtil.getDefaultTimeZone()); + } +// Set Datetime 20200505112734 +// Set TimeZone 8 + + }else{ + ICLogger.i("LGZONE Format Error!"); + } + + + } + + + /*LBS+GPS混合定位*/ + public static StringMessage UD(Runtime runtime) { + /*** + * [IC*334588000000156*00CD*UD,180916,025723,A,22.570733,N,113.8626083,E,0.00,249.5,0.0,6,100, 60,0,0,00000010,7,255,460,1,9529,21809,158,9529,63555,133,9529,63554,129,9529,21405,126,95 + * 29,21242,124,9529,21151,120,9529,63556,119,0] + * 说明: + * 数据内容: + * UD,命令号 + * 180916,日期(年月日)(0 时区),表示 0 时区的二零一八年九月十六号 + * + * 025723,时间(时分秒)(0 时区),表示 0 时区的两点五十七分二十三秒A,gps 定位有效 + * 22.570733,纬度 + * N,纬度表示113.8626083,经度 + * E,经度表示0.00,速度 + * 249.5,方向 + * 0.0,海拔 + * 6,卫星个数 + * + * 100,gsm 信号强度 + * 60,电量 + * 0,计步数 + * 0,翻转次数 + * 00000010,终端状态,数据为 16 进制,解析成二进制为 0000 0000 0000 0000 0000 0000 0001 0000 + * 前面 4 个字节表示状态,后面 4 个字节表示报警,数据中第 4 位为 1,对照文档最后的数据解析,表示手表静止状态。详细可参看文档最后部分。 + * 7,基站个数 + * 255,460,1,9529,21809,158,9529,63555,133,9529,63554,129,9529,21405,126,9529,21242,124,9529, + * 21151,120,9529,63556,119,基站信息 + * 0,WiFi 个数 + * + */ + + + StringBuilder sb=new StringBuilder(); + String cmd=cmdMap.get(CMD_TYPE.UD); + sb.append(TimeUtil.getSystemDateYYMMDD()).append(CMDSPLIT) + .append(TimeUtil.getSystemTimeHHmmss()).append(CMDSPLIT) + .append(runtime.getFZDGPSData()).append(CMDSPLIT) + .append(String.format("%03d",abs(runtime.getSignalStrength()))).append(CMDSPLIT) + .append(runtime.getBattery()).append(CMDSPLIT) + .append(runtime.getTotalStepCount()).append(CMDSPLIT) + .append(runtime.getRolltimes()).append(CMDSPLIT) + .append(runtime.getFZDDevStatus(runtime)).append(CMDSPLIT) + .append(runtime.getFZDLBSMultiStationData()).append(CMDSPLIT) + .append(runtime.getFZDWifiData()); + + return genFZDCMD(cmd,sb.toString()); + } + + + /*LBS+WiFi混合定位*/ + public static String UD2(Runtime ds) { + //示例数据:IWAP02, + // zh_cn, + // 0, + // 7, + // 460,0, + // 9520|3671|13,9520|3672|12,9520|3673|11,9520|3674|10,9520|3675|9,9520|3676|8,9520|3677|7, + // 4, + // 1|D8-24-BD-79-FA-1F|59&2|3C-46-D8-6D-CE-01|81&3|0C-4C-39-1A-7C-65|69&4|70-A8-E3-5D-D7-C0|65# +// IW标识符 +// AP02:命令字 +// zh_cn: 语言标志 +// 0:回复标识,为0时不回复地址,为 1 时,服务器回复地址信息 +// 7: 表示共有7组基站 +// 460: MCC 国家码 +// 0: MNC运营商代码 +// 9520|3671|10: LAC|CID|dbm表示一组基站信息,后面数量需和基站组数地应 10:dbm为信号强度多基站信号强度建议从高到低排列后上传,信号强度转正数:150 – abs(dbm) +// 4: 表示WIFI组数, +// 1|D8-24-BD-79-FA-1F|59: ssid|mac地址|信号强度,信号强度转正数:150 – abs(信号强度) + + int apsum=0; + String wifiinfo=ds.getWifiInfo(); + if (!wifiinfo.isEmpty()) { + String[] list = wifiinfo.split("&"); + apsum = list.length; + } + + ICLogger.i("Wifi ap sum "+apsum); + return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.LK)).append(CMDSPLIT) + .append(ds.getLanguage()).append(CMDSPLIT) + .append(0).append(CMDSPLIT) //为0时不回复地址 + .append(ds.getLBSMultiStationData()).append(CMDSPLIT) //基站信息数据 + .append(apsum).append(CMDSPLIT).append(ds.getWifiInfo()).append(CMDEND).toString(); //wifi信息数据 + } + + //处理 定位 BP01 + public void handleUD2(String cmd){ + log("BP02定位接收成功"); + } + + + public static StringMessage AL(Runtime runtime){ + /*** + * [IC*334588000000156*00CD*AL,180916,064153,A,22.570512,N,113.8623267,E,0.00,154.8,0.0,11,10 0,100,0,0,00100018,7,0,460,1,9529,21809,155,9529,21242,132,9529,21405,131,9529,63554,131,9 + * 529,63555,130,9529,63556,118,9529,21869,116,0,12.4] + * 平台回复: + * [IC*YYYYYYYYYYYYYYY*LEN*AL] + * 实例:[IC*334588000000156*0002*AL] + * 说明:终端产生警情后发送报警信息到平台,若终端没有收到回复,则定时上报直到收到报警确认为止. + */ + + StringBuilder sb=new StringBuilder(); + String cmd=cmdMap.get(CMD_TYPE.AL); + sb.append(TimeUtil.getSystemDateYYMMDD()).append(CMDSPLIT) + .append(TimeUtil.getSystemTimeHHmmss()).append(CMDSPLIT) + .append(runtime.getFZDGPSData()).append(CMDSPLIT) + .append(String.format("%03d",abs(runtime.getSignalStrength()))).append(CMDSPLIT) + .append(runtime.getBattery()).append(CMDSPLIT) + .append(runtime.getTotalStepCount()).append(CMDSPLIT) + .append(runtime.getRolltimes()).append(CMDSPLIT) + .append(runtime.getFZDDevStatus(runtime)).append(CMDSPLIT) + .append(runtime.getFZDLBSMultiStationData()).append(CMDSPLIT) + .append(runtime.getFZDWifiData()); + + return genFZDCMD(cmd,sb.toString()); + } + + public static StringMessage UPLOAD(){ + + return genFZDCMD(cmdMap.get(CMD_TYPE.UPLOAD)); + } + + public void handleUPLOAD(Connection connection,Runtime runtime,String cmd,String data){ + connection.send(UPLOAD()); + try { + int timesecond = Integer.parseInt(data); + int mod = runtime.getLocationInstance().getWorkingMod(); + log("LOCATION_MODE " + LOCATION_MODE + " mod " + mod); + Config.setLocationMode(runtime.getContextProxy().context, mod); + Config.setLocationCycle(runtime.getContextProxy().context, timesecond); + runtime.getLocationInstance().setLocation_cycle(timesecond); + runtime.getLocationInstance().setWorkingMod(mod); +// CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod()); + //此处设置好配置后,会在LocationClient通过消息开始执行及时定位操作。 + }catch (Exception e){ + ICLogger.e(e.getMessage(),e); + } + } + + public static StringMessage heart(int hrt){ + return genFZDCMD(cmdMap.get(CMD_TYPE.heart),String.valueOf(hrt)); + } + public static StringMessage oxygen(int ox){ + return genFZDCMD(cmdMap.get(CMD_TYPE.oxygen),String.valueOf(ox)); + } + + public static StringMessage blood(int pbl,int pbh){ + String data=pbh+CMDSPLIT+pbl; + return genFZDCMD(cmdMap.get(CMD_TYPE.blood),data); + } + + public static StringMessage temp(double temp){ + return genFZDCMD(cmdMap.get(CMD_TYPE.temp),String.format("%.1f",temp)); + } + public static StringMessage POWEROFF(){ + return genFZDCMD(cmdMap.get(CMD_TYPE.POWEROFF)); + } + public void handlePOWEROFF(Connection connection) { + + connection.send(POWEROFF()); + } + public static StringMessage CR(){ + return genFZDCMD(cmdMap.get(CMD_TYPE.CR)); + } + public void handleCR(Connection connection) { + + connection.send(CR()); + } + public static StringMessage bldstart(){ + return genFZDCMD(cmdMap.get(CMD_TYPE.bldstart)); + } + public void handleBldstart(Connection connection) { + + connection.send(bldstart()); + } + public static StringMessage wdstart(){ + return genFZDCMD(cmdMap.get(CMD_TYPE.wdstart)); + } + public void handleWdstart(Connection connection,Runtime runtime ,String data) { + + connection.send(wdstart()); + try { + int freq = Integer.parseInt(data); + + + Config.setTemperatureTestCycle(runtime, freq); + CoreService.getInstance().setTempAlarm(); + + if(runtime.check_stat_do_temp_test()) TemperatureUtil.doTempTestInThread(); + }catch (Exception e){ + ICLogger.e(e.getMessage(),e); + } +// +// double wrist_temp,body_temp; +// wrist_temp= TemperatureUtil.get_temp_value_adjusted(); +// body_temp=TemperatureUtil.getBodyTemp(wrist_temp,26.0f); +// String temperatureMsg=temp(body_temp); +// connection.send(genStringMessage("temp",temperatureMsg)); + } + public static StringMessage hrtstart(){ + return genFZDCMD(cmdMap.get(CMD_TYPE.hrtstart)); + } + public void handleHrtstart(Connection connection) { + + connection.send(hrtstart()); + } + public static StringMessage FIND(){ + return genFZDCMD(cmdMap.get(CMD_TYPE.FIND)); + } + public void handleFIND(Connection connection) { + + connection.send(FIND()); + } + public static StringMessage SOS(){ + return genFZDCMD(cmdMap.get(CMD_TYPE.SOS)); + } + + + public void handleSOS(Connection connection,Runtime runtime,String cmd,String data) { + + connection.send(SOS()); + if (data!=null && data.length()>0) { + String list[] = data.split(CMDSPLIT); + if (list.length==1){ + ArrayList 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 StringMessage PHL(){ + return genFZDCMD(cmdMap.get(CMD_TYPE.PHL)); + } + + public void handlePHL(Connection connection,Runtime runtime,String cmd,String data){ + /*** + * [IC*334588000000156*len*PHL,号码,名字,号码,名字,号码,名字,号码,名字,号码,名字] len:发送长度 16 进制表示 占用 2 个字节 + * 号码:ascii 字符 名字:Unicode 编码 + * 该接口融合了白名单和电话本的功能,最多对应 50 组号码与名字,号码不超过 20 个 ascii 字符, 姓名不超过 10 个 Unicode 字符。 + * 示 例 : [IC*334588000000156*0010*PHL,110,5F204E09] + * 5F204E09--->张三,是使用 unicode 编码 + * 终端回复:[IC*334588000000156*0003*PHL] + */ + + String list[]=data.split(CMDSPLIT); + int listlen=list.length; + boolean ispared= (( listlen >0) && (listlen%2 == 0)); + if (ispared){ + ArrayList contactArray=new ArrayList(); + for(int i=0; i0) + return genFZDCMD(cmdMap.get(CMD_TYPE.PRACTICE),String.valueOf(healthInfo.getBufferDataStr())); + else + return null; + } + + public boolean handleCmd(CMD_TYPE type, String cmd , String data) { + + //普通非二进制命令用此函数处理 + boolean ret=true; + ICLogger.i("handleCmd "+type.name() + " strLen="+data.length()); + if (Config.LOG_TOFILE)ICLogger.logToFile("APILog", " recv " + cmd +" "+ data); + switch (type){ + case LK: //登录包 + ICLogger.i("服务器收到登录包LK"); + mConnection.DeliverCMDMessageToSystem("login",cmd);//通知下面线程状态变化 + break; + case KA: + ICLogger.i("服务器收到心跳包KA"); + mConnection.DeliverCMDMessageToSystem("heartbeat",cmd);//通知下面线程状态变化 + break; + case AL: + mConnection.DeliverCMDMessageToSystem("AL",cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了 + break; + case PRACTICE: + mConnection.DeliverCMDMessageToSystem("PRACTICE",cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了 + break; + case PING: + handlePing(mRuntime,data); + ICLogger.i("服务器返回Ping绑定信息"); + break; + case CR: + //立即定位指令(长链接有效) + handleCR(mConnection); + mConnection.DeliverCMDMessageToSystem("StartLocate",cmd);//通知下面线程状态变化 + break; + +// case BP07: +// //收到发送的语音包 +// handleBP07(cmd,mConnection); +// break; +// case BP10: +// //报警包 +// mConnection.DeliverCMDMessageToSystem("AP10",cmd);//通知下面线程状态变化 +// break; +// +// case BPTM: +// //校时命令 +// handleBPTM(cmd); +// ICLogger.i("服务器收到校时命令APTM"); +// mConnection.DeliverCMDMessageToSystem("APTM",cmd);//通知下面线程状态变化 +// break; +// case BP85://设置闹钟 +// handleBP85(cmd,mConnection,mRuntime); +// ICLogger.i("收到服务器设置闹钟命令BP85"); +// mConnection.DeliverCMDMessageToSystem("AP85",cmd);//通知下面线程状态变化 +// break; + case UPLOAD: + //设置工作模式 + handleUPLOAD(mConnection,mRuntime,cmd,data); + mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化 +// +// break; +// case BP34: +// //设置工作模式 +// handleBP34(mConnection,mRuntime,cmd); +// mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化 +// break; +// +//// case BP05: //L02服务器不适用 +//// //查询服务器语音 返回信息 +//// API.handleBP05(cmd); +//// break; +// + case SOS: + //收到设置SOS号码 + handleSOS(mConnection,mRuntime,cmd,data); + ICLogger.i("收到服务器设置SOS号码命令BP12"); + break; + case PHL: + //收到设置白名单号码 + ICLogger.i("收到服务器设置白名单号码命令BP14"); + handlePHL(mConnection,mRuntime,cmd,data); + break; +// case BP15: +// handleBP15(cmd,mConnection,mRuntime); +// ICLogger.i("收到服务器设置定位命令BP15"); +// break; +// case BP17: +// //收到恢复出厂设置 +// handleBP17(mConnection,cmd); +// ICLogger.i("收到服务器恢复出厂设置命令BP17"); +// mConnection.DeliverCMDMessageToSystem("FactoryReset",cmd);//通知下面线程状态变化 +// break; +// +// case BP18: +// //收到重启 +// handleBP18(mConnection,cmd); +// ICLogger.i("收到服务器重启命令BP18"); +// mConnection.DeliverCMDMessageToSystem("Reboot",cmd);//通知下面线程状态变化 +// break; +// + case POWEROFF: + //收到关机 + handlePOWEROFF(mConnection); + ICLogger.i("收到服务器关机命令BP31"); + mConnection.DeliverCMDMessageToSystem("poweroff",cmd);//通知下面线程状态变化 + break; +// case BP40: +// //服务器推送文本 +// handleBP40(mConnection,mRuntime,cmd); +// ICLogger.i("收到服务器推送文本消息"); +// mConnection.DeliverCMDMessageToSystem("showTxt",cmd);//通知下面线程状态变化 +// break; +// + case hrtstart: + handleHrtstart(mConnection); + ICLogger.i("收到服务器心率检测命令"); + if(mRuntime.check_stat_do_ppg_test()) HeartRateManager.triggerPPGtest(); + break; + case bldstart: + handleBldstart(mConnection); + ICLogger.i("收到服务器血压检测命令"); + if(mRuntime.check_stat_do_ppg_test()) HeartRateManager.triggerPPGtest(); + break; + case wdstart: + handleWdstart(mConnection,mRuntime,data); + ICLogger.i("收到服务器体温测试及设置命令"); + break; + case blood: + ICLogger.i("服务器收到上传的血压"); + mConnection.DeliverCMDMessageToSystem("blood",cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了 + break; + case oxygen: + ICLogger.i("服务器收到上传的血氧"); + mConnection.DeliverCMDMessageToSystem("oxygen",cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了 + break; + case temp: + ICLogger.i("服务器收到上传的体温"); + mConnection.DeliverCMDMessageToSystem("temp",cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了 + break; + case heart: + ICLogger.i("服务器收到上传的心率heart"); + mConnection.DeliverCMDMessageToSystem("heart",cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了 + break; + case LGZONE: + ICLogger.i("收到服务器时间 LGZONE "+data); + handleLGZONE(mRuntime,data); + break; +// case BP84: +// handleBP84(cmd,mConnection); +// ICLogger.i("收到服务器白名单命令"); +// break; +// +// case BP86: +// //绑定解绑消息 +// handleBP86(cmd,mConnection,mRuntime); +// mConnection.DeliverCMDMessageToSystem("AP86",cmd);//通知下面线程状态变化 +// +// break; +// + case FIND: + //收到查找设备消息 + handleFIND(mConnection); + mConnection.DeliverCMDMessageToSystem("findDev",cmd);//通知下面线程状态变化 + break; +// case BP89: +// //心率/血压阀值 +// handleBP89(cmd,mConnection); +// mConnection.DeliverCMDMessageToSystem("AP89",cmd);//通知下面线程状态变化 +// break; +// +// case BPTE: //设置测试体温 +// handleBPTE(cmd,mConnection,mRuntime); +// mConnection.DeliverCMDMessageToSystem("APTE",cmd);//通知下面线程状态变化 +// break; +// +// case BPTP: +// handleBPTP(); +// mConnection.DeliverCMDMessageToSystem("APTP",cmd);//通知下面线程状态变化 +// break; +// case BPHP: +// handleBPHP(); +// mConnection.DeliverCMDMessageToSystem("IWAPHP",cmd);//通知下面线程状态变化 +// break; +// case BPX1://设置 心率血压血氧修正值 +// handleBPX1(cmd,mConnection,mRuntime); +// ICLogger.i("收到服务器设置 心率血压血氧修正值BPX1"); +// mConnection.DeliverCMDMessageToSystem("APX1",cmd);//通知下面线程状态变化 +// break; +// +// case BPS4: //提醒设置(时间段) 主要为久坐设置提醒时长。 +// handleBPS4(cmd,mConnection,mRuntime); +// ICLogger.i("收到 提醒设置(时间段)"); +// mConnection.DeliverCMDMessageToSystem("APS4",cmd);//通知下面线程状态变化 +// break; +// case BPDE: +// handleBPDE(mConnection,cmd,mRuntime); +// ICLogger.i(" 收到 进出围栏通知!"); +// mConnection.DeliverCMDMessageToSystem("APDE",cmd);//通知下面线程状态变化 +// break; +// +// case BPTU: +// handleBPTU(cmd, mConnection); +// ICLogger.i("收到服务器 图片语音 消息 BPTU"); +// // mConnection.DeliverCMDMessageToSystem("APTU", "");//通知下面线程状态变化 +// break; +// case BPDF: +// handleBPDF(mConnection,cmd,mRuntime); +// ICLogger.i(" 收到 体温阈值设置!"); +// mConnection.DeliverCMDMessageToSystem("APDF",cmd);//通知下面线程状态变化 +// break; + + } + + return ret; + + } + + + public boolean handleCmd(CMD_TYPE type, String cmd, byte[] bytes) { + + //只有需要传递二级制数据的才需要这个函数,目前只有BP28需要 + + boolean ret=true; + ICLogger.i("handleCmd "+type.name() + " "+cmd+" bytelen="+bytes.length ); + if (Config.LOG_TOFILE) ICLogger.logToFile("APILog", " recv " +new String(bytes)); + switch (type) { + case LK: + // handleBP28(mConnection,cmd, mRuntime,bytes); + ICLogger.i("收到服务器语音BP28"); + mConnection.DeliverCMDMessageToSystem("BP28", "");//通知下面线程状态变化 + break; + } + return ret; + } + +} diff --git a/app/src/main/java/com/ic/protocols/protocol_ic.java b/app/src/main/java/com/ic/protocols/protocol_ic.java index 762c82b3..4efc3b4e 100644 --- a/app/src/main/java/com/ic/protocols/protocol_ic.java +++ b/app/src/main/java/com/ic/protocols/protocol_ic.java @@ -3000,7 +3000,9 @@ public class protocol_ic { //报警包 mConnection.DeliverCMDMessageToSystem("AP10",cmd);//通知下面线程状态变化 break; - + case BPBR: + mConnection.DeliverCMDMessageToSystem("APBR",cmd);//通知下面线程状态变化 + break; case BPTM: //校时命令 handleBPTM(cmd); @@ -3199,6 +3201,7 @@ public class protocol_ic { handleBP47(mConnection,mRuntime,cmd); break; + } return ret; diff --git a/app/src/main/java/com/ic/protocols/protocol_mqtt.java b/app/src/main/java/com/ic/protocols/protocol_mqtt.java index 35f2047d..beee7efa 100644 --- a/app/src/main/java/com/ic/protocols/protocol_mqtt.java +++ b/app/src/main/java/com/ic/protocols/protocol_mqtt.java @@ -1,1115 +1,1115 @@ -package com.ic.protocols; - -import android.content.ComponentName; -import android.content.Intent; -import android.text.TextUtils; - -import com.enqualcomm.support.Config; -import com.enqualcomm.support.CoreService; -import com.enqualcomm.support.adapter.BTHelper; -import com.enqualcomm.support.bean.Contact; -import com.enqualcomm.support.bean.Runtime; -import com.enqualcomm.support.bean.StringMessage; -import com.enqualcomm.support.service.HeartRateManager; -import com.enqualcomm.support.utils.Connection; -import com.enqualcomm.support.utils.ICLogger; -import com.enqualcomm.support.utils.MD5; -import com.enqualcomm.support.utils.TemperatureUtil; -import com.enqualcomm.support.utils.TimeUtil; -import com.enqualcomm.support.utils.Util; -import com.enqualcomm.support.utils.regexUtil; - -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; - -import static com.enqualcomm.support.Constants.ACTION_HEATR_RATE_START; -import static com.enqualcomm.support.LocationClient.LOCATION_MODE; -import static java.lang.Math.abs; - -//import android.content.IClipboard; -//import com.android.internal.telephony.uicc.RuimFileHandler; - -public class protocol_mqtt { - private static final String TAG = "ICSrv." + protocol_mqtt.class.getSimpleName(); - private static final String CMDHEADER = "["; - private static final String CMDEND = "]"; - private static final String CMDSPLIT = ","; - - public static final String defaultTestServerIP = "47.106.237.76"; - public static final String defaultServerIP = "mq0.waveon.cn"; - public static final int defaultServerPort = 1883; - - public static final String projName = "WBG100"; - public static final String protocolVersion = "v1"; - public static final String mqttKey = "QWER15WTF156OQRT1230"; - public static final String username="yq_watch"; - public static final String passwd="yq_watch@yg2020"; - public static String MQTT_CLIENT_TOPIC_HEADER = ""; - - public enum CMD_TYPE { - // cmd_type 含义 - // 终端主动上传 - BREQ, // 手表请求绑定(新增) - KA, // 心跳连接 - LGZONE, // 获取服务器端时间 - UD, // 位置数据上报 - AL, // 报警位置数据上报 - ALARM, // 报警数据上报 - temp, // 上传体温数据 - heart, // 终端心率上传 - blood, // 上传血压数据 - oxygen, // 上传血氧数据 - // 平台主动下发 - UPLOAD, // 数据上传间隔设置 - hrtstart, // 设置心率、血氧、血压上传频率 - wdstart, // 设置体温上传频率 - CENTER, // 中心号码设置 - MONITOR, // 监听 - SOS, // 设置SOS 号码 - FACTORY, // 恢复出厂设置 - REMOVE, // 取下手环报警开关 - PEDO, // 计步功能开关 - MSGDOWN, // 消息下发到指定手表(新增) - UNKNOWN_CMD, - } - - private static HashMap cmdMap = null; - - static { - cmdMap = new HashMap(); - cmdMap.put(CMD_TYPE.BREQ, "BREQ"); - cmdMap.put(CMD_TYPE.KA, "KA"); - cmdMap.put(CMD_TYPE.LGZONE, "LGZONE"); - cmdMap.put(CMD_TYPE.UD, "UD"); - cmdMap.put(CMD_TYPE.AL, "AL"); - cmdMap.put(CMD_TYPE.ALARM, "ALARM"); - cmdMap.put(CMD_TYPE.temp, "temp"); - cmdMap.put(CMD_TYPE.heart, "heart"); - cmdMap.put(CMD_TYPE.blood, "blood"); - cmdMap.put(CMD_TYPE.oxygen, "oxygen"); - //下发 - cmdMap.put(CMD_TYPE.UPLOAD, "UPLOAD"); - cmdMap.put(CMD_TYPE.hrtstart, "hrtstart"); - cmdMap.put(CMD_TYPE.wdstart, "wdstart"); - cmdMap.put(CMD_TYPE.CENTER, "CENTER"); - cmdMap.put(CMD_TYPE.MONITOR, "MONITOR"); - cmdMap.put(CMD_TYPE.SOS, "SOS"); - cmdMap.put(CMD_TYPE.FACTORY, "FACTORY"); - cmdMap.put(CMD_TYPE.REMOVE, "REMOVE"); - cmdMap.put(CMD_TYPE.PEDO, "PEDO"); - cmdMap.put(CMD_TYPE.MSGDOWN, "MSGDOWN"); - - } - - private Connection mConnection = null; - private Runtime mRuntime = null; - - public protocol_mqtt(Connection connect, Runtime runtime) { - mConnection = connect; - mRuntime = runtime; - - } - - private StringBuffer cmdbuf = new StringBuffer(); - - - private void log(String msg) { - ICLogger.log(TAG, msg); - } - - private void log(String function, String msg) { - ICLogger.log(TAG, function, msg); - } - - - /**/ - public static StringMessage genStringMessage(String cmdName, String msg) { - StringMessage sm = new StringMessage(new String[]{cmdName, msg}); - sm.refresh(msg); - sm.setDate(TimeUtil.getSystemDateYYMMDD(),TimeUtil.getSystemTimeHHmmss()); - return sm; - } - - - public static String isCmdStr(StringMessage msg) { - - String imei = ""; - if (CoreService.getInstance() != null) - imei = CoreService.getInstance().getRuntime().IMEI(); - String cmdtype = msg.cmd().replace(projName + "/" + protocolVersion + "/", "").replace("/" + imei, ""); -// ICLogger.i("mqtt isCmdStr topic " + msg.cmd() + " ,cmd " + cmdtype); - for (CMD_TYPE key : cmdMap.keySet()) { -// ICLogger.i("mqtt isCmdStr cmd " + msg.cmd()+" " +cmdtype +" key " + cmdMap.get(key)); - if (cmdMap.get(key).equals(cmdtype)) { -// ICLogger.i("Find cmd "+cmdtype); - return cmdtype; - } - } - return ""; - } - - /* - 返回true 表示 cmd 全部解析成功 - 返回false表示 cmd至少有一条解析失败,失败的数据归入buffer,下一次识别接着使用 - 字符串通过#号进行识别。 - 每个字符串如果发现 #,却又没有Header,“IW”则会被丢弃 - */ - public boolean parserCmd(String cmdtype, byte[] bytes) { - String cmd_msgbuf = new String(bytes); - log(cmdtype+" bytes.size " + bytes.length+" "+cmd_msgbuf); -// cmdbuf.append(cmd_msgbuf); -// log("cmdbuf.size " + cmdbuf.length() + " " + cmdbuf.toString()); - -// String[] cmdlist=cmdbuf.toString().split(CMDEND+CMDHEADER); - -// for ( String cmditem : cmdlist ) { - cmd_msgbuf = cmd_msgbuf.replace(CMDHEADER, "").replace(CMDEND, "").replace("'",""); - for (CMD_TYPE key : cmdMap.keySet()) { - if (cmdMap.get(key).toString().equals(cmdtype)) { - handleCmd(key, cmdtype, cmd_msgbuf); - return true; - } - } -// } - - return false; - } - - private static String getHexLen(int len) { - StringBuilder sb = new StringBuilder(); - int v = len & 0xFFFF; - String hv = Integer.toHexString(v); - if (hv.length() == 1) { - sb.append(0).append(0).append(0); - } else if (hv.length() == 2) { - sb.append(0).append(0); - } else if (hv.length() == 3) { - sb.append(0); - } - sb.append(hv); - return sb.toString(); - } - - public static StringMessage genMqttCMDMsg(String cmdtype, String data, String imei) { - StringBuilder sb = new StringBuilder(); - int len = data.length() + 1;//长度计算要包括逗号 - sb.append(CMDHEADER).append(getHexLen(len)).append(CMDSPLIT).append(data).append(CMDEND); - StringBuilder sbtopic = new StringBuilder(); - sbtopic.append(projName) - .append("/").append(protocolVersion) - .append("/").append(cmdtype) - .append("/").append(imei) - ; - return genStringMessage(sbtopic.toString(), sb.toString()); - } - - - /** - * 终端发布(平台订阅): - * 终端向“WBG100/v1/BREQ/ID_手表IMEI”的主题发布 [LEN,MQTT注册时的账号及密码的密文] - *

- * 实例: 若手表IMEI号为334588000000156, - * MQTT注册时的账号及密码的密文为:QWER15WTF156OQRT1230 - * 则向WBG100/v1/BREQ/ID_334588000000156的主题发布[0016,QWER15WTF156OQRT1230] - */ - public static StringMessage BREQ(Runtime runtime) { - return genMqttCMDMsg(cmdMap.get(CMD_TYPE.BREQ), mqttKey, runtime.IMEI()); - } - - - public static void handleBREQ(Runtime runtime, String data) { -/*** - * 回应的消息为:[LEN,区域id,绑定的区域纬度,N/S,经度,E/W,beacon mac_1,beacon mac_2,beacon mac_3,…,beacon mac_n] - * - * 实例: 若手表IMEI号为334588000000156,绑定的区域为123456789, - * 经纬度为:22.570512,N,113.8623267,E, - * beacon mac:0x5947ffff0001, 5947ffff0002 - * 则终端订阅“WBG100/v1/ID_334588000000156/+”的主题列表,会收到平台的回应 - * 先判断子主题是否为:BREQ - * 是,则消息为:[003F,123456789,22.570512,N,113.8623267,E,5947ffff0001, 5947ffff0002] - */ - String[] list = data.split(CMDSPLIT); - if (list.length >= 7) { - runtime.bleInfo.ble_area_id = list[1].trim(); - runtime.bleInfo.gps_n = list[2].trim(); - runtime.bleInfo.gps_e = list[4].trim(); - runtime.bleInfo.btMacList.clear(); - StringBuilder sb = new StringBuilder(); - sb.append("登录绑定 区域码" + list[1] + " ,GPS " + list[2] + "N," + list[4] + "E, BtMacs "); - for (int i = 6; i < list.length; i++) { - runtime.bleInfo.btMacList.add(list[i].trim().toLowerCase()); - sb.append(",").append(list[i]); - } - ICLogger.i(sb.toString()); - } - } - - public static StringMessage KA(Runtime runtime) { - - /*** - * 终端向“WBG100/v1/KA/ID_手表IMEI”的主题发布 [LEN, 日期,步数,翻滚次数,电量百分数,区域id] - * - * 实例:若手表IMEI号为334588000000156,请求绑定时下发的区域id为123456789, - * 则向WBG100/v1/KA/ID_334588000000156的主题发布 [001B,120414,50,100,100, 123456789] - * - * 终端订阅(平台发布): - * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,会收到平台的回应 - * 平台发布的子主题为:KA - * 回应的消息为:[LEN,KA] - */ - if(runtime.bleInfo.ble_area_id.isEmpty()){ - return null; - } - StringBuilder sb = new StringBuilder(); - String cmd = cmdMap.get(CMD_TYPE.KA); - sb.append(TimeUtil.getUTCSystemDateYYMMDD()).append(CMDSPLIT) - .append(runtime.getTotalStepCount()).append(CMDSPLIT) - .append(runtime.getRolltimes()).append(CMDSPLIT) - .append(runtime.getBattery()).append(CMDSPLIT) - .append(runtime.bleInfo.ble_area_id); - return genMqttCMDMsg(cmd, sb.toString(), runtime.IMEI()); - } - - /*LBS+GPS混合定位*/ - public static StringMessage UD(Runtime runtime) { - /*** - * [LEN,定位数据,区域id] - * - * 实例:若手表IMEI号为334588000000156,请求绑定时下发的区域id为123456789, - * 则向WBG100/v1/LGZONE/ID_334588000000156的主题发布 - * [00D7,180916,025723,A,22.570733,N,113.8626083,E,0.00,249.5,0.0,6,100, - * 60,0,0,00000010,7,255,460,1,9529,21809,158,9529,63555,133,9529,63554,129,9529,21405,126,9529,21242,124,9529,21151,120,9529,63556,119,0,123456789] - * 说明: - * 数据内容: - * 180916,日期(年月日)(0 时区),表示0 时区的二零一八年九月十六号 - * 025723,时间(时分秒)(0 时区),表示0 时区的两点五十七分二十三秒 - * A,gps 定位有效 - * 22.570733,纬度 - * N,纬度表示 - * 113.8626083,经度 - * E,经度表示 - * 0.00,速度 - * 249.5,方向 - * 0.0,海拔 - * 6,卫星个数 - * 100,gsm 信号强度 - * 60,电量 - * 0,计步数 - * 0,翻转次数 - * 00000010,终端状态,数据为16 进制,解析成二进制为0000 0000 0000 0000 0000 0000 0001 0000 前面4 个字节表示状态,后面4 个字节表示报警,数据中第4 位为1,对照文档最后的数据解析,表示手表静止状态。详细可参看文档最后部分。 - * 7,基站个数 - * 255,460,1,9529,21809,158,9529,63555,133,9529,63554,129,9529,21405,126,9529,21242,124,9529,21151,120,9529,63556,119,基站信息 - * 0,WiFi 个数 - * 123456789,为区域id - */ - - if(runtime.bleInfo.ble_area_id.isEmpty()){ - ICLogger.i("not Bind, skip send Location!"); - return null; - } - StringBuilder sb = new StringBuilder(); - String cmd = cmdMap.get(CMD_TYPE.UD); - sb.append(TimeUtil.getUTCSystemDateYYMMDD()).append(CMDSPLIT) - .append(TimeUtil.getUTCSystemTimeHHmmss()).append(CMDSPLIT) - .append(runtime.getMqttGPSData()).append(CMDSPLIT) - .append(String.format("%03d", abs(runtime.getSignalStrength()))).append(CMDSPLIT) - .append(runtime.getBattery()).append(CMDSPLIT) - .append(runtime.getTotalStepCount()).append(CMDSPLIT) - .append(runtime.getRolltimes()).append(CMDSPLIT) - .append(runtime.getFZDDevStatus(runtime)).append(CMDSPLIT) - .append(runtime.getFZDLBSMultiStationData()).append(CMDSPLIT) - .append(runtime.getFZDWifiData()).append(CMDSPLIT) - .append(runtime.bleInfo.is_in_area ? "1" : "0").append(CMDSPLIT) - .append(runtime.bleInfo.ble_area_id); - return genMqttCMDMsg(cmd, sb.toString(), runtime.IMEI()); - } - - - //处理 定位 BP01 - public void handleUD2(String cmd) { - log("BP02定位接收成功"); - } - - public static StringMessage LGZONE(Runtime runtime){ - /*** - * 获取服务器端时间(LGZONE) - * 终端发布(平台订阅): - * 终端向“WBG100/v1/LGZONE/ID_手表IMEI”的主题发布 [LEN,区域id] - * - * 实例:若手表IMEI号为334588000000156,请求绑定时下发的区域id为123456789, - * 则向WBG100/v1/LGZONE/ID_334588000000156的主题发布 [0009,123456789] - * - * 终端订阅(平台发布): - * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,会收到平台的回应 - * 平台发布的子主题为:LGZONE - * 回应的消息为:[LEN, 时区,时间,日期] - * - * 实例: 若手表IMEI号为334588000000156,绑定的区域为123456789, - * 则终端订阅“WBG100/v1/ID_334588000000156/+”的主题列表,会收到平台的回应 - * 先判断子主题是否为:LGZONE - * 是,则消息为:[001D,+8,08:00:00,2016-01-12] - * 实例表示:东八区,上午8 点整 - - */ - if(runtime.bleInfo.ble_area_id.isEmpty()){ - return null; - } - StringBuilder sb = new StringBuilder(); - String cmd = cmdMap.get(CMD_TYPE.LGZONE); - sb.append(runtime.bleInfo.ble_area_id); - return genMqttCMDMsg(cmd, sb.toString(), runtime.IMEI()); - - } - public void handleLGZONE(Connection connection,Runtime runtime, String data){ - - /*** - * 获取服务器端时间(LGZONE) - * 终端发布(平台订阅): - * 终端向“WBG100/v1/LGZONE/ID_手表IMEI”的主题发布 [LEN,区域id] - * - * 实例:若手表IMEI号为334588000000156,请求绑定时下发的区域id为123456789, - * 则向WBG100/v1/LGZONE/ID_334588000000156的主题发布 [0009,123456789] - * - * 终端订阅(平台发布): - * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,会收到平台的回应 - * 平台发布的子主题为:LGZONE - * 回应的消息为:[LEN, 时区,时间,日期] - * - * 实例: 若手表IMEI号为334588000000156,绑定的区域为123456789, - * 则终端订阅“WBG100/v1/ID_334588000000156/+”的主题列表,会收到平台的回应 - * 先判断子主题是否为:LGZONE - * 是,则消息为:[001D,+8,08:00:00,2016-01-12] - * 实例表示:东八区,上午8 点整 - - */ - String[] list=data.split(CMDSPLIT); - if (list.length==4){ - String timeZone=list[1].trim(); - String date=list[3].trim(); - String time=list[2].trim(); - Date datetime= TimeUtil.parseDatetiime(date,time); - - int timezone; - try - { - timezone=Integer.parseInt(timeZone.replace("+","").trim()); - }catch (Exception e){ - ICLogger.e("timezone",e); - timezone=8; - } - - if (datetime!=null){ - ICLogger.i("==="+timezone+" "+TimeUtil.getDefaultTimeZone()); - TimeUtil.setTimeZone(timezone); - - - ICLogger.i("==="+TimeUtil.getDefaultTimeZone()); - TimeUtil.setSysDateTime(runtime.getContextProxy().context,datetime,timezone); - ICLogger.i("==="+TimeUtil.getDefaultTimeZone()); - - } -// Set Datetime 20200505112734 -// Set TimeZone 8 - - }else{ - ICLogger.i("LGZONE Format Error!"); - } - - - } - - public static StringMessage AL(Runtime runtime){ -/*** - * 报警数据上报(AL) - * 终端发布(平台订阅): - * 终端向“WBG100/v1/AL/ID_手表IMEI”的主题发布 [LEN,位置数据(见附录一),区域id] - * - * 终端订阅(平台发布): - * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,会收到平台的回应 - * 平台发布的子主题为:AL - * 回应的消息为:[LEN, AL] - * - * 说明:终端产生警情后发送报警信息到平台,若终端没有收到回复,则定时上报直到收到报警确认为止. - */ - if(runtime.bleInfo.ble_area_id.isEmpty()){ - return null; - } - StringBuilder sb = new StringBuilder(); - String cmd = cmdMap.get(CMD_TYPE.AL); - sb.append(TimeUtil.getUTCSystemDateYYMMDD()) - .append(CMDSPLIT).append(TimeUtil.getUTCSystemTimeHHmmss()) - .append(CMDSPLIT).append(runtime.getMqttGPSData()) - .append(CMDSPLIT).append(String.format("%03d", abs(runtime.getSignalStrength()))) - .append(CMDSPLIT).append(runtime.getBattery()) - .append(CMDSPLIT).append(runtime.getTotalStepCount()) - .append(CMDSPLIT).append(runtime.getRolltimes()) - .append(CMDSPLIT).append(runtime.getFZDDevStatus(runtime)) - .append(CMDSPLIT).append(runtime.getFZDLBSMultiStationData()) - .append(CMDSPLIT).append(runtime.getFZDWifiData()) - .append(CMDSPLIT).append(runtime.bleInfo.is_in_area ? "1" : "0") - .append(CMDSPLIT).append(runtime.bleInfo.ble_area_id); - return genMqttCMDMsg(cmd, sb.toString(), runtime.IMEI()); - - } - - - public static StringMessage UPLOAD(Runtime runtime){ - - - return genMqttCMDMsg(cmdMap.get(CMD_TYPE.UPLOAD),runtime.bleInfo.ble_area_id,runtime.IMEI()); - } - - public void handleUPLOAD(Connection connection,Runtime runtime,String cmd,String data){ - /** - * 数据上传间隔设置(UPLOAD) - * 平台发布(终端订阅): - * 平台向“WBG100/v1/ID_手表IMEI/UPLOAD”的主题发布 [LEN, 时间间隔] - * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为UPLOAD - * - * 终端发布(平台订阅): - * 终端收到数据,向“WBG100/v1/ID_手表IMEI/UPLOAD”的主题发布回应 - * [LEN,区域id] - */ - connection.send(UPLOAD(runtime)); - String[] list=data.split(CMDSPLIT); - if (TextUtils.isDigitsOnly(list[1].trim())) { - try { - int timesecond = Integer.parseInt(list[1].trim()); - int mod = runtime.getLocationInstance().getWorkingMod(); - log("LOCATION_MODE " + LOCATION_MODE + " mod " + mod + " cycle " + timesecond); - Config.setLocationMode(runtime.getContextProxy().context, mod); - Config.setLocationCycle(runtime.getContextProxy().context, timesecond); - runtime.getLocationInstance().setLocation_cycle(timesecond); - runtime.getLocationInstance().setWorkingMod(mod); - CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod()); - }catch (Exception e){ - ICLogger.e(e.getMessage(),e); - } - //此处设置好配置后,会在LocationClient通过消息开始执行及时定位操作。 - }else{ - ICLogger.i("UPLOAD format error!"); - } - } - - public static StringMessage heart(int hrt,Runtime runtime){ - /*** - * 终端心率上传(heart) - * 终端发布(平台订阅): - * 终端向“WBG100/v1/heart/ID_手表IMEI”的主题发布 [LEN,x,区域id] - * x 表示每分钟的心跳次数 - * - * 平台不需要回复 - * 说明:终端按照设定间隔上报,不需要平台回复. - */ - return genMqttCMDMsg(cmdMap.get(CMD_TYPE.heart),String.valueOf(hrt),runtime.IMEI()); - } - public static StringMessage oxygen(int ox ,Runtime runtime){ - /*** - * - * 上传血氧数据(oxygen) - * 终端发布(平台订阅): - * 终端向“WBG100/v1/oxygen/ID_手表IMEI”的主题发布 [LEN,x,区域id] - * x 表示血氧饱和度 - * - * 平台不需要回复 - * 说明:终端按照设定间隔上报,不需要平台回复. - */ - return genMqttCMDMsg(cmdMap.get(CMD_TYPE.oxygen),String.valueOf(ox),runtime.IMEI()); - } - - public static StringMessage blood(int pbl,int pbh, Runtime runtime){ - /*** - * 上传血压数据(blood) - * 终端发布(平台订阅): - * 终端向“WBG100/v1/blood/ID_手表IMEI”的主题发布 [LEN,x,y,区域id] - * x 是收缩压(高压) - * y 是舒张压(低压) - * - * 平台不需要回复 - * 说明:终端按照设定间隔上报,不需要平台回复. - * - */ - String data=pbh+CMDSPLIT+pbl; - return genMqttCMDMsg(cmdMap.get(CMD_TYPE.blood),data,runtime.IMEI()); - } - - public static StringMessage temp(double temp,Runtime runtime){ - /*** - * 上传体温数据(temp) - * 终端发布(平台订阅): - * 终端向“WBG100/v1/temp/ID_手表IMEI”的主题发布 [LEN,x.x,区域id] - * X.X: 当前测到温度值,若测到温度为36.2,则 x.x=36.2 - * - * 平台不需要回复 - * 说明:终端按照设定间隔上报,不需要平台回复. - */ - - return genMqttCMDMsg(cmdMap.get(CMD_TYPE.temp),String.format("%.1f",temp ),runtime.IMEI()); - } - - public static StringMessage wdstart(Runtime runtime){ - return genMqttCMDMsg(cmdMap.get(CMD_TYPE.wdstart),runtime.bleInfo.ble_area_id,runtime.IMEI()); - } - public void handleWdstart(Connection connection,Runtime runtime ,String data) { - -/*** - * 设置体温上传频率(wdstart) - * 平台向“WBG100/v1/ID_手表IMEI/wdstart”的主题发布 [LEN, x] - * x 为上传间隔时间,单位秒,连续上传时最小时间不小于300 秒,最大不超过65535. - * x 为1 则代表终端心率单次上传,上传完后自动关闭。 - * x 为0 则代表终端心率上传关闭。 - * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为wdstart - * - * 终端发布(平台订阅): - * 终端收到数据,向“WBG100/v1/ID_手表IMEI/ wdstart”的主题发布回应 - * [LEN,区域id] - */ - connection.send(wdstart(runtime)); - String[] list=data.split(CMDSPLIT); - if (list.length==2){ - String cycle=list[1]; - if (TextUtils.isDigitsOnly(cycle.trim())){ - try { - int cycle_int = Integer.parseInt(cycle.trim()); - ICLogger.i("收到服务器指令:设置体温上传频率 " + cycle + "秒"); - - Config.setTemperatureTestCycle(runtime, cycle_int); - CoreService.getInstance().setTempAlarm(); - if(runtime.check_stat_do_temp_test()) TemperatureUtil.doTempTestInThread(); - }catch (Exception e){ - ICLogger.e(e.getMessage(),e); - } - }else - { - ICLogger.i("wdstart Format Error!"); - } - }else - { - ICLogger.i("wdstart Format Error!"); - } - } - public static StringMessage hrtstart(Runtime runtime){ - return genMqttCMDMsg(cmdMap.get(CMD_TYPE.hrtstart),runtime.bleInfo.ble_area_id,runtime.IMEI()); - } - public void handleHrtstart(Connection connection,Runtime runtime, String data) { - /*** - * 设置心率、血氧、血压上传频率(hrtstart) - * 平台发布(终端订阅): - * 平台向“WBG100/v1/ID_手表IMEI/hrtstart”的主题发布 [LEN, x] - * x 为上传间隔时间,单位秒,连续上传时最小时间不小于300 秒,最大不超过65535. - * x 为1 则代表终端心率单次上传,上传完后自动关闭。 - * x 为0 则代表终端心率上传关闭。 - * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为hrtstart - * - * 终端发布(平台订阅): - * 终端收到数据,向“WBG100/v1/ID_手表IMEI/ hrtstart”的主题发布回应 - * [LEN,区域id] - */ - connection.send(hrtstart(runtime)); - String[] list=data.split(CMDSPLIT); - if (list.length==2){ - String cycle=list[1]; - if (TextUtils.isDigitsOnly(cycle.trim())){ - try { - int cycle_int = Integer.parseInt(cycle.trim()); - ICLogger.i("收到服务器指令:设置心率血压周期 " + cycle + "秒" + cycle_int / 60 + "分钟"); - - //发送重置PPGCycle的广播,会在CoreServer里面执行 - Intent intent = new Intent(); - intent.putExtra("PPGTestCycle", cycle_int / 60); - runtime.getContextProxy().sendBrodcast(ACTION_HEATR_RATE_START, intent); - }catch (Exception e){ - ICLogger.e(e.getMessage(),e); - } - }else - { - ICLogger.i("Hrtstart Format Error!"); - } - - }else{ - ICLogger.i("Hrtstart Format Error!"); - } - - } - - public static StringMessage SOS(Runtime runtime){ - return genMqttCMDMsg(cmdMap.get(CMD_TYPE.SOS),runtime.bleInfo.ble_area_id,runtime.IMEI()); - } - - - public void handleSOS(Connection connection,Runtime runtime,String cmd,String data) { -/*** - * 设置SOS 号码(SOS) - * 平台发布(终端订阅): - * 平台向“WBG100/v1/ID_手表IMEI/SOS”的主题发布 [LEN,电话号码,电话号码] - * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为SOS - * - * 终端发布(平台订阅): - * 终端收到数据,向“WBG100/v1/ID_手表IMEI/SOS”的主题发布回应 - * [LEN,区域id] - * - * 说明:设置SOS 号码后,触发sos 警情时,终端向设置的几个号码拨打电话,一直没有接听,则循环拨打两轮,接听后则不再继续拨打电话,同时发送报警短信给2 个sos 号码. - */ - connection.send(SOS(runtime)); - if (data!=null && data.length()>0) { - String list[] = data.split(CMDSPLIT); - if (list.length==2){ - ArrayList contactArray=new ArrayList(); - if (regexUtil.isMobileNumber( list[1]) || regexUtil.isPhoneNumber(list[1])) - { - contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos1",list[1])); - ICLogger.i("find SOS1 number "+list[1]); - runtime.getDbHelper().saveContacts(contactArray,false,false,false,false,false,true); - } - }else if (list.length==3){ - - ArrayList contactArray=new ArrayList(); - if (regexUtil.isMobileNumber( list[1]) || regexUtil.isPhoneNumber(list[1])) - { - contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos1",list[1])); - ICLogger.i("find SOS1 number "+list[1]); - } - if (regexUtil.isMobileNumber( list[2]) || regexUtil.isPhoneNumber(list[2])) - { - contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos2",list[2])); - ICLogger.i("find SOS2 number "+list[2]); - } - - runtime.getDbHelper().saveContacts(contactArray,false,false,false,false,false,true); - - }else{ - ICLogger.i("SOS Format Error!"); - } - }else - ICLogger.i("SOS Format Error!"); - - - } - - public static StringMessage FACTORY(Runtime runtime){ - return genMqttCMDMsg(cmdMap.get(CMD_TYPE.FACTORY),runtime.bleInfo.ble_area_id,runtime.IMEI()); - } - - - public void handleFactory(Connection connection,Runtime runtime,String cmd,String data) { -/*** - * 恢复出厂设置(FACTORY) - * 平台发布(终端订阅): - * 平台向“WBG100/v1/ID_手表IMEI/FACTORY”的主题发布 [LEN,FACTORY] - * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为FACTORY - * - * 终端发布(平台订阅): - * 终端收到数据,向“WBG100/v1/ID_手表IMEI/FACTORY”的主题发布回应 - * [LEN,区域id] - * - * 说明:终端恢复出厂设置,里面设置的号码都将清空 - */ - connection.send(FACTORY(runtime)); - } - - - public static StringMessage MSGDOWN(Runtime runtime,String index){ - String data=new StringBuffer(index).append(CMDSPLIT).append(runtime.bleInfo.ble_area_id).toString(); - return genMqttCMDMsg(cmdMap.get(CMD_TYPE.MSGDOWN),data,runtime.IMEI()); - } - - - public void handleMSGDOWN(Connection connection,Runtime runtime,String cmd,String data) { - -/** - * 消息下发到指定手表(MSGDOWN) - * 平台发布(终端订阅): - * 平台向“WBG100/v1/ID_手表IMEI/MSGDOWN”的主题发布 [LEN,包序号,具体消息] - * - * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为MSGDOWN - * - * 终端发布(平台订阅): - * 终端收到数据,向“WBG100/v1/ID_手表IMEI/MSGDOWN”的主题发布回应 - * [LEN,包序号,区域id] - * - * 说明: - * 终端回应的包序号与平台发送的包序号一致,每次发送平台包需要加1,确保每包消息的包序号唯一。 - * 具体消息为英文,ASCII格式,长度不超过512个字节 - */ - - String[] cmdlist=data.split(CMDSPLIT); - if (cmdlist.length == 3){ - String cmdindex=cmdlist[1]; - String txtmsg=cmdlist[2]; - StringMessage msg=MSGDOWN(runtime,cmdindex); - connection.send(msg); - ICLogger.i("received Txt Msg "+txtmsg); - runtime.getContextProxy().sendMsgBroadcast(txtmsg,0); - runtime.getContextProxy().saveMstToSMSDB(txtmsg); - }else{ - ICLogger.i("MSGDOWN format error!"); - } - } - public static StringMessage REMOVE(Runtime runtime){ - return genMqttCMDMsg(cmdMap.get(CMD_TYPE.REMOVE),runtime.bleInfo.ble_area_id,runtime.IMEI()); - } - - - public void handleREMOVE(Connection connection,Runtime runtime,String cmd,String data) { - - /** - * 取下手环报警开关(REMOVE) - * 平台发布(终端订阅): - * 平台向“WBG100/v1/ID_手表IMEI/REMOVE”的主题发布 [LEN,0 或者1] - * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为REMOVE - * - * 终端发布(平台订阅): - * 终端收到数据,向“WBG100/v1/ID_手表IMEI/REMOVE”的主题发布回应 - * [LEN,区域id] - * - * 说明:手表拆除报警的开关,1 打开,0 关闭. - */ - connection.send(REMOVE(runtime)); - String[] cmdlist=data.split(CMDSPLIT); - if (cmdlist.length == 2){ - String cmdindex=cmdlist[1]; - ICLogger.i("设置REMOVE "+cmdindex); - }else{ - ICLogger.i("REMOVE format error!"); - } - } - - public static StringMessage PEDO(Runtime runtime){ - return genMqttCMDMsg(cmdMap.get(CMD_TYPE.PEDO),runtime.bleInfo.ble_area_id,runtime.IMEI()); - } - - - public void handlePEDO(Connection connection,Runtime runtime,String cmd,String data) { - - /*** - * 计步功能开关(PEDO) - * 平台发布(终端订阅): - * 平台向“WBG100/v1/ID_手表IMEI/PEDO”的主题发布 [LEN,0 或者1] - * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为PEDO - * - * 终端发布(平台订阅): - * 终端收到数据,向“WBG100/v1/ID_手表IMEI/PEDO”的主题发布回应 - * [LEN,区域id] - * - * 说明: 终端计步功能的开关.1 打开,0 关闭 - */ - connection.send(PEDO(runtime)); - String[] cmdlist=data.split(CMDSPLIT); - if (cmdlist.length == 2){ - String cmdindex=cmdlist[1]; - ICLogger.i("设置PEDO "+cmdindex); - }else{ - ICLogger.i("PEDO format error!"); - } - } - - public static StringMessage MONITOR(Runtime runtime){ - return genMqttCMDMsg(cmdMap.get(CMD_TYPE.MONITOR),runtime.bleInfo.ble_area_id,runtime.IMEI()); - } - - - public void handleMONITOR(Connection connection,Runtime runtime,String cmd,String data) { - - /*** - 监听(MONITOR) - 平台发布(终端订阅): - 平台向“WBG100/v1/ID_手表IMEI/MONITOR”的主题发布 [LEN,电话号码] - 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为MONITOR - - 终端发布(平台订阅): - 终端收到数据,向“WBG100/v1/ID_手表IMEI/ MONITOR”的主题发布回应 - [LEN,区域id] - - 说明:终端收到该指令后会自动回拨给设置的电话号码,电话号码为CENTER时,回拨给中心号码. - */ - connection.send(MONITOR(runtime)); - String[] cmdlist=data.split(CMDSPLIT); - if (cmdlist.length == 2){ - String cmdindex=cmdlist[1]; - ICLogger.i("设置MONITOR 号码 "+cmdindex); - }else{ - ICLogger.i("MONITOR format error!"); - } - } - - - public static StringMessage CENTER(Runtime runtime){ - return genMqttCMDMsg(cmdMap.get(CMD_TYPE.CENTER),runtime.bleInfo.ble_area_id,runtime.IMEI()); - } - - - public void handleCENTER(Connection connection,Runtime runtime,String cmd,String data) { - - /*** - 中心号码设置(CENTER) - 平台发布(终端订阅): - 平台向“WBG100/v1/ID_手表IMEI/CENTER”的主题发布 [LEN,电话号码] - 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为CENTER - - 终端发布(平台订阅): - 终端收到数据,向“WBG100/v1/ID_手表IMEI/CENTER”的主题发布回应 - [LEN,区域id] - 说明:设置中心号码,通过该手机号码可发送短信指令。同时终端的各种报警短信会发送到该号码的手机上面 - */ - connection.send(CENTER(runtime)); - String[] cmdlist=data.split(CMDSPLIT); - if (cmdlist.length == 2){ - String cmdindex=cmdlist[1]; - ICLogger.i("设置CENTER 号码 "+cmdindex); - }else{ - ICLogger.i("CENTER format error!"); - } - } - public void sendBroadcast(String cmd, Runtime dev) { - - ComponentName componentName = new ComponentName("com.eqc.watch", "com.eqc.watch.launcher.ChatActivity"); - Intent intent = new Intent("android.intent.action.MAIN"); -// intent.putExtra("ACTIVITY_TYPE", 2); -// intent.addCategory("android.intent.category.DEFAULT"); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - intent.setComponent(componentName); - dev.getContextProxy().context.startActivity(intent); - } - - public boolean handleCmd(CMD_TYPE type, String cmd , String data) { - - //普通非二进制命令用此函数处理 - boolean ret=true; - ICLogger.i("mqtt handleCmd "+type.name() + " strLen="+data.length()); - - switch (type){ - - case KA: - ICLogger.i("服务器收到心跳包KA"); - mConnection.DeliverCMDMessageToSystem("heartbeat",cmd);//通知下面线程状态变化 - break; - - case BREQ: - handleBREQ(mRuntime,data); - //ICLogger.i("服务器返回Ping绑定信息"); - ICLogger.i("服务器收到登录包BREQ"); - mConnection.DeliverCMDMessageToSystem("login",cmd);//通知下面线程状态变化 - break; - case LGZONE: - handleLGZONE(mConnection,mRuntime,data); - break; - - case UD: - mConnection.DeliverCMDMessageToSystem("UD",cmd);//通知下面线程状态变化 - break; - - case AL: - mConnection.DeliverCMDMessageToSystem("AL",cmd);//通知下面线程状态变化 - break; - - case PEDO: - handlePEDO(mConnection,mRuntime,cmd,data); - mConnection.DeliverCMDMessageToSystem("PEDO",cmd);//通知下面线程状态变化 - break; - - case REMOVE: - handleREMOVE(mConnection,mRuntime,cmd,data); - mConnection.DeliverCMDMessageToSystem("REMOVE",cmd);//通知下面线程状态变化 - break; - case CENTER: - handleCENTER(mConnection,mRuntime,cmd,data); - mConnection.DeliverCMDMessageToSystem("CENTER",cmd);//通知下面线程状态变化 - - break; - case MONITOR: - handleMONITOR(mConnection,mRuntime,cmd,data); - mConnection.DeliverCMDMessageToSystem("MONITOR",cmd);//通知下面线程状态变化 - - break; -// case CR: -// //立即定位指令(长链接有效) -// handleCR(mConnection); -// mConnection.DeliverCMDMessageToSystem("StartLocate",cmd);//通知下面线程状态变化 -// break; - -// case BP07: -// //收到发送的语音包 -// handleBP07(cmd,mConnection); -// break; -// case BP10: -// //报警包 -// mConnection.DeliverCMDMessageToSystem("AP10",cmd);//通知下面线程状态变化 -// break; -// -// case BPTM: -// //校时命令 -// handleBPTM(cmd); -// ICLogger.i("服务器收到校时命令APTM"); -// mConnection.DeliverCMDMessageToSystem("APTM",cmd);//通知下面线程状态变化 -// break; -// case BP85://设置闹钟 -// handleBP85(cmd,mConnection,mRuntime); -// ICLogger.i("收到服务器设置闹钟命令BP85"); -// mConnection.DeliverCMDMessageToSystem("AP85",cmd);//通知下面线程状态变化 -// break; - case UPLOAD: - //设置工作模式 - handleUPLOAD(mConnection,mRuntime,cmd,data); - mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化 - - break; -// case BP34: -// //设置工作模式 -// handleBP34(mConnection,mRuntime,cmd); -// mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化 -// break; -// -//// case BP05: //L02服务器不适用 -//// //查询服务器语音 返回信息 -//// API.handleBP05(cmd); -//// break; -// - case SOS: - //收到设置SOS号码 - handleSOS(mConnection,mRuntime,cmd,data); - ICLogger.i("收到服务器设置SOS号码命令BP12"); - break; -// case PHL: -// //收到设置白名单号码 -// ICLogger.i("收到服务器设置白名单号码命令BP14"); -// handlePHL(mConnection,mRuntime,cmd,data); -// break; -// case BP15: -// handleBP15(cmd,mConnection,mRuntime); -// ICLogger.i("收到服务器设置定位命令BP15"); -// break; - case FACTORY: - //收到恢复出厂设置 - handleFactory(mConnection,mRuntime,cmd,data); - ICLogger.i("收到服务器恢复出厂设置命令"); - mConnection.DeliverCMDMessageToSystem("FactoryReset",cmd);//通知下面线程状态变化 - break; -// -// case BP18: -// //收到重启 -// handleBP18(mConnection,cmd); -// ICLogger.i("收到服务器重启命令BP18"); -// mConnection.DeliverCMDMessageToSystem("Reboot",cmd);//通知下面线程状态变化 -// break; -// - - case MSGDOWN: - //服务器推送文本 - handleMSGDOWN(mConnection,mRuntime,cmd,data); - ICLogger.i("收到服务器推送文本消息"); -// mConnection.DeliverCMDMessageToSystem("showTxt",cmd);//通知下面线程状态变化 - break; - - case hrtstart: - handleHrtstart(mConnection,mRuntime,data); - ICLogger.i("收到服务器心率检测命令"); - if(mRuntime.check_stat_do_ppg_test()) HeartRateManager.triggerPPGtest(); - break; - - case wdstart: - handleWdstart(mConnection,mRuntime,data); - ICLogger.i("收到服务器体温测试及设置命令"); - break; - case blood: - ICLogger.i("服务器收到上传的血压"); - mConnection.DeliverCMDMessageToSystem("blood",cmd);//通知下面线程状态变化 - break; - case oxygen: - ICLogger.i("服务器收到上传的血氧"); - mConnection.DeliverCMDMessageToSystem("oxygen",cmd);//通知下面线程状态变化 - break; - case temp: - ICLogger.i("服务器收到上传的体温"); - mConnection.DeliverCMDMessageToSystem("temp",cmd);//通知下面线程状态变化 - break; - case heart: - ICLogger.i("服务器收到上传的心率heart"); - mConnection.DeliverCMDMessageToSystem("heart",cmd);//通知下面线程状态变化 - break; -// case BP84: -// handleBP84(cmd,mConnection); -// ICLogger.i("收到服务器白名单命令"); -// break; -// -// case BP86: -// //绑定解绑消息 -// handleBP86(cmd,mConnection,mRuntime); -// mConnection.DeliverCMDMessageToSystem("AP86",cmd);//通知下面线程状态变化 -// -// break; -// - - -// case BP89: -// //心率/血压阀值 -// handleBP89(cmd,mConnection); -// mConnection.DeliverCMDMessageToSystem("AP89",cmd);//通知下面线程状态变化 -// break; -// -// case BPTE: //设置测试体温 -// handleBPTE(cmd,mConnection,mRuntime); -// mConnection.DeliverCMDMessageToSystem("APTE",cmd);//通知下面线程状态变化 -// break; -// -// case BPTP: -// handleBPTP(); -// mConnection.DeliverCMDMessageToSystem("APTP",cmd);//通知下面线程状态变化 -// break; -// case BPHP: -// handleBPHP(); -// mConnection.DeliverCMDMessageToSystem("IWAPHP",cmd);//通知下面线程状态变化 -// break; -// case BPX1://设置 心率血压血氧修正值 -// handleBPX1(cmd,mConnection,mRuntime); -// ICLogger.i("收到服务器设置 心率血压血氧修正值BPX1"); -// mConnection.DeliverCMDMessageToSystem("APX1",cmd);//通知下面线程状态变化 -// break; -// -// case BPS4: //提醒设置(时间段) 主要为久坐设置提醒时长。 -// handleBPS4(cmd,mConnection,mRuntime); -// ICLogger.i("收到 提醒设置(时间段)"); -// mConnection.DeliverCMDMessageToSystem("APS4",cmd);//通知下面线程状态变化 -// break; -// case BPDE: -// handleBPDE(mConnection,cmd,mRuntime); -// ICLogger.i(" 收到 进出围栏通知!"); -// mConnection.DeliverCMDMessageToSystem("APDE",cmd);//通知下面线程状态变化 -// break; -// -// case BPTU: -// handleBPTU(cmd, mConnection); -// ICLogger.i("收到服务器 图片语音 消息 BPTU"); -// // mConnection.DeliverCMDMessageToSystem("APTU", "");//通知下面线程状态变化 -// break; -// case BPDF: -// handleBPDF(mConnection,cmd,mRuntime); -// ICLogger.i(" 收到 体温阈值设置!"); -// mConnection.DeliverCMDMessageToSystem("APDF",cmd);//通知下面线程状态变化 -// break; - - } - - return ret; - - } - - - public boolean handleCmd(CMD_TYPE type, String cmd, byte[] bytes) { - - //只有需要传递二级制数据的才需要这个函数,目前只有BP28需要 - - boolean ret=true; - ICLogger.i("handleCmd "+type.name() + " "+cmd+" bytelen="+bytes.length ); - if (Config.LOG_TOFILE) ICLogger.logToFile("APILog", " recv " +new String(bytes)); -// switch (type) { -// case LK: -// // handleBP28(mConnection,cmd, mRuntime,bytes); -// ICLogger.i("收到服务器语音BP28"); -// mConnection.DeliverCMDMessageToSystem("BP28", "");//通知下面线程状态变化 -// break; -// } - return ret; - } - -} +package com.ic.protocols; + +import android.content.ComponentName; +import android.content.Intent; +import android.text.TextUtils; + +import com.enqualcomm.support.Config; +import com.enqualcomm.support.CoreService; +import com.enqualcomm.support.adapter.BTHelper; +import com.enqualcomm.support.bean.Contact; +import com.enqualcomm.support.bean.Runtime; +import com.enqualcomm.support.bean.StringMessage; +import com.enqualcomm.support.service.HeartRateManager; +import com.enqualcomm.support.utils.Connection; +import com.enqualcomm.support.utils.ICLogger; +import com.enqualcomm.support.utils.MD5; +import com.enqualcomm.support.utils.TemperatureUtil; +import com.enqualcomm.support.utils.TimeUtil; +import com.enqualcomm.support.utils.Util; +import com.enqualcomm.support.utils.regexUtil; + +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; + +import static com.enqualcomm.support.Constants.ACTION_HEATR_RATE_START; +import static com.enqualcomm.support.LocationClient.LOCATION_MODE; +import static java.lang.Math.abs; + +//import android.content.IClipboard; +//import com.android.internal.telephony.uicc.RuimFileHandler; + +public class protocol_mqtt { + private static final String TAG = "ICSrv." + protocol_mqtt.class.getSimpleName(); + private static final String CMDHEADER = "["; + private static final String CMDEND = "]"; + private static final String CMDSPLIT = ","; + + public static final String defaultTestServerIP = "47.106.237.76"; + public static final String defaultServerIP = "mq0.waveon.cn"; + public static final int defaultServerPort = 1883; + + public static final String projName = "WBG100"; + public static final String protocolVersion = "v1"; + public static final String mqttKey = "QWER15WTF156OQRT1230"; + public static final String username="yq_watch"; + public static final String passwd="yq_watch@yg2020"; + public static String MQTT_CLIENT_TOPIC_HEADER = ""; + + public enum CMD_TYPE { + // cmd_type 含义 + // 终端主动上传 + BREQ, // 手表请求绑定(新增) + KA, // 心跳连接 + LGZONE, // 获取服务器端时间 + UD, // 位置数据上报 + AL, // 报警位置数据上报 + ALARM, // 报警数据上报 + temp, // 上传体温数据 + heart, // 终端心率上传 + blood, // 上传血压数据 + oxygen, // 上传血氧数据 + // 平台主动下发 + UPLOAD, // 数据上传间隔设置 + hrtstart, // 设置心率、血氧、血压上传频率 + wdstart, // 设置体温上传频率 + CENTER, // 中心号码设置 + MONITOR, // 监听 + SOS, // 设置SOS 号码 + FACTORY, // 恢复出厂设置 + REMOVE, // 取下手环报警开关 + PEDO, // 计步功能开关 + MSGDOWN, // 消息下发到指定手表(新增) + UNKNOWN_CMD, + } + + private static HashMap cmdMap = null; + + static { + cmdMap = new HashMap(); + cmdMap.put(CMD_TYPE.BREQ, "BREQ"); + cmdMap.put(CMD_TYPE.KA, "KA"); + cmdMap.put(CMD_TYPE.LGZONE, "LGZONE"); + cmdMap.put(CMD_TYPE.UD, "UD"); + cmdMap.put(CMD_TYPE.AL, "AL"); + cmdMap.put(CMD_TYPE.ALARM, "ALARM"); + cmdMap.put(CMD_TYPE.temp, "temp"); + cmdMap.put(CMD_TYPE.heart, "heart"); + cmdMap.put(CMD_TYPE.blood, "blood"); + cmdMap.put(CMD_TYPE.oxygen, "oxygen"); + //下发 + cmdMap.put(CMD_TYPE.UPLOAD, "UPLOAD"); + cmdMap.put(CMD_TYPE.hrtstart, "hrtstart"); + cmdMap.put(CMD_TYPE.wdstart, "wdstart"); + cmdMap.put(CMD_TYPE.CENTER, "CENTER"); + cmdMap.put(CMD_TYPE.MONITOR, "MONITOR"); + cmdMap.put(CMD_TYPE.SOS, "SOS"); + cmdMap.put(CMD_TYPE.FACTORY, "FACTORY"); + cmdMap.put(CMD_TYPE.REMOVE, "REMOVE"); + cmdMap.put(CMD_TYPE.PEDO, "PEDO"); + cmdMap.put(CMD_TYPE.MSGDOWN, "MSGDOWN"); + + } + + private Connection mConnection = null; + private Runtime mRuntime = null; + + public protocol_mqtt(Connection connect, Runtime runtime) { + mConnection = connect; + mRuntime = runtime; + + } + + private StringBuffer cmdbuf = new StringBuffer(); + + + private void log(String msg) { + ICLogger.log(TAG, msg); + } + + private void log(String function, String msg) { + ICLogger.log(TAG, function, msg); + } + + + /**/ + public static StringMessage genStringMessage(String cmdName, String msg) { + StringMessage sm = new StringMessage(new String[]{cmdName, msg}); + sm.refresh(msg); + sm.setDate(TimeUtil.getSystemDateYYMMDD(),TimeUtil.getSystemTimeHHmmss()); + return sm; + } + + + public static String isCmdStr(StringMessage msg) { + + String imei = ""; + if (CoreService.getInstance() != null) + imei = CoreService.getInstance().getRuntime().IMEI(); + String cmdtype = msg.cmd().replace(projName + "/" + protocolVersion + "/", "").replace("/" + imei, ""); +// ICLogger.i("mqtt isCmdStr topic " + msg.cmd() + " ,cmd " + cmdtype); + for (CMD_TYPE key : cmdMap.keySet()) { +// ICLogger.i("mqtt isCmdStr cmd " + msg.cmd()+" " +cmdtype +" key " + cmdMap.get(key)); + if (cmdMap.get(key).equals(cmdtype)) { +// ICLogger.i("Find cmd "+cmdtype); + return cmdtype; + } + } + return ""; + } + + /* + 返回true 表示 cmd 全部解析成功 + 返回false表示 cmd至少有一条解析失败,失败的数据归入buffer,下一次识别接着使用 + 字符串通过#号进行识别。 + 每个字符串如果发现 #,却又没有Header,“IW”则会被丢弃 + */ + public boolean parserCmd(String cmdtype, byte[] bytes) { + String cmd_msgbuf = new String(bytes); + log(cmdtype+" bytes.size " + bytes.length+" "+cmd_msgbuf); +// cmdbuf.append(cmd_msgbuf); +// log("cmdbuf.size " + cmdbuf.length() + " " + cmdbuf.toString()); + +// String[] cmdlist=cmdbuf.toString().split(CMDEND+CMDHEADER); + +// for ( String cmditem : cmdlist ) { + cmd_msgbuf = cmd_msgbuf.replace(CMDHEADER, "").replace(CMDEND, "").replace("'",""); + for (CMD_TYPE key : cmdMap.keySet()) { + if (cmdMap.get(key).toString().equals(cmdtype)) { + handleCmd(key, cmdtype, cmd_msgbuf); + return true; + } + } +// } + + return false; + } + + private static String getHexLen(int len) { + StringBuilder sb = new StringBuilder(); + int v = len & 0xFFFF; + String hv = Integer.toHexString(v); + if (hv.length() == 1) { + sb.append(0).append(0).append(0); + } else if (hv.length() == 2) { + sb.append(0).append(0); + } else if (hv.length() == 3) { + sb.append(0); + } + sb.append(hv); + return sb.toString(); + } + + public static StringMessage genMqttCMDMsg(String cmdtype, String data, String imei) { + StringBuilder sb = new StringBuilder(); + int len = data.length() + 1;//长度计算要包括逗号 + sb.append(CMDHEADER).append(getHexLen(len)).append(CMDSPLIT).append(data).append(CMDEND); + StringBuilder sbtopic = new StringBuilder(); + sbtopic.append(projName) + .append("/").append(protocolVersion) + .append("/").append(cmdtype) + .append("/").append(imei) + ; + return genStringMessage(sbtopic.toString(), sb.toString()); + } + + + /** + * 终端发布(平台订阅): + * 终端向“WBG100/v1/BREQ/ID_手表IMEI”的主题发布 [LEN,MQTT注册时的账号及密码的密文] + *

+ * 实例: 若手表IMEI号为334588000000156, + * MQTT注册时的账号及密码的密文为:QWER15WTF156OQRT1230 + * 则向WBG100/v1/BREQ/ID_334588000000156的主题发布[0016,QWER15WTF156OQRT1230] + */ + public static StringMessage BREQ(Runtime runtime) { + return genMqttCMDMsg(cmdMap.get(CMD_TYPE.BREQ), mqttKey, runtime.IMEI()); + } + + + public static void handleBREQ(Runtime runtime, String data) { +/*** + * 回应的消息为:[LEN,区域id,绑定的区域纬度,N/S,经度,E/W,beacon mac_1,beacon mac_2,beacon mac_3,…,beacon mac_n] + * + * 实例: 若手表IMEI号为334588000000156,绑定的区域为123456789, + * 经纬度为:22.570512,N,113.8623267,E, + * beacon mac:0x5947ffff0001, 5947ffff0002 + * 则终端订阅“WBG100/v1/ID_334588000000156/+”的主题列表,会收到平台的回应 + * 先判断子主题是否为:BREQ + * 是,则消息为:[003F,123456789,22.570512,N,113.8623267,E,5947ffff0001, 5947ffff0002] + */ + String[] list = data.split(CMDSPLIT); + if (list.length >= 7) { + runtime.bleInfo.ble_area_id = list[1].trim(); + runtime.bleInfo.gps_n = list[2].trim(); + runtime.bleInfo.gps_e = list[4].trim(); + runtime.bleInfo.btMacList.clear(); + StringBuilder sb = new StringBuilder(); + sb.append("登录绑定 区域码" + list[1] + " ,GPS " + list[2] + "N," + list[4] + "E, BtMacs "); + for (int i = 6; i < list.length; i++) { + runtime.bleInfo.btMacList.add(list[i].trim().toLowerCase()); + sb.append(",").append(list[i]); + } + ICLogger.i(sb.toString()); + } + } + + public static StringMessage KA(Runtime runtime) { + + /*** + * 终端向“WBG100/v1/KA/ID_手表IMEI”的主题发布 [LEN, 日期,步数,翻滚次数,电量百分数,区域id] + * + * 实例:若手表IMEI号为334588000000156,请求绑定时下发的区域id为123456789, + * 则向WBG100/v1/KA/ID_334588000000156的主题发布 [001B,120414,50,100,100, 123456789] + * + * 终端订阅(平台发布): + * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,会收到平台的回应 + * 平台发布的子主题为:KA + * 回应的消息为:[LEN,KA] + */ + if(runtime.bleInfo.ble_area_id.isEmpty()){ + return null; + } + StringBuilder sb = new StringBuilder(); + String cmd = cmdMap.get(CMD_TYPE.KA); + sb.append(TimeUtil.getUTCSystemDateYYMMDD()).append(CMDSPLIT) + .append(runtime.getTotalStepCount()).append(CMDSPLIT) + .append(runtime.getRolltimes()).append(CMDSPLIT) + .append(runtime.getBattery()).append(CMDSPLIT) + .append(runtime.bleInfo.ble_area_id); + return genMqttCMDMsg(cmd, sb.toString(), runtime.IMEI()); + } + + /*LBS+GPS混合定位*/ + public static StringMessage UD(Runtime runtime) { + /*** + * [LEN,定位数据,区域id] + * + * 实例:若手表IMEI号为334588000000156,请求绑定时下发的区域id为123456789, + * 则向WBG100/v1/LGZONE/ID_334588000000156的主题发布 + * [00D7,180916,025723,A,22.570733,N,113.8626083,E,0.00,249.5,0.0,6,100, + * 60,0,0,00000010,7,255,460,1,9529,21809,158,9529,63555,133,9529,63554,129,9529,21405,126,9529,21242,124,9529,21151,120,9529,63556,119,0,123456789] + * 说明: + * 数据内容: + * 180916,日期(年月日)(0 时区),表示0 时区的二零一八年九月十六号 + * 025723,时间(时分秒)(0 时区),表示0 时区的两点五十七分二十三秒 + * A,gps 定位有效 + * 22.570733,纬度 + * N,纬度表示 + * 113.8626083,经度 + * E,经度表示 + * 0.00,速度 + * 249.5,方向 + * 0.0,海拔 + * 6,卫星个数 + * 100,gsm 信号强度 + * 60,电量 + * 0,计步数 + * 0,翻转次数 + * 00000010,终端状态,数据为16 进制,解析成二进制为0000 0000 0000 0000 0000 0000 0001 0000 前面4 个字节表示状态,后面4 个字节表示报警,数据中第4 位为1,对照文档最后的数据解析,表示手表静止状态。详细可参看文档最后部分。 + * 7,基站个数 + * 255,460,1,9529,21809,158,9529,63555,133,9529,63554,129,9529,21405,126,9529,21242,124,9529,21151,120,9529,63556,119,基站信息 + * 0,WiFi 个数 + * 123456789,为区域id + */ + + if(runtime.bleInfo.ble_area_id.isEmpty()){ + ICLogger.i("not Bind, skip send Location!"); + return null; + } + StringBuilder sb = new StringBuilder(); + String cmd = cmdMap.get(CMD_TYPE.UD); + sb.append(TimeUtil.getUTCSystemDateYYMMDD()).append(CMDSPLIT) + .append(TimeUtil.getUTCSystemTimeHHmmss()).append(CMDSPLIT) + .append(runtime.getMqttGPSData()).append(CMDSPLIT) + .append(String.format("%03d", abs(runtime.getSignalStrength()))).append(CMDSPLIT) + .append(runtime.getBattery()).append(CMDSPLIT) + .append(runtime.getTotalStepCount()).append(CMDSPLIT) + .append(runtime.getRolltimes()).append(CMDSPLIT) + .append(runtime.getFZDDevStatus(runtime)).append(CMDSPLIT) + .append(runtime.getFZDLBSMultiStationData()).append(CMDSPLIT) + .append(runtime.getFZDWifiData()).append(CMDSPLIT) + .append(runtime.bleInfo.is_in_area ? "1" : "0").append(CMDSPLIT) + .append(runtime.bleInfo.ble_area_id); + return genMqttCMDMsg(cmd, sb.toString(), runtime.IMEI()); + } + + + //处理 定位 BP01 + public void handleUD2(String cmd) { + log("BP02定位接收成功"); + } + + public static StringMessage LGZONE(Runtime runtime){ + /*** + * 获取服务器端时间(LGZONE) + * 终端发布(平台订阅): + * 终端向“WBG100/v1/LGZONE/ID_手表IMEI”的主题发布 [LEN,区域id] + * + * 实例:若手表IMEI号为334588000000156,请求绑定时下发的区域id为123456789, + * 则向WBG100/v1/LGZONE/ID_334588000000156的主题发布 [0009,123456789] + * + * 终端订阅(平台发布): + * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,会收到平台的回应 + * 平台发布的子主题为:LGZONE + * 回应的消息为:[LEN, 时区,时间,日期] + * + * 实例: 若手表IMEI号为334588000000156,绑定的区域为123456789, + * 则终端订阅“WBG100/v1/ID_334588000000156/+”的主题列表,会收到平台的回应 + * 先判断子主题是否为:LGZONE + * 是,则消息为:[001D,+8,08:00:00,2016-01-12] + * 实例表示:东八区,上午8 点整 + + */ + if(runtime.bleInfo.ble_area_id.isEmpty()){ + return null; + } + StringBuilder sb = new StringBuilder(); + String cmd = cmdMap.get(CMD_TYPE.LGZONE); + sb.append(runtime.bleInfo.ble_area_id); + return genMqttCMDMsg(cmd, sb.toString(), runtime.IMEI()); + + } + public void handleLGZONE(Connection connection,Runtime runtime, String data){ + + /*** + * 获取服务器端时间(LGZONE) + * 终端发布(平台订阅): + * 终端向“WBG100/v1/LGZONE/ID_手表IMEI”的主题发布 [LEN,区域id] + * + * 实例:若手表IMEI号为334588000000156,请求绑定时下发的区域id为123456789, + * 则向WBG100/v1/LGZONE/ID_334588000000156的主题发布 [0009,123456789] + * + * 终端订阅(平台发布): + * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,会收到平台的回应 + * 平台发布的子主题为:LGZONE + * 回应的消息为:[LEN, 时区,时间,日期] + * + * 实例: 若手表IMEI号为334588000000156,绑定的区域为123456789, + * 则终端订阅“WBG100/v1/ID_334588000000156/+”的主题列表,会收到平台的回应 + * 先判断子主题是否为:LGZONE + * 是,则消息为:[001D,+8,08:00:00,2016-01-12] + * 实例表示:东八区,上午8 点整 + + */ + String[] list=data.split(CMDSPLIT); + if (list.length==4){ + String timeZone=list[1].trim(); + String date=list[3].trim(); + String time=list[2].trim(); + Date datetime= TimeUtil.parseDatetiime(date,time); + + int timezone; + try + { + timezone=Integer.parseInt(timeZone.replace("+","").trim()); + }catch (Exception e){ + ICLogger.e("timezone",e); + timezone=8; + } + + if (datetime!=null){ + ICLogger.i("==="+timezone+" "+TimeUtil.getDefaultTimeZone()); + TimeUtil.setTimeZone(timezone); + + + ICLogger.i("==="+TimeUtil.getDefaultTimeZone()); + TimeUtil.setSysDateTime(runtime.getContextProxy().context,datetime,timezone); + ICLogger.i("==="+TimeUtil.getDefaultTimeZone()); + + } +// Set Datetime 20200505112734 +// Set TimeZone 8 + + }else{ + ICLogger.i("LGZONE Format Error!"); + } + + + } + + public static StringMessage AL(Runtime runtime){ +/*** + * 报警数据上报(AL) + * 终端发布(平台订阅): + * 终端向“WBG100/v1/AL/ID_手表IMEI”的主题发布 [LEN,位置数据(见附录一),区域id] + * + * 终端订阅(平台发布): + * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,会收到平台的回应 + * 平台发布的子主题为:AL + * 回应的消息为:[LEN, AL] + * + * 说明:终端产生警情后发送报警信息到平台,若终端没有收到回复,则定时上报直到收到报警确认为止. + */ + if(runtime.bleInfo.ble_area_id.isEmpty()){ + return null; + } + StringBuilder sb = new StringBuilder(); + String cmd = cmdMap.get(CMD_TYPE.AL); + sb.append(TimeUtil.getUTCSystemDateYYMMDD()) + .append(CMDSPLIT).append(TimeUtil.getUTCSystemTimeHHmmss()) + .append(CMDSPLIT).append(runtime.getMqttGPSData()) + .append(CMDSPLIT).append(String.format("%03d", abs(runtime.getSignalStrength()))) + .append(CMDSPLIT).append(runtime.getBattery()) + .append(CMDSPLIT).append(runtime.getTotalStepCount()) + .append(CMDSPLIT).append(runtime.getRolltimes()) + .append(CMDSPLIT).append(runtime.getFZDDevStatus(runtime)) + .append(CMDSPLIT).append(runtime.getFZDLBSMultiStationData()) + .append(CMDSPLIT).append(runtime.getFZDWifiData()) + .append(CMDSPLIT).append(runtime.bleInfo.is_in_area ? "1" : "0") + .append(CMDSPLIT).append(runtime.bleInfo.ble_area_id); + return genMqttCMDMsg(cmd, sb.toString(), runtime.IMEI()); + + } + + + public static StringMessage UPLOAD(Runtime runtime){ + + + return genMqttCMDMsg(cmdMap.get(CMD_TYPE.UPLOAD),runtime.bleInfo.ble_area_id,runtime.IMEI()); + } + + public void handleUPLOAD(Connection connection,Runtime runtime,String cmd,String data){ + /** + * 数据上传间隔设置(UPLOAD) + * 平台发布(终端订阅): + * 平台向“WBG100/v1/ID_手表IMEI/UPLOAD”的主题发布 [LEN, 时间间隔] + * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为UPLOAD + * + * 终端发布(平台订阅): + * 终端收到数据,向“WBG100/v1/ID_手表IMEI/UPLOAD”的主题发布回应 + * [LEN,区域id] + */ + connection.send(UPLOAD(runtime)); + String[] list=data.split(CMDSPLIT); + if (TextUtils.isDigitsOnly(list[1].trim())) { + try { + int timesecond = Integer.parseInt(list[1].trim()); + int mod = runtime.getLocationInstance().getWorkingMod(); + log("LOCATION_MODE " + LOCATION_MODE + " mod " + mod + " cycle " + timesecond); + Config.setLocationMode(runtime.getContextProxy().context, mod); + Config.setLocationCycle(runtime.getContextProxy().context, timesecond); + runtime.getLocationInstance().setLocation_cycle(timesecond); + runtime.getLocationInstance().setWorkingMod(mod); + CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod()); + }catch (Exception e){ + ICLogger.e(e.getMessage(),e); + } + //此处设置好配置后,会在LocationClient通过消息开始执行及时定位操作。 + }else{ + ICLogger.i("UPLOAD format error!"); + } + } + + public static StringMessage heart(int hrt,Runtime runtime){ + /*** + * 终端心率上传(heart) + * 终端发布(平台订阅): + * 终端向“WBG100/v1/heart/ID_手表IMEI”的主题发布 [LEN,x,区域id] + * x 表示每分钟的心跳次数 + * + * 平台不需要回复 + * 说明:终端按照设定间隔上报,不需要平台回复. + */ + return genMqttCMDMsg(cmdMap.get(CMD_TYPE.heart),String.valueOf(hrt),runtime.IMEI()); + } + public static StringMessage oxygen(int ox ,Runtime runtime){ + /*** + * + * 上传血氧数据(oxygen) + * 终端发布(平台订阅): + * 终端向“WBG100/v1/oxygen/ID_手表IMEI”的主题发布 [LEN,x,区域id] + * x 表示血氧饱和度 + * + * 平台不需要回复 + * 说明:终端按照设定间隔上报,不需要平台回复. + */ + return genMqttCMDMsg(cmdMap.get(CMD_TYPE.oxygen),String.valueOf(ox),runtime.IMEI()); + } + + public static StringMessage blood(int pbl,int pbh, Runtime runtime){ + /*** + * 上传血压数据(blood) + * 终端发布(平台订阅): + * 终端向“WBG100/v1/blood/ID_手表IMEI”的主题发布 [LEN,x,y,区域id] + * x 是收缩压(高压) + * y 是舒张压(低压) + * + * 平台不需要回复 + * 说明:终端按照设定间隔上报,不需要平台回复. + * + */ + String data=pbh+CMDSPLIT+pbl; + return genMqttCMDMsg(cmdMap.get(CMD_TYPE.blood),data,runtime.IMEI()); + } + + public static StringMessage temp(double temp,Runtime runtime){ + /*** + * 上传体温数据(temp) + * 终端发布(平台订阅): + * 终端向“WBG100/v1/temp/ID_手表IMEI”的主题发布 [LEN,x.x,区域id] + * X.X: 当前测到温度值,若测到温度为36.2,则 x.x=36.2 + * + * 平台不需要回复 + * 说明:终端按照设定间隔上报,不需要平台回复. + */ + + return genMqttCMDMsg(cmdMap.get(CMD_TYPE.temp),String.format("%.1f",temp ),runtime.IMEI()); + } + + public static StringMessage wdstart(Runtime runtime){ + return genMqttCMDMsg(cmdMap.get(CMD_TYPE.wdstart),runtime.bleInfo.ble_area_id,runtime.IMEI()); + } + public void handleWdstart(Connection connection,Runtime runtime ,String data) { + +/*** + * 设置体温上传频率(wdstart) + * 平台向“WBG100/v1/ID_手表IMEI/wdstart”的主题发布 [LEN, x] + * x 为上传间隔时间,单位秒,连续上传时最小时间不小于300 秒,最大不超过65535. + * x 为1 则代表终端心率单次上传,上传完后自动关闭。 + * x 为0 则代表终端心率上传关闭。 + * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为wdstart + * + * 终端发布(平台订阅): + * 终端收到数据,向“WBG100/v1/ID_手表IMEI/ wdstart”的主题发布回应 + * [LEN,区域id] + */ + connection.send(wdstart(runtime)); + String[] list=data.split(CMDSPLIT); + if (list.length==2){ + String cycle=list[1]; + if (TextUtils.isDigitsOnly(cycle.trim())){ + try { + int cycle_int = Integer.parseInt(cycle.trim()); + ICLogger.i("收到服务器指令:设置体温上传频率 " + cycle + "秒"); + + Config.setTemperatureTestCycle(runtime, cycle_int); + CoreService.getInstance().setTempAlarm(); + if(runtime.check_stat_do_temp_test()) TemperatureUtil.doTempTestInThread(); + }catch (Exception e){ + ICLogger.e(e.getMessage(),e); + } + }else + { + ICLogger.i("wdstart Format Error!"); + } + }else + { + ICLogger.i("wdstart Format Error!"); + } + } + public static StringMessage hrtstart(Runtime runtime){ + return genMqttCMDMsg(cmdMap.get(CMD_TYPE.hrtstart),runtime.bleInfo.ble_area_id,runtime.IMEI()); + } + public void handleHrtstart(Connection connection,Runtime runtime, String data) { + /*** + * 设置心率、血氧、血压上传频率(hrtstart) + * 平台发布(终端订阅): + * 平台向“WBG100/v1/ID_手表IMEI/hrtstart”的主题发布 [LEN, x] + * x 为上传间隔时间,单位秒,连续上传时最小时间不小于300 秒,最大不超过65535. + * x 为1 则代表终端心率单次上传,上传完后自动关闭。 + * x 为0 则代表终端心率上传关闭。 + * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为hrtstart + * + * 终端发布(平台订阅): + * 终端收到数据,向“WBG100/v1/ID_手表IMEI/ hrtstart”的主题发布回应 + * [LEN,区域id] + */ + connection.send(hrtstart(runtime)); + String[] list=data.split(CMDSPLIT); + if (list.length==2){ + String cycle=list[1]; + if (TextUtils.isDigitsOnly(cycle.trim())){ + try { + int cycle_int = Integer.parseInt(cycle.trim()); + ICLogger.i("收到服务器指令:设置心率血压周期 " + cycle + "秒" + cycle_int / 60 + "分钟"); + + //发送重置PPGCycle的广播,会在CoreServer里面执行 + Intent intent = new Intent(); + intent.putExtra("PPGTestCycle", cycle_int / 60); + runtime.getContextProxy().sendBrodcast(ACTION_HEATR_RATE_START, intent); + }catch (Exception e){ + ICLogger.e(e.getMessage(),e); + } + }else + { + ICLogger.i("Hrtstart Format Error!"); + } + + }else{ + ICLogger.i("Hrtstart Format Error!"); + } + + } + + public static StringMessage SOS(Runtime runtime){ + return genMqttCMDMsg(cmdMap.get(CMD_TYPE.SOS),runtime.bleInfo.ble_area_id,runtime.IMEI()); + } + + + public void handleSOS(Connection connection,Runtime runtime,String cmd,String data) { +/*** + * 设置SOS 号码(SOS) + * 平台发布(终端订阅): + * 平台向“WBG100/v1/ID_手表IMEI/SOS”的主题发布 [LEN,电话号码,电话号码] + * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为SOS + * + * 终端发布(平台订阅): + * 终端收到数据,向“WBG100/v1/ID_手表IMEI/SOS”的主题发布回应 + * [LEN,区域id] + * + * 说明:设置SOS 号码后,触发sos 警情时,终端向设置的几个号码拨打电话,一直没有接听,则循环拨打两轮,接听后则不再继续拨打电话,同时发送报警短信给2 个sos 号码. + */ + connection.send(SOS(runtime)); + if (data!=null && data.length()>0) { + String list[] = data.split(CMDSPLIT); + if (list.length==2){ + ArrayList contactArray=new ArrayList(); + if (regexUtil.isMobileNumber( list[1]) || regexUtil.isPhoneNumber(list[1])) + { + contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos1",list[1])); + ICLogger.i("find SOS1 number "+list[1]); + runtime.getDbHelper().saveContacts(contactArray,false,false,false,false,false,true); + } + }else if (list.length==3){ + + ArrayList contactArray=new ArrayList(); + if (regexUtil.isMobileNumber( list[1]) || regexUtil.isPhoneNumber(list[1])) + { + contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos1",list[1])); + ICLogger.i("find SOS1 number "+list[1]); + } + if (regexUtil.isMobileNumber( list[2]) || regexUtil.isPhoneNumber(list[2])) + { + contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos2",list[2])); + ICLogger.i("find SOS2 number "+list[2]); + } + + runtime.getDbHelper().saveContacts(contactArray,false,false,false,false,false,true); + + }else{ + ICLogger.i("SOS Format Error!"); + } + }else + ICLogger.i("SOS Format Error!"); + + + } + + public static StringMessage FACTORY(Runtime runtime){ + return genMqttCMDMsg(cmdMap.get(CMD_TYPE.FACTORY),runtime.bleInfo.ble_area_id,runtime.IMEI()); + } + + + public void handleFactory(Connection connection,Runtime runtime,String cmd,String data) { +/*** + * 恢复出厂设置(FACTORY) + * 平台发布(终端订阅): + * 平台向“WBG100/v1/ID_手表IMEI/FACTORY”的主题发布 [LEN,FACTORY] + * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为FACTORY + * + * 终端发布(平台订阅): + * 终端收到数据,向“WBG100/v1/ID_手表IMEI/FACTORY”的主题发布回应 + * [LEN,区域id] + * + * 说明:终端恢复出厂设置,里面设置的号码都将清空 + */ + connection.send(FACTORY(runtime)); + } + + + public static StringMessage MSGDOWN(Runtime runtime,String index){ + String data=new StringBuffer(index).append(CMDSPLIT).append(runtime.bleInfo.ble_area_id).toString(); + return genMqttCMDMsg(cmdMap.get(CMD_TYPE.MSGDOWN),data,runtime.IMEI()); + } + + + public void handleMSGDOWN(Connection connection,Runtime runtime,String cmd,String data) { + +/** + * 消息下发到指定手表(MSGDOWN) + * 平台发布(终端订阅): + * 平台向“WBG100/v1/ID_手表IMEI/MSGDOWN”的主题发布 [LEN,包序号,具体消息] + * + * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为MSGDOWN + * + * 终端发布(平台订阅): + * 终端收到数据,向“WBG100/v1/ID_手表IMEI/MSGDOWN”的主题发布回应 + * [LEN,包序号,区域id] + * + * 说明: + * 终端回应的包序号与平台发送的包序号一致,每次发送平台包需要加1,确保每包消息的包序号唯一。 + * 具体消息为英文,ASCII格式,长度不超过512个字节 + */ + + String[] cmdlist=data.split(CMDSPLIT); + if (cmdlist.length == 3){ + String cmdindex=cmdlist[1]; + String txtmsg=cmdlist[2]; + StringMessage msg=MSGDOWN(runtime,cmdindex); + connection.send(msg); + ICLogger.i("received Txt Msg "+txtmsg); + runtime.getContextProxy().sendMsgBroadcast(txtmsg,0); + runtime.getContextProxy().saveMstToSMSDB(txtmsg); + }else{ + ICLogger.i("MSGDOWN format error!"); + } + } + public static StringMessage REMOVE(Runtime runtime){ + return genMqttCMDMsg(cmdMap.get(CMD_TYPE.REMOVE),runtime.bleInfo.ble_area_id,runtime.IMEI()); + } + + + public void handleREMOVE(Connection connection,Runtime runtime,String cmd,String data) { + + /** + * 取下手环报警开关(REMOVE) + * 平台发布(终端订阅): + * 平台向“WBG100/v1/ID_手表IMEI/REMOVE”的主题发布 [LEN,0 或者1] + * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为REMOVE + * + * 终端发布(平台订阅): + * 终端收到数据,向“WBG100/v1/ID_手表IMEI/REMOVE”的主题发布回应 + * [LEN,区域id] + * + * 说明:手表拆除报警的开关,1 打开,0 关闭. + */ + connection.send(REMOVE(runtime)); + String[] cmdlist=data.split(CMDSPLIT); + if (cmdlist.length == 2){ + String cmdindex=cmdlist[1]; + ICLogger.i("设置REMOVE "+cmdindex); + }else{ + ICLogger.i("REMOVE format error!"); + } + } + + public static StringMessage PEDO(Runtime runtime){ + return genMqttCMDMsg(cmdMap.get(CMD_TYPE.PEDO),runtime.bleInfo.ble_area_id,runtime.IMEI()); + } + + + public void handlePEDO(Connection connection,Runtime runtime,String cmd,String data) { + + /*** + * 计步功能开关(PEDO) + * 平台发布(终端订阅): + * 平台向“WBG100/v1/ID_手表IMEI/PEDO”的主题发布 [LEN,0 或者1] + * 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为PEDO + * + * 终端发布(平台订阅): + * 终端收到数据,向“WBG100/v1/ID_手表IMEI/PEDO”的主题发布回应 + * [LEN,区域id] + * + * 说明: 终端计步功能的开关.1 打开,0 关闭 + */ + connection.send(PEDO(runtime)); + String[] cmdlist=data.split(CMDSPLIT); + if (cmdlist.length == 2){ + String cmdindex=cmdlist[1]; + ICLogger.i("设置PEDO "+cmdindex); + }else{ + ICLogger.i("PEDO format error!"); + } + } + + public static StringMessage MONITOR(Runtime runtime){ + return genMqttCMDMsg(cmdMap.get(CMD_TYPE.MONITOR),runtime.bleInfo.ble_area_id,runtime.IMEI()); + } + + + public void handleMONITOR(Connection connection,Runtime runtime,String cmd,String data) { + + /*** + 监听(MONITOR) + 平台发布(终端订阅): + 平台向“WBG100/v1/ID_手表IMEI/MONITOR”的主题发布 [LEN,电话号码] + 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为MONITOR + + 终端发布(平台订阅): + 终端收到数据,向“WBG100/v1/ID_手表IMEI/ MONITOR”的主题发布回应 + [LEN,区域id] + + 说明:终端收到该指令后会自动回拨给设置的电话号码,电话号码为CENTER时,回拨给中心号码. + */ + connection.send(MONITOR(runtime)); + String[] cmdlist=data.split(CMDSPLIT); + if (cmdlist.length == 2){ + String cmdindex=cmdlist[1]; + ICLogger.i("设置MONITOR 号码 "+cmdindex); + }else{ + ICLogger.i("MONITOR format error!"); + } + } + + + public static StringMessage CENTER(Runtime runtime){ + return genMqttCMDMsg(cmdMap.get(CMD_TYPE.CENTER),runtime.bleInfo.ble_area_id,runtime.IMEI()); + } + + + public void handleCENTER(Connection connection,Runtime runtime,String cmd,String data) { + + /*** + 中心号码设置(CENTER) + 平台发布(终端订阅): + 平台向“WBG100/v1/ID_手表IMEI/CENTER”的主题发布 [LEN,电话号码] + 终端订阅“WBG100/v1/ID_手表IMEI/+”的主题列表,判断子主题是否为CENTER + + 终端发布(平台订阅): + 终端收到数据,向“WBG100/v1/ID_手表IMEI/CENTER”的主题发布回应 + [LEN,区域id] + 说明:设置中心号码,通过该手机号码可发送短信指令。同时终端的各种报警短信会发送到该号码的手机上面 + */ + connection.send(CENTER(runtime)); + String[] cmdlist=data.split(CMDSPLIT); + if (cmdlist.length == 2){ + String cmdindex=cmdlist[1]; + ICLogger.i("设置CENTER 号码 "+cmdindex); + }else{ + ICLogger.i("CENTER format error!"); + } + } + public void sendBroadcast(String cmd, Runtime dev) { + + ComponentName componentName = new ComponentName("com.eqc.watch", "com.eqc.watch.launcher.ChatActivity"); + Intent intent = new Intent("android.intent.action.MAIN"); +// intent.putExtra("ACTIVITY_TYPE", 2); +// intent.addCategory("android.intent.category.DEFAULT"); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.setComponent(componentName); + dev.getContextProxy().context.startActivity(intent); + } + + public boolean handleCmd(CMD_TYPE type, String cmd , String data) { + + //普通非二进制命令用此函数处理 + boolean ret=true; + ICLogger.i("mqtt handleCmd "+type.name() + " strLen="+data.length()); + + switch (type){ + + case KA: + ICLogger.i("服务器收到心跳包KA"); + mConnection.DeliverCMDMessageToSystem("heartbeat",cmd);//通知下面线程状态变化 + break; + + case BREQ: + handleBREQ(mRuntime,data); + //ICLogger.i("服务器返回Ping绑定信息"); + ICLogger.i("服务器收到登录包BREQ"); + mConnection.DeliverCMDMessageToSystem("login",cmd);//通知下面线程状态变化 + break; + case LGZONE: + handleLGZONE(mConnection,mRuntime,data); + break; + + case UD: + mConnection.DeliverCMDMessageToSystem("UD",cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了 + break; + + case AL: + mConnection.DeliverCMDMessageToSystem("AL",cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了 + break; + + case PEDO: + handlePEDO(mConnection,mRuntime,cmd,data); + mConnection.DeliverCMDMessageToSystem("PEDO",cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了 + break; + + case REMOVE: + handleREMOVE(mConnection,mRuntime,cmd,data); + mConnection.DeliverCMDMessageToSystem("REMOVE",cmd);//通知下面线程状态变化 + break; + case CENTER: + handleCENTER(mConnection,mRuntime,cmd,data); + mConnection.DeliverCMDMessageToSystem("CENTER",cmd);//通知下面线程状态变化 + + break; + case MONITOR: + handleMONITOR(mConnection,mRuntime,cmd,data); + mConnection.DeliverCMDMessageToSystem("MONITOR",cmd);//通知下面线程状态变化 + + break; +// case CR: +// //立即定位指令(长链接有效) +// handleCR(mConnection); +// mConnection.DeliverCMDMessageToSystem("StartLocate",cmd);//通知下面线程状态变化 +// break; + +// case BP07: +// //收到发送的语音包 +// handleBP07(cmd,mConnection); +// break; +// case BP10: +// //报警包 +// mConnection.DeliverCMDMessageToSystem("AP10",cmd);//通知下面线程状态变化 +// break; +// +// case BPTM: +// //校时命令 +// handleBPTM(cmd); +// ICLogger.i("服务器收到校时命令APTM"); +// mConnection.DeliverCMDMessageToSystem("APTM",cmd);//通知下面线程状态变化 +// break; +// case BP85://设置闹钟 +// handleBP85(cmd,mConnection,mRuntime); +// ICLogger.i("收到服务器设置闹钟命令BP85"); +// mConnection.DeliverCMDMessageToSystem("AP85",cmd);//通知下面线程状态变化 +// break; + case UPLOAD: + //设置工作模式 + handleUPLOAD(mConnection,mRuntime,cmd,data); + mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化 + + break; +// case BP34: +// //设置工作模式 +// handleBP34(mConnection,mRuntime,cmd); +// mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化 +// break; +// +//// case BP05: //L02服务器不适用 +//// //查询服务器语音 返回信息 +//// API.handleBP05(cmd); +//// break; +// + case SOS: + //收到设置SOS号码 + handleSOS(mConnection,mRuntime,cmd,data); + ICLogger.i("收到服务器设置SOS号码命令BP12"); + break; +// case PHL: +// //收到设置白名单号码 +// ICLogger.i("收到服务器设置白名单号码命令BP14"); +// handlePHL(mConnection,mRuntime,cmd,data); +// break; +// case BP15: +// handleBP15(cmd,mConnection,mRuntime); +// ICLogger.i("收到服务器设置定位命令BP15"); +// break; + case FACTORY: + //收到恢复出厂设置 + handleFactory(mConnection,mRuntime,cmd,data); + ICLogger.i("收到服务器恢复出厂设置命令"); + mConnection.DeliverCMDMessageToSystem("FactoryReset",cmd);//通知下面线程状态变化 + break; +// +// case BP18: +// //收到重启 +// handleBP18(mConnection,cmd); +// ICLogger.i("收到服务器重启命令BP18"); +// mConnection.DeliverCMDMessageToSystem("Reboot",cmd);//通知下面线程状态变化 +// break; +// + + case MSGDOWN: + //服务器推送文本 + handleMSGDOWN(mConnection,mRuntime,cmd,data); + ICLogger.i("收到服务器推送文本消息"); +// mConnection.DeliverCMDMessageToSystem("showTxt",cmd);//通知下面线程状态变化 + break; + + case hrtstart: + handleHrtstart(mConnection,mRuntime,data); + ICLogger.i("收到服务器心率检测命令"); + if(mRuntime.check_stat_do_ppg_test()) HeartRateManager.triggerPPGtest(); + break; + + case wdstart: + handleWdstart(mConnection,mRuntime,data); + ICLogger.i("收到服务器体温测试及设置命令"); + break; + case blood: + ICLogger.i("服务器收到上传的血压"); + mConnection.DeliverCMDMessageToSystem("blood",cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了 + break; + case oxygen: + ICLogger.i("服务器收到上传的血氧"); + mConnection.DeliverCMDMessageToSystem("oxygen",cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了 + break; + case temp: + ICLogger.i("服务器收到上传的体温"); + mConnection.DeliverCMDMessageToSystem("temp",cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了 + break; + case heart: + ICLogger.i("服务器收到上传的心率heart"); + mConnection.DeliverCMDMessageToSystem("heart",cmd);//通知下面线程状态变化,用Deliver发送的话必须发,表示服务器响应了 + break; +// case BP84: +// handleBP84(cmd,mConnection); +// ICLogger.i("收到服务器白名单命令"); +// break; +// +// case BP86: +// //绑定解绑消息 +// handleBP86(cmd,mConnection,mRuntime); +// mConnection.DeliverCMDMessageToSystem("AP86",cmd);//通知下面线程状态变化 +// +// break; +// + + +// case BP89: +// //心率/血压阀值 +// handleBP89(cmd,mConnection); +// mConnection.DeliverCMDMessageToSystem("AP89",cmd);//通知下面线程状态变化 +// break; +// +// case BPTE: //设置测试体温 +// handleBPTE(cmd,mConnection,mRuntime); +// mConnection.DeliverCMDMessageToSystem("APTE",cmd);//通知下面线程状态变化 +// break; +// +// case BPTP: +// handleBPTP(); +// mConnection.DeliverCMDMessageToSystem("APTP",cmd);//通知下面线程状态变化 +// break; +// case BPHP: +// handleBPHP(); +// mConnection.DeliverCMDMessageToSystem("IWAPHP",cmd);//通知下面线程状态变化 +// break; +// case BPX1://设置 心率血压血氧修正值 +// handleBPX1(cmd,mConnection,mRuntime); +// ICLogger.i("收到服务器设置 心率血压血氧修正值BPX1"); +// mConnection.DeliverCMDMessageToSystem("APX1",cmd);//通知下面线程状态变化 +// break; +// +// case BPS4: //提醒设置(时间段) 主要为久坐设置提醒时长。 +// handleBPS4(cmd,mConnection,mRuntime); +// ICLogger.i("收到 提醒设置(时间段)"); +// mConnection.DeliverCMDMessageToSystem("APS4",cmd);//通知下面线程状态变化 +// break; +// case BPDE: +// handleBPDE(mConnection,cmd,mRuntime); +// ICLogger.i(" 收到 进出围栏通知!"); +// mConnection.DeliverCMDMessageToSystem("APDE",cmd);//通知下面线程状态变化 +// break; +// +// case BPTU: +// handleBPTU(cmd, mConnection); +// ICLogger.i("收到服务器 图片语音 消息 BPTU"); +// // mConnection.DeliverCMDMessageToSystem("APTU", "");//通知下面线程状态变化 +// break; +// case BPDF: +// handleBPDF(mConnection,cmd,mRuntime); +// ICLogger.i(" 收到 体温阈值设置!"); +// mConnection.DeliverCMDMessageToSystem("APDF",cmd);//通知下面线程状态变化 +// break; + + } + + return ret; + + } + + + public boolean handleCmd(CMD_TYPE type, String cmd, byte[] bytes) { + + //只有需要传递二级制数据的才需要这个函数,目前只有BP28需要 + + boolean ret=true; + ICLogger.i("handleCmd "+type.name() + " "+cmd+" bytelen="+bytes.length ); + if (Config.LOG_TOFILE) ICLogger.logToFile("APILog", " recv " +new String(bytes)); +// switch (type) { +// case LK: +// // handleBP28(mConnection,cmd, mRuntime,bytes); +// ICLogger.i("收到服务器语音BP28"); +// mConnection.DeliverCMDMessageToSystem("BP28", "");//通知下面线程状态变化 +// break; +// } + return ret; + } + +} diff --git a/app/version_code.properties b/app/version_code.properties index da93444b..3c5cd34e 100644 --- a/app/version_code.properties +++ b/app/version_code.properties @@ -1,2 +1,2 @@ -#Tue Dec 01 19:24:13 CST 2020 -VERSION_CODE=720 +#Thu Dec 03 09:50:50 CST 2020 +VERSION_CODE=722