--- /dev/null
+package com.ic.protocols;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Environment;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.text.TextUtils;
+
+import com.enqualcomm.support.Config;
+import com.enqualcomm.support.Constants;
+import com.enqualcomm.support.CoreService;
+import com.enqualcomm.support.R;
+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.CameraUtil;
+import com.enqualcomm.support.utils.Connection;
+import com.enqualcomm.support.utils.ICAudioManager;
+import com.enqualcomm.support.utils.ICLogger;
+import com.enqualcomm.support.utils.TemperatureUtil;
+import com.enqualcomm.support.utils.TimeUtil;
+import com.enqualcomm.support.utils.Util;
+import com.enqualcomm.support.utils.VibrateUtil;
+import com.enqualcomm.support.utils.WakeLockUtil;
+import com.ic.view.msg.MsgMustReadDialog;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+
+import static com.enqualcomm.support.Constants.DIALOG_ACTION;
+import static com.enqualcomm.support.Constants.FROM_SERVER;
+import static com.enqualcomm.support.LocationClient.LOCATION_MODE;
+import static com.enqualcomm.support.bean.Contact.GROUP_ALL;
+import static java.lang.Math.abs;
+
+/**
+ * IC协议
+ * 默认地址:watch.jiai.pro
+ * 默认端口:8090
+ * <p>
+ * S123走的配置文件中是自定义的:UsingCustomServer=true
+ * 国内服务器:判断条件:TARGET_APP_PACKAGES=zh(后台地址:http://cn.map20000.com/)
+ * customserverip=120.79.160.23
+ * customserverport=32000
+ * 国外服务器:判断条件:TARGET_APP_PACKAGES=zh以外的
+ * customserverip=47.74.9.33
+ * customserverport=8083
+ */
+public class protocol_ic_backup {
+ private static final String TAG = "ICSrv." + protocol_ic_backup.class.getSimpleName();
+
+ private static final String CMDHEADER = "IW";
+ private static final String CMDEND = "#";
+ private static final String CMDSPLIT = ",";
+ public static final String defaultServerIP = "watch.jiai.pro";
+ public static final int defaultServerPort = 8090;
+
+ public enum CMD_TYPE {
+ /*终端发起*/
+ AP00,//登录包
+ BP00,
+ AP01,//混合定位
+ BP01,
+ AP02,//多基站定位
+ BP02,
+ AP92,//CDMA 混合定位
+ BP92,
+ AP94,
+ BP94,
+ AP03,//心跳包
+ BP03,
+ AP05,//语音查询接收
+ BP05,
+ AP07,//语音上行
+ BP07,
+ AP10,//报警与地址回复
+ BP10,
+ AP49,//心率上传
+ BP49,
+ APHT,//心率血压上传
+ BPHT,
+ APTM,//基站校时及获取定位
+ BPTM,
+ APCH,//充电提示
+ BPCH,
+ APBR,//上传蓝牙扫描结果
+ BPBR,
+ /* 服务器发起*/
+ 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,//心率周期
+ AP87,
+ BP87,//二维码更新
+ AP88,
+ BP88,//查找手表
+ AP89,
+ BP89,//心率血压阀值设置
+ APTE,
+ BPTE,//体温间隔设置
+ APTP,
+ BPTP,//体温上行
+ APX1,
+ BPX1,//心率血压血氧修正
+ APS4,
+ BPS4,//提醒设置(时间段)
+ APHP,//上报心率血压血氧
+ BPHP,
+ APDE,//进出围栏通知
+ BPDE,
+ APDG,//体温阀值设置
+ BPDG,
+ APTU,//上传语音图片
+ BPTU,
+ APSL,//上传睡眠数据
+ BPSL,
+ AP46,//立即拍照
+ BP46,
+ APDH,//聆听
+ BPDH,
+ AP99,//监听电话
+ BP99,
+ APTQ,//天气
+ BPTQ,
+ APAT,//剪断消息开关
+ BPAT,
+ APBT,
+ BPBT,//设置蓝牙扫描间隔
+ APBS,
+ BPBS,//设置蓝牙绑定Major
+ APWL,
+ BPWL,//设置白名单
+ AP65,
+ BP65,//设置音量
+ AP47,
+ BP47,//设置震动
+ UNKNOWN_CMD,
+ }
+
+ private static HashMap<CMD_TYPE, String> cmdMap;
+
+ static {
+ cmdMap = new HashMap<CMD_TYPE, String>();
+ 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.AP94, "AP94");
+ cmdMap.put(CMD_TYPE.BP94, "BP94");
+ 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.APCH, "APCH");
+ cmdMap.put(CMD_TYPE.BPCH, "BPCH");
+ cmdMap.put(CMD_TYPE.APBR, "APBR");
+ cmdMap.put(CMD_TYPE.BPBR, "BPBR");
+ /* 服务器发起*/
+ 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.AP87, "AP87");
+ cmdMap.put(CMD_TYPE.BP87, "BP87");
+ 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");
+ cmdMap.put(CMD_TYPE.APDE, "APDE");
+ cmdMap.put(CMD_TYPE.BPDE, "BPDE");
+ cmdMap.put(CMD_TYPE.APDG, "APDG");
+ cmdMap.put(CMD_TYPE.BPDG, "BPDG");
+ cmdMap.put(CMD_TYPE.APTU, "APTU");
+ cmdMap.put(CMD_TYPE.BPTU, "BPTU");
+ cmdMap.put(CMD_TYPE.APSL, "APSL");
+ cmdMap.put(CMD_TYPE.BPSL, "BPSL");
+ cmdMap.put(CMD_TYPE.AP46, "AP46");
+ cmdMap.put(CMD_TYPE.BP46, "BP46");
+ cmdMap.put(CMD_TYPE.APDH, "APDH");
+ cmdMap.put(CMD_TYPE.BPDH, "BPDH");
+ cmdMap.put(CMD_TYPE.AP99, "AP99");
+ cmdMap.put(CMD_TYPE.BP99, "BP99");
+ cmdMap.put(CMD_TYPE.APTQ, "APTQ");
+ cmdMap.put(CMD_TYPE.BPTQ, "BPTQ");
+ cmdMap.put(CMD_TYPE.APAT, "APAT");
+ cmdMap.put(CMD_TYPE.BPAT, "BPAT");
+ cmdMap.put(CMD_TYPE.APBT, "APBT");
+ cmdMap.put(CMD_TYPE.BPBT, "BPBT");
+ cmdMap.put(CMD_TYPE.APBS, "APBS");
+ cmdMap.put(CMD_TYPE.BPBS, "BPBS");
+ cmdMap.put(CMD_TYPE.APWL, "APWL");
+ cmdMap.put(CMD_TYPE.BPWL, "BPWL");
+ cmdMap.put(CMD_TYPE.AP65, "AP65");
+ cmdMap.put(CMD_TYPE.BP65, "BP65");
+ cmdMap.put(CMD_TYPE.AP47, "AP47");
+ cmdMap.put(CMD_TYPE.BP47, "BP47");
+ }
+
+
+ private Connection mConnection = null;
+ private Runtime mRuntime = null;
+
+ public protocol_ic_backup(Connection connect, Runtime runtime) {
+ if (mHandler == null) {
+ HandlerThread handlerThread = new HandlerThread("ic:protocol_ic-handler-thread");
+ handlerThread.start();
+ mHandler = new Handler(handlerThread.getLooper());
+ }
+ mConnection = connect;
+ mRuntime = runtime;
+ }
+
+ private StringBuffer cmdbuf = new StringBuffer();
+
+ /*
+ 输入的字符串,如果有完整命令,返回 命令名
+ 否则返回 空字符串
+ */
+ public static String 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 "";
+ }
+ } else {
+ return "";
+ }
+
+ for (CMD_TYPE key : cmdMap.keySet()) {
+ if (msg.startsWith(CMDHEADER + cmdMap.get(key))) {
+ ICLogger.i("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key));
+ return cmdMap.get(key);
+ }
+ }
+
+ return "";
+ }
+
+ private void log(String msg) {
+ ICLogger.log(TAG, msg);
+ }
+
+ private void log(String function, String msg) {
+ ICLogger.log(TAG, function, msg);
+ }
+
+
+ private Handler mHandler = null;
+
+ /**/
+ 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;
+ }
+
+ /*
+ 返回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);
+ ICLogger.d("bytes.size " + bytes.length);
+// cmdbuf.append(cmd_msgbuf);
+ cmdbuf.append(cmd_msgbuf);
+ ICLogger.d("cmdbuf.size " + cmdbuf.length() + " " + cmdbuf.toString());
+ /*
+ 如果不是 #结尾,就认为 接收数据不全,置位。
+ */
+ if (cmdbuf.toString().endsWith(CMDEND)) {
+ iscmdComplete = true;
+ }
+ String[] cmdlist = cmd_msgbuf.split(CMDEND);
+ int listlen = cmdlist.length;
+ ICLogger.d("listlen " + listlen);
+ /**
+ * 如果解析出来的cmdlist不是空,且数据不是完整cmd则保留 最后一条数据到last_inCompletecmd
+ */
+ if (cmdlist.length > 0 && iscmdComplete == false) {
+ listlen -= 1;
+ last_inCompletecmd = cmdlist[listlen];
+ ICLogger.d("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))) {
+ ICLogger.d("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) {
+ try {
+ Name = msg[1];
+ appendIndex = msg[2];
+ packetCount = Integer.parseInt(msg[3]);
+ currentId = Integer.parseInt(msg[4]);
+ packetLen = Integer.parseInt(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;
+ } catch (Exception e) {
+ ICLogger.e(e.getMessage(), e);
+ }
+
+ } else {
+ log("getBP28AmrLen", "format Error");
+
+ }
+ return -1;
+ }
+
+ /*登录*/
+ public static StringMessage AP00(Runtime ds) {
+ //示例数据:IWAP00867155030001063#
+ return genStringMessage(cmdMap.get(CMD_TYPE.AP00),
+ 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]);
+ try {
+ Date datetime = TimeUtil.parseDatetiime(msg[1]);
+ int timezone = Integer.parseInt(msg[2]);
+ if (datetime != null) {
+ ICLogger.i("===" + TimeUtil.getDefaultTimeZone());
+ TimeUtil.setTimeZone(runtime.getContextProxy().context, timezone);
+
+ ICLogger.i("===" + TimeUtil.getDefaultTimeZone());
+ TimeUtil.setSysDateTime(runtime.getContextProxy().context, datetime, timezone, true);
+ ICLogger.i("===" + TimeUtil.getDefaultTimeZone());
+
+ }
+ } catch (Exception e) {
+ ICLogger.e(e.getMessage(), e);
+ }
+// Set Datetime 20200505112734
+// Set TimeZone 8
+
+ } else {
+ log("handleBP00", "format Error");
+ }
+ }
+
+
+ public static StringMessage 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 genStringMessage(cmdMap.get(CMD_TYPE.AP03), 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(ds.isPowerConnected() ? "1" : "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 StringMessage 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:跌倒报警,07:心率异常, 08:心率过高, 09:心率过低,10:收缩压过高,11:收缩压过低,12:舒张压过高,13:舒张压过低,14:久坐提醒,15:非法解锁(剪断报警),16:锁定提醒(佩戴提醒),17:体温过高,18体温过低)
+ * 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 genStringMessage(cmdMap.get(CMD_TYPE.AP10), 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 StringMessage 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 genStringMessage(cmdMap.get(CMD_TYPE.AP01), 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 StringMessage 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 genStringMessage(cmdMap.get(CMD_TYPE.AP02), 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 StringMessage APXL(String id) {
+//设备响应: IWAPXL,080835#
+ //080835:指令流水号
+ return genStringMessage(cmdMap.get(CMD_TYPE.APXL), 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(APXL(index));
+ } else {
+ ICLogger.i("BPXL format error!");
+ }
+
+ }
+
+ public static StringMessage APXY(String id) {
+//设备响应: IWAPXY,080835#
+ //080835:指令流水号
+ return genStringMessage(cmdMap.get(CMD_TYPE.APXY), 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(APXY(index));
+ } else {
+ ICLogger.i("BPXY format error!");
+ }
+
+ }
+
+
+ public static StringMessage APJZ(String id, String BPH, String BPL, String Age, String Sex) {
+ //设备响应: IWAPJZ,792997,120,85,42,1#
+ //792997:指令流水号
+ // 高压120,低压85,年龄42,1 男性
+ return genStringMessage(cmdMap.get(CMD_TYPE.APJZ), 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) {
+ try {
+ 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(APJZ(index, strBPH, strBPL, strAge, strSex));
+ runtime.getHRS().setXY_Ref(Integer.parseInt(strBPH), Integer.parseInt(strBPL), Integer.parseInt(strAge), Integer.parseInt(strSex));
+ ICLogger.i("Handle BPJZ IMEI " + imei + ",index " + index + ", BPH " + strBPH + ", BPL " + strBPL + ", Age " + strAge + ", Sex " + (strSex.equals("1") ? "男" : "女"));
+ } catch (Exception e) {
+ ICLogger.e(e.getMessage(), e);
+ }
+ } else {
+ ICLogger.i("BPXY format error!");
+ }
+ }
+
+
+ //重启
+
+
+ public static StringMessage AP18(String index) {
+ return genStringMessage(cmdMap.get(CMD_TYPE.AP18), 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(AP18(cmdlist[2]));
+
+ }
+ }
+ //恢复出厂设置
+
+ public static StringMessage AP17(String index) {
+ return genStringMessage(cmdMap.get(CMD_TYPE.AP17), 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(AP17(cmdlist[2]));
+
+ }
+ }
+
+ //关机
+
+
+ public static StringMessage AP31(String index) {
+ return genStringMessage("AP31", 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(AP31(cmdlist[2]));
+
+ }
+ }
+
+ //设置SOS号码
+ public static StringMessage AP12(String index, String phNum1, String phNum2, String phNum3) {
+ return genStringMessage("AP12", 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(AP12(index, phNum1, phNum2, phNum3));
+
+ ArrayList<Contact> contactArray = new ArrayList<Contact>();
+// if(Config.custom_branch_name.equals("AK")){
+//
+// contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos1", "07522312120"));
+// if (!phNum1.isEmpty())
+// contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos2", phNum1));
+// if (!phNum2.isEmpty())
+// contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos3", phNum2));
+// }else {
+ 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 StringMessage AP14(String index, String[] phnumbs) {
+ return genStringMessage("AP14", 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(AP14(index, phnums));
+ ArrayList<Contact> contactArray = new ArrayList<Contact>();
+
+ if (Config.custom_name.equals("YT")) {
+ ICLogger.i("=====add hotline 96885 ");
+ contactArray.add(new Contact(Contact.CATEGORY_CALL, runtime.getContextProxy().context.getResources().getString(R.string.hotline), "96885"));
+ }
+ 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 StringMessage AP85(Runtime ds, String cmddata) {
+//示例数据:IWAP49,68##
+ return genStringMessage("AP85", 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<Alarm> 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) {
+ try {
+ imei = cmdArgList[1];
+ cmdindex = cmdArgList[2];
+ all_alarmswitch = Integer.parseInt(cmdArgList[3]);
+ alarmcount = Integer.parseInt(cmdArgList[4]);
+ alarmtime = cmdArgList[5];
+ repeat = cmdArgList[6];
+ alarmswitch = Integer.parseInt(cmdArgList[7]);
+ alarmtype = Integer.parseInt(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", "闹铃"));
+ } catch (Exception e) {
+ ICLogger.e(e.getMessage(), e);
+ }
+ } else if (cmdArgList.length == 5) {
+ try {
+ imei = cmdArgList[1];
+ cmdindex = cmdArgList[2];
+ all_alarmswitch = Integer.parseInt(cmdArgList[3]);
+ alarmcount = Integer.parseInt(cmdArgList[4]);
+ } catch (Exception e) {
+ ICLogger.e(e.getMessage(), e);
+ }
+ } else {
+ log("data len is too small!");
+ }
+ } else {
+ if (cmdArgList.length == 4) {
+ try {
+ alarmtime = cmdArgList[0];
+ repeat = cmdArgList[1];
+ alarmswitch = Integer.parseInt(cmdArgList[2]);
+ alarmtype = Integer.parseInt(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", "闹铃"));
+ } catch (Exception e) {
+ ICLogger.e(e.getMessage(), e);
+ }
+ } 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(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, Connection connection) {
+//平台响应: IWBP07,20140818064408,6,1,1#
+//20140818064408:设备语音时间,yyyyMMddHHmmss 格式的年月日时分秒
+//6:语音包分包总数
+//1:当前设备收到的是第几个包
+//1:表示服务器接受数据成功,0表示服务器接受数据失败
+ String[] cmdlist = cmd.split(CMDSPLIT);
+ if (cmdlist.length == 5) {
+ try {
+ String time = cmdlist[1];
+ int packetCount = Integer.parseInt(cmdlist[2]);
+ int packetIndex = Integer.parseInt(cmdlist[3]);
+ int receiveSuccess = Integer.parseInt(cmdlist[4]);
+ ICLogger.i("服务器在" + time + " 收到语音 " + packetIndex + "/" + packetCount + " " + (receiveSuccess == 1 ? "成功" : "失敗"));
+ if (receiveSuccess == 1) {
+ //如果服务器接收 语音成功,则设置下一个要发送的语音包Index,当index == packetCount的时候表示所有包发送完毕,停止继续发送
+ voicePacket.getInstanceSent().setCurrentIndexToSent(packetIndex);
+ }
+ //发送消息,再次检查要发送的语音包,确认其发送完毕
+ connection.DeliverCMDMessageToSystem("SentVoicePacket", "SentVoicePacket");
+ } catch (Exception e) {
+ ICLogger.e(e.getMessage(), e);
+ }
+ } else {
+ ICLogger.i(" BP07 Format error!");
+ }
+ }
+
+
+ public static StringMessage AP33(String cmdindex, int workMode) {
+//IWAP33,080835,1#
+//080835:指令流水号
+//1:设置信息,供服务器同步
+ return genStringMessage("AP33", 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("com.ic.work mode " + cmdlist[3]);
+ try {
+ int mod = Integer.parseInt(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;
+
+ }
+
+ StringMessage msg = AP33(cmdlist[2], mod);
+ //设定当前工作模式及循环频率
+ connection.send(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);
+ } catch (Exception e) {
+ ICLogger.e(e.getMessage(), e);
+ }
+// CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod());
+ //此处设置好配置后,会在LocationClient通过消息开始执行及时定位操作。
+ }
+
+ }
+
+
+ public static StringMessage AP34(String cmdindex, int workMode) {
+//IWAP34,588854,1#
+//080835:指令流水号
+//8:模式
+ return genStringMessage("AP34", 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("com.ic.work mode " + cmdlist[3]);
+ try {
+ int mod = Integer.parseInt(cmdlist[3]);
+ int Cycle = Integer.parseInt(cmdlist[4]);
+ int gpson = Integer.parseInt(cmdlist[5]);
+
+ StringMessage msg = AP34(cmdlist[2], mod);
+ //设定当前工作模式及循环频率
+ connection.send(msg);
+
+ if (gpson == 1) {
+ mod = ICLocation.CUSTOM_MOD8_GPS;
+ } else {
+ mod = ICLocation.CUSTOM_MOD8_WIFI;
+ }
+ log("reply msg " + msg.isFromCache());
+ 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通过消息开始执行及时定位操作。
+ } catch (Exception e) {
+ ICLogger.e(e.getMessage(), e);
+ }
+ }
+
+ }
+
+ public void handleBP40(Connection connection, Runtime runtime, String cmd) {
+
+// IWBP40,353456789012345,080835,XXXXXXXXXXXXXX#
+// IW:标识符
+// BP40 : 命令字符
+// 353456789012345:IMEI号,设备唯一ID
+// 080835 :指令流水号
+// XXXXXXXXXXXX : 表示文字内容GB2312编码
+
+ ICLogger.d("cmd == > " + cmd);
+ //这里的切割,如查是云图的后台,会有问题,如果文本内容里有,那么就会切割出错了。所以需要后台去解决这个问题。
+ String[] cmdlist = cmd.split(",");
+ ICLogger.d("cmdlist length == > " + cmdlist);
+ if (cmdlist.length == 4) {
+ String cmdindex = cmdlist[2];
+ String txtmsg = cmdlist[3];
+ StringBuilder sb = new StringBuilder();
+ Runtime.PushtxtMsg_srv_index = cmdindex;//给回复AP94用
+ sb.append(cmdindex).append(CMDSPLIT).append(TimeUtil.getSystemTimeyyyyMMddHHmmss()).append(CMDSPLIT).append(txtmsg);
+ if (Config.custom_name.equals("VitracK")) {
+
+ } else if (Util.getSystemProperties("persist.sys.pushtxt_encode", "gb2312").equals("utf-8")) {
+ // txtmsg = Util.decodeUnicode2Utf8(txtmsg);
+// txtmsg = Util.UrlGB2312ToUTF8(txtmsg);
+ txtmsg = Util.UrlUTF8ToStrUTF8(txtmsg);
+ } else {
+ txtmsg = Util.UrlGB2312ToUTF8(txtmsg);
+ }
+ StringMessage msg = AP40(cmdindex, 1);
+ //设定当前工作模式及循环频率
+ connection.send(msg);
+ ICLogger.i("received Txt Msg " + txtmsg);
+ if (!Config.noPushTxtReadReply) {
+ Config.setLastUnReadMessage(runtime.getContextProxy().context, sb.toString());
+ runtime.getContextProxy().sendMsgBroadcast(txtmsg, 3);//msgType 3需要回复,0不需要回复
+ } else {
+ //判断产品类型,如果是S123的,那么就不发广播了
+ //读取一个变量值,判断是否弹窗
+ String forceReadMsg = Util.getSystemProperties("persist.sys.forcereadmsg");
+ ICLogger.d("forceReadMsg == > " + forceReadMsg);
+ if (!TextUtils.isEmpty(forceReadMsg)) {
+ MsgMustReadDialog instance = MsgMustReadDialog.getInstance();
+ instance.showMsgDialog();
+ List<String> list = new ArrayList<>();
+ list.add(txtmsg);
+ instance.addData(list);
+ } else {
+ runtime.getContextProxy().sendMsgBroadcast(txtmsg, 0);//msgType 3需要回复,0不需要回复
+ }
+ }
+ //保存到数据库里
+ runtime.getContextProxy().saveMstToSMSDB(txtmsg);
+ } else {
+ ICLogger.i("BP40 format error!");
+ }
+ }
+
+ public static StringMessage AP40(String cmdindex, int success) {
+
+// IWAP40,080835,1#
+// 080835:指令流水号
+// 1:表示设备接受数据成功,0表示设备接受数据失败
+ return genStringMessage("AP40", 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 StringMessage AP49(Runtime ds) {
+ //示例数据:IWAP49,68##
+ return genStringMessage(cmdMap.get(CMD_TYPE.AP49), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP49))
+ .append(CMDSPLIT).append(ds.getHRS().getPPG())
+ .append(CMDEND).toString());
+
+ }
+
+
+ /**
+ * 返回上传心率血压的协议字串
+ *
+ * @param ds
+ * @return
+ */
+ public static StringMessage APHT(Runtime ds) {
+ //IWAPHT,60,130,85#
+ //说明:
+ //IW:标识符
+ //APHT : 命令字符
+ //60 : 表示心率
+ //130: 血压高压 [收缩压]
+ //85 : 血压低压 [舒张压]
+ //平台响应: IWBPHT#
+ //表示平台已接收,可不作响应
+ return genStringMessage(cmdMap.get(CMD_TYPE.APHT), 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 StringMessage APHT(int ppg, int bph, int bpl) {
+ //IWAPHT,60,130,85#
+ //说明:
+ //IW:标识符
+ //APHT : 命令字符
+ //60 : 表示心率
+ //130: 血压高压 [收缩压]
+ //85 : 血压低压 [舒张压]
+ //平台响应: IWBPHT#
+ //表示平台已接收,可不作响应
+ return genStringMessage(cmdMap.get(CMD_TYPE.APHT), 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 StringMessage AP16(String cmdindex) {
+//IWAP16,080835#
+//080835:指令流水号
+ return genStringMessage(cmdMap.get(CMD_TYPE.AP16), 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(AP16(cmdlist[2]));
+ } else {
+ log("error BP16 format");
+ }
+ }
+
+
+ /*通过基站获取时间和坐标*/
+ public static StringMessage APTM(Runtime ds) {
+ //示例数据:IWAPTM,460,0,9750,3613#
+ //说明:
+ //IW:标识符
+ //APTM : 命令字符
+ //460:MCC
+ //0: MNC
+ //9750: LAC
+ //3613: CID
+
+ return genStringMessage(cmdMap.get(CMD_TYPE.APTM), 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 StringMessage AP15(String index) {
+//IWAP15, 080835#
+//080835:指令流水号
+ return genStringMessage("AP15", 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(AP15(index));
+ ICLogger.i("BP15 , 定位周期=" + time + "秒");
+
+ try {
+ Config.setLocationMode(runtime.getContextProxy().context, ICLocation.CUSTOM_MOD8_GPS);
+ Config.setLocationCycle(runtime.getContextProxy().context, Integer.parseInt(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());
+ } catch (Exception e) {
+ ICLogger.e(e.getMessage(), e);
+ }
+ } else {
+ ICLogger.i("BP15 format error");
+ }
+
+ }
+
+
+ /*语音下行反馈*/
+ public static StringMessage AP28(String name, String msg, int packagecount, int currentpackageindex, int received_success) {
+ //示例数据:IWAP28,D3590D54,xxxx,6,1,1#
+ return genStringMessage("AP28", 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(Connection 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) {
+
+ try {
+ Name = msg[1];
+ appendIndex = msg[2];
+ packetCount = Integer.parseInt(msg[3]);
+ currentId = Integer.parseInt(msg[4]);
+ packetLen = Integer.parseInt(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(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);//通知下面线程状态变化
+ }
+ } catch (Exception e) {
+ ICLogger.e(e.getMessage(), e);
+ }
+
+ } 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 StringMessage AP84(String index, int success) {
+
+ //设备响应: IWAP80,080835,1#
+ //080835:指令流水号
+ //1:表示设备执行成功,0 表示设备执行失败
+ return genStringMessage("AP84", 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(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 StringMessage AP68(String index, String cmd) {
+
+ //设备响应: IWAP86, 080835,1#
+ //080835:指令流水号
+ return genStringMessage("AP86", new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP68))
+ .append(CMDSPLIT).append(index)
+ .append(CMDSPLIT).append(cmd)
+ .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(AP68(index, type));
+ ICLogger.i("收到服务器消息:" + (type.equals("1") ? "绑定成功 " : "未激活或者解绑"));
+ if (Config.custom_name.equals("YQ") || Config.custom_name.equals("YQ_EN")) {//AK-YQ
+ if (type.equals("1")) {
+ WakeLockUtil.ScreenOnWakeLockTemperary(runtime.getContextProxy().context);
+// runtime.getContextProxy().sendMsgBroadcast(runtime.getContextProxy().context.getResources().getString(R.string.alarm_lock_success), 2);
+ Util.ShowToast(runtime, runtime.getContextProxy().context.getResources().getString(R.string.alarm_lock_success));
+ Config.setNeedAntiOff(runtime.getContextProxy().context, true);
+ Config.setNeedCutOff(runtime.getContextProxy().context, true);
+ runtime.setNeedAntioff(true);
+ runtime.setNeddReportCutoff(true);
+ } else {
+ WakeLockUtil.ScreenOnWakeLockTemperary(runtime.getContextProxy().context);
+ runtime.getContextProxy().sendMsgBroadcast(runtime.getContextProxy().context.getResources().getString(R.string.alarm_unbind_success), 2);
+ Config.setNeedAntiOff(runtime.getContextProxy().context, false);
+ Config.setNeedCutOff(runtime.getContextProxy().context, false);
+ runtime.setNeedAntioff(false);
+ runtime.setNeddReportCutoff(false);
+ //1 分钟后重置
+ mHandler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ Util.doMasterClear(runtime.getContextProxy().context);
+ }
+ }, 5000);
+ }
+ }
+
+ } else {
+ ICLogger.i("BP86 format error!");
+ }
+
+ }
+
+
+ //17.设置心率/血压测量周期(下行协议号:BP86,响应:AP86)
+ public static StringMessage AP86(String index) {
+
+ //设备响应: IWAP86, 080835#
+ //080835:指令流水号
+ return genStringMessage("AP86", 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#
+ //说明:IWBP86,867400020316612,858663,1,30
+ //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(AP86(index));
+ ICLogger.i("收到服务器指令:设置" + (type.equals("1") ? "心率周期 " : "血压周期 ") + cycle + "分钟");
+
+ try {
+ //发送重置PPGCycle的广播,会在CoreServer里面执行
+ CoreService.getInstance().setHeartRateDetectAlarm(Integer.parseInt(cycle));
+// Intent intent = new Intent();
+// intent.putExtra("PPGTestCycle", Integer.parseInt(cycle));
+// intent.setFlags(FLAG_INCLUDE_STOPPED_PACKAGES);
+// intent.setFlags(FLAG_ACTIVITY_NEW_TASK);
+// runtime.getContextProxy().sendBrodcast(ACTION_HEATR_RATE_START, intent);
+ } catch (Exception e) {
+ ICLogger.e(e.getMessage(), e);
+ }
+ } else {
+ ICLogger.i("BP86 format error!");
+ }
+
+ }
+
+ //IWBP87,http://cn.map20000.com/physicalReport.html?lang=zh-CN&imeis=866671044898063#
+ public static StringMessage AP87() {
+
+ //设备响应: IWAP86, 080835#
+ //080835:指令流水号
+ return genStringMessage("AP87", new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP87))
+ .append(CMDEND).toString());
+ }
+
+ public void handleBP87(String cmd, Connection connection, Runtime runtime) {
+
+ //IWBP87,http://cn.map20000.com/physicalReport.html?lang=zh-CN&imeis=866671044898063#
+
+ String[] list = cmd.split(CMDSPLIT);
+
+ if (list.length == 2) {
+ String furl = list[1];//.replace("#","");
+ ICLogger.i("收到服务器指令 BP87:Qrcode url " + furl);
+// connection.send(AP87());
+ try {
+ String qrfilepath = Util.getLogfilePath(runtime, TimeUtil.getSystemDateYYMMDD());
+ Util.setSystemProperties(Config.KeyQRURIFILE, qrfilepath);
+ FileOutputStream fos = new FileOutputStream(new File(qrfilepath));
+ fos.write(furl.getBytes());
+ fos.close();
+ } catch (Exception e) {
+ ICLogger.e(e.getMessage(), e);
+ }
+ } else {
+ ICLogger.i("BP87 format error!");
+ }
+
+ }
+
+ public static StringMessage AP88(String index) {
+ //设备响应: IWAP88, 080835#
+ //080835:指令流水号
+ return genStringMessage("AP88", 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(AP88(index));
+ ICLogger.i("收到服务器消息:查询设备");
+
+ } else {
+ ICLogger.i("BP88 format error!");
+ }
+ }
+
+ //18.18.设置心率/血压阀值(下行协议号:BP89,响应:AP89)
+ public static StringMessage AP89(String index) {
+
+ //设备响应: IWAP89, 080835#
+ //080835:指令流水号
+ return genStringMessage("AP89", 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(AP89(index));
+
+
+ ICLogger.i("收到服务器指令:心率/血压阀值 " + PPGH + "," + PPGL + "," + BPH_H + "," + BPH_L + "," + BPL_H + "," + BPL_L);
+ } else {
+ ICLogger.i("BP89 format error!");
+ }
+
+ }
+
+ //体温间隔测量 (后台测试体温)(下行协议号:BPTE,响应:APTE)
+ public static StringMessage APTE(String index, int freq) {
+
+ //设备响应: IWAPTE,080835,60#
+ //080835:指令流水号
+ //1:表示设备接受数据成功,0表示设备接受数据失败
+ return genStringMessage("APTE", 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) {
+ try {
+ String index = list[2];
+ String freqstr = list[3];
+ int freq = Integer.parseInt(freqstr);
+ connection.send(APTE(index, freq));
+ ICLogger.i("收到服务器指令:测量体温 " + freq + "分钟一次。");
+ Config.setTemperatureTestCycle(runtime, freq * 60);
+ CoreService.getInstance().setTempAlarm(true);
+ if (runtime.check_stat_do_temp_test())
+ TemperatureUtil.getInstance().doTempTestInThread(FROM_SERVER);
+ } catch (Exception e) {
+ ICLogger.e(e.getMessage(), e);
+ }
+ } else {
+ ICLogger.i("BPTE format error!");
+ }
+
+ }
+
+ //体温上行(上行协议号:APTP,响应:BPTP)
+ public static StringMessage APTP(double wrist_temp, double body_temp, double tempout) {
+
+ //设备: IWAPTP,36.3,33,132#
+ //IW:标识符
+ //APTP : 命令字符
+ //35.3:测量体温 (摄氏度)
+ //33,132:温补用的参数,此处不用,可以用0 来代替。 目前是代表的腕温,室外温度
+ return genStringMessage(cmdMap.get(CMD_TYPE.APTP), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTP))
+ .append(CMDSPLIT).append(String.format("%1$.1f", body_temp))
+ .append(CMDSPLIT).append(String.format("%1$.1f", wrist_temp))
+ .append(CMDSPLIT).append(String.format("%1$.1f", tempout))
+ .append(CMDEND).toString());
+ }
+
+ public void handleBPTP() {
+
+ ICLogger.d("BPTP 服务器收到体温数据!");
+
+ }
+
+
+ public static StringMessage APX1(String id) {
+ //设备响应: IWAPX1, 080835#
+ //080835:指令流水号
+ return genStringMessage("APX1", 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(APX1(index));
+
+ try {
+ int ppg_adjust, bph_adjust, bpl_adjust, spo2_adjust;
+ ppg_adjust = Integer.parseInt(strXL);
+ bph_adjust = Integer.parseInt(strBPH);
+ bpl_adjust = Integer.parseInt(strBPL);
+ spo2_adjust = Integer.parseInt(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);
+ String ShareAdjValue = new StringBuilder().append(ppg_adjust).append(CMDSPLIT)
+ .append(bph_adjust).append(CMDSPLIT)
+ .append(bpl_adjust).append(CMDSPLIT)
+ .append(spo2_adjust).append(CMDSPLIT).toString();
+ Config.setPPG_ECG_adjustValue(ShareAdjValue);
+ ICLogger.i("Handle BPX1 IMEI " + imei + ",index " + index + ", BPH " + strBPH + ", BPL " + strBPL + ", PPG " + strXL + ", Sp02 " + strSpO2 + " , Shared Adjust Value " + ShareAdjValue);
+ } catch (Exception e) {
+ ICLogger.e(e.getMessage(), e);
+ }
+ } else {
+ ICLogger.i("BPX1 format error!");
+ }
+ }
+
+
+ public static StringMessage APS4(String id) {
+ //设备响应: IWAPS4,080835#
+ //080835:指令流水号
+ return genStringMessage("APS4", 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(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 StringMessage APHP(Runtime ds) {
+ //IWAPHP,60,130,85,95,90, , , , , , , , #
+ //IW:标识符
+ //APHT : 命令字符
+ //60 : 表示心率
+ //130: 血压高压 [收缩压]
+ //85 : 血压低压 [舒张压]
+ //95:血氧
+ //90:血糖
+// 本消息适用所有终端,其中需要每项指标不一定全部有值,如果无值,则留空
+ return genStringMessage(cmdMap.get(CMD_TYPE.APHP), 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 StringMessage APHP(int ppg, int bph, int bpl, int spo2) {
+ //IWAPHP,60,130,85,95,90, , , , , , , , #
+ //IW:标识符
+ //APHT : 命令字符
+ //60 : 表示心率
+ //130: 血压高压 [收缩压]
+ //85 : 血压低压 [舒张压]
+ //95:血氧
+ //90:血糖
+// 本消息适用所有终端,其中需要每项指标不一定全部有值,如果无值,则留空
+ return genStringMessage(cmdMap.get(CMD_TYPE.APHP), 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());
+ }
+
+
+ public void handleBPHP() {
+
+ ICLogger.i("服务器收到APHP 心率血压血氧 !");
+
+ }
+
+ public static StringMessage APDE(String id) {
+ /***
+ * 示例:
+ * 设备响应: IWAPDE,080835#
+ * 080835:指令流水号
+ * 说明: 本消息适用所有终端
+ */
+ return genStringMessage("APDE", new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APDE))
+ .append(CMDSPLIT).append(id)
+ .append(CMDEND).toString());
+ }
+
+ public void handleBPDE(Connection connection, String cmd, Runtime runtime) {
+/***
+ * 示例:
+ * IWBPDE,867400020316612,853676,0
+ * 说明:
+ * IW:标识符
+ * BPDE: 命令字符
+ * 353456789012345:设备IMEI或者ID
+ * 080835 :指令流水号
+ * 0:进入禁止区域 1离开禁止区域
+ * #:结尾标识符
+ * 设备响应: IWAPDE,080835#
+ * 080835:指令流水号
+ * 说明: 本消息适用所有终端
+ */
+ String[] list = cmd.split(CMDSPLIT);
+ if (list.length == 4) {
+
+ String index = list[2];
+ String msg = list[3];
+ connection.send(APDE(index));
+ try {
+ if (Integer.parseInt(msg) == 0) {
+ ICLogger.i("Handle BPDE index " + index + ", 进入禁止区域 ");
+ runtime.Fence_Warning_flag = 1;
+ WakeLockUtil.ScreenOnWakeLockTemperary(runtime.getContextProxy().context);
+ runtime.getContextProxy().sendMsgBroadcast(runtime.getContextProxy().context.getResources().getString(R.string.alarm_out_wall), 2);
+ } else {
+ ICLogger.i("Handle BPDE index " + index + ", 离开禁止区域 ");
+ runtime.Fence_Warning_flag = 0;
+// Util.ShowToast(runtime,"");
+ runtime.getContextProxy().sendMsgBroadcast(runtime.getContextProxy().context.getResources().getString(R.string.alarm_cross_boundary), 0);
+ }
+ } catch (Exception e) {
+ ICLogger.e(e.getMessage(), e);
+ }
+ } else {
+ ICLogger.i("BPDE format error!");
+ }
+
+
+ }
+
+ public static StringMessage APDG(String id) {
+ return genStringMessage("APDG", new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APDG))
+ .append(CMDSPLIT).append(id)
+ .append(CMDEND).toString());
+ }
+
+ public void handleBPDG(Connection connection, String cmd, Runtime runtime) {
+/**
+ * 示例:
+ * IWBPDG,353456789012345,1,30.0,37.3 #
+ * 说明:IWBPDG,867400020316612,502102,1,33,44
+ * IW:标识符
+ * BPDG: 命令字符
+ * 353456789012345:设备IMEI或者ID
+ * 080835 :指令流水号
+ * 1:开关 1开, 0 关
+ * 30.0: 低温阀值
+ * 37.3: 高温阀值
+ * #:结尾标识符
+ * */
+ String[] list = cmd.split(CMDSPLIT);
+ if (list.length == 6) {
+
+ try {
+ String index = list[2];
+ String switch_on = list[3];
+ String min_temp = list[4];
+ String max_temp = list[5];
+ connection.send(APDG(index));
+ if (Integer.parseInt(switch_on) == 1) {
+ ICLogger.i("Handle BPDG index " + index + ", 体温报警阈值开 min=" + min_temp + ",max=" + max_temp);
+ runtime.tempInfo.setBodyTempThreshold(Double.valueOf(max_temp), Double.valueOf(min_temp));
+ Config.needTemperature_abnormal_alarm = true;
+ } else {
+ ICLogger.i("Handle BPDG index " + index + ", 体温报警阈值关 ");
+ Config.needTemperature_abnormal_alarm = false;
+ }
+ } catch (Exception e) {
+ ICLogger.e(e.getMessage(), e);
+ }
+
+ } else {
+ ICLogger.i("BPDG format error!");
+ }
+ }
+
+ /***
+ *
+ * @param packetTime 做指令流水号用
+ * @param filetype 文件类型, 1语音,2图片
+ * @param datatype 数据内容类型,例如和文件类型相关,例如 监听语音,sos语音,签到图片等等
+ * @param count 内容分包总数
+ * @param index 当前分包数
+ * @param datalen 分包数据长度,最长1024,不足按照实际大小。
+ * @param amrdata 文件分包内容数据
+ * @return
+ */
+ public static byte[] APTU(String packetTime, int filetype, int datatype, int count, int index, int datalen, byte[] amrdata) {
+ /**
+ * 10.设备录音图片(设备上行)(上行协议:APTU,响应:BPTU)
+ * 示例:
+ * IWAPTU,6654111,080835,1,1,6,1,1024,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#
+ * 说明:
+ * IW:标识符
+ * BPCU : 命令字符
+ * 6654111:语音图片文字目标 (同步监护人列表的用户唯一标识ID)<扩展字段目前不需要,可以传空字符>
+ * 080835 :指令流水号
+ * 1:文件类型
+ * 1:内容类型 类型说明如下表
+ * 文件类型 内容类型
+ * 1 语音—— 1.监听语音 * 2.SOS语音 * 3.扩展
+ * 2 图片—— 1.签到图片 * 2.指令图片 * 3.设备图片 * 4.扩展
+ * 6:内容包分包总数
+ * 1 :当前包数,第一包为1,第二包为2,。。。。。。同一个语音包的语音时间相同
+ * 1024 :语音包长度
+ * XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:当前音频数据, 每个音频数据包大小为1024字节,最后一包不足1024的取实际字节数
+ * 语音包上传规则:
+ * 按包次序依次上传,上传后如果没有收到服务器的响应包,则继续上传该语音包。
+ * 收到设备回复确认数据包接收成功状态后,继续开始依次上传下一个数据包。。。。。。
+ * 如果设备回复确认数据包接收失败状态,则重复发送上一个数据包
+ */
+ String sb = new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTU))
+ .append(CMDSPLIT)
+ .append(CMDSPLIT).append(packetTime)
+ .append(CMDSPLIT).append(filetype)
+ .append(CMDSPLIT).append(datatype)
+ .append(CMDSPLIT).append(count)
+ .append(CMDSPLIT).append(index)
+ .append(CMDSPLIT).append(datalen * 2)
+ .append(CMDSPLIT).toString();
+
+ byte[] sentbuf = new byte[sb.length() + datalen * 2 + 1];
+ byte[] amrdata2 = Util.bytesToHexString(amrdata).getBytes();
+ System.arraycopy(sb.getBytes(), 0, sentbuf, 0, sb.length());
+ System.arraycopy(amrdata2, 0, sentbuf, sb.length(), datalen * 2);
+ sentbuf[sb.length() + datalen * 2] = '#';
+ return sentbuf;
+ }
+
+
+ public void handleBPTU(String cmd, Connection connection) {
+/***
+ * 平台响应
+ * IWBPTU,6654111,080835,1,1,6,1,1#
+ * IW:标识符
+ * APCU : 命令字符
+ * 6654111:语音图片文字目标
+ * 080835 :流水号
+ * 1:文件类型
+ * 1:内容类型
+ * 6:内容总包数
+ * 1:当前包序号
+ * 1:成功 (0:失败)
+ */
+ String[] cmdlist = cmd.split(CMDSPLIT);
+ if (cmdlist.length == 8) {
+ try {
+ String time = cmdlist[2];
+ String filetype = cmdlist[3];
+ String datatype = cmdlist[4];
+ String count = cmdlist[5];
+ String index = cmdlist[6];
+ String success = cmdlist[7];
+ int ftype = Integer.parseInt(filetype);
+ int dtype = Integer.parseInt(datatype);
+ int packetCount = Integer.parseInt(count);
+ int packetIndex = Integer.parseInt(index);
+ int receiveSuccess = Integer.parseInt(success);
+ ICLogger.i("服务器在收到 index " + time + ", 文件类型 " + ftype + ",内容类型 " + dtype + " " + packetIndex + "/" + packetCount + " " + (receiveSuccess == 1 ? "成功" : "失敗"));
+ if (receiveSuccess == 1) {
+ //如果服务器接收 语音成功,则设置下一个要发送的语音包Index,当index == packetCount的时候表示所有包发送完毕,停止继续发送
+ voicePacket.getInstanceSent().setCurrentIndexToSent(packetIndex);
+ //voicePacket.getInstanceSent().setFileType(ftype,dtype);
+ }
+ //发送消息,再次检查要发送的语音包,确认其发送完毕
+ connection.DeliverCMDMessageToSystem("SentVoicePacket", "SentBPFilePacket");
+ } catch (Exception e) {
+ ICLogger.e(e.getMessage(), e);
+ }
+ } else {
+ ICLogger.i(" BPTU Format error!");
+ }
+ }
+
+ public static StringMessage APSL(String date, int deepsleep, int lightsleep, int score) {
+/***
+ * 示例:
+ * IWAPSL,20200803,240,120,90#
+ * 说明:睡眠计算时间 当日21:00至 次日 9:00, 睡眠时间记录为当日时间。如2020-8-3的睡眠时间段为 2020-8-3 21:00 ~ 2020-8-4 09:00
+ * IW:标识符
+ * APSL:命令字
+ * 202008003:睡眠时间 (手表本地时间)
+ * 240:深睡时间 (手表本地时间),单位分钟
+ * 120:浅睡时间(手表本地时间),单位分钟
+ * 90睡眠分数
+ * 睡眠算法
+ * 使用记步同样的算法,计算翻身次数
+ * 平均每60秒记录一次
+ * 深睡眠,通过加速度传感器,在60秒内翻身次数小于6
+ * 浅睡眠,通过加速度传感器,在60秒内翻身次数大于等于6, 且小于12 ,否则认为未睡
+ * 换算分数后发送到服务器
+ * #:结束符
+ */
+ String sb = new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APSL))
+ .append(CMDSPLIT).append(date)
+ .append(CMDSPLIT).append(deepsleep)
+ .append(CMDSPLIT).append(lightsleep)
+ .append(CMDSPLIT).append(score)
+ .append(CMDEND).toString();
+ return genStringMessage(cmdMap.get(CMD_TYPE.APSL), sb);
+ }
+
+ public static StringMessage AP46(String id, String cmd) {
+ return genStringMessage(cmdMap.get(CMD_TYPE.AP46),
+ new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP46))
+ .append(CMDSPLIT).append(id)
+ .append(CMDSPLIT).append(cmd)
+ .append(CMDEND).toString());
+ }
+
+ public void handleBP46(String cmd, Connection connection, Runtime runtime) {
+/***
+ * IWBP46,353456789012345,080835,1,[参数]#
+ * 说明:
+ * IW:标识符
+ * BP46 : 命令字符
+ * 353456789012345:IMEI号,设备唯一ID
+ * 080835 :指令流水号
+ * 1: 表示立即拍照
+ * [参数]: 此为可选项。根据不同类型设备扩展
+ * #:结尾标识符
+ * 设备响应: IWAP46,080835,1#
+ * 080835:指令流水号
+ * 1 成功 0失败
+ * # 结尾标识符
+ */
+ String[] cmdlist = cmd.split(CMDSPLIT);
+
+ if (cmdlist.length >= 4) {
+ String imei = cmdlist[1];
+ String id = cmdlist[2];
+ String cdd = cmdlist[3];
+ if (cmdlist.length == 5) {
+ String tmp = cmdlist[4];
+ }
+ connection.send(AP46(id, cdd));
+ Context context = mRuntime.getContextProxy().context.getApplicationContext();
+ if (cdd.equals("1")) {
+ //delay 启动
+
+// Intent intent = new Intent(context, com.enqualcomm.support.CoreService.class);
+// intent.setAction(ACTION_REMOTE_CAMERA);
+// intent.putExtra("remote_number", id);
+// context.startService(intent);
+// runtime.getContextProxy().context.sendBroadcast(intent);
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ (new CameraUtil(context)).getPicture(id);
+ }
+ });
+
+ } else if (cdd.equals("2")) {
+ Intent intent = new Intent();
+ intent.setAction(DIALOG_ACTION);
+ intent.putExtra("takephoto", "Take Photo !");
+ context.sendBroadcast(intent);
+ }
+ } else {
+ ICLogger.i(" BP46 Format error!");
+ }
+
+ }
+
+
+ public static StringMessage APDH(String id, String cmd) {
+ return genStringMessage(cmdMap.get(CMD_TYPE.APDH),
+ new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APDH))
+ .append(CMDSPLIT).append(id)
+ .append(CMDSPLIT).append(cmd)
+ .append(CMDEND).toString());
+ }
+
+
+ public void handleBPDH(Connection connection, Runtime runtime, String cmd) {
+ /***
+ * IWBPDH,353456789012345,080835,1,[参数]#
+ * 说明:
+ * IW:标识符
+ * BPDH : 命令字符
+ * 353456789012345:IMEI号,设备唯一ID
+ * 080835 :指令流水号
+ * 1: 表示立即聆听 可扩展
+ * [参数]: 此为可选项。录音时间 为空默认15秒
+ * #:结尾标识符
+ * 设备响应: IWAPDH,080835,1#
+ * 080835:指令流水号
+ * 1 成功 0失败
+ * # 结尾标识符
+ */
+
+ String[] cmdlist = cmd.split(CMDSPLIT);
+ if (cmdlist.length == 5) {
+ String imei = cmdlist[1];
+ String id = cmdlist[2];
+ String cdd = cmdlist[3];
+ String tmp = cmdlist[4];
+
+ tmp = tmp.replace(CMDEND, "").trim();
+
+ if (tmp.isEmpty()) tmp = "15";
+ connection.send(APDH(id, cdd));
+
+ if (cdd.equals("1")) {
+ //delay 启动
+// Context context = mRuntime.getContextProxy().context.getApplicationContext();
+ CoreService.getInstance().DevliverStringMessage("StartMonitor", tmp);
+ }
+ } else {
+ ICLogger.i(" BPDH Format error!");
+ }
+ }
+
+ public static StringMessage APTQ(Runtime runtime) {
+ /**
+ * IWAPTQ,460,0,9520,3671,0#
+ * APTQ : 命令字符
+ * 460,0,9520,3671基站信息
+ * 0:语言标志位 0 默认为中文,1为英文
+ */
+ //或者仅仅使用 locale = Locale.getDefault(); 不需要考虑接口 deprecated(弃用)问题
+ Locale locale = Locale.getDefault();
+ String lang = locale.getLanguage() + "-" + locale.getCountry();
+ int language = 0;
+ if (!lang.contains("zh")) {
+ language = 1;
+ }
+ return genStringMessage("APTQ", new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTQ))
+ .append(CMDSPLIT).append(runtime.getLocationInstance().getMCC())
+ .append(CMDSPLIT).append(runtime.getLocationInstance().getMNC())
+ .append(CMDSPLIT).append(runtime.getLocationInstance().getLAC())
+ .append(CMDSPLIT).append(runtime.getLocationInstance().getGSMStationCID())
+ .append(CMDSPLIT).append(language)
+ .append(CMDEND).toString());
+ }
+
+
+ public void handleBPTQ(Connection connection, Runtime runtime, String cmd) {
+ /***
+ *
+ * IWBPTQ,20-10-11,19:32:02,6674,32,27,22,30,20-10-12,19:32:02,6674,32,27,22,30,20-10-13,19:32:02,6674,32,27,22,30,53575C71533A
+ * IWBPTQ, 16-09-24,11:00:00,b6e0d4c6,2,-5,-12,22,16-09-25,11:00:00,b6e0d4c6,2,-5,-12,22,16-09-26,11:00:00,b6e0d4c6,2,-5,-12,22,316df15733#
+ * 年-月-日,时:分:秒,天气描述,天气编号,当前温度,最低温,最高温,年-月-日,时:分:秒,天气描述,天气编号,当前温度,最低温,最高温,年-月-日,时:分:秒,天气描述,天气编号,当前温度,最低温,最高温,城市名
+ * 注:天气描述用Unicode编码,城市名使用Unicode编码, 第一组为当天,后2组依次为后续2天天气
+ * 如天气编号及描述对应如下(天气描述不需要发送括号内的白天晚上)
+ * 0:龙卷风
+ * 1:热带风暴
+ * 2:飓风
+ * 3:严重的雷暴
+ * 4:雷暴
+ * 5:混合雨雪
+ * 6:混合降雨和冰雹
+ * 7:混合雪和雨夹雪
+ * 8:冻结小雨
+ * 9:小雨
+ * 10:冻雨
+ * 11:阵雨
+ * 12:阵雨
+ * 13:雪飘雪
+ * 14:小雪阵雨
+ * 15:吹雪
+ * 16:雪
+ * 17:冰雹
+ * 18:雨夹雪
+ * 19:尘埃
+ * 20:雾
+ * 21:霾
+ * 22:黑烟
+ * 23:大风
+ * 24:风
+ * 25:低温
+ * 26:多云
+ * 27:多云(晚上)
+ * 28:多云(白天)
+ * 29:局部多云(晚上)
+ * 30:局部多云(天)
+ * 31:清爽(晚)
+ * 32:晴天
+ * 33:晴朗(晚)
+ * 34:晴朗(天)
+ * 35:混合雨和冰雹
+ * 36:热
+ * 37:局部地区性雷暴
+ * 38:零星雷暴
+ * 39:零星雷暴
+ * 40:零星阵雨
+ * 41:大雪
+ * 42:零星阵雪
+ * 43:大雪
+ * 44:多云
+ * 45:雷阵雨
+ * 46:阵雪
+ * 47:局部雷阵雨
+ */
+
+ log("BPTQ " + cmd);
+ String[] cmdlist = cmd.split(CMDSPLIT);
+ if (cmdlist.length == 23) {
+
+ StringBuilder sb = new StringBuilder();
+ StringBuilder msg = new StringBuilder();
+ for (int i = 0; i < 3; i++) {
+ String DayTime = cmdlist[1 + i * 7] + " " + cmdlist[2 + i * 7];
+ String date = "20" + cmdlist[1 + i * 7].trim();
+ String weather_name = Util.decodeUnicode2Utf8(cmdlist[3 + i * 7].trim());
+ String weather_id = cmdlist[4 + i * 7];
+ String temp_current = cmdlist[5 + i * 7];
+ String temp_high = cmdlist[6 + i * 7];
+ String temp_low = cmdlist[7 + i * 7];
+
+ sb.append(" " + DayTime);
+ sb.append(",天气:" + weather_name);
+ sb.append(",ID " + weather_id);
+ sb.append(",当前温度 " + temp_current);
+ sb.append(",最高温度 " + temp_high);
+ sb.append(",最低温度 " + temp_low);
+ sb.append("\n");
+
+ msg.append(date);
+ msg.append("," + weather_name);
+ msg.append("," + weather_id);
+ msg.append("," + temp_current);
+ msg.append("," + temp_high);
+ msg.append("," + temp_low);
+ msg.append(";");
+ }
+ String City = Util.decodeUnicode2Utf8(cmdlist[22]);
+
+ ICLogger.i(City + " \n" + sb.toString());
+
+ msg.insert(0, City + ";");
+ String weatherstr = msg.toString();
+ if (weatherstr.endsWith(";")) {
+ weatherstr = weatherstr.substring(0, weatherstr.lastIndexOf(";"));
+ }
+ Intent intent = new Intent(Constants.ACTION_WEATHER_RECEIVED);
+ intent.putExtra(Constants.KEY_Weather, weatherstr);
+ ICLogger.i("send Broadcast " + Constants.ACTION_WEATHER_RECEIVED + "\n" + weatherstr + "\n");
+ CoreService.getInstance().sendBroadcast(intent);
+
+ } else {
+ ICLogger.i(" BPTQ Format error!");
+ }
+ }
+
+
+ public static StringMessage AP94() {
+ /***
+ * 15确认已读文字(上行协议号:AP94,响应:BP94)
+ * 示例:
+ * IWAP94,123456,1#
+ * 说明:
+ * IWAP94:标识符
+ * APHCI: 命令字符
+ * 123456: 文字来源系统流水号
+ * 1:确认阅读、0:取消阅读
+ * 平台响应: IWBP94#
+ * 表示平台已接收,可不作响应
+ * 说明: 本消息适用所有终端
+ */
+
+ //在UI逻辑中,只要有处理就都是已经阅读。所以不存在取消阅读的说法。
+ return genStringMessage(cmdMap.get(protocol_ic_backup.CMD_TYPE.AP94), new StringBuffer(CMDHEADER).append(cmdMap.get(protocol_ic_backup.CMD_TYPE.AP94))
+ .append(CMDSPLIT).append(Runtime.PushtxtMsg_srv_index)
+ .append(CMDSPLIT).append("1")
+ .append(CMDEND).toString());
+
+ }
+
+
+ public static StringMessage APAT(String id, String cmd) {
+ return genStringMessage("APAT", new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APAT))
+ .append(CMDSPLIT).append(id)
+ .append(CMDSPLIT).append(cmd)
+ .append(CMDEND).toString());
+ }
+
+ /***
+ * 响应剪断开关设定消息
+ * @param connection
+ * @param runtime
+ * @param cmd
+ */
+ public void handleBPAT(Connection connection, Runtime runtime, String cmd) {
+/***
+ * IWBPAT,353456789012345,080835,1#
+ * 说明:是否提示表带是否连接的开关,即剪断报警开关
+ * IW:标识符
+ * BPAT : 命令字符
+ * 353456789012345:IMEI号,设备唯一ID
+ * 080835:指令流水号
+ * 1: 表示剪断报警开关,1为开,0 为关
+ * 设备响应: IWAPAT,080835, 1#
+ * 080835:指令流水号
+ * 1: 剪断开关状态(实际上与下行的命令一致)
+ */
+
+ log("BPAT " + cmd);
+ String[] cmdlist = cmd.split(CMDSPLIT);
+ if (cmdlist.length == 4) {
+
+ String imei = cmdlist[1];
+ String id = cmdlist[2];
+ String cmdid = cmdlist[3];
+ connection.send(APAT(id, cmdid));
+ if (cmdid.trim().equals("1")) {
+ WakeLockUtil.ScreenOnWakeLockTemperary(runtime.getContextProxy().context);
+// runtime.getContextProxy().sendMsgBroadcast(runtime.getContextProxy().context.getResources().getString(R.string.alarm_lock_success), 2);
+ Util.ShowToast(runtime, runtime.getContextProxy().context.getResources().getString(R.string.alarm_lock_success));
+ Config.setNeedAntiOff(runtime.getContextProxy().context, true);
+ Config.setNeedCutOff(runtime.getContextProxy().context, true);
+ runtime.setNeedAntioff(true);
+ runtime.setNeddReportCutoff(true);
+ } else {
+ WakeLockUtil.ScreenOnWakeLockTemperary(runtime.getContextProxy().context);
+ runtime.getContextProxy().sendMsgBroadcast(runtime.getContextProxy().context.getResources().getString(R.string.alarm_unbind_success), 2);
+ Config.setNeedAntiOff(runtime.getContextProxy().context, false);
+ Config.setNeedCutOff(runtime.getContextProxy().context, false);
+ runtime.setNeedAntioff(false);
+ runtime.setNeddReportCutoff(false);
+ }
+ } else {
+ ICLogger.i(" BPAT Format error!");
+ }
+ }
+
+
+ public static StringMessage APCH(int charging) {
+ return genStringMessage(cmdMap.get(CMD_TYPE.APCH),
+ new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APCH))
+ .append(CMDSPLIT).append(charging)
+ .append(CMDEND).toString());
+ }
+
+
+ public static StringMessage APBT(String id, String cycle) {
+ return genStringMessage("APBT", new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APBT))
+ .append(CMDSPLIT).append(id)
+ .append(CMDSPLIT).append(cycle)
+ .append(CMDEND).toString());
+ }
+
+ /***
+ * 响应蓝牙扫描周期设定
+ * @param connection
+ * @param runtime
+ * @param cmd
+ */
+ public void handleBPBT(Connection connection, Runtime runtime, String cmd) {
+/***
+ * IWBPBT,353456789012345,080835,1#
+ * 说明:设置蓝牙扫描周期,单位时间分钟
+ * IW:标识符
+ * BPBT : 命令字符
+ * 353456789012345:IMEI号,设备唯一ID
+ * 080835:指令流水号
+ * 1: 扫描周期,对应单位为分钟
+ * 设备响应: IWAPBT,080835, 1#
+ * 080835:指令流水号
+ * 1: 剪断开关状态(实际上与下行的命令一致)
+ */
+
+ log("BPBT " + cmd);
+ String[] cmdlist = cmd.split(CMDSPLIT);
+ if (cmdlist.length == 4) {
+ String id = cmdlist[2];
+ String cycle = cmdlist[3].replace("#", "");
+ connection.send(APBT(id, cycle));
+
+ if (Util.isNumeric(cycle)) {
+ int intcycle = Integer.parseInt(cycle);
+ Config.setBleScanCycle(runtime.getContextProxy().context, intcycle);
+ runtime.bleInfo.bleScanCycle = intcycle;
+ ICLogger.i("设置蓝牙扫描周期 " + intcycle + " 秒");
+ CoreService.getInstance().setBleScanAlarm(intcycle);
+ } else {
+ ICLogger.i(" BPBT Format error!");
+ }
+
+ } else {
+ ICLogger.i(" BPBT Format error!");
+ }
+ }
+
+ /***
+ * 发送蓝牙扫描结果
+ * @param runtime
+ * @return
+ */
+ public static StringMessage APBR(Runtime runtime) {
+
+ /***
+ * IWAPBR,IMEI,yyyyMMddHHmmss,beaconCount,major0,minor0,mac0,rssi0,major1,minor1,mac1,rssi1...#
+ */
+ if (runtime.bleInfo.btScanResult.size() > 0) {
+ StringBuffer sb = new StringBuffer();
+ sb.append(runtime.bleInfo.btScanResult.size());
+ for (String it : runtime.bleInfo.btScanResult) {
+ sb.append(CMDSPLIT).append(it);
+ }
+ return genStringMessage("APBR", new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APBR))
+ .append(CMDSPLIT).append(runtime.IMEI())
+ .append(CMDSPLIT).append(TimeUtil.getSystemTimeyyyyMMddHHmmss())
+ .append(CMDSPLIT).append(sb.toString())
+ .append(CMDEND).toString());
+
+ } else {
+ return null;
+ }
+ }
+
+ public static StringMessage APBS(String id, String cycle) {
+ return genStringMessage("APBS", new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APBS))
+ .append(CMDSPLIT).append(id)
+ .append(CMDSPLIT).append(cycle)
+ .append(CMDEND).toString());
+ }
+
+ public void handleBPBS(Connection connection, Runtime runtime, String cmd) {
+/***
+ * IWBPBS,353456789012345,080835,150&151#
+ * 说明:设置蓝牙扫描绑定的 major id
+ * IW:标识符
+ * BPBS : 命令字符
+ * 353456789012345:IMEI号,设备唯一ID
+ * 080835:指令流水号
+ * majorIDs: 用 & 分隔的 多个 Majorid
+ * 设备响应: IWAPBS,080835, 1#
+ * 080835:指令流水号
+ * 1: 成功,0失败
+ */
+ log("BPBS " + cmd);
+ String[] cmdlist = cmd.split(CMDSPLIT);
+ if (cmdlist.length == 4) {
+ String id = cmdlist[2];
+ connection.send(APBS(id, "1"));
+
+ ICLogger.i("设置蓝牙扫描绑定MajorID " + cmdlist[3] + " ");
+ String[] majorlist = cmdlist[3].split("&");
+ runtime.bleInfo.btMajorList.clear();
+ for (int i = 0; i < majorlist.length; i++) {
+ runtime.bleInfo.btMajorList.add(majorlist[i]);
+ }
+
+ } else {
+ ICLogger.i(" BPBS Format error!");
+ }
+ }
+
+ /**
+ * 85.设置联系人白名单(10个)(下行协议:BPWL,响应:APWL)
+ * 示例:
+ * IWBPWL,353456789012345,080835,D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx #
+ * 说明:
+ * IW:标识符
+ * BPWL : 命令字符
+ * 353456789012345:IMEI号,设备唯一ID
+ * 080835 :指令流水号
+ * D3590D54|135xxxxxxxxxx|9507xxxxxxxx : 一组联系人,使用|分隔名称和电话号码和绑定号码,名称使用UNICODE编码直接下发byte,多组之间使用逗号分隔,未填写的可为空,但位置仍需保留
+ * 设备响应: IWAPWL,080835, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx, D3590D54|135xxxxxxxxxx#
+ * 080835: 设备响应的时候带上响应流水号
+ * D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx回复设备当前设置的主控号码供平台同步使用
+ * 说明: 本消息适用所有终端
+ */
+ public static StringMessage APWL(String index, String[] phnumbs) {
+ return genStringMessage("APWL", new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APWL))
+ .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 handleBPWL(Connection connection, String cmd, Runtime runtime) {
+// IWBPWL,867155030001063,357444,9b44529b|13554820016,,,,,,,,,
+/**
+ * IWBPWL,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(APWL(index, phnums));
+ ArrayList<Contact> contactArray = new ArrayList<Contact>();
+
+ if (Config.custom_name.equals("YT")) {
+ ICLogger.i("=====add hotline 96885 ");
+ contactArray.add(new Contact(Contact.CATEGORY_CALL, runtime.getContextProxy().context.getResources().getString(R.string.hotline), "96885"));
+ }
+ 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(" BPWL format error!");
+ }
+
+ }
+
+
+ public static StringMessage AP65(String id, String cy) {
+ return genStringMessage("AP65", new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP65))
+ .append(CMDSPLIT).append(id)
+ .append(CMDSPLIT).append(cy)
+ .append(CMDEND).toString());
+ }
+
+ public void handleBP65(Connection connection, Runtime runtime, String cmd) {
+/***
+ * 36.音量设置(下行协议:BP65,响应:AP65)
+ * 示例:
+ * IWBP65,353456789012345,080835,1#
+ * 说明:
+ * IW:标识符
+ * BP65: 命令字符
+ * 353456789012345:IMEI号,设备唯一ID
+ * 080835 :指令流水号
+ * 1 : 表示音量等级为1
+ * 设备响应: IWAP65,080835, 1#
+ * 080835: 设备响应的时候带上响应流水号
+ * 1: 表示指令执行成功,音量等级为1
+ */
+
+ log("BP65 " + cmd);
+ String[] cmdlist = cmd.split(CMDSPLIT);
+ if (cmdlist.length == 4) {
+ String id = cmdlist[2];
+ String cycle = cmdlist[3].replace("#", "");
+ connection.send(AP65(id, cycle));
+
+ if (Util.isNumeric(cycle)) {
+ int mastervolume = Integer.parseInt(cycle);
+
+ ICLogger.i("设置音量 " + mastervolume);
+ //实际设备音量 0~15 协议音量0~7需要转换
+ int volume = mastervolume * 2;
+ if (volume < 0) volume = 0;
+ if (volume >= 14) volume = 15;
+ Config.setMasterVolume(runtime.getContextProxy().context, mastervolume * 2);
+ ICAudioManager.setMasterVolumn(runtime.getContextProxy().context, mastervolume * 2);
+
+ } else {
+ ICLogger.i(" BP65 Format error!");
+ }
+
+ } else {
+ ICLogger.i(" BP65 Format error!");
+ }
+ }
+
+ public static StringMessage AP47(String id, String cycle) {
+ return genStringMessage("AP47", new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP47))
+ .append(CMDSPLIT).append(id)
+ .append(CMDSPLIT).append(cycle)
+ .append(CMDEND).toString());
+ }
+
+
+ public void handleBP47(Connection connection, Runtime runtime, String cmd) {
+/***
+ * 37.震动设置(下行协议号:BP47,响应:AP47)
+ * 示例:
+ * IWBP47,353456789012345,080835,10#
+ * 说明:
+ * IW:标识符
+ * BP47 : 命令字符
+ * 353456789012345:IMEI号,设备唯一ID
+ * 080835 :指令流水号
+ * 10: 表示震动时长,此处单位为称,表示震动10秒钟
+ * 设备响应: IWAP47,080835,1#
+ * 080835:指令流水号
+ * 1:表示设备执行成功,0 表示设备执行失败
+ */
+
+ log("BP47 " + cmd);
+ String[] cmdlist = cmd.split(CMDSPLIT);
+ if (cmdlist.length == 4) {
+ String id = cmdlist[2];
+ String cycle = cmdlist[3].replace("#", "");
+ connection.send(AP47(id, cycle));
+
+ if (Util.isNumeric(cycle)) {
+ int vibduration = Integer.parseInt(cycle);
+ ICLogger.i("设置震动时长 " + vibduration + " 秒");
+ Config.setDurationOfVibration(runtime.getContextProxy().context, vibduration);
+ VibrateUtil.setVibPattern(vibduration * 1000);
+
+ } else {
+ ICLogger.i(" BP47 Format error!");
+ }
+
+ } else {
+ ICLogger.i(" BP47 Format error!");
+ }
+ }
+
+ 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);
+ cmd = cmd.replace(" ", "");
+ switch (type) {
+ case BP00: //登录包
+ handleBP00(mRuntime, cmd);
+ ICLogger.i("服务器收到登录包AP00");
+ mConnection.DeliverCMDMessageToSystem("login", cmd);//通知下面线程状态变化
+ break;
+ case BP01: //gps定位包
+ handleBP01(cmd);
+ ICLogger.i("服务器收到定位AP01");
+ mConnection.DeliverCMDMessageToSystem("AP01", cmd);//通知下面线程状态变化
+ break;
+ case BP02:// wifi定位包
+ handleBP02(cmd);
+ ICLogger.i("服务器收到定位AP02");
+ mConnection.DeliverCMDMessageToSystem("AP02", cmd);//通知下面线程状态变化
+ break;
+ case BP03: //心跳包
+ handleBP03(cmd);
+ ICLogger.i("服务器收到心跳包AP03");
+ mConnection.DeliverCMDMessageToSystem("heartbeat", cmd);//通知下面线程状态变化
+ break;
+
+ case BP07:
+ //收到发送的语音包
+ handleBP07(cmd, mConnection);
+ break;
+ case BP10:
+ //报警包
+ mConnection.DeliverCMDMessageToSystem("AP10", cmd);//通知下面线程状态变化
+ break;
+ case BPBR:
+ mConnection.DeliverCMDMessageToSystem("APBR", 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 BP87:
+ handleBP87(cmd, mConnection, mRuntime);
+ ICLogger.i("收到服务器 QRCode uri BP87");
+ 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 BP46: //立即拍照
+ ICLogger.i("立即拍照!");
+ handleBP46(cmd, mConnection, mRuntime);
+ break;
+
+ case BP12:
+ //收到设置SOS号码
+ handleBP12(mConnection, cmd, mRuntime);
+ ICLogger.i("收到服务器设置SOS号码命令BP12");
+ break;
+ case BP14:
+ //收到设置白名单号码
+ handleBP14(mConnection, cmd, mRuntime);
+ ICLogger.i("收到服务器设置白名单号码命令BP14");
+ break;
+ case BPWL:
+ //收到设置白名单号码
+ handleBPWL(mConnection, cmd, mRuntime);
+ ICLogger.i("收到服务器设置白名单号码命令BPWL");
+ 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("收到服务器心率检测命令");
+ if (mRuntime.check_stat_do_ppg_test())
+ HeartRateManager.getInstance().triggerPPGTest(FROM_SERVER);
+ break;
+ case BPXY:
+ handleBPXY(cmd, mConnection);
+ ICLogger.i("收到服务器血压检测命令");
+ if (mRuntime.check_stat_do_ppg_test())
+ HeartRateManager.getInstance().triggerPPGTest(FROM_SERVER);
+ break;
+ case BPJZ:
+ handleBPJZ(cmd, mConnection, mRuntime);
+ ICLogger.i("收到服务器血压校准命令");
+ break;
+ case BPHT:
+ ICLogger.i("服务器收到上传的心率血压");
+ mConnection.DeliverCMDMessageToSystem("APHT", cmd);//通知下面线程状态变化
+ break;
+ case BP84:
+ handleBP84(cmd, mConnection);
+ ICLogger.i("收到服务器白名单命令");
+ break;
+
+ case BP86:
+ //心率周期
+ handleBP86(cmd, mConnection, mRuntime);
+ mConnection.DeliverCMDMessageToSystem("AP86", cmd);//通知下面线程状态变化
+
+ break;
+ case BP68: //绑定解绑
+ handleBP68(cmd, mConnection, mRuntime);
+ 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 BPHP:
+ handleBPHP();
+ mConnection.DeliverCMDMessageToSystem("APHP", 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 BPDG:
+ handleBPDG(mConnection, cmd, mRuntime);
+ ICLogger.i(" 收到 体温阈值设置!");
+ mConnection.DeliverCMDMessageToSystem("APDG", cmd);//通知下面线程状态变化
+ break;
+ case BPSL:
+ ICLogger.i("睡眠数据上传完毕!");
+ mConnection.DeliverCMDMessageToSystem("APSL", cmd);//通知下面线程状态变化
+ break;
+
+ case BPDH:
+ ICLogger.i("聆听");
+ handleBPDH(mConnection, mRuntime, cmd);
+ break;
+
+ case BPTQ: //天气下发
+ handleBPTQ(mConnection, mRuntime, cmd);
+ break;
+ case BPAT://剪断开关设定
+ handleBPAT(mConnection, mRuntime, cmd);
+ break;
+
+ case BPBT://蓝牙扫描设置
+ handleBPBT(mConnection, mRuntime, cmd);
+ break;
+ case BPBS://蓝牙扫描设置Majorlist
+ handleBPBS(mConnection, mRuntime, cmd);
+ break;
+
+ case BP65://声音设置
+ handleBP65(mConnection, mRuntime, cmd);
+ break;
+ case BP47://震动设置
+ handleBP47(mConnection, mRuntime, 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;
+ }
+}