From: snickersun Date: Tue, 12 Jan 2021 02:59:56 +0000 (+0800) Subject: 1、心跳 Alarm改为HeartBeatAlarm,使代码更好读 X-Git-Url: http://git.snicker.com.cn/?a=commitdiff_plain;h=d4239b1b85404b7361568b01abba6bc9eadaafe4;p=protocol_srv.git 1、心跳 Alarm改为HeartBeatAlarm,使代码更好读 2、ThreadPool 改newInstance为 GetInstance 3、去掉各个协议中 心率测试周期设置时的broadcast消息,改为直接调用setHeartRateAlarm,减少消息阻塞造成的任务延迟。 4、InputEventReader中 编译问题 5、Util.java中添加 byteArray4ToInt intToByteArray4等函数,InputEventReader中使用。 6、去掉之前antiPoling 计划的代码,poling要在驱动中实现才靠谱。 --- diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 12727f6d..ac0fa20f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -103,8 +103,7 @@ - - + diff --git a/app/src/main/java/com/enqualcomm/support/Config.java b/app/src/main/java/com/enqualcomm/support/Config.java index 036845b8..1775504e 100644 --- a/app/src/main/java/com/enqualcomm/support/Config.java +++ b/app/src/main/java/com/enqualcomm/support/Config.java @@ -165,7 +165,6 @@ public class Config { final static String KeyBPLadust="KeyBPLAdjust"; final static String KeySPo2adust="KeySPo2Adjust"; - final static String KeyPolingCycleCheckAnti="PolingCycleCheckAnti"; final static String KeyBleScanCycle="BleScanCycle"; final static String KeyLastUnReadMessage="UnreadMsg"; @@ -187,15 +186,6 @@ public class Config { return SharPreferenceUtil.getPrefInt(context,KeyMasterVolume,15); } - - public static void setCheckAntiPolingCycle(Context context, int cycle){ - SharPreferenceUtil.setPrefInt(context,KeyPolingCycleCheckAnti,cycle); - } - - public static int getCheckAntiPolingCycle(Context context){ - return SharPreferenceUtil.getPrefInt(context,KeyPolingCycleCheckAnti,0); - } - public static void setBleScanCycle(Context context, int cycle){ SharPreferenceUtil.setPrefInt(context,KeyBleScanCycle,cycle); } diff --git a/app/src/main/java/com/enqualcomm/support/Constants.java b/app/src/main/java/com/enqualcomm/support/Constants.java index ac7efc2a..c73ef318 100644 --- a/app/src/main/java/com/enqualcomm/support/Constants.java +++ b/app/src/main/java/com/enqualcomm/support/Constants.java @@ -47,6 +47,7 @@ public interface Constants { String ACTION_HEATR_RATE_START = "com.eqc.heartrate.action.SILENT_START"; String ACTION_CHECK_ANTIOFF_EVENT = "com.ic.action.CHECK_ANTIOFF_EVENT"; + String ACTION_CHECK_CUTOFF_EVENT = "com.ic.action.CHECK_CUTOFF_EVENT"; String ACTION_IMESSAGE = "action.message"; @@ -135,9 +136,8 @@ public interface Constants { String FLAG = "flag"; - String ANTI_ALARM = "com.enqualcomm.support.ANTI_ALARM"; String TEMP_ALARM = "com.enqualcomm.support.TEMP_ALARM"; - String HEART_ALARM = "com.enqualcomm.support.HEART_ALARM"; + String HEARTBEAT_ALARM = "com.enqualcomm.support.HEARTBEAT_ALARM"; int IDLE_MODE_CHANGED = 102; diff --git a/app/src/main/java/com/enqualcomm/support/CoreService.java b/app/src/main/java/com/enqualcomm/support/CoreService.java index f7d42535..4e443595 100644 --- a/app/src/main/java/com/enqualcomm/support/CoreService.java +++ b/app/src/main/java/com/enqualcomm/support/CoreService.java @@ -70,6 +70,7 @@ import static com.enqualcomm.support.Constants.ACTION_ALARM_ADD_DATAPOINTS; import static com.enqualcomm.support.Constants.ACTION_ALARM_ALARM_CHANGE; import static com.enqualcomm.support.Constants.ACTION_ALARM_BLE_SCAN; import static com.enqualcomm.support.Constants.ACTION_CHECK_ANTIOFF_EVENT; +import static com.enqualcomm.support.Constants.ACTION_CHECK_CUTOFF_EVENT; import static com.enqualcomm.support.Constants.ACTION_EQC_ALARM; import static com.enqualcomm.support.Constants.ACTION_HEATR_RATE_START; import static com.enqualcomm.support.Constants.ACTION_LOCAL_SOS_ACTION; @@ -77,10 +78,10 @@ import static com.enqualcomm.support.Constants.ACTION_LOCATION_ALARM; import static com.enqualcomm.support.Constants.ACTION_QUERY_WEATHER; import static com.enqualcomm.support.Constants.ACTION_SEND_EMEGENCY_LOCATION_START; import static com.enqualcomm.support.Constants.ACTION_SEND_EMEGENCY_LOCATION_STOP; -import static com.enqualcomm.support.Constants.ANTI_ALARM; + import static com.enqualcomm.support.Constants.FROM_ALARM; import static com.enqualcomm.support.Constants.FROM_SERVER; -import static com.enqualcomm.support.Constants.HEART_ALARM; +import static com.enqualcomm.support.Constants.HEARTBEAT_ALARM; import static com.enqualcomm.support.Constants.KEY_SAVE_STEP_COUNT; import static com.enqualcomm.support.Constants.KEY_STEP_COUNT; import static com.enqualcomm.support.Constants.STEP_COUNT_ALARM_ACTION; @@ -168,7 +169,7 @@ public class CoreService extends Service { //只有需要确定绝对时间点启动的Alarm需要重置,相对时间点的Alarm不需要重置。防止永远不能正常登陆。 setSleepAlarm(); setWakeAlarm(); -// setHeartAlarm(); +// setHeartBeatAlarm(); // setHeartRateDetectAlarm(runtime.getPpgTestCycle()); setWeatherAlarm(); runtime.getContextProxy().sendBroadcast(ACTION_ALARM_ALARM_CHANGE, runtime); //更新Alarm @@ -922,7 +923,7 @@ public class CoreService extends Service { //网络协议心跳时间 - setHeartAlarm(); + setHeartBeatAlarm(); //设置心率检测频率 setHeartRateDetectAlarm(runtime.getPpgTestCycle()); //3分钟一次 @@ -936,16 +937,8 @@ public class CoreService extends Service { setLocationAlarm(runtime.getLocationInstance().getWorkingMod()); //设置温度测量间隔时间 - setTempAlarm(false); - - //初始化佩戴检测 - runtime.anti_test_cycle_minutes = Config.getCheckAntiPolingCycle(this); - if (runtime.anti_test_cycle_minutes > 0) { - // setAntiAlarm(); - } - //初始化蓝牙检测 runtime.bleInfo.bleScanCycle = Config.getBleScanCycle(this); if (Config.BLEScanProtocol == 1 && runtime.bleInfo.bleScanCycle > 0) { @@ -1139,7 +1132,7 @@ public class CoreService extends Service { ICLogger.i(stringBuilder.toString()); // if (ACTION_ALARM.equals(paramIntent.getAction())) { - if (HEART_ALARM.equals(paramIntent.getAction())) { + if (HEARTBEAT_ALARM.equals(paramIntent.getAction())) { //发送心跳间隔广播给其他应用 this.runtime.getContextProxy().sendBroadcast(ACTION_EQC_ALARM, this.runtime); this.connectionServiceChain.processAlarmClock(this.connection, this.runtime); @@ -1173,7 +1166,7 @@ public class CoreService extends Service { } //检测电池电量 并上报低电报警 batteryUtil.getBatteryLevel(this); - setHeartAlarm(); + setHeartBeatAlarm(); if (Config.LOG_TOFILE) ICLogger.logToFile("alarmCycle", "HEART_ALARM alarmCycle "); return Service.START_STICKY; @@ -1268,20 +1261,6 @@ public class CoreService extends Service { is_allowed_in_sleep_mode = 1; setWakeAlarm(); return Service.START_STICKY; - } else if (ANTI_ALARM.equals(paramIntent.getAction())) { - //测试是否佩戴 - antiservice.CheckAntiByPoling(); - if (Config.LOG_TOFILE) - ICLogger.logToFile("alarmCycle", "ANTI_ALARM alarmCycle "); - setAntiAlarm(); - - return Service.START_STICKY; -// if (this.mKeepAlive != null) { -// -// if (connection.isServerConnected() && runtime.isServerProtocolConnected()) { -// } -// return Service.START_STICKY; -// } } else if (TEMP_ALARM.equals(paramIntent.getAction())) { setTempAlarm(false); @@ -1334,8 +1313,9 @@ public class CoreService extends Service { } else if (ACTION_CHECK_ANTIOFF_EVENT.equals(paramIntent.getAction())) { //只在中断式检测过程中延时用 antiservice.check_ant_event(); + }else if (ACTION_CHECK_CUTOFF_EVENT.equals(paramIntent.getAction())){ + antiservice.check_cut_event(); } - this.invokeHandlerServiceChain.processUserRequest(paramIntent, this.connection, this.runtime); } @@ -1442,14 +1422,14 @@ public class CoreService extends Service { } - public void setHeartAlarm() { + public void setHeartBeatAlarm() { // int mod=runtime.getLocationInstance().getWorkingMod(); StringBuilder sb = new StringBuilder(); int cycle = runtime.getHeartBeatCycle(); //心跳指令默认设置 - AlarmHelper.setRealTimeAlarm(runtime.getContextProxy().context, cycle, HEART_ALARM); - sb.append(" setHeartAlarm " + HEART_ALARM + ", cycle " + cycle +" minutes"); + AlarmHelper.setRealTimeAlarm(runtime.getContextProxy().context, cycle, HEARTBEAT_ALARM); + sb.append(" setHeartBeatAlarm " + HEARTBEAT_ALARM + ", cycle " + cycle +" minutes"); // locationClient.triggerLocationProcess(); ICLogger.i(sb.toString()); FileOutputUtil.fileOutput(runtime.getCacheDir(), "alarmCycle", sb.toString()); @@ -1457,19 +1437,6 @@ public class CoreService extends Service { // AlarmHelper.setRealTimeAlarm(runtime.getContextProxy().context,1, HEART_ALARM); } - public void setAntiAlarm() { -// int mod=runtime.getLocationInstance().getWorkingMod(); - StringBuilder sb = new StringBuilder(); - int cycle = runtime.anti_test_cycle_minutes; - if (cycle > 1) { - AlarmHelper.setRealTimeAlarm(runtime.getContextProxy().context, cycle, ANTI_ALARM); - } - sb.append(" setHeartAlarm " + ANTI_ALARM + ", cycle " + cycle+" minutes"); - - ICLogger.i(sb.toString()); - FileOutputUtil.fileOutput(runtime.getCacheDir(), "alarmCycle", sb.toString()); - } - public void setTempAlarm(boolean fromServerCmd) { StringBuilder sb = new StringBuilder(); int cycle = runtime.temp_test_Cycle_Seconds; 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 d2456c31..d42b5ab6 100644 --- a/app/src/main/java/com/enqualcomm/support/bean/Runtime.java +++ b/app/src/main/java/com/enqualcomm/support/bean/Runtime.java @@ -17,7 +17,6 @@ public class Runtime { private boolean debugflag = false; public int temp_test_Cycle_Seconds = 60 * 60; - public int anti_test_cycle_minutes = 30; public static String PushtxtMsg_srv_index = ""; diff --git a/app/src/main/java/com/enqualcomm/support/service/HeartRateManager.java b/app/src/main/java/com/enqualcomm/support/service/HeartRateManager.java index b55b290d..d16cde8f 100644 --- a/app/src/main/java/com/enqualcomm/support/service/HeartRateManager.java +++ b/app/src/main/java/com/enqualcomm/support/service/HeartRateManager.java @@ -246,6 +246,8 @@ public class HeartRateManager extends AbstractInvokeHandlerService { runtime.getContextProxy().context.sendBroadcast(intent); } + + //由于消息阻塞,暂时不用此种消息处理方式了 private final BroadcastReceiver PPGStartReceiver = new BroadcastReceiver() { public void onReceive(Context param1Context, Intent param1Intent) { if (ACTION_HEATR_RATE_START.equals(param1Intent.getAction())) { @@ -279,12 +281,12 @@ public class HeartRateManager extends AbstractInvokeHandlerService { } public void onAttach(Connection paramConnection, Runtime paramRuntime) { - regReceiver(); +// regReceiver(); } public void onDetach(Connection paramConnection, Runtime paramRuntime) { ICLogger.d("onDetach..."); - unRegReceiver(); +// unRegReceiver(); //取消服务注册 try { heartRateSensorService.unRegisterCallback(mRemoteCallback); diff --git a/app/src/main/java/com/enqualcomm/support/service/InputEventReader.java b/app/src/main/java/com/enqualcomm/support/service/InputEventReader.java index 596114de..bcb643be 100644 --- a/app/src/main/java/com/enqualcomm/support/service/InputEventReader.java +++ b/app/src/main/java/com/enqualcomm/support/service/InputEventReader.java @@ -179,7 +179,6 @@ public class InputEventReader { FileInputStream br=new FileInputStream(antipath); byte buf[]=new byte[50]; int len=0; - br.available() while(true){ len=br.read(buf); if(len>0) { diff --git a/app/src/main/java/com/enqualcomm/support/utils/TemperatureUtil.java b/app/src/main/java/com/enqualcomm/support/utils/TemperatureUtil.java index cfebf21a..89ae10ab 100644 --- a/app/src/main/java/com/enqualcomm/support/utils/TemperatureUtil.java +++ b/app/src/main/java/com/enqualcomm/support/utils/TemperatureUtil.java @@ -152,7 +152,7 @@ public class TemperatureUtil { public void doTempTestInThread(int from) { - ThreadPool.newInstance().submitThreadPool(() -> DoTempTest(from)); + ThreadPool.getInstance().submitThreadPool(() -> DoTempTest(from)); } public static final String ACTION_TEMP_RESULT = "com.ic.action.temp_result"; diff --git a/app/src/main/java/com/enqualcomm/support/utils/ThreadPool.java b/app/src/main/java/com/enqualcomm/support/utils/ThreadPool.java index 5879c7f9..cb3cf2db 100644 --- a/app/src/main/java/com/enqualcomm/support/utils/ThreadPool.java +++ b/app/src/main/java/com/enqualcomm/support/utils/ThreadPool.java @@ -15,7 +15,7 @@ final public class ThreadPool { } - public static ThreadPool newInstance() { + public static ThreadPool getInstance() { if (instance == null) { synchronized (ThreadPool.class) { if (instance == null) { diff --git a/app/src/main/java/com/enqualcomm/support/utils/Util.java b/app/src/main/java/com/enqualcomm/support/utils/Util.java index 25949705..41a8c4ce 100644 --- a/app/src/main/java/com/enqualcomm/support/utils/Util.java +++ b/app/src/main/java/com/enqualcomm/support/utils/Util.java @@ -37,6 +37,7 @@ import java.io.UnsupportedEncodingException; import java.lang.reflect.Method; import java.net.InetAddress; import java.nio.ByteBuffer; +import java.nio.ByteOrder; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Enumeration; @@ -1159,5 +1160,58 @@ public class Util { private static byte charToByte(char c) { return (byte) "0123456789ABCDEF".indexOf(c); } + + public static int byteArray4ToInt(byte[] b) { + return b[3] & 0xFF | + (b[2] & 0xFF) << 8 | + (b[1] & 0xFF) << 16 | + (b[0] & 0xFF) << 24; + } + public static byte[] intToByteArray4(int a) { + return new byte[] { + (byte) ((a >> 24) & 0xFF), + (byte) ((a >> 16) & 0xFF), + (byte) ((a >> 8) & 0xFF), + (byte) (a & 0xFF) + }; + } + + /** + * 将字节数组转为long
+ * 如果input为null,或offset指定的剩余数组长度不足8字节则抛出异常 + * @param input + * @param offset 起始偏移量 + * @param littleEndian 输入数组是否小端模式 + * @return + */ + public static long longFrom8Bytes(byte[] input, int offset, boolean littleEndian){ + if(offset <0 || offset+8>input.length) + throw new IllegalArgumentException(String.format("less than 8 bytes from index %d is insufficient for long",offset)); + long value=0; + for(int count=0;count<8;++count){ + int shift=(littleEndian?count:(7-count))<<3; + value |=((long)0xff<< shift) & ((long)input[offset+count] << shift); + } + return value; + } + + /** + * 利用 {@link java.nio.ByteBuffer}实现byte[]转long + * @param input + * @param offset + * @param littleEndian 输入数组是否小端模式 + * @return + */ + public static long bytesToLong(byte[] input, int offset, boolean littleEndian) { + if(offset <0 || offset+8>input.length) + throw new IllegalArgumentException(String.format("less than 8 bytes from index %d is insufficient for long",offset)); + ByteBuffer buffer = ByteBuffer.wrap(input,offset,8); + if(littleEndian){ + // ByteBuffer.order(ByteOrder) 方法指定字节序,即大小端模式(BIG_ENDIAN/LITTLE_ENDIAN) + // ByteBuffer 默认为大端(BIG_ENDIAN)模式 + buffer.order(ByteOrder.LITTLE_ENDIAN); + } + return buffer.getLong(); + } } diff --git a/app/src/main/java/com/ic/protocols/protocol_beehome.java b/app/src/main/java/com/ic/protocols/protocol_beehome.java index f59f2e1c..2b12c266 100644 --- a/app/src/main/java/com/ic/protocols/protocol_beehome.java +++ b/app/src/main/java/com/ic/protocols/protocol_beehome.java @@ -1,2089 +1,2090 @@ -package com.ic.protocols; - -import android.content.ComponentName; -import android.content.Intent; -import android.net.Uri; -import android.os.Environment; - -import com.enqualcomm.support.Config; -import com.enqualcomm.support.CoreService; -import com.enqualcomm.support.bean.Alarm; -import com.enqualcomm.support.bean.Contact; -import com.enqualcomm.support.bean.Content; -import com.enqualcomm.support.bean.ICLocation; -import com.enqualcomm.support.bean.Runtime; -import com.enqualcomm.support.bean.StringMessage; -import com.enqualcomm.support.bean.VoiceContent; -import com.enqualcomm.support.bean.voicePacket; -import com.enqualcomm.support.service.HeartRateManager; -import com.enqualcomm.support.utils.Connection; -import com.enqualcomm.support.utils.ICLogger; -import com.enqualcomm.support.utils.TemperatureUtil; -import com.enqualcomm.support.utils.TimeUtil; -import com.enqualcomm.support.utils.Util; - -import java.io.File; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; - -import static com.enqualcomm.support.Constants.ACTION_HEATR_RATE_START; -import static com.enqualcomm.support.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; - -public class protocol_beehome { - private static final String TAG = "ICSrv." + protocol_beehome.class.getSimpleName(); - - private static final String CMDHEADER = "IW"; - private static final String CMDEND = "#"; - private static final String CMDSPLIT = ","; - public static final String defaultServerIP = "en.beehome360.com"; - public static final int defaultServerPort = 5018; - - public enum CMD_TYPE { - /*终端发起*/ - AP00,//登录包 - BP00, - AP01,//混合定位 - BP01, - AP02,//多基站定位 - BP02, - AP92,//CDMA 混合定位 - BP92, - AP03,//心跳包 - BP03, - AP05,//语音查询接收 - BP05, - AP07,//语音上行 - BP07, - AP10,//报警与地址回复 - BP10, - AP49,//心率上传 - BP49, - APHT,//心率血压上传 - BPHT, - APTM,//基站校时及获取定位 - BPTM, - /* 服务器发起*/ - AP12, - BP12,//SOS 号码设置 - AP14, - BP14,//设置联系人白名单 - AP15, - BP15,//设置定位周期 - AP16, - BP16,//立即定位 - AP17, - BP17,//恢复出厂设置 - AP18, - BP18,//重启设备 - AP21, - BP21,//设置计步开关 - AP28, - BP28, //语音下行 - AP31, - BP31,//关机 - AP33, - BP33,//工作模式 - AP34, - BP34,//自定义工作模式 - AP40, - BP40,//下发文本 - AP68, - BP68,//绑定解绑 - APXL, - BPXL,//测量心率 - APXY, - BPXY,//测量血压 - APJZ, - BPJZ,//血压校准 - AP84, - BP84,//白名单开关 - AP85, - BP85,//设置闹钟 - AP86, - BP86,//绑定解绑 - AP88, - BP88,//查找手表 - AP89, - BP89,//心率血压阀值设置 - APTE, - BPTE,//体温间隔设置 - APTP, - BPTP,//体温上行 - APX1, - BPX1,//心率血压血氧修正 - APS4, - BPS4,//提醒设置(时间段) - APHP,//上报心率血压血氧 - BPHP, - UNKNOWN_CMD, - } - - private static HashMap cmdMap = null; - - static { - cmdMap = new HashMap(); - cmdMap.put(CMD_TYPE.AP00, "AP00"); - cmdMap.put(CMD_TYPE.BP00, "BP00"); - cmdMap.put(CMD_TYPE.AP01, "AP01"); - cmdMap.put(CMD_TYPE.BP01, "BP01"); - cmdMap.put(CMD_TYPE.AP02, "AP02"); - cmdMap.put(CMD_TYPE.BP02, "BP02"); - cmdMap.put(CMD_TYPE.AP92, "AP92"); - cmdMap.put(CMD_TYPE.BP92, "BP92"); - cmdMap.put(CMD_TYPE.AP03, "AP03"); - cmdMap.put(CMD_TYPE.BP03, "BP03"); - cmdMap.put(CMD_TYPE.AP05, "AP05"); - cmdMap.put(CMD_TYPE.BP05, "BP05"); - cmdMap.put(CMD_TYPE.AP07, "AP07"); - cmdMap.put(CMD_TYPE.BP07, "BP07"); - cmdMap.put(CMD_TYPE.AP10, "AP10"); - cmdMap.put(CMD_TYPE.BP10, "BP10"); - cmdMap.put(CMD_TYPE.AP49, "AP49"); - cmdMap.put(CMD_TYPE.BP49, "BP49"); - cmdMap.put(CMD_TYPE.APHT, "APHT"); - cmdMap.put(CMD_TYPE.BPHT, "BPHT"); - cmdMap.put(CMD_TYPE.APTM, "APTM"); - cmdMap.put(CMD_TYPE.BPTM, "BPTM"); - cmdMap.put(CMD_TYPE.AP12, "AP12"); - cmdMap.put(CMD_TYPE.BP12, "BP12"); - cmdMap.put(CMD_TYPE.AP14, "AP14"); - cmdMap.put(CMD_TYPE.BP14, "BP14"); - cmdMap.put(CMD_TYPE.AP15, "AP15"); - cmdMap.put(CMD_TYPE.BP15, "BP15"); - cmdMap.put(CMD_TYPE.AP16, "AP16"); - cmdMap.put(CMD_TYPE.BP16, "BP16"); - cmdMap.put(CMD_TYPE.AP17, "AP17"); - cmdMap.put(CMD_TYPE.BP17, "BP17"); - cmdMap.put(CMD_TYPE.AP18, "AP18"); - cmdMap.put(CMD_TYPE.BP18, "BP18"); - cmdMap.put(CMD_TYPE.AP21, "AP21"); - cmdMap.put(CMD_TYPE.BP21, "BP21"); - cmdMap.put(CMD_TYPE.AP28, "AP28"); - cmdMap.put(CMD_TYPE.BP28, "BP28"); - cmdMap.put(CMD_TYPE.AP31, "AP31"); - cmdMap.put(CMD_TYPE.BP31, "BP31"); - cmdMap.put(CMD_TYPE.AP33, "AP33"); - cmdMap.put(CMD_TYPE.BP33, "BP33"); - cmdMap.put(CMD_TYPE.AP34, "AP34"); - cmdMap.put(CMD_TYPE.BP34, "BP34"); - cmdMap.put(CMD_TYPE.AP40, "AP40"); - cmdMap.put(CMD_TYPE.BP40, "BP40"); - cmdMap.put(CMD_TYPE.AP68, "AP68"); - cmdMap.put(CMD_TYPE.BP68, "BP68"); - cmdMap.put(CMD_TYPE.APXL, "APXL"); - cmdMap.put(CMD_TYPE.BPXL, "BPXL"); - cmdMap.put(CMD_TYPE.APXY, "APXY"); - cmdMap.put(CMD_TYPE.BPXY, "BPXY"); - cmdMap.put(CMD_TYPE.APJZ, "APJZ"); - cmdMap.put(CMD_TYPE.BPJZ, "BPJZ"); - cmdMap.put(CMD_TYPE.AP84, "AP84"); - cmdMap.put(CMD_TYPE.BP84, "BP84"); - cmdMap.put(CMD_TYPE.AP85, "AP85"); - cmdMap.put(CMD_TYPE.BP85, "BP85"); - cmdMap.put(CMD_TYPE.AP86, "AP86"); - cmdMap.put(CMD_TYPE.BP86, "BP86"); - cmdMap.put(CMD_TYPE.AP88, "AP88"); - cmdMap.put(CMD_TYPE.BP88, "BP88"); - cmdMap.put(CMD_TYPE.AP89, "AP89"); - cmdMap.put(CMD_TYPE.BP89, "BP89"); - cmdMap.put(CMD_TYPE.APTE, "APTE"); - cmdMap.put(CMD_TYPE.BPTE, "BPTE"); - cmdMap.put(CMD_TYPE.APTP, "APTP"); - cmdMap.put(CMD_TYPE.BPTP, "BPTP"); - cmdMap.put(CMD_TYPE.APX1, "APX1"); - cmdMap.put(CMD_TYPE.BPX1, "BPX1"); - cmdMap.put(CMD_TYPE.APS4, "APS4"); - cmdMap.put(CMD_TYPE.BPS4, "BPS4"); - cmdMap.put(CMD_TYPE.APHP, "APHP"); - cmdMap.put(CMD_TYPE.BPHP, "BPHP"); - - } - - - private Connection mConnection = null; - private Runtime mRuntime = null; - - public protocol_beehome(Connection connect, Runtime runtime) { - 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); - } - - - /**/ - 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); - log("bytes.size " + bytes.length); -// cmdbuf.append(cmd_msgbuf); - cmdbuf.append(cmd_msgbuf); - log("cmdbuf.size " + cmdbuf.length() + " " + cmdbuf.toString()); - /* - 如果不是 #结尾,就认为 接收数据不全,置位。 - */ - if (cmdbuf.toString().endsWith(CMDEND)) { - iscmdComplete = true; - } - String[] cmdlist = cmd_msgbuf.split(CMDEND); - int listlen = cmdlist.length; - log("listlen " + listlen); - /* - 如果解析出来的cmdlist不是空,且数据不是完整cmd则保留 最后一条数据到last_inCompletecmd - */ - if (cmdlist.length > 0 && iscmdComplete == false) { - listlen -= 1; - last_inCompletecmd = cmdlist[listlen]; - log("cmd not complete , " + last_inCompletecmd); - } - for (int i = 0; i < listlen; i++) { - for (CMD_TYPE key : cmdMap.keySet()) { - if (cmdlist[i].startsWith(CMDHEADER + cmdMap.get(key))) { - log("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key) + " , " + cmdlist[i]); - if (key == CMD_TYPE.BP28) { - //如果是BP28则 后面的数据是音频,需要保留 - byte[] amrBuf; - int amrLen = getBP28Amrlen(cmdlist[i]); - if (bytes.length > amrLen) { - handleCmd(key, cmdlist[i], bytes); - } - } else { - handleCmd(key, cmdlist[i]); - } - } - } - } - - cmdbuf = new StringBuffer().append(last_inCompletecmd); - return ret; - } - - public int getBP28Amrlen(String cmd) { - - String Name; - String appendIndex; - int packetCount; - int currentId; - int packetLen; - - - String[] msg = cmd.split(CMDSPLIT); - if (msg.length >= 6) { - - 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(timezone); - - - ICLogger.i("===" + TimeUtil.getDefaultTimeZone()); - TimeUtil.setSysDateTime(runtime.getContextProxy().context, datetime, timezone); - ICLogger.i("===" + TimeUtil.getDefaultTimeZone()); - - } -// Set Datetime 20200505112734 -// Set TimeZone 8 - } catch (Exception e) { - ICLogger.e(e.getMessage(), e); - } - } 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("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:跌倒报警)) IC,即爱 - * 00为报警状态,00为无任何报警(01:SOS,02:低电,03:脱落报警,04:佩戴提醒,05:剪断报警,06:跌倒报警,07:心率异常, 08:心率过高, 09:心率过低,10收缩压过高,11收缩压过低,12舒张压过高,13舒张压过低) - * zh-cn:设备语言 - * 00:第一个0:是否需要回复地址信息,0:不回复,1回复. - * HOME|74-DE-2B-44-88-8C|97&HOME1|74-DE-2B-44-88-8C|97&HOME2|74-DE-2B-44-88-8C|97&HOME3|74-DE-2B-44-88-8C|97# - */ - 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) { - 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)); - try { - 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(cmdMap.get(CMD_TYPE.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(cmdMap.get(CMD_TYPE.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 (!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(cmdMap.get(CMD_TYPE.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(); - 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(cmdMap.get(CMD_TYPE.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 alarmlist = new ArrayList<>(); - if (datalist.length > 0) { - try { - for (int i = 0; i < datalist.length; i++) { - String[] cmdarglist = datalist[i].split(","); - - if (i == 0) { - if (cmdarglist.length == 9) { - imei = cmdarglist[1]; - cmdindex = cmdarglist[2]; - all_alarmswitch = Integer.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", "闹铃")); - - } else if (cmdarglist.length == 5) { - imei = cmdarglist[1]; - cmdindex = cmdarglist[2]; - all_alarmswitch = Integer.parseInt(cmdarglist[3]); - alarmcount = Integer.parseInt(cmdarglist[4]); - } else { - log("data len is too small!"); - } - } else { - if (cmdarglist.length == 4) { - 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", "闹铃")); - - } else { - log("data len is too small!"); - } - - } - }//循环获取alarm数据结束 - runtime.getDbHelper().saveAlarm(alarmlist); - - //do clean and set alarm things - } catch (Exception e) { - ICLogger.e(e.getMessage(), e); - } - } -//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(cmdMap.get(CMD_TYPE.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); -// CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod()); - //此处设置好配置后,会在LocationClient通过消息开始执行及时定位操作。 - } catch (Exception e) { - ICLogger.e(e.getMessage(), e); - } - } - - } - - - public static StringMessage AP34(String cmdindex, int workMode) { -//IWAP34,588854,1# -//080835:指令流水号 -//8:模式 - return genStringMessage(cmdMap.get(CMD_TYPE.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); - 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编码 - - - String[] cmdlist = cmd.split(","); - if (cmdlist.length == 4) { - String cmdindex = cmdlist[2]; - String txtmsg = cmdlist[3]; - - txtmsg = Util.UrlGB2312ToUTF8(txtmsg); - StringMessage msg = AP40(cmdindex, 1); - //设定当前工作模式及循环频率 - connection.send(msg); - ICLogger.i("received Txt Msg " + txtmsg); - runtime.getContextProxy().sendMsgBroadcast(txtmsg, 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(cmdMap.get(CMD_TYPE.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(cmdMap.get(CMD_TYPE.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) { - try { - String index = list[2]; - String time = list[3]; - connection.send(AP15(index)); - ICLogger.i("BP15 , 定位周期=" + time + "秒"); - - 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(cmdMap.get(CMD_TYPE.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(cmdMap.get(CMD_TYPE.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) { - - //设备响应: IWAP86, 080835# - //080835:指令流水号 - return genStringMessage(cmdMap.get(CMD_TYPE.AP68), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP68)) - .append(CMDSPLIT).append(index) - .append(CMDEND).toString()); - } - - public void handleBP68(String cmd, Connection connection, Runtime runtime) { - - //示例: - //IWBP68,353456789012345,080835,1# - //说明: - //IW:标识符 - //BP68 : 命令字符 - //353456789012345:IMEI号,设备唯一ID - //080835 :指令流水号 - //1 : 表示设备为激活状态(绑定成功) 0:表示设备为未激活状态(解绑成功) - - String[] list = cmd.split(CMDSPLIT); - - if (list.length == 4) { - String index = list[2]; - String type = list[3]; - connection.send(AP68(index)); - ICLogger.i("收到服务器消息:" + (type.equals("1") ? "绑定成功 " : "未激活或者解绑")); - - } else { - ICLogger.i("BP86 format error!"); - } - - } - - //17.设置心率/血压测量周期(下行协议号:BP86,响应:AP86) - public static StringMessage AP86(String index) { - - //设备响应: IWAP86, 080835# - //080835:指令流水号 - return genStringMessage(cmdMap.get(CMD_TYPE.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# - //说明: - //IW:标识符 - //BP86 : 命令字符 - //353456789012345:IMEI号,设备唯一ID - //080835 :指令流水号 - //1: 表示心率周期;2 :表示血压周期 - //720: 表示720分钟 - - String[] list = cmd.split(CMDSPLIT); - - if (list.length == 5) { - try { - String index = list[2]; - String type = list[3]; - String cycle = list[4]; - connection.send(AP86(index)); - ICLogger.i("收到服务器指令:设置" + (type.equals("1") ? "心率周期 " : "血压周期 ") + cycle + "分钟"); - - //发送重置PPGCycle的广播,会在CoreServer里面执行 - Intent intent = new Intent(); - intent.putExtra("PPGTestCycle", Integer.parseInt(cycle)); - runtime.getContextProxy().sendBrodcast(ACTION_HEATR_RATE_START, intent); - } catch (Exception e) { - ICLogger.e(e.getMessage(), e); - } - } else { - ICLogger.i("BP86 format error!"); - } - - } - - public static StringMessage AP88(String index) { - //设备响应: IWAP88, 080835# - //080835:指令流水号 - return genStringMessage(cmdMap.get(CMD_TYPE.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(cmdMap.get(CMD_TYPE.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(cmdMap.get(CMD_TYPE.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); - } -// double wrist_temp,body_temp; -// wrist_temp=TemperatureUtil.get_temp_value_adjusted(); -// body_temp=TemperatureUtil.getBodyTemp(wrist_temp,26.0f); -// String temperatureMsg=APTP(wrist_temp,body_temp); -// connection.send(genStringMessage("APTP",temperatureMsg)); -// ICLogger.i("发送体温测量值 "+temperatureMsg); - } else { - ICLogger.i("BP89 format error!"); - } - - } - - //体温上行(上行协议号:APTP,响应:BPTP) - public static StringMessage APTP(double wrist_temp, double body_temp) { - - //设备: 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$.2f", wrist_temp)) - .append(CMDSPLIT).append(String.format("%1$.2f", body_temp)) - .append(CMDSPLIT).append(0) - .append(CMDEND).toString()); - } - - public void handleBPTP() { - - ICLogger.d("BPTP 服务器收到体温数据!"); - - } - - - public static StringMessage APX1(String id) { - //设备响应: IWAPX1, 080835# - //080835:指令流水号 - return genStringMessage(cmdMap.get(CMD_TYPE.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); - - ICLogger.i("Handle BPX1 IMEI " + imei + ",index " + index + ", BPH " + strBPH + ", BPL " + strBPL + ", PPG " + strXL + ", Sp02 " + strSpO2); - } 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(cmdMap.get(CMD_TYPE.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 boolean handleCmd(CMD_TYPE type, String cmd) { - - //普通非二进制命令用此函数处理 - boolean ret = true; - ICLogger.i("handleCmd " + type.name() + " strLen=" + cmd.length()); - if (Config.LOG_TOFILE) ICLogger.logToFile("APILog", " recv " + cmd); - switch (type) { - case BP00: //登录包 - handleBP00(mRuntime, cmd); - ICLogger.i("服务器收到登录包AP00"); - mConnection.DeliverCMDMessageToSystem("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 BPTM: - //校时命令 - handleBPTM(cmd); - ICLogger.i("服务器收到校时命令APTM"); - mConnection.DeliverCMDMessageToSystem("APTM", cmd);//通知下面线程状态变化 - break; - case BP85://设置闹钟 - handleBP85(cmd, mConnection, mRuntime); - ICLogger.i("收到服务器设置闹钟命令BP85"); - mConnection.DeliverCMDMessageToSystem("AP85", cmd);//通知下面线程状态变化 - break; - case BP33: - //设置工作模式 - handleBP33(mConnection, mRuntime, cmd); - mConnection.DeliverCMDMessageToSystem("setWorkMod", cmd);//通知下面线程状态变化 - - break; - case BP34: - //设置工作模式 - handleBP34(mConnection, mRuntime, cmd); - mConnection.DeliverCMDMessageToSystem("setWorkMod", cmd);//通知下面线程状态变化 - break; - case BP16: - //立即定位指令(长链接有效) - handleBP16(mConnection, mRuntime, cmd); - mConnection.DeliverCMDMessageToSystem("StartLocate", cmd);//通知下面线程状态变化 - break; - -// case BP05: //L02服务器不适用 -// //查询服务器语音 返回信息 -// API.handleBP05(cmd); -// break; - - case BP12: - //收到设置SOS号码 - handleBP12(mConnection, cmd, mRuntime); - ICLogger.i("收到服务器设置SOS号码命令BP12"); - break; - case BP14: - //收到设置白名单号码 - handleBP14(mConnection, cmd, mRuntime); - ICLogger.i("收到服务器设置白名单号码命令BP14"); - break; - case BP15: - handleBP15(cmd, mConnection, mRuntime); - ICLogger.i("收到服务器设置定位命令BP15"); - break; - case BP17: - //收到恢复出厂设置 - handleBP17(mConnection, cmd); - ICLogger.i("收到服务器恢复出厂设置命令BP17"); - mConnection.DeliverCMDMessageToSystem("FactoryReset", cmd);//通知下面线程状态变化 - break; - - case BP18: - //收到重启 - handleBP18(mConnection, cmd); - ICLogger.i("收到服务器重启命令BP18"); - mConnection.DeliverCMDMessageToSystem("Reboot", cmd);//通知下面线程状态变化 - break; - - case BP31: - //收到关机 - handleBP31(mConnection, cmd); - ICLogger.i("收到服务器关机命令BP31"); - mConnection.DeliverCMDMessageToSystem("poweroff", cmd);//通知下面线程状态变化 - break; - case BP40: - //服务器推送文本 - handleBP40(mConnection, mRuntime, cmd); - ICLogger.i("收到服务器推送文本消息"); - mConnection.DeliverCMDMessageToSystem("showTxt", cmd);//通知下面线程状态变化 - break; - - case BPXL: - handleBPXL(cmd, mConnection); - ICLogger.i("收到服务器心率检测命令"); - 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 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; - } - - 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; - } -} +package com.ic.protocols; + +import android.content.ComponentName; +import android.content.Intent; +import android.net.Uri; +import android.os.Environment; + +import com.enqualcomm.support.Config; +import com.enqualcomm.support.CoreService; +import com.enqualcomm.support.bean.Alarm; +import com.enqualcomm.support.bean.Contact; +import com.enqualcomm.support.bean.Content; +import com.enqualcomm.support.bean.ICLocation; +import com.enqualcomm.support.bean.Runtime; +import com.enqualcomm.support.bean.StringMessage; +import com.enqualcomm.support.bean.VoiceContent; +import com.enqualcomm.support.bean.voicePacket; +import com.enqualcomm.support.service.HeartRateManager; +import com.enqualcomm.support.utils.Connection; +import com.enqualcomm.support.utils.ICLogger; +import com.enqualcomm.support.utils.TemperatureUtil; +import com.enqualcomm.support.utils.TimeUtil; +import com.enqualcomm.support.utils.Util; + +import java.io.File; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; + +import static com.enqualcomm.support.Constants.ACTION_HEATR_RATE_START; +import static com.enqualcomm.support.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; + +public class protocol_beehome { + private static final String TAG = "ICSrv." + protocol_beehome.class.getSimpleName(); + + private static final String CMDHEADER = "IW"; + private static final String CMDEND = "#"; + private static final String CMDSPLIT = ","; + public static final String defaultServerIP = "en.beehome360.com"; + public static final int defaultServerPort = 5018; + + public enum CMD_TYPE { + /*终端发起*/ + AP00,//登录包 + BP00, + AP01,//混合定位 + BP01, + AP02,//多基站定位 + BP02, + AP92,//CDMA 混合定位 + BP92, + AP03,//心跳包 + BP03, + AP05,//语音查询接收 + BP05, + AP07,//语音上行 + BP07, + AP10,//报警与地址回复 + BP10, + AP49,//心率上传 + BP49, + APHT,//心率血压上传 + BPHT, + APTM,//基站校时及获取定位 + BPTM, + /* 服务器发起*/ + AP12, + BP12,//SOS 号码设置 + AP14, + BP14,//设置联系人白名单 + AP15, + BP15,//设置定位周期 + AP16, + BP16,//立即定位 + AP17, + BP17,//恢复出厂设置 + AP18, + BP18,//重启设备 + AP21, + BP21,//设置计步开关 + AP28, + BP28, //语音下行 + AP31, + BP31,//关机 + AP33, + BP33,//工作模式 + AP34, + BP34,//自定义工作模式 + AP40, + BP40,//下发文本 + AP68, + BP68,//绑定解绑 + APXL, + BPXL,//测量心率 + APXY, + BPXY,//测量血压 + APJZ, + BPJZ,//血压校准 + AP84, + BP84,//白名单开关 + AP85, + BP85,//设置闹钟 + AP86, + BP86,//绑定解绑 + AP88, + BP88,//查找手表 + AP89, + BP89,//心率血压阀值设置 + APTE, + BPTE,//体温间隔设置 + APTP, + BPTP,//体温上行 + APX1, + BPX1,//心率血压血氧修正 + APS4, + BPS4,//提醒设置(时间段) + APHP,//上报心率血压血氧 + BPHP, + UNKNOWN_CMD, + } + + private static HashMap cmdMap = null; + + static { + cmdMap = new HashMap(); + cmdMap.put(CMD_TYPE.AP00, "AP00"); + cmdMap.put(CMD_TYPE.BP00, "BP00"); + cmdMap.put(CMD_TYPE.AP01, "AP01"); + cmdMap.put(CMD_TYPE.BP01, "BP01"); + cmdMap.put(CMD_TYPE.AP02, "AP02"); + cmdMap.put(CMD_TYPE.BP02, "BP02"); + cmdMap.put(CMD_TYPE.AP92, "AP92"); + cmdMap.put(CMD_TYPE.BP92, "BP92"); + cmdMap.put(CMD_TYPE.AP03, "AP03"); + cmdMap.put(CMD_TYPE.BP03, "BP03"); + cmdMap.put(CMD_TYPE.AP05, "AP05"); + cmdMap.put(CMD_TYPE.BP05, "BP05"); + cmdMap.put(CMD_TYPE.AP07, "AP07"); + cmdMap.put(CMD_TYPE.BP07, "BP07"); + cmdMap.put(CMD_TYPE.AP10, "AP10"); + cmdMap.put(CMD_TYPE.BP10, "BP10"); + cmdMap.put(CMD_TYPE.AP49, "AP49"); + cmdMap.put(CMD_TYPE.BP49, "BP49"); + cmdMap.put(CMD_TYPE.APHT, "APHT"); + cmdMap.put(CMD_TYPE.BPHT, "BPHT"); + cmdMap.put(CMD_TYPE.APTM, "APTM"); + cmdMap.put(CMD_TYPE.BPTM, "BPTM"); + cmdMap.put(CMD_TYPE.AP12, "AP12"); + cmdMap.put(CMD_TYPE.BP12, "BP12"); + cmdMap.put(CMD_TYPE.AP14, "AP14"); + cmdMap.put(CMD_TYPE.BP14, "BP14"); + cmdMap.put(CMD_TYPE.AP15, "AP15"); + cmdMap.put(CMD_TYPE.BP15, "BP15"); + cmdMap.put(CMD_TYPE.AP16, "AP16"); + cmdMap.put(CMD_TYPE.BP16, "BP16"); + cmdMap.put(CMD_TYPE.AP17, "AP17"); + cmdMap.put(CMD_TYPE.BP17, "BP17"); + cmdMap.put(CMD_TYPE.AP18, "AP18"); + cmdMap.put(CMD_TYPE.BP18, "BP18"); + cmdMap.put(CMD_TYPE.AP21, "AP21"); + cmdMap.put(CMD_TYPE.BP21, "BP21"); + cmdMap.put(CMD_TYPE.AP28, "AP28"); + cmdMap.put(CMD_TYPE.BP28, "BP28"); + cmdMap.put(CMD_TYPE.AP31, "AP31"); + cmdMap.put(CMD_TYPE.BP31, "BP31"); + cmdMap.put(CMD_TYPE.AP33, "AP33"); + cmdMap.put(CMD_TYPE.BP33, "BP33"); + cmdMap.put(CMD_TYPE.AP34, "AP34"); + cmdMap.put(CMD_TYPE.BP34, "BP34"); + cmdMap.put(CMD_TYPE.AP40, "AP40"); + cmdMap.put(CMD_TYPE.BP40, "BP40"); + cmdMap.put(CMD_TYPE.AP68, "AP68"); + cmdMap.put(CMD_TYPE.BP68, "BP68"); + cmdMap.put(CMD_TYPE.APXL, "APXL"); + cmdMap.put(CMD_TYPE.BPXL, "BPXL"); + cmdMap.put(CMD_TYPE.APXY, "APXY"); + cmdMap.put(CMD_TYPE.BPXY, "BPXY"); + cmdMap.put(CMD_TYPE.APJZ, "APJZ"); + cmdMap.put(CMD_TYPE.BPJZ, "BPJZ"); + cmdMap.put(CMD_TYPE.AP84, "AP84"); + cmdMap.put(CMD_TYPE.BP84, "BP84"); + cmdMap.put(CMD_TYPE.AP85, "AP85"); + cmdMap.put(CMD_TYPE.BP85, "BP85"); + cmdMap.put(CMD_TYPE.AP86, "AP86"); + cmdMap.put(CMD_TYPE.BP86, "BP86"); + cmdMap.put(CMD_TYPE.AP88, "AP88"); + cmdMap.put(CMD_TYPE.BP88, "BP88"); + cmdMap.put(CMD_TYPE.AP89, "AP89"); + cmdMap.put(CMD_TYPE.BP89, "BP89"); + cmdMap.put(CMD_TYPE.APTE, "APTE"); + cmdMap.put(CMD_TYPE.BPTE, "BPTE"); + cmdMap.put(CMD_TYPE.APTP, "APTP"); + cmdMap.put(CMD_TYPE.BPTP, "BPTP"); + cmdMap.put(CMD_TYPE.APX1, "APX1"); + cmdMap.put(CMD_TYPE.BPX1, "BPX1"); + cmdMap.put(CMD_TYPE.APS4, "APS4"); + cmdMap.put(CMD_TYPE.BPS4, "BPS4"); + cmdMap.put(CMD_TYPE.APHP, "APHP"); + cmdMap.put(CMD_TYPE.BPHP, "BPHP"); + + } + + + private Connection mConnection = null; + private Runtime mRuntime = null; + + public protocol_beehome(Connection connect, Runtime runtime) { + 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); + } + + + /**/ + 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); + log("bytes.size " + bytes.length); +// cmdbuf.append(cmd_msgbuf); + cmdbuf.append(cmd_msgbuf); + log("cmdbuf.size " + cmdbuf.length() + " " + cmdbuf.toString()); + /* + 如果不是 #结尾,就认为 接收数据不全,置位。 + */ + if (cmdbuf.toString().endsWith(CMDEND)) { + iscmdComplete = true; + } + String[] cmdlist = cmd_msgbuf.split(CMDEND); + int listlen = cmdlist.length; + log("listlen " + listlen); + /* + 如果解析出来的cmdlist不是空,且数据不是完整cmd则保留 最后一条数据到last_inCompletecmd + */ + if (cmdlist.length > 0 && iscmdComplete == false) { + listlen -= 1; + last_inCompletecmd = cmdlist[listlen]; + log("cmd not complete , " + last_inCompletecmd); + } + for (int i = 0; i < listlen; i++) { + for (CMD_TYPE key : cmdMap.keySet()) { + if (cmdlist[i].startsWith(CMDHEADER + cmdMap.get(key))) { + log("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key) + " , " + cmdlist[i]); + if (key == CMD_TYPE.BP28) { + //如果是BP28则 后面的数据是音频,需要保留 + byte[] amrBuf; + int amrLen = getBP28Amrlen(cmdlist[i]); + if (bytes.length > amrLen) { + handleCmd(key, cmdlist[i], bytes); + } + } else { + handleCmd(key, cmdlist[i]); + } + } + } + } + + cmdbuf = new StringBuffer().append(last_inCompletecmd); + return ret; + } + + public int getBP28Amrlen(String cmd) { + + String Name; + String appendIndex; + int packetCount; + int currentId; + int packetLen; + + + String[] msg = cmd.split(CMDSPLIT); + if (msg.length >= 6) { + + 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(timezone); + + + ICLogger.i("===" + TimeUtil.getDefaultTimeZone()); + TimeUtil.setSysDateTime(runtime.getContextProxy().context, datetime, timezone); + ICLogger.i("===" + TimeUtil.getDefaultTimeZone()); + + } +// Set Datetime 20200505112734 +// Set TimeZone 8 + } catch (Exception e) { + ICLogger.e(e.getMessage(), e); + } + } 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("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:跌倒报警)) IC,即爱 + * 00为报警状态,00为无任何报警(01:SOS,02:低电,03:脱落报警,04:佩戴提醒,05:剪断报警,06:跌倒报警,07:心率异常, 08:心率过高, 09:心率过低,10收缩压过高,11收缩压过低,12舒张压过高,13舒张压过低) + * zh-cn:设备语言 + * 00:第一个0:是否需要回复地址信息,0:不回复,1回复. + * HOME|74-DE-2B-44-88-8C|97&HOME1|74-DE-2B-44-88-8C|97&HOME2|74-DE-2B-44-88-8C|97&HOME3|74-DE-2B-44-88-8C|97# + */ + 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) { + 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)); + try { + 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(cmdMap.get(CMD_TYPE.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(cmdMap.get(CMD_TYPE.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 (!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(cmdMap.get(CMD_TYPE.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(); + 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(cmdMap.get(CMD_TYPE.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 alarmlist = new ArrayList<>(); + if (datalist.length > 0) { + try { + for (int i = 0; i < datalist.length; i++) { + String[] cmdarglist = datalist[i].split(","); + + if (i == 0) { + if (cmdarglist.length == 9) { + imei = cmdarglist[1]; + cmdindex = cmdarglist[2]; + all_alarmswitch = Integer.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", "闹铃")); + + } else if (cmdarglist.length == 5) { + imei = cmdarglist[1]; + cmdindex = cmdarglist[2]; + all_alarmswitch = Integer.parseInt(cmdarglist[3]); + alarmcount = Integer.parseInt(cmdarglist[4]); + } else { + log("data len is too small!"); + } + } else { + if (cmdarglist.length == 4) { + 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", "闹铃")); + + } else { + log("data len is too small!"); + } + + } + }//循环获取alarm数据结束 + runtime.getDbHelper().saveAlarm(alarmlist); + + //do clean and set alarm things + } catch (Exception e) { + ICLogger.e(e.getMessage(), e); + } + } +//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(cmdMap.get(CMD_TYPE.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); +// CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod()); + //此处设置好配置后,会在LocationClient通过消息开始执行及时定位操作。 + } catch (Exception e) { + ICLogger.e(e.getMessage(), e); + } + } + + } + + + public static StringMessage AP34(String cmdindex, int workMode) { +//IWAP34,588854,1# +//080835:指令流水号 +//8:模式 + return genStringMessage(cmdMap.get(CMD_TYPE.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); + 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编码 + + + String[] cmdlist = cmd.split(","); + if (cmdlist.length == 4) { + String cmdindex = cmdlist[2]; + String txtmsg = cmdlist[3]; + + txtmsg = Util.UrlGB2312ToUTF8(txtmsg); + StringMessage msg = AP40(cmdindex, 1); + //设定当前工作模式及循环频率 + connection.send(msg); + ICLogger.i("received Txt Msg " + txtmsg); + runtime.getContextProxy().sendMsgBroadcast(txtmsg, 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(cmdMap.get(CMD_TYPE.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(cmdMap.get(CMD_TYPE.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) { + try { + String index = list[2]; + String time = list[3]; + connection.send(AP15(index)); + ICLogger.i("BP15 , 定位周期=" + time + "秒"); + + 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(cmdMap.get(CMD_TYPE.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(cmdMap.get(CMD_TYPE.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) { + + //设备响应: IWAP86, 080835# + //080835:指令流水号 + return genStringMessage(cmdMap.get(CMD_TYPE.AP68), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP68)) + .append(CMDSPLIT).append(index) + .append(CMDEND).toString()); + } + + public void handleBP68(String cmd, Connection connection, Runtime runtime) { + + //示例: + //IWBP68,353456789012345,080835,1# + //说明: + //IW:标识符 + //BP68 : 命令字符 + //353456789012345:IMEI号,设备唯一ID + //080835 :指令流水号 + //1 : 表示设备为激活状态(绑定成功) 0:表示设备为未激活状态(解绑成功) + + String[] list = cmd.split(CMDSPLIT); + + if (list.length == 4) { + String index = list[2]; + String type = list[3]; + connection.send(AP68(index)); + ICLogger.i("收到服务器消息:" + (type.equals("1") ? "绑定成功 " : "未激活或者解绑")); + + } else { + ICLogger.i("BP86 format error!"); + } + + } + + //17.设置心率/血压测量周期(下行协议号:BP86,响应:AP86) + public static StringMessage AP86(String index) { + + //设备响应: IWAP86, 080835# + //080835:指令流水号 + return genStringMessage(cmdMap.get(CMD_TYPE.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# + //说明: + //IW:标识符 + //BP86 : 命令字符 + //353456789012345:IMEI号,设备唯一ID + //080835 :指令流水号 + //1: 表示心率周期;2 :表示血压周期 + //720: 表示720分钟 + + String[] list = cmd.split(CMDSPLIT); + + if (list.length == 5) { + try { + String index = list[2]; + String type = list[3]; + String cycle = list[4]; + connection.send(AP86(index)); + ICLogger.i("收到服务器指令:设置" + (type.equals("1") ? "心率周期 " : "血压周期 ") + cycle + "分钟"); + + //发送重置PPGCycle的广播,会在CoreServer里面执行 + CoreService.getInstance().setHeartRateDetectAlarm(Integer.parseInt(cycle)); +// Intent intent = new Intent(); +// intent.putExtra("PPGTestCycle", Integer.parseInt(cycle)); +// runtime.getContextProxy().sendBrodcast(ACTION_HEATR_RATE_START, intent); + } catch (Exception e) { + ICLogger.e(e.getMessage(), e); + } + } else { + ICLogger.i("BP86 format error!"); + } + + } + + public static StringMessage AP88(String index) { + //设备响应: IWAP88, 080835# + //080835:指令流水号 + return genStringMessage(cmdMap.get(CMD_TYPE.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(cmdMap.get(CMD_TYPE.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(cmdMap.get(CMD_TYPE.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); + } +// double wrist_temp,body_temp; +// wrist_temp=TemperatureUtil.get_temp_value_adjusted(); +// body_temp=TemperatureUtil.getBodyTemp(wrist_temp,26.0f); +// String temperatureMsg=APTP(wrist_temp,body_temp); +// connection.send(genStringMessage("APTP",temperatureMsg)); +// ICLogger.i("发送体温测量值 "+temperatureMsg); + } else { + ICLogger.i("BP89 format error!"); + } + + } + + //体温上行(上行协议号:APTP,响应:BPTP) + public static StringMessage APTP(double wrist_temp, double body_temp) { + + //设备: 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$.2f", wrist_temp)) + .append(CMDSPLIT).append(String.format("%1$.2f", body_temp)) + .append(CMDSPLIT).append(0) + .append(CMDEND).toString()); + } + + public void handleBPTP() { + + ICLogger.d("BPTP 服务器收到体温数据!"); + + } + + + public static StringMessage APX1(String id) { + //设备响应: IWAPX1, 080835# + //080835:指令流水号 + return genStringMessage(cmdMap.get(CMD_TYPE.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); + + ICLogger.i("Handle BPX1 IMEI " + imei + ",index " + index + ", BPH " + strBPH + ", BPL " + strBPL + ", PPG " + strXL + ", Sp02 " + strSpO2); + } 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(cmdMap.get(CMD_TYPE.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 boolean handleCmd(CMD_TYPE type, String cmd) { + + //普通非二进制命令用此函数处理 + boolean ret = true; + ICLogger.i("handleCmd " + type.name() + " strLen=" + cmd.length()); + if (Config.LOG_TOFILE) ICLogger.logToFile("APILog", " recv " + cmd); + switch (type) { + case BP00: //登录包 + handleBP00(mRuntime, cmd); + ICLogger.i("服务器收到登录包AP00"); + mConnection.DeliverCMDMessageToSystem("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 BPTM: + //校时命令 + handleBPTM(cmd); + ICLogger.i("服务器收到校时命令APTM"); + mConnection.DeliverCMDMessageToSystem("APTM", cmd);//通知下面线程状态变化 + break; + case BP85://设置闹钟 + handleBP85(cmd, mConnection, mRuntime); + ICLogger.i("收到服务器设置闹钟命令BP85"); + mConnection.DeliverCMDMessageToSystem("AP85", cmd);//通知下面线程状态变化 + break; + case BP33: + //设置工作模式 + handleBP33(mConnection, mRuntime, cmd); + mConnection.DeliverCMDMessageToSystem("setWorkMod", cmd);//通知下面线程状态变化 + + break; + case BP34: + //设置工作模式 + handleBP34(mConnection, mRuntime, cmd); + mConnection.DeliverCMDMessageToSystem("setWorkMod", cmd);//通知下面线程状态变化 + break; + case BP16: + //立即定位指令(长链接有效) + handleBP16(mConnection, mRuntime, cmd); + mConnection.DeliverCMDMessageToSystem("StartLocate", cmd);//通知下面线程状态变化 + break; + +// case BP05: //L02服务器不适用 +// //查询服务器语音 返回信息 +// API.handleBP05(cmd); +// break; + + case BP12: + //收到设置SOS号码 + handleBP12(mConnection, cmd, mRuntime); + ICLogger.i("收到服务器设置SOS号码命令BP12"); + break; + case BP14: + //收到设置白名单号码 + handleBP14(mConnection, cmd, mRuntime); + ICLogger.i("收到服务器设置白名单号码命令BP14"); + break; + case BP15: + handleBP15(cmd, mConnection, mRuntime); + ICLogger.i("收到服务器设置定位命令BP15"); + break; + case BP17: + //收到恢复出厂设置 + handleBP17(mConnection, cmd); + ICLogger.i("收到服务器恢复出厂设置命令BP17"); + mConnection.DeliverCMDMessageToSystem("FactoryReset", cmd);//通知下面线程状态变化 + break; + + case BP18: + //收到重启 + handleBP18(mConnection, cmd); + ICLogger.i("收到服务器重启命令BP18"); + mConnection.DeliverCMDMessageToSystem("Reboot", cmd);//通知下面线程状态变化 + break; + + case BP31: + //收到关机 + handleBP31(mConnection, cmd); + ICLogger.i("收到服务器关机命令BP31"); + mConnection.DeliverCMDMessageToSystem("poweroff", cmd);//通知下面线程状态变化 + break; + case BP40: + //服务器推送文本 + handleBP40(mConnection, mRuntime, cmd); + ICLogger.i("收到服务器推送文本消息"); + mConnection.DeliverCMDMessageToSystem("showTxt", cmd);//通知下面线程状态变化 + break; + + case BPXL: + handleBPXL(cmd, mConnection); + ICLogger.i("收到服务器心率检测命令"); + 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 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; + } + + return ret; + + } + + + public boolean handleCmd(CMD_TYPE type, String cmd, byte[] bytes) { + + //只有需要传递二级制数据的才需要这个函数,目前只有BP28需要 + boolean ret = true; + ICLogger.i("handleCmd " + type.name() + " " + cmd + " bytelen=" + bytes.length); + if (Config.LOG_TOFILE) ICLogger.logToFile("APILog", " recv " + new String(bytes)); + switch (type) { + case BP28: + handleBP28(mConnection, cmd, mRuntime, bytes); + ICLogger.i("收到服务器语音BP28"); + mConnection.DeliverCMDMessageToSystem("BP28", "");//通知下面线程状态变化 + break; + } + return ret; + } +} diff --git a/app/src/main/java/com/ic/protocols/protocol_ic.java b/app/src/main/java/com/ic/protocols/protocol_ic.java index a8e89c94..03327f9f 100644 --- a/app/src/main/java/com/ic/protocols/protocol_ic.java +++ b/app/src/main/java/com/ic/protocols/protocol_ic.java @@ -1707,11 +1707,12 @@ public class protocol_ic { try { //发送重置PPGCycle的广播,会在CoreServer里面执行 - 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); + 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); } diff --git a/app/src/main/java/com/ic/protocols/protocol_jiai.java b/app/src/main/java/com/ic/protocols/protocol_jiai.java index ad82be43..0599eed4 100644 --- a/app/src/main/java/com/ic/protocols/protocol_jiai.java +++ b/app/src/main/java/com/ic/protocols/protocol_jiai.java @@ -1566,9 +1566,10 @@ public class protocol_jiai { ICLogger.i("收到服务器指令:设置" + (type.equals("1") ? "心率周期 " : "血压周期 ") + cycle + "分钟"); //发送重置PPGCycle的广播,会在CoreServer里面执行 - Intent intent = new Intent(); - intent.putExtra("PPGTestCycle", Integer.parseInt(cycle)); - runtime.getContextProxy().sendBrodcast(ACTION_HEATR_RATE_START, intent); + CoreService.getInstance().setHeartRateDetectAlarm(Integer.parseInt(cycle)); +// Intent intent = new Intent(); +// intent.putExtra("PPGTestCycle", Integer.parseInt(cycle)); +// runtime.getContextProxy().sendBrodcast(ACTION_HEATR_RATE_START, intent); } catch (Exception e) { ICLogger.e(e.getMessage(), e); } diff --git a/app/src/main/java/com/ic/protocols/protocol_mqtt.java b/app/src/main/java/com/ic/protocols/protocol_mqtt.java index 182c7d6e..105ce0ba 100644 --- a/app/src/main/java/com/ic/protocols/protocol_mqtt.java +++ b/app/src/main/java/com/ic/protocols/protocol_mqtt.java @@ -614,11 +614,11 @@ public class protocol_mqtt { try { int cycle_int = Integer.parseInt(cycle.trim()); ICLogger.i("收到服务器指令:设置心率血压周期 " + cycle + "秒" + cycle_int / 60 + "分钟"); - + CoreService.getInstance().setHeartRateDetectAlarm(cycle_int/60); //发送重置PPGCycle的广播,会在CoreServer里面执行 - Intent intent = new Intent(); - intent.putExtra("PPGTestCycle", cycle_int / 60); - runtime.getContextProxy().sendBrodcast(ACTION_HEATR_RATE_START, intent); +// Intent intent = new Intent(); +// intent.putExtra("PPGTestCycle", cycle_int / 60); +// runtime.getContextProxy().sendBrodcast(ACTION_HEATR_RATE_START, intent); } catch (Exception e) { ICLogger.e(e.getMessage(), e); }