From: snickersun Date: Mon, 6 Jul 2020 08:41:35 +0000 (+0800) Subject: 添加协议protocol_ic.java, 把ic公版协议和beehome区分开。 X-Git-Url: http://git.snicker.com.cn/Users/apple/Desktop/static/gitweb.css?a=commitdiff_plain;h=0b947d449025537ca98958506d91982172d1a2b1;p=protocol_srv.git 添加协议protocol_ic.java, 把ic公版协议和beehome区分开。 --- diff --git a/app/src/main/java/com/enqualcomm/support/Config.java b/app/src/main/java/com/enqualcomm/support/Config.java index a5326756..67c99dae 100644 --- a/app/src/main/java/com/enqualcomm/support/Config.java +++ b/app/src/main/java/com/enqualcomm/support/Config.java @@ -444,7 +444,8 @@ public class Config { public static final int PROTOCOL_JIAI=0; public static final int PROTOCOL_BEEHOME=1; - public static final int PROTOCOL_FZD=2; + public static final int PROTOCOL_IC=2; + public static final int PROTOCOL_FZD=3; public static int protocol_no=getProtocolNumber(); public static int getProtocolNumber(){ @@ -459,17 +460,19 @@ public class Config { case PROTOCOL_BEEHOME: ICLogger.i("协议 BEEHOME"); break; - + case PROTOCOL_IC: + ICLogger.i("协议 IC"); + break; case PROTOCOL_FZD: ICLogger.i("协议 FZD"); break; default: - ICLogger.i("协议版本 目前支持0,1,2"); + ICLogger.i("协议版本 目前支持0,1,2,3 。"); break; } }else{ - ICLogger.i("协议版本要是数字目前支持0,1"); + ICLogger.i("协议版本要是数字,目前支持0,1,2 。"); } protocol_no=ret; return ret; @@ -511,5 +514,16 @@ public class Config { public static int getSPo2Adjust(Context context){ return SharPreferenceUtil.getPrefInt(context,KeySPo2adust, 0); } + + public static void loadPPG_BPH_BPL_SPO2_adjustvalue(Context context,Runtime runtime){ + int ppgadj,bphadj,bpladj,spo2adj; + ppgadj=getPPGAdjust(context); + bphadj=getBPHAdjust(context); + bpladj=getBPLAdjust(context); + spo2adj=getSPo2Adjust(context); + runtime.getHRS().setAdjust(ppgadj,bphadj,bpladj,spo2adj); + ICLogger.i("Load Health adjust value ppg "+ppgadj+", bph "+bphadj+", bpl "+bpladj+", spo2 "+spo2adj); + + } } diff --git a/app/src/main/java/com/enqualcomm/support/CoreService.java b/app/src/main/java/com/enqualcomm/support/CoreService.java index 734f0295..f32d67b4 100644 --- a/app/src/main/java/com/enqualcomm/support/CoreService.java +++ b/app/src/main/java/com/enqualcomm/support/CoreService.java @@ -540,6 +540,10 @@ public class CoreService extends Service { runtime.temperature_adjustValue= TemperatureUtil.getTempAdjustValue(); Config.loadTemperatureSettings(runtime); + + //加载存储的健康数据校准值 + Config.loadPPG_BPH_BPL_SPO2_adjustvalue(this,runtime); + this.connectionServiceChain.processAttach(this.connection, this.runtime); this.invokeHandlerServiceChain.processAttach(this.connection, this.runtime); // setAlarm(alarmCycle); diff --git a/app/src/main/java/com/enqualcomm/support/ICSmsManager.java b/app/src/main/java/com/enqualcomm/support/ICSmsManager.java index aebc7250..f087fa64 100644 --- a/app/src/main/java/com/enqualcomm/support/ICSmsManager.java +++ b/app/src/main/java/com/enqualcomm/support/ICSmsManager.java @@ -177,6 +177,10 @@ public class ICSmsManager { } return sms; } + + /* + * return false表示不是命令, true表示是命令,且已经执行 + * */ public boolean handleSMS_CMD(String phonenumber, String sms){ if (isAdminNumber(phonenumber)) { @@ -184,11 +188,33 @@ public class ICSmsManager { if (ENCRYPED_HEADER.equals(Config.DefaultSMSPassword)) { ENCRYPED_HEADER = ""; } + + if (sms == null || sms.trim().isEmpty()) return false; + sms=sms.trim(); if (sms.equals(ENCRYPED_HEADER + "#logctl#=upload,all")){ sms=ENCRYPED_HEADER+"#logctl#=upload,SDLog:Android/ic"; } - if (sms == null || sms.isEmpty()) return false; + //$HX,SSER,OK,91.201.4.79,5018,C,589883 + if (sms.startsWith(ENCRYPED_HEADER+"$HX,SSER,OK,")){ + String[] tmplist=sms.split(","); + if (tmplist.length==7){ + String ServeriIp=tmplist[3]; + String ServerPort=tmplist[4]; + String imeiend=tmplist[6]; + if (runtime.IMEI().endsWith(imeiend)) { + sms=ENCRYPED_HEADER+"#IP#="+ServeriIp+":"+ServerPort+"#"; + ICLogger.i("收到客户自定义 服务器IP设置命令,转化为 #IP#命令!"); + }else{ + sendSMS(phonenumber, imeiend+" IMEI 校验错误!"); + return true; + } + }else{ + ICLogger.i(" 设置 Server IP 命令错误。"); + sendSMS(phonenumber, sms+" 格式错误!"); + return true; + } + } if (sms.startsWith(ENCRYPED_HEADER+"#apn#=") && sms.endsWith("#")) { String[] tmp = sms.split("#"); if (tmp.length == 3) { diff --git a/app/src/main/java/com/ic/protocols/protocolAPIHelper.java b/app/src/main/java/com/ic/protocols/protocolAPIHelper.java index 5bbef4af..65907d8c 100644 --- a/app/src/main/java/com/ic/protocols/protocolAPIHelper.java +++ b/app/src/main/java/com/ic/protocols/protocolAPIHelper.java @@ -11,12 +11,15 @@ public class protocolAPIHelper { private protocol_jiai protocoljiai_handler=null; private protocol_beehome protocolbeehome_handler=null; + private protocol_ic protocolic_handler=null; public protocolAPIHelper(NettyConnection connect,Runtime runtime) { ICLogger.i("init Protocol "+Config.getProtocolNumber()); if (protocolbeehome_handler==null) protocolbeehome_handler=new protocol_beehome(connect,runtime); if (protocoljiai_handler==null) protocoljiai_handler=new protocol_jiai(connect,runtime); + if (protocolic_handler==null) + protocolic_handler=new protocol_ic(connect,runtime); } /* 返回true 表示 cmd 全部解析成功 @@ -33,6 +36,9 @@ public class protocolAPIHelper { case 1: protocolbeehome_handler.parserCmd(bytes); break; + case 2: + protocolic_handler.parserCmd(bytes); + break; } return true; } @@ -52,6 +58,9 @@ public class protocolAPIHelper { case 1: ret=protocol_beehome.APTP(temp_adusted,body_temp); break; + case 2: + ret=protocol_ic.APTP(temp_adusted,body_temp); + break; } return ret; } @@ -65,6 +74,9 @@ public class protocolAPIHelper { case 1: ret=protocol_beehome.AP10(runtime); break; + case 2: + ret=protocol_ic.AP10(runtime); + break; } return ret; } @@ -79,6 +91,9 @@ public class protocolAPIHelper { case 1: ret=protocol_beehome.AP00(runtime); break; + case 2: + ret=protocol_ic.AP00(runtime); + break; } return ret; } @@ -93,6 +108,9 @@ public class protocolAPIHelper { case 1: ret=protocol_beehome.AP03(runtime); break; + case 2: + ret=protocol_ic.AP03(runtime); + break; } return ret; } @@ -107,6 +125,9 @@ public class protocolAPIHelper { case 1: ret=protocol_beehome.AP01(runtime); break; + case 2: + ret=protocol_ic.AP01(runtime); + break; } return ret; } @@ -120,6 +141,9 @@ public class protocolAPIHelper { case 1: ret=protocol_beehome.AP02(runtime); break; + case 2: + ret=protocol_ic.AP02(runtime); + break; } return ret; } @@ -134,6 +158,9 @@ public class protocolAPIHelper { case 1: ret=protocol_beehome.AP07(packetTime,count,index,datalen,amrdata); break; + case 2: + ret=protocol_ic.AP07(packetTime,count,index,datalen,amrdata); + break; } return ret; } @@ -148,6 +175,9 @@ public class protocolAPIHelper { case 1: ret=protocol_beehome.APHP(runtime); break; + case 2: + ret=protocol_ic.APHP(runtime); + break; } return ret; } @@ -162,6 +192,9 @@ public class protocolAPIHelper { case 1: ret=protocol_beehome.APHT(ppg,bph,bpl); break; + case 2: + ret=protocol_ic.APHT(ppg,bph,bpl); + break; } return ret; } @@ -177,6 +210,9 @@ public class protocolAPIHelper { case 1: ret=protocol_beehome.APHP(ppg,bph,bpl,spo2); break; + case 2: + ret=protocol_ic.APHP(ppg,bph,bpl,spo2); + break; } return ret; } diff --git a/app/src/main/java/com/ic/protocols/protocol_beehome.java b/app/src/main/java/com/ic/protocols/protocol_beehome.java index ec49e1b3..17af63fb 100644 --- a/app/src/main/java/com/ic/protocols/protocol_beehome.java +++ b/app/src/main/java/com/ic/protocols/protocol_beehome.java @@ -401,7 +401,8 @@ public class protocol_beehome { * IWAP10080524A2232.9806N11404.9355E000.1061830323.8706000908000502, * 460,0,9520,3671, * 00,zh-cn,00, - * 00为报警状态,00为无任何报警(01:SOS,02:低电,03:脱落报警,04:佩戴提醒,05/06:跌倒报警)) + * 00为报警状态,00为无任何报警(01:SOS,02:低电,03:脱落报警,04:佩戴提醒,05/06:跌倒报警)) IC,即爱 + * 00为报警状态,00为无任何报警(01:SOS,02:低电,03:脱落报警,04:佩戴提醒,05:剪断报警,06:跌倒报警,07:心率异常, 08:心率过高, 09:心率过低,10收缩压过高,11收缩压过低,12舒张压过高,13舒张压过低) * zh-cn:设备语言 * 00:第一个0:是否需要回复地址信息,0:不回复,1回复. * HOME|74-DE-2B-44-88-8C|97&HOME1|74-DE-2B-44-88-8C|97&HOME2|74-DE-2B-44-88-8C|97&HOME3|74-DE-2B-44-88-8C|97# @@ -1688,7 +1689,6 @@ public class protocol_beehome { Config.setBPLAdjust(mRuntime.getContextProxy().context,bpl_adjust); Config.setSPo2Adjust(mRuntime.getContextProxy().context,spo2_adjust); - ICLogger.i("Handle BPX1 IMEI "+imei+",index "+index+", BPH "+strBPH+", BPL "+strBPL+", PPG "+ strXL +", Sp02 "+ strSpO2); }else{ ICLogger.i("BPX1 format error!"); diff --git a/app/src/main/java/com/ic/protocols/protocol_ic.java b/app/src/main/java/com/ic/protocols/protocol_ic.java new file mode 100644 index 00000000..73d12dbd --- /dev/null +++ b/app/src/main/java/com/ic/protocols/protocol_ic.java @@ -0,0 +1,2021 @@ +package com.ic.protocols; + +import android.content.ComponentName; +import android.content.Intent; +import android.net.Uri; +import android.os.Environment; + +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.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.NettyConnection; +import com.enqualcomm.support.utils.TemperatureUtil; +import com.enqualcomm.support.utils.TimeUtil; +import com.enqualcomm.support.utils.Util; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; + +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_ic { + private static final String TAG = "ICSrv." + protocol_ic.class.getSimpleName(); + + private static final String CMDHEADER = "IW"; + private static final String CMDEND = "#"; + private static final String CMDSPLIT = ","; + public enum CMD_TYPE { + /*终端发起*/ + AP00,//登录包 + BP00, + AP01,//混合定位 + BP01, + AP02,//多基站定位 + BP02, + AP92,//CDMA 混合定位 + BP92, + AP03,//心跳包 + BP03, + AP05,//语音查询接收 + BP05, + AP07,//语音上行 + BP07, + AP10,//报警与地址回复 + BP10, + AP49,//心率上传 + BP49, + APHT,//心率血压上传 + BPHT, + APTM,//基站校时及获取定位 + BPTM, + /* 服务器发起*/ + AP12, + BP12,//SOS 号码设置 + AP14, + BP14,//设置联系人白名单 + AP15, + BP15,//设置定位周期 + AP16, + BP16,//立即定位 + AP17, + BP17,//恢复出厂设置 + AP18, + BP18,//重启设备 + AP21, + BP21,//设置计步开关 + AP28, + BP28, //语音下行 + AP31, + BP31,//关机 + AP33, + BP33,//工作模式 + AP34, + BP34,//自定义工作模式 + AP40, + BP40,//下发文本 + AP68, + BP68,//绑定解绑 + APXL, + BPXL,//测量心率 + APXY, + BPXY,//测量血压 + APJZ, + BPJZ,//血压校准 + AP84, + BP84,//白名单开关 + AP85, + BP85,//设置闹钟 + AP86, + BP86,//绑定解绑 + AP88, + BP88,//查找手表 + AP89, + BP89,//心率血压阀值设置 + APTE, + BPTE,//体温间隔设置 + APTP, + BPTP,//体温上行 + APX1, + BPX1,//心率血压血氧修正 + APS4, + BPS4,//提醒设置(时间段) + APHP,//上报心率血压血氧 + BPHP, + UNKNOWN_CMD, + } + + private static HashMap cmdMap = null; + + static { + cmdMap = new HashMap(); + cmdMap.put(CMD_TYPE.AP00, "AP00"); + cmdMap.put(CMD_TYPE.BP00, "BP00"); + cmdMap.put(CMD_TYPE.AP01, "AP01"); + cmdMap.put(CMD_TYPE.BP01, "BP01"); + cmdMap.put(CMD_TYPE.AP02, "AP02"); + cmdMap.put(CMD_TYPE.BP02, "BP02"); + cmdMap.put(CMD_TYPE.AP92, "AP92"); + cmdMap.put(CMD_TYPE.BP92, "BP92"); + cmdMap.put(CMD_TYPE.AP03, "AP03"); + cmdMap.put(CMD_TYPE.BP03, "BP03"); + cmdMap.put(CMD_TYPE.AP05, "AP05"); + cmdMap.put(CMD_TYPE.BP05, "BP05"); + cmdMap.put(CMD_TYPE.AP07, "AP07"); + cmdMap.put(CMD_TYPE.BP07, "BP07"); + cmdMap.put(CMD_TYPE.AP10, "AP10"); + cmdMap.put(CMD_TYPE.BP10, "BP10"); + cmdMap.put(CMD_TYPE.AP49, "AP49"); + cmdMap.put(CMD_TYPE.BP49, "BP49"); + cmdMap.put(CMD_TYPE.APHT, "APHT"); + cmdMap.put(CMD_TYPE.BPHT, "BPHT"); + cmdMap.put(CMD_TYPE.APTM, "APTM"); + cmdMap.put(CMD_TYPE.BPTM, "BPTM"); + cmdMap.put(CMD_TYPE.AP12, "AP12"); + cmdMap.put(CMD_TYPE.BP12, "BP12"); + cmdMap.put(CMD_TYPE.AP14, "AP14"); + cmdMap.put(CMD_TYPE.BP14, "BP14"); + cmdMap.put(CMD_TYPE.AP15, "AP15"); + cmdMap.put(CMD_TYPE.BP15, "BP15"); + cmdMap.put(CMD_TYPE.AP16, "AP16"); + cmdMap.put(CMD_TYPE.BP16, "BP16"); + cmdMap.put(CMD_TYPE.AP17, "AP17"); + cmdMap.put(CMD_TYPE.BP17, "BP17"); + cmdMap.put(CMD_TYPE.AP18, "AP18"); + cmdMap.put(CMD_TYPE.BP18, "BP18"); + cmdMap.put(CMD_TYPE.AP21, "AP21"); + cmdMap.put(CMD_TYPE.BP21, "BP21"); + cmdMap.put(CMD_TYPE.AP28, "AP28"); + cmdMap.put(CMD_TYPE.BP28, "BP28"); + cmdMap.put(CMD_TYPE.AP31, "AP31"); + cmdMap.put(CMD_TYPE.BP31, "BP31"); + cmdMap.put(CMD_TYPE.AP33, "AP33"); + cmdMap.put(CMD_TYPE.BP33, "BP33"); + cmdMap.put(CMD_TYPE.AP34, "AP34"); + cmdMap.put(CMD_TYPE.BP34, "BP34"); + cmdMap.put(CMD_TYPE.AP40, "AP40"); + cmdMap.put(CMD_TYPE.BP40, "BP40"); + cmdMap.put(CMD_TYPE.AP68, "AP68"); + cmdMap.put(CMD_TYPE.BP68, "BP68"); + cmdMap.put(CMD_TYPE.APXL, "APXL"); + cmdMap.put(CMD_TYPE.BPXL, "BPXL"); + cmdMap.put(CMD_TYPE.APXY, "APXY"); + cmdMap.put(CMD_TYPE.BPXY, "BPXY"); + cmdMap.put(CMD_TYPE.APJZ, "APJZ"); + cmdMap.put(CMD_TYPE.BPJZ, "BPJZ"); + cmdMap.put(CMD_TYPE.AP84, "AP84"); + cmdMap.put(CMD_TYPE.BP84, "BP84"); + cmdMap.put(CMD_TYPE.AP85, "AP85"); + cmdMap.put(CMD_TYPE.BP85, "BP85"); + cmdMap.put(CMD_TYPE.AP86, "AP86"); + cmdMap.put(CMD_TYPE.BP86, "BP86"); + cmdMap.put(CMD_TYPE.AP88, "AP88"); + cmdMap.put(CMD_TYPE.BP88, "BP88"); + cmdMap.put(CMD_TYPE.AP89, "AP89"); + cmdMap.put(CMD_TYPE.BP89, "BP89"); + cmdMap.put(CMD_TYPE.APTE, "APTE"); + cmdMap.put(CMD_TYPE.BPTE, "BPTE"); + cmdMap.put(CMD_TYPE.APTP, "APTP"); + cmdMap.put(CMD_TYPE.BPTP, "BPTP"); + cmdMap.put(CMD_TYPE.APX1, "APX1"); + cmdMap.put(CMD_TYPE.BPX1, "BPX1"); + cmdMap.put(CMD_TYPE.APS4, "APS4"); + cmdMap.put(CMD_TYPE.BPS4, "BPS4"); + cmdMap.put(CMD_TYPE.APHP, "APHP"); + cmdMap.put(CMD_TYPE.BPHP, "BPHP"); + + } + + + private NettyConnection mConnection=null; + private Runtime mRuntime=null; + + public protocol_ic(NettyConnection connect, Runtime runtime) { + mConnection=connect; + mRuntime=runtime; + + } + + private StringBuffer cmdbuf = new StringBuffer(); + + /* + 输入的字符串,如果有完整命令,返回 true + 否则返回 false + */ + public boolean isCmdStr(String msg) { + int head_index = msg.indexOf(CMDHEADER); + if (head_index >= 0) { + int end_index = msg.indexOf("#", head_index); + if (end_index >= 0) { + return true; + } + } + return false; + } + + private void log(String msg) { + ICLogger.log(TAG, msg); + } + + private void log(String function, String msg) { + ICLogger.log(TAG, function, msg); + } + + + + /**/ + public static StringMessage genStringMessage(String cmdName, String msg){ + StringMessage sm=new StringMessage(new String[]{cmdName,msg}); + sm.refresh(msg); + return sm; + } + /* + 返回true 表示 cmd 全部解析成功 + 返回false表示 cmd至少有一条解析失败,失败的数据归入buffer,下一次识别接着使用 + 字符串通过#号进行识别。 + 每个字符串如果发现 #,却又没有Header,“IW”则会被丢弃 + */ + public boolean parserCmd(byte[] bytes) { + boolean iscmdComplete = false; + boolean ret = true; + String last_inCompletecmd = ""; + String cmd_msgbuf=new String(bytes); + log("bytes.size "+bytes.length); +// cmdbuf.append(cmd_msgbuf); + cmdbuf.append(cmd_msgbuf); + log("cmdbuf.size "+cmdbuf.length() +" "+cmdbuf.toString()); + /* + 如果不是 #结尾,就认为 接收数据不全,置位。 + */ + if (cmdbuf.toString().endsWith(CMDEND)) { + iscmdComplete = true; + } + String[] cmdlist = cmd_msgbuf.split(CMDEND); + int listlen = cmdlist.length; + log("listlen "+listlen); + /* + 如果解析出来的cmdlist不是空,且数据不是完整cmd则保留 最后一条数据到last_inCompletecmd + */ + if (cmdlist.length > 0 && iscmdComplete == false) { + listlen -= 1; + last_inCompletecmd = cmdlist[listlen]; + log("cmd not complete , " + last_inCompletecmd); + } + for (int i = 0; i < listlen; i++) { + for (CMD_TYPE key : cmdMap.keySet()) { + if (cmdlist[i].startsWith(CMDHEADER + cmdMap.get(key))) { + log("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key) + " , " + cmdlist[i]); + if (key == CMD_TYPE.BP28) { + //如果是BP28则 后面的数据是音频,需要保留 + byte[] amrBuf; + int amrLen = getBP28Amrlen(cmdlist[i] ); + if (bytes.length > amrLen) { + handleCmd(key, cmdlist[i], bytes); + } + } else { + handleCmd(key, cmdlist[i]); + } + } + } + } + + cmdbuf = new StringBuffer().append(last_inCompletecmd); + return ret; + } + public int getBP28Amrlen(String cmd) { + + String Name; + String appendIndex; + int packetCount; + int currentId; + int packetLen; + + + String[] msg=cmd.split(CMDSPLIT); + if (msg.length>=6){ + + Name=msg[1]; + appendIndex=msg[2]; + packetCount= Integer.valueOf(msg[3]); + currentId= Integer.valueOf(msg[4]); + packetLen= Integer.valueOf(msg[5]); + + StringBuffer stringBuffer=new StringBuffer(); + stringBuffer.append("getBP28AmrLen name = ").append(Name) + .append(",appendIndex = ").append(appendIndex) + .append(",packetCount = ").append(packetCount) + .append(",currentId = ").append(currentId) + .append(",packetLen = ").append(packetLen); + + + log( stringBuffer.toString()); + return packetLen; + }else{ + log("getBP28AmrLen","format Error"); + + } + return -1; + } + /*登录*/ + public static String AP00(Runtime ds) { + //示例数据:IWAP00867155030001063# + return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP00)).append(ds.IMEI()).append(CMDEND).toString(); + } + + //处理 登录 BP00 + public void handleBP00(Runtime runtime,String cmd){ + String[] msg=cmd.split(CMDSPLIT); +// get Msg :IWBP00,20191229171933,8# (size)24 +// 12-30 01:19:33.861 6492-6492/com.enqualcomm.support I/ICSrv.protocolAPIHelper: found cmd keyid=BP00 ,keyname=BP00 , IWBP00,20191229171933,8 + + if (msg.length>=3) { + log("handleBP00", "Set Datetime " + msg[1]); + log("handleBP00", "Set TimeZone " + msg[2]); + +// Date datetime= TimeUtil.parseDatetiime(msg[1]); +// int timezone=Integer.parseInt(msg[2]); +// if (datetime!=null){ +// ICLogger.i("==="+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{ + log("handleBP00","format Error"); + } + } + + + public static String AP03(Runtime ds) { + //示例数据:IWAP03,06000908000102,5555,30# IWAP03,000000null00000,0,0# + //IW: 标识符 + //AP03:命令字 + //设备在静止时,可以通过该指令与平台保持连接和解决静态漂移 + //06000908000102: + //060为GSM信号, + //009为参与定位的卫星数, + //080为电池电量, + //0 为保留位, + //01为设防状态,此处由两位十六进制表示,无取值时为 00 ,长度必需为两位,一共 8个bit 表示8种状态,各bit定义如下:(未列出的为当前未使用, 1表示有效 ,0 表示无效) + //Bit0 设防状态<手表无效> + //Bit1 为 1 表示夜灯为开,为0 夜灯为 关 + //02为工作模式 ,(设防,工作模式如果为00,则代表无或未设置) + //5555: 计步步数,每次到达 9999 后重 0 开始计 (此处 9999 为示例,可以为2字节int 然后溢出归零) + //30: 翻滚次数 + return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP03)).append(CMDSPLIT).append(String.format("%03d",abs(ds.getSignalStrength()))) + .append(ds.getGPSLocationStarNums()).append(ds.getBattery()).append("0") + .append(ds.getProtection()).append(ds.getWorkModeStr()).append(CMDSPLIT) + .append(ds.getTotalStepCount()).append(CMDSPLIT).append(ds.getRolltimes()).append(CMDEND).toString(); + } + //处理 心跳 BP03 + public void handleBP03(String cmd){ + + log("BP03心跳接收成功"); + } + + + public static String AP10(Runtime ds){ + + /** + * IWAP10080524A2232.9806N11404.9355E000.1061830323.8706000908000502, + * 460,0,9520,3671, + * 00,zh-cn,00, + * 00为报警状态,00为无任何报警(01:SOS,02:低电,03:脱落报警,04:佩戴提醒,05/06:跌倒报警)) + * zh-cn:设备语言 + * 00:第一个0:是否需要回复地址信息,0:不回复,1回复. + * HOME|74-DE-2B-44-88-8C|97&HOME1|74-DE-2B-44-88-8C|97&HOME2|74-DE-2B-44-88-8C|97&HOME3|74-DE-2B-44-88-8C|97# + */ + return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP10)).append(TimeUtil.getShortDate()) + .append(ds.getGPSData()).append(TimeUtil.getShortTime()).append(ds.getGPSHeading()) + .append(String.format("%03d",abs(ds.getSignalStrength()))) + .append(ds.getGPSLocationStarNums()).append(ds.getBattery()).append("0") + .append(ds.getProtection()).append(ds.getWorkModeStr()).append(CMDSPLIT) + .append(ds.getLBSData()).append(CMDSPLIT) + .append(ds.getAlarmType()).append(CMDSPLIT) + .append(ds.getLanguage()).append(CMDSPLIT) + .append("00").append(CMDSPLIT) //不回复地址 + .append(ds.getWifiInfo()).append(CMDEND).toString(); + + } + + /*LBS+GPS混合定位*/ + public static String AP01(Runtime ds) { + //示例数据:IWAP01080524A2232.9806N11404.9355E000.1061830323.8706000908000102, + // 460,0,9520,3671, + // Home|74-DE-2B-44-88-8C|97& Home1|74-DE-2B-44-88-8C|97&Home2|74-DE-2B-44-88-8C|97& Home3|74-DE-2B-44-88-8C|97# +// IWAP01191230A2232.9807N11404.9355E000.1161320000.0006000910000000,460,00,9520,3671,# + return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP01)).append(TimeUtil.getShortDate()) + .append(ds.getGPSData()).append(TimeUtil.getShortTime()).append(ds.getGPSHeading()).append(String.format("%03d",abs(ds.getSignalStrength()))) + .append(ds.getGPSLocationStarNums()).append(ds.getBattery()).append("0") + .append(ds.getProtection()).append(ds.getWorkModeStr()).append(CMDSPLIT) + .append(ds.getLBSData()).append(CMDSPLIT).append(ds.getWifiInfo()).append(CMDEND).toString(); + } + + //处理 定位 BP01 + public void handleBP01(String cmd){ + log("BP01定位接收成功"); + } + + + + /*LBS+WiFi混合定位*/ + public static String AP02(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.AP02)).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 handleBP02(String cmd){ + log("BP02定位接收成功"); + } + + + + public static String APXL(String id){ +//设备响应: IWAPXL,080835# + //080835:指令流水号 + return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APXL)) + .append(CMDSPLIT).append(id) + .append(CMDEND).toString(); + } + + /** + * 测量心率 + * @param cmd + * @param connection + */ + public void handleBPXL(String cmd, Connection connection){ + //IWBPXL,353456789012345,080835# + //说明: + //IW:标识符 + //BPXL : 命令字符 + //353456789012345:IMEI号,设备唯一ID + //080835 :指令流水号 + //设备响应: IWAPXL,080835# + //080835:指令流水号 + String[] list=cmd.split(CMDSPLIT); + if (list.length==3){ + String index=list[2]; + String imei=list[1]; + ICLogger.i("Handle BPXL IMEI "+imei+",index "+index); + connection.send(genStringMessage("APXL",APXL(index))); + }else{ + ICLogger.i("BPXL format error!"); + } + + } + + public static String APXY(String id){ +//设备响应: IWAPXY,080835# + //080835:指令流水号 + return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APXY)) + .append(CMDSPLIT).append(id) + .append(CMDEND).toString(); + } + + /** + * 测量血压 + * @param cmd + * @param connection + */ + public void handleBPXY(String cmd,Connection connection){ + //IWBPXY,353456789012345,080835# + //说明: + //IW:标识符 + //BPXL : 命令字符 + //353456789012345:IMEI号,设备唯一ID + //080835 :指令流水号 + //设备响应: IWAPXY,080835# + //080835:指令流水号 + String[] list=cmd.split(CMDSPLIT); + if (list.length==3){ + String index=list[2]; + String imei=list[1]; + ICLogger.i("Handle BPXY IMEI "+imei+",index "+index); + connection.send(genStringMessage("APXY",APXY(index))); + }else{ + ICLogger.i("BPXY format error!"); + } + + } + + + + public static String APJZ(String id,String BPH,String BPL,String Age,String Sex){ + //设备响应: IWAPJZ,792997,120,85,42,1# + //792997:指令流水号 + // 高压120,低压85,年龄42,1 男性 + return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APJZ)) + .append(CMDSPLIT).append(id) + .append(CMDSPLIT).append(BPH) + .append(CMDSPLIT).append(BPL) + .append(CMDSPLIT).append(Age) + .append(CMDSPLIT).append(Sex) + .append(CMDEND).toString(); + } + + /** + * + * @param cmd + * @param connection + * @param runtime + */ + public void handleBPJZ(String cmd,Connection connection,Runtime runtime){ + //cmdbuf.size 42 IWBPJZ,867155030001063,199600,120,85,45,1# 高压120,低压85,年龄45,男性 +// cmdbuf.size 42 IWBPJZ,867155030001063,909957,120,85,42,0# 高压120,低压85,年龄42,女性 + //IWBPJZ,353456789012345,080835,110,75# + //说明: + //IW:标识符 + //BPJZ : 命令字符 + //353456789012345:IMEI号,设备唯一ID + //110:高压值 + //75:低压值 + //080835 :指令流水号 + //设备响应: IWAPJZ,792997,120,85,42,1# + //792997:指令流水号 + String[] list=cmd.split(CMDSPLIT); + if (list.length==7){ + String index=list[2]; + String imei=list[1]; + String strBPH=list[3]; + String strBPL=list[4]; + String strAge=list[5]; + String strSex=list[6]; + + connection.send(genStringMessage("APJZ",APJZ(index,strBPH,strBPL,strAge,strSex))); + runtime.getHRS().setXY_Ref(Integer.valueOf(strBPH),Integer.valueOf(strBPL),Integer.valueOf(strAge),Integer.valueOf(strSex)); + ICLogger.i("Handle BPJZ IMEI "+imei+",index "+index+", BPH "+strBPH+", BPL "+strBPL+", Age "+ strAge +", Sex "+ (strSex.equals("1")?"男":"女")); + }else{ + ICLogger.i("BPXY format error!"); + } + } + + + + //重启 + + + public static String AP18(String index){ + return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP18)) + .append(CMDSPLIT).append(index) + .append(CMDEND).toString(); + } + + public void handleBP18(Connection connection,String cmd) { + + // IWBP18,867155030001063,161723 + String[] cmdlist=cmd.split(CMDSPLIT); + if (cmdlist.length==3) { + + connection.send(genStringMessage("AP18",AP18(cmdlist[2]))); + + } + } + //恢复出厂设置 + + public static String AP17(String index){ + return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP17)) + .append(CMDSPLIT).append(index) + .append(CMDEND).toString(); + } + public void handleBP17(Connection connection,String cmd) { + + // IWBP17,867155030001063,161723 + String[] cmdlist=cmd.split(CMDSPLIT); + if (cmdlist.length==3) { + + connection.send(genStringMessage("AP17",AP17(cmdlist[2]))); + + } + } + + //关机 + + + public static String AP31(String index){ + return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP31)) + .append(CMDSPLIT).append(index) + .append(CMDEND).toString(); + } + public void handleBP31(Connection connection,String cmd) { + + // IWBP31,867155030001063,161723 + String[] cmdlist=cmd.split(CMDSPLIT); + if (cmdlist.length==3) { + + connection.send(genStringMessage("AP31",AP31(cmdlist[2]))); + + } + } + + //设置SOS号码 + public static String AP12(String index,String phNum1,String phNum2,String phNum3){ + return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP12)) + .append(CMDSPLIT).append(index) + .append(CMDSPLIT).append(phNum1) + .append(CMDSPLIT).append(phNum2) + .append(CMDSPLIT).append(phNum3) + .append(CMDEND).toString(); + } + + //设置SOS号码 + public void handleBP12(Connection connection,String cmd,Runtime runtime){ + // IWBP12,353456789012345,080835,135XXXXXXXX,135XXXXXXXX,135XXXXXXXX# + String[] cmdlist=cmd.split(CMDSPLIT); + if (cmdlist.length>=3){ + String index=cmdlist[2]; + String phNum1=cmdlist.length==3?"":cmdlist[3]; + String phNum2=cmdlist.length>3?(cmdlist.length==4?"":cmdlist[4]):""; + String phNum3=(cmdlist.length>4)?(cmdlist.length==5? "":cmdlist[5]):""; + ICLogger.i(new StringBuffer().append("get Emegency Numbs "+phNum1+","+phNum2+","+phNum3).toString()); + connection.send(genStringMessage("AP12",AP12(index,phNum1,phNum2,phNum3))); + + ArrayList contactArray=new ArrayList(); + if (!phNum1.isEmpty()) contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos1",phNum1)); + if (!phNum2.isEmpty()) contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos2",phNum2)); + if (!phNum3.isEmpty()) contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos3",phNum3)); + + runtime.getDbHelper().saveContacts(contactArray,false,false,false,false,false,true); + + }else{ + ICLogger.i(" BP12 format error!"); + } + } + + + public static String AP14(String index,String[] phnumbs){ + return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP14)) + .append(CMDSPLIT).append(index) + .append(CMDSPLIT).append(phnumbs[0]) + .append(CMDSPLIT).append(phnumbs[1]) + .append(CMDSPLIT).append(phnumbs[2]) + .append(CMDSPLIT).append(phnumbs[3]) + .append(CMDSPLIT).append(phnumbs[4]) + .append(CMDSPLIT).append(phnumbs[5]) + .append(CMDSPLIT).append(phnumbs[6]) + .append(CMDSPLIT).append(phnumbs[7]) + .append(CMDSPLIT).append(phnumbs[8]) + .append(CMDSPLIT).append(phnumbs[9]) + .append(CMDEND).toString(); + } + //设置通讯录,白名单(10个) + public void handleBP14(Connection connection,String cmd , Runtime runtime){ +// IWBP14,867155030001063,357444,9b44529b|13554820016,,,,,,,,, +/** + * IWBP14,353456789012345,080835, + * D3590D54|135xxxxxxxxxx, + * D3590D54|135xxxxxxxxxx, + * D3590D54|135xxxxxxxxxx, + * D3590D54|135xxxxxxxxxx, + * D3590D54|135xxxxxxxxxx, + * D3590D54|135xxxxxxxxxx, + * D3590D54|135xxxxxxxxxx, + * D3590D54|135xxxxxxxxxx, + * D3590D54|135xxxxxxxxxx, + * D3590D54|135xxxxxxxxxx# + */ + String[] cmdlist=cmd.split(CMDSPLIT); + String[] phnums=new String[]{"","","","","","","","","",""}; + StringBuffer sb=new StringBuffer().append("recv phone Numbs "); + if (cmdlist.length>=3){ + switch (cmdlist.length){ + case 13: + phnums[9]=cmdlist[12]; + sb.append(phnums[9]).append(","); + case 12: + phnums[8]=cmdlist[11]; + sb.append(phnums[8]).append(","); + case 11: + phnums[7]=cmdlist[10]; + sb.append(phnums[7]).append(","); + case 10: + phnums[6]=cmdlist[9]; + sb.append(phnums[6]).append(","); + case 9: + phnums[5]=cmdlist[8]; + sb.append(phnums[5]).append(","); + case 8: + phnums[4]=cmdlist[7]; + sb.append(phnums[4]).append(","); + case 7: + phnums[3]=cmdlist[6]; + sb.append(phnums[3]).append(","); + case 6: + phnums[2]=cmdlist[5]; + sb.append(phnums[2]).append(","); + case 5: + phnums[1]=cmdlist[4]; + sb.append(phnums[1]).append(","); + case 4: + phnums[0]=cmdlist[3]; + sb.append(phnums[0]).append(","); + + } + + String index=cmdlist[2]; + ICLogger.i(sb.toString()); + connection.send(genStringMessage("AP14",AP14(index,phnums))); + ArrayList contactArray=new ArrayList(); + for (int i=0; i< phnums.length;i++){ + String[] tmp= phnums[i].split("\\|"); + if (tmp.length==2){ + String name= Util.decodeUnicode2Utf8(tmp[0]); + String phonem=tmp[1]; + ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length+" , name="+name+",-"+phonem); + contactArray.add(new Contact(Contact.CATEGORY_CALL,name,phonem)); + }else{ + ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length); + + } + } +// contactArray.add(new Contact(Contact.CATEGORY_GROUP,"All","666")); +// contactArray.add(new Contact(Contact.CATEGORY_PARTNER,"PARTNER","666")); +// contactArray.add(new Contact(Contact.CATEGORY_CARE,"CARE","666")); +// contactArray.add(new Contact(Contact.CATEGORY_VOLTE,"VOLTE","666")); + + runtime.getDbHelper().saveContacts(contactArray,false,false,true,false,false,false); + + }else{ + ICLogger.i(" BP14 format error!"); + } + + } + + + + public static String AP85(Runtime ds,String cmddata){ +//示例数据:IWAP49,68## + return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP85)) + .append(CMDSPLIT).append(cmddata) + .append(CMDEND).toString(); + + } + //设置闹钟 + public void handleBP85(String cmd , Connection connection,Runtime runtime){ +// IWBP85,867155030001063,155312,1,1,0235,12,1,1 +// IWBP85,867155030002145,945166,1,0, +// IWBP85,867155030001064,265960,1,1,1130,,1,1 +// IWBP85,353456789012345,080835,1,3, 0900,135,1,1@0900 ,135,1,2@0900 ,135,1,3# +//353456789012345:IMEI号,设备唯一ID +//080835 :指令流水号 +//1: 表示闹钟总开关,1为开,0 为关 +//3: 表示闹钟个数 +//0900 ,135,1,1,表示一组闹钟,0900表示早上09:00, 135表示周一周三周五,使用24小时制 +//1表示该组闹钟开启或关闭状态 1表示开启 0表示关闭 +//1表示吃药提醒 +//2 表示喝水提醒 +//3 表示久坐提醒 +//多组闹钟之间用”@”符号分隔 + + String imei="",cmdindex="0"/*指令流水号*/; + int all_alarmswitch=0 /*总开关 1为开,0 为关*/, + alarmswitch=0 /*1为开,0 为关*/, + alarmcount=0 /*表示闹钟个数*/; + String alarmtime="";//0900表示早上09:00 + int alarmtype=1; //1表示吃药提醒 , 2 表示喝水提醒 ,3 表示久坐提醒 + String repeat="";// 135表示周一周三周五,使用24小时制 + String[] datalist= cmd.split("@"); + ArrayList alarmlist=new ArrayList<>(); + if (datalist.length >0){ + for (int i =0 ; i< datalist.length;i++){ + String [] cmdarglist=datalist[i].split(","); + + if (i == 0){ + if (cmdarglist.length == 9){ + imei=cmdarglist[1]; + cmdindex=cmdarglist[2]; + all_alarmswitch=Integer.valueOf(cmdarglist[3]); + alarmcount=Integer.valueOf(cmdarglist[4]); + alarmtime=cmdarglist[5]; + repeat=cmdarglist[6]; + alarmswitch=Integer.valueOf(cmdarglist[7]); + alarmtype = Integer.valueOf(cmdarglist[8]); + log(new StringBuilder("imei ").append(imei) + .append(", cmdindex ").append(cmdindex) + .append(", allswitch=").append(all_alarmswitch) + .append(", all alarm count=").append(alarmcount) + .toString() + ); + + log(new StringBuilder("alarmtime ").append(alarmtime) + .append(", relpeat ").append(repeat) + .append(", switch=").append(alarmswitch) + .append(", alarmtype=").append(alarmtype) + .toString() + ); + alarmlist.add(new Alarm("ST"+alarmtime.substring(0,2)+"."+alarmtime.substring(2),"W"+repeat,"CON",alarmswitch==1?"ON":"OFF","闹铃")); + + }else if (cmdarglist.length == 5) { + imei=cmdarglist[1]; + cmdindex=cmdarglist[2]; + all_alarmswitch=Integer.valueOf(cmdarglist[3]); + alarmcount=Integer.valueOf(cmdarglist[4]); + }else{ + log("data len is too small!"); + } + }else{ + if (cmdarglist.length == 4){ + alarmtime=cmdarglist[0]; + repeat=cmdarglist[1]; + alarmswitch=Integer.valueOf(cmdarglist[2]); + alarmtype = Integer.valueOf(cmdarglist[3]); + + log(new StringBuilder("set alarmtime ").append(alarmtime) + .append(", relpeat ").append(repeat) + .append(", switch=").append(alarmswitch) + .append(", alarmtype=").append(alarmtype) + .toString() + ); + + alarmlist.add(new Alarm("ST"+alarmtime.substring(0,2)+"."+alarmtime.substring(2),"W"+repeat,"CON",alarmswitch==1?"ON":"OFF","闹铃")); + + }else{ + log("data len is too small!"); + } + + } + }//循环获取alarm数据结束 + runtime.getDbHelper().saveAlarm(alarmlist); + + //do clean and set alarm things + + } +//IWBP85,867155030002145,410385,1,0,# + + String replacement=new StringBuilder("IWBP85,").append(imei).append(",").toString(); + String replycmd = cmd.replace(replacement,""); + ICLogger.i("gen reply "+replacement+" "+replycmd); + connection.send(genStringMessage("AP85",AP85(runtime,replycmd))); + } + + +// AP05命令L02服务器不适用 +// public static String AP05(boolean recvFlag){ +// +//// IWAP05,1# +// return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP05)) +// .append(CMDSPLIT).append(recvFlag?1:0) +// .append(CMDEND).toString(); +// +// } +// +// +// public void handleBP05(String cmd){ +//// IWBP05,6# +// String[] cmdlist=cmd.split(CMDSPLIT); +// if (cmdlist.length>1){ +// ICLogger.i(" 服务器有 " +cmdlist[1]+" 条语音未接收!"); +// } +// } + + + + + public static byte[] AP07(String packetTime,int count,int index,int datalen,byte[] amrdata){ +//IWAP07,20140818064408,6,1,1024,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX# +//说明: +//IW:标识符 +//AP07 : 命令字符 +//20140818064408 :yyyyMMddHHmmss 格式的年月日时分秒,设备录音时间 +//6:语音包分包总数 +//1 :当前包数,第一包为1,第二包为2,。。。。。。同一个语音包的语音时间相同 +//1024 :语音包长度 +//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:当前音频数据, 每个音频数据包大小为1024字节,最后一包不足1024的取实际字节数 +//语音包上传规则: +//按包次序依次上传,上传后如果没有收到服务器的响应包,则继续上传该语音包。 +//收到设备回复确认数据包接收成功状态后,继续开始依次上传下一个数据包。。。。。。 +//如果设备回复确认数据包接收失败状态,则重复发送上一个数据包 + + + String sb=new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP07)) + .append(CMDSPLIT).append(packetTime) + .append(CMDSPLIT).append(count) + .append(CMDSPLIT).append(index) + .append(CMDSPLIT).append(datalen) + .append(CMDSPLIT).toString(); + + byte[] sentbuf=new byte[sb.length()+datalen+1]; + System.arraycopy(sb.getBytes(),0,sentbuf,0,sb.length()); + System.arraycopy(amrdata,0,sentbuf,sb.length(),datalen); + sentbuf[sb.length()+datalen]='#'; + + return sentbuf; + + } + + + public void handleBP07(String cmd , NettyConnection connection ){ +//平台响应: IWBP07,20140818064408,6,1,1# +//20140818064408:设备语音时间,yyyyMMddHHmmss 格式的年月日时分秒 +//6:语音包分包总数 +//1:当前设备收到的是第几个包 +//1:表示服务器接受数据成功,0表示服务器接受数据失败 + String[] cmdlist=cmd.split(CMDSPLIT); + if (cmdlist.length==5){ + String time=cmdlist[1]; + int packetCount=Integer.valueOf(cmdlist[2]); + int packetIndex=Integer.valueOf(cmdlist[3]); + int receiveSuccess=Integer.valueOf(cmdlist[4]); + ICLogger.i("服务器在"+time+" 收到语音 "+packetIndex+"/"+packetCount+" "+ (receiveSuccess==1?"成功":"失敗")); + if (receiveSuccess == 1){ + //如果服务器接收 语音成功,则设置下一个要发送的语音包Index,当index == packetCount的时候表示所有包发送完毕,停止继续发送 + voicePacket.getInstanceSent().setCurrentIndexToSent(packetIndex); + } + //发送消息,再次检查要发送的语音包,确认其发送完毕 + connection.DeliverCMDMessageToSystem("BP07","SentVoicePacket"); + + }else{ + ICLogger.i(" BP07 Format error!"); + } + } + + + + public static String AP33(String cmdindex,int workMode){ +//IWAP33,080835,1# +//080835:指令流水号 +//1:设置信息,供服务器同步 + return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP33)) + .append(CMDSPLIT).append(cmdindex) + .append(CMDSPLIT).append(workMode) + .append(CMDEND).toString(); + } + + //设置工作模式 + public void handleBP33(Connection connection,Runtime runtime,String cmd){ + +// IWBP33,867155030001063,560555,1 +// IW:标识符 +// BP33 : 命令字符 +// 353456789012345:IMEI号,设备唯一ID +// 080835:指令流水号 +// 1:设备工作模式,1:正常模式,2:省电模式,3:紧急模式 + + String[] cmdlist=cmd.split(","); + if (cmdlist.length == 4){ + + + log("work mode "+cmdlist[3]); + int mod=Integer.valueOf(cmdlist[3]); + int Cycle=900; + switch(mod){ + case ICLocation.NORMAL_MOD: + Cycle=900; + break; + case ICLocation.LOWPOWER_MOD: + Cycle=3600; + break; + case ICLocation.EMERGNECY_MOD: + case ICLocation.REALTIME_MOD: + Cycle=60; + break; + + } + + String msg=AP33(cmdlist[2],mod); + //设定当前工作模式及循环频率 + connection.send(genStringMessage("AP33",msg)); + log("reply msg "+msg); + log("LOCATION_MODE "+LOCATION_MODE+" mod "+ mod); + Config.setLocationMode(runtime.getContextProxy().context,mod); + Config.setLocationCycle(runtime.getContextProxy().context,Cycle); + runtime.getLocationInstance().setLocation_cycle(Cycle); + runtime.getLocationInstance().setWorkingMod(mod); +// CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod()); + //此处设置好配置后,会在LocationClient通过消息开始执行及时定位操作。 + } + + } + + + public static String AP34(String cmdindex,int workMode){ +//IWAP34,588854,1# +//080835:指令流水号 +//8:模式 + return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP34)) + .append(CMDSPLIT).append(cmdindex) + .append(CMDSPLIT).append(workMode) + .append(CMDEND).toString(); + } + + //设置自定义工作模式 + public void handleBP34(Connection connection,Runtime runtime,String cmd){ + +// IWBP34,867155030001063,588854,8,900,1# +// IW:标识符 +// BP33 : 命令字符 +// 353456789012345:IMEI号,设备唯一ID +// 080835:指令流水号 +// 1:设备工作模式,1:正常模式,2:省电模式,3:紧急模式 + + String[] cmdlist=cmd.split(","); + if (cmdlist.length == 6){ + + + log("work mode "+cmdlist[3]); + int mod=Integer.valueOf(cmdlist[3]); + int Cycle=Integer.valueOf(cmdlist[4]); + int gpson=Integer.valueOf(cmdlist[5]); + + String msg=AP34(cmdlist[2],mod); + //设定当前工作模式及循环频率 + connection.send(genStringMessage("AP34",msg)); + + if(gpson==1){ + mod=ICLocation.CUSTOM_MOD8_GPS; + }else{ + mod=ICLocation.CUSTOM_MOD8_WIFI; + } + log("reply msg "+msg); + log("LOCATION_MODE "+LOCATION_MODE+" mod "+ mod + ", cycle = "+Cycle+", GPS On= "+gpson); + Config.setLocationMode(runtime.getContextProxy().context,mod); + Config.setLocationCycle(runtime.getContextProxy().context,Cycle); + runtime.getLocationInstance().setLocation_cycle(Cycle); + runtime.getLocationInstance().setWorkingMod(mod); +// CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod()); + //此处设置好配置后,会在LocationClient通过消息开始执行及时定位操作。 + } + + } + public void handleBP40(Connection connection,Runtime runtime,String cmd){ + +// IWBP40,353456789012345,080835,XXXXXXXXXXXXXX# +// IW:标识符 +// BP40 : 命令字符 +// 353456789012345:IMEI号,设备唯一ID +// 080835 :指令流水号 +// XXXXXXXXXXXX : 表示文字内容GB2312编码 + + + String[] cmdlist=cmd.split(","); + if (cmdlist.length == 4){ + String cmdindex=cmdlist[2]; + String txtmsg=cmdlist[3]; + + txtmsg=Util.UrlGB2312ToUTF8(txtmsg); + String msg=AP40(cmdindex,1); + //设定当前工作模式及循环频率 + connection.send(genStringMessage("AP40",msg)); + ICLogger.i("received Txt Msg "+txtmsg); + runtime.getContextProxy().sendMsgBroadcast(txtmsg,0); + }else{ + ICLogger.i("BP40 format error!"); + } + } + public static String AP40(String cmdindex,int success){ + +// IWAP40,080835,1# +// 080835:指令流水号 +// 1:表示设备接受数据成功,0表示设备接受数据失败 + return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP40)) + .append(CMDSPLIT).append(cmdindex) + .append(CMDSPLIT).append(success) + .append(CMDEND).toString(); + } + + + /** + * 心率上传,返回协议字串 + * @param ds + * @return + */ + public static String AP49(Runtime ds){ + //示例数据:IWAP49,68## + return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP49)) + .append(CMDSPLIT).append(ds.getHRS().getPPG()) + .append(CMDEND).toString(); + + } + + + + + /** + * 返回上传心率血压的协议字串 + * @param ds + * @return + */ + public static String APHT(Runtime ds){ + //IWAPHT,60,130,85# + //说明: + //IW:标识符 + //APHT : 命令字符 + //60 : 表示心率 + //130: 血压高压 [收缩压] + //85 : 血压低压 [舒张压] + //平台响应: IWBPHT# + //表示平台已接收,可不作响应 + return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APHT)) + .append(CMDSPLIT).append(ds.getHRS().getPPG()) + .append(CMDSPLIT).append(ds.getHRS().getBPH()) + .append(CMDSPLIT).append(ds.getHRS().getBPL()) + .append(CMDEND).toString(); + } + public static String APHT(int ppg,int bph,int bpl){ + //IWAPHT,60,130,85# + //说明: + //IW:标识符 + //APHT : 命令字符 + //60 : 表示心率 + //130: 血压高压 [收缩压] + //85 : 血压低压 [舒张压] + //平台响应: IWBPHT# + //表示平台已接收,可不作响应 + return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APHT)) + .append(CMDSPLIT).append(ppg) + .append(CMDSPLIT).append(bph) + .append(CMDSPLIT).append(bpl) + .append(CMDEND).toString(); + } + + + //立即定位反馈 + public static String AP16(String cmdindex){ +//IWAP16,080835# +//080835:指令流水号 + return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP16)) + .append(CMDSPLIT).append(cmdindex) + .append(CMDEND).toString(); + } + // 立即定位指令(长链接有效) + public void handleBP16(Connection connection,Runtime runtime,String cmd){ + //示例数据:IWBP16,867155030001063,335386 +// IWBP16,353456789012345,080835# +// 说明: +// IW:标识符 +// BP16 : 命令字符 +// 353456789012345:IMEI号,设备唯一ID +// 080835 :指令流水号 + String[] cmdlist = cmd.split(","); + if(cmdlist.length==3){ + log("imei "+cmdlist[1]+", cmdindex "+cmdlist[2]); + + connection.send(genStringMessage("AP16",AP16(cmdlist[2]))); + }else{ + log("error BP16 format"); + } + } + + + /*通过基站获取时间和坐标*/ + public static String APTM(Runtime ds){ + //示例数据:IWAPTM,460,0,9750,3613# + //说明: + //IW:标识符 + //APTM : 命令字符 + //460:MCC + //0: MNC + //9750: LAC + //3613: CID + + return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTM)) + .append(CMDSPLIT).append(ds.getLocationInstance().getMCC()) + .append(CMDSPLIT).append(ds.getLocationInstance().getMNC()) + .append(CMDSPLIT).append(ds.getLocationInstance().getLAC()) + .append(CMDSPLIT).append(ds.getLocationInstance().getGSMStationCID()) + .append(CMDEND).toString(); + + } + + public void handleBPTM(String cmd){ + //平台响应: IWBPTM,20160225090909,22.123456,113.654321# + //返回时间,格式为:yyyyMMddHHmmss ,为UTC0 时间 + //经纬度保留六位小数,若没取到则返回 0 + String[] list=cmd.split(CMDSPLIT); + + if(list.length==4){ + + String time=list[1]; + String lat=list[2]; + String lon=list[3]; + ICLogger.i("BPTM , time="+time+", lat="+lat+", lon="+lon); + }else{ + ICLogger.i("BPTM format error"); + } + + + } + + public static String AP15(String index){ +//IWAP15, 080835# +//080835:指令流水号 + return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP15)) + .append(CMDSPLIT).append(index) + .append(CMDEND).toString(); + } + + //设置定位周期 + public void handleBP15(String cmd ,Connection connection,Runtime runtime){ +// IWBP15, 353456789012345, 080835, 30# +// 353456789012345:IMEI号,设备唯一ID +// 080835 :指令流水号 +// 30: 表示频率为30分钟 + + String[] list=cmd.split(CMDSPLIT); + + if(list.length==4){ + String index=list[2]; + String time=list[3]; + connection.send(genStringMessage("AP15",AP15(index))); + ICLogger.i("BP15 , 定位周期="+time+"秒"); + + Config.setLocationMode(runtime.getContextProxy().context, ICLocation.CUSTOM_MOD8_GPS); + Config.setLocationCycle(runtime.getContextProxy().context,Integer.valueOf(time)); + runtime.getLocationInstance().setWorkingMod(Config.getLocationMode(runtime.getContextProxy().context)); + runtime.getLocationInstance().setLocation_cycle(Config.getLocationCycle(runtime.getContextProxy().context)); + //set AlarmCycle and trigger Location + CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod()); + }else{ + ICLogger.i("BP15 format error"); + } + + } + + + + + + + /*语音下行反馈*/ + public static String AP28(String name, String msg, int packagecount, int currentpackageindex, int received_success) { + //示例数据:IWAP28,D3590D54,xxxx,6,1,1# + return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP28)) + .append(CMDSPLIT).append(name) + .append(CMDSPLIT).append(msg) + .append(CMDSPLIT).append(packagecount) + .append(CMDSPLIT).append(currentpackageindex) + .append(CMDSPLIT).append(received_success) + .append(CMDEND).toString(); + } + + //处理 BP28 语音消息 + public void handleBP28(NettyConnection connection,String cmd,Runtime runtime,byte[] bytes) { + //log("handleBP28 msg"+cmd); +/** + * IWBP28, D3590D54,XXXX,6,1,1024,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX# + * 说明: + * IW:标识符 + * BP28 : 命令字符 + * D3590D54:UNICODE编码,发送者名称 + * XXXX: 附加信息,在响应数据包时,将附加信息原样响应,类似流水号 + * 6:语音包分包总数 + * 1 :当前包数,第一包为1,第二包为2,。。。。。。同一个语音包的语音时间相同 + * 1024 :语音包长度 + * XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:当前音频数据, 每个音频数据包大小为1024字节,最后一包不足1024的取实际字节数 + * 语音包上传规则: + * 按包次序依次上传,上传后如果没有收到服务器的响应包,则继续上传该语音包。 + * 收到设备回复确认数据包接收成功状态后,继续开始依次上传下一个数据包。。。。。。 + * 如果设备回复确认数据包接收失败状态,则重复发送上一个数据包 + * 设备响应: IWAP28,D3590D54,XXXX,6,1,1# + * D3590D54:UNICODE编码,发送者名称 + * XXXX: 附加信息,原样返回 + * 6:语音包分包总数 + * 1:当前设备收到的是第几个包 + * 1:表示设备接受数据成功,0表示设备接受数据失败 + */ + String Name; + String appendIndex; + int packetCount; + int currentId; + int packetLen; + byte[] packetData; + + String[] msg= cmd.split(CMDSPLIT); + if (msg.length>=6){ + + Name=msg[1]; + appendIndex=msg[2]; + packetCount= Integer.valueOf(msg[3]); + currentId= Integer.valueOf(msg[4]); + packetLen= Integer.valueOf(msg[5]); + packetData= Util.subArray(bytes,msg[0].length()+msg[1].length()+msg[2].length()+msg[3].length()+msg[4].length()+msg[5].length()+6,bytes.length-1); + + StringBuffer stringBuffer=new StringBuffer(); + stringBuffer.append("recv BP28 name = ").append(Name) + .append(",appendIndex = ").append(appendIndex) + .append(",packetCount = ").append(packetCount) + .append(",currentId = ").append(currentId) + .append(",packetLen = ").append(packetLen) + .append(",packetDatalen = ").append(packetData.length); + + log( stringBuffer.toString()); + connection.send(genStringMessage("AP28",AP28(Name,appendIndex,packetCount,currentId,1))); + voicePacket.getInstance().appendVoice(Name,appendIndex,packetCount,currentId,packetLen,packetData); + log("================"+voicePacket.getInstance().toString()); + if (voicePacket.getInstance().isFinished()) + { + + String dir = Environment.getExternalStorageDirectory()+ "/Android/VoiceCache"; + String amrFilepath=Util.saveFile(voicePacket.getInstance().getVoicePacketBytes(),0,voicePacket.getInstance().getVoicePacketLen(),new File(dir),"receive_"+voicePacket.getInstance().getPacketTime()+".amr"); + ICLogger.i("save Amr file to "+amrFilepath); + voicePacket.getInstance().clearPacket(); + VoiceContent voiceContent=VoiceContent.placeHolderIn(Content.CONTACT_CATEGORY_GROUP,GROUP_ALL,amrFilepath); + + + final Uri uri2 = runtime.getDbHelper().insertMessage( voiceContent); + + //回复UI消息,表示已经接收到 + voiceContent.status = 3; + voiceContent.serverTime = TimeUtil.getSystemTime3(); + voiceContent.preview = String.valueOf(Util.getDuration(voiceContent.content)); + runtime.getDbHelper().updateMessage(voiceContent, uri2); + +// runtime.getContextProxy().sendBroadcast(ACTION_IMESSAGE, runtime); + + connection.DeliverCMDMessageToSystem("NewVoice", amrFilepath);//通知下面线程状态变化 + } + + }else{ + log("handleBP28","format Error"); +// connection.send(genStringMessage("AP28",AP28(Name,appendIndex,packetCount,currentId,0))); + + } + + } + + 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); + } + + //白名单开关(下行协议号:BP84,响应:AP84) + public static String AP84(String index,int success){ + + //设备响应: IWAP80,080835,1# + //080835:指令流水号 + //1:表示设备执行成功,0 表示设备执行失败 + return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP84)) + .append(CMDSPLIT).append(index) + .append(CMDSPLIT).append(success) + .append(CMDEND).toString(); + } + + public void handleBP84(String cmd,Connection connection){ +//示例: + //IWBP84,353456789012345,080835,1# + //说明: + //IW:标识符 + //BP84 : 命令字符 + //353456789012345:IMEI号,设备唯一ID + //080835 :指令流水号 + //1: 表示白名单开,0 表示白名单关 + String[] list=cmd.split(CMDSPLIT); + + if (list.length==4){ + String index=list[2]; + String whitelist_switch=list[3]; + connection.send(genStringMessage("AP84",AP84(index,1))); + + if (whitelist_switch.equals("1")){ + Util.setSystemProperties("persist.sys.whitelist.enable","true"); + }else{ + Util.setSystemProperties("persist.sys.whitelist.enable","false"); + } + ICLogger.i("收到服务器指令:白名单"+(whitelist_switch.equals("1")?"开":"关")); + + }else{ + + ICLogger.i("BP84 format error!"); + } + + } + + //17.绑定解绑(下行协议号:BP68,响应:AP68) + public static String AP68(String index){ + + //设备响应: IWAP86, 080835# + //080835:指令流水号 + return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP68)) + .append(CMDSPLIT).append(index) + .append(CMDEND).toString(); + } + + public void handleBP68(String cmd,Connection connection,Runtime runtime){ + + //示例: + //IWBP68,353456789012345,080835,1# + //说明: + //IW:标识符 + //BP68 : 命令字符 + //353456789012345:IMEI号,设备唯一ID + //080835 :指令流水号 + //1 : 表示设备为激活状态(绑定成功) 0:表示设备为未激活状态(解绑成功) + + String[] list=cmd.split(CMDSPLIT); + + if (list.length==4){ + String index=list[2]; + String type=list[3]; + connection.send(genStringMessage("AP86",AP68(index))); + ICLogger.i("收到服务器消息:"+(type.equals("1")?"绑定成功 ":"未激活或者解绑")); + + }else{ + ICLogger.i("BP86 format error!"); + } + + } + //17.设置心率/血压测量周期(下行协议号:BP86,响应:AP86) + public static String AP86(String index){ + + //设备响应: IWAP86, 080835# + //080835:指令流水号 + return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP86)) + .append(CMDSPLIT).append(index) + .append(CMDEND).toString(); + } + + public void handleBP86(String cmd,Connection connection,Runtime runtime){ + + //示例: + //IWBP86, 353456789012345, 080835,1,720# + //说明: + //IW:标识符 + //BP86 : 命令字符 + //353456789012345:IMEI号,设备唯一ID + //080835 :指令流水号 + //1: 表示心率周期;2 :表示血压周期 + //720: 表示720分钟 + + String[] list=cmd.split(CMDSPLIT); + + if (list.length==5){ + String index=list[2]; + String type=list[3]; + String cycle=list[4]; + connection.send(genStringMessage("AP86",AP86(index))); + ICLogger.i("收到服务器指令:设置"+(type.equals("1")?"心率周期 ":"血压周期 ")+cycle+"分钟"); + + //发送重置PPGCycle的广播,会在CoreServer里面执行 + Intent intent = new Intent(); + intent.putExtra("PPGTestCycle",Integer.valueOf(cycle)); + runtime.getContextProxy().sendBrodcast(ACTION_HEATR_RATE_START,intent); + }else{ + ICLogger.i("BP86 format error!"); + } + + } + public static String AP88(String index){ + //设备响应: IWAP88, 080835# + //080835:指令流水号 + return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP88)) + .append(CMDSPLIT).append(index) + .append(CMDEND).toString(); + } + + public static void handleBP88(String cmd,Connection connection){ +// IWBP88,080835# + String[] list=cmd.split(CMDSPLIT); + + if (list.length==2){ + String index=list[1]; + connection.send(genStringMessage("AP88",AP88(index))); + ICLogger.i("收到服务器消息:查询设备"); + + }else{ + ICLogger.i("BP88 format error!"); + } + } + + //18.18.设置心率/血压阀值(下行协议号:BP89,响应:AP89) + public static String AP89(String index){ + + //设备响应: IWAP89, 080835# + //080835:指令流水号 + return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP89)) + .append(CMDSPLIT).append(index) + .append(CMDEND).toString(); + } + + public void handleBP89(String cmd,Connection connection){ + + //示例: + //IWBP89, 353456789012345, 080835,50,90,80,90,110,140# + //说明: + //IW:标识符 + //BP89 : 命令字符 + //353456789012345:IMEI号,设备唯一ID + //080835 :指令流水号 + //50: 心率低阀值,低于该阀值上传心率,如果未设置,则留空 + //90: 心率高阀值,高于该阀值上传心率,如果未设置,则留空 + //80: 低压阀值,低压低于该阀值上传血压,如果未设置,则留空 + //90: 低压阀值,低压高于该阀值上传血压,如果未设置,则留空 + //110: 高压阀值,高压低于该阀值上传血压,如果未设置,则留空 + //140: 高压阀值,高压高于该阀值上传血压,如果未设置,则留空 + String[] list=cmd.split(CMDSPLIT); + if (list.length==9){ + String index=list[2]; + String PPGH=list[3]; + String PPGL=list[4]; + String BPH_H=list[5]; + String BPH_L=list[6]; + String BPL_H=list[7]; + String BPL_L=list[8]; + connection.send(genStringMessage("AP89",AP89(index))); + ICLogger.i("收到服务器指令:心率/血压阀值 "+PPGH+","+PPGL+","+BPH_H+","+BPH_L+","+BPL_H+","+BPL_L); + }else{ + ICLogger.i("BP89 format error!"); + } + + } + + //体温间隔测量 (后台测试体温)(下行协议号:BPTE,响应:APTE) + public static String APTE(String index,int freq){ + + //设备响应: IWAPTE,080835,60# + //080835:指令流水号 + //1:表示设备接受数据成功,0表示设备接受数据失败 + return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTE)) + .append(CMDSPLIT).append(index) + .append(CMDSPLIT).append(freq) + .append(CMDEND).toString(); + } + + public void handleBPTE(String cmd,Connection connection,Runtime runtime){ + + //示例: + //IWBPTE,353456789012345,080835,60# + //说明: + //IW:标识符 + //BPTE : 命令字符 + //353456789012345:IMEI号,设备唯一ID + //080835 :指令流水号 + //60 : 上传间隔,单位分钟(60分钟上传一次体温,终端收到后立即开始测量一次并重置定时器) + String[] list=cmd.split(CMDSPLIT); + if (list.length==4){ + String index=list[2]; + String freqstr=list[3]; + int freq=Integer.valueOf(freqstr); + connection.send(genStringMessage("APTE",APTE(index,freq))); + ICLogger.i("收到服务器指令:测量体温 "+freq+"分钟一次。"); + Config.setTemperatureTestCycle(runtime,freq); + CoreService.getInstance().setTempAlarm(); + double wrist_temp,body_temp; + wrist_temp=TemperatureUtil.get_temp_value_adjusted(); + body_temp=TemperatureUtil.getBodyTemp(wrist_temp,26.0f); + String temperatureMsg=APTP(wrist_temp,body_temp); + connection.send(genStringMessage("APTP",temperatureMsg)); + ICLogger.i("发送体温测量值 "+temperatureMsg); + }else{ + ICLogger.i("BP89 format error!"); + } + + } + + //体温上行(上行协议号:APTP,响应:BPTP) + public static String APTP(double wrist_temp,double body_temp){ + + //设备: IWAPTP,36.3,33,132# + //IW:标识符 + //APTP : 命令字符 + //35.3:测量体温 (摄氏度) + //33,132:温补用的参数,此处不用,可以用0 来代替。 + return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTP)) + .append(CMDSPLIT).append(String.format("%1$.2f",wrist_temp)) + .append(CMDSPLIT).append(String.format("%1$.2f",body_temp)) + .append(CMDSPLIT).append(0) + .append(CMDEND).toString(); + } + + public void handleBPTP(){ + + ICLogger.d("BPTP 服务器收到体温数据!"); + + } + + + public static String APX1(String id){ + //设备响应: IWAPX1, 080835# + //080835:指令流水号 + return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APX1)) + .append(CMDSPLIT).append(id) + .append(CMDEND).toString(); + } + + /** + * + * @param cmd + * @param connection + * @param runtime + */ + public void handleBPX1(String cmd,Connection connection,Runtime runtime){ + //IWBPX1,353456789012345,080835,2,1,-3,0# + //说明: +// IW:标识符 +// BPX1 : 命令字符 +// 353456789012345:IMEI号,设备唯一ID +// 080835 :指令流水号 +// 2: 心率修正值 +// 1:高压修正值 +// -3:低压修正值 +// 0:血氧修正值 + String[] list=cmd.split(CMDSPLIT); + if (list.length==7){ + String index=list[2]; + String imei=list[1]; + String strXL=list[3]; + String strBPH=list[4]; + String strBPL=list[5]; + String strSpO2=list[6]; + + connection.send(genStringMessage("APJZ",APX1(index))); + + int ppg_adjust,bph_adjust,bpl_adjust,spo2_adjust; + ppg_adjust=Integer.valueOf(strXL); + bph_adjust=Integer.valueOf(strBPH); + bpl_adjust=Integer.valueOf(strBPL); + spo2_adjust=Integer.valueOf(strSpO2); + + runtime.getHRS().setAdjust(ppg_adjust,bph_adjust,bpl_adjust,spo2_adjust); + Config.setPPGAdjust(mRuntime.getContextProxy().context,ppg_adjust); + Config.setBPHAdjust(mRuntime.getContextProxy().context,bph_adjust); + Config.setBPLAdjust(mRuntime.getContextProxy().context,bpl_adjust); + Config.setSPo2Adjust(mRuntime.getContextProxy().context,spo2_adjust); + + + ICLogger.i("Handle BPX1 IMEI "+imei+",index "+index+", BPH "+strBPH+", BPL "+strBPL+", PPG "+ strXL +", Sp02 "+ strSpO2); + }else{ + ICLogger.i("BPX1 format error!"); + } + } + + + + public static String APS4(String id){ + //设备响应: IWAPS4,080835# + //080835:指令流水号 + return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APS4)) + .append(CMDSPLIT).append(id) + .append(CMDEND).toString(); + } + + /** + * 主要为久坐设置提醒时长。 + * @param cmd + * @param connection + * @param runtime + */ + public void handleBPS4(String cmd,Connection connection,Runtime runtime){ + //IWBPS4,353456789012345,080835,1|1234567|0900|1100|180, 2|1234567|0900|1100|180, 1|1234567|0900|1100|180# + //说明: +// IW:标识符 +// BPS4: 命令字符 +// 353456789012345:设备IMEI或者ID +// 080835 :指令流水号 +// 1|1234567|0900|1100|180:类型(1久坐,2喝水)|重复周期|开始时间|结束时间|时间间隔(单位秒) +// 重复周期、开始结束时间格式 参考BP85闹钟设置, +//#:结尾标识符 + String[] list=cmd.split(CMDSPLIT); + if (list.length>=4){ + + String index=list[2]; + String imei=list[1]; + connection.send(genStringMessage("APS4",APS4(index))); + + String setting1; + switch(list.length){ + case 10: + setting1=list[9]; + ICLogger.i("set 7th alarm "+setting1); + case 9: + setting1=list[8]; + ICLogger.i("set 6th alarm "+setting1); + case 8: + setting1=list[7]; + ICLogger.i("set 5th alarm "+setting1); + case 7: + setting1=list[6]; + ICLogger.i("set 4th alarm "+setting1); + case 6: + setting1=list[5]; + ICLogger.i("set 3rd alarm "+setting1); + case 5: + setting1=list[4]; + ICLogger.i("set 2nt alarm "+setting1); + case 4: + setting1=list[3]; + ICLogger.i("set 1st alarm "+setting1); + break; + } + + ICLogger.i("Handle BPX1 IMEI "+imei+",index "+index+", get "+(list.length-3) +" settings"); + }else{ + ICLogger.i("BPX1 format error!"); + } + } + + public static String APHP(Runtime ds){ + //IWAPHP,60,130,85,95,90, , , , , , , , # + //IW:标识符 + //APHT : 命令字符 + //60 : 表示心率 + //130: 血压高压 [收缩压] + //85 : 血压低压 [舒张压] + //95:血氧 + //90:血糖 +// 本消息适用所有终端,其中需要每项指标不一定全部有值,如果无值,则留空 + return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APHP)) + .append(CMDSPLIT).append(ds.getHRS().getPPG()) + .append(CMDSPLIT).append(ds.getHRS().getBPH()) + .append(CMDSPLIT).append(ds.getHRS().getBPL()) + .append(CMDSPLIT).append(ds.getHRS().getSpo2()) + .append(CMDSPLIT).append(0) + .append(CMDSPLIT) + .append(CMDSPLIT) + .append(CMDSPLIT) + .append(CMDSPLIT) + .append(CMDSPLIT) + .append(CMDSPLIT) + .append(CMDSPLIT) + .append(CMDSPLIT) + .append(CMDEND).toString(); + } + public static String APHP(int ppg,int bph, int bpl, int spo2){ + //IWAPHP,60,130,85,95,90, , , , , , , , # + //IW:标识符 + //APHT : 命令字符 + //60 : 表示心率 + //130: 血压高压 [收缩压] + //85 : 血压低压 [舒张压] + //95:血氧 + //90:血糖 +// 本消息适用所有终端,其中需要每项指标不一定全部有值,如果无值,则留空 + return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APHP)) + .append(CMDSPLIT).append(ppg) + .append(CMDSPLIT).append(bph) + .append(CMDSPLIT).append(bpl) + .append(CMDSPLIT).append(spo2) + .append(CMDSPLIT).append(0) + .append(CMDSPLIT) + .append(CMDSPLIT) + .append(CMDSPLIT) + .append(CMDSPLIT) + .append(CMDSPLIT) + .append(CMDSPLIT) + .append(CMDSPLIT) + .append(CMDSPLIT) + .append(CMDEND).toString(); + } + + /** + * + * @param cmd + * @param connection + * @param runtime + */ + public void handleBPHP(){ + + ICLogger.i("服务器收到APHP 心率血压血氧 !"); + + } + + public boolean handleCmd(CMD_TYPE type, String cmd) { + + //普通非二进制命令用此函数处理 + boolean ret=true; + ICLogger.i("handleCmd "+type.name() + " strLen="+cmd.length()); + if (Config.LOG_TOFILE)ICLogger.logToFile("APILog", " recv " + cmd); + switch (type){ + case BP00: //登录包 + handleBP00(mRuntime,cmd); + ICLogger.i("服务器收到登录包AP00"); + mConnection.DeliverCMDMessageToSystem("BP00",cmd);//通知下面线程状态变化 + break; + case BP01: //gps定位包 + handleBP01(cmd); + ICLogger.i("服务器收到定位AP01"); + mConnection.DeliverCMDMessageToSystem("IWAP01",cmd);//通知下面线程状态变化 + break; + case BP02:// wifi定位包 + handleBP02(cmd); + ICLogger.i("服务器收到定位AP02"); + mConnection.DeliverCMDMessageToSystem("IWAP02",cmd);//通知下面线程状态变化 + break; + case BP03: //心跳包 + handleBP03(cmd); + ICLogger.i("服务器收到心跳包AP03"); + mConnection.DeliverCMDMessageToSystem("BP03",cmd);//通知下面线程状态变化 + break; + + case BP07: + //收到发送的语音包 + handleBP07(cmd,mConnection); + break; + case BP10: + //报警包 + mConnection.DeliverCMDMessageToSystem("IWAP10",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 BP33: + //设置工作模式 + handleBP33(mConnection,mRuntime,cmd); + mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化 + + break; + case BP34: + //设置工作模式 + handleBP34(mConnection,mRuntime,cmd); + mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化 + break; + case BP16: + //立即定位指令(长链接有效) + handleBP16(mConnection,mRuntime,cmd); + mConnection.DeliverCMDMessageToSystem("StartLocate",cmd);//通知下面线程状态变化 + break; + +// case BP05: //L02服务器不适用 +// //查询服务器语音 返回信息 +// API.handleBP05(cmd); +// break; + + case BP12: + //收到设置SOS号码 + handleBP12(mConnection,cmd,mRuntime); + ICLogger.i("收到服务器设置SOS号码命令BP12"); + break; + case BP14: + //收到设置白名单号码 + handleBP14(mConnection,cmd,mRuntime); + ICLogger.i("收到服务器设置白名单号码命令BP14"); + 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 BP31: + //收到关机 + handleBP31(mConnection,cmd); + ICLogger.i("收到服务器关机命令BP31"); + mConnection.DeliverCMDMessageToSystem("poweroff",cmd);//通知下面线程状态变化 + break; + case BP40: + //服务器推送文本 + handleBP40(mConnection,mRuntime,cmd); + ICLogger.i("收到服务器推送文本消息"); + mConnection.DeliverCMDMessageToSystem("showTxt",cmd);//通知下面线程状态变化 + break; + + case BPXL: + handleBPXL(cmd,mConnection); + ICLogger.i("收到服务器心率检测命令"); + HeartRateManager.triggerPPGtest(); + break; + case BPXY: + handleBPXY(cmd,mConnection); + ICLogger.i("收到服务器血压检测命令"); + HeartRateManager.triggerPPGtest(); + break; + case BPJZ: + handleBPJZ(cmd,mConnection,mRuntime); + ICLogger.i("收到服务器血压校准命令"); + break; + case BPHT: + ICLogger.i("服务器收到上传的心率血压"); + break; + case BP84: + handleBP84(cmd,mConnection); + ICLogger.i("收到服务器白名单命令"); + break; + + case BP86: + //绑定解绑消息 + handleBP86(cmd,mConnection,mRuntime); + mConnection.DeliverCMDMessageToSystem("AP86",cmd);//通知下面线程状态变化 + + break; + + case BP88: + //收到查找设备消息 + handleBP88(cmd,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 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; + } + + 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 BP28: + handleBP28(mConnection,cmd, mRuntime,bytes); + ICLogger.i("收到服务器语音BP28"); + mConnection.DeliverCMDMessageToSystem("BP28", "");//通知下面线程状态变化 + break; + } + return ret; + } +} diff --git a/dNSCache/dNSCache.iml b/dNSCache/dNSCache.iml index 31c0c0c7..9e1eb977 100644 --- a/dNSCache/dNSCache.iml +++ b/dNSCache/dNSCache.iml @@ -91,6 +91,5 @@ - \ No newline at end of file