From: SnickerSun Date: Mon, 28 Jun 2021 09:57:34 +0000 (+0800) Subject: Gator协议中间版本,目前加密通过,协议可以正常登录驻留链接。 X-Git-Url: http://git.snicker.com.cn/Users/apple/Desktop/static/gitweb.css?a=commitdiff_plain;h=bac6231c4f7e5884c23cfac5feb384cddb497355;p=protocol_srv.git Gator协议中间版本,目前加密通过,协议可以正常登录驻留链接。 实现了BP00,BP33,AP03 --- diff --git a/app/src/main/java/com/enqualcomm/support/BootCompleteReceiver.java b/app/src/main/java/com/enqualcomm/support/BootCompleteReceiver.java index f43d40f9..97bfd304 100644 --- a/app/src/main/java/com/enqualcomm/support/BootCompleteReceiver.java +++ b/app/src/main/java/com/enqualcomm/support/BootCompleteReceiver.java @@ -9,7 +9,7 @@ import com.enqualcomm.support.utils.ICLogger; public class BootCompleteReceiver extends BroadcastReceiver { public void onReceive(Context paramContext, Intent paramIntent) { ICLogger.i("监听到开机广播"); - paramContext.startService(new Intent(paramContext, com.enqualcomm.support.CoreService.class)); + ///paramContext.startService(new Intent(paramContext, com.enqualcomm.support.CoreService.class)); } } diff --git a/app/src/main/java/com/enqualcomm/support/CoreService.java b/app/src/main/java/com/enqualcomm/support/CoreService.java index b2ea009d..e9771fac 100644 --- a/app/src/main/java/com/enqualcomm/support/CoreService.java +++ b/app/src/main/java/com/enqualcomm/support/CoreService.java @@ -1588,8 +1588,13 @@ public class CoreService extends Service { String action = intent.getAction(); if ("com.ic.action.VIDEO_CALL".equals(action)) { try { - mFZDService.getBRId(); - mFZDService.getContacts(); + if(Config.protocol_no == Config.PROTOCOL_FZD) { + mFZDService.getBRId(); + mFZDService.getContacts(); + }else{ + //need user implement for other protocol + + } } catch (Exception e) { e.printStackTrace(); } diff --git a/app/src/main/java/com/enqualcomm/support/bean/ICLocation.java b/app/src/main/java/com/enqualcomm/support/bean/ICLocation.java index 10d2f479..5eea07ce 100644 --- a/app/src/main/java/com/enqualcomm/support/bean/ICLocation.java +++ b/app/src/main/java/com/enqualcomm/support/bean/ICLocation.java @@ -240,11 +240,13 @@ public class ICLocation { private String MNC="0"; private int LAC=0; private int CID=0; + private int rxlevel=0; private boolean datachanged=false; public void setMCC(String mcc){ MCC=mcc;datachanged=true;} public void setMNC(String mnc){MNC = mnc;datachanged=true;} public void setLAC(int lac){LAC=lac;datachanged=true;} public void setCID(int cid) { CID=cid;datachanged=true;} + public void setRxlevel(int level) {rxlevel=level;} public boolean isDataChanged(){return datachanged;} public String getMCC(){ return MCC; @@ -252,13 +254,15 @@ public class ICLocation { public String getMNC(){ return MNC; } + public int getRxlevel(){ + return rxlevel; + } public long getLAC(){ return LAC; } public long getGSMStationCID(){ return CID; } - public LBS_Data getLBSdata(){ return currentLBS; } diff --git a/app/src/main/java/com/enqualcomm/support/bean/Runtime.java b/app/src/main/java/com/enqualcomm/support/bean/Runtime.java index 550ebc33..b3c442be 100644 --- a/app/src/main/java/com/enqualcomm/support/bean/Runtime.java +++ b/app/src/main/java/com/enqualcomm/support/bean/Runtime.java @@ -1249,7 +1249,25 @@ public class Runtime { return mLBSMultiStationData; } - + public String getGatorLBSData(){ +// String netstat="46 00 002482 0000DE127"; +// MCC(%03d)+MNC(%03d)+LACID(%04X)+CELLID(%07X)+RX LEVEL(%02X), + StringBuilder sb = new StringBuilder(); + int mcc=0; + int mnc=0; + try { + mcc = Integer.parseInt(gpsp.getMCC()); + mnc = Integer.parseInt(gpsp.getMNC()); + }catch (Exception e){ + ICLogger.e(e.getMessage(),e); + } + sb.append(String.format("%1$03d",mcc)) + .append(String.format("%1$03d",mnc)) + .append(String.format("%1$04X",gpsp.getLAC())) + .append(String.format("%1$07X",gpsp.getGSMStationCID())) + .append(String.format("%1$02X",gpsp.getRxlevel())); + return sb.toString(); + } public String getLBSData() { // 460,0,9520,3671 : LBS基站数据,MCC国家码,460为中国,0:MNC,0为移动,9520:LAC,十进制,3671,CID,十进制 diff --git a/app/src/main/java/com/enqualcomm/support/service/KeepAlive.java b/app/src/main/java/com/enqualcomm/support/service/KeepAlive.java index d6fa200d..5641d4dc 100644 --- a/app/src/main/java/com/enqualcomm/support/service/KeepAlive.java +++ b/app/src/main/java/com/enqualcomm/support/service/KeepAlive.java @@ -152,6 +152,11 @@ public class KeepAlive extends AbstractConnectionService { } else { if (is_login_send_success) { connection.send(protocolAPIHelper.getHeartbeatMSG(mRuntime)); + //发送完心跳后,开始检查服务器响应 + if(Config.PROTOCOL_GATOR == Config.protocol_no) { + //Gator 协议心跳没有反馈 + connection.DeliverCMDMessageToSystem("heartbeat", "Gator");//通知下面线程状态变化 + } } else { connection.send(protocolAPIHelper.getLoginMSG(mRuntime)); } @@ -330,9 +335,15 @@ public class KeepAlive extends AbstractConnectionService { //这个是正常心跳包,暂时不能认为服务器连接时失败的,所以正常发送检测。 //发送心跳包 connection.send(protocolAPIHelper.getHeartbeatMSG(paramRuntime)); - //发送完心跳后,开始检查服务器响应 + //发送完心跳后,开始检查服务器响应 startResponseCheckTimer(); + //发送完心跳后,开始检查服务器响应 + if(Config.PROTOCOL_GATOR == Config.protocol_no) { + //Gator 协议心跳没有反馈 + connection.DeliverCMDMessageToSystem("heartbeat", "Gator");//通知下面线程状态变化 + } + } @@ -380,9 +391,12 @@ public class KeepAlive extends AbstractConnectionService { //这时重新连接服务器才进行的连接,理论上close已经设置false,此次可以认为协议定然断开,所以设置为false作为双重保险。 mRuntime.setServerProtocolConnected(false); connection.send(protocolAPIHelper.getHeartbeatMSG(paramRuntime)); - //发送完心跳后,开始检查服务器响应 - startResponseCheckTimer(); + //发送完心跳后,开始检查服务器响应 + if(Config.PROTOCOL_GATOR == Config.protocol_no) { + //Gator 协议心跳没有反馈 + connection.DeliverCMDMessageToSystem("heartbeat", "Gator");//通知下面线程状态变化 + } //连接服务器后马上开始发送buffer的cmd Deliver.triggerSendThread(); diff --git a/app/src/main/java/com/enqualcomm/support/utils/AESCipher.java b/app/src/main/java/com/enqualcomm/support/utils/AESCipher.java index 469cc01c..43490dbf 100644 --- a/app/src/main/java/com/enqualcomm/support/utils/AESCipher.java +++ b/app/src/main/java/com/enqualcomm/support/utils/AESCipher.java @@ -24,6 +24,7 @@ import javax.crypto.SecretKey; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; +import static android.util.Base64.DEFAULT; import static android.util.Base64.NO_WRAP; public class AESCipher { @@ -227,7 +228,7 @@ public class AESCipher { byte[] initParam = IV_STRING.getBytes(charset); IvParameterSpec ivParameterSpec = new IvParameterSpec(initParam); - Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding"); cipher.init(mode, secretKey, ivParameterSpec); return cipher.doFinal(contentBytes); @@ -235,7 +236,7 @@ public class AESCipher { public static void test2(){ //FastJson生成json数据 - String jsonData = "JsonUtils.objectToJsonForFastJson(personList)"; + String jsonData = "(003b0106357593061269893BP00,C42F-L56AAAD-EU-P3-BDS-V0.3.37.20210626.175406,7,46011)"; ICLogger.e( "AES加密前json数据 ---->" + jsonData); ICLogger.e("AES加密前json数据长度 ---->" + jsonData.length()); @@ -254,6 +255,14 @@ public class AESCipher { ICLogger.e( "AES解密耗时 cost time---->" + (end - start)); ICLogger.e("AES解密后json数据 ---->" + decryStr); + + String encriptedstr="/iM1BRd+pmjkYA44kYoqxIcT+h0xJsoRZJUG+cUrl0Wh5UuphJNDx3MaW1tNB3b4EJsh8SmhH0PiMlPeTqOfcQG9GxZXalbNO1hH9d4Qpbf/57LH"; + decryStr = aesDecryptStringFixedKey(encriptedstr); + ICLogger.e("AES解密后json数据sss -- "+encriptedstr+ " "+ encriptedstr.length()+" ---->" + decryStr); + + encryStr = aesEncryptStringFixedKey(decryStr); + ICLogger.e("AES加密后json数据sss -- "+decryStr+ " "+ decryStr.length()+" ---->" + encryStr + " " +encryStr.length()); + } /*******************************************************/ diff --git a/app/src/main/java/com/enqualcomm/support/utils/CellInfoUtil.java b/app/src/main/java/com/enqualcomm/support/utils/CellInfoUtil.java index 15426c9c..4ff48b4c 100644 --- a/app/src/main/java/com/enqualcomm/support/utils/CellInfoUtil.java +++ b/app/src/main/java/com/enqualcomm/support/utils/CellInfoUtil.java @@ -211,7 +211,7 @@ public class CellInfoUtil { runtime.getLocationInstance().setCID(gsmCell.getCid()); runtime.getLocationInstance().setLAC(gsmCell.getLac()); - + runtime.getLocationInstance().setRxlevel(150-Math.abs(getSignal(telephonyManager,runtime))); ICLogger.i("LBS GsmCellLocation "+ gsmSb.toString()); if (Config.LOG_TOFILE) ICLogger.logToFile("LBS", gsmSb.toString()); diff --git a/app/src/main/java/com/ic/protocols/protocolAPIHelper.java b/app/src/main/java/com/ic/protocols/protocolAPIHelper.java index ccbb586f..2ada45a3 100644 --- a/app/src/main/java/com/ic/protocols/protocolAPIHelper.java +++ b/app/src/main/java/com/ic/protocols/protocolAPIHelper.java @@ -5,6 +5,7 @@ import com.enqualcomm.support.CoreService; import com.enqualcomm.support.bean.Runtime; import com.enqualcomm.support.bean.SleepInfo; import com.enqualcomm.support.bean.StringMessage; +import com.enqualcomm.support.utils.AESCipher; import com.enqualcomm.support.utils.Connection; import com.enqualcomm.support.utils.ICLogger; import com.enqualcomm.support.utils.TimeUtil; @@ -204,7 +205,12 @@ public class protocolAPIHelper { ret = protocol_s123.isCmdStr(msg.isFromCache()); break; case Config.PROTOCOL_GATOR: - ret = protocol_gator.isCmdStr(msg.isFromCache()); + if(msg.isFromCache().startsWith("GT")) { + //是加密数据就先解密 + ret = protocol_gator.isCmdStr(AESCipher.aesDecryptStringFixedKey(msg.isFromCache().substring(8))); + }else{ + ret = protocol_gator.isCmdStr(msg.isFromCache()); + } break; } return ret; diff --git a/app/src/main/java/com/ic/protocols/protocol_gator.java b/app/src/main/java/com/ic/protocols/protocol_gator.java index 097a119a..85ec56f2 100644 --- a/app/src/main/java/com/ic/protocols/protocol_gator.java +++ b/app/src/main/java/com/ic/protocols/protocol_gator.java @@ -71,10 +71,10 @@ public class protocol_gator { private static final String CMDHEADER = "("; private static final String CMDEND = ")"; private static final String CMDSPLIT = ","; - // public static final String defaultServerIP = "13.59.36.164"; - // public static final int defaultServerPort = 7030; - public static final String defaultServerIP = "snickersun.oicp.net"; - public static final int defaultServerPort = 54944; + public static final String defaultServerIP = "watch.gatorcn.com"; + public static final int defaultServerPort = 27015; + // public static final String defaultServerIP = "snickersun.oicp.net"; + // public static final int defaultServerPort = 54944; public enum CMD_TYPE { /* 服务器发起*/ @@ -258,7 +258,7 @@ public class protocol_gator { String encreptedStr=""; String encreptionMSGHeader="GT"; encreptedStr=AESCipher.aesEncryptStringFixedKey(msg); - String len= String.format("%04x",encreptedStr.length()); + String len= String.format("%04x",encreptedStr.length()+8); return encreptionMSGHeader+len+"01"+encreptedStr; } /**/ @@ -267,7 +267,7 @@ public class protocol_gator { StringMessage sm = new StringMessage(new String[]{cmdName, msg}); //用此函数设置要发送的内容 sm.refresh(encrepteMsg(msg)); - // sm.refresh((msg)); + // sm.refresh((msg)); //设置信息创建时间 sm.setDate(TimeUtil.getSystemDateYYMMDD(), TimeUtil.getSystemTimeHHmmss()); return sm; @@ -416,8 +416,16 @@ public class protocol_gator { return genStringMessage(cmdMap.get(CMD_TYPE.BP00), AddHeader(ds,msg)); } - //处理 登录 BP00 - public void handleAP03(Runtime runtime, String cmd) { + //时间同步成功失败反馈 + public StringMessage BP03(Runtime ds,boolean success){ + if (success){ + return genStringMessage(cmdMap.get(CMD_TYPE.BP03),AddHeader(ds,cmdMap.get(CMD_TYPE.BP03)+"00000000000000031")); + }else{ + return genStringMessage(cmdMap.get(CMD_TYPE.BP03),AddHeader(ds,cmdMap.get(CMD_TYPE.BP03)+"00000000000000030")); + } + } + //时间同步,等同于登录成功回复 + public void handleAP03(Runtime runtime, Connection connection, String cmd) { String[] msg = cmd.split(CMDSPLIT); // (003E357593060153353AP03,150728,152900,e0800,0000000000000003) // 表示当前UTC时间为2015å¹´7月28日,15点29分00秒,时区是东8区,此时间用于手表时间同步 @@ -435,14 +443,17 @@ public class protocol_gator { ICLogger.i("===" + TimeUtil.getDefaultTimeZone()); TimeUtil.setSysDateTime(runtime.getContextProxy().context, datetime, msg[3], true); ICLogger.i("===" + TimeUtil.getDefaultTimeZone()); - + connection.send(BP03(runtime,true)); + }else{ + connection.send(BP03(runtime,false)); } } catch (Exception e) { ICLogger.e(e.getMessage(), e); + + connection.send(BP03(runtime,false)); } // Set Datetime 20200505112734 // Set TimeZone 8 - } else { log("handleAP03", "format Error"); } @@ -455,2550 +466,83 @@ public class protocol_gator { //电量等级:5 //基站接入点:46000024820000DE127 //日期时间:151028,163100 - int batstat=0; - int batlevel=ds.getBatterylevel(); - if (batlevel>0 && batlevel<= 15){ - batstat=0; - }else if (batlevel>15 && batlevel<= 35){ - batstat=1; - }else if (batlevel>35 && batlevel<= 55){ - batstat=2; - }else if (batlevel>55 && batlevel<= 85){ - batstat=3; - }else { - batstat=4; - } - String netstat="46000024820000DE127"; - String msg=new StringBuffer(cmdMap.get(CMD_TYPE.BP33)).append(CMDSPLIT) - .append(0).append(CMDSPLIT) - .append(String.format("%08X", ds.getTotalStepCount())).append(CMDSPLIT) - .append(batstat).append(CMDSPLIT) - .append(netstat).append(CMDSPLIT) - .append(TimeUtil.getSystemDateYYMMDD()).append(CMDSPLIT) - .append(TimeUtil.getSystemTimeHHmmss()) - .toString(); - - return genStringMessage(cmdMap.get(CMD_TYPE.BP33), AddHeader(ds,msg)); - } - 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()); - } - - public StringMessage BP03(boolean success){ - if (success){ - return genStringMessage(cmdMap.get(CMD_TYPE.BP03),cmdMap.get(CMD_TYPE.BP03)+"00000000000000031"); - }else{ - return genStringMessage(cmdMap.get(CMD_TYPE.BP03),cmdMap.get(CMD_TYPE.BP03)+"00000000000000030"); - } - } - public void handleAP04(Runtime ds,Connection connection,String cmd) { - log("AP04读取版本,返回BP00"); - connection.send(BP00(ds)); - } - - - 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.AP14), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP14)) - .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.AP14), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP14)) - .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.AP14), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP14)) - .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.AP14), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP14)) - .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.AP14)) - .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 contactArray = new ArrayList(); -// 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 contactArray = new ArrayList(); - - 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.AP14)) - .append(CMDSPLIT).append(cmddata) - .append(CMDEND).toString()); - - } - - //设置闹钟 - public void handleBP85(String cmd, Connection connection, Runtime runtime) { -// IWBP85,867155030001063,155312,1,1,0235,12,1,1 -// IWBP85,867155030002145,945166,1,0, -// IWBP85,867155030001064,265960,1,1,1130,,1,1 -// IWBP85,353456789012345,080835,1,3, 0900,135,1,1@0900 ,135,1,2@0900 ,135,1,3# -//353456789012345:IMEI号,设备唯一ID -//080835 :指令流水号 -//1: 表示闹钟总开关,1为开,0 为关 -//3: 表示闹钟个数 -//0900 ,135,1,1,表示一组闹钟,0900表示早上09:00, 135表示周一周三周五,使用24小时制 -//1表示该组闹钟开启或关闭状态 1表示开启 0表示关闭 -//1表示吃药提醒 -//2 表示喝水提醒 -//3 表示久坐提醒 -//多组闹钟之间用”@”符号分隔 - - String imei = "", cmdindex = "0"/*指令流水号*/; - int all_alarmswitch = 0 /*总开关 1为开,0 为关*/, - alarmswitch = 0 /*1为开,0 为关*/, - alarmcount = 0 /*表示闹钟个数*/; - String alarmtime = "";//0900表示早上09:00 - int alarmtype = 1; //1表示吃药提醒 , 2 表示喝水提醒 ,3 表示久坐提醒 - String repeat = "";// 135表示周一周三周五,使用24小时制 - String[] dataList = cmd.split("@"); - ArrayList alarmList = new ArrayList<>(); - if (dataList.length > 0) { - for (int i = 0; i < dataList.length; i++) { - String[] cmdArgList = dataList[i].split(","); - - if (i == 0) { - if (cmdArgList.length == 9) { - 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.AP14)) - .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.AP14)) - .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 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!"); + int batstat=0; + int batlevel=ds.getBatterylevel(); + if (batlevel>0 && batlevel<= 15){ + batstat=0; + }else if (batlevel>15 && batlevel<= 35){ + batstat=1; + }else if (batlevel>35 && batlevel<= 55){ + batstat=2; + }else if (batlevel>55 && batlevel<= 85){ + batstat=3; + }else { + batstat=4; } - } - - 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.AP14)) - .append(CMDSPLIT).append(cmdindex) - .append(CMDSPLIT).append(success) - .append(CMDEND).toString()); - } + String netstat="46 00 002482 0000DE127"; + netstat = ds.getGatorLBSData(); - /** - * 心率上传,返回协议字串 - * - * @param ds - * @return - */ - public static StringMessage AP49(Runtime ds) { - //示例数据:IWAP49,68## - return genStringMessage(cmdMap.get(CMD_TYPE.AP14), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP14)) - .append(CMDSPLIT).append(ds.getHRS().getPPG()) - .append(CMDEND).toString()); - - } - + String msg=new StringBuffer(cmdMap.get(CMD_TYPE.BP33)).append(CMDSPLIT) + .append(0).append(CMDSPLIT) + .append(String.format("%08X", ds.getTotalStepCount())).append(CMDSPLIT) + .append(batstat).append(CMDSPLIT) + .append(netstat).append(CMDSPLIT) + .append(TimeUtil.getSystemDateYYMMDD()).append(CMDSPLIT) + .append(TimeUtil.getSystemTimeHHmmss()).append(CMDSPLIT) + .append("0,0,0") + .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.AP14), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP14)) - .append(CMDSPLIT).append(ds.getHRS().getPPG()) - .append(CMDSPLIT).append(ds.getHRS().getBPH()) - .append(CMDSPLIT).append(ds.getHRS().getBPL()) - .append(CMDEND).toString()); - } + StringMessage ret = genStringMessage(cmdMap.get(CMD_TYPE.BP33), AddHeader(ds,msg)); - 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.AP14), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP14)) - .append(CMDSPLIT).append(ppg) - .append(CMDSPLIT).append(bph) - .append(CMDSPLIT).append(bpl) - .append(CMDEND).toString()); + return ret; } - //立即定位反馈 - 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 void handleAP04(Runtime ds,Connection connection,String cmd) { + log("AP04读取版本,返回BP00"); + connection.send(BP00(ds)); } - - - /*通过基站获取时间和坐标*/ - 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.AP14), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP14)) - .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 handleAP00(Runtime ds,Connection connection,String cmd) { + log("AP00读取版本,返回BP30"); } - 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 void handleAP30(){ } + //定位信息 + public void BP30(Runtime ds,Connection connection,String cmd) { + log("AP04读取版本,返回BP00"); - 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()); } +// (0019357593060153353AP00) 下行一次location。 - //设置定位周期 - 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 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 AP03: //登录包 + handleAP03(mRuntime, mConnection,cmd); + ICLogger.i("服务器收到登录包"); + mConnection.DeliverCMDMessageToSystem("login", cmd);//通知下面线程状态变化 + break; + case AP04://查询终端版本消息 + handleAP04(mRuntime,mConnection,cmd); + break; + case AP30:// 定位数据接收成功 + mConnection.DeliverCMDMessageToSystem("BP30", cmd);//通知下面线程状态变化 + break; +// case AP14: //gps定位包 +// handleBP01(cmd); +// ICLogger.i("服务器收到定位AP01"); +// mConnection.DeliverCMDMessageToSystem("AP01", cmd);//通知下面线程状态变化 +// break; - /*语音下行反馈*/ - 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.AP14)) - .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.AP14)) - .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.AP14)) - .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.AP14)) - .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.AP14)) - .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.AP14)) - .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.AP14)) - .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.AP14)) - .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.AP14), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP14)) - .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.AP14)) - .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.AP14)) - .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.AP14), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP14)) - .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.AP14), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP14)) - .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.AP14)) - .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.AP14)) - .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.AP14)) - .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.AP14)) - .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.AP14), sb); - } - - public static StringMessage AP46(String id, String cmd) { - return genStringMessage(cmdMap.get(CMD_TYPE.AP14), - new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP14)) - .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.AP14), - new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP14)) - .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.AP14)) - .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_gator.CMD_TYPE.AP14), new StringBuffer(CMDHEADER).append(cmdMap.get(protocol_gator.CMD_TYPE.AP14)) - .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.AP14)) - .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.AP14), - new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP14)) - .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.AP14)) - .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.AP14)) - .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.AP14)) - .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.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 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 contactArray = new ArrayList(); - - 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.AP14)) - .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.AP14)) - .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 AP03: //登录包 - handleAP03(mRuntime, cmd); - ICLogger.i("服务器收到登录包"); - mConnection.DeliverCMDMessageToSystem("login", cmd);//通知下面线程状态变化 - break; - case AP14: //gps定位包 - handleBP01(cmd); - ICLogger.i("服务器收到定位AP01"); - mConnection.DeliverCMDMessageToSystem("AP01", cmd);//通知下面线程状态变化 - break; - case AP04://查询终端版本消息 - handleAP04(mRuntime,mConnection,cmd); - break; // case AP14:// wifi定位包 // handleBP02(cmd); // ICLogger.i("服务器收到定位AP02");