1、温度检测 发送APTP格式修正。过滤不合理数据
authorsnickersun <scy@incartech.cn>
Sat, 28 Nov 2020 02:40:34 +0000 (10:40 +0800)
committersnickersun <scy@incartech.cn>
Sat, 28 Nov 2020 02:40:34 +0000 (10:40 +0800)
2、添加与上层应用通讯广播佩戴消息的机制,persist.sys.ic_antioff  com.ic.ACTION_ANTIOFF

app/src/main/java/com/enqualcomm/support/Constants.java
app/src/main/java/com/enqualcomm/support/service/AntiMonitorService.java
app/src/main/java/com/enqualcomm/support/service/SilentManager.java
app/src/main/java/com/enqualcomm/support/utils/TemperatureUtil.java
app/src/main/java/com/ic/protocols/protocol_ic.java

index a5343a1..e4bfc3b 100644 (file)
-package com.enqualcomm.support;\r
-\r
-import android.net.Uri;\r
-\r
-public interface Constants {\r
-\r
-  public static final String ACTION_LED = "com.enqualcomm.support.ACTION_LED";\r
-\r
-  public static final String ACTION_SHUTDOWN = "com.ic.action.shutdown";\r
-\r
-  public static final String ACTION_PLAYTIME = "com.ic.action.playtime";\r
-\r
-  public static final String ACTION_BROADCAST_PPG = "com.enqualcomm.support.ACTION_BROADCAST_PPG";\r
-  public static final String ACTION_ADDTEST_CONTACTS = "com.enqualcomm.imessage.ACTION_ADDTEST_CONTACTS";\r
-  \r
-  public static final String ACTION_ALARM_ADD_DATAPOINTS = "com.enqualcomm.support.ADD_DATAPOINTS";\r
-\r
-\r
-  public static final String ACTION_ALARM_BLE_SCAN = "com.ic.Action.ALarm.bleScan";\r
-  public static final String ACTION_ALARM_CHECK_ANTI = "com.ic.Action.ALarm.CheckAnti";\r
-\r
-  public static final String ACTION_ALARM_ALARM_CHANGE = "com.enqualcomm.support.ACTION_ALARM_ALARM_CHANGE";\r
-  \r
-  public static final String ACTION_ANTIOFF_ALARM_CHANGE = "com.enqualcomm.support.ACTION_ANTIOFF_ALARM_CHANGE";\r
-  \r
-  public static final String ACTION_AT_CALLBACK = "com.eqc.intent.action.callback.at";\r
-  \r
-  public static final String ACTION_BATTERY_LOW_MSG = "com.enqualcomm.support.lowbatteryMsg";\r
-  \r
-  public static final String ACTION_CALL_CMCM_SERVICE_INTERFACE = "com.cmcm.interface";\r
-  \r
-  public static final String ACTION_CALL_RING = "com.enqualcomm.support.phone.ring";\r
-  \r
-  public static final String ACTION_CARE_ALARM = "com.enqualcomm.support.ACTION_CARE_ALARM";\r
-  \r
-  public static final String ACTION_CLOSE_UNREAD_MSG = "com.enqualcomm.support.CloseUnreadMsg";\r
-  \r
-  public static final String ACTION_CM_POWERSAVE_MODE = "cmcm.call.eiot.into.powersave";\r
-  \r
-  public static final String ACTION_EQC_ALARM = "com.enqualcomm.support.ACTION_EQC_ALARM";\r
-\r
-  public static final String ACTION_LOCATION_ALARM = "com.enqualcomm.support.ACTION_LOCATION_ALARM";\r
-\r
-  public static final String ACTION_EXIT_MONITOR_MODE = "com.enqualcomm.support.MONITOR_EXIT";\r
-  \r
-  public static final String ACTION_HEART_RATE_RESULT = "com.eqc.heartrate.action.RESULT";\r
-\r
-  public static final String ACTION_HEATR_RATE_START = "com.eqc.heartrate.action.SILENT_START";\r
-  public static final String ACTION_CHECK_ANTIOFF_EVENT = "com.ic.action.CHECK_ANTIOFF_EVENT";\r
-\r
-  public static final String ACTION_IMESSAGE = "action.message";\r
-  \r
-  public static final String ACTION_ISCONNECTED = "com.ic.protocol.ACTION_IS_SERVER_CONNECTED";\r
-  \r
-  public static final String ACTION_ISSILENCE = "com.enqualcomm.icare.ACTION_ISSILENCE";\r
-  \r
-  public static final String ACTION_ISSILENCE2IMESSAGE = "com.enqualcomm.support.ACTION_ISSILENCE2IMESSAGE";\r
-  \r
-  public static final String ACTION_MISSED_CALL_GET = "com.enqualcomm.support.ACTION_MISSED_CALL_GET";\r
-  \r
-  public static final String ACTION_NOTICE_ALARM = "com.enqualcomm.support.ACTION_NOTICE_ALARM";\r
-  \r
-  public static final String ACTION_NOTICE_ALARM_CHANGE = "com.enqualcomm.support.ACTION_NOTICE_ALARM_CHANGE";\r
-  \r
-  public static final String ACTION_PASS_DATA_TO_CM_SERVICES = "com.enqualcomm.support.PASS_DATA";\r
-  \r
-  public static final String ACTION_REMOTE_CAMERA = "com.enqualcomm.support.ACTION_REMOTE_CAMERA";\r
-  \r
-  public static final String ACTION_REMOTE_CAMERA_OSS = "com.enqualcomm.support.ACTION_REMOTE_CAMERA_OSS";\r
-  \r
-  public static final String ACTION_RESTORE_SYSTEM = "android.intent.action.MASTER_CLEAR";\r
-  \r
-  public static final String ACTION_SCANPAIRMESSAGE = "com.enqualcomm.imessage.scanPairMessage";\r
-  \r
-  public static final String ACTION_SEDN_VIDOE_CALL_REQ = "com.enqualcomm.imessage.sendVideoCall";\r
-\r
-  public static final String ACTION_SEND_SOS_MSG = "com.enqualcomm.support.action_send_sos";\r
-\r
-  public static final String ACTION_SEND_EMEGENCY_LOCATION_START = "action.emegency.location.start";\r
-  public static final String ACTION_SEND_EMEGENCY_LOCATION_STOP = "action.emegency.location.stop";\r
-  public static final String ACTION_LOCAL_SOS_ACTION = "com.enqualcomm.support.local_sos";\r
-\r
-  public static final String ACTION_SEND_SOS_VIDEO_FILE = "com.enqualcomm.support.action_send_sos_video_file";\r
-  \r
-  public static final String ACTION_SEND_VIDEO_FILES = "com.enqualcomm.support.ACTION_SEND_VIDEO_FILES";\r
-  \r
-  public static final String ACTION_SHUTDOWN_MOREINFO = "android.intent.action.ACTION_SHUTDOWN_MOREINFO";\r
-  \r
-  public static final String ACTION_SOS_VIDEO_CHAT = "com.enqualcomm.imessage.ACTION_SOS_VIDEO_CHAT";\r
-  \r
-  public static final String ACTION_START_DOWNLOAD = "com.enqualcomm.imessage.START_DOWNLOAD_ACTION";\r
-  \r
-  public static final String ACTION_STHEART_RATE_ALARM_CHANGE = "com.enqualcomm.support.STHEART_RATE_ALARM_CHANGE";\r
-  \r
-  public static final String ACTION_SYNC = "SYNC";\r
-  \r
-  public static final String ACTION_UNBOUND_TERMINAL = "com.enqualcomm.support.ACTION_UNBOUND_TERMINAL";\r
-  \r
-  public static final String ACTION_UPDATE_ICON = "com.enqualcomm.support.ACTION_UPDATE_ICON";\r
-  \r
-  public static final String ACTION_UPDATE_SECRET_KEY = "com.enqualcomm.support.UPDATE_SECRET_KEY";\r
-  \r
-  public static final String ACTION_VIDEO_END_CALL = "com.enqualcomm.support.ACTION_VIDEO_END_CALL";\r
-  \r
-  public static final String ACTION_VIDEO_LOGIN = "com.enqualcomm.imessage.ACTION_VIDEO_LOGIN";\r
-  \r
-  public static final String ACTION_VIDEO_LOGOUT = "com.enqualcomm.imessage.ACTION_VIDEO_LOGOUT";\r
-  \r
-  public static final String ACTION_VIDEO_RECEIVE_LOGIN = "com.enqualcomm.imessage.ACTION_VIDEO_RECEIVE_LOGIN";\r
-  \r
-  public static final String ACTION_WAKEUP_ALARM = "com.eqc.deliverWakeupAlarm.action";\r
-  \r
-  public static final String ACTION_YUN_ALARM_CHANGE = "com.eqc.deskclock.YUN_ALARM_CHANGE";\r
-\r
-  public static final String ACTION_PRACTICE_REPORT_ALARM = "com.enqualcomm.support.PRACTICE_ALARM";\r
-\r
-  public final static String ACTION_START_PRACTISE = "com.ic.action_start_practice";\r
-  public final static String KeyPractice = "cmd";\r
-\r
-  public static final int ALARM_UPDATE_NOTICE = 206;\r
-  \r
-  public static final int CALL_RECORD_CHANGED = 103;\r
-  \r
-  public static final String CMD_ID_CM = "cmdId";\r
-\r
-  public static final Uri CONTACT_URI =  Uri.parse("content://com.enqualcomm.support/contact");\r
-\r
-  public static final Uri CM_SERVICE_SETTING = Uri.parse("content://com.cmcm.service/cmsetting");\r
-\r
-  public static final String DIALOG_ACTION = "com.enqualcomm.support.DIALOG";\r
-  \r
-  public static final int ENTER_SILENT_MODE = 212;\r
-  \r
-  public static final int EXIT_SILENT_MODE = 213;\r
-  \r
-  public static final String FLAG = "flag";\r
-\r
-  public static final String ANTI_ALARM = "com.enqualcomm.support.ANTI_ALARM";\r
-  public static final String TEMP_ALARM = "com.enqualcomm.support.TEMP_ALARM";\r
-  public static final String HEART_ALARM = "com.enqualcomm.support.HEART_ALARM";\r
-\r
-  public static final int IDLE_MODE_CHANGED = 102;\r
-  \r
-  public static final int INIT_SERVER_OK = 216;\r
-  \r
-  public static final int IN_SILENCE = 600;\r
-  \r
-  public static final boolean IS_OVERSEAS = false;\r
-  \r
-  public static final int JUFENG_SDK_INIT = 215;\r
-  \r
-  public static final String KEY_CATEGORY = "category";\r
-  \r
-  public static final String KEY_COMPANY = "KEY_COMPANY";\r
-  \r
-  public static final String KEY_CONTACT_ID = "contact_id";\r
-  \r
-  public static final String KEY_DELETE_FILE_TIME = "KEY_DELETE_FILE_TIME";\r
-  \r
-  public static final String KEY_DEVICE_ID = "key_device_id";\r
-  \r
-  public static final String KEY_DEVICE_KEY = "key_device_key";\r
-  \r
-  public static final String KEY_FILEPATH = "filepath";\r
-  \r
-  public static final String KEY_FILETYPE = "filetype";\r
-  \r
-  public static final String KEY_ID = "id";\r
-  \r
-  public static final String KEY_ISCONNECTED = "isConnected";\r
-  \r
-  public static final String KEY_ISSILENCE = "KEY_ISSILENCE";\r
-  \r
-  public static final String KEY_IS_RESUME = "key_is_resume";\r
-  \r
-  public static final String KEY_JUST_TALK = "KEY_JUST_TALK";\r
-  \r
-  public static final String KEY_NAME = "name";\r
-  \r
-  public static final String KEY_NET_WORK_TYPE = "NET_WORK_TYPE";\r
-  \r
-  public static final String KEY_NUMBER = "number";\r
-  \r
-  public static final String KEY_PAIR_CID = "PAIR_CID";\r
-  \r
-  public static final String KEY_REMOTE_NUMBER = "key_remote_number";\r
-  \r
-  public static final String KEY_SAVE_STEP_COUNT = "key_save_step_count";\r
-  \r
-  public static final String KEY_SOS_FILE_BODY = "key_sos_file_body";\r
-  \r
-  public static final String KEY_SOS_FILE_FILE_TYPE = "key_sos_file_file_type";\r
-  \r
-  public static final String KEY_STATUS = "key_status";\r
-  \r
-  public static final String KEY_STEP_COUNT = "KEY_STEP_COUNT";\r
-  \r
-  public static final String KEY_UNBOUND_FLAG = "KEY_UNBOUND_FLAG";\r
-  \r
-  public static final String KEY_VIDEO_PATH = "KEY_VIDEO_PATH";\r
-  \r
-  public static final int LOCATION_DATA = 217;\r
-  \r
-  public static final int MONITOR_GOIN = 202;\r
-  \r
-  public static final int MONITOR_GOOUT = 203;\r
-  \r
-  public static final int MSG_WHAT_RELOAD_VOICE = 1000;\r
-  \r
-  public static final int MSG_WHAT_SEND_OSSFILE = 1006;\r
-  \r
-  public static final int MSG_WHAT_SEND_PAIR = 1003;\r
-  \r
-  public static final int MSG_WHAT_SEND_PICTURE = 1002;\r
-  \r
-  public static final int MSG_WHAT_SEND_VOICE = 1001;\r
-  \r
-  public static final int MSG_WHAT_SILENCE_STATUS = 1005;\r
-  \r
-  public static final int MSG_WHAT_VIDEO_CHAT = 1004;\r
-\r
-  public static final int MSG_WHAT_PPG = 1007;\r
-  public static final String key_ppg="ppg";\r
-  public static final String key_bph="bph";\r
-  public static final String key_bpl="bpl";\r
-  public static final String key_spo2="sp02";\r
-\r
-\r
-  public static final int NEW_MEDIA_PUSH = 100;\r
-\r
-  public static final String ACTION_SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";\r
-  public static final String OTHER_ALARM_END = "com.enqualcomm.support.OTHER_ALARM_END";\r
-  \r
-  public static final String OTHER_ALARM_START = "com.enqualcomm.support.OTHER_ALARM_START";\r
-  \r
-  public static final String OTHER_HEARTRATE_ALARM_END = "com.enqualcomm.support.OTHER_HEARTRATE_ALARM_END";\r
-  \r
-  public static final String OTHER_HEARTRATE_ALARM_START = "com.enqualcomm.support.OTHER_HEARTRATE_ALARM_START";\r
-  \r
-  public static final int OUT_SILENCE = 700;\r
-  \r
-  public static final int PASS_DATA_DIRECTLY = 500;\r
-  \r
-  public static final int PLAY_RECORD_UPDATE = 207;\r
-  \r
-  public static final int REBOOT_SYSTEM = 208;\r
-  \r
-  public static final int RESET_SYSTEM = 210;\r
-  \r
-  public static final String RESTORE_EXTRA_WIPE_EXTERNAL_STORAGE = "android.intent.extra.WIPE_EXTERNAL_STORAGE";\r
-  \r
-  public static final String RESTORE_REASON = "android.intent.extra.REASON";\r
-\r
-\r
-  public static final  String ACTION_START_FOTA_UPDATE="com.ic.action.startfotaUpdate";\r
-  public static final String ACTION_SMSCMD="com.enqualcomm.support.SMSCMD";\r
-  public static final String ACTION_SMSCMD_Reply="com.ic.action.fotaUpdateReply";\r
-  public static final String KeyReplyData="reply";\r
-\r
-  public static final String ACTION_SMSCMD_TEST="com.ic.action.internaltest";\r
-\r
-  public static final int RESULT_ERROR = 500;\r
-  \r
-  public static final int RESULT_OK = 200;\r
-  \r
-  public static final String RESUME_ACTION = "com.enqualcomm.imessage.RESUME_ACTION";\r
-  \r
-  public static final String SERVICE_CLS_NAME = "com.enqualcomm.support.CoreService";\r
-  \r
-  public static final String SERVICE_PKG_NAME = "com.enqualcomm.support";\r
-  \r
-  public static final int SHUTDOWN_SYSTM = 209;\r
-  \r
-  public static final String SLEEP_ALARM = "com.enqualcomm.support.SLEEP_ALARM";\r
-  \r
-  public static final String SOS_ACTION = "com.enqualcomm.imessage.SOS_ACTION";\r
-  \r
-  public static final int SOS_GOIN = 204;\r
-  \r
-  public static final int SOS_GOOUT = 205;\r
-  \r
-  public static final String STEP_COUNT_ALARM_ACTION = "com.enqualcomm.support.ACTION_STEP_COUNT_ALARM";\r
-  \r
-  public static final String STRING_CMD_JSON_DATA = "cmdJsonData";\r
-  \r
-  public static final String STWORKMODE_ALARM = "com.enqualcomm.support.ACTION_STWORKMODE_ALARM";\r
-  \r
-  public static final String VALUE_SETTIING_VERSION = "value_setting_ver";\r
-  \r
-  public static final int VIDEO_MESSAGE = 300;\r
-  \r
-  public static final String WAKE_ALARM = "com.enqualcomm.support.WAKE_ALARM";\r
-  \r
-  public static final String WEATHER_ALARM = "com.ic.alarm.ACTION_WEATHER_ALARM";\r
-  public static final String WEATHER_ACTION = "com.ic.action.ACTION_GET_WEATHER";\r
-  public static final String ACTION_QUERY_WEATHER = "com.ic.action_query_weather";\r
-  public static final String ACTION_WEATHER_RECEIVED = "com.ic.action_weather_recveived";\r
-  public static final String KEY_Weather = "weather";\r
-\r
-\r
-  public static final int WIFI_SET_RESULT = 217;\r
-  \r
-  public static final int WORKMODE_CHANGED = 211;\r
-  \r
-  public static final String contact = "contact";\r
-  \r
-  public static final String wechat_contact = "content";\r
-\r
-\r
-  public static final String ACTION_CHECK_SERVER_RESPONSE = "com.enqualcomm.support.ACTION_CHECK_SERVER_RESPONSE";\r
-  public static final String ACTION_RETRY_SERVER_CONNECT = "com.enqualcomm.support.ACTION_RETRY_SERVER_CONNECT";\r
-  public static final String ACTION_CHECK_LOCATION_RESULT = "com.enqualcomm.support.ACTION_CHECK_LOCATION_RESULT";\r
-\r
-\r
-  public static final String ACTION_MESSAGE_SENT = "com.ic.action.message_sent";\r
-  public static final String ACTION_MESSAGE_RECEIVED = "com.ic.action.message_received";\r
-  public static final String KEY_MESSAGE_TYPE = "msgType";  //  分为 voice ,pic ,和 text\r
-  public static final String KEY_MESSAGE_URL = "msgUrl";  //  消息为 voice和 pic 此纪录为 路径, text消息则直接是消息内容。 utf-8 格式String\r
-  public static final String KEY_MESSAGE_FROM = "msgFrom"; // 消息来源(发送者名称),预留,暂时不用。\r
-\r
-\r
-\r
-  public static final String ACTION_TEMP_RESULT = "com.ic.action.temp_result";\r
-  public static final String KEY_TEMP_BODY = "body";  // double 体温\r
-  public static final String KEY_TEMP_WRIST= "wrist";  //  double 腕温\r
-  public static final String KEY_TEMP_OUT= "out";  //  double 腕温\r
-\r
-  public static String ACTION_ANTI_OFF = "com.ic.ACTION_STRIP";\r
-  public static String KEY_ANTI_EVENT="eventID"; //integer  eventID =1 脱落, eventID =0 佩戴\r
-  public static String KEY_ANTI_TXT="eventTxt"; //String AnitMessage\r
-\r
-  public static String ACTION_BATTERYLOW = "com.ic.ACTION_BATTERYLOW";\r
-  public static String KEY_BATTERY_EVENT="eventID"; //integer  eventID =1 battery low, eventID =0 解除\r
-\r
-  public static String PersistFotaServer2Url="persist.sys.ota.host2";\r
-\r
-  //把服务器下发的文本消息作为短信消息存储在短信数据库中,mms.apk会接收此消息并保存到数据库\r
-  //persist.sys.pushtxtAsSMS == false的时候mms.apk会忽略此消息,默认事true,所以要关闭要单独设置\r
-  public static String ActionReceivePushTxt="action.ic.PushTxtToSMSDB";\r
-  public static String ActionSrvPushTxt="action.ic.srvPushTxt";\r
-\r
-/**\r
- *   PreferenceManager.getDefaultSharedPreferences(context) , package name "com.enqualcomm.support"\r
- */\r
-\r
-  /***\r
-   * 心率血压血氧校准值\r
-   * String 变量,用 "," 分割的 4个数据 格式为【ppg_adj,bph_adj,bpl_adj,spo2_adj】\r
-   * 例如\r
-   * 心率偏差ppg_adj=2,\r
-   * 高压偏差bph_adj=-2,\r
-   * 低压偏差bpl_adj=-3,\r
-   * 血氧偏差spo2_adj=5\r
-   * 则赋值 2,-2,-3,5\r
-   */\r
-  public static String SHAREKEY_SETTING_PPG_ECG_ADJUST = "PpgEcgAdjust";\r
-  /**\r
-   * 睡眠分数 , int\r
-   */\r
-  public static String SHAREKEY_SETTING_SLEEP_SCORE = "SleepScore";\r
-  /**\r
-  *当前睡眠分数的日期  String yyMMddHHmm\r
-  *可能时昨天的,算完就是当天的\r
-   * */\r
-  public static String SHAREKEY_SETTING_SLEEP_SCORE_DATE = "SleepScoreDate";\r
-\r
-  /**\r
-   * 久坐检测时长,int 分钟为单位,此处为读取方法,可在显示前读取当前设置。\r
-   * 设置请采用broadcast方式发给协议层存储\r
-   */\r
-  public static String SHAREKEY_SETTING_SIT_ALARM_RANGE_IN_MINUTES = "SIT_RANGE";\r
-\r
-/***\r
- *  ACTion 用于 设置久坐时长分钟为单位\r
- */\r
-\r
-  public static String ACTION_SET_SIT_RANGE = "com.ic.action.set_sit_range";\r
-  /**\r
-   * ACTION_SET_SIT_RANGE 参数 int,分钟数。\r
-   */\r
-  public static String KEY_SIT_RANGE = "sit_range";\r
-\r
-\r
-  /***\r
-   * 内部定时器用action alarm\r
-   */\r
-  public static String ACTION_SIT_ALARM = "com.ic.action.sit_alarm_local";\r
-\r
-  /**\r
-   * 发送给app做显示用\r
-   */\r
-  public static String ACTION_KEEPSIT_ALARM = "com.ic.action.keep_sit_alarm";\r
-\r
-\r
-}\r
-\r
+package com.enqualcomm.support;
+
+import android.net.Uri;
+
+public interface Constants {
+
+  public static final String ACTION_LED = "com.enqualcomm.support.ACTION_LED";
+
+  public static final String ACTION_SHUTDOWN = "com.ic.action.shutdown";
+
+  public static final String ACTION_PLAYTIME = "com.ic.action.playtime";
+
+  public static final String ACTION_BROADCAST_PPG = "com.enqualcomm.support.ACTION_BROADCAST_PPG";
+  public static final String ACTION_ADDTEST_CONTACTS = "com.enqualcomm.imessage.ACTION_ADDTEST_CONTACTS";
+  
+  public static final String ACTION_ALARM_ADD_DATAPOINTS = "com.enqualcomm.support.ADD_DATAPOINTS";
+
+
+  public static final String ACTION_ALARM_BLE_SCAN = "com.ic.Action.ALarm.bleScan";
+  public static final String ACTION_ALARM_CHECK_ANTI = "com.ic.Action.ALarm.CheckAnti";
+
+  public static final String ACTION_ALARM_ALARM_CHANGE = "com.enqualcomm.support.ACTION_ALARM_ALARM_CHANGE";
+  
+  public static final String ACTION_ANTIOFF_ALARM_CHANGE = "com.enqualcomm.support.ACTION_ANTIOFF_ALARM_CHANGE";
+  
+  public static final String ACTION_AT_CALLBACK = "com.eqc.intent.action.callback.at";
+  
+  public static final String ACTION_BATTERY_LOW_MSG = "com.enqualcomm.support.lowbatteryMsg";
+  
+  public static final String ACTION_CALL_CMCM_SERVICE_INTERFACE = "com.cmcm.interface";
+  
+  public static final String ACTION_CALL_RING = "com.enqualcomm.support.phone.ring";
+  
+  public static final String ACTION_CARE_ALARM = "com.enqualcomm.support.ACTION_CARE_ALARM";
+  
+  public static final String ACTION_CLOSE_UNREAD_MSG = "com.enqualcomm.support.CloseUnreadMsg";
+  
+  public static final String ACTION_CM_POWERSAVE_MODE = "cmcm.call.eiot.into.powersave";
+  
+  public static final String ACTION_EQC_ALARM = "com.enqualcomm.support.ACTION_EQC_ALARM";
+
+  public static final String ACTION_LOCATION_ALARM = "com.enqualcomm.support.ACTION_LOCATION_ALARM";
+
+  public static final String ACTION_EXIT_MONITOR_MODE = "com.enqualcomm.support.MONITOR_EXIT";
+  
+  public static final String ACTION_HEART_RATE_RESULT = "com.eqc.heartrate.action.RESULT";
+
+  public static final String ACTION_HEATR_RATE_START = "com.eqc.heartrate.action.SILENT_START";
+  public static final String ACTION_CHECK_ANTIOFF_EVENT = "com.ic.action.CHECK_ANTIOFF_EVENT";
+
+  public static final String ACTION_IMESSAGE = "action.message";
+  
+  public static final String ACTION_ISCONNECTED = "com.ic.protocol.ACTION_IS_SERVER_CONNECTED";
+  
+  public static final String ACTION_ISSILENCE = "com.enqualcomm.icare.ACTION_ISSILENCE";
+  
+  public static final String ACTION_ISSILENCE2IMESSAGE = "com.enqualcomm.support.ACTION_ISSILENCE2IMESSAGE";
+  
+  public static final String ACTION_MISSED_CALL_GET = "com.enqualcomm.support.ACTION_MISSED_CALL_GET";
+  
+  public static final String ACTION_NOTICE_ALARM = "com.enqualcomm.support.ACTION_NOTICE_ALARM";
+  
+  public static final String ACTION_NOTICE_ALARM_CHANGE = "com.enqualcomm.support.ACTION_NOTICE_ALARM_CHANGE";
+  
+  public static final String ACTION_PASS_DATA_TO_CM_SERVICES = "com.enqualcomm.support.PASS_DATA";
+  
+  public static final String ACTION_REMOTE_CAMERA = "com.enqualcomm.support.ACTION_REMOTE_CAMERA";
+  
+  public static final String ACTION_REMOTE_CAMERA_OSS = "com.enqualcomm.support.ACTION_REMOTE_CAMERA_OSS";
+  
+  public static final String ACTION_RESTORE_SYSTEM = "android.intent.action.MASTER_CLEAR";
+  
+  public static final String ACTION_SCANPAIRMESSAGE = "com.enqualcomm.imessage.scanPairMessage";
+  
+  public static final String ACTION_SEDN_VIDOE_CALL_REQ = "com.enqualcomm.imessage.sendVideoCall";
+
+  public static final String ACTION_SEND_SOS_MSG = "com.enqualcomm.support.action_send_sos";
+
+  public static final String ACTION_SEND_EMEGENCY_LOCATION_START = "action.emegency.location.start";
+  public static final String ACTION_SEND_EMEGENCY_LOCATION_STOP = "action.emegency.location.stop";
+  public static final String ACTION_LOCAL_SOS_ACTION = "com.enqualcomm.support.local_sos";
+
+  public static final String ACTION_SEND_SOS_VIDEO_FILE = "com.enqualcomm.support.action_send_sos_video_file";
+  
+  public static final String ACTION_SEND_VIDEO_FILES = "com.enqualcomm.support.ACTION_SEND_VIDEO_FILES";
+  
+  public static final String ACTION_SHUTDOWN_MOREINFO = "android.intent.action.ACTION_SHUTDOWN_MOREINFO";
+  
+  public static final String ACTION_SOS_VIDEO_CHAT = "com.enqualcomm.imessage.ACTION_SOS_VIDEO_CHAT";
+  
+  public static final String ACTION_START_DOWNLOAD = "com.enqualcomm.imessage.START_DOWNLOAD_ACTION";
+  
+  public static final String ACTION_STHEART_RATE_ALARM_CHANGE = "com.enqualcomm.support.STHEART_RATE_ALARM_CHANGE";
+  
+  public static final String ACTION_SYNC = "SYNC";
+  
+  public static final String ACTION_UNBOUND_TERMINAL = "com.enqualcomm.support.ACTION_UNBOUND_TERMINAL";
+  
+  public static final String ACTION_UPDATE_ICON = "com.enqualcomm.support.ACTION_UPDATE_ICON";
+  
+  public static final String ACTION_UPDATE_SECRET_KEY = "com.enqualcomm.support.UPDATE_SECRET_KEY";
+  
+  public static final String ACTION_VIDEO_END_CALL = "com.enqualcomm.support.ACTION_VIDEO_END_CALL";
+  
+  public static final String ACTION_VIDEO_LOGIN = "com.enqualcomm.imessage.ACTION_VIDEO_LOGIN";
+  
+  public static final String ACTION_VIDEO_LOGOUT = "com.enqualcomm.imessage.ACTION_VIDEO_LOGOUT";
+  
+  public static final String ACTION_VIDEO_RECEIVE_LOGIN = "com.enqualcomm.imessage.ACTION_VIDEO_RECEIVE_LOGIN";
+  
+  public static final String ACTION_WAKEUP_ALARM = "com.eqc.deliverWakeupAlarm.action";
+  
+  public static final String ACTION_YUN_ALARM_CHANGE = "com.eqc.deskclock.YUN_ALARM_CHANGE";
+
+  public static final String ACTION_PRACTICE_REPORT_ALARM = "com.enqualcomm.support.PRACTICE_ALARM";
+
+  public final static String ACTION_START_PRACTISE = "com.ic.action_start_practice";
+  public final static String KeyPractice = "cmd";
+
+  public static final int ALARM_UPDATE_NOTICE = 206;
+  
+  public static final int CALL_RECORD_CHANGED = 103;
+  
+  public static final String CMD_ID_CM = "cmdId";
+
+  public static final Uri CONTACT_URI =  Uri.parse("content://com.enqualcomm.support/contact");
+
+  public static final Uri CM_SERVICE_SETTING = Uri.parse("content://com.cmcm.service/cmsetting");
+
+  public static final String DIALOG_ACTION = "com.enqualcomm.support.DIALOG";
+  
+  public static final int ENTER_SILENT_MODE = 212;
+  
+  public static final int EXIT_SILENT_MODE = 213;
+  
+  public static final String FLAG = "flag";
+
+  public static final String ANTI_ALARM = "com.enqualcomm.support.ANTI_ALARM";
+  public static final String TEMP_ALARM = "com.enqualcomm.support.TEMP_ALARM";
+  public static final String HEART_ALARM = "com.enqualcomm.support.HEART_ALARM";
+
+  public static final int IDLE_MODE_CHANGED = 102;
+  
+  public static final int INIT_SERVER_OK = 216;
+  
+  public static final int IN_SILENCE = 600;
+  
+  public static final boolean IS_OVERSEAS = false;
+  
+  public static final int JUFENG_SDK_INIT = 215;
+  
+  public static final String KEY_CATEGORY = "category";
+  
+  public static final String KEY_COMPANY = "KEY_COMPANY";
+  
+  public static final String KEY_CONTACT_ID = "contact_id";
+  
+  public static final String KEY_DELETE_FILE_TIME = "KEY_DELETE_FILE_TIME";
+  
+  public static final String KEY_DEVICE_ID = "key_device_id";
+  
+  public static final String KEY_DEVICE_KEY = "key_device_key";
+  
+  public static final String KEY_FILEPATH = "filepath";
+  
+  public static final String KEY_FILETYPE = "filetype";
+  
+  public static final String KEY_ID = "id";
+  
+  public static final String KEY_ISCONNECTED = "isConnected";
+  
+  public static final String KEY_ISSILENCE = "KEY_ISSILENCE";
+  
+  public static final String KEY_IS_RESUME = "key_is_resume";
+  
+  public static final String KEY_JUST_TALK = "KEY_JUST_TALK";
+  
+  public static final String KEY_NAME = "name";
+  
+  public static final String KEY_NET_WORK_TYPE = "NET_WORK_TYPE";
+  
+  public static final String KEY_NUMBER = "number";
+  
+  public static final String KEY_PAIR_CID = "PAIR_CID";
+  
+  public static final String KEY_REMOTE_NUMBER = "key_remote_number";
+  
+  public static final String KEY_SAVE_STEP_COUNT = "key_save_step_count";
+  
+  public static final String KEY_SOS_FILE_BODY = "key_sos_file_body";
+  
+  public static final String KEY_SOS_FILE_FILE_TYPE = "key_sos_file_file_type";
+  
+  public static final String KEY_STATUS = "key_status";
+  
+  public static final String KEY_STEP_COUNT = "KEY_STEP_COUNT";
+  
+  public static final String KEY_UNBOUND_FLAG = "KEY_UNBOUND_FLAG";
+  
+  public static final String KEY_VIDEO_PATH = "KEY_VIDEO_PATH";
+  
+  public static final int LOCATION_DATA = 217;
+  
+  public static final int MONITOR_GOIN = 202;
+  
+  public static final int MONITOR_GOOUT = 203;
+  
+  public static final int MSG_WHAT_RELOAD_VOICE = 1000;
+  
+  public static final int MSG_WHAT_SEND_OSSFILE = 1006;
+  
+  public static final int MSG_WHAT_SEND_PAIR = 1003;
+  
+  public static final int MSG_WHAT_SEND_PICTURE = 1002;
+  
+  public static final int MSG_WHAT_SEND_VOICE = 1001;
+  
+  public static final int MSG_WHAT_SILENCE_STATUS = 1005;
+  
+  public static final int MSG_WHAT_VIDEO_CHAT = 1004;
+
+  public static final int MSG_WHAT_PPG = 1007;
+  public static final String key_ppg="ppg";
+  public static final String key_bph="bph";
+  public static final String key_bpl="bpl";
+  public static final String key_spo2="sp02";
+
+
+  public static final int NEW_MEDIA_PUSH = 100;
+
+  public static final String ACTION_SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
+  public static final String OTHER_ALARM_END = "com.enqualcomm.support.OTHER_ALARM_END";
+  
+  public static final String OTHER_ALARM_START = "com.enqualcomm.support.OTHER_ALARM_START";
+  
+  public static final String OTHER_HEARTRATE_ALARM_END = "com.enqualcomm.support.OTHER_HEARTRATE_ALARM_END";
+  
+  public static final String OTHER_HEARTRATE_ALARM_START = "com.enqualcomm.support.OTHER_HEARTRATE_ALARM_START";
+  
+  public static final int OUT_SILENCE = 700;
+  
+  public static final int PASS_DATA_DIRECTLY = 500;
+  
+  public static final int PLAY_RECORD_UPDATE = 207;
+  
+  public static final int REBOOT_SYSTEM = 208;
+  
+  public static final int RESET_SYSTEM = 210;
+  
+  public static final String RESTORE_EXTRA_WIPE_EXTERNAL_STORAGE = "android.intent.extra.WIPE_EXTERNAL_STORAGE";
+  
+  public static final String RESTORE_REASON = "android.intent.extra.REASON";
+
+
+  public static final  String ACTION_START_FOTA_UPDATE="com.ic.action.startfotaUpdate";
+  public static final String ACTION_SMSCMD="com.enqualcomm.support.SMSCMD";
+  public static final String ACTION_SMSCMD_Reply="com.ic.action.fotaUpdateReply";
+  public static final String KeyReplyData="reply";
+
+  public static final String ACTION_SMSCMD_TEST="com.ic.action.internaltest";
+
+  public static final int RESULT_ERROR = 500;
+  
+  public static final int RESULT_OK = 200;
+  
+  public static final String RESUME_ACTION = "com.enqualcomm.imessage.RESUME_ACTION";
+  
+  public static final String SERVICE_CLS_NAME = "com.enqualcomm.support.CoreService";
+  
+  public static final String SERVICE_PKG_NAME = "com.enqualcomm.support";
+  
+  public static final int SHUTDOWN_SYSTM = 209;
+  
+  public static final String SLEEP_ALARM = "com.enqualcomm.support.SLEEP_ALARM";
+  
+  public static final String SOS_ACTION = "com.enqualcomm.imessage.SOS_ACTION";
+  
+  public static final int SOS_GOIN = 204;
+  
+  public static final int SOS_GOOUT = 205;
+  
+  public static final String STEP_COUNT_ALARM_ACTION = "com.enqualcomm.support.ACTION_STEP_COUNT_ALARM";
+  
+  public static final String STRING_CMD_JSON_DATA = "cmdJsonData";
+  
+  public static final String STWORKMODE_ALARM = "com.enqualcomm.support.ACTION_STWORKMODE_ALARM";
+  
+  public static final String VALUE_SETTIING_VERSION = "value_setting_ver";
+  
+  public static final int VIDEO_MESSAGE = 300;
+  
+  public static final String WAKE_ALARM = "com.enqualcomm.support.WAKE_ALARM";
+  
+  public static final String WEATHER_ALARM = "com.ic.alarm.ACTION_WEATHER_ALARM";
+  public static final String WEATHER_ACTION = "com.ic.action.ACTION_GET_WEATHER";
+  public static final String ACTION_QUERY_WEATHER = "com.ic.action_query_weather";
+  public static final String ACTION_WEATHER_RECEIVED = "com.ic.action_weather_recveived";
+  public static final String KEY_Weather = "weather";
+
+
+  public static final int WIFI_SET_RESULT = 217;
+  
+  public static final int WORKMODE_CHANGED = 211;
+  
+  public static final String contact = "contact";
+  
+  public static final String wechat_contact = "content";
+
+
+  public static final String ACTION_CHECK_SERVER_RESPONSE = "com.enqualcomm.support.ACTION_CHECK_SERVER_RESPONSE";
+  public static final String ACTION_RETRY_SERVER_CONNECT = "com.enqualcomm.support.ACTION_RETRY_SERVER_CONNECT";
+  public static final String ACTION_CHECK_LOCATION_RESULT = "com.enqualcomm.support.ACTION_CHECK_LOCATION_RESULT";
+
+
+  public static final String ACTION_MESSAGE_SENT = "com.ic.action.message_sent";
+  public static final String ACTION_MESSAGE_RECEIVED = "com.ic.action.message_received";
+  public static final String KEY_MESSAGE_TYPE = "msgType";  //  分为 voice ,pic ,和 text
+  public static final String KEY_MESSAGE_URL = "msgUrl";  //  消息为 voice和 pic 此纪录为 路径, text消息则直接是消息内容。 utf-8 格式String
+  public static final String KEY_MESSAGE_FROM = "msgFrom"; // 消息来源(发送者名称),预留,暂时不用。
+
+
+
+  public static final String ACTION_TEMP_RESULT = "com.ic.action.temp_result";
+  public static final String KEY_TEMP_BODY = "body";  // double 体温
+  public static final String KEY_TEMP_WRIST= "wrist";  //  double 腕温
+  public static final String KEY_TEMP_OUT= "out";  //  double 腕温
+
+  public static String ACTION_ANTI_OFF0 = "com.ic.ACTION_ANTIOFF";
+  public static String ACTION_ANTI_OFF = "com.ic.ACTION_STRIP";
+  public static String KEY_ANTI_EVENT="eventID"; //integer  eventID =1 脱落, eventID =0 佩戴
+  public static String KEY_ANTI_TXT="eventTxt"; //String AnitMessage
+
+
+
+  public static String ACTION_BATTERYLOW = "com.ic.ACTION_BATTERYLOW";
+  public static String KEY_BATTERY_EVENT="eventID"; //integer  eventID =1 battery low, eventID =0 解除
+
+  public static String PersistFotaServer2Url="persist.sys.ota.host2";
+
+  //把服务器下发的文本消息作为短信消息存储在短信数据库中,mms.apk会接收此消息并保存到数据库
+  //persist.sys.pushtxtAsSMS == false的时候mms.apk会忽略此消息,默认事true,所以要关闭要单独设置
+  public static String ActionReceivePushTxt="action.ic.PushTxtToSMSDB";
+  public static String ActionSrvPushTxt="action.ic.srvPushTxt";
+
+/**
+ *   PreferenceManager.getDefaultSharedPreferences(context) , package name "com.enqualcomm.support"
+ */
+
+  /***
+   * 心率血压血氧校准值
+   * String 变量,用 "," 分割的 4个数据 格式为【ppg_adj,bph_adj,bpl_adj,spo2_adj】
+   * 例如
+   * 心率偏差ppg_adj=2,
+   * 高压偏差bph_adj=-2,
+   * 低压偏差bpl_adj=-3,
+   * 血氧偏差spo2_adj=5
+   * 则赋值 2,-2,-3,5
+   */
+  public static String SHAREKEY_SETTING_PPG_ECG_ADJUST = "PpgEcgAdjust";
+  /**
+   * 睡眠分数 , int
+   */
+  public static String SHAREKEY_SETTING_SLEEP_SCORE = "SleepScore";
+  /**
+  *当前睡眠分数的日期  String yyMMddHHmm
+  *可能时昨天的,算完就是当天的
+   * */
+  public static String SHAREKEY_SETTING_SLEEP_SCORE_DATE = "SleepScoreDate";
+
+  /**
+   * 久坐检测时长,int 分钟为单位,此处为读取方法,可在显示前读取当前设置。
+   * 设置请采用broadcast方式发给协议层存储
+   */
+  public static String SHAREKEY_SETTING_SIT_ALARM_RANGE_IN_MINUTES = "SIT_RANGE";
+
+/***
+ *  ACTion 用于 设置久坐时长分钟为单位
+ */
+
+  public static String ACTION_SET_SIT_RANGE = "com.ic.action.set_sit_range";
+  /**
+   * ACTION_SET_SIT_RANGE 参数 int,分钟数。
+   */
+  public static String KEY_SIT_RANGE = "sit_range";
+
+
+  /***
+   * 内部定时器用action alarm
+   */
+  public static String ACTION_SIT_ALARM = "com.ic.action.sit_alarm_local";
+
+  /**
+   * 发送给app做显示用
+   */
+  public static String ACTION_KEEPSIT_ALARM = "com.ic.action.keep_sit_alarm";
+
+
+}
+
index 5790ec6..1324a1b 100644 (file)
-package com.enqualcomm.support.service;\r
-\r
-import android.content.Context;\r
-import android.content.Intent;\r
-import android.hardware.Sensor;\r
-import android.hardware.SensorEvent;\r
-import android.hardware.SensorEventListener;\r
-import android.hardware.SensorManager;\r
-\r
-import android.os.Handler;\r
-import android.os.Message;\r
-import android.os.PowerManager;\r
-\r
-import com.enqualcomm.support.Config;\r
-import com.enqualcomm.support.CoreService;\r
-import com.enqualcomm.support.LocationClient;\r
-import com.enqualcomm.support.R;\r
-import com.enqualcomm.support.bean.Runtime;\r
-import com.enqualcomm.support.bean.StringMessage;\r
-import com.enqualcomm.support.service.base.AbstractInvokeHandlerService;\r
-import com.enqualcomm.support.utils.AlarmHelper;\r
-import com.enqualcomm.support.utils.Connection;\r
-import com.enqualcomm.support.utils.ICLogger;\r
-\r
-import com.enqualcomm.support.utils.Util;\r
-import com.enqualcomm.support.utils.VibrateUtil;\r
-import com.ic.protocols.protocolAPIHelper;\r
-\r
-import static com.enqualcomm.support.Constants.ACTION_ANTI_OFF;\r
-import static com.enqualcomm.support.Constants.ACTION_CHECK_ANTIOFF_EVENT;\r
-import static com.enqualcomm.support.Constants.KEY_ANTI_EVENT;\r
-import static com.enqualcomm.support.Constants.KEY_ANTI_TXT;\r
-import static java.lang.Thread.interrupted;\r
-import static java.lang.Thread.sleep;\r
-\r
-\r
-public class AntiMonitorService extends AbstractInvokeHandlerService {\r
-\r
-\r
-    Context mContext;\r
-\r
-    Runtime mRuntime;\r
-\r
-    Connection mConnection;\r
-\r
-    private SensorManager mSensorManager;\r
-\r
-    private static int current_anti_status=10; //0 佩戴, 大于0 表示脱腕\r
-    private static int ant_status_event_reported=0; // 0 表示无消息, 1表示有消息需要发送, 大于1表示timeout时间内又有新消息,可以忽略不计\r
-    private static long anti_event_receivedTime=0;\r
-    private static int last_send_antoff_event=-1;\r
-    private Handler  mHandler=null;\r
-     PowerManager.WakeLock mWakeLock = null;\r
-    public AntiMonitorService(){\r
-        if (mHandler==null) {\r
-            mHandler = new Handler() {\r
-                public void handleMessage(Message msg) {\r
-                    super.handleMessage(msg);\r
-                    if (msg.what == 100) {\r
-\r
-                        ICLogger.i("release WakeLock!");\r
-                        if (mWakeLock != null && mWakeLock.isHeld()) {\r
-                            mWakeLock.release();\r
-                            ICLogger.i("release WakeLock!");\r
-                        }\r
-\r
-                    }else if (msg.what == 200){\r
-                        AudioService.getInstance().stop();\r
-                    }\r
-                }\r
-            };\r
-        }\r
-        if (mWakeLock==null) {\r
-            PowerManager mPowerManager = (PowerManager) CoreService.getInstance().getSystemService(Context.POWER_SERVICE);\r
-//            mWakeLock = mPowerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, AntiMonitorService.class.getSimpleName());\r
-            mWakeLock = mPowerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, AntiMonitorService.class.getSimpleName());\r
-        }\r
-    }\r
-    private void play_notify(){\r
-\r
-        AudioService.getInstance().play(mContext.getAssets(), "antioff.mp3");\r
-        if(mHandler!=null)\r
-            mHandler.sendEmptyMessageDelayed(200,5000);\r
-\r
-    }\r
-    private void send_antiof_event(){\r
-\r
-        if (last_send_antoff_event==current_anti_status){\r
-                ICLogger.i("佩戴状态未变,skip!");\r
-                return;\r
-        }\r
-\r
-        //current_anti_status == 2 表示表带 锁定 , ==12 表示表带非法解锁\r
-        //current_anti_status == 0 表示佩戴       ==10 表示脱腕\r
-\r
-        switch(current_anti_status){\r
-            case 2:\r
-                //锁定\r
-            {\r
-                if (Config.needBroadcastCutoffAlarm) {\r
-                    //  play_notify();\r
-                    send_cutoff_event_broadcast(0);\r
-                }\r
-                mRuntime.Cut_off_flag = 0;\r
-                if(mRuntime.setAlarmType(Runtime.AlarmType.ALARM_LOCK_WATCH)) {\r
-                    //发送消息定位报警消息\r
-                    ICLogger.i("triggerSOSLocationProcess ");\r
-                    LocationClient.getInstance().triggerSOSLocationProcess();\r
-                }\r
-\r
-\r
-            }\r
-                break;\r
-            case 12:\r
-            {\r
-                //非法解锁\r
-                if(Config.needBroadcastCutoffAlarm) {\r
-\r
-                    send_cutoff_event_broadcast(1);\r
-                }\r
-                mRuntime.Cut_off_flag=1;\r
-                if(mRuntime.setAlarmType(Runtime.AlarmType.ALARM_CUTOFF)) {\r
-                    ICLogger.i("triggerSOSLocationProcess ");\r
-                    LocationClient.getInstance().triggerSOSLocationProcess();\r
-//                    StringMessage msg = protocolAPIHelper.getWarningMSG(mRuntime);\r
-//                    Deliver.sendLocationMSG(msg); //消息很重要,所以利用带buffer的对列来发送!\r
-                }\r
-//            try {\r
-//                sleep(1000);\r
-//            } catch (InterruptedException e) {\r
-//                e.printStackTrace();\r
-//            }\r
-            }\r
-                break;\r
-            case 0:\r
-                //佩戴\r
-            {\r
-                if (Config.needBroadcastAntiAlarm) {\r
-                    //  play_notify();\r
-                    send_anti_event_broadcast(0);\r
-                }\r
-                mRuntime.Anti_off_flag = 0;\r
-                if(mRuntime.setAlarmType(Runtime.AlarmType.ALARM_WEARED)) {\r
-                    ICLogger.i("triggerSOSLocationProcess ");\r
-                    LocationClient.getInstance().triggerSOSLocationProcess();\r
-//                    StringMessage msg = protocolAPIHelper.getWarningMSG(mRuntime);\r
-//                    Deliver.sendLocationMSG(msg); //消息很重要,所以利用带buffer的对列来发送!\r
-                }\r
-//            try {\r
-//                sleep(1000);\r
-//            } catch (InterruptedException e) {\r
-//                e.printStackTrace();\r
-//            }\r
-            }\r
-                break;\r
-            case 10:\r
-            {\r
-                //脱腕\r
-                if(Config.needBroadcastAntiAlarm) {\r
-\r
-                    send_anti_event_broadcast(1);\r
-                }\r
-                mRuntime.Anti_off_flag=1;\r
-                if(mRuntime.setAlarmType(Runtime.AlarmType.ALARM_ANTIOFF)) {\r
-                    ICLogger.i("triggerSOSLocationProcess ");\r
-                    LocationClient.getInstance().triggerSOSLocationProcess();\r
-//                    StringMessage msg = protocolAPIHelper.getWarningMSG(mRuntime);\r
-//                    Deliver.sendLocationMSG(msg); //消息很重要,所以利用带buffer的对列来发送!\r
-                }\r
-//            try {\r
-//                sleep(1000);\r
-//            } catch (InterruptedException e) {\r
-//                e.printStackTrace();\r
-//            }\r
-            }\r
-                break;\r
-            default:\r
-                break;\r
-        }\r
-\r
-        last_send_antoff_event=current_anti_status;\r
-        ICLogger.i("AntiOff Timeout! send antioff event "+current_anti_status);\r
-    }\r
-\r
-    public boolean CheckAntiByPoling(){\r
-        //检查是否佩戴。佩戴返回true\r
-        //send_antiof_event();\r
-        return false;\r
-    }\r
-\r
-\r
-    //return 0 表示check 结束, 1表示需要继续check  由coreService中 ACTION_CHECK_ANTIOFF_EVENT进行\r
-    public int check_ant_event(){\r
-\r
-        long currenttime=System.currentTimeMillis();\r
-        ICLogger.i("anti_event_receivedTime in "+ (currenttime - anti_event_receivedTime)\r
-                +"ms ago ,anti_event_count_when_start_timer "+ant_status_event_reported\r
-        );\r
-\r
-        if ((currenttime - anti_event_receivedTime) >= 2000) {\r
-            send_antiof_event();\r
-\r
-            ant_status_event_reported = 0;\r
-            return 0;\r
-        } else {\r
-            long restTimeNeedDelay = (2000 + anti_event_receivedTime - currenttime);\r
-            ICLogger.i("Still need delay " + restTimeNeedDelay + "ms to check anti_event again!");\r
-            setAntiCheckAlarm((int) restTimeNeedDelay);\r
-            return 1;\r
-        }\r
-    }\r
-\r
-    public void setAntiCheckAlarm(int ms){\r
-        AlarmHelper.setRealTimeAlarmInMicorSeconds(mRuntime.getContextProxy().context,ms,ACTION_CHECK_ANTIOFF_EVENT);\r
-    }\r
-    private void reset_timer(){\r
-\r
-        if (1==ant_status_event_reported) //出现 ant_status_event_reported=0表示 有消息到来,需要开始,\r
-        {\r
-            //    antioff_timer.schedule(antioff_timeout_handler,1000); //两秒后发送消息\r
-              setAntiCheckAlarm(2000);\r
-        }\r
-    }\r
-    /**\r
-     * 启动传感器。\r
-     */\r
-    private void startSensor() {\r
-        mSensorManager = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);\r
-        Sensor mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);\r
-\r
-        if (mSensorManager == null || mSensor == null) {\r
-            ICLogger.i("Proximity 设备不支持1");\r
-            return;\r
-            //throw new UnsupportedOperationException("设备不支持");\r
-        }\r
-\r
-        boolean isRegister = mSensorManager.registerListener(mSensorEventListener, mSensor, SensorManager.SENSOR_DELAY_NORMAL);\r
-        if (!isRegister) {\r
-            ICLogger.i("Proximity 设备不支持2");\r
-            //throw new UnsupportedOperationException("设备不支持");\r
-            return ;\r
-        }\r
-    }\r
-\r
-\r
-\r
-    public void send_cutoff_event_broadcast(int antioff){\r
-        ICLogger.i("send_cutoff_event_broadcast "+antioff);\r
-        Intent intent=new Intent();\r
-        intent.setAction(ACTION_ANTI_OFF);\r
-        intent.putExtra(KEY_ANTI_EVENT,antioff);\r
-        if (antioff==0) {\r
-\r
-            if (Config.A9_noBroadCastActionStrip) {\r
-                if (mRuntime.needReportCutoff() == true) {\r
-                    Util.ShowToast(mRuntime, mContext.getResources().getString(R.string.alarm_lock_success));\r
-                }\r
-            }else if (Config.L004_BroadCastActionStrip) {\r
-                Util.ShowToast(mRuntime, mContext.getResources().getString(R.string.alarm_wristband_on));\r
-                //下面消息是为了把锁定窗口关掉\r
-                intent.putExtra(KEY_ANTI_TXT, "");\r
-                mContext.sendBroadcast(intent);\r
-            }else  if (Config.C5_noBroadCastActionStrip) {\r
-\r
-                Util.ShowToast(mRuntime, mContext.getResources().getString(R.string.alarm_lock_success));\r
-\r
-            }else{\r
-                intent.putExtra(KEY_ANTI_TXT, "");\r
-                mContext.sendBroadcast(intent);\r
-            }\r
-\r
-        }else{\r
-\r
-            if (Config.A9_noBroadCastActionStrip) {\r
-\r
-                if (mRuntime.needReportCutoff() == true) {\r
-                    play_notify();\r
-                    VibrateUtil.getInstance(mContext).VibrateOnOnce(true);\r
-                    screen_on();\r
-                    try {\r
-                        sleep(1000);\r
-                    } catch (InterruptedException e) {\r
-                        e.printStackTrace();\r
-                        ICLogger.e(e.getMessage(),e);\r
-                    }//delay一会儿再发消息,以屏没有来得急亮起,免界面不响应。\r
-                    Util.ShowToast(mRuntime, mContext.getResources().getString(R.string.alarm_Illegal_unlock));\r
-                }\r
-            }else if (Config.L004_BroadCastActionStrip) {\r
-\r
-                play_notify();\r
-                VibrateUtil.getInstance(mContext).VibrateOnOnce(true);\r
-                screen_on();\r
-                try {\r
-                    sleep(1000);\r
-                } catch (InterruptedException e) {\r
-                    e.printStackTrace();\r
-                    ICLogger.e(e.getMessage(),e);\r
-                }//delay一会儿再发消息,以屏没有来得急亮起,免界面不响应。\r
-                intent.putExtra(KEY_ANTI_TXT, mContext.getResources().getString(R.string.alarm_wristband_off));\r
-                mContext.sendBroadcast(intent);\r
-            }else if (Config.C5_noBroadCastActionStrip) {\r
-\r
-\r
-                    play_notify();\r
-                    VibrateUtil.getInstance(mContext).VibrateOnOnce(true);\r
-                    screen_on();\r
-                    try {\r
-                        sleep(1000);\r
-                    } catch (InterruptedException e) {\r
-                        e.printStackTrace();\r
-                        ICLogger.e(e.getMessage(),e);\r
-                    }//delay一会儿再发消息,以屏没有来得急亮起,免界面不响应。\r
-                    Util.ShowToast(mRuntime, mContext.getResources().getString(R.string.alarm_Illegal_unlock));\r
-\r
-            }else{\r
-                play_notify();\r
-                VibrateUtil.getInstance(mContext).VibrateOnOnce(true);\r
-                screen_on();\r
-                try {\r
-                    sleep(1000);\r
-                } catch (InterruptedException e) {\r
-                    e.printStackTrace();\r
-                    ICLogger.e(e.getMessage(),e);\r
-                }//delay一会儿再发消息,以屏没有来得急亮起,免界面不响应。\r
-                if (mRuntime.getNeedAntioff()){\r
-                    intent.putExtra(KEY_ANTI_TXT, mContext.getResources().getString(R.string.alarm_wristband_off));\r
-                    mContext.sendBroadcast(intent);\r
-                }\r
-\r
-            }\r
-\r
-        }\r
-\r
-    }\r
-    public void send_anti_event_broadcast(int antioff){\r
-\r
-        ICLogger.i("send_anti_event_broadcast "+antioff);\r
-        Intent intent=new Intent();\r
-        intent.setAction(ACTION_ANTI_OFF);\r
-        intent.putExtra(KEY_ANTI_EVENT,antioff);\r
-        if (antioff==0) {\r
-            mRuntime.isAntioff=false;\r
-            if (Config.A9_noBroadCastActionStrip) {\r
-                if (mRuntime.needReportCutoff() == true) {\r
-                    Util.ShowToast(mRuntime, mContext.getResources().getString(R.string.alarm_lock_success));\r
-                }\r
-            }else if (Config.L004_BroadCastActionStrip) {\r
-                Util.ShowToast(mRuntime, mContext.getResources().getString(R.string.alarm_wristband_on));\r
-                //下面消息是为了把锁定窗口关掉\r
-                intent.putExtra(KEY_ANTI_TXT, "");\r
-                mContext.sendBroadcast(intent);\r
-            }else  if (Config.C5_noBroadCastActionStrip) {\r
-                Util.ShowToast(mRuntime, mContext.getResources().getString(R.string.alarm_lock_success));\r
-\r
-            }else{\r
-                intent.putExtra(KEY_ANTI_TXT, "");\r
-                mContext.sendBroadcast(intent);\r
-            }\r
-\r
-        }else{\r
-            mRuntime.isAntioff=true;\r
-            if (Config.A9_noBroadCastActionStrip) {\r
-\r
-                if (mRuntime.needReportCutoff() == true) {\r
-                    play_notify();\r
-                    VibrateUtil.getInstance(mContext).VibrateOnOnce(true);\r
-                    screen_on();\r
-                    try {\r
-                        sleep(1000);\r
-                    } catch (InterruptedException e) {\r
-                        e.printStackTrace();\r
-                        ICLogger.e(e.getMessage(),e);\r
-                    }//delay一会儿再发消息,以屏没有来得急亮起,免界面不响应。\r
-                    Util.ShowToast(mRuntime, mContext.getResources().getString(R.string.alarm_Illegal_unlock));\r
-                }\r
-            }else if (Config.L004_BroadCastActionStrip) {\r
-                play_notify();\r
-                VibrateUtil.getInstance(mContext).VibrateOnOnce(true);\r
-                screen_on();\r
-                try {\r
-                    sleep(1000);\r
-                } catch (InterruptedException e) {\r
-                    e.printStackTrace();\r
-                    ICLogger.e(e.getMessage(),e);\r
-                }//delay一会儿再发消息,以屏没有来得急亮起,免界面不响应。\r
-                intent.putExtra(KEY_ANTI_TXT, mContext.getResources().getString(R.string.alarm_wristband_off));\r
-                mContext.sendBroadcast(intent);\r
-\r
-            }else  if (Config.C5_noBroadCastActionStrip) {\r
-\r
-                        play_notify();\r
-                        VibrateUtil.getInstance(mContext).VibrateOnOnce(true);\r
-                        screen_on();\r
-                        try {\r
-                            sleep(1000);\r
-                        } catch (InterruptedException e) {\r
-                            e.printStackTrace();\r
-                            ICLogger.e(e.getMessage(),e);\r
-                        }//delay一会儿再发消息,以屏没有来得急亮起,免界面不响应。\r
-                        Util.ShowToast(mRuntime, mContext.getResources().getString(R.string.alarm_Illegal_unlock));\r
-\r
-            }else{\r
-                play_notify();\r
-                VibrateUtil.getInstance(mContext).VibrateOnOnce(true);\r
-                screen_on();\r
-                try {\r
-                    sleep(1000);\r
-                } catch (InterruptedException e) {\r
-                    e.printStackTrace();\r
-                    ICLogger.e(e.getMessage(),e);\r
-                }//delay一会儿再发消息,以屏没有来得急亮起,免界面不响应。\r
-                if (mRuntime.getNeedAntioff()){\r
-                    intent.putExtra(KEY_ANTI_TXT, mContext.getResources().getString(R.string.alarm_wristband_off));\r
-                    mContext.sendBroadcast(intent);\r
-                }\r
-\r
-            }\r
-\r
-        }\r
-\r
-    }\r
-\r
-    private void screen_on(){\r
-        mWakeLock.acquire(5*1000);//亮屏5秒\r
-        mHandler.sendEmptyMessageDelayed(100,2000);\r
-    }\r
-    private SensorEventListener mSensorEventListener = new SensorEventListener() {\r
-\r
-        @Override\r
-        public void onSensorChanged(SensorEvent sensorEvent) {\r
-            current_anti_status=(int)sensorEvent.values[0];\r
-            ant_status_event_reported++;\r
-            ICLogger.i("近距离 "+current_anti_status+" get event "+ant_status_event_reported+" times !");\r
-            anti_event_receivedTime=System.currentTimeMillis();\r
-            reset_timer();\r
-        }\r
-\r
-        @Override\r
-        public void onAccuracyChanged(Sensor sensor, int i) {\r
-\r
-        }\r
-    };\r
-\r
-\r
-    @Override\r
-    public boolean onUserRequest(Intent paramIntent, Connection paramConnection, Runtime paramRuntime) {\r
-        return false;\r
-    }\r
-\r
-    @Override\r
-    public boolean onUserRequest(Message paramMessage, Connection paramConnection, Runtime paramRuntime) {\r
-        return false;\r
-    }\r
-\r
-    @Override\r
-    public void onAlarmClock(Connection paramConnection, Runtime paramRuntime) {\r
-\r
-    }\r
-\r
-    @Override\r
-    public void onAttach(Connection paramConnection, Runtime paramRuntime) {\r
-        mRuntime=paramRuntime;\r
-        mContext=mRuntime.getContextProxy().context;\r
-        mConnection=paramConnection;\r
-        if(Config.UsePolingCheckWeared==false) {\r
-            ICLogger.i("启用中断式佩戴检测!");\r
-            startSensor();\r
-        }else{\r
-            ICLogger.i("启用循环式佩戴检测!");\r
-        }\r
-    }\r
-\r
-    @Override\r
-    public void onDetach(Connection paramConnection, Runtime paramRuntime) {\r
-        if(Config.UsePolingCheckWeared==false) {\r
-            mSensorManager.unregisterListener(mSensorEventListener);\r
-        }\r
-    }\r
-}\r
+package com.enqualcomm.support.service;
+
+import android.content.Context;
+import android.content.Intent;
+import android.hardware.Sensor;
+import android.hardware.SensorEvent;
+import android.hardware.SensorEventListener;
+import android.hardware.SensorManager;
+
+import android.os.Handler;
+import android.os.Message;
+import android.os.PowerManager;
+
+import com.enqualcomm.support.Config;
+import com.enqualcomm.support.CoreService;
+import com.enqualcomm.support.LocationClient;
+import com.enqualcomm.support.R;
+import com.enqualcomm.support.bean.Runtime;
+import com.enqualcomm.support.bean.StringMessage;
+import com.enqualcomm.support.service.base.AbstractInvokeHandlerService;
+import com.enqualcomm.support.utils.AlarmHelper;
+import com.enqualcomm.support.utils.Connection;
+import com.enqualcomm.support.utils.ICLogger;
+
+import com.enqualcomm.support.utils.Util;
+import com.enqualcomm.support.utils.VibrateUtil;
+import com.ic.protocols.protocolAPIHelper;
+
+import static com.enqualcomm.support.Constants.ACTION_ANTI_OFF;
+import static com.enqualcomm.support.Constants.ACTION_ANTI_OFF0;
+import static com.enqualcomm.support.Constants.ACTION_CHECK_ANTIOFF_EVENT;
+import static com.enqualcomm.support.Constants.KEY_ANTI_EVENT;
+import static com.enqualcomm.support.Constants.KEY_ANTI_TXT;
+import static java.lang.Thread.interrupted;
+import static java.lang.Thread.sleep;
+
+
+public class AntiMonitorService extends AbstractInvokeHandlerService {
+
+
+    Context mContext;
+
+    Runtime mRuntime;
+
+    Connection mConnection;
+
+    private SensorManager mSensorManager;
+
+    private static int current_anti_status=10; //0 佩戴, 大于0 表示脱腕
+    private static int ant_status_event_reported=0; // 0 表示无消息, 1表示有消息需要发送, 大于1表示timeout时间内又有新消息,可以忽略不计
+    private static long anti_event_receivedTime=0;
+    private static int last_send_antoff_event=-1;
+    private Handler  mHandler=null;
+     PowerManager.WakeLock mWakeLock = null;
+    public AntiMonitorService(){
+        if (mHandler==null) {
+            mHandler = new Handler() {
+                public void handleMessage(Message msg) {
+                    super.handleMessage(msg);
+                    if (msg.what == 100) {
+
+                        ICLogger.i("release WakeLock!");
+                        if (mWakeLock != null && mWakeLock.isHeld()) {
+                            mWakeLock.release();
+                            ICLogger.i("release WakeLock!");
+                        }
+
+                    }else if (msg.what == 200){
+                        AudioService.getInstance().stop();
+                    }
+                }
+            };
+        }
+        if (mWakeLock==null) {
+            PowerManager mPowerManager = (PowerManager) CoreService.getInstance().getSystemService(Context.POWER_SERVICE);
+//            mWakeLock = mPowerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, AntiMonitorService.class.getSimpleName());
+            mWakeLock = mPowerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, AntiMonitorService.class.getSimpleName());
+        }
+    }
+    private void play_notify(){
+
+        AudioService.getInstance().play(mContext.getAssets(), "antioff.mp3");
+        if(mHandler!=null)
+            mHandler.sendEmptyMessageDelayed(200,5000);
+
+    }
+
+    /***
+     * 广播给其他应用,用于UI在客户操作
+     * @param antioff
+     */
+    private void broadcast_antioff_event_to_other_application(boolean antioff){
+        Intent intent=new Intent(ACTION_ANTI_OFF0);
+        if(antioff){
+            Util.setSystemProperties("persist.sys.ic_antioff", "true");
+            intent.putExtra(KEY_ANTI_EVENT,1);
+        }else {
+            Util.setSystemProperties("persist.sys.ic_antioff", "false");
+            intent.putExtra(KEY_ANTI_EVENT,0);
+        }
+        mContext.sendBroadcast(intent);
+    }
+    private void send_antiof_cutoff_event(){
+
+        if (last_send_antoff_event==current_anti_status){
+                ICLogger.i("佩戴状态未变,skip!");
+                return;
+        }
+
+        //current_anti_status == 2 表示表带 锁定 , ==12 表示表带非法解锁
+        //current_anti_status == 0 表示佩戴       ==10 表示脱腕
+
+        switch(current_anti_status){
+            case 2:
+                //锁定
+            {
+                if (Config.needBroadcastCutoffAlarm) {
+                    //  play_notify();
+                    send_cutoff_event_broadcast(0);
+                }
+                mRuntime.Cut_off_flag = 0;
+                if(mRuntime.setAlarmType(Runtime.AlarmType.ALARM_LOCK_WATCH)) {
+                    //发送消息定位报警消息
+                    ICLogger.i("triggerSOSLocationProcess ");
+                    LocationClient.getInstance().triggerSOSLocationProcess();
+                }
+
+
+            }
+                break;
+            case 12:
+            {
+                //非法解锁
+                if(Config.needBroadcastCutoffAlarm) {
+
+                    send_cutoff_event_broadcast(1);
+                }
+                mRuntime.Cut_off_flag=1;
+                if(mRuntime.setAlarmType(Runtime.AlarmType.ALARM_CUTOFF)) {
+                    ICLogger.i("triggerSOSLocationProcess ");
+                    LocationClient.getInstance().triggerSOSLocationProcess();
+//                    StringMessage msg = protocolAPIHelper.getWarningMSG(mRuntime);
+//                    Deliver.sendLocationMSG(msg); //消息很重要,所以利用带buffer的对列来发送!
+                }
+//            try {
+//                sleep(1000);
+//            } catch (InterruptedException e) {
+//                e.printStackTrace();
+//            }
+            }
+                break;
+            case 0:
+                //佩戴
+            {
+                if (Config.needBroadcastAntiAlarm) {
+                    //  play_notify();
+                    send_anti_event_broadcast(0);
+                }
+                mRuntime.Anti_off_flag = 0;
+
+                broadcast_antioff_event_to_other_application(false);
+
+                if(mRuntime.setAlarmType(Runtime.AlarmType.ALARM_WEARED)) {
+                    ICLogger.i("triggerSOSLocationProcess ");
+                    LocationClient.getInstance().triggerSOSLocationProcess();
+//                    StringMessage msg = protocolAPIHelper.getWarningMSG(mRuntime);
+//                    Deliver.sendLocationMSG(msg); //消息很重要,所以利用带buffer的对列来发送!
+                }
+//            try {
+//                sleep(1000);
+//            } catch (InterruptedException e) {
+//                e.printStackTrace();
+//            }
+            }
+                break;
+            case 10:
+            {
+                //脱腕
+                if(Config.needBroadcastAntiAlarm) {
+
+                    send_anti_event_broadcast(1);
+                }
+                mRuntime.Anti_off_flag=1;
+                broadcast_antioff_event_to_other_application(true);
+                if(mRuntime.setAlarmType(Runtime.AlarmType.ALARM_ANTIOFF)) {
+                    ICLogger.i("triggerSOSLocationProcess ");
+                    LocationClient.getInstance().triggerSOSLocationProcess();
+//                    StringMessage msg = protocolAPIHelper.getWarningMSG(mRuntime);
+//                    Deliver.sendLocationMSG(msg); //消息很重要,所以利用带buffer的对列来发送!
+                }
+//            try {
+//                sleep(1000);
+//            } catch (InterruptedException e) {
+//                e.printStackTrace();
+//            }
+            }
+                break;
+            default:
+                break;
+        }
+
+        last_send_antoff_event=current_anti_status;
+        ICLogger.i("AntiOff Timeout! send antioff event "+current_anti_status);
+    }
+
+    public boolean CheckAntiByPoling(){
+        //检查是否佩戴。佩戴返回true
+        //send_antiof_event();
+        return false;
+    }
+
+
+    //return 0 表示check 结束, 1表示需要继续check  由coreService中 ACTION_CHECK_ANTIOFF_EVENT进行
+    public int check_ant_event(){
+
+        long currenttime=System.currentTimeMillis();
+        ICLogger.i("anti_event_receivedTime in "+ (currenttime - anti_event_receivedTime)
+                +"ms ago ,anti_event_count_when_start_timer "+ant_status_event_reported
+        );
+
+        if ((currenttime - anti_event_receivedTime) >= 2000) {
+            send_antiof_cutoff_event();
+
+            ant_status_event_reported = 0;
+            return 0;
+        } else {
+            long restTimeNeedDelay = (2000 + anti_event_receivedTime - currenttime);
+            ICLogger.i("Still need delay " + restTimeNeedDelay + "ms to check anti_event again!");
+            setAntiCheckAlarm((int) restTimeNeedDelay);
+            return 1;
+        }
+    }
+
+    public void setAntiCheckAlarm(int ms){
+        AlarmHelper.setRealTimeAlarmInMicorSeconds(mRuntime.getContextProxy().context,ms,ACTION_CHECK_ANTIOFF_EVENT);
+    }
+    private void reset_timer(){
+
+        if (1==ant_status_event_reported) //出现 ant_status_event_reported=0表示 有消息到来,需要开始,
+        {
+            //    antioff_timer.schedule(antioff_timeout_handler,1000); //两秒后发送消息
+              setAntiCheckAlarm(2000);
+        }
+    }
+    /**
+     * 启动传感器。
+     */
+    private void startSensor() {
+        mSensorManager = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);
+        Sensor mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
+
+        if (mSensorManager == null || mSensor == null) {
+            ICLogger.i("Proximity 设备不支持1");
+            return;
+            //throw new UnsupportedOperationException("设备不支持");
+        }
+
+        boolean isRegister = mSensorManager.registerListener(mSensorEventListener, mSensor, SensorManager.SENSOR_DELAY_NORMAL);
+        if (!isRegister) {
+            ICLogger.i("Proximity 设备不支持2");
+            //throw new UnsupportedOperationException("设备不支持");
+            return ;
+        }
+    }
+
+
+
+    public void send_cutoff_event_broadcast(int cutoff){
+        ICLogger.i("send_cutoff_event_broadcast "+cutoff);
+        Intent intent=new Intent();
+        intent.setAction(ACTION_ANTI_OFF);
+        intent.putExtra(KEY_ANTI_EVENT,cutoff);
+        if (cutoff==0) {
+
+            if (Config.A9_noBroadCastActionStrip) {
+                if (mRuntime.needReportCutoff() == true) {
+                    Util.ShowToast(mRuntime, mContext.getResources().getString(R.string.alarm_lock_success));
+                }
+            }else if (Config.L004_BroadCastActionStrip) {
+                Util.ShowToast(mRuntime, mContext.getResources().getString(R.string.alarm_wristband_on));
+                //下面消息是为了把锁定窗口关掉
+                intent.putExtra(KEY_ANTI_TXT, "");
+                mContext.sendBroadcast(intent);
+            }else  if (Config.C5_noBroadCastActionStrip) {
+
+                Util.ShowToast(mRuntime, mContext.getResources().getString(R.string.alarm_lock_success));
+
+            }else{
+                intent.putExtra(KEY_ANTI_TXT, "");
+                mContext.sendBroadcast(intent);
+            }
+
+        }else{
+
+            if (Config.A9_noBroadCastActionStrip) {
+
+                if (mRuntime.needReportCutoff() == true) {
+                    play_notify();
+                    VibrateUtil.getInstance(mContext).VibrateOnOnce(true);
+                    screen_on();
+                    try {
+                        sleep(1000);
+                    } catch (InterruptedException e) {
+                        e.printStackTrace();
+                        ICLogger.e(e.getMessage(),e);
+                    }//delay一会儿再发消息,以屏没有来得急亮起,免界面不响应。
+                    Util.ShowToast(mRuntime, mContext.getResources().getString(R.string.alarm_Illegal_unlock));
+                }
+            }else if (Config.L004_BroadCastActionStrip) {
+
+                play_notify();
+                VibrateUtil.getInstance(mContext).VibrateOnOnce(true);
+                screen_on();
+                try {
+                    sleep(1000);
+                } catch (InterruptedException e) {
+                    e.printStackTrace();
+                    ICLogger.e(e.getMessage(),e);
+                }//delay一会儿再发消息,以屏没有来得急亮起,免界面不响应。
+                intent.putExtra(KEY_ANTI_TXT, mContext.getResources().getString(R.string.alarm_wristband_off));
+                mContext.sendBroadcast(intent);
+            }else if (Config.C5_noBroadCastActionStrip) {
+
+
+                    play_notify();
+                    VibrateUtil.getInstance(mContext).VibrateOnOnce(true);
+                    screen_on();
+                    try {
+                        sleep(1000);
+                    } catch (InterruptedException e) {
+                        e.printStackTrace();
+                        ICLogger.e(e.getMessage(),e);
+                    }//delay一会儿再发消息,以屏没有来得急亮起,免界面不响应。
+                    Util.ShowToast(mRuntime, mContext.getResources().getString(R.string.alarm_Illegal_unlock));
+
+            }else{
+                play_notify();
+                VibrateUtil.getInstance(mContext).VibrateOnOnce(true);
+                screen_on();
+                try {
+                    sleep(1000);
+                } catch (InterruptedException e) {
+                    e.printStackTrace();
+                    ICLogger.e(e.getMessage(),e);
+                }//delay一会儿再发消息,以屏没有来得急亮起,免界面不响应。
+                if (mRuntime.getNeedAntioff()){
+                    intent.putExtra(KEY_ANTI_TXT, mContext.getResources().getString(R.string.alarm_wristband_off));
+                    mContext.sendBroadcast(intent);
+                }
+
+            }
+
+        }
+
+    }
+    public void send_anti_event_broadcast(int antioff){
+
+        ICLogger.i("send_anti_event_broadcast "+antioff);
+        Intent intent=new Intent();
+        intent.setAction(ACTION_ANTI_OFF);
+        intent.putExtra(KEY_ANTI_EVENT,antioff);
+        if (antioff==0) {
+            mRuntime.isAntioff=false;
+            if (Config.A9_noBroadCastActionStrip) {
+                if (mRuntime.needReportCutoff() == true) {
+                    Util.ShowToast(mRuntime, mContext.getResources().getString(R.string.alarm_lock_success));
+                }
+            }else if (Config.L004_BroadCastActionStrip) {
+                Util.ShowToast(mRuntime, mContext.getResources().getString(R.string.alarm_wristband_on));
+                //下面消息是为了把锁定窗口关掉
+                intent.putExtra(KEY_ANTI_TXT, "");
+                mContext.sendBroadcast(intent);
+            }else  if (Config.C5_noBroadCastActionStrip) {
+                Util.ShowToast(mRuntime, mContext.getResources().getString(R.string.alarm_lock_success));
+
+            }else{
+                intent.putExtra(KEY_ANTI_TXT, "");
+                mContext.sendBroadcast(intent);
+            }
+
+        }else{
+            mRuntime.isAntioff=true;
+            if (Config.A9_noBroadCastActionStrip) {
+
+                if (mRuntime.needReportCutoff() == true) {
+                    play_notify();
+                    VibrateUtil.getInstance(mContext).VibrateOnOnce(true);
+                    screen_on();
+                    try {
+                        sleep(1000);
+                    } catch (InterruptedException e) {
+                        e.printStackTrace();
+                        ICLogger.e(e.getMessage(),e);
+                    }//delay一会儿再发消息,以屏没有来得急亮起,免界面不响应。
+                    Util.ShowToast(mRuntime, mContext.getResources().getString(R.string.alarm_Illegal_unlock));
+                }
+            }else if (Config.L004_BroadCastActionStrip) {
+                play_notify();
+                VibrateUtil.getInstance(mContext).VibrateOnOnce(true);
+                screen_on();
+                try {
+                    sleep(1000);
+                } catch (InterruptedException e) {
+                    e.printStackTrace();
+                    ICLogger.e(e.getMessage(),e);
+                }//delay一会儿再发消息,以屏没有来得急亮起,免界面不响应。
+                intent.putExtra(KEY_ANTI_TXT, mContext.getResources().getString(R.string.alarm_wristband_off));
+                mContext.sendBroadcast(intent);
+
+            }else  if (Config.C5_noBroadCastActionStrip) {
+
+                        play_notify();
+                        VibrateUtil.getInstance(mContext).VibrateOnOnce(true);
+                        screen_on();
+                        try {
+                            sleep(1000);
+                        } catch (InterruptedException e) {
+                            e.printStackTrace();
+                            ICLogger.e(e.getMessage(),e);
+                        }//delay一会儿再发消息,以屏没有来得急亮起,免界面不响应。
+                        Util.ShowToast(mRuntime, mContext.getResources().getString(R.string.alarm_Illegal_unlock));
+
+            }else{
+                play_notify();
+                VibrateUtil.getInstance(mContext).VibrateOnOnce(true);
+                screen_on();
+                try {
+                    sleep(1000);
+                } catch (InterruptedException e) {
+                    e.printStackTrace();
+                    ICLogger.e(e.getMessage(),e);
+                }//delay一会儿再发消息,以屏没有来得急亮起,免界面不响应。
+                if (mRuntime.getNeedAntioff()){
+                    intent.putExtra(KEY_ANTI_TXT, mContext.getResources().getString(R.string.alarm_wristband_off));
+                    mContext.sendBroadcast(intent);
+                }
+
+            }
+
+        }
+
+    }
+
+    private void screen_on(){
+        mWakeLock.acquire(5*1000);//亮屏5秒
+        mHandler.sendEmptyMessageDelayed(100,2000);
+    }
+    private SensorEventListener mSensorEventListener = new SensorEventListener() {
+
+        @Override
+        public void onSensorChanged(SensorEvent sensorEvent) {
+            current_anti_status=(int)sensorEvent.values[0];
+            ant_status_event_reported++;
+            ICLogger.i("近距离 "+current_anti_status+" get event "+ant_status_event_reported+" times !");
+            anti_event_receivedTime=System.currentTimeMillis();
+            reset_timer();
+        }
+
+        @Override
+        public void onAccuracyChanged(Sensor sensor, int i) {
+
+        }
+    };
+
+
+    @Override
+    public boolean onUserRequest(Intent paramIntent, Connection paramConnection, Runtime paramRuntime) {
+        return false;
+    }
+
+    @Override
+    public boolean onUserRequest(Message paramMessage, Connection paramConnection, Runtime paramRuntime) {
+        return false;
+    }
+
+    @Override
+    public void onAlarmClock(Connection paramConnection, Runtime paramRuntime) {
+
+    }
+
+    @Override
+    public void onAttach(Connection paramConnection, Runtime paramRuntime) {
+        mRuntime=paramRuntime;
+        mContext=mRuntime.getContextProxy().context;
+        mConnection=paramConnection;
+        if(Config.UsePolingCheckWeared==false) {
+            ICLogger.i("启用中断式佩戴检测!");
+            startSensor();
+        }else{
+            ICLogger.i("启用循环式佩戴检测!");
+        }
+    }
+
+    @Override
+    public void onDetach(Connection paramConnection, Runtime paramRuntime) {
+        if(Config.UsePolingCheckWeared==false) {
+            mSensorManager.unregisterListener(mSensorEventListener);
+        }
+    }
+}
index 2cad02c..241e0f7 100644 (file)
-package com.enqualcomm.support.service;\r
-\r
-import android.app.AlarmManager;\r
-import android.app.PendingIntent;\r
-import android.content.BroadcastReceiver;\r
-import android.content.ComponentName;\r
-import android.content.Context;\r
-import android.content.Intent;\r
-import android.content.IntentFilter;\r
-import android.database.ContentObserver;\r
-import android.net.Uri;\r
-import android.os.Handler;\r
-import android.os.Message;\r
-import android.os.Messenger;\r
-import android.telephony.PhoneStateListener;\r
-import android.telephony.PreciseCallState;\r
-import android.telephony.TelephonyManager;\r
-\r
-import com.enqualcomm.support.Config;\r
-import com.enqualcomm.support.CoreService;\r
-import com.enqualcomm.support.ICContentProvider;\r
-import com.enqualcomm.support.MainActivity;\r
-import com.enqualcomm.support.bean.Alarm;\r
-import com.enqualcomm.support.bean.Antioff;\r
-import com.enqualcomm.support.bean.NoticeContent;\r
-import com.enqualcomm.support.bean.Runtime;\r
-import com.enqualcomm.support.bean.Silent;\r
-import com.enqualcomm.support.bean.StheartRate;\r
-\r
-import com.enqualcomm.support.service.base.AbstractInvokeHandlerService;\r
-import com.enqualcomm.support.utils.AlarmHelper;\r
-import com.enqualcomm.support.utils.Connection;\r
-import com.enqualcomm.support.utils.DBHelper;\r
-import com.enqualcomm.support.utils.ICAudioManager;\r
-import com.enqualcomm.support.utils.ICLogger;\r
-import com.enqualcomm.support.utils.MissedCallContentObserver;\r
-import com.enqualcomm.support.utils.SharPreferenceUtil;\r
-import com.enqualcomm.support.utils.TimeUtil;\r
-import com.enqualcomm.support.utils.Util;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Calendar;\r
-import java.util.Date;\r
-import java.util.Iterator;\r
-import java.util.concurrent.TimeUnit;\r
-\r
-import static android.telephony.TelephonyManager.ACTION_PHONE_STATE_CHANGED;\r
-import static android.telephony.TelephonyManager.CALL_STATE_OFFHOOK;\r
-import static android.telephony.TelephonyManager.CALL_STATE_RINGING;\r
-import static com.enqualcomm.support.Constants.ACTION_CARE_ALARM;\r
-import static com.enqualcomm.support.Constants.ACTION_CLOSE_UNREAD_MSG;\r
-import static com.enqualcomm.support.Constants.ACTION_HEATR_RATE_START;\r
-import static com.enqualcomm.support.Constants.SERVICE_CLS_NAME;\r
-import static com.enqualcomm.support.Constants.SERVICE_PKG_NAME;\r
-\r
-public class SilentManager extends AbstractInvokeHandlerService {\r
-  private static final long ONE_WEEK = 604800000L;\r
-  private static final long ONE_DAY = 86400000L;\r
-\r
-  private ArrayList<Alarm> alarms;\r
-  private boolean haveHandSilence;\r
-  private boolean isCalling;\r
-  AlarmManager mAlarmManager;\r
-  private SilentManager.AlramReceiver mAlramReceiver;\r
-  Connection mConnection;\r
-  ContentObserver mContentObserver = new ContentObserver(new Handler()) {\r
-    public void onChange(boolean var1) {\r
-      ICLogger.i("静默有变化");\r
-      SilentManager.this.silentList = SilentManager.this.querySilent();\r
-      SilentManager.this.getSilentListStartAndEndTime();\r
-      SilentManager.this.handleSilent(mRuntime, true);\r
-    }\r
-  };\r
-  private Context mContext;\r
-  private DBHelper mDbHelper;\r
-  private boolean mInSilent;\r
-  private String mInterval;\r
-  private boolean mIsNeedAntioff;\r
-  private boolean mIsStheartRate;\r
-  private MissedCallContentObserver mMissedCallContentObserver;\r
-  Runtime mRuntime;\r
-  private int mStheartRateInterval;\r
-  private int mTodayWeek;\r
-  private boolean mValue_isSilence;\r
-\r
-  public static final int PRECISE_CALL_STATE_NOT_VALID = -1;\r
-  public static final int PRECISE_CALL_STATE_IDLE = 0;  //空闲\r
-  public static final int PRECISE_CALL_STATE_ACTIVE = 1; //正在通话\r
-  public static final int PRECISE_CALL_STATE_HOLDING = 2; //通话挂起\r
-  public static final int PRECISE_CALL_STATE_DIALING = 3; //拨号开始\r
-  public static final int PRECISE_CALL_STATE_ALERTING = 4; //正在呼出\r
-  public static final int PRECISE_CALL_STATE_INCOMING = 5; //对方来电\r
-  public static final int PRECISE_CALL_STATE_WAITING = 6; //第三方来电等待\r
-  public static final int PRECISE_CALL_STATE_DISCONNECTED = 7; //挂断完成\r
-  public static final int PRECISE_CALL_STATE_DISCONNECTING = 8; //正在挂断\r
-\r
-  private static SilentManager mSilentManger=null;\r
-\r
-  public static SilentManager getInstance(){\r
-    if (mSilentManger==null)\r
-      mSilentManger=new SilentManager();\r
-    return mSilentManger;\r
-  }\r
-  private PhoneStateListener phoneStateListener = new PhoneStateListener() {\r
-    public void onCallStateChanged(int state, String incomingNumber) {\r
-      super.onCallStateChanged(state, incomingNumber);\r
-\r
-      ICLogger.i("========onCallStateChanged state "+state+", incomingNumber "+incomingNumber);\r
-      switch(state) {\r
-        case PRECISE_CALL_STATE_DISCONNECTING: //挂电话\r
-        case PRECISE_CALL_STATE_DISCONNECTED: //挂电话\r
-          isCalling = false;\r
-//          if (SilentManager.this.haveHandSilence) {\r
-//            SilentManager.this.handSilence(SilentManager.this.mContext, SilentManager.this.mValue_isSilence);\r
-//          }\r
-          if(ICAudioManager.needMute==true)\r
-          {\r
-//            ICAudioManager.restoreVolumn(mContext); //2秒后恢复音量\r
-            new Handler().postDelayed(new Runnable() {\r
-              @Override\r
-              public void run() {\r
-                ICAudioManager.restoreVolumn(mContext); //2秒后恢复音量\r
-                ICAudioManager.needMute=false;\r
-              }\r
-            },2000);\r
-          }\r
-          ICLogger.i("========Hung up!");\r
-          break;\r
-        case PRECISE_CALL_STATE_INCOMING: //来电\r
-        case PRECISE_CALL_STATE_ALERTING:\r
-        case PRECISE_CALL_STATE_DIALING:\r
-          isCalling = true;\r
-          Intent var3 = new Intent();\r
-          var3.setAction(ACTION_CLOSE_UNREAD_MSG);\r
-          mContext.sendBroadcast(var3);\r
-\r
-          ICLogger.i("========Ring!");\r
-          if(ICAudioManager.needMute==true)\r
-          {\r
-            ICAudioManager.setVolumnMute(mContext);\r
-            new Handler().postDelayed(new Runnable() {\r
-              @Override\r
-              public void run() {\r
-                ICAudioManager.setVolumnMute(mContext); //2秒后恢复音量\r
-              }\r
-            },2000);\r
-\r
-          }\r
-          break;\r
-        case PRECISE_CALL_STATE_ACTIVE://接电话\r
-        {\r
-          if (ICAudioManager.needMute == false){\r
-            if (Config.custom_name.equals("AK"))\r
-              ICAudioManager.setVoiceCallMaxVolumn(mContext); //设置最大音量\r
-          }\r
-        }\r
-        case PRECISE_CALL_STATE_HOLDING://接电话\r
-        case PRECISE_CALL_STATE_WAITING:\r
-          isCalling = true;\r
-          ICLogger.i("========Answer Call !");\r
-          if(ICAudioManager.needMute==true)\r
-          {\r
-            ICAudioManager.setVolumnMute(mContext);\r
-            new Handler().postDelayed(new Runnable() {\r
-              @Override\r
-              public void run() {\r
-                ICAudioManager.setVolumnMute(mContext); //2秒后恢复音量\r
-              }\r
-            },2000);\r
-          }\r
-\r
-      }\r
-\r
-    }\r
-  };\r
-  private ArrayList<Antioff> sAntioffList;\r
-  private ArrayList<Silent> silentList;\r
-  private ArrayList<StheartRate> stheartRateList;\r
-  private ArrayList<NoticeContent> voiceNotice;\r
-\r
-  public SilentManager() {\r
-  }\r
-\r
-  private void callback(Messenger var1, boolean var2) {\r
-    short var3;\r
-    if (var2) {\r
-      var3 = 600;\r
-    } else {\r
-      var3 = 700;\r
-    }\r
-\r
-    if (var1 != null) {\r
-      try {\r
-        var1.send(Message.obtain((Handler)null, var3));\r
-      } catch (Exception e) {\r
-        e.printStackTrace();\r
-        ICLogger.e(e.getMessage(),e);\r
-      }\r
-    }\r
-\r
-  }\r
-\r
-  private void cancelAlarm(ArrayList<Alarm> var1) {\r
-    Iterator var2 = var1.iterator();\r
-\r
-    while(var2.hasNext()) {\r
-      Alarm var3 = (Alarm)var2.next();\r
-      String var10 = var3.time;\r
-      String var4 = var3.week;\r
-      String var5 = var3.ring;\r
-      String var11 = var3.name;\r
-      char[] var6 = var4.toCharArray();\r
-      int var7 = var6.length;\r
-\r
-      for(int var8 = 1; var8 < var7; ++var8) {\r
-        char var9 = var6[var8];\r
-        this.mAlarmManager.cancel(this.getPendingIntent(var10, var4, var5, var11, var9 - 47));\r
-      }\r
-    }\r
-\r
-  }\r
-\r
-  private void cancelNoticeAlarm(ArrayList<NoticeContent> var1) {\r
-    Iterator var2 = var1.iterator();\r
-\r
-    while(var2.hasNext()) {\r
-      NoticeContent var3 = (NoticeContent)var2.next();\r
-      String var4 = var3.noticeTime;\r
-      String var9 = var3.noticeName;\r
-      String var5 = var3.noticeNumber;\r
-      String var6 = var3.noticeID;\r
-      String var7 = var3.noticeCategory;\r
-      String var8 = var3.noticeFrequency;\r
-      String var10 = var3.noticeContent;\r
-      this.mAlarmManager.cancel(this.getPendingIntent(var4, var9, var5, var6, var7, var8, var10));\r
-    }\r
-\r
-  }\r
-\r
-  private PendingIntent getPendingIntent(String var1, String var2, String var3, String var4, int var5) {\r
-    StringBuilder var6 = new StringBuilder("alarm:");\r
-    var6.append(var1);\r
-    var6.append(",");\r
-    var6.append(var2);\r
-    var6.append(",");\r
-    var6.append(var3);\r
-    var6.append(",");\r
-    var6.append(var4);\r
-    var6.append(",");\r
-    var6.append(var5);\r
-    var2 = var6.toString();\r
-    Intent var7 = new Intent(this.mContext, CoreService.class);\r
-    var7.setAction(ACTION_CARE_ALARM);\r
-    var7.setData(Uri.parse(var2));\r
-    return PendingIntent.getService(this.mContext, 0, var7, PendingIntent.FLAG_UPDATE_CURRENT);\r
-  }\r
-\r
-  private PendingIntent getPendingIntent(String var1, String var2, String var3, String var4, String var5, String var6, String var7) {\r
-    StringBuilder var8 = new StringBuilder("notice:");\r
-    var8.append(var1);\r
-    var8.append(",");\r
-    var8.append(var2);\r
-    var8.append(",");\r
-    var8.append(var3);\r
-    var8.append(",");\r
-    var8.append(var4);\r
-    var8.append(",");\r
-    var8.append(var5);\r
-    var8.append(",");\r
-    var8.append(var6);\r
-    var8.append(",");\r
-    var8.append(var7);\r
-    var1 = var8.toString();\r
-    Intent var9 = new Intent(this.mContext, CoreService.class);\r
-    var9.setAction("com.enqualcomm.support.ACTION_NOTICE_ALARM");\r
-    var9.setData(Uri.parse(var1));\r
-    return PendingIntent.getService(this.mContext, 0, var9, PendingIntent.FLAG_UPDATE_CURRENT);\r
-  }\r
-\r
-  private void getSilentListStartAndEndTime() {\r
-    Calendar var1 = Calendar.getInstance();\r
-    this.mTodayWeek = var1.get(Calendar.DAY_OF_WEEK);\r
-\r
-    Silent var3;\r
-    for(Iterator var2 = this.silentList.iterator(); var2.hasNext(); var3.endTimeMillis = var1.getTimeInMillis()) {\r
-      var3 = (Silent)var2.next();\r
-      var1.set(Calendar.SECOND, 0);\r
-      int var4 = Integer.parseInt(var3.start.substring(2, 4));\r
-      int var5 = Integer.parseInt(var3.start.substring(5, 7));\r
-      var1.set(Calendar.HOUR_OF_DAY, var4);\r
-      var1.set(Calendar.MINUTE, var5);\r
-      var3.startTimeMillis = var1.getTimeInMillis();\r
-      var5 = Integer.parseInt(var3.end.substring(2, 4));\r
-      var4 = Integer.parseInt(var3.end.substring(5, 7));\r
-      var1.set(Calendar.HOUR_OF_DAY, var5);\r
-      var1.set(Calendar.MINUTE, var4);\r
-    }\r
-\r
-  }\r
-\r
-  private void getStartAndEndSantioffTime() {\r
-    Calendar var1 = Calendar.getInstance();\r
-    this.mTodayWeek = var1.get(Calendar.DAY_OF_WEEK);\r
-\r
-    Antioff var3;\r
-    for(Iterator var2 = this.sAntioffList.iterator(); var2.hasNext(); var3.endTimeMillis = var1.getTimeInMillis()) {\r
-      var3 = (Antioff)var2.next();\r
-      var1.set(Calendar.SECOND, 0);\r
-      int var4 = Integer.parseInt(var3.start.substring(2, 4));\r
-      int var5 = Integer.parseInt(var3.start.substring(5, 7));\r
-      var1.set(Calendar.HOUR_OF_DAY, var4);\r
-      var1.set(Calendar.MINUTE, var5);\r
-      var3.startTimeMillis = var1.getTimeInMillis();\r
-      var4 = Integer.parseInt(var3.end.substring(2, 4));\r
-      var5 = Integer.parseInt(var3.end.substring(5, 7));\r
-      var1.set(Calendar.HOUR_OF_DAY, var4);\r
-      var1.set(Calendar.MINUTE, var5);\r
-    }\r
-\r
-  }\r
-\r
-  private void getStartAndEndStheartRateTime() {\r
-    Calendar var1 = Calendar.getInstance();\r
-    this.mTodayWeek = var1.get(Calendar.DAY_OF_WEEK);\r
-\r
-    StheartRate var3;\r
-    for(Iterator var2 = this.stheartRateList.iterator(); var2.hasNext(); var3.endTimeMillis = var1.getTimeInMillis()) {\r
-      var3 = (StheartRate)var2.next();\r
-      var1.set(Calendar.SECOND, 0);\r
-      int var4 = Integer.parseInt(var3.start.substring(2, 4));\r
-      int var5 = Integer.parseInt(var3.start.substring(5, 7));\r
-      var1.set(Calendar.HOUR_OF_DAY, var4);\r
-      var1.set(Calendar.MINUTE, var5);\r
-      var3.startTimeMillis = var1.getTimeInMillis();\r
-      var4 = Integer.parseInt(var3.end.substring(2, 4));\r
-      var5 = Integer.parseInt(var3.end.substring(5, 7));\r
-      var1.set(Calendar.HOUR_OF_DAY, var4);\r
-      var1.set(Calendar.MINUTE, var5);\r
-    }\r
-\r
-  }\r
-\r
-  private void handSilence(Context var1, boolean var2) {\r
-    this.mValue_isSilence = var2;\r
-    if (this.isCalling) {\r
-      this.haveHandSilence = true;\r
-    } else {\r
-      this.haveHandSilence = false;\r
-      SharPreferenceUtil.setPrefBoolean(var1, "KEY_ISSILENCE", var2);\r
-      Intent var3 = new Intent();\r
-      var3.setAction("com.enqualcomm.support.ACTION_ISSILENCE2IMESSAGE");\r
-      var3.putExtra("KEY_ISSILENCE", var2);\r
-      var1.sendBroadcast(var3);\r
-      ComponentName var4 = new ComponentName(SERVICE_PKG_NAME, SERVICE_CLS_NAME);\r
-      Intent var5 = (new Intent("com.enqualcomm.support.ACTION_VIDEO_END_CALL")).setComponent(var4);\r
-      this.mRuntime.getContextProxy().context.startService(var5);\r
-    }\r
-  }\r
-\r
-  private void handleSilent(Runtime var1, boolean var2) {\r
-    int var3 = Calendar.getInstance().get(Calendar.DAY_OF_WEEK);\r
-    if (var3 != this.mTodayWeek && (var3 != 1 || this.mTodayWeek != 8)) {\r
-      this.getSilentListStartAndEndTime();\r
-      this.queryNotice();\r
-    }\r
-\r
-    boolean var4 = this.isSilentTime();\r
-    StringBuilder var5 = new StringBuilder();\r
-    var5.append("inSilent=");\r
-    var5.append(var4);\r
-    ICLogger.i(var5.toString());\r
-    if (!this.mInSilent && var4) {\r
-      this.onSilentStateChange(true);\r
-      this.handSilence(this.mContext, true);\r
-      this.mDbHelper.upDateStatus("ON");\r
-    } else if (this.mInSilent && !var4) {\r
-      this.onSilentStateChange(false);\r
-      this.mDbHelper.upDateStatus("OFF");\r
-      this.handSilence(this.mContext, false);\r
-    }\r
-\r
-    this.mInSilent = var4;\r
-    this.getStartAndEndStheartRateTime();\r
-    this.isStheartRateTime(var2);\r
-  }\r
-\r
-  private boolean isIdle(Context context) {\r
-    int callstate = ((TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE)).getCallState();\r
-    boolean isidle;\r
-    if (CALL_STATE_RINGING != callstate && CALL_STATE_OFFHOOK != callstate) {\r
-      isidle = true;\r
-    } else {\r
-      isidle = false;\r
-    }\r
-\r
-    return isidle && !this.mInSilent && !this.mRuntime.getBatteryLow();\r
-  }\r
-\r
-  private boolean isAntioffTime(boolean var1) {\r
-    long var2 = System.currentTimeMillis();\r
-    ArrayList var4 = this.sAntioffList;\r
-    int var5 = this.mTodayWeek;\r
-    var1 = true;\r
-    if (var5 == 1) {\r
-      this.mTodayWeek += 7;\r
-    }\r
-\r
-    Iterator var12 = var4.iterator();\r
-\r
-    while(true) {\r
-      if (!var12.hasNext()) {\r
-        var1 = false;\r
-        break;\r
-      }\r
-\r
-      Antioff var6 = (Antioff)var12.next();\r
-      String var7 = var6.week;\r
-      StringBuilder var8 = new StringBuilder();\r
-      var8.append(this.mTodayWeek - 1);\r
-      var8.append("");\r
-      if (var7.contains(var8.toString())) {\r
-        long var9 = var6.startTimeMillis - var2;\r
-        int var11;\r
-        if (var9 < (long)(CoreService.alarmCycle * 60 * 1000) && var9 > 0L) {\r
-          var11 = Integer.parseInt(var6.start.substring(2, 4));\r
-          var5 = Integer.parseInt(var6.start.substring(5, 7));\r
-          AlarmHelper.setTimeAlarm(this.mContext, var11, var5, "com.enqualcomm.support.OTHER_ALARM_START");\r
-          var8 = new StringBuilder();\r
-          var8.append("设置起始时间=hour");\r
-          var8.append(var11);\r
-          var8.append("minute+");\r
-          var8.append(var5);\r
-          ICLogger.i(var8.toString());\r
-        }\r
-\r
-        var9 = var6.endTimeMillis - var2;\r
-        if (var9 < (long)(CoreService.alarmCycle * 60 * 1000) && var9 > 0L) {\r
-          var11 = Integer.parseInt(var6.end.substring(2, 4));\r
-          var5 = Integer.parseInt(var6.end.substring(5, 7));\r
-          AlarmHelper.setTimeAlarm(this.mContext, var11, var5, "com.enqualcomm.support.OTHER_ALARM_END");\r
-          var8 = new StringBuilder();\r
-          var8.append("设置结束时间=hour");\r
-          var8.append(var11);\r
-          var8.append("minute+");\r
-          var8.append(var5);\r
-          ICLogger.i(var8.toString());\r
-        }\r
-\r
-        if (var6.startTimeMillis <= var2 && var6.endTimeMillis > var2) {\r
-          break;\r
-        }\r
-      }\r
-    }\r
-\r
-    this.mRuntime.setNeedAntioff(var1);\r
-    return var1;\r
-  }\r
-\r
-  private boolean isSilentTime() {\r
-    long var1 = System.currentTimeMillis();\r
-    ArrayList var3 = this.silentList;\r
-    int var4 = this.mTodayWeek;\r
-    boolean var5 = false; //默认不在silent时间段\r
-    if (var4 == 1) {\r
-      this.mTodayWeek += 7;\r
-    }\r
-\r
-    Iterator var6 = var3.iterator();\r
-\r
-    while(true) {\r
-      if (!var6.hasNext()) {\r
-        var5 = false;\r
-        break;\r
-      }\r
-\r
-      Silent var12 = (Silent)var6.next();\r
-      String var7 = var12.week;\r
-      StringBuilder var8 = new StringBuilder();\r
-      var8.append(this.mTodayWeek - 1);\r
-      var8.append("");\r
-      if (var7.contains(var8.toString())) {\r
-        long var9 = var12.startTimeMillis - var1;\r
-        int var11;\r
-        StringBuilder var13;\r
-        if (var9 < (long)(CoreService.alarmCycle * 60 * 1000) && var9 > 0L) {\r
-          var11 = Integer.parseInt(var12.start.substring(2, 4));\r
-          var4 = Integer.parseInt(var12.start.substring(5, 7));\r
-          AlarmHelper.setTimeAlarm(this.mContext, var11, var4, "com.enqualcomm.support.OTHER_ALARM_START");\r
-          var13 = new StringBuilder();\r
-          var13.append("设置起始时间=hour");\r
-          var13.append(var11);\r
-          var13.append("minute+");\r
-          var13.append(var4);\r
-          ICLogger.i(var13.toString());\r
-        }\r
-\r
-        var9 = var12.endTimeMillis - var1;\r
-        if (var9 < (long)(CoreService.alarmCycle * 60 * 1000) && var9 > 0L) {\r
-          var11 = Integer.parseInt(var12.end.substring(2, 4));\r
-          var4 = Integer.parseInt(var12.end.substring(5, 7));\r
-          AlarmHelper.setTimeAlarm(this.mContext, var11, var4, "com.enqualcomm.support.OTHER_ALARM_END");\r
-          var13 = new StringBuilder();\r
-          var13.append("设置结束时间=hour");\r
-          var13.append(var11);\r
-          var13.append("minute+");\r
-          var13.append(var4);\r
-          ICLogger.i(var13.toString());\r
-        }\r
-\r
-        if (var12.startTimeMillis <= var1 && var12.endTimeMillis > var1) {\r
-          break;\r
-        }\r
-      }\r
-    }\r
-\r
-    return var5;\r
-  }\r
-\r
-  private boolean isStheartRateTime(boolean var1) {\r
-    long var2 = System.currentTimeMillis();\r
-    ArrayList var4 = this.stheartRateList;\r
-    if (this.mTodayWeek == 1) {\r
-      this.mTodayWeek += 7;\r
-    }\r
-\r
-    Iterator var12 = var4.iterator();\r
-\r
-    while(true) {\r
-      if (var12.hasNext()) {\r
-        StheartRate var5 = (StheartRate)var12.next();\r
-        String var6 = var5.week;\r
-        StringBuilder var7 = new StringBuilder();\r
-        var7.append(this.mTodayWeek - 1);\r
-        var7.append("");\r
-        if (!var6.contains(var7.toString())) {\r
-          continue;\r
-        }\r
-\r
-        long var8 = var5.startTimeMillis - var2;\r
-        int var10;\r
-        int var11;\r
-        if (var8 < (long)(CoreService.alarmCycle * 60 * 1000) && var8 > 0L) {\r
-          var10 = Integer.parseInt(var5.start.substring(2, 4));\r
-          var11 = Integer.parseInt(var5.start.substring(5, 7));\r
-          AlarmHelper.setTimeAlarm(this.mContext, var10, var11, "com.enqualcomm.support.OTHER_HEARTRATE_ALARM_START");\r
-        }\r
-\r
-        var8 = var5.endTimeMillis - var2;\r
-        if (var8 < (long)(CoreService.alarmCycle * 60 * 1000) && var8 > 0L) {\r
-          var10 = Integer.parseInt(var5.end.substring(2, 4));\r
-          var11 = Integer.parseInt(var5.end.substring(5, 7));\r
-          AlarmHelper.setTimeAlarm(this.mContext, var10, var11, "com.enqualcomm.support.OTHER_HEARTRATE_ALARM_END");\r
-        }\r
-\r
-        if (var5.startTimeMillis > var2 || var5.endTimeMillis <= var2) {\r
-          continue;\r
-        }\r
-\r
-        this.mInterval = var5.interval;\r
-        if (!var1) {\r
-//          AlarmHelper.setRealTimeAlarm(this.mContext, Integer.parseInt(this.mInterval), ACTION_HEATR_RATE_START);\r
-//          this.mRuntime.getContextProxy().sendStheartRateBroadcast(ACTION_HEATR_RATE_START, 0);\r
-        }\r
-\r
-        var1 = true;\r
-        break;\r
-      }\r
-\r
-      var1 = false;\r
-      break;\r
-    }\r
-\r
-    return var1;\r
-  }\r
-\r
-  private void onSilentStateChange(boolean var1) {\r
-    if (this.alarms != null) {\r
-      if (var1) {\r
-        this.cancelAlarm(this.alarms);\r
-      } else {\r
-        this.setNewAlarm(this.alarms);\r
-      }\r
-    }\r
-\r
-    if (this.voiceNotice != null) {\r
-      if (var1) {\r
-        this.cancelNoticeAlarm(this.voiceNotice);\r
-      } else {\r
-        this.setNewNoticeAlarm(this.voiceNotice);\r
-      }\r
-    }\r
-\r
-  }\r
-\r
-  private ArrayList<Alarm> queryAlarm() {\r
-    ArrayList var1 = this.mDbHelper.queryAlarm();\r
-    if (!this.mInSilent) {\r
-      if (this.alarms != null) {\r
-        this.cancelAlarm(this.alarms);\r
-      }\r
-\r
-      this.setNewAlarm(var1);\r
-    }\r
-\r
-    return var1;\r
-  }\r
-\r
-  private ArrayList<Antioff> queryAntioff() {\r
-    return this.mDbHelper.queryAntioff(true);\r
-  }\r
-\r
-  private ArrayList<NoticeContent> queryNotice() {\r
-    String var1 = TimeUtil.getSystemTime4();\r
-    ArrayList var2 = this.mDbHelper.queryNotice(var1);\r
-    if (!this.mInSilent) {\r
-      if (this.voiceNotice != null) {\r
-        this.cancelNoticeAlarm(this.voiceNotice);\r
-      }\r
-\r
-      this.setNewNoticeAlarm(var2);\r
-    }\r
-\r
-    return var2;\r
-  }\r
-\r
-  private ArrayList<Silent> querySilent() {\r
-    return this.mDbHelper.querySilence(true);\r
-  }\r
-\r
-  private ArrayList<StheartRate> queryStheartRate() {\r
-    return this.mDbHelper.queryStheartRate(true);\r
-  }\r
-\r
-  private void setNewAlarm(ArrayList<Alarm> alarmArrayList) {\r
-    Calendar calendar = Calendar.getInstance();\r
-    calendar.set(Calendar.SECOND, 0);\r
-    long currentTime = System.currentTimeMillis();\r
-    Iterator itAlarm = alarmArrayList.iterator();\r
-\r
-\r
-    while (itAlarm.hasNext()){\r
-      Alarm alarm = (Alarm)itAlarm.next();\r
-      if ("ON".equals(alarm.status)) {\r
-        int hour = Integer.parseInt(alarm.time.substring(2, 4));\r
-        int minute = Integer.parseInt(alarm.time.substring(5, 7));\r
-        calendar.set(Calendar.HOUR_OF_DAY, hour);\r
-        calendar.set(Calendar.MINUTE, minute);\r
-\r
-        char[] weeklist = alarm.week.toCharArray();\r
-        int weeklistlen = weeklist.length;\r
-        ICLogger.i("repeat = "+alarm.week+", list size = "+weeklistlen);\r
-        if (weeklistlen>1) {\r
-          //如果week大于0 则证明有循环,没有循环就证明只是一次的闹铃。\r
-          for (int i = 1; i < weeklistlen; i++) {\r
-\r
-            long tmpTimeInMillis;\r
-            int dayofweek = weeklist[i] - 47;\r
-            calendar.set(Calendar.DAY_OF_WEEK, dayofweek);\r
-            tmpTimeInMillis = calendar.getTimeInMillis();\r
-            if (tmpTimeInMillis <= currentTime) {\r
-              tmpTimeInMillis += ONE_WEEK;\r
-            }\r
-              Date date = new Date(tmpTimeInMillis);\r
-              ICLogger.i("set date "+date.toLocaleString());\r
-            PendingIntent pendingIntent = this.getPendingIntent(alarm.time, alarm.week, alarm.ring, alarm.name, dayofweek);\r
-            AlarmHelper.setAlarm(this.mAlarmManager, tmpTimeInMillis, pendingIntent);\r
-          }\r
-        }else{\r
-          //只是一次的闹铃\r
-          long tmpTimeInMillis;\r
-//          int dayofweek = weeklist[i] - 47;\r
-//          calendar.set(Calendar.DAY_OF_WEEK, dayofweek);\r
-//          tmpTimeInMillis = calendar.getTimeInMillis();\r
-\r
-            Date date = new Date(System.currentTimeMillis());\r
-            ICLogger.i("date "+date.toLocaleString());\r
-            Calendar c = Calendar.getInstance();\r
-            c.setTime(date);\r
-            int wek = c.get(Calendar.DAY_OF_WEEK);\r
-            calendar.set(Calendar.DAY_OF_WEEK, wek);\r
-            tmpTimeInMillis = calendar.getTimeInMillis();\r
-            if (tmpTimeInMillis <= currentTime) {\r
-              tmpTimeInMillis += ONE_DAY;\r
-            }\r
-          date = new Date(tmpTimeInMillis);\r
-            c = Calendar.getInstance();\r
-          c.setTime(date);\r
-          wek = c.get(Calendar.DAY_OF_WEEK);\r
-\r
-            ICLogger.i("set date "+date.toLocaleString());\r
-\r
-            PendingIntent pendingIntent = this.getPendingIntent(alarm.time, alarm.week, alarm.ring, alarm.name, wek);\r
-          AlarmHelper.setAlarmOnce(this.mAlarmManager, tmpTimeInMillis, pendingIntent);\r
-        }\r
-\r
-      }\r
-    }\r
-  }\r
-\r
-  private void setNewNoticeAlarm(ArrayList<NoticeContent> var1) {\r
-    Iterator var19 = var1.iterator();\r
-\r
-    while(var19.hasNext()) {\r
-      NoticeContent var2 = (NoticeContent)var19.next();\r
-      String var3 = var2.noticeTime;\r
-      String var4 = var2.noticeName;\r
-      String var5 = var2.noticeNumber;\r
-      String var6 = var2.noticeID;\r
-      String var7 = var2.noticeCategory;\r
-      String var8 = var2.noticeFrequency;\r
-      String var9 = var2.noticeContent;\r
-      Calendar var10 = Calendar.getInstance();\r
-      long var11 = System.currentTimeMillis();\r
-      var10.set(Calendar.SECOND, 0);\r
-      if (var3 != null) {\r
-        String var13 = var3.substring(0, 4);\r
-        String var20 = var3.substring(4, 6);\r
-        String var14 = var3.substring(6, 8);\r
-        String var15 = var3.substring(8, 10);\r
-        String var16 = var3.substring(10, 12);\r
-        var10.set(Calendar.YEAR, Integer.parseInt(var13));\r
-        var10.set(Calendar.MONTH, Integer.parseInt(var20) - 1);\r
-        var10.set(Calendar.DATE, Integer.parseInt(var14));\r
-        var10.set(Calendar.HOUR_OF_DAY, Integer.parseInt(var15));\r
-        var10.set(Calendar.MINUTE, Integer.parseInt(var16));\r
-        long var17 = var10.getTimeInMillis();\r
-        if (var17 >= var11) {\r
-          PendingIntent var21 = this.getPendingIntent(var3, var4, var5, var6, var7, var8, var9);\r
-          AlarmHelper.setAlarm(this.mAlarmManager, var17, var21);\r
-        }\r
-      }\r
-    }\r
-\r
-  }\r
-\r
-  public void onAlarmClock(Connection var1, Runtime var2) {\r
-    this.handleSilent(var2, true);\r
-  }\r
-\r
-  public void onAttach(Connection var1, Runtime var2) {\r
-    this.mRuntime = var2;\r
-    this.mConnection = var1;\r
-    this.mContext = var2.getContextProxy().context;\r
-    this.mAlarmManager = (AlarmManager)this.mContext.getSystemService(Context.ALARM_SERVICE);\r
-    this.mDbHelper = var2.getDbHelper();\r
-    this.silentList = this.querySilent();\r
-    this.getSilentListStartAndEndTime();\r
-    this.mInSilent = this.isSilentTime();\r
-    DBHelper var3 = this.mDbHelper;\r
-    String var4;\r
-    if (this.mInSilent) {\r
-      var4 = "ON";\r
-    } else {\r
-      var4 = "OFF";\r
-    }\r
-\r
-    var3.upDateorInsertDeviceStatus(var4);\r
-    this.handSilence(this.mContext, this.mInSilent);\r
-    this.stheartRateList = this.queryStheartRate();\r
-    this.getStartAndEndStheartRateTime();\r
-    this.mIsStheartRate = this.isStheartRateTime(false);\r
-    this.alarms = this.queryAlarm();\r
-    this.voiceNotice = this.queryNotice();\r
-    var2.getContextProxy().context.getContentResolver().registerContentObserver(ICContentProvider.SILENT_URI, false, this.mContentObserver);\r
-    this.mAlramReceiver = new SilentManager.AlramReceiver();\r
-    IntentFilter var5 = new IntentFilter();\r
-    var5.addAction("com.enqualcomm.support.ACTION_NOTICE_ALARM_CHANGE");\r
-    var5.addAction("com.enqualcomm.support.ACTION_ALARM_ALARM_CHANGE");\r
-    var5.addAction("com.enqualcomm.support.STHEART_RATE_ALARM_CHANGE");\r
-    var5.addAction("com.eqc.heartrate.action.RESULT");\r
-    this.mContext.registerReceiver(this.mAlramReceiver, var5);\r
-    var2.getContextProxy().getTelephonyManager().listen(this.phoneStateListener, 32);\r
-  }\r
-\r
-  public void onDetach(Connection var1, Runtime var2) {\r
-    var2.getContextProxy().context.getContentResolver().unregisterContentObserver(this.mContentObserver);\r
-    this.mContext.unregisterReceiver(this.mAlramReceiver);\r
-  }\r
-\r
-  @Override\r
-  public boolean onUserRequest(Intent var1, Connection var2, Runtime var3) {\r
-    String action = var1.getAction();\r
-    if (ACTION_CARE_ALARM.equals(action)) {\r
-      String alarmTime = var1.getDataString();  //alarm:ST00.43,W,CON,闹铃,2\r
-      String currentTime = TimeUtil.getSystemTime();\r
-      alarmTime.substring(6).split("\\.");\r
-      int alarmTime_minutes = Integer.parseInt(alarmTime.substring(6).split("\\.")[1].substring(0, 2));\r
-      int alarmTime_hour = Integer.parseInt(alarmTime.substring(6).split("\\.")[0].substring(2));\r
-      String[] currentTimeArray = currentTime.split(";")[1].split(":");\r
-      int currentTime_hour = Integer.parseInt(currentTimeArray[0]);\r
-      int currentTime_minutes = Integer.parseInt(currentTimeArray[1]);\r
-      ICLogger.i("alarm time["+alarmTime_hour+":"+alarmTime_minutes+"], current time["+currentTime_hour+":"+currentTime_minutes+"]");\r
-      if (alarmTime_hour != currentTime_hour || alarmTime_minutes != currentTime_minutes) {\r
-        return false;\r
-      }\r
-\r
-      if (this.isIdle(this.mContext)) {\r
-        try {\r
-          Intent intent = new Intent("com.enqualcomm.icare.ALARM", Uri.parse(alarmTime));\r
-            intent.putExtra("closeAlarm", 0);\r
-            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\r
-          this.mContext.startActivity(intent);\r
-        } catch (Exception e) {\r
-          e.printStackTrace();\r
-          ICLogger.e(e.getMessage(),e);\r
-        }\r
-      }\r
-    } else if ("com.enqualcomm.support.ACTION_NOTICE_ALARM".equals(action)) {\r
-        String alarmTime = var1.getDataString();\r
-      if (this.isIdle(this.mContext)) {\r
-        try {\r
-          var1 = new Intent("com.enqualcomm.icare.NOTICE", Uri.parse(alarmTime));\r
-          var1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\r
-          this.mContext.startActivity(var1);\r
-        } catch (Exception e) {\r
-          e.printStackTrace();\r
-          ICLogger.e(e.getMessage(),e);\r
-        }\r
-      }\r
-    } else {\r
-      ICLogger.i("静默闹钟来了");\r
-      boolean var4;\r
-      if (!"com.eqc.heartrate.action.SILENT_START".equals(action) && !"com.enqualcomm.support.OTHER_HEARTRATE_ALARM_START".equals(action)) {\r
-        var4 = false;\r
-      } else {\r
-        var4 = true;\r
-      }\r
-\r
-      this.handleSilent(var3, var4 ^ true);\r
-    }\r
-\r
-    return false;\r
-  }\r
-\r
-  @Override\r
-  public boolean onUserRequest(Message paramMessage, Connection paramConnection, Runtime paramRuntime) {\r
-    return false;\r
-  }\r
-\r
-  class AlramReceiver extends BroadcastReceiver {\r
-    AlramReceiver() {\r
-    }\r
-\r
-    public void onReceive(Context var1, Intent var2) {\r
-      String var6 = var2.getAction();\r
-      StringBuilder var3 = new StringBuilder();\r
-      var3.append("action = ");\r
-      var3.append(var6);\r
-      ICLogger.i(var3.toString());\r
-      if ("com.enqualcomm.support.ACTION_NOTICE_ALARM_CHANGE".equals(var6)) {\r
-        SilentManager.this.voiceNotice = SilentManager.this.queryNotice();\r
-      } else if ("com.enqualcomm.support.ACTION_ALARM_ALARM_CHANGE".equals(var6)) {\r
-        SilentManager.this.alarms = SilentManager.this.queryAlarm();\r
-      } else if ("com.enqualcomm.support.STHEART_RATE_ALARM_CHANGE".equals(var6)) {\r
-        SilentManager.this.stheartRateList = SilentManager.this.queryStheartRate();\r
-        SilentManager.this.getStartAndEndStheartRateTime();\r
-        SilentManager.this.isStheartRateTime(false);\r
-      } else if ("com.eqc.heartrate.action.RESULT".equals(var6)) {\r
-        var6 = var2.getStringExtra("time");\r
-        int var4 = var2.getIntExtra("value", 0);\r
-        int var5 = var2.getIntExtra("type", 0);\r
-        StringBuilder var7 = new StringBuilder();\r
-        var7.append("(");\r
-        var7.append(var6);\r
-        var7.append("@");\r
-        var7.append(var4);\r
-        var7.append("@");\r
-        var7.append(var5);\r
-        var7.append(")");\r
-        var6 = var7.toString();\r
-//        SilentManager.this.mConnection.send(API.H60(SilentManager.this.mRuntime, var6));\r
-      } else if ("com.enqualcomm.support.ACTION_ANTIOFF_ALARM_CHANGE".equals(var6)) {\r
-        SilentManager.this.sAntioffList = SilentManager.this.queryAntioff();\r
-        SilentManager.this.getStartAndEndSantioffTime();\r
-        SilentManager.this.mIsNeedAntioff = SilentManager.this.isAntioffTime(false);\r
-      }\r
-\r
-    }\r
-  }\r
+package com.enqualcomm.support.service;
+
+import android.app.AlarmManager;
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.Message;
+import android.os.Messenger;
+import android.telephony.PhoneStateListener;
+import android.telephony.PreciseCallState;
+import android.telephony.TelephonyManager;
+
+import com.enqualcomm.support.Config;
+import com.enqualcomm.support.CoreService;
+import com.enqualcomm.support.ICContentProvider;
+import com.enqualcomm.support.MainActivity;
+import com.enqualcomm.support.bean.Alarm;
+import com.enqualcomm.support.bean.Antioff;
+import com.enqualcomm.support.bean.NoticeContent;
+import com.enqualcomm.support.bean.Runtime;
+import com.enqualcomm.support.bean.Silent;
+import com.enqualcomm.support.bean.StheartRate;
+
+import com.enqualcomm.support.service.base.AbstractInvokeHandlerService;
+import com.enqualcomm.support.utils.AlarmHelper;
+import com.enqualcomm.support.utils.Connection;
+import com.enqualcomm.support.utils.DBHelper;
+import com.enqualcomm.support.utils.ICAudioManager;
+import com.enqualcomm.support.utils.ICLogger;
+import com.enqualcomm.support.utils.MissedCallContentObserver;
+import com.enqualcomm.support.utils.SharPreferenceUtil;
+import com.enqualcomm.support.utils.TimeUtil;
+import com.enqualcomm.support.utils.Util;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.concurrent.TimeUnit;
+
+import static android.telephony.TelephonyManager.ACTION_PHONE_STATE_CHANGED;
+import static android.telephony.TelephonyManager.CALL_STATE_OFFHOOK;
+import static android.telephony.TelephonyManager.CALL_STATE_RINGING;
+import static com.enqualcomm.support.Constants.ACTION_CARE_ALARM;
+import static com.enqualcomm.support.Constants.ACTION_CLOSE_UNREAD_MSG;
+import static com.enqualcomm.support.Constants.ACTION_HEATR_RATE_START;
+import static com.enqualcomm.support.Constants.SERVICE_CLS_NAME;
+import static com.enqualcomm.support.Constants.SERVICE_PKG_NAME;
+
+public class SilentManager extends AbstractInvokeHandlerService {
+  private static final long ONE_WEEK = 604800000L;
+  private static final long ONE_DAY = 86400000L;
+
+  private ArrayList<Alarm> alarms;
+  private boolean haveHandSilence;
+  private boolean isCalling;
+  AlarmManager mAlarmManager;
+  private SilentManager.AlramReceiver mAlramReceiver;
+  Connection mConnection;
+  ContentObserver mContentObserver = new ContentObserver(new Handler()) {
+    public void onChange(boolean var1) {
+      ICLogger.i("静默有变化");
+      SilentManager.this.silentList = SilentManager.this.querySilent();
+      SilentManager.this.getSilentListStartAndEndTime();
+      SilentManager.this.handleSilent(mRuntime, true);
+    }
+  };
+  private Context mContext;
+  private DBHelper mDbHelper;
+  private boolean mInSilent;
+  private String mInterval;
+  private boolean mIsNeedAntioff;
+  private boolean mIsStheartRate;
+  private MissedCallContentObserver mMissedCallContentObserver;
+  Runtime mRuntime;
+  private int mStheartRateInterval;
+  private int mTodayWeek;
+  private boolean mValue_isSilence;
+
+  public static final int PRECISE_CALL_STATE_NOT_VALID = -1;
+  public static final int PRECISE_CALL_STATE_IDLE = 0;  //空闲
+  public static final int PRECISE_CALL_STATE_ACTIVE = 1; //正在通话
+  public static final int PRECISE_CALL_STATE_HOLDING = 2; //通话挂起
+  public static final int PRECISE_CALL_STATE_DIALING = 3; //拨号开始
+  public static final int PRECISE_CALL_STATE_ALERTING = 4; //正在呼出
+  public static final int PRECISE_CALL_STATE_INCOMING = 5; //对方来电
+  public static final int PRECISE_CALL_STATE_WAITING = 6; //第三方来电等待
+  public static final int PRECISE_CALL_STATE_DISCONNECTED = 7; //挂断完成
+  public static final int PRECISE_CALL_STATE_DISCONNECTING = 8; //正在挂断
+
+  private static SilentManager mSilentManger=null;
+
+  public static SilentManager getInstance(){
+    if (mSilentManger==null)
+      mSilentManger=new SilentManager();
+    return mSilentManger;
+  }
+  private PhoneStateListener phoneStateListener = new PhoneStateListener() {
+    public void onCallStateChanged(int state, String incomingNumber) {
+      super.onCallStateChanged(state, incomingNumber);
+
+      ICLogger.i("========onCallStateChanged state "+state+", incomingNumber "+incomingNumber);
+      switch(state) {
+        case PRECISE_CALL_STATE_DISCONNECTING: //挂电话
+        case PRECISE_CALL_STATE_DISCONNECTED: //挂电话
+          isCalling = false;
+//          if (SilentManager.this.haveHandSilence) {
+//            SilentManager.this.handSilence(SilentManager.this.mContext, SilentManager.this.mValue_isSilence);
+//          }
+          if(ICAudioManager.needMute==true)
+          {
+//            ICAudioManager.restoreVolumn(mContext); //2秒后恢复音量
+            new Handler().postDelayed(new Runnable() {
+              @Override
+              public void run() {
+                ICAudioManager.restoreVolumn(mContext); //2秒后恢复音量
+                ICAudioManager.needMute=false;
+              }
+            },2000);
+          }
+          ICLogger.i("========Hung up!");
+          break;
+        case PRECISE_CALL_STATE_INCOMING: //来电
+        case PRECISE_CALL_STATE_ALERTING:
+        case PRECISE_CALL_STATE_DIALING:
+          isCalling = true;
+          Intent var3 = new Intent();
+          var3.setAction(ACTION_CLOSE_UNREAD_MSG);
+          mContext.sendBroadcast(var3);
+
+          ICLogger.i("========Ring!");
+          if(ICAudioManager.needMute==true)
+          {
+            ICAudioManager.setVolumnMute(mContext);
+            new Handler().postDelayed(new Runnable() {
+              @Override
+              public void run() {
+                ICAudioManager.setVolumnMute(mContext); //2秒后恢复音量
+              }
+            },2000);
+
+          }
+          break;
+        case PRECISE_CALL_STATE_ACTIVE://接电话
+        {
+          if (ICAudioManager.needMute == false){
+            if (Config.custom_name.equals("AK"))
+              ICAudioManager.setVoiceCallMaxVolumn(mContext); //设置最大音量
+          }
+        }
+        case PRECISE_CALL_STATE_HOLDING://接电话
+        case PRECISE_CALL_STATE_WAITING:
+          isCalling = true;
+          ICLogger.i("========Answer Call !");
+          if(ICAudioManager.needMute==true)
+          {
+            ICAudioManager.setVolumnMute(mContext);
+            new Handler().postDelayed(new Runnable() {
+              @Override
+              public void run() {
+                ICAudioManager.setVolumnMute(mContext); //2秒后恢复音量
+              }
+            },2000);
+          }
+
+      }
+
+    }
+  };
+  private ArrayList<Antioff> sAntioffList;
+  private ArrayList<Silent> silentList;
+  private ArrayList<StheartRate> stheartRateList;
+  private ArrayList<NoticeContent> voiceNotice;
+
+  public SilentManager() {
+  }
+
+  private void callback(Messenger var1, boolean var2) {
+    short var3;
+    if (var2) {
+      var3 = 600;
+    } else {
+      var3 = 700;
+    }
+
+    if (var1 != null) {
+      try {
+        var1.send(Message.obtain((Handler)null, var3));
+      } catch (Exception e) {
+        e.printStackTrace();
+        ICLogger.e(e.getMessage(),e);
+      }
+    }
+
+  }
+
+  private void cancelAlarm(ArrayList<Alarm> var1) {
+    Iterator var2 = var1.iterator();
+
+    while(var2.hasNext()) {
+      Alarm var3 = (Alarm)var2.next();
+      String var10 = var3.time;
+      String var4 = var3.week;
+      String var5 = var3.ring;
+      String var11 = var3.name;
+      char[] var6 = var4.toCharArray();
+      int var7 = var6.length;
+
+      for(int var8 = 1; var8 < var7; ++var8) {
+        char var9 = var6[var8];
+        this.mAlarmManager.cancel(this.getPendingIntent(var10, var4, var5, var11, var9 - 47));
+      }
+    }
+
+  }
+
+  private void cancelNoticeAlarm(ArrayList<NoticeContent> var1) {
+    Iterator var2 = var1.iterator();
+
+    while(var2.hasNext()) {
+      NoticeContent var3 = (NoticeContent)var2.next();
+      String var4 = var3.noticeTime;
+      String var9 = var3.noticeName;
+      String var5 = var3.noticeNumber;
+      String var6 = var3.noticeID;
+      String var7 = var3.noticeCategory;
+      String var8 = var3.noticeFrequency;
+      String var10 = var3.noticeContent;
+      this.mAlarmManager.cancel(this.getPendingIntent(var4, var9, var5, var6, var7, var8, var10));
+    }
+
+  }
+
+  private PendingIntent getPendingIntent(String var1, String var2, String var3, String var4, int var5) {
+    StringBuilder var6 = new StringBuilder("alarm:");
+    var6.append(var1);
+    var6.append(",");
+    var6.append(var2);
+    var6.append(",");
+    var6.append(var3);
+    var6.append(",");
+    var6.append(var4);
+    var6.append(",");
+    var6.append(var5);
+    var2 = var6.toString();
+    Intent intent = new Intent(this.mContext, CoreService.class);
+    intent.setAction(ACTION_CARE_ALARM);
+    intent.setData(Uri.parse(var2));
+    return PendingIntent.getService(this.mContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
+  }
+
+  private PendingIntent getPendingIntent(String var1, String var2, String var3, String var4, String var5, String var6, String var7) {
+    StringBuilder var8 = new StringBuilder("notice:");
+    var8.append(var1);
+    var8.append(",");
+    var8.append(var2);
+    var8.append(",");
+    var8.append(var3);
+    var8.append(",");
+    var8.append(var4);
+    var8.append(",");
+    var8.append(var5);
+    var8.append(",");
+    var8.append(var6);
+    var8.append(",");
+    var8.append(var7);
+    var1 = var8.toString();
+    Intent var9 = new Intent(this.mContext, CoreService.class);
+    var9.setAction("com.enqualcomm.support.ACTION_NOTICE_ALARM");
+    var9.setData(Uri.parse(var1));
+    return PendingIntent.getService(this.mContext, 0, var9, PendingIntent.FLAG_UPDATE_CURRENT);
+  }
+
+  private void getSilentListStartAndEndTime() {
+    Calendar var1 = Calendar.getInstance();
+    this.mTodayWeek = var1.get(Calendar.DAY_OF_WEEK);
+
+    Silent var3;
+    for(Iterator var2 = this.silentList.iterator(); var2.hasNext(); var3.endTimeMillis = var1.getTimeInMillis()) {
+      var3 = (Silent)var2.next();
+      var1.set(Calendar.SECOND, 0);
+      int var4 = Integer.parseInt(var3.start.substring(2, 4));
+      int var5 = Integer.parseInt(var3.start.substring(5, 7));
+      var1.set(Calendar.HOUR_OF_DAY, var4);
+      var1.set(Calendar.MINUTE, var5);
+      var3.startTimeMillis = var1.getTimeInMillis();
+      var5 = Integer.parseInt(var3.end.substring(2, 4));
+      var4 = Integer.parseInt(var3.end.substring(5, 7));
+      var1.set(Calendar.HOUR_OF_DAY, var5);
+      var1.set(Calendar.MINUTE, var4);
+    }
+
+  }
+
+  private void getStartAndEndSantioffTime() {
+    Calendar var1 = Calendar.getInstance();
+    this.mTodayWeek = var1.get(Calendar.DAY_OF_WEEK);
+
+    Antioff var3;
+    for(Iterator var2 = this.sAntioffList.iterator(); var2.hasNext(); var3.endTimeMillis = var1.getTimeInMillis()) {
+      var3 = (Antioff)var2.next();
+      var1.set(Calendar.SECOND, 0);
+      int var4 = Integer.parseInt(var3.start.substring(2, 4));
+      int var5 = Integer.parseInt(var3.start.substring(5, 7));
+      var1.set(Calendar.HOUR_OF_DAY, var4);
+      var1.set(Calendar.MINUTE, var5);
+      var3.startTimeMillis = var1.getTimeInMillis();
+      var4 = Integer.parseInt(var3.end.substring(2, 4));
+      var5 = Integer.parseInt(var3.end.substring(5, 7));
+      var1.set(Calendar.HOUR_OF_DAY, var4);
+      var1.set(Calendar.MINUTE, var5);
+    }
+
+  }
+
+  private void getStartAndEndStheartRateTime() {
+    Calendar var1 = Calendar.getInstance();
+    this.mTodayWeek = var1.get(Calendar.DAY_OF_WEEK);
+
+    StheartRate var3;
+    for(Iterator var2 = this.stheartRateList.iterator(); var2.hasNext(); var3.endTimeMillis = var1.getTimeInMillis()) {
+      var3 = (StheartRate)var2.next();
+      var1.set(Calendar.SECOND, 0);
+      int var4 = Integer.parseInt(var3.start.substring(2, 4));
+      int var5 = Integer.parseInt(var3.start.substring(5, 7));
+      var1.set(Calendar.HOUR_OF_DAY, var4);
+      var1.set(Calendar.MINUTE, var5);
+      var3.startTimeMillis = var1.getTimeInMillis();
+      var4 = Integer.parseInt(var3.end.substring(2, 4));
+      var5 = Integer.parseInt(var3.end.substring(5, 7));
+      var1.set(Calendar.HOUR_OF_DAY, var4);
+      var1.set(Calendar.MINUTE, var5);
+    }
+
+  }
+
+  private void handSilence(Context var1, boolean var2) {
+    this.mValue_isSilence = var2;
+    if (this.isCalling) {
+      this.haveHandSilence = true;
+    } else {
+      this.haveHandSilence = false;
+      SharPreferenceUtil.setPrefBoolean(var1, "KEY_ISSILENCE", var2);
+      Intent var3 = new Intent();
+      var3.setAction("com.enqualcomm.support.ACTION_ISSILENCE2IMESSAGE");
+      var3.putExtra("KEY_ISSILENCE", var2);
+      var1.sendBroadcast(var3);
+      ComponentName var4 = new ComponentName(SERVICE_PKG_NAME, SERVICE_CLS_NAME);
+      Intent var5 = (new Intent("com.enqualcomm.support.ACTION_VIDEO_END_CALL")).setComponent(var4);
+      this.mRuntime.getContextProxy().context.startService(var5);
+    }
+  }
+
+  private void handleSilent(Runtime var1, boolean var2) {
+    int var3 = Calendar.getInstance().get(Calendar.DAY_OF_WEEK);
+    if (var3 != this.mTodayWeek && (var3 != 1 || this.mTodayWeek != 8)) {
+      this.getSilentListStartAndEndTime();
+      this.queryNotice();
+    }
+
+    boolean var4 = this.isSilentTime();
+    StringBuilder var5 = new StringBuilder();
+    var5.append("inSilent=");
+    var5.append(var4);
+    ICLogger.i(var5.toString());
+    if (!this.mInSilent && var4) {
+      this.onSilentStateChange(true);
+      this.handSilence(this.mContext, true);
+      this.mDbHelper.upDateStatus("ON");
+    } else if (this.mInSilent && !var4) {
+      this.onSilentStateChange(false);
+      this.mDbHelper.upDateStatus("OFF");
+      this.handSilence(this.mContext, false);
+    }
+
+    this.mInSilent = var4;
+    this.getStartAndEndStheartRateTime();
+    this.isStheartRateTime(var2);
+  }
+
+  private boolean isIdle(Context context) {
+    int callstate = ((TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE)).getCallState();
+    boolean isidle;
+    if (CALL_STATE_RINGING != callstate && CALL_STATE_OFFHOOK != callstate) {
+      isidle = true;
+    } else {
+      isidle = false;
+    }
+
+    return isidle && !this.mInSilent && !this.mRuntime.getBatteryLow();
+  }
+
+  private boolean isAntioffTime(boolean var1) {
+    long var2 = System.currentTimeMillis();
+    ArrayList var4 = this.sAntioffList;
+    int var5 = this.mTodayWeek;
+    var1 = true;
+    if (var5 == 1) {
+      this.mTodayWeek += 7;
+    }
+
+    Iterator var12 = var4.iterator();
+
+    while(true) {
+      if (!var12.hasNext()) {
+        var1 = false;
+        break;
+      }
+
+      Antioff var6 = (Antioff)var12.next();
+      String var7 = var6.week;
+      StringBuilder var8 = new StringBuilder();
+      var8.append(this.mTodayWeek - 1);
+      var8.append("");
+      if (var7.contains(var8.toString())) {
+        long var9 = var6.startTimeMillis - var2;
+        int var11;
+        if (var9 < (long)(CoreService.alarmCycle * 60 * 1000) && var9 > 0L) {
+          var11 = Integer.parseInt(var6.start.substring(2, 4));
+          var5 = Integer.parseInt(var6.start.substring(5, 7));
+          AlarmHelper.setTimeAlarm(this.mContext, var11, var5, "com.enqualcomm.support.OTHER_ALARM_START");
+          var8 = new StringBuilder();
+          var8.append("设置起始时间=hour");
+          var8.append(var11);
+          var8.append("minute+");
+          var8.append(var5);
+          ICLogger.i(var8.toString());
+        }
+
+        var9 = var6.endTimeMillis - var2;
+        if (var9 < (long)(CoreService.alarmCycle * 60 * 1000) && var9 > 0L) {
+          var11 = Integer.parseInt(var6.end.substring(2, 4));
+          var5 = Integer.parseInt(var6.end.substring(5, 7));
+          AlarmHelper.setTimeAlarm(this.mContext, var11, var5, "com.enqualcomm.support.OTHER_ALARM_END");
+          var8 = new StringBuilder();
+          var8.append("设置结束时间=hour");
+          var8.append(var11);
+          var8.append("minute+");
+          var8.append(var5);
+          ICLogger.i(var8.toString());
+        }
+
+        if (var6.startTimeMillis <= var2 && var6.endTimeMillis > var2) {
+          break;
+        }
+      }
+    }
+
+    this.mRuntime.setNeedAntioff(var1);
+    return var1;
+  }
+
+  private boolean isSilentTime() {
+    long var1 = System.currentTimeMillis();
+    ArrayList var3 = this.silentList;
+    int var4 = this.mTodayWeek;
+    boolean var5 = false; //默认不在silent时间段
+    if (var4 == 1) {
+      this.mTodayWeek += 7;
+    }
+
+    Iterator var6 = var3.iterator();
+
+    while(true) {
+      if (!var6.hasNext()) {
+        var5 = false;
+        break;
+      }
+
+      Silent var12 = (Silent)var6.next();
+      String var7 = var12.week;
+      StringBuilder var8 = new StringBuilder();
+      var8.append(this.mTodayWeek - 1);
+      var8.append("");
+      if (var7.contains(var8.toString())) {
+        long var9 = var12.startTimeMillis - var1;
+        int var11;
+        StringBuilder var13;
+        if (var9 < (long)(CoreService.alarmCycle * 60 * 1000) && var9 > 0L) {
+          var11 = Integer.parseInt(var12.start.substring(2, 4));
+          var4 = Integer.parseInt(var12.start.substring(5, 7));
+          AlarmHelper.setTimeAlarm(this.mContext, var11, var4, "com.enqualcomm.support.OTHER_ALARM_START");
+          var13 = new StringBuilder();
+          var13.append("设置起始时间=hour");
+          var13.append(var11);
+          var13.append("minute+");
+          var13.append(var4);
+          ICLogger.i(var13.toString());
+        }
+
+        var9 = var12.endTimeMillis - var1;
+        if (var9 < (long)(CoreService.alarmCycle * 60 * 1000) && var9 > 0L) {
+          var11 = Integer.parseInt(var12.end.substring(2, 4));
+          var4 = Integer.parseInt(var12.end.substring(5, 7));
+          AlarmHelper.setTimeAlarm(this.mContext, var11, var4, "com.enqualcomm.support.OTHER_ALARM_END");
+          var13 = new StringBuilder();
+          var13.append("设置结束时间=hour");
+          var13.append(var11);
+          var13.append("minute+");
+          var13.append(var4);
+          ICLogger.i(var13.toString());
+        }
+
+        if (var12.startTimeMillis <= var1 && var12.endTimeMillis > var1) {
+          break;
+        }
+      }
+    }
+
+    return var5;
+  }
+
+  private boolean isStheartRateTime(boolean var1) {
+    long var2 = System.currentTimeMillis();
+    ArrayList var4 = this.stheartRateList;
+    if (this.mTodayWeek == 1) {
+      this.mTodayWeek += 7;
+    }
+
+    Iterator var12 = var4.iterator();
+
+    while(true) {
+      if (var12.hasNext()) {
+        StheartRate var5 = (StheartRate)var12.next();
+        String var6 = var5.week;
+        StringBuilder var7 = new StringBuilder();
+        var7.append(this.mTodayWeek - 1);
+        var7.append("");
+        if (!var6.contains(var7.toString())) {
+          continue;
+        }
+
+        long var8 = var5.startTimeMillis - var2;
+        int var10;
+        int var11;
+        if (var8 < (long)(CoreService.alarmCycle * 60 * 1000) && var8 > 0L) {
+          var10 = Integer.parseInt(var5.start.substring(2, 4));
+          var11 = Integer.parseInt(var5.start.substring(5, 7));
+          AlarmHelper.setTimeAlarm(this.mContext, var10, var11, "com.enqualcomm.support.OTHER_HEARTRATE_ALARM_START");
+        }
+
+        var8 = var5.endTimeMillis - var2;
+        if (var8 < (long)(CoreService.alarmCycle * 60 * 1000) && var8 > 0L) {
+          var10 = Integer.parseInt(var5.end.substring(2, 4));
+          var11 = Integer.parseInt(var5.end.substring(5, 7));
+          AlarmHelper.setTimeAlarm(this.mContext, var10, var11, "com.enqualcomm.support.OTHER_HEARTRATE_ALARM_END");
+        }
+
+        if (var5.startTimeMillis > var2 || var5.endTimeMillis <= var2) {
+          continue;
+        }
+
+        this.mInterval = var5.interval;
+        if (!var1) {
+//          AlarmHelper.setRealTimeAlarm(this.mContext, Integer.parseInt(this.mInterval), ACTION_HEATR_RATE_START);
+//          this.mRuntime.getContextProxy().sendStheartRateBroadcast(ACTION_HEATR_RATE_START, 0);
+        }
+
+        var1 = true;
+        break;
+      }
+
+      var1 = false;
+      break;
+    }
+
+    return var1;
+  }
+
+  private void onSilentStateChange(boolean var1) {
+    if (this.alarms != null) {
+      if (var1) {
+        this.cancelAlarm(this.alarms);
+      } else {
+        this.setNewAlarm(this.alarms);
+      }
+    }
+
+    if (this.voiceNotice != null) {
+      if (var1) {
+        this.cancelNoticeAlarm(this.voiceNotice);
+      } else {
+        this.setNewNoticeAlarm(this.voiceNotice);
+      }
+    }
+
+  }
+
+  private ArrayList<Alarm> queryAlarm() {
+    ArrayList var1 = this.mDbHelper.queryAlarm();
+    if (!this.mInSilent) {
+      if (this.alarms != null) {
+        this.cancelAlarm(this.alarms);
+      }
+
+      this.setNewAlarm(var1);
+    }
+
+    return var1;
+  }
+
+  private ArrayList<Antioff> queryAntioff() {
+    return this.mDbHelper.queryAntioff(true);
+  }
+
+  private ArrayList<NoticeContent> queryNotice() {
+    String var1 = TimeUtil.getSystemTime4();
+    ArrayList var2 = this.mDbHelper.queryNotice(var1);
+    if (!this.mInSilent) {
+      if (this.voiceNotice != null) {
+        this.cancelNoticeAlarm(this.voiceNotice);
+      }
+
+      this.setNewNoticeAlarm(var2);
+    }
+
+    return var2;
+  }
+
+  private ArrayList<Silent> querySilent() {
+    return this.mDbHelper.querySilence(true);
+  }
+
+  private ArrayList<StheartRate> queryStheartRate() {
+    return this.mDbHelper.queryStheartRate(true);
+  }
+
+  private void setNewAlarm(ArrayList<Alarm> alarmArrayList) {
+    Calendar calendar = Calendar.getInstance();
+    calendar.set(Calendar.SECOND, 0);
+    long currentTime = System.currentTimeMillis();
+    Iterator itAlarm = alarmArrayList.iterator();
+
+
+    while (itAlarm.hasNext()){
+      Alarm alarm = (Alarm)itAlarm.next();
+      if ("ON".equals(alarm.status)) {
+        int hour = Integer.parseInt(alarm.time.substring(2, 4));
+        int minute = Integer.parseInt(alarm.time.substring(5, 7));
+        calendar.set(Calendar.HOUR_OF_DAY, hour);
+        calendar.set(Calendar.MINUTE, minute);
+
+        char[] weeklist = alarm.week.toCharArray();
+        int weeklistlen = weeklist.length;
+        ICLogger.i("repeat = "+alarm.week+", list size = "+weeklistlen);
+        if (weeklistlen>1) {
+          //如果week大于0 则证明有循环,没有循环就证明只是一次的闹铃。
+          for (int i = 1; i < weeklistlen; i++) {
+
+            long tmpTimeInMillis;
+            int dayofweek = weeklist[i] - 47;
+            calendar.set(Calendar.DAY_OF_WEEK, dayofweek);
+            tmpTimeInMillis = calendar.getTimeInMillis();
+            if (tmpTimeInMillis <= currentTime) {
+              tmpTimeInMillis += ONE_WEEK;
+            }
+              Date date = new Date(tmpTimeInMillis);
+              ICLogger.i("set date "+date.toLocaleString());
+            PendingIntent pendingIntent = this.getPendingIntent(alarm.time, alarm.week, alarm.ring, alarm.name, dayofweek);
+            AlarmHelper.setAlarm(this.mAlarmManager, tmpTimeInMillis, pendingIntent);
+          }
+        }else{
+          //只是一次的闹铃
+          long tmpTimeInMillis;
+//          int dayofweek = weeklist[i] - 47;
+//          calendar.set(Calendar.DAY_OF_WEEK, dayofweek);
+//          tmpTimeInMillis = calendar.getTimeInMillis();
+
+            Date date = new Date(System.currentTimeMillis());
+            ICLogger.i("date "+date.toLocaleString());
+            Calendar c = Calendar.getInstance();
+            c.setTime(date);
+            int wek = c.get(Calendar.DAY_OF_WEEK);
+            calendar.set(Calendar.DAY_OF_WEEK, wek);
+            tmpTimeInMillis = calendar.getTimeInMillis();
+            if (tmpTimeInMillis <= currentTime) {
+              tmpTimeInMillis += ONE_DAY;
+            }
+          date = new Date(tmpTimeInMillis);
+            c = Calendar.getInstance();
+          c.setTime(date);
+          wek = c.get(Calendar.DAY_OF_WEEK);
+
+            ICLogger.i("set date "+date.toLocaleString());
+
+            PendingIntent pendingIntent = this.getPendingIntent(alarm.time, alarm.week, alarm.ring, alarm.name, wek);
+          AlarmHelper.setAlarmOnce(this.mAlarmManager, tmpTimeInMillis, pendingIntent);
+        }
+
+      }
+    }
+  }
+
+  private void setNewNoticeAlarm(ArrayList<NoticeContent> var1) {
+    Iterator var19 = var1.iterator();
+
+    while(var19.hasNext()) {
+      NoticeContent var2 = (NoticeContent)var19.next();
+      String var3 = var2.noticeTime;
+      String var4 = var2.noticeName;
+      String var5 = var2.noticeNumber;
+      String var6 = var2.noticeID;
+      String var7 = var2.noticeCategory;
+      String var8 = var2.noticeFrequency;
+      String var9 = var2.noticeContent;
+      Calendar var10 = Calendar.getInstance();
+      long var11 = System.currentTimeMillis();
+      var10.set(Calendar.SECOND, 0);
+      if (var3 != null) {
+        String var13 = var3.substring(0, 4);
+        String var20 = var3.substring(4, 6);
+        String var14 = var3.substring(6, 8);
+        String var15 = var3.substring(8, 10);
+        String var16 = var3.substring(10, 12);
+        var10.set(Calendar.YEAR, Integer.parseInt(var13));
+        var10.set(Calendar.MONTH, Integer.parseInt(var20) - 1);
+        var10.set(Calendar.DATE, Integer.parseInt(var14));
+        var10.set(Calendar.HOUR_OF_DAY, Integer.parseInt(var15));
+        var10.set(Calendar.MINUTE, Integer.parseInt(var16));
+        long var17 = var10.getTimeInMillis();
+        if (var17 >= var11) {
+          PendingIntent var21 = this.getPendingIntent(var3, var4, var5, var6, var7, var8, var9);
+          AlarmHelper.setAlarm(this.mAlarmManager, var17, var21);
+        }
+      }
+    }
+
+  }
+
+  public void onAlarmClock(Connection var1, Runtime var2) {
+    this.handleSilent(var2, true);
+  }
+
+  public void onAttach(Connection var1, Runtime var2) {
+    this.mRuntime = var2;
+    this.mConnection = var1;
+    this.mContext = var2.getContextProxy().context;
+    this.mAlarmManager = (AlarmManager)this.mContext.getSystemService(Context.ALARM_SERVICE);
+    this.mDbHelper = var2.getDbHelper();
+    this.silentList = this.querySilent();
+    this.getSilentListStartAndEndTime();
+    this.mInSilent = this.isSilentTime();
+    DBHelper var3 = this.mDbHelper;
+    String var4;
+    if (this.mInSilent) {
+      var4 = "ON";
+    } else {
+      var4 = "OFF";
+    }
+
+    var3.upDateorInsertDeviceStatus(var4);
+    this.handSilence(this.mContext, this.mInSilent);
+    this.stheartRateList = this.queryStheartRate();
+    this.getStartAndEndStheartRateTime();
+    this.mIsStheartRate = this.isStheartRateTime(false);
+    this.alarms = this.queryAlarm();
+    this.voiceNotice = this.queryNotice();
+    var2.getContextProxy().context.getContentResolver().registerContentObserver(ICContentProvider.SILENT_URI, false, this.mContentObserver);
+    this.mAlramReceiver = new SilentManager.AlramReceiver();
+    IntentFilter var5 = new IntentFilter();
+    var5.addAction("com.enqualcomm.support.ACTION_NOTICE_ALARM_CHANGE");
+    var5.addAction("com.enqualcomm.support.ACTION_ALARM_ALARM_CHANGE");
+    var5.addAction("com.enqualcomm.support.STHEART_RATE_ALARM_CHANGE");
+    var5.addAction("com.eqc.heartrate.action.RESULT");
+    this.mContext.registerReceiver(this.mAlramReceiver, var5);
+    var2.getContextProxy().getTelephonyManager().listen(this.phoneStateListener, 32);
+  }
+
+  public void onDetach(Connection var1, Runtime var2) {
+    var2.getContextProxy().context.getContentResolver().unregisterContentObserver(this.mContentObserver);
+    this.mContext.unregisterReceiver(this.mAlramReceiver);
+  }
+
+  @Override
+  public boolean onUserRequest(Intent var1, Connection var2, Runtime var3) {
+    String action = var1.getAction();
+    if (ACTION_CARE_ALARM.equals(action)) {
+      String alarmTime = var1.getDataString();  //alarm:ST00.43,W,CON,闹铃,2
+      String currentTime = TimeUtil.getSystemTime();
+      alarmTime.substring(6).split("\\.");
+      int alarmTime_minutes = Integer.parseInt(alarmTime.substring(6).split("\\.")[1].substring(0, 2));
+      int alarmTime_hour = Integer.parseInt(alarmTime.substring(6).split("\\.")[0].substring(2));
+      String[] currentTimeArray = currentTime.split(";")[1].split(":");
+      int currentTime_hour = Integer.parseInt(currentTimeArray[0]);
+      int currentTime_minutes = Integer.parseInt(currentTimeArray[1]);
+      ICLogger.i("alarm time["+alarmTime_hour+":"+alarmTime_minutes+"], current time["+currentTime_hour+":"+currentTime_minutes+"]");
+      if (alarmTime_hour != currentTime_hour || alarmTime_minutes != currentTime_minutes) {
+        return false;
+      }
+
+      if (this.isIdle(this.mContext)) {
+        try {
+          Intent intent = new Intent("com.enqualcomm.icare.ALARM", Uri.parse(alarmTime));
+            intent.putExtra("closeAlarm", 0);
+            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+          this.mContext.startActivity(intent);
+        } catch (Exception e) {
+          e.printStackTrace();
+          ICLogger.e(e.getMessage(),e);
+        }
+      }
+    } else if ("com.enqualcomm.support.ACTION_NOTICE_ALARM".equals(action)) {
+        String alarmTime = var1.getDataString();
+      if (this.isIdle(this.mContext)) {
+        try {
+          var1 = new Intent("com.enqualcomm.icare.NOTICE", Uri.parse(alarmTime));
+          var1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+          this.mContext.startActivity(var1);
+        } catch (Exception e) {
+          e.printStackTrace();
+          ICLogger.e(e.getMessage(),e);
+        }
+      }
+    } else {
+      ICLogger.i("静默闹钟来了");
+      boolean var4;
+      if (!"com.eqc.heartrate.action.SILENT_START".equals(action) && !"com.enqualcomm.support.OTHER_HEARTRATE_ALARM_START".equals(action)) {
+        var4 = false;
+      } else {
+        var4 = true;
+      }
+
+      this.handleSilent(var3, var4 ^ true);
+    }
+
+    return false;
+  }
+
+  @Override
+  public boolean onUserRequest(Message paramMessage, Connection paramConnection, Runtime paramRuntime) {
+    return false;
+  }
+
+  class AlramReceiver extends BroadcastReceiver {
+    AlramReceiver() {
+    }
+
+    public void onReceive(Context var1, Intent var2) {
+      String var6 = var2.getAction();
+      StringBuilder var3 = new StringBuilder();
+      var3.append("action = ");
+      var3.append(var6);
+      ICLogger.i(var3.toString());
+      if ("com.enqualcomm.support.ACTION_NOTICE_ALARM_CHANGE".equals(var6)) {
+        SilentManager.this.voiceNotice = SilentManager.this.queryNotice();
+      } else if ("com.enqualcomm.support.ACTION_ALARM_ALARM_CHANGE".equals(var6)) {
+        SilentManager.this.alarms = SilentManager.this.queryAlarm();
+      } else if ("com.enqualcomm.support.STHEART_RATE_ALARM_CHANGE".equals(var6)) {
+        SilentManager.this.stheartRateList = SilentManager.this.queryStheartRate();
+        SilentManager.this.getStartAndEndStheartRateTime();
+        SilentManager.this.isStheartRateTime(false);
+      } else if ("com.eqc.heartrate.action.RESULT".equals(var6)) {
+        var6 = var2.getStringExtra("time");
+        int var4 = var2.getIntExtra("value", 0);
+        int var5 = var2.getIntExtra("type", 0);
+        StringBuilder var7 = new StringBuilder();
+        var7.append("(");
+        var7.append(var6);
+        var7.append("@");
+        var7.append(var4);
+        var7.append("@");
+        var7.append(var5);
+        var7.append(")");
+        var6 = var7.toString();
+//        SilentManager.this.mConnection.send(API.H60(SilentManager.this.mRuntime, var6));
+      } else if ("com.enqualcomm.support.ACTION_ANTIOFF_ALARM_CHANGE".equals(var6)) {
+        SilentManager.this.sAntioffList = SilentManager.this.queryAntioff();
+        SilentManager.this.getStartAndEndSantioffTime();
+        SilentManager.this.mIsNeedAntioff = SilentManager.this.isAntioffTime(false);
+      }
+
+    }
+  }
 }
\ No newline at end of file
index a57f3ca..23842fe 100644 (file)
-package com.enqualcomm.support.utils;\r
-\r
-import android.content.Context;\r
-import android.content.Intent;\r
-import android.os.Handler;\r
-\r
-import com.enqualcomm.support.Config;\r
-import com.enqualcomm.support.Constants;\r
-import com.enqualcomm.support.CoreService;\r
-import com.enqualcomm.support.LocationClient;\r
-import com.enqualcomm.support.bean.Runtime;\r
-import com.enqualcomm.support.bean.StringMessage;\r
-import com.enqualcomm.support.bean.heartRateStatus;\r
-import com.enqualcomm.support.service.Deliver;\r
-import com.enqualcomm.support.service.HeartRateManager;\r
-import com.ic.jni.ICJniUtils;\r
-import com.ic.protocols.protocolAPIHelper;\r
-\r
-public class TemperatureUtil {\r
-\r
-\r
-    private static double temp_value_orig =0.0f;\r
-    private static double temp_adjust_value=0.0f;\r
-    private static double body_temp_value=0.0f;\r
-    private static double tempOut_value=0.0f;\r
-    public static double get_tempOut_value_origin()\r
-    {\r
-        tempOut_value= ICJniUtils.getTemperatureOrigin();\r
-        ICLogger.i("测量环境温度 原始值 "+tempOut_value);\r
-        return tempOut_value;\r
-    }\r
-    public static double get_temp_value_adjusted()\r
-    {\r
-        temp_value_orig= ICJniUtils.getTemperature();\r
-        ICLogger.i("测量体温 原始值 "+temp_value_orig);\r
-        return temp_value_orig;\r
-    }\r
-\r
-    public static double getTempAdjustValue(){\r
-\r
-     //   temp_adjust_value=ICJniUtils.getTemperatureAdjustValue();\r
-        ICLogger.i("get Temperature Adjust value="+temp_adjust_value);\r
-        return temp_adjust_value;\r
-\r
-    }\r
-    public static double getBodyTemp(double wristtemp,double envtemp){\r
-        body_temp_value=ICJniUtils.getBodyTempFromWristTemp(wristtemp,envtemp);\r
-        ICLogger.i("get body Temperature value="+body_temp_value);\r
-        return body_temp_value;\r
-    }\r
-\r
-\r
-    public static void doTempTestInThread(){\r
-\r
-        new Handler().postDelayed(new Runnable() {\r
-            @Override\r
-            public void run() {\r
-\r
-                DoTempTest();\r
-            }\r
-        },500);\r
-    }\r
-\r
-    public static final String ACTION_TEMP_RESULT = "com.ic.action.temp_result";\r
-    public static final String KEY_TEMP_BODY = "body";  // double 体温\r
-    public static final String KEY_TEMP_WRIST = "wrist";  //  double 腕温\r
-    public static final String KEY_TEMP_OUT = "out"; //temp out\r
-    public static final String KEY_TEMP_BYPROTOCOL = "protocol"; //temp out\r
-    private static void sendTempBroadcast(double value, double animal,double tempOut) {\r
-        Intent pedIntent = new Intent();\r
-        pedIntent.setAction(ACTION_TEMP_RESULT);\r
-        pedIntent.putExtra(KEY_TEMP_WRIST, value);\r
-        pedIntent.putExtra(KEY_TEMP_BODY, animal);\r
-        pedIntent.putExtra(KEY_TEMP_OUT, tempOut);\r
-        pedIntent.putExtra(KEY_TEMP_BYPROTOCOL,true);\r
-        if(CoreService.getInstance()!=null)\r
-            CoreService.getInstance().sendBroadcast(pedIntent);\r
-    }\r
-    public static void DoTempTest(){\r
-        if (ICJniUtils.isTemperatureDevAvailable() >ICJniUtils.TempSensorType.TEMPSENSOR_TYPE_NONE.ordinal()) {\r
-\r
-            ICJniUtils.enableTemperature();\r
-            Util.mSleep(1000);\r
-\r
-            double wrist_temp, body_temp,temout;\r
-            temout=0.0f;\r
-\r
-            wrist_temp = TemperatureUtil.get_temp_value_adjusted();\r
-            if(wrist_temp< 0.001f){\r
-                Util.mSleep(1000);\r
-                ICLogger.i("retry read temp for 0");\r
-                wrist_temp = TemperatureUtil.get_temp_value_adjusted();\r
-            }\r
-\r
-\r
-            if(ICJniUtils.isTemperatureDevAvailable()==ICJniUtils.TempSensorType.TEMPSENSOR_TYPE_IC68.ordinal()){\r
-                //如果是IC68,只有体温,没有腕温\r
-                if (Config.disableWristTemp) {\r
-                    body_temp=wrist_temp;\r
-                }else {\r
-                    temout = TemperatureUtil.get_tempOut_value_origin();\r
-                    if (temout < 0.001f) {\r
-                        Util.mSleep(1000);\r
-                        ICLogger.i("retry read tempOut for 0");\r
-                        temout = TemperatureUtil.get_tempOut_value_origin();\r
-                    }\r
-                    if (temout > 60 || temout < 0) {\r
-                        temout = 0.0f;\r
-                    }\r
-                    if (temout > 0.001f) {\r
-                        body_temp = TemperatureUtil.getBodyTemp(wrist_temp, temout);\r
-                    } else {\r
-                        body_temp = TemperatureUtil.getBodyTemp(wrist_temp, 26.0f);\r
-                    }\r
-                }\r
-            }else {\r
-                body_temp = TemperatureUtil.getBodyTemp(wrist_temp, 26.0f);\r
-            }\r
-            if(Runtime.practising==true){\r
-                ICLogger.i("自由锻炼中,设置测量体温!" +String.format("%.1f",body_temp));\r
-                Runtime.healthInfo.setTemperatureData(body_temp);\r
-            }else {\r
-                StringMessage temperatureMsg = protocolAPIHelper.getTemperatureMSG(wrist_temp, body_temp,temout, null);\r
-                Deliver.sendLocationMSG(temperatureMsg);\r
-                if  (temperatureMsg!=null) ICLogger.i("发送体温测量值 " + temperatureMsg.isFromCache());\r
-            }\r
-\r
-            Runtime runtime = CoreService.getInstance().getRuntime();\r
-            runtime.tempInfo.setTemp(body_temp, wrist_temp,temout);\r
-\r
-            //发送消息给launcher显示\r
-            sendTempBroadcast(wrist_temp,body_temp,temout);\r
-\r
-            ICJniUtils.disableTemperature();\r
-\r
-            //体温异常报警检测开启的会进行异常报警\r
-            if (Config.needTemperature_abnormal_alarm) {\r
-                switch (runtime.tempInfo.isBodyTempAbnormal()) {\r
-                    case 0:\r
-                        break;\r
-                    case 1:\r
-                        if(runtime.setAlarmType(Runtime.AlarmType.ALARM_TEMP_HIGH)) {\r
-                            //trigger AP10 报警定位\r
-                            ICLogger.i("triggerSOSLocationProcess ");\r
-                            LocationClient.getInstance().triggerSOSLocationProcess();\r
-//                            Deliver.sendLocationMSG(protocolAPIHelper.getWarningMSG(runtime));\r
-                        }\r
-                        break;\r
-                    case 2:\r
-                        if(runtime.setAlarmType(Runtime.AlarmType.ALARM_TEMP_LOW)) {\r
-                            //trigger AP10 报警定位\r
-                            ICLogger.i("triggerSOSLocationProcess ");\r
-                            LocationClient.getInstance().triggerSOSLocationProcess();\r
-//                            Deliver.sendLocationMSG(protocolAPIHelper.getWarningMSG(runtime));\r
-                        }\r
-                        break;\r
-                }\r
-            }\r
-\r
-\r
-        }\r
-    }\r
-}\r
+package com.enqualcomm.support.utils;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.Handler;
+
+import com.enqualcomm.support.Config;
+import com.enqualcomm.support.Constants;
+import com.enqualcomm.support.CoreService;
+import com.enqualcomm.support.LocationClient;
+import com.enqualcomm.support.bean.Runtime;
+import com.enqualcomm.support.bean.StringMessage;
+import com.enqualcomm.support.bean.heartRateStatus;
+import com.enqualcomm.support.service.Deliver;
+import com.enqualcomm.support.service.HeartRateManager;
+import com.ic.jni.ICJniUtils;
+import com.ic.protocols.protocolAPIHelper;
+
+public class TemperatureUtil {
+
+
+    private static double temp_value_orig =0.0f;
+    private static double temp_adjust_value=0.0f;
+    private static double body_temp_value=0.0f;
+    private static double tempOut_value=0.0f;
+    public static double get_tempOut_value_origin()
+    {
+        tempOut_value= ICJniUtils.getTemperatureOrigin();
+        ICLogger.i("测量环境温度 原始值 "+tempOut_value);
+        return tempOut_value;
+    }
+    public static double get_temp_value_adjusted()
+    {
+        temp_value_orig= ICJniUtils.getTemperature();
+        ICLogger.i("测量体温 原始值 "+temp_value_orig);
+        return temp_value_orig;
+    }
+
+    public static double getTempAdjustValue(){
+
+     //   temp_adjust_value=ICJniUtils.getTemperatureAdjustValue();
+        ICLogger.i("get Temperature Adjust value="+temp_adjust_value);
+        return temp_adjust_value;
+
+    }
+    public static double getBodyTemp(double wristtemp,double envtemp){
+        body_temp_value=ICJniUtils.getBodyTempFromWristTemp(wristtemp,envtemp);
+        ICLogger.i("get body Temperature value="+body_temp_value);
+        return body_temp_value;
+    }
+
+
+    public static void doTempTestInThread(){
+
+        new Handler().postDelayed(new Runnable() {
+            @Override
+            public void run() {
+
+                DoTempTest();
+            }
+        },500);
+    }
+
+    public static final String ACTION_TEMP_RESULT = "com.ic.action.temp_result";
+    public static final String KEY_TEMP_BODY = "body";  // double 体温
+    public static final String KEY_TEMP_WRIST = "wrist";  //  double 腕温
+    public static final String KEY_TEMP_OUT = "out"; //temp out
+    public static final String KEY_TEMP_BYPROTOCOL = "protocol"; //temp out
+    private static void sendTempBroadcast(double value, double animal,double tempOut) {
+        Intent pedIntent = new Intent();
+        pedIntent.setAction(ACTION_TEMP_RESULT);
+        pedIntent.putExtra(KEY_TEMP_WRIST, value);
+        pedIntent.putExtra(KEY_TEMP_BODY, animal);
+        pedIntent.putExtra(KEY_TEMP_OUT, tempOut);
+        pedIntent.putExtra(KEY_TEMP_BYPROTOCOL,true);
+        if(CoreService.getInstance()!=null)
+            CoreService.getInstance().sendBroadcast(pedIntent);
+    }
+    public static void DoTempTest(){
+        if (ICJniUtils.isTemperatureDevAvailable() >ICJniUtils.TempSensorType.TEMPSENSOR_TYPE_NONE.ordinal()) {
+
+            ICJniUtils.enableTemperature();
+            Util.mSleep(1000);
+
+            double wrist_temp, body_temp,temout;
+            temout=0.0f;
+
+            wrist_temp = TemperatureUtil.get_temp_value_adjusted();
+            if(wrist_temp< 10){
+                Util.mSleep(1000);
+                ICLogger.i("retry read temp for <10");
+                wrist_temp = TemperatureUtil.get_temp_value_adjusted();
+            }
+
+            if(ICJniUtils.isTemperatureDevAvailable()==ICJniUtils.TempSensorType.TEMPSENSOR_TYPE_IC68.ordinal()){
+                //如果是IC68,只有体温,没有腕温
+                if (Config.disableWristTemp) {
+                    body_temp=wrist_temp;
+                }else {
+                    temout = TemperatureUtil.get_tempOut_value_origin();
+                    if (temout < 10) {
+                        Util.mSleep(1000);
+                        ICLogger.i("retry read tempOut for <10");
+                        temout = TemperatureUtil.get_tempOut_value_origin();
+                    }
+                    if (temout > 60 || temout < 10) {
+                        temout = 0.0f;
+                    }
+                    if (temout > 10) {
+                        body_temp = TemperatureUtil.getBodyTemp(wrist_temp, temout);
+                    } else {
+                        body_temp = TemperatureUtil.getBodyTemp(wrist_temp, 26.0f);
+                    }
+                }
+            }else {
+                body_temp = TemperatureUtil.getBodyTemp(wrist_temp, 26.0f);
+            }
+            if(Runtime.practising==true){
+                ICLogger.i("自由锻炼中,设置测量体温!" +String.format("%.1f",body_temp));
+                Runtime.healthInfo.setTemperatureData(body_temp);
+            }else {
+                StringMessage temperatureMsg = protocolAPIHelper.getTemperatureMSG(wrist_temp, body_temp,temout, null);
+                Deliver.sendLocationMSG(temperatureMsg);
+                if  (temperatureMsg!=null) ICLogger.i("发送体温测量值 " + temperatureMsg.isFromCache());
+            }
+
+            Runtime runtime = CoreService.getInstance().getRuntime();
+            runtime.tempInfo.setTemp(body_temp, wrist_temp,temout);
+
+            //发送消息给launcher显示
+            sendTempBroadcast(wrist_temp,body_temp,temout);
+
+            ICJniUtils.disableTemperature();
+
+            //体温异常报警检测开启的会进行异常报警
+            if (Config.needTemperature_abnormal_alarm) {
+                switch (runtime.tempInfo.isBodyTempAbnormal()) {
+                    case 0:
+                        break;
+                    case 1:
+                        if(runtime.setAlarmType(Runtime.AlarmType.ALARM_TEMP_HIGH)) {
+                            //trigger AP10 报警定位
+                            ICLogger.i("triggerSOSLocationProcess ");
+                            LocationClient.getInstance().triggerSOSLocationProcess();
+//                            Deliver.sendLocationMSG(protocolAPIHelper.getWarningMSG(runtime));
+                        }
+                        break;
+                    case 2:
+                        if(runtime.setAlarmType(Runtime.AlarmType.ALARM_TEMP_LOW)) {
+                            //trigger AP10 报警定位
+                            ICLogger.i("triggerSOSLocationProcess ");
+                            LocationClient.getInstance().triggerSOSLocationProcess();
+//                            Deliver.sendLocationMSG(protocolAPIHelper.getWarningMSG(runtime));
+                        }
+                        break;
+                }
+            }
+
+
+        }
+    }
+}
index f47250b..90df28b 100644 (file)
-package com.ic.protocols;\r
-\r
-import android.content.ComponentName;\r
-import android.content.Context;\r
-import android.content.Intent;\r
-import android.net.Uri;\r
-import android.os.Environment;\r
-import android.os.Handler;\r
-\r
-import com.enqualcomm.support.Config;\r
-import com.enqualcomm.support.Constants;\r
-import com.enqualcomm.support.CoreService;\r
-import com.enqualcomm.support.R;\r
-import com.enqualcomm.support.bean.Alarm;\r
-import com.enqualcomm.support.bean.Contact;\r
-import com.enqualcomm.support.bean.Content;\r
-import com.enqualcomm.support.bean.ICLocation;\r
-import com.enqualcomm.support.bean.Runtime;\r
-import com.enqualcomm.support.bean.StringMessage;\r
-import com.enqualcomm.support.bean.VoiceContent;\r
-import com.enqualcomm.support.bean.voicePacket;\r
-import com.enqualcomm.support.service.HeartRateManager;\r
-import com.enqualcomm.support.utils.CameraUtil;\r
-import com.enqualcomm.support.utils.Connection;\r
-import com.enqualcomm.support.utils.ICAudioManager;\r
-import com.enqualcomm.support.utils.ICLogger;\r
-import com.enqualcomm.support.utils.TemperatureUtil;\r
-import com.enqualcomm.support.utils.TimeUtil;\r
-import com.enqualcomm.support.utils.Util;\r
-import com.enqualcomm.support.utils.VibrateUtil;\r
-import com.enqualcomm.support.utils.WakeLockUtil;\r
-\r
-import java.io.File;\r
-import java.io.FileOutputStream;\r
-import java.util.ArrayList;\r
-import java.util.Date;\r
-import java.util.HashMap;\r
-import java.util.Locale;\r
-\r
-import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;\r
-import static android.content.Intent.FLAG_INCLUDE_STOPPED_PACKAGES;\r
-import static com.enqualcomm.support.Constants.ACTION_HEATR_RATE_START;\r
-import static com.enqualcomm.support.Constants.ACTION_REMOTE_CAMERA;\r
-import static com.enqualcomm.support.Constants.DIALOG_ACTION;\r
-import static com.enqualcomm.support.LocationClient.LOCATION_MODE;\r
-import static com.enqualcomm.support.bean.Contact.GROUP_ALL;\r
-import static java.lang.Math.abs;\r
-\r
-public class protocol_ic {\r
-    private static final String TAG = "ICSrv." + protocol_ic.class.getSimpleName();\r
-\r
-    private static final String CMDHEADER = "IW";\r
-    private static final String CMDEND = "#";\r
-    private static final String CMDSPLIT = ",";\r
-    public static final String defaultServerIP="watch.jiai.pro";\r
-    public static final int defaultServerPort=8090;\r
-    public enum CMD_TYPE {\r
-        /*终端发起*/\r
-        AP00,//登录包\r
-        BP00,\r
-        AP01,//混合定位\r
-        BP01,\r
-        AP02,//多基站定位\r
-        BP02,\r
-        AP92,//CDMA 混合定位\r
-        BP92,\r
-        AP94,\r
-        BP94,\r
-        AP03,//心跳包\r
-        BP03,\r
-        AP05,//语音查询接收\r
-        BP05,\r
-        AP07,//语音上行\r
-        BP07,\r
-        AP10,//报警与地址回复\r
-        BP10,\r
-        AP49,//心率上传\r
-        BP49,\r
-        APHT,//心率血压上传\r
-        BPHT,\r
-        APTM,//基站校时及获取定位\r
-        BPTM,\r
-        APCH,//充电提示\r
-        BPCH,\r
-        APBR,//上传蓝牙扫描结果\r
-        BPBR,\r
-        /* 服务器发起*/\r
-        AP12,\r
-        BP12,//SOS 号码设置\r
-        AP14,\r
-        BP14,//设置联系人白名单\r
-        AP15,\r
-        BP15,//设置定位周期\r
-        AP16,\r
-        BP16,//立即定位\r
-        AP17,\r
-        BP17,//恢复出厂设置\r
-        AP18,\r
-        BP18,//重启设备\r
-        AP21,\r
-        BP21,//设置计步开关\r
-        AP28,\r
-        BP28, //语音下行\r
-        AP31,\r
-        BP31,//关机\r
-        AP33,\r
-        BP33,//工作模式\r
-        AP34,\r
-        BP34,//自定义工作模式\r
-        AP40,\r
-        BP40,//下发文本\r
-        AP68,\r
-        BP68,//绑定解绑\r
-        APXL,\r
-        BPXL,//测量心率\r
-        APXY,\r
-        BPXY,//测量血压\r
-        APJZ,\r
-        BPJZ,//血压校准\r
-        AP84,\r
-        BP84,//白名单开关\r
-        AP85,\r
-        BP85,//设置闹钟\r
-        AP86,\r
-        BP86,//绑定解绑\r
-        AP87,\r
-        BP87,//二维码更新\r
-        AP88,\r
-        BP88,//查找手表\r
-        AP89,\r
-        BP89,//心率血压阀值设置\r
-        APTE,\r
-        BPTE,//体温间隔设置\r
-        APTP,\r
-        BPTP,//体温上行\r
-        APX1,\r
-        BPX1,//心率血压血氧修正\r
-        APS4,\r
-        BPS4,//提醒设置(时间段)\r
-        APHP,//上报心率血压血氧\r
-        BPHP,\r
-        APDE,//进出围栏通知\r
-        BPDE,\r
-        APDG,//体温阀值设置\r
-        BPDG,\r
-        APTU,//上传语音图片\r
-        BPTU,\r
-        APSL,//上传睡眠数据\r
-        BPSL,\r
-        AP46,//立即拍照\r
-        BP46,\r
-        APDH,//聆听\r
-        BPDH,\r
-        AP99,//监听电话\r
-        BP99,\r
-        APTQ,//天气\r
-        BPTQ,\r
-        APAT,//剪断消息开关\r
-        BPAT,\r
-        APBT,\r
-        BPBT,//设置蓝牙扫描间隔\r
-        APWL,\r
-        BPWL,//设置白名单\r
-        AP65,\r
-        BP65,//设置音量\r
-        AP47,\r
-        BP47,//设置震动\r
-        UNKNOWN_CMD,\r
-    }\r
-\r
-    private static HashMap<CMD_TYPE, String> cmdMap = null;\r
-\r
-    static {\r
-        cmdMap = new HashMap<CMD_TYPE, String>();\r
-        cmdMap.put(CMD_TYPE.AP00, "AP00");\r
-        cmdMap.put(CMD_TYPE.BP00, "BP00");\r
-        cmdMap.put(CMD_TYPE.AP01, "AP01");\r
-        cmdMap.put(CMD_TYPE.BP01, "BP01");\r
-        cmdMap.put(CMD_TYPE.AP02, "AP02");\r
-        cmdMap.put(CMD_TYPE.BP02, "BP02");\r
-        cmdMap.put(CMD_TYPE.AP92, "AP92");\r
-        cmdMap.put(CMD_TYPE.BP92, "BP92");\r
-        cmdMap.put(CMD_TYPE.AP94, "AP94");\r
-        cmdMap.put(CMD_TYPE.BP94, "BP94");\r
-        cmdMap.put(CMD_TYPE.AP03, "AP03");\r
-        cmdMap.put(CMD_TYPE.BP03, "BP03");\r
-        cmdMap.put(CMD_TYPE.AP05, "AP05");\r
-        cmdMap.put(CMD_TYPE.BP05, "BP05");\r
-        cmdMap.put(CMD_TYPE.AP07, "AP07");\r
-        cmdMap.put(CMD_TYPE.BP07, "BP07");\r
-        cmdMap.put(CMD_TYPE.AP10, "AP10");\r
-        cmdMap.put(CMD_TYPE.BP10, "BP10");\r
-        cmdMap.put(CMD_TYPE.AP49, "AP49");\r
-        cmdMap.put(CMD_TYPE.BP49, "BP49");\r
-        cmdMap.put(CMD_TYPE.APHT, "APHT");\r
-        cmdMap.put(CMD_TYPE.BPHT, "BPHT");\r
-        cmdMap.put(CMD_TYPE.APTM, "APTM");\r
-        cmdMap.put(CMD_TYPE.BPTM, "BPTM");\r
-        cmdMap.put(CMD_TYPE.APCH, "APCH");\r
-        cmdMap.put(CMD_TYPE.BPCH, "BPCH");\r
-        cmdMap.put(CMD_TYPE.APBR, "APBR");\r
-        cmdMap.put(CMD_TYPE.BPBR, "BPBR");\r
-        /* 服务器发起*/\r
-        cmdMap.put(CMD_TYPE.AP12, "AP12");\r
-        cmdMap.put(CMD_TYPE.BP12, "BP12");\r
-        cmdMap.put(CMD_TYPE.AP14, "AP14");\r
-        cmdMap.put(CMD_TYPE.BP14, "BP14");\r
-        cmdMap.put(CMD_TYPE.AP15, "AP15");\r
-        cmdMap.put(CMD_TYPE.BP15, "BP15");\r
-        cmdMap.put(CMD_TYPE.AP16, "AP16");\r
-        cmdMap.put(CMD_TYPE.BP16, "BP16");\r
-        cmdMap.put(CMD_TYPE.AP17, "AP17");\r
-        cmdMap.put(CMD_TYPE.BP17, "BP17");\r
-        cmdMap.put(CMD_TYPE.AP18, "AP18");\r
-        cmdMap.put(CMD_TYPE.BP18, "BP18");\r
-        cmdMap.put(CMD_TYPE.AP21, "AP21");\r
-        cmdMap.put(CMD_TYPE.BP21, "BP21");\r
-        cmdMap.put(CMD_TYPE.AP28, "AP28");\r
-        cmdMap.put(CMD_TYPE.BP28, "BP28");\r
-        cmdMap.put(CMD_TYPE.AP31, "AP31");\r
-        cmdMap.put(CMD_TYPE.BP31, "BP31");\r
-        cmdMap.put(CMD_TYPE.AP33, "AP33");\r
-        cmdMap.put(CMD_TYPE.BP33, "BP33");\r
-        cmdMap.put(CMD_TYPE.AP34, "AP34");\r
-        cmdMap.put(CMD_TYPE.BP34, "BP34");\r
-        cmdMap.put(CMD_TYPE.AP40, "AP40");\r
-        cmdMap.put(CMD_TYPE.BP40, "BP40");\r
-        cmdMap.put(CMD_TYPE.AP68, "AP68");\r
-        cmdMap.put(CMD_TYPE.BP68, "BP68");\r
-        cmdMap.put(CMD_TYPE.APXL, "APXL");\r
-        cmdMap.put(CMD_TYPE.BPXL, "BPXL");\r
-        cmdMap.put(CMD_TYPE.APXY, "APXY");\r
-        cmdMap.put(CMD_TYPE.BPXY, "BPXY");\r
-        cmdMap.put(CMD_TYPE.APJZ, "APJZ");\r
-        cmdMap.put(CMD_TYPE.BPJZ, "BPJZ");\r
-        cmdMap.put(CMD_TYPE.AP84, "AP84");\r
-        cmdMap.put(CMD_TYPE.BP84, "BP84");\r
-        cmdMap.put(CMD_TYPE.AP85, "AP85");\r
-        cmdMap.put(CMD_TYPE.BP85, "BP85");\r
-        cmdMap.put(CMD_TYPE.AP86, "AP86");\r
-        cmdMap.put(CMD_TYPE.BP86, "BP86");\r
-        cmdMap.put(CMD_TYPE.AP87, "AP87");\r
-        cmdMap.put(CMD_TYPE.BP87, "BP87");\r
-        cmdMap.put(CMD_TYPE.AP88, "AP88");\r
-        cmdMap.put(CMD_TYPE.BP88, "BP88");\r
-        cmdMap.put(CMD_TYPE.AP89, "AP89");\r
-        cmdMap.put(CMD_TYPE.BP89, "BP89");\r
-        cmdMap.put(CMD_TYPE.APTE, "APTE");\r
-        cmdMap.put(CMD_TYPE.BPTE, "BPTE");\r
-        cmdMap.put(CMD_TYPE.APTP, "APTP");\r
-        cmdMap.put(CMD_TYPE.BPTP, "BPTP");\r
-        cmdMap.put(CMD_TYPE.APX1, "APX1");\r
-        cmdMap.put(CMD_TYPE.BPX1, "BPX1");\r
-        cmdMap.put(CMD_TYPE.APS4, "APS4");\r
-        cmdMap.put(CMD_TYPE.BPS4, "BPS4");\r
-        cmdMap.put(CMD_TYPE.APHP, "APHP");\r
-        cmdMap.put(CMD_TYPE.BPHP, "BPHP");\r
-        cmdMap.put(CMD_TYPE.APDE, "APDE");\r
-        cmdMap.put(CMD_TYPE.BPDE, "BPDE");\r
-        cmdMap.put(CMD_TYPE.APDG, "APDG");\r
-        cmdMap.put(CMD_TYPE.BPDG, "BPDG");\r
-        cmdMap.put(CMD_TYPE.APTU, "APTU");\r
-        cmdMap.put(CMD_TYPE.BPTU, "BPTU");\r
-        cmdMap.put(CMD_TYPE.APSL, "APSL");\r
-        cmdMap.put(CMD_TYPE.BPSL, "BPSL");\r
-        cmdMap.put(CMD_TYPE.AP46, "AP46");\r
-        cmdMap.put(CMD_TYPE.BP46, "BP46");\r
-        cmdMap.put(CMD_TYPE.APDH, "APDH");\r
-        cmdMap.put(CMD_TYPE.BPDH, "BPDH");\r
-        cmdMap.put(CMD_TYPE.AP99, "AP99");\r
-        cmdMap.put(CMD_TYPE.BP99, "BP99");\r
-        cmdMap.put(CMD_TYPE.APTQ, "APTQ");\r
-        cmdMap.put(CMD_TYPE.BPTQ, "BPTQ");\r
-        cmdMap.put(CMD_TYPE.APAT, "APAT");\r
-        cmdMap.put(CMD_TYPE.BPAT, "BPAT");\r
-        cmdMap.put(CMD_TYPE.APBT, "APBT");\r
-        cmdMap.put(CMD_TYPE.BPBT, "BPBT");\r
-        cmdMap.put(CMD_TYPE.APWL, "APWL");\r
-        cmdMap.put(CMD_TYPE.BPWL, "BPWL");\r
-        cmdMap.put(CMD_TYPE.AP65, "AP65");\r
-        cmdMap.put(CMD_TYPE.BP65, "BP65");\r
-        cmdMap.put(CMD_TYPE.AP47, "AP47");\r
-        cmdMap.put(CMD_TYPE.BP47, "BP47");\r
-    }\r
-\r
-\r
-    private Connection mConnection=null;\r
-    private Runtime mRuntime=null;\r
-\r
-    public protocol_ic(Connection connect, Runtime runtime) {\r
-            mConnection=connect;\r
-            mRuntime=runtime;\r
-\r
-        }\r
-\r
-    private StringBuffer cmdbuf = new StringBuffer();\r
-\r
-    /*\r
-    输入的字符串,如果有完整命令,返回 命令名\r
-    否则返回 空字符串\r
-     */\r
-    public static String isCmdStr(String msg) {\r
-\r
-        int head_index = msg.indexOf(CMDHEADER);\r
-        if (head_index >= 0) {\r
-            int end_index = msg.indexOf("#", head_index);\r
-            if (end_index < 0) {\r
-\r
-                return "";\r
-            }\r
-        }else{\r
-            return "";\r
-        }\r
-\r
-        for (CMD_TYPE key : cmdMap.keySet()) {\r
-            if (msg.startsWith(CMDHEADER + cmdMap.get(key))) {\r
-                ICLogger.i("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key));\r
-                return cmdMap.get(key);\r
-            }\r
-        }\r
-\r
-        return "";\r
-    }\r
-\r
-    private void log(String msg) {\r
-        ICLogger.log(TAG, msg);\r
-    }\r
-\r
-    private void log(String function, String msg) {\r
-        ICLogger.log(TAG, function, msg);\r
-    }\r
-\r
-\r
-\r
-    /**/\r
-    public static StringMessage genStringMessage(String cmdName, String msg){\r
-        StringMessage sm=new StringMessage(new String[]{cmdName,msg});\r
-        sm.refresh(msg);\r
-        sm.setDate(TimeUtil.getSystemDateYYMMDD(),TimeUtil.getSystemTimeHHmmss());\r
-        return sm;\r
-    }\r
-    /*\r
-    返回true 表示 cmd 全部解析成功\r
-    返回false表示 cmd至少有一条解析失败,失败的数据归入buffer,下一次识别接着使用\r
-    字符串通过#号进行识别。\r
-    每个字符串如果发现 #,却又没有Header,“IW”则会被丢弃\r
-     */\r
-    public boolean parserCmd(byte[] bytes) {\r
-        boolean iscmdComplete = false;\r
-        boolean ret = true;\r
-        String last_inCompletecmd = "";\r
-        String cmd_msgbuf=new String(bytes);\r
-        log("bytes.size "+bytes.length);\r
-//        cmdbuf.append(cmd_msgbuf);\r
-        cmdbuf.append(cmd_msgbuf);\r
-        log("cmdbuf.size "+cmdbuf.length() +" "+cmdbuf.toString());\r
-    /*\r
-        如果不是 #结尾,就认为 接收数据不全,置位。\r
-         */\r
-        if (cmdbuf.toString().endsWith(CMDEND)) {\r
-            iscmdComplete = true;\r
-        }\r
-        String[] cmdlist = cmd_msgbuf.split(CMDEND);\r
-        int listlen = cmdlist.length;\r
-        log("listlen "+listlen);\r
-         /*\r
-        如果解析出来的cmdlist不是空,且数据不是完整cmd则保留 最后一条数据到last_inCompletecmd\r
-         */\r
-        if (cmdlist.length > 0 && iscmdComplete == false) {\r
-            listlen -= 1;\r
-            last_inCompletecmd = cmdlist[listlen];\r
-            log("cmd not complete , " + last_inCompletecmd);\r
-        }\r
-        for (int i = 0; i < listlen; i++) {\r
-            for (CMD_TYPE key : cmdMap.keySet()) {\r
-                if (cmdlist[i].startsWith(CMDHEADER + cmdMap.get(key))) {\r
-                    log("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key) + " ,  " + cmdlist[i]);\r
-                    if (key == CMD_TYPE.BP28) {\r
-                        //如果是BP28则 后面的数据是音频,需要保留\r
-                        byte[] amrBuf;\r
-                        int amrLen = getBP28Amrlen(cmdlist[i] );\r
-                        if (bytes.length > amrLen) {\r
-                            handleCmd(key, cmdlist[i], bytes);\r
-                        }\r
-                    } else {\r
-                       handleCmd(key, cmdlist[i]);\r
-                    }\r
-                }\r
-            }\r
-        }\r
-\r
-        cmdbuf = new StringBuffer().append(last_inCompletecmd);\r
-        return ret;\r
-    }\r
-    public int getBP28Amrlen(String cmd) {\r
-\r
-        String Name;\r
-        String appendIndex;\r
-        int packetCount;\r
-        int currentId;\r
-        int packetLen;\r
-\r
-\r
-        String[] msg=cmd.split(CMDSPLIT);\r
-        if (msg.length>=6){\r
-            try {\r
-                Name = msg[1];\r
-                appendIndex = msg[2];\r
-                packetCount = Integer.parseInt(msg[3]);\r
-                currentId = Integer.parseInt(msg[4]);\r
-                packetLen = Integer.parseInt(msg[5]);\r
-\r
-                StringBuffer stringBuffer = new StringBuffer();\r
-                stringBuffer.append("getBP28AmrLen name = ").append(Name)\r
-                        .append(",appendIndex = ").append(appendIndex)\r
-                        .append(",packetCount = ").append(packetCount)\r
-                        .append(",currentId = ").append(currentId)\r
-                        .append(",packetLen = ").append(packetLen);\r
-\r
-\r
-                log(stringBuffer.toString());\r
-                return packetLen;\r
-            }catch (Exception e){\r
-                ICLogger.e(e.getMessage(),e);\r
-            }\r
-\r
-        }else{\r
-            log("getBP28AmrLen","format Error");\r
-\r
-        }\r
-        return -1;\r
-    }\r
-    /*登录*/\r
-    public static StringMessage AP00(Runtime ds) {\r
-        //示例数据:IWAP00867155030001063#\r
-        return genStringMessage(cmdMap.get(CMD_TYPE.AP00),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP00)).append(ds.IMEI()).append(CMDEND).toString());\r
-    }\r
-\r
-    //处理 登录 BP00\r
-    public void handleBP00(Runtime runtime,String cmd){\r
-        String[] msg=cmd.split(CMDSPLIT);\r
-//        get Msg :IWBP00,20191229171933,8# (size)24\r
-//        12-30 01:19:33.861 6492-6492/com.enqualcomm.support I/ICSrv.protocolAPIHelper: found cmd keyid=BP00 ,keyname=BP00 ,  IWBP00,20191229171933,8\r
-\r
-        if (msg.length>=3) {\r
-            log("handleBP00", "Set Datetime " + msg[1]);\r
-            log("handleBP00", "Set TimeZone " + msg[2]);\r
-            try {\r
-                Date datetime = TimeUtil.parseDatetiime(msg[1]);\r
-                int timezone = Integer.parseInt(msg[2]);\r
-                if (datetime != null) {\r
-                    ICLogger.i("===" + TimeUtil.getDefaultTimeZone());\r
-                    TimeUtil.setTimeZone(timezone);\r
-\r
-\r
-                    ICLogger.i("===" + TimeUtil.getDefaultTimeZone());\r
-                    TimeUtil.setSysDateTime(runtime.getContextProxy().context, datetime, timezone);\r
-                    ICLogger.i("===" + TimeUtil.getDefaultTimeZone());\r
-\r
-                }\r
-            }catch (Exception e) {\r
-                ICLogger.e(e.getMessage(), e);\r
-            }\r
-//            Set Datetime 20200505112734\r
-//            Set TimeZone 8\r
-\r
-        }else{\r
-            log("handleBP00","format Error");\r
-        }\r
-    }\r
-\r
-\r
-    public static StringMessage AP03(Runtime ds) {\r
-        //示例数据:IWAP03,06000908000102,5555,30#  IWAP03,000000null00000,0,0#\r
-        //IW: 标识符\r
-        //AP03:命令字\r
-        //设备在静止时,可以通过该指令与平台保持连接和解决静态漂移\r
-        //06000908000102:\r
-        //060为GSM信号,\r
-        //009为参与定位的卫星数,\r
-        //080为电池电量,\r
-        //0 为保留位,\r
-        //01为设防状态,此处由两位十六进制表示,无取值时为 00 ,长度必需为两位,一共 8个bit 表示8种状态,各bit定义如下:(未列出的为当前未使用, 1表示有效 ,0 表示无效)\r
-        //Bit0 设防状态<手表无效>\r
-        //Bit1 为 1 表示夜灯为开,为0 夜灯为 关\r
-        //02为工作模式 ,(设防,工作模式如果为00,则代表无或未设置)\r
-        //5555: 计步步数,每次到达 9999 后重 0 开始计 (此处 9999 为示例,可以为2字节int 然后溢出归零)\r
-        //30: 翻滚次数\r
-        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())))\r
-                .append(ds.getGPSLocationStarNums()).append(ds.getBattery()).append(ds.isPowerConnected()?"1":"0")\r
-                .append(ds.getProtection()).append(ds.getWorkModeStr()).append(CMDSPLIT)\r
-                .append(ds.getTotalStepCount()).append(CMDSPLIT).append(ds.getRolltimes()).append(CMDEND).toString());\r
-    }\r
-    //处理 心跳 BP03\r
-    public void handleBP03(String cmd){\r
-\r
-        log("BP03心跳接收成功");\r
-    }\r
-\r
-\r
-    public static StringMessage AP10(Runtime ds){\r
-\r
-        /**\r
-         * IWAP10080524A2232.9806N11404.9355E000.1061830323.8706000908000502,\r
-         * 460,0,9520,3671,\r
-         * 00,zh-cn,00,\r
-         * 00为报警状态,00为无任何报警(01:SOS,02:低电,03:脱落报警,04:佩戴提醒,05:剪断报警,06:跌倒报警,07:心率异常, 08:心率过高, 09:心率过低,10:收缩压过高,11:收缩压过低,12:舒张压过高,13:舒张压过低,14:久坐提醒,15:非法解锁(剪断报警),16:锁定提醒(佩戴提醒),17:体温过高,18体温过低)\r
-         * zh-cn:设备语言\r
-         * 00:第一个0:是否需要回复地址信息,0:不回复,1回复.\r
-         * 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#\r
-         */\r
-        return genStringMessage(cmdMap.get(CMD_TYPE.AP10),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP10)).append(TimeUtil.getShortDate())\r
-                .append(ds.getGPSData()).append(TimeUtil.getShortTime()).append(ds.getGPSHeading())\r
-                .append(String.format("%03d",abs(ds.getSignalStrength())))\r
-                .append(ds.getGPSLocationStarNums()).append(ds.getBattery()).append("0")\r
-                .append(ds.getProtection()).append(ds.getWorkModeStr()).append(CMDSPLIT)\r
-                .append(ds.getLBSData()).append(CMDSPLIT)\r
-                .append(ds.getAlarmType()).append(CMDSPLIT)\r
-                .append(ds.getLanguage()).append(CMDSPLIT)\r
-                .append("00").append(CMDSPLIT)  //不回复地址\r
-                .append(ds.getWifiInfo()).append(CMDEND).toString());\r
-\r
-    }\r
-\r
-    /*LBS+GPS混合定位*/\r
-    public static StringMessage AP01(Runtime ds) {\r
-        //示例数据:IWAP01080524A2232.9806N11404.9355E000.1061830323.8706000908000102,\r
-        // 460,0,9520,3671,\r
-        // 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#\r
-//        IWAP01191230A2232.9807N11404.9355E000.1161320000.0006000910000000,460,00,9520,3671,#\r
-        return genStringMessage(cmdMap.get(CMD_TYPE.AP01),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP01)).append(TimeUtil.getShortDate())\r
-                .append(ds.getGPSData()).append(TimeUtil.getShortTime()).append(ds.getGPSHeading()).append(String.format("%03d",abs(ds.getSignalStrength())))\r
-                .append(ds.getGPSLocationStarNums()).append(ds.getBattery()).append("0")\r
-                .append(ds.getProtection()).append(ds.getWorkModeStr()).append(CMDSPLIT)\r
-                .append(ds.getLBSData()).append(CMDSPLIT).append(ds.getWifiInfo()).append(CMDEND).toString());\r
-    }\r
-\r
-    //处理 定位 BP01\r
-    public void handleBP01(String cmd){\r
-        log("BP01定位接收成功");\r
-    }\r
-\r
-\r
-\r
-    /*LBS+WiFi混合定位*/\r
-    public static StringMessage AP02(Runtime ds) {\r
-        //示例数据:IWAP02,\r
-        // zh_cn,\r
-        // 0,\r
-        // 7,\r
-        // 460,0,\r
-        // 9520|3671|13,9520|3672|12,9520|3673|11,9520|3674|10,9520|3675|9,9520|3676|8,9520|3677|7,\r
-        // 4,\r
-        // 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#\r
-//        IW标识符\r
-//        AP02:命令字\r
-//        zh_cn: 语言标志\r
-//        0:回复标识,为0时不回复地址,为 1 时,服务器回复地址信息\r
-//        7: 表示共有7组基站\r
-//        460: MCC 国家码\r
-//        0: MNC运营商代码\r
-//        9520|3671|10: LAC|CID|dbm表示一组基站信息,后面数量需和基站组数地应  10:dbm为信号强度多基站信号强度建议从高到低排列后上传,信号强度转正数:150 – abs(dbm)\r
-//        4: 表示WIFI组数,\r
-//                1|D8-24-BD-79-FA-1F|59: ssid|mac地址|信号强度,信号强度转正数:150 – abs(信号强度)\r
-\r
-        int apsum=0;\r
-        String wifiinfo=ds.getWifiInfo();\r
-        if (!wifiinfo.isEmpty()) {\r
-            String[] list = wifiinfo.split("&");\r
-            apsum = list.length;\r
-        }\r
-\r
-        ICLogger.i("Wifi ap sum "+apsum);\r
-        return genStringMessage(cmdMap.get(CMD_TYPE.AP02),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP02)).append(CMDSPLIT)\r
-                .append(ds.getLanguage()).append(CMDSPLIT)\r
-                .append(0).append(CMDSPLIT) //为0时不回复地址\r
-                .append(ds.getLBSMultiStationData()).append(CMDSPLIT)  //基站信息数据\r
-                .append(apsum).append(CMDSPLIT).append(ds.getWifiInfo()).append(CMDEND).toString());  //wifi信息数据\r
-    }\r
-\r
-    //处理 定位 BP01\r
-    public void handleBP02(String cmd){\r
-        log("BP02定位接收成功");\r
-    }\r
-\r
-\r
-\r
-    public static StringMessage APXL(String id){\r
-//设备响应:      IWAPXL,080835#\r
-        //080835:指令流水号\r
-        return genStringMessage(cmdMap.get(CMD_TYPE.APXL),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APXL))\r
-                .append(CMDSPLIT).append(id)\r
-                .append(CMDEND).toString());\r
-    }\r
-\r
-    /**\r
-     * 测量心率\r
-     * @param cmd\r
-     * @param connection\r
-     */\r
-    public void handleBPXL(String cmd, Connection connection){\r
-        //IWBPXL,353456789012345,080835#\r
-        //说明:\r
-        //IW:标识符\r
-        //BPXL : 命令字符\r
-        //353456789012345:IMEI号,设备唯一ID\r
-        //080835 :指令流水号\r
-        //设备响应:      IWAPXL,080835#\r
-        //080835:指令流水号\r
-        String[] list=cmd.split(CMDSPLIT);\r
-        if (list.length==3){\r
-            String index=list[2];\r
-            String imei=list[1];\r
-            ICLogger.i("Handle BPXL IMEI "+imei+",index "+index);\r
-            connection.send(APXL(index));\r
-        }else{\r
-            ICLogger.i("BPXL format error!");\r
-        }\r
-\r
-    }\r
-\r
-    public static StringMessage APXY(String id){\r
-//设备响应:      IWAPXY,080835#\r
-        //080835:指令流水号\r
-        return genStringMessage(cmdMap.get(CMD_TYPE.APXY),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APXY))\r
-                .append(CMDSPLIT).append(id)\r
-                .append(CMDEND).toString());\r
-    }\r
-\r
-    /**\r
-     * 测量血压\r
-     * @param cmd\r
-     * @param connection\r
-     */\r
-    public void handleBPXY(String cmd,Connection connection){\r
-        //IWBPXY,353456789012345,080835#\r
-        //说明:\r
-        //IW:标识符\r
-        //BPXL : 命令字符\r
-        //353456789012345:IMEI号,设备唯一ID\r
-        //080835 :指令流水号\r
-        //设备响应:      IWAPXY,080835#\r
-        //080835:指令流水号\r
-        String[] list=cmd.split(CMDSPLIT);\r
-        if (list.length==3){\r
-            String index=list[2];\r
-            String imei=list[1];\r
-            ICLogger.i("Handle BPXY IMEI "+imei+",index "+index);\r
-            connection.send(APXY(index));\r
-        }else{\r
-            ICLogger.i("BPXY format error!");\r
-        }\r
-\r
-    }\r
-\r
-\r
-\r
-    public static StringMessage APJZ(String id,String BPH,String BPL,String Age,String Sex){\r
-        //设备响应:      IWAPJZ,792997,120,85,42,1#\r
-        //792997:指令流水号\r
-        // 高压120,低压85,年龄42,1 男性\r
-        return genStringMessage(cmdMap.get(CMD_TYPE.APJZ),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APJZ))\r
-                .append(CMDSPLIT).append(id)\r
-                .append(CMDSPLIT).append(BPH)\r
-                .append(CMDSPLIT).append(BPL)\r
-                .append(CMDSPLIT).append(Age)\r
-                .append(CMDSPLIT).append(Sex)\r
-                .append(CMDEND).toString());\r
-    }\r
-\r
-    /**\r
-     *\r
-     * @param cmd\r
-     * @param connection\r
-     * @param runtime\r
-     */\r
-    public void handleBPJZ(String cmd,Connection connection,Runtime runtime){\r
-        //cmdbuf.size 42 IWBPJZ,867155030001063,199600,120,85,45,1#   高压120,低压85,年龄45,男性\r
-//        cmdbuf.size 42 IWBPJZ,867155030001063,909957,120,85,42,0#  高压120,低压85,年龄42,女性\r
-        //IWBPJZ,353456789012345,080835,110,75#\r
-        //说明:\r
-        //IW:标识符\r
-        //BPJZ : 命令字符\r
-        //353456789012345:IMEI号,设备唯一ID\r
-        //110:高压值\r
-        //75:低压值\r
-        //080835 :指令流水号\r
-        //设备响应:      IWAPJZ,792997,120,85,42,1#\r
-        //792997:指令流水号\r
-        String[] list=cmd.split(CMDSPLIT);\r
-        if (list.length==7){\r
-            try {\r
-                String index = list[2];\r
-                String imei = list[1];\r
-                String strBPH = list[3];\r
-                String strBPL = list[4];\r
-                String strAge = list[5];\r
-                String strSex = list[6];\r
-\r
-                connection.send(APJZ(index, strBPH, strBPL, strAge, strSex));\r
-                runtime.getHRS().setXY_Ref(Integer.parseInt(strBPH), Integer.parseInt(strBPL), Integer.parseInt(strAge), Integer.parseInt(strSex));\r
-                ICLogger.i("Handle BPJZ IMEI " + imei + ",index " + index + ", BPH " + strBPH + ", BPL " + strBPL + ", Age " + strAge + ", Sex " + (strSex.equals("1") ? "男" : "女"));\r
-            }catch (Exception e){\r
-                ICLogger.e(e.getMessage(),e);\r
-            }\r
-        }else{\r
-            ICLogger.i("BPXY format error!");\r
-        }\r
-    }\r
-\r
-\r
-\r
-    //重启\r
-\r
-\r
-    public static StringMessage AP18(String index){\r
-        return genStringMessage(cmdMap.get(CMD_TYPE.AP18),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP18))\r
-                .append(CMDSPLIT).append(index)\r
-                .append(CMDEND).toString());\r
-    }\r
-\r
-    public void handleBP18(Connection connection,String cmd) {\r
-\r
-        //    IWBP18,867155030001063,161723\r
-        String[] cmdlist=cmd.split(CMDSPLIT);\r
-        if (cmdlist.length==3) {\r
-\r
-            connection.send(AP18(cmdlist[2]));\r
-\r
-        }\r
-    }\r
-    //恢复出厂设置\r
-\r
-    public static StringMessage AP17(String index){\r
-        return genStringMessage(cmdMap.get(CMD_TYPE.AP17),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP17))\r
-                .append(CMDSPLIT).append(index)\r
-                .append(CMDEND).toString());\r
-    }\r
-    public void handleBP17(Connection connection,String cmd) {\r
-\r
-        //    IWBP17,867155030001063,161723\r
-        String[] cmdlist=cmd.split(CMDSPLIT);\r
-        if (cmdlist.length==3) {\r
-\r
-            connection.send(AP17(cmdlist[2]));\r
-\r
-        }\r
-    }\r
-\r
-    //关机\r
-\r
-\r
-    public static StringMessage AP31(String index){\r
-        return genStringMessage("AP31",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP31))\r
-                .append(CMDSPLIT).append(index)\r
-                .append(CMDEND).toString());\r
-    }\r
-    public void handleBP31(Connection connection,String cmd) {\r
-\r
-        //    IWBP31,867155030001063,161723\r
-        String[] cmdlist=cmd.split(CMDSPLIT);\r
-        if (cmdlist.length==3) {\r
-\r
-            connection.send(AP31(cmdlist[2]));\r
-\r
-        }\r
-    }\r
-\r
-    //设置SOS号码\r
-    public static StringMessage AP12(String index,String phNum1,String phNum2,String phNum3){\r
-        return genStringMessage("AP12",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP12))\r
-                .append(CMDSPLIT).append(index)\r
-                .append(CMDSPLIT).append(phNum1)\r
-                .append(CMDSPLIT).append(phNum2)\r
-                .append(CMDSPLIT).append(phNum3)\r
-                .append(CMDEND).toString());\r
-    }\r
-\r
-    //设置SOS号码\r
-    public void handleBP12(Connection connection,String cmd,Runtime runtime){\r
-        //    IWBP12,353456789012345,080835,135XXXXXXXX,135XXXXXXXX,135XXXXXXXX#\r
-        String[] cmdlist=cmd.split(CMDSPLIT);\r
-        if (cmdlist.length>=3){\r
-            String index=cmdlist[2];\r
-            String phNum1=cmdlist.length==3?"":cmdlist[3];\r
-            String phNum2=cmdlist.length>3?(cmdlist.length==4?"":cmdlist[4]):"";\r
-            String phNum3=(cmdlist.length>4)?(cmdlist.length==5? "":cmdlist[5]):"";\r
-            ICLogger.i(new StringBuffer().append("get Emegency Numbs "+phNum1+","+phNum2+","+phNum3).toString());\r
-            connection.send(AP12(index,phNum1,phNum2,phNum3));\r
-\r
-            ArrayList<Contact> contactArray=new ArrayList<Contact>();\r
-//            if(Config.custom_branch_name.equals("AK")){\r
-//\r
-//                contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos1", "07522312120"));\r
-//                if (!phNum1.isEmpty())\r
-//                    contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos2", phNum1));\r
-//                if (!phNum2.isEmpty())\r
-//                    contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos3", phNum2));\r
-//            }else {\r
-                if (!phNum1.isEmpty())\r
-                    contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos1", phNum1));\r
-                if (!phNum2.isEmpty())\r
-                    contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos2", phNum2));\r
-                if (!phNum3.isEmpty())\r
-                    contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos3", phNum3));\r
-//            }\r
-            runtime.getDbHelper().saveContacts(contactArray,false,false,false,false,false,true);\r
-        }else{\r
-            ICLogger.i(" BP12 format error!");\r
-        }\r
-    }\r
-\r
-\r
-    public static StringMessage  AP14(String index,String[] phnumbs){\r
-        return genStringMessage("AP14",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP14))\r
-                .append(CMDSPLIT).append(index)\r
-                .append(CMDSPLIT).append(phnumbs[0])\r
-                .append(CMDSPLIT).append(phnumbs[1])\r
-                .append(CMDSPLIT).append(phnumbs[2])\r
-                .append(CMDSPLIT).append(phnumbs[3])\r
-                .append(CMDSPLIT).append(phnumbs[4])\r
-                .append(CMDSPLIT).append(phnumbs[5])\r
-                .append(CMDSPLIT).append(phnumbs[6])\r
-                .append(CMDSPLIT).append(phnumbs[7])\r
-                .append(CMDSPLIT).append(phnumbs[8])\r
-                .append(CMDSPLIT).append(phnumbs[9])\r
-                .append(CMDEND).toString());\r
-    }\r
-    //设置通讯录,白名单(10个)\r
-    public void handleBP14(Connection connection,String cmd , Runtime runtime){\r
-//        IWBP14,867155030001063,357444,9b44529b|13554820016,,,,,,,,,\r
-/**\r
- * IWBP14,353456789012345,080835,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx#\r
- */\r
-        String[] cmdlist=cmd.split(CMDSPLIT);\r
-        String[] phnums=new String[]{"","","","","","","","","",""};\r
-        StringBuffer sb=new StringBuffer().append("recv phone Numbs ");\r
-        if (cmdlist.length>=3){\r
-            switch (cmdlist.length){\r
-                case 13:\r
-                    phnums[9]=cmdlist[12];\r
-                    sb.append(phnums[9]).append(",");\r
-                case 12:\r
-                    phnums[8]=cmdlist[11];\r
-                    sb.append(phnums[8]).append(",");\r
-                case 11:\r
-                    phnums[7]=cmdlist[10];\r
-                    sb.append(phnums[7]).append(",");\r
-                case 10:\r
-                    phnums[6]=cmdlist[9];\r
-                    sb.append(phnums[6]).append(",");\r
-                case 9:\r
-                    phnums[5]=cmdlist[8];\r
-                    sb.append(phnums[5]).append(",");\r
-                case 8:\r
-                    phnums[4]=cmdlist[7];\r
-                    sb.append(phnums[4]).append(",");\r
-                case 7:\r
-                    phnums[3]=cmdlist[6];\r
-                    sb.append(phnums[3]).append(",");\r
-                case 6:\r
-                    phnums[2]=cmdlist[5];\r
-                    sb.append(phnums[2]).append(",");\r
-                case 5:\r
-                    phnums[1]=cmdlist[4];\r
-                    sb.append(phnums[1]).append(",");\r
-                case 4:\r
-                    phnums[0]=cmdlist[3];\r
-                    sb.append(phnums[0]).append(",");\r
-\r
-            }\r
-\r
-            String index=cmdlist[2];\r
-            ICLogger.i(sb.toString());\r
-            connection.send(AP14(index,phnums));\r
-            ArrayList<Contact> contactArray=new ArrayList<Contact>();\r
-\r
-            if(Config.custom_name.equals("YT")) {\r
-                ICLogger.i("=====add hotline 96885 ");\r
-                contactArray.add(new Contact(Contact.CATEGORY_CALL, runtime.getContextProxy().context.getResources().getString(R.string.hotline), "96885"));\r
-            }\r
-            for (int i=0; i< phnums.length;i++){\r
-                String[] tmp= phnums[i].split("\\|");\r
-                if (tmp.length==2){\r
-                    String name= Util.decodeUnicode2Utf8(tmp[0]);\r
-                    String phonem=tmp[1];\r
-                    ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length+" , name="+name+",-"+phonem);\r
-                    contactArray.add(new Contact(Contact.CATEGORY_CALL,name,phonem));\r
-                }else{\r
-                    ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length);\r
-\r
-                }\r
-            }\r
-//            contactArray.add(new Contact(Contact.CATEGORY_GROUP,"All","666"));\r
-//            contactArray.add(new Contact(Contact.CATEGORY_PARTNER,"PARTNER","666"));\r
-//            contactArray.add(new Contact(Contact.CATEGORY_CARE,"CARE","666"));\r
-//            contactArray.add(new Contact(Contact.CATEGORY_VOLTE,"VOLTE","666"));\r
-\r
-            runtime.getDbHelper().saveContacts(contactArray,false,false,true,false,false,false);\r
-\r
-        }else{\r
-            ICLogger.i(" BP14 format error!");\r
-        }\r
-\r
-    }\r
-\r
-\r
-\r
-    public static StringMessage AP85(Runtime ds,String cmddata){\r
-//示例数据:IWAP49,68##\r
-        return genStringMessage("AP85",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP85))\r
-                .append(CMDSPLIT).append(cmddata)\r
-                .append(CMDEND).toString());\r
-\r
-    }\r
-    //设置闹钟\r
-    public void handleBP85(String cmd , Connection connection,Runtime runtime){\r
-//        IWBP85,867155030001063,155312,1,1,0235,12,1,1\r
-//        IWBP85,867155030002145,945166,1,0,\r
-//        IWBP85,867155030001064,265960,1,1,1130,,1,1\r
-//        IWBP85,353456789012345,080835,1,3, 0900,135,1,1@0900 ,135,1,2@0900 ,135,1,3#\r
-//353456789012345:IMEI号,设备唯一ID\r
-//080835 :指令流水号\r
-//1: 表示闹钟总开关,1为开,0 为关\r
-//3: 表示闹钟个数\r
-//0900 ,135,1,1,表示一组闹钟,0900表示早上09:00, 135表示周一周三周五,使用24小时制\r
-//1表示该组闹钟开启或关闭状态   1表示开启  0表示关闭\r
-//1表示吃药提醒\r
-//2 表示喝水提醒\r
-//3 表示久坐提醒\r
-//多组闹钟之间用”@”符号分隔\r
-\r
-        String imei="",cmdindex="0"/*指令流水号*/;\r
-        int     all_alarmswitch=0 /*总开关 1为开,0 为关*/,\r
-                alarmswitch=0 /*1为开,0 为关*/,\r
-                alarmcount=0 /*表示闹钟个数*/;\r
-        String alarmtime="";//0900表示早上09:00\r
-        int alarmtype=1; //1表示吃药提醒 , 2 表示喝水提醒 ,3 表示久坐提醒\r
-        String repeat="";// 135表示周一周三周五,使用24小时制\r
-        String[] datalist= cmd.split("@");\r
-        ArrayList<Alarm> alarmlist=new ArrayList<>();\r
-        if (datalist.length >0){\r
-            for (int i =0 ; i< datalist.length;i++){\r
-                String [] cmdarglist=datalist[i].split(",");\r
-\r
-                if (i == 0){\r
-                    if (cmdarglist.length == 9){\r
-                        try {\r
-                            imei = cmdarglist[1];\r
-                            cmdindex = cmdarglist[2];\r
-                            all_alarmswitch = Integer.parseInt(cmdarglist[3]);\r
-                            alarmcount = Integer.parseInt(cmdarglist[4]);\r
-                            alarmtime = cmdarglist[5];\r
-                            repeat = cmdarglist[6];\r
-                            alarmswitch = Integer.parseInt(cmdarglist[7]);\r
-                            alarmtype = Integer.parseInt(cmdarglist[8]);\r
-                            log(new StringBuilder("imei ").append(imei)\r
-                                    .append(", cmdindex ").append(cmdindex)\r
-                                    .append(", allswitch=").append(all_alarmswitch)\r
-                                    .append(", all alarm count=").append(alarmcount)\r
-                                    .toString()\r
-                            );\r
-\r
-                            log(new StringBuilder("alarmtime ").append(alarmtime)\r
-                                    .append(", relpeat ").append(repeat)\r
-                                    .append(", switch=").append(alarmswitch)\r
-                                    .append(", alarmtype=").append(alarmtype)\r
-                                    .toString()\r
-                            );\r
-                            alarmlist.add(new Alarm("ST" + alarmtime.substring(0, 2) + "." + alarmtime.substring(2), "W" + repeat, "CON", alarmswitch == 1 ? "ON" : "OFF", "闹铃"));\r
-                        }catch (Exception e) {\r
-                            ICLogger.e(e.getMessage(), e);\r
-                        }\r
-                    }else if (cmdarglist.length == 5) {\r
-                     try {\r
-                         imei = cmdarglist[1];\r
-                         cmdindex = cmdarglist[2];\r
-                         all_alarmswitch = Integer.parseInt(cmdarglist[3]);\r
-                         alarmcount = Integer.parseInt(cmdarglist[4]);\r
-                     }catch (Exception e) {\r
-                         ICLogger.e(e.getMessage(), e);\r
-                     }\r
-                    }else{\r
-                        log("data len is too small!");\r
-                    }\r
-                }else{\r
-                    if (cmdarglist.length == 4){\r
-                        try {\r
-                            alarmtime = cmdarglist[0];\r
-                            repeat = cmdarglist[1];\r
-                            alarmswitch = Integer.parseInt(cmdarglist[2]);\r
-                            alarmtype = Integer.parseInt(cmdarglist[3]);\r
-\r
-                            log(new StringBuilder("set alarmtime ").append(alarmtime)\r
-                                    .append(", relpeat ").append(repeat)\r
-                                    .append(", switch=").append(alarmswitch)\r
-                                    .append(", alarmtype=").append(alarmtype)\r
-                                    .toString()\r
-                            );\r
-\r
-                            alarmlist.add(new Alarm("ST" + alarmtime.substring(0, 2) + "." + alarmtime.substring(2), "W" + repeat, "CON", alarmswitch == 1 ? "ON" : "OFF", "闹铃"));\r
-                        }catch (Exception e){\r
-                            ICLogger.e(e.getMessage(),e);\r
-                        }\r
-                    }else{\r
-                        log("data len is too small!");\r
-                    }\r
-\r
-                }\r
-            }//循环获取alarm数据结束\r
-            runtime.getDbHelper().saveAlarm(alarmlist);\r
-\r
-            //do clean and set alarm things\r
-\r
-        }\r
-//IWBP85,867155030002145,410385,1,0,#\r
-\r
-        String replacement=new StringBuilder("IWBP85,").append(imei).append(",").toString();\r
-        String replycmd = cmd.replace(replacement,"");\r
-        ICLogger.i("gen reply "+replacement+" "+replycmd);\r
-        connection.send(AP85(runtime,replycmd));\r
-    }\r
-\r
-\r
-// AP05命令L02服务器不适用\r
-//    public static String AP05(boolean recvFlag){\r
-//\r
-////        IWAP05,1#\r
-//        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP05))\r
-//                .append(CMDSPLIT).append(recvFlag?1:0)\r
-//                .append(CMDEND).toString();\r
-//\r
-//    }\r
-//\r
-//\r
-//    public void handleBP05(String cmd){\r
-////        IWBP05,6#\r
-//        String[] cmdlist=cmd.split(CMDSPLIT);\r
-//        if (cmdlist.length>1){\r
-//            ICLogger.i(" 服务器有 " +cmdlist[1]+" 条语音未接收!");\r
-//        }\r
-//    }\r
-\r
-\r
-\r
-\r
-    public static byte[] AP07(String  packetTime,int count,int index,int datalen,byte[] amrdata){\r
-//IWAP07,20140818064408,6,1,1024,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#\r
-//说明:\r
-//IW:标识符\r
-//AP07 : 命令字符\r
-//20140818064408 :yyyyMMddHHmmss 格式的年月日时分秒,设备录音时间\r
-//6:语音包分包总数\r
-//1 :当前包数,第一包为1,第二包为2,。。。。。。同一个语音包的语音时间相同\r
-//1024 :语音包长度\r
-//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:当前音频数据, 每个音频数据包大小为1024字节,最后一包不足1024的取实际字节数\r
-//语音包上传规则:\r
-//按包次序依次上传,上传后如果没有收到服务器的响应包,则继续上传该语音包。\r
-//收到设备回复确认数据包接收成功状态后,继续开始依次上传下一个数据包。。。。。。\r
-//如果设备回复确认数据包接收失败状态,则重复发送上一个数据包\r
-\r
-\r
-        String sb=new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP07))\r
-                .append(CMDSPLIT).append(packetTime)\r
-                .append(CMDSPLIT).append(count)\r
-                .append(CMDSPLIT).append(index)\r
-                .append(CMDSPLIT).append(datalen)\r
-                .append(CMDSPLIT).toString();\r
-\r
-        byte[] sentbuf=new byte[sb.length()+datalen+1];\r
-        System.arraycopy(sb.getBytes(),0,sentbuf,0,sb.length());\r
-        System.arraycopy(amrdata,0,sentbuf,sb.length(),datalen);\r
-        sentbuf[sb.length()+datalen]='#';\r
-\r
-        return sentbuf;\r
-\r
-    }\r
-\r
-\r
-    public void handleBP07(String cmd , Connection connection ){\r
-//平台响应:      IWBP07,20140818064408,6,1,1#\r
-//20140818064408:设备语音时间,yyyyMMddHHmmss 格式的年月日时分秒\r
-//6:语音包分包总数\r
-//1:当前设备收到的是第几个包\r
-//1:表示服务器接受数据成功,0表示服务器接受数据失败\r
-        String[] cmdlist=cmd.split(CMDSPLIT);\r
-        if (cmdlist.length==5){\r
-            try {\r
-                String time = cmdlist[1];\r
-                int packetCount = Integer.parseInt(cmdlist[2]);\r
-                int packetIndex = Integer.parseInt(cmdlist[3]);\r
-                int receiveSuccess = Integer.parseInt(cmdlist[4]);\r
-                ICLogger.i("服务器在" + time + " 收到语音 " + packetIndex + "/" + packetCount + " " + (receiveSuccess == 1 ? "成功" : "失敗"));\r
-                if (receiveSuccess == 1) {\r
-                    //如果服务器接收 语音成功,则设置下一个要发送的语音包Index,当index == packetCount的时候表示所有包发送完毕,停止继续发送\r
-                    voicePacket.getInstanceSent().setCurrentIndexToSent(packetIndex);\r
-                }\r
-                //发送消息,再次检查要发送的语音包,确认其发送完毕\r
-                connection.DeliverCMDMessageToSystem("SentVoicePacket", "SentVoicePacket");\r
-            }catch (Exception e){\r
-                ICLogger.e(e.getMessage(),e);\r
-            }\r
-        }else{\r
-            ICLogger.i(" BP07 Format error!");\r
-        }\r
-    }\r
-\r
-\r
-\r
-    public static StringMessage AP33(String cmdindex,int workMode){\r
-//IWAP33,080835,1#\r
-//080835:指令流水号\r
-//1:设置信息,供服务器同步\r
-        return genStringMessage("AP33",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP33))\r
-                .append(CMDSPLIT).append(cmdindex)\r
-                .append(CMDSPLIT).append(workMode)\r
-                .append(CMDEND).toString());\r
-    }\r
-\r
-    //设置工作模式\r
-    public void handleBP33(Connection connection,Runtime runtime,String cmd){\r
-\r
-//    IWBP33,867155030001063,560555,1\r
-//        IW:标识符\r
-//        BP33 : 命令字符\r
-//        353456789012345:IMEI号,设备唯一ID\r
-//        080835:指令流水号\r
-//        1:设备工作模式,1:正常模式,2:省电模式,3:紧急模式\r
-\r
-        String[] cmdlist=cmd.split(",");\r
-        if (cmdlist.length == 4){\r
-\r
-\r
-            log("work mode "+cmdlist[3]);\r
-            try {\r
-                int mod = Integer.parseInt(cmdlist[3]);\r
-                int Cycle = 900;\r
-                switch (mod) {\r
-                    case ICLocation.NORMAL_MOD:\r
-                        Cycle = 900;\r
-                        break;\r
-                    case ICLocation.LOWPOWER_MOD:\r
-                        Cycle = 3600;\r
-                        break;\r
-                    case ICLocation.EMERGNECY_MOD:\r
-                    case ICLocation.REALTIME_MOD:\r
-                        Cycle = 60;\r
-                        break;\r
-\r
-                }\r
-\r
-                StringMessage msg = AP33(cmdlist[2], mod);\r
-                //设定当前工作模式及循环频率\r
-                connection.send(msg);\r
-                log("reply msg " + msg);\r
-                log("LOCATION_MODE  " + LOCATION_MODE + " mod " + mod);\r
-                Config.setLocationMode(runtime.getContextProxy().context, mod);\r
-                Config.setLocationCycle(runtime.getContextProxy().context, Cycle);\r
-                runtime.getLocationInstance().setLocation_cycle(Cycle);\r
-                runtime.getLocationInstance().setWorkingMod(mod);\r
-            }catch (Exception e){\r
-                ICLogger.e(e.getMessage(),e);\r
-            }\r
-//            CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod());\r
-            //此处设置好配置后,会在LocationClient通过消息开始执行及时定位操作。\r
-        }\r
-\r
-    }\r
-\r
-\r
-    public static StringMessage AP34(String cmdindex,int workMode){\r
-//IWAP34,588854,1#\r
-//080835:指令流水号\r
-//8:模式\r
-        return genStringMessage("AP34",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP34))\r
-                .append(CMDSPLIT).append(cmdindex)\r
-                .append(CMDSPLIT).append(workMode)\r
-                .append(CMDEND).toString());\r
-    }\r
-\r
-    //设置自定义工作模式\r
-    public void handleBP34(Connection connection,Runtime runtime,String cmd){\r
-\r
-//    IWBP34,867155030001063,588854,8,900,1#\r
-//        IW:标识符\r
-//        BP33 : 命令字符\r
-//        353456789012345:IMEI号,设备唯一ID\r
-//        080835:指令流水号\r
-//        1:设备工作模式,1:正常模式,2:省电模式,3:紧急模式\r
-\r
-        String[] cmdlist=cmd.split(",");\r
-        if (cmdlist.length == 6){\r
-\r
-\r
-            log("work mode "+cmdlist[3]);\r
-            try {\r
-                int mod = Integer.parseInt(cmdlist[3]);\r
-                int Cycle = Integer.parseInt(cmdlist[4]);\r
-                int gpson = Integer.parseInt(cmdlist[5]);\r
-\r
-                StringMessage msg = AP34(cmdlist[2], mod);\r
-                //设定当前工作模式及循环频率\r
-                connection.send(msg);\r
-\r
-                if (gpson == 1) {\r
-                    mod = ICLocation.CUSTOM_MOD8_GPS;\r
-                } else {\r
-                    mod = ICLocation.CUSTOM_MOD8_WIFI;\r
-                }\r
-                log("reply msg " + msg.isFromCache());\r
-                log("LOCATION_MODE  " + LOCATION_MODE + " mod " + mod + ", cycle = " + Cycle + ", GPS On= " + gpson);\r
-                Config.setLocationMode(runtime.getContextProxy().context, mod);\r
-                Config.setLocationCycle(runtime.getContextProxy().context, Cycle);\r
-                runtime.getLocationInstance().setLocation_cycle(Cycle);\r
-                runtime.getLocationInstance().setWorkingMod(mod);\r
-//            CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod());\r
-                //此处设置好配置后,会在LocationClient通过消息开始执行及时定位操作。\r
-            }catch (Exception e){\r
-                ICLogger.e(e.getMessage(),e);\r
-            }\r
-        }\r
-\r
-    }\r
-    public void handleBP40(Connection connection,Runtime runtime,String cmd){\r
-\r
-//        IWBP40,353456789012345,080835,XXXXXXXXXXXXXX#\r
-//        IW:标识符\r
-//        BP40 : 命令字符\r
-//        353456789012345:IMEI号,设备唯一ID\r
-//        080835 :指令流水号\r
-//        XXXXXXXXXXXX : 表示文字内容GB2312编码\r
-\r
-\r
-        String[] cmdlist=cmd.split(",");\r
-        if (cmdlist.length == 4){\r
-            String cmdindex=cmdlist[2];\r
-            String txtmsg=cmdlist[3];\r
-            StringBuilder sb=new StringBuilder();\r
-            runtime.PushtxtMsg_srv_index=cmdindex;//给回复AP94用\r
-            sb.append(cmdindex).append(CMDSPLIT).append(TimeUtil.getSystemTimeyyyyMMddHHmmss()).append(CMDSPLIT).append(txtmsg);\r
-            if (Config.custom_name.equals("VitracK")){\r
-\r
-            }else{\r
-//                txtmsg = Util.decodeUnicode2Utf8(txtmsg);\r
-                txtmsg = Util.UrlGB2312ToUTF8(txtmsg);\r
-            }\r
-            StringMessage msg=AP40(cmdindex,1);\r
-            //设定当前工作模式及循环频率\r
-            connection.send(msg);\r
-            ICLogger.i("received Txt Msg "+txtmsg);\r
-            if(!Config.noPushTxtReadReply) {\r
-                Config.setLastUnReadMessage(runtime.getContextProxy().context, sb.toString());\r
-                runtime.getContextProxy().sendMsgBroadcast(txtmsg,3);//msgType 3需要回复,0不需要回复\r
-            }else{\r
-                runtime.getContextProxy().sendMsgBroadcast(txtmsg,0);//msgType 3需要回复,0不需要回复\r
-            }\r
-            runtime.getContextProxy().saveMstToSMSDB(txtmsg);\r
-        }else{\r
-            ICLogger.i("BP40 format error!");\r
-        }\r
-    }\r
-    public static StringMessage AP40(String cmdindex,int success){\r
-\r
-//        IWAP40,080835,1#\r
-//        080835:指令流水号\r
-//        1:表示设备接受数据成功,0表示设备接受数据失败\r
-        return genStringMessage("AP40",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP40))\r
-                .append(CMDSPLIT).append(cmdindex)\r
-                .append(CMDSPLIT).append(success)\r
-                .append(CMDEND).toString());\r
-    }\r
-\r
-\r
-    /**\r
-     * 心率上传,返回协议字串\r
-     * @param ds\r
-     * @return\r
-     */\r
-    public static StringMessage AP49(Runtime ds){\r
-        //示例数据:IWAP49,68##\r
-        return genStringMessage(cmdMap.get(CMD_TYPE.AP49),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP49))\r
-                .append(CMDSPLIT).append(ds.getHRS().getPPG())\r
-                .append(CMDEND).toString());\r
-\r
-    }\r
-\r
-\r
-\r
-\r
-    /**\r
-     * 返回上传心率血压的协议字串\r
-     * @param ds\r
-     * @return\r
-     */\r
-    public static StringMessage APHT(Runtime ds){\r
-        //IWAPHT,60,130,85#\r
-        //说明:\r
-        //IW:标识符\r
-        //APHT : 命令字符\r
-        //60 : 表示心率\r
-        //130: 血压高压 [收缩压]\r
-        //85 : 血压低压 [舒张压]\r
-        //平台响应:      IWBPHT#\r
-        //表示平台已接收,可不作响应\r
-        return genStringMessage(cmdMap.get(CMD_TYPE.APHT),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APHT))\r
-                .append(CMDSPLIT).append(ds.getHRS().getPPG())\r
-                .append(CMDSPLIT).append(ds.getHRS().getBPH())\r
-                .append(CMDSPLIT).append(ds.getHRS().getBPL())\r
-                .append(CMDEND).toString());\r
-    }\r
-    public static StringMessage APHT(int  ppg,int bph,int bpl){\r
-        //IWAPHT,60,130,85#\r
-        //说明:\r
-        //IW:标识符\r
-        //APHT : 命令字符\r
-        //60 : 表示心率\r
-        //130: 血压高压 [收缩压]\r
-        //85 : 血压低压 [舒张压]\r
-        //平台响应:      IWBPHT#\r
-        //表示平台已接收,可不作响应\r
-        return genStringMessage(cmdMap.get(CMD_TYPE.APHT),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APHT))\r
-                .append(CMDSPLIT).append(ppg)\r
-                .append(CMDSPLIT).append(bph)\r
-                .append(CMDSPLIT).append(bpl)\r
-                .append(CMDEND).toString());\r
-    }\r
-\r
-\r
-    //立即定位反馈\r
-    public static StringMessage AP16(String  cmdindex){\r
-//IWAP16,080835#\r
-//080835:指令流水号\r
-        return genStringMessage(cmdMap.get(CMD_TYPE.AP16),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP16))\r
-                .append(CMDSPLIT).append(cmdindex)\r
-                .append(CMDEND).toString());\r
-    }\r
-    //    立即定位指令(长链接有效)\r
-    public void handleBP16(Connection connection,Runtime runtime,String cmd){\r
-        //示例数据:IWBP16,867155030001063,335386\r
-//        IWBP16,353456789012345,080835#\r
-//        说明:\r
-//        IW:标识符\r
-//        BP16 : 命令字符\r
-//        353456789012345:IMEI号,设备唯一ID\r
-//        080835 :指令流水号\r
-        String[] cmdlist = cmd.split(",");\r
-        if(cmdlist.length==3){\r
-            log("imei "+cmdlist[1]+", cmdindex "+cmdlist[2]);\r
-\r
-            connection.send(AP16(cmdlist[2]));\r
-        }else{\r
-            log("error BP16 format");\r
-        }\r
-    }\r
-\r
-\r
-    /*通过基站获取时间和坐标*/\r
-    public static StringMessage APTM(Runtime ds){\r
-        //示例数据:IWAPTM,460,0,9750,3613#\r
-        //说明:\r
-        //IW:标识符\r
-        //APTM : 命令字符\r
-        //460:MCC\r
-        //0: MNC\r
-        //9750: LAC\r
-        //3613: CID\r
-\r
-        return genStringMessage(cmdMap.get(CMD_TYPE.APTM),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTM))\r
-                .append(CMDSPLIT).append(ds.getLocationInstance().getMCC())\r
-                .append(CMDSPLIT).append(ds.getLocationInstance().getMNC())\r
-                .append(CMDSPLIT).append(ds.getLocationInstance().getLAC())\r
-                .append(CMDSPLIT).append(ds.getLocationInstance().getGSMStationCID())\r
-                .append(CMDEND).toString());\r
-\r
-    }\r
-\r
-    public void handleBPTM(String cmd){\r
-        //平台响应:      IWBPTM,20160225090909,22.123456,113.654321#\r
-        //返回时间,格式为:yyyyMMddHHmmss ,为UTC0 时间\r
-        //经纬度保留六位小数,若没取到则返回 0\r
-        String[] list=cmd.split(CMDSPLIT);\r
-\r
-        if(list.length==4){\r
-\r
-            String time=list[1];\r
-            String lat=list[2];\r
-            String lon=list[3];\r
-            ICLogger.i("BPTM , time="+time+", lat="+lat+", lon="+lon);\r
-        }else{\r
-            ICLogger.i("BPTM format error");\r
-        }\r
-\r
-\r
-    }\r
-\r
-    public static StringMessage AP15(String index){\r
-//IWAP15, 080835#\r
-//080835:指令流水号\r
-        return genStringMessage("AP15",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP15))\r
-                .append(CMDSPLIT).append(index)\r
-                .append(CMDEND).toString());\r
-    }\r
-\r
-    //设置定位周期\r
-    public void handleBP15(String cmd ,Connection connection,Runtime runtime){\r
-//        IWBP15, 353456789012345, 080835, 30#\r
-//        353456789012345:IMEI号,设备唯一ID\r
-//        080835 :指令流水号\r
-//        30: 表示频率为30分钟\r
-\r
-        String[] list=cmd.split(CMDSPLIT);\r
-\r
-        if(list.length==4){\r
-            String index=list[2];\r
-            String time=list[3];\r
-            connection.send(AP15(index));\r
-            ICLogger.i("BP15 , 定位周期="+time+"秒");\r
-\r
-            try {\r
-                Config.setLocationMode(runtime.getContextProxy().context, ICLocation.CUSTOM_MOD8_GPS);\r
-                Config.setLocationCycle(runtime.getContextProxy().context, Integer.parseInt(time) );\r
-                runtime.getLocationInstance().setWorkingMod(Config.getLocationMode(runtime.getContextProxy().context));\r
-                runtime.getLocationInstance().setLocation_cycle(Config.getLocationCycle(runtime.getContextProxy().context));\r
-                //set AlarmCycle  and trigger Location\r
-                CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod());\r
-            }catch (Exception e){\r
-                ICLogger.e(e.getMessage(),e);\r
-            }\r
-        }else{\r
-            ICLogger.i("BP15 format error");\r
-        }\r
-\r
-    }\r
-\r
-\r
-\r
-\r
-\r
-\r
-    /*语音下行反馈*/\r
-    public static StringMessage AP28(String name, String msg, int packagecount, int currentpackageindex, int received_success) {\r
-        //示例数据:IWAP28,D3590D54,xxxx,6,1,1#\r
-        return genStringMessage("AP28",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP28))\r
-                .append(CMDSPLIT).append(name)\r
-                .append(CMDSPLIT).append(msg)\r
-                .append(CMDSPLIT).append(packagecount)\r
-                .append(CMDSPLIT).append(currentpackageindex)\r
-                .append(CMDSPLIT).append(received_success)\r
-                .append(CMDEND).toString());\r
-    }\r
-\r
-    //处理 BP28 语音消息\r
-    public void handleBP28(Connection connection,String cmd,Runtime runtime,byte[] bytes) {\r
-        //log("handleBP28 msg"+cmd);\r
-/**\r
- * IWBP28, D3590D54,XXXX,6,1,1024,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#\r
- * 说明:\r
- * IW:标识符\r
- * BP28 : 命令字符\r
- * D3590D54:UNICODE编码,发送者名称\r
- * XXXX: 附加信息,在响应数据包时,将附加信息原样响应,类似流水号\r
- * 6:语音包分包总数\r
- * 1 :当前包数,第一包为1,第二包为2,。。。。。。同一个语音包的语音时间相同\r
- * 1024 :语音包长度\r
- * XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:当前音频数据, 每个音频数据包大小为1024字节,最后一包不足1024的取实际字节数\r
- * 语音包上传规则:\r
- * 按包次序依次上传,上传后如果没有收到服务器的响应包,则继续上传该语音包。\r
- * 收到设备回复确认数据包接收成功状态后,继续开始依次上传下一个数据包。。。。。。\r
- * 如果设备回复确认数据包接收失败状态,则重复发送上一个数据包\r
- * 设备响应:     IWAP28,D3590D54,XXXX,6,1,1#\r
- * D3590D54:UNICODE编码,发送者名称\r
- * XXXX: 附加信息,原样返回\r
- * 6:语音包分包总数\r
- * 1:当前设备收到的是第几个包\r
- * 1:表示设备接受数据成功,0表示设备接受数据失败\r
- */\r
-        String Name;\r
-        String appendIndex;\r
-        int packetCount;\r
-        int currentId;\r
-        int packetLen;\r
-        byte[] packetData;\r
-\r
-        String[] msg= cmd.split(CMDSPLIT);\r
-        if (msg.length>=6){\r
-\r
-            try {\r
-                Name = msg[1];\r
-                appendIndex = msg[2];\r
-                packetCount = Integer.parseInt(msg[3]);\r
-                currentId = Integer.parseInt(msg[4]);\r
-                packetLen = Integer.parseInt(msg[5]);\r
-                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);\r
-\r
-                StringBuffer stringBuffer = new StringBuffer();\r
-                stringBuffer.append("recv BP28 name = ").append(Name)\r
-                        .append(",appendIndex = ").append(appendIndex)\r
-                        .append(",packetCount = ").append(packetCount)\r
-                        .append(",currentId = ").append(currentId)\r
-                        .append(",packetLen = ").append(packetLen)\r
-                        .append(",packetDatalen = ").append(packetData.length);\r
-\r
-                log(stringBuffer.toString());\r
-                connection.send(AP28(Name, appendIndex, packetCount, currentId, 1));\r
-                voicePacket.getInstance().appendVoice(Name, appendIndex, packetCount, currentId, packetLen, packetData);\r
-                log("================" + voicePacket.getInstance().toString());\r
-                if (voicePacket.getInstance().isFinished()) {\r
-\r
-                    String dir = Environment.getExternalStorageDirectory() + "/Android/VoiceCache";\r
-                    String amrFilepath = Util.saveFile(voicePacket.getInstance().getVoicePacketBytes(), 0, voicePacket.getInstance().getVoicePacketLen(), new File(dir), "receive_" + voicePacket.getInstance().getPacketTime() + ".amr");\r
-                    ICLogger.i("save Amr file to " + amrFilepath);\r
-                    voicePacket.getInstance().clearPacket();\r
-                    VoiceContent voiceContent = VoiceContent.placeHolderIn(Content.CONTACT_CATEGORY_GROUP, GROUP_ALL, amrFilepath);\r
-\r
-\r
-                    final Uri uri2 = runtime.getDbHelper().insertMessage(voiceContent);\r
-\r
-                    //回复UI消息,表示已经接收到\r
-                    voiceContent.status = 3;\r
-                    voiceContent.serverTime = TimeUtil.getSystemTime3();\r
-                    voiceContent.preview = String.valueOf(Util.getDuration(voiceContent.content));\r
-                    runtime.getDbHelper().updateMessage(voiceContent, uri2);\r
-\r
-//                runtime.getContextProxy().sendBroadcast(ACTION_IMESSAGE, runtime);\r
-\r
-                    connection.DeliverCMDMessageToSystem("NewVoice", amrFilepath);//通知下面线程状态变化\r
-                }\r
-            }catch (Exception e){\r
-                ICLogger.e(e.getMessage(),e);\r
-            }\r
-\r
-        }else{\r
-            log("handleBP28","format Error");\r
-//            connection.send(genStringMessage("AP28",AP28(Name,appendIndex,packetCount,currentId,0)));\r
-\r
-        }\r
-\r
-    }\r
-\r
-    public void sendBroadcast(String cmd, Runtime dev) {\r
-\r
-        ComponentName componentName = new ComponentName("com.eqc.watch", "com.eqc.watch.launcher.ChatActivity");\r
-        Intent intent = new Intent("android.intent.action.MAIN");\r
-//              intent.putExtra("ACTIVITY_TYPE", 2);\r
-//              intent.addCategory("android.intent.category.DEFAULT");\r
-        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\r
-        intent.setComponent(componentName);\r
-        dev.getContextProxy().context.startActivity(intent);\r
-    }\r
-\r
-    //白名单开关(下行协议号:BP84,响应:AP84)\r
-    public static StringMessage AP84(String index,int success){\r
-\r
-        //设备响应:      IWAP80,080835,1#\r
-        //080835:指令流水号\r
-        //1:表示设备执行成功,0 表示设备执行失败\r
-        return genStringMessage("AP84",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP84))\r
-                .append(CMDSPLIT).append(index)\r
-                .append(CMDSPLIT).append(success)\r
-                .append(CMDEND).toString());\r
-    }\r
-\r
-    public void handleBP84(String cmd,Connection connection){\r
-//示例:\r
-        //IWBP84,353456789012345,080835,1#\r
-        //说明:\r
-        //IW:标识符\r
-        //BP84 : 命令字符\r
-        //353456789012345:IMEI号,设备唯一ID\r
-        //080835 :指令流水号\r
-        //1: 表示白名单开,0 表示白名单关\r
-        String[] list=cmd.split(CMDSPLIT);\r
-\r
-        if (list.length==4){\r
-            String index=list[2];\r
-            String whitelist_switch=list[3];\r
-            connection.send(AP84(index,1));\r
-\r
-            if (whitelist_switch.equals("1")){\r
-                Util.setSystemProperties("persist.sys.whitelist.enable","true");\r
-            }else{\r
-                Util.setSystemProperties("persist.sys.whitelist.enable","false");\r
-            }\r
-            ICLogger.i("收到服务器指令:白名单"+(whitelist_switch.equals("1")?"开":"关"));\r
-\r
-        }else{\r
-\r
-            ICLogger.i("BP84 format error!");\r
-        }\r
-\r
-    }\r
-\r
-    //17.绑定解绑(下行协议号:BP68,响应:AP68)\r
-    public static StringMessage AP68(String index,String cmd){\r
-\r
-        //设备响应:      IWAP86, 080835,1#\r
-        //080835:指令流水号\r
-        return genStringMessage("AP86",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP68))\r
-                .append(CMDSPLIT).append(index)\r
-                .append(CMDSPLIT).append(cmd)\r
-                .append(CMDEND).toString());\r
-    }\r
-\r
-    public void handleBP68(String cmd,Connection connection,Runtime runtime){\r
-\r
-        //示例:\r
-        //IWBP68,353456789012345,080835,1#\r
-        //说明:\r
-        //IW:标识符\r
-        //BP68 : 命令字符\r
-        //353456789012345:IMEI号,设备唯一ID\r
-        //080835 :指令流水号\r
-        //1 : 表示设备为激活状态(绑定成功) 0:表示设备为未激活状态(解绑成功)\r
-\r
-        String[] list=cmd.split(CMDSPLIT);\r
-\r
-        if (list.length==4){\r
-            String index=list[2];\r
-            String type=list[3];\r
-            connection.send(AP68(index,type));\r
-            ICLogger.i("收到服务器消息:"+(type.equals("1")?"绑定成功 ":"未激活或者解绑"));\r
-            if (Config.custom_name.equals("YQ")||Config.custom_name.equals("YQ_EN")) {//AK-YQ\r
-                if (type.equals("1")) {\r
-                    WakeLockUtil.ScreenOnWakeLockTemperary(runtime.getContextProxy().context);\r
-//                    runtime.getContextProxy().sendMsgBroadcast(runtime.getContextProxy().context.getResources().getString(R.string.alarm_lock_success), 2);\r
-                    Util.ShowToast(runtime,runtime.getContextProxy().context.getResources().getString(R.string.alarm_lock_success));\r
-                    Config.setNeedAntiOff(runtime.getContextProxy().context,true);\r
-                    Config.setNeedCutOff(runtime.getContextProxy().context,true);\r
-                    runtime.setNeedAntioff(true);\r
-                    runtime.setNeddReportCutoff(true);\r
-                } else {\r
-                    WakeLockUtil.ScreenOnWakeLockTemperary(runtime.getContextProxy().context);\r
-                    runtime.getContextProxy().sendMsgBroadcast(runtime.getContextProxy().context.getResources().getString(R.string.alarm_unbind_success), 2);\r
-                    Config.setNeedAntiOff(runtime.getContextProxy().context,false);\r
-                    Config.setNeedCutOff(runtime.getContextProxy().context,false);\r
-                    runtime.setNeedAntioff(false);\r
-                    runtime.setNeddReportCutoff(false);\r
-                    //1 分钟后重置\r
-                    new Handler().postDelayed(new Runnable() {\r
-                        @Override\r
-                        public void run() {\r
-                            Util.doMasterClear(runtime.getContextProxy().context);\r
-                        }\r
-                    },5000);\r
-                }\r
-            }\r
-\r
-        }else{\r
-            ICLogger.i("BP86 format error!");\r
-        }\r
-\r
-    }\r
-\r
-\r
-\r
-    //17.设置心率/血压测量周期(下行协议号:BP86,响应:AP86)\r
-    public static StringMessage AP86(String index){\r
-\r
-        //设备响应:      IWAP86, 080835#\r
-        //080835:指令流水号\r
-        return genStringMessage("AP86",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP86))\r
-                .append(CMDSPLIT).append(index)\r
-                .append(CMDEND).toString());\r
-    }\r
-\r
-    public void handleBP86(String cmd,Connection connection,Runtime runtime){\r
-\r
-        //示例:\r
-        //IWBP86, 353456789012345, 080835,1,720#\r
-        //说明:IWBP86,867400020316612,858663,1,30\r
-        //IW:标识符\r
-        //BP86 : 命令字符\r
-        //353456789012345:IMEI号,设备唯一ID\r
-        //080835 :指令流水号\r
-        //1: 表示心率周期;2 :表示血压周期\r
-        //720: 表示720分钟\r
-\r
-        String[] list=cmd.split(CMDSPLIT);\r
-\r
-        if (list.length==5){\r
-            String index=list[2];\r
-            String type=list[3];\r
-            String cycle=list[4];\r
-            connection.send(AP86(index));\r
-            ICLogger.i("收到服务器指令:设置"+(type.equals("1")?"心率周期 ":"血压周期 ")+cycle+"分钟");\r
-\r
-            try {\r
-                //发送重置PPGCycle的广播,会在CoreServer里面执行\r
-                Intent intent = new Intent();\r
-                intent.putExtra("PPGTestCycle", Integer.parseInt(cycle));\r
-                intent.setFlags(FLAG_INCLUDE_STOPPED_PACKAGES);\r
-                intent.setFlags(FLAG_ACTIVITY_NEW_TASK);\r
-                runtime.getContextProxy().sendBrodcast(ACTION_HEATR_RATE_START, intent);\r
-            }catch (Exception e){\r
-                ICLogger.e(e.getMessage(),e);\r
-            }\r
-        }else{\r
-            ICLogger.i("BP86 format error!");\r
-        }\r
-\r
-    }\r
-\r
-    //IWBP87,http://cn.map20000.com/physicalReport.html?lang=zh-CN&imeis=866671044898063#\r
-    public static StringMessage AP87(){\r
-\r
-        //设备响应:      IWAP86, 080835#\r
-        //080835:指令流水号\r
-        return genStringMessage("AP87",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP87))\r
-                .append(CMDEND).toString());\r
-    }\r
-\r
-    public void handleBP87(String cmd,Connection connection,Runtime runtime){\r
-\r
-        //IWBP87,http://cn.map20000.com/physicalReport.html?lang=zh-CN&imeis=866671044898063#\r
-\r
-        String[] list=cmd.split(CMDSPLIT);\r
-\r
-        if (list.length==2){\r
-            String furl=list[1];//.replace("#","");\r
-            ICLogger.i("收到服务器指令 BP87:Qrcode url "+furl);\r
-//            connection.send(AP87());\r
-            try {\r
-                String qrfilepath=Util.getLogfilePath(runtime,TimeUtil.getSystemDateYYMMDD());\r
-                Util.setSystemProperties(Config.KeyQRURIFILE,qrfilepath);\r
-                FileOutputStream fos=new FileOutputStream(new File(qrfilepath));\r
-                fos.write(furl.getBytes());\r
-                fos.close();\r
-            }catch (Exception e){\r
-                ICLogger.e(e.getMessage(),e);\r
-            }\r
-        }else{\r
-            ICLogger.i("BP87 format error!");\r
-        }\r
-\r
-    }\r
-    public static StringMessage AP88(String index){\r
-        //设备响应:      IWAP88, 080835#\r
-        //080835:指令流水号\r
-        return genStringMessage("AP88",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP88))\r
-                .append(CMDSPLIT).append(index)\r
-                .append(CMDEND).toString());\r
-    }\r
-\r
-    public static void handleBP88(String cmd,Connection connection){\r
-//        IWBP88,080835#\r
-        String[] list=cmd.split(CMDSPLIT);\r
-\r
-        if (list.length==2){\r
-            String index=list[1];\r
-            connection.send(AP88(index));\r
-            ICLogger.i("收到服务器消息:查询设备");\r
-\r
-        }else{\r
-            ICLogger.i("BP88 format error!");\r
-        }\r
-    }\r
-\r
-    //18.18.设置心率/血压阀值(下行协议号:BP89,响应:AP89)\r
-    public static StringMessage AP89(String index){\r
-\r
-        //设备响应:      IWAP89, 080835#\r
-        //080835:指令流水号\r
-        return genStringMessage("AP89",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP89))\r
-                .append(CMDSPLIT).append(index)\r
-                .append(CMDEND).toString());\r
-    }\r
-\r
-    public void handleBP89(String cmd,Connection connection){\r
-\r
-        //示例:\r
-        //IWBP89, 353456789012345, 080835,50,90,80,90,110,140#\r
-        //说明:\r
-        //IW:标识符\r
-        //BP89 : 命令字符\r
-        //353456789012345:IMEI号,设备唯一ID\r
-        //080835 :指令流水号\r
-        //50: 心率低阀值,低于该阀值上传心率,如果未设置,则留空\r
-        //90: 心率高阀值,高于该阀值上传心率,如果未设置,则留空\r
-        //80: 低压阀值,低压低于该阀值上传血压,如果未设置,则留空\r
-        //90: 低压阀值,低压高于该阀值上传血压,如果未设置,则留空\r
-        //110: 高压阀值,高压低于该阀值上传血压,如果未设置,则留空\r
-        //140: 高压阀值,高压高于该阀值上传血压,如果未设置,则留空\r
-        String[] list=cmd.split(CMDSPLIT);\r
-        if (list.length==9){\r
-            String index=list[2];\r
-            String PPGH=list[3];\r
-            String PPGL=list[4];\r
-            String BPH_H=list[5];\r
-            String BPH_L=list[6];\r
-            String BPL_H=list[7];\r
-            String BPL_L=list[8];\r
-            connection.send(AP89(index));\r
-\r
-\r
-            \r
-            ICLogger.i("收到服务器指令:心率/血压阀值 "+PPGH+","+PPGL+","+BPH_H+","+BPH_L+","+BPL_H+","+BPL_L);\r
-        }else{\r
-            ICLogger.i("BP89 format error!");\r
-        }\r
-\r
-    }\r
-\r
-    //体温间隔测量 (后台测试体温)(下行协议号:BPTE,响应:APTE)\r
-    public static StringMessage APTE(String index,int freq){\r
-\r
-        //设备响应:      IWAPTE,080835,60#\r
-        //080835:指令流水号\r
-        //1:表示设备接受数据成功,0表示设备接受数据失败\r
-        return genStringMessage("APTE",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTE))\r
-                .append(CMDSPLIT).append(index)\r
-                .append(CMDSPLIT).append(freq)\r
-                .append(CMDEND).toString());\r
-    }\r
-\r
-    public void handleBPTE(String cmd,Connection connection,Runtime runtime){\r
-\r
-        //示例:\r
-        //IWBPTE,353456789012345,080835,60#\r
-        //说明:\r
-        //IW:标识符\r
-        //BPTE : 命令字符\r
-        //353456789012345:IMEI号,设备唯一ID\r
-        //080835 :指令流水号\r
-        //60 : 上传间隔,单位分钟(60分钟上传一次体温,终端收到后立即开始测量一次并重置定时器)\r
-        String[] list=cmd.split(CMDSPLIT);\r
-        if (list.length==4){\r
-            try {\r
-                String index = list[2];\r
-                String freqstr = list[3];\r
-                int freq = Integer.parseInt(freqstr);\r
-                connection.send(APTE(index, freq));\r
-                ICLogger.i("收到服务器指令:测量体温 " + freq + "分钟一次。");\r
-                Config.setTemperatureTestCycle(runtime, freq * 60);\r
-                CoreService.getInstance().setTempAlarm();\r
-\r
-\r
-                if(runtime.check_stat_do_temp_test()) TemperatureUtil.doTempTestInThread();\r
-            }catch (Exception e){\r
-                ICLogger.e(e.getMessage(),e);\r
-            }\r
-        }else{\r
-            ICLogger.i("BPTE format error!");\r
-        }\r
-\r
-    }\r
-\r
-    //体温上行(上行协议号:APTP,响应:BPTP)\r
-    public static StringMessage APTP(double wrist_temp,double body_temp,double tempout){\r
-\r
-        //设备:    IWAPTP,36.3,33,132#\r
-        //IW:标识符\r
-        //APTP : 命令字符\r
-        //35.3:测量体温 (摄氏度)\r
-        //33,132:温补用的参数,此处不用,可以用0 来代替。\r
-        return genStringMessage(cmdMap.get(CMD_TYPE.APTP),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTP))\r
-                .append(CMDSPLIT).append(String.format("%1$.2f",wrist_temp))\r
-                .append(CMDSPLIT).append(String.format("%1$.2f",body_temp))\r
-                .append(CMDSPLIT).append(String.format("%1$.2f",tempout))\r
-                .append(CMDEND).toString());\r
-    }\r
-\r
-    public void handleBPTP(){\r
-\r
-        ICLogger.d("BPTP 服务器收到体温数据!");\r
-\r
-    }\r
-\r
-\r
-    public static StringMessage APX1(String id){\r
-        //设备响应:      IWAPX1, 080835#\r
-        //080835:指令流水号\r
-        return genStringMessage("APX1",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APX1))\r
-                .append(CMDSPLIT).append(id)\r
-                .append(CMDEND).toString());\r
-    }\r
-\r
-    /**\r
-     *\r
-     * @param cmd\r
-     * @param connection\r
-     * @param runtime\r
-     */\r
-    public void handleBPX1(String cmd,Connection connection,Runtime runtime){\r
-        //IWBPX1,353456789012345,080835,2,1,-3,0#\r
-        //说明:\r
-//        IW:标识符\r
-//        BPX1 : 命令字符\r
-//        353456789012345:IMEI号,设备唯一ID\r
-//        080835 :指令流水号\r
-//        2: 心率修正值\r
-//        1:高压修正值\r
-//                -3:低压修正值\r
-//        0:血氧修正值\r
-        String[] list=cmd.split(CMDSPLIT);\r
-        if (list.length==7){\r
-            String index=list[2];\r
-            String imei=list[1];\r
-            String strXL=list[3];\r
-            String strBPH=list[4];\r
-            String strBPL=list[5];\r
-            String strSpO2=list[6];\r
-\r
-            connection.send(APX1(index));\r
-\r
-            try {\r
-                int ppg_adjust, bph_adjust, bpl_adjust, spo2_adjust;\r
-                ppg_adjust = Integer.parseInt(strXL);\r
-                bph_adjust = Integer.parseInt(strBPH);\r
-                bpl_adjust = Integer.parseInt(strBPL);\r
-                spo2_adjust = Integer.parseInt(strSpO2);\r
-\r
-                runtime.getHRS().setAdjust(ppg_adjust, bph_adjust, bpl_adjust, spo2_adjust);\r
-                Config.setPPGAdjust(mRuntime.getContextProxy().context, ppg_adjust);\r
-                Config.setBPHAdjust(mRuntime.getContextProxy().context, bph_adjust);\r
-                Config.setBPLAdjust(mRuntime.getContextProxy().context, bpl_adjust);\r
-                Config.setSPo2Adjust(mRuntime.getContextProxy().context, spo2_adjust);\r
-                String ShareAdjValue = new StringBuilder().append(ppg_adjust).append(CMDSPLIT)\r
-                        .append(bph_adjust).append(CMDSPLIT)\r
-                        .append(bpl_adjust).append(CMDSPLIT)\r
-                        .append(spo2_adjust).append(CMDSPLIT).toString();\r
-                Config.setPPG_ECG_adjustValue(ShareAdjValue);\r
-                ICLogger.i("Handle BPX1 IMEI " + imei + ",index " + index + ", BPH " + strBPH + ", BPL " + strBPL + ", PPG " + strXL + ", Sp02 " + strSpO2 + " , Shared Adjust Value " + ShareAdjValue);\r
-            }catch (Exception e){\r
-                ICLogger.e(e.getMessage(),e);\r
-            }\r
-        }else{\r
-            ICLogger.i("BPX1 format error!");\r
-        }\r
-    }\r
-\r
-\r
-\r
-    public static StringMessage APS4(String id){\r
-        //设备响应:      IWAPS4,080835#\r
-        //080835:指令流水号\r
-        return genStringMessage("APS4",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APS4))\r
-                .append(CMDSPLIT).append(id)\r
-                .append(CMDEND).toString());\r
-    }\r
-\r
-    /**\r
-     * 主要为久坐设置提醒时长。\r
-     * @param cmd\r
-     * @param connection\r
-     * @param runtime\r
-     */\r
-    public void handleBPS4(String cmd,Connection connection,Runtime runtime){\r
-        //IWBPS4,353456789012345,080835,1|1234567|0900|1100|180, 2|1234567|0900|1100|180, 1|1234567|0900|1100|180#\r
-        //说明:\r
-//        IW:标识符\r
-//        BPS4: 命令字符\r
-//        353456789012345:设备IMEI或者ID\r
-//        080835 :指令流水号\r
-//        1|1234567|0900|1100|180:类型(1久坐,2喝水)|重复周期|开始时间|结束时间|时间间隔(单位秒)\r
-//        重复周期、开始结束时间格式 参考BP85闹钟设置,\r
-//#:结尾标识符\r
-        String[] list=cmd.split(CMDSPLIT);\r
-        if (list.length>=4){\r
-\r
-            String index=list[2];\r
-            String imei=list[1];\r
-            connection.send(APS4(index));\r
-\r
-            String setting1;\r
-            switch(list.length){\r
-                case 10:\r
-                    setting1=list[9];\r
-                    ICLogger.i("set 7th alarm "+setting1);\r
-                case 9:\r
-                    setting1=list[8];\r
-                    ICLogger.i("set 6th alarm "+setting1);\r
-                case 8:\r
-                    setting1=list[7];\r
-                    ICLogger.i("set 5th alarm "+setting1);\r
-                case 7:\r
-                    setting1=list[6];\r
-                    ICLogger.i("set 4th alarm "+setting1);\r
-                case 6:\r
-                    setting1=list[5];\r
-                    ICLogger.i("set 3rd alarm "+setting1);\r
-                case 5:\r
-                    setting1=list[4];\r
-                    ICLogger.i("set 2nt alarm "+setting1);\r
-                case 4:\r
-                    setting1=list[3];\r
-                    ICLogger.i("set 1st alarm "+setting1);\r
-                    break;\r
-            }\r
-\r
-            ICLogger.i("Handle BPX1 IMEI "+imei+",index "+index+", get "+(list.length-3) +" settings");\r
-        }else{\r
-            ICLogger.i("BPX1 format error!");\r
-        }\r
-    }\r
-\r
-    public static StringMessage APHP(Runtime ds){\r
-        //IWAPHP,60,130,85,95,90, , , , , , , , #\r
-        //IW:标识符\r
-        //APHT : 命令字符\r
-        //60 : 表示心率\r
-        //130: 血压高压 [收缩压]\r
-        //85 : 血压低压 [舒张压]\r
-        //95:血氧\r
-        //90:血糖\r
-//        本消息适用所有终端,其中需要每项指标不一定全部有值,如果无值,则留空\r
-        return genStringMessage(cmdMap.get(CMD_TYPE.APHP),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APHP))\r
-                .append(CMDSPLIT).append(ds.getHRS().getPPG())\r
-                .append(CMDSPLIT).append(ds.getHRS().getBPH())\r
-                .append(CMDSPLIT).append(ds.getHRS().getBPL())\r
-                .append(CMDSPLIT).append(ds.getHRS().getSpo2())\r
-                .append(CMDSPLIT).append(0)\r
-                .append(CMDSPLIT)\r
-                .append(CMDSPLIT)\r
-                .append(CMDSPLIT)\r
-                .append(CMDSPLIT)\r
-                .append(CMDSPLIT)\r
-                .append(CMDSPLIT)\r
-                .append(CMDSPLIT)\r
-                .append(CMDSPLIT)\r
-                .append(CMDEND).toString());\r
-    }\r
-    public static StringMessage APHP(int ppg,int bph, int bpl, int spo2){\r
-        //IWAPHP,60,130,85,95,90, , , , , , , , #\r
-        //IW:标识符\r
-        //APHT : 命令字符\r
-        //60 : 表示心率\r
-        //130: 血压高压 [收缩压]\r
-        //85 : 血压低压 [舒张压]\r
-        //95:血氧\r
-        //90:血糖\r
-//        本消息适用所有终端,其中需要每项指标不一定全部有值,如果无值,则留空\r
-        return genStringMessage(cmdMap.get(CMD_TYPE.APHP),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APHP))\r
-                .append(CMDSPLIT).append(ppg)\r
-                .append(CMDSPLIT).append(bph)\r
-                .append(CMDSPLIT).append(bpl)\r
-                .append(CMDSPLIT).append(spo2)\r
-                .append(CMDSPLIT).append(0)\r
-                .append(CMDSPLIT)\r
-                .append(CMDSPLIT)\r
-                .append(CMDSPLIT)\r
-                .append(CMDSPLIT)\r
-                .append(CMDSPLIT)\r
-                .append(CMDSPLIT)\r
-                .append(CMDSPLIT)\r
-                .append(CMDSPLIT)\r
-                .append(CMDEND).toString());\r
-    }\r
-\r
-\r
-    public void handleBPHP(){\r
-\r
-        ICLogger.i("服务器收到APHP 心率血压血氧 !");\r
-\r
-    }\r
-\r
-    public static StringMessage APDE(String id){\r
-        /***\r
-         * 示例:\r
-        * 设备响应:      IWAPDE,080835#\r
-         * 080835:指令流水号\r
-         * 说明:   本消息适用所有终端\r
-         */\r
-        return genStringMessage("APDE",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APDE))\r
-                .append(CMDSPLIT).append(id)\r
-                .append(CMDEND).toString());\r
-    }\r
-\r
-    public void handleBPDE(Connection connection,String cmd,Runtime runtime){\r
-/***\r
- * 示例:\r
- * IWBPDE,867400020316612,853676,0\r
- * 说明:\r
- * IW:标识符\r
- * BPDE: 命令字符\r
- * 353456789012345:设备IMEI或者ID\r
- * 080835 :指令流水号\r
- * 0:进入禁止区域 1离开禁止区域\r
- * #:结尾标识符\r
- * 设备响应:     IWAPDE,080835#\r
- * 080835:指令流水号\r
- * 说明:   本消息适用所有终端\r
- */\r
-        String[] list=cmd.split(CMDSPLIT);\r
-        if (list.length==4){\r
-\r
-            String index=list[2];\r
-            String msg=list[3];\r
-            connection.send(APDE(index));\r
-            try {\r
-                if (Integer.parseInt(msg) == 0) {\r
-                    ICLogger.i("Handle BPDE index " + index + ", 进入禁止区域 ");\r
-                    runtime.Fence_Warning_flag = 1;\r
-                    WakeLockUtil.ScreenOnWakeLockTemperary(runtime.getContextProxy().context);\r
-                    runtime.getContextProxy().sendMsgBroadcast(runtime.getContextProxy().context.getResources().getString(R.string.alarm_out_wall), 2);\r
-                } else {\r
-                    ICLogger.i("Handle BPDE index " + index + ", 离开禁止区域 ");\r
-                    runtime.Fence_Warning_flag = 0;\r
-//                Util.ShowToast(runtime,"");\r
-                    runtime.getContextProxy().sendMsgBroadcast(runtime.getContextProxy().context.getResources().getString(R.string.alarm_cross_boundary), 0);\r
-                }\r
-            }catch (Exception e){\r
-                ICLogger.e(e.getMessage(),e);\r
-            }\r
-        }else{\r
-            ICLogger.i("BPDE format error!");\r
-        }\r
-\r
-\r
-    }\r
-    public static StringMessage APDG(String id){\r
-        return genStringMessage("APDG",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APDG))\r
-                .append(CMDSPLIT).append(id)\r
-                .append(CMDEND).toString());\r
-    }\r
-\r
-    public void handleBPDG(Connection connection,String cmd,Runtime runtime){\r
-/**\r
- * 示例:\r
- * IWBPDG,353456789012345,1,30.0,37.3 #\r
- * 说明:IWBPDG,867400020316612,502102,1,33,44\r
- * IW:标识符\r
- * BPDG: 命令字符\r
- * 353456789012345:设备IMEI或者ID\r
- * 080835 :指令流水号\r
- * 1:开关 1开,  0 关\r
- * 30.0: 低温阀值\r
- * 37.3: 高温阀值\r
- * #:结尾标识符\r
- * */\r
-        String[] list=cmd.split(CMDSPLIT);\r
-        if (list.length==6){\r
-\r
-            try {\r
-                String index = list[2];\r
-                String switch_on = list[3];\r
-                String min_temp = list[4];\r
-                String max_temp = list[5];\r
-                connection.send(APDG(index));\r
-                if (Integer.parseInt(switch_on) == 1) {\r
-                    ICLogger.i("Handle BPDG index " + index + ", 体温报警阈值开 min=" + min_temp + ",max=" + max_temp);\r
-                    runtime.tempInfo.setBodyTempThreshold(Double.valueOf(max_temp), Double.valueOf(min_temp));\r
-                    Config.needTemperature_abnormal_alarm = true;\r
-                } else {\r
-                    ICLogger.i("Handle BPDG index " + index + ", 体温报警阈值关 ");\r
-                    Config.needTemperature_abnormal_alarm = false;\r
-                }\r
-            }catch (Exception e){\r
-                ICLogger.e(e.getMessage(),e);\r
-            }\r
-\r
-        }else{\r
-            ICLogger.i("BPDG format error!");\r
-        }\r
-    }\r
-\r
-    /***\r
-     *\r
-     * @param packetTime  做指令流水号用\r
-     * @param filetype  文件类型, 1语音,2图片\r
-     * @param datatype  数据内容类型,例如和文件类型相关,例如 监听语音,sos语音,签到图片等等\r
-     * @param count  内容分包总数\r
-     * @param index  当前分包数\r
-     * @param datalen 分包数据长度,最长1024,不足按照实际大小。\r
-     * @param amrdata  文件分包内容数据\r
-     * @return\r
-     */\r
-    public static byte[] APTU(String  packetTime,int filetype, int datatype ,int count,int index,int datalen,byte[] amrdata){\r
-        /**\r
-         * 10.设备录音图片(设备上行)(上行协议:APTU,响应:BPTU)\r
-         * 示例:\r
-         * IWAPTU,6654111,080835,1,1,6,1,1024,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#\r
-         * 说明:\r
-         * IW:标识符\r
-         * BPCU : 命令字符\r
-         * 6654111:语音图片文字目标 (同步监护人列表的用户唯一标识ID)<扩展字段目前不需要,可以传空字符>\r
-         * 080835 :指令流水号\r
-         * 1:文件类型\r
-         * 1:内容类型 类型说明如下表\r
-         * 文件类型        内容类型\r
-         * 1 语音——      1.监听语音      *   2.SOS语音      *      3.扩展\r
-         * 2 图片——      1.签到图片      *   2.指令图片      *   3.设备图片      *   4.扩展\r
-         * 6:内容包分包总数\r
-         * 1 :当前包数,第一包为1,第二包为2,。。。。。。同一个语音包的语音时间相同\r
-         * 1024 :语音包长度\r
-         * XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:当前音频数据, 每个音频数据包大小为1024字节,最后一包不足1024的取实际字节数\r
-         * 语音包上传规则:\r
-         * 按包次序依次上传,上传后如果没有收到服务器的响应包,则继续上传该语音包。\r
-         * 收到设备回复确认数据包接收成功状态后,继续开始依次上传下一个数据包。。。。。。\r
-         * 如果设备回复确认数据包接收失败状态,则重复发送上一个数据包\r
-         */\r
-        String sb=new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTU))\r
-                .append(CMDSPLIT)\r
-                .append(CMDSPLIT).append(packetTime)\r
-                .append(CMDSPLIT).append(filetype)\r
-                .append(CMDSPLIT).append(datatype)\r
-                .append(CMDSPLIT).append(count)\r
-                .append(CMDSPLIT).append(index)\r
-                .append(CMDSPLIT).append(datalen*2)\r
-                .append(CMDSPLIT).toString();\r
-\r
-        byte[] sentbuf=new byte[sb.length()+datalen*2+1];\r
-        byte[] amrdata2=Util.bytesToHexString(amrdata).getBytes();\r
-        System.arraycopy(sb.getBytes(),0,sentbuf,0,sb.length());\r
-        System.arraycopy(amrdata2,0,sentbuf,sb.length(),datalen*2);\r
-        sentbuf[sb.length()+datalen*2]='#';\r
-        return sentbuf;\r
-    }\r
-\r
-\r
-    public void handleBPTU(String cmd , Connection connection ){\r
-/***\r
- * 平台响应\r
- * IWBPTU,6654111,080835,1,1,6,1,1#\r
- * IW:标识符\r
- * APCU : 命令字符\r
- * 6654111:语音图片文字目标\r
- * 080835 :流水号\r
- * 1:文件类型\r
- * 1:内容类型\r
- * 6:内容总包数\r
- * 1:当前包序号\r
- * 1:成功 (0:失败)\r
- */\r
-        String[] cmdlist=cmd.split(CMDSPLIT);\r
-        if (cmdlist.length==8){\r
-            try {\r
-                String time = cmdlist[2];\r
-                String filetype = cmdlist[3];\r
-                String datatype = cmdlist[4];\r
-                String count = cmdlist[5];\r
-                String index = cmdlist[6];\r
-                String success = cmdlist[7];\r
-                int ftype = Integer.parseInt(filetype);\r
-                int dtype = Integer.parseInt(datatype);\r
-                int packetCount = Integer.parseInt(count);\r
-                int packetIndex = Integer.parseInt(index);\r
-                int receiveSuccess = Integer.parseInt(success);\r
-                ICLogger.i("服务器在收到 index " + time + ", 文件类型 " + ftype + ",内容类型 " + dtype + " " + packetIndex + "/" + packetCount + " " + (receiveSuccess == 1 ? "成功" : "失敗"));\r
-                if (receiveSuccess == 1) {\r
-                    //如果服务器接收 语音成功,则设置下一个要发送的语音包Index,当index == packetCount的时候表示所有包发送完毕,停止继续发送\r
-                    voicePacket.getInstanceSent().setCurrentIndexToSent(packetIndex);\r
-                    //voicePacket.getInstanceSent().setFileType(ftype,dtype);\r
-                }\r
-                //发送消息,再次检查要发送的语音包,确认其发送完毕\r
-                connection.DeliverCMDMessageToSystem("SentVoicePacket", "SentBPFilePacket");\r
-            }catch (Exception e){\r
-                ICLogger.e(e.getMessage(),e);\r
-            }\r
-        }else{\r
-            ICLogger.i(" BPTU Format error!");\r
-        }\r
-    }\r
-\r
-    public static StringMessage APSL(String date,int deepsleep,int lightsleep,int score){\r
-/***\r
- * 示例:\r
- * IWAPSL,20200803,240,120,90#\r
- * 说明:睡眠计算时间 当日21:00至 次日 9:00, 睡眠时间记录为当日时间。如2020-8-3的睡眠时间段为 2020-8-3 21:00 ~ 2020-8-4 09:00\r
- * IW:标识符\r
- * APSL:命令字\r
- * 202008003:睡眠时间 (手表本地时间)\r
- * 240:深睡时间 (手表本地时间),单位分钟\r
- * 120:浅睡时间(手表本地时间),单位分钟\r
- * 90睡眠分数\r
- * 睡眠算法\r
- * 使用记步同样的算法,计算翻身次数\r
- * 平均每60秒记录一次\r
- * 深睡眠,通过加速度传感器,在60秒内翻身次数小于6\r
- * 浅睡眠,通过加速度传感器,在60秒内翻身次数大于等于6, 且小于12 ,否则认为未睡\r
- * 换算分数后发送到服务器\r
- * #:结束符\r
- */\r
-        String sb=new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APSL))\r
-                .append(CMDSPLIT).append(date)\r
-                .append(CMDSPLIT).append(deepsleep)\r
-                .append(CMDSPLIT).append(lightsleep)\r
-                .append(CMDSPLIT).append(score)\r
-                .append(CMDEND).toString();\r
-        return genStringMessage(cmdMap.get(CMD_TYPE.APSL),sb);\r
-    }\r
-\r
-    public static StringMessage AP46(String id,String cmd)\r
-    {\r
-        return genStringMessage(cmdMap.get(CMD_TYPE.AP46),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP46))\r
-                .append(CMDSPLIT).append(id)\r
-                .append(CMDSPLIT).append(cmd)\r
-                .append(CMDEND).toString());\r
-    }\r
-\r
-    public void handleBP46(String cmd , Connection connection,Runtime runtime) {\r
-/***\r
- * IWBP46,353456789012345,080835,1,[参数]#\r
- * 说明:\r
- * IW:标识符\r
- * BP46 : 命令字符\r
- * 353456789012345:IMEI号,设备唯一ID\r
- * 080835 :指令流水号\r
- * 1: 表示立即拍照\r
- * [参数]: 此为可选项。根据不同类型设备扩展\r
- * #:结尾标识符\r
- * 设备响应:     IWAP46,080835,1#\r
- * 080835:指令流水号\r
- * 1 成功 0失败\r
- * # 结尾标识符\r
- */\r
-        String[] cmdlist=cmd.split(CMDSPLIT);\r
-\r
-        if (cmdlist.length>=4 ){\r
-            String imei=cmdlist[1];\r
-            String id=cmdlist[2];\r
-            String cdd=cmdlist[3];\r
-            if (cmdlist.length==5) {\r
-                String tmp = cmdlist[4];\r
-            }\r
-            connection.send(AP46(id,cdd));\r
-            Context context = mRuntime.getContextProxy().context.getApplicationContext();\r
-            if (cdd.equals("1")) {\r
-                //delay 启动\r
-\r
-//            Intent intent = new Intent(context, com.enqualcomm.support.CoreService.class);\r
-//            intent.setAction(ACTION_REMOTE_CAMERA);\r
-//            intent.putExtra("remote_number", id);\r
-//                context.startService(intent);\r
-//            runtime.getContextProxy().context.sendBroadcast(intent);\r
-                new Handler().post(new Runnable() {\r
-                    @Override\r
-                    public void run() {\r
-                        (new CameraUtil(context)).getPictur(id);\r
-                    }\r
-                });\r
-\r
-            }else if(cdd.equals("2")){\r
-                Intent intent = new Intent();\r
-                intent.setAction(DIALOG_ACTION);\r
-                intent.putExtra("takephoto", "Take Photo !");\r
-                context.sendBroadcast(intent);\r
-            }\r
-        }else{\r
-            ICLogger.i(" BP46 Format error!");\r
-        }\r
-\r
-    }\r
-\r
-\r
-    public static StringMessage APDH(String id,String cmd)\r
-    {\r
-        return genStringMessage("APDH",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APDH))\r
-                .append(CMDSPLIT).append(id)\r
-                .append(CMDSPLIT).append(cmd)\r
-                .append(CMDEND).toString());\r
-    }\r
-\r
-\r
-    public void handleBPDH( Connection connection,Runtime runtime,String cmd) {\r
-        /***\r
-         * IWBPDH,353456789012345,080835,1,[参数]#\r
-         * 说明:\r
-         * IW:标识符\r
-         * BPDH : 命令字符\r
-         * 353456789012345:IMEI号,设备唯一ID\r
-         * 080835 :指令流水号\r
-         * 1:  表示立即聆听 可扩展\r
-         * [参数]: 此为可选项。录音时间 为空默认15秒\r
-         * #:结尾标识符\r
-         * 设备响应:     IWAPDH,080835,1#\r
-         * 080835:指令流水号\r
-         * 1 成功 0失败\r
-         * # 结尾标识符\r
-         */\r
-\r
-        String[] cmdlist=cmd.split(CMDSPLIT);\r
-        if (cmdlist.length==5){\r
-            String imei=cmdlist[1];\r
-            String id=cmdlist[2];\r
-            String cdd=cmdlist[3];\r
-            String tmp=cmdlist[4];\r
-\r
-            tmp=tmp.replace(CMDEND,"").trim();\r
-\r
-            if (tmp.isEmpty()) tmp="15";\r
-            connection.send(APDH(id,cdd));\r
-\r
-            if (cdd.equals("1")) {\r
-                //delay 启动\r
-//                Context context = mRuntime.getContextProxy().context.getApplicationContext();\r
-                CoreService.getInstance().DevliverStringMessage("StartMonitor",tmp);\r
-            }\r
-        }else{\r
-            ICLogger.i(" BPDH Format error!");\r
-        }\r
-    }\r
-\r
-    public static StringMessage APTQ(Runtime runtime)\r
-    {\r
-        /**\r
-         * IWAPTQ,460,0,9520,3671,0#\r
-         * APTQ : 命令字符\r
-         * 460,0,9520,3671基站信息\r
-         * 0:语言标志位   0 默认为中文,1为英文\r
-         */\r
-        //或者仅仅使用 locale = Locale.getDefault(); 不需要考虑接口 deprecated(弃用)问题\r
-        Locale locale = Locale.getDefault();\r
-        String lang = locale.getLanguage() + "-" + locale.getCountry();\r
-        int language=0;\r
-        if(!lang.contains("zh"))\r
-        {\r
-            language=1;\r
-        }\r
-        return genStringMessage("APTQ",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTQ))\r
-                .append(CMDSPLIT).append(runtime.getLocationInstance().getMCC())\r
-                .append(CMDSPLIT).append(runtime.getLocationInstance().getMNC())\r
-                .append(CMDSPLIT).append(runtime.getLocationInstance().getLAC())\r
-                .append(CMDSPLIT).append(runtime.getLocationInstance().getGSMStationCID())\r
-                .append(CMDSPLIT).append(language)\r
-                .append(CMDEND).toString());\r
-    }\r
-\r
-\r
-    public void handleBPTQ( Connection connection,Runtime runtime,String cmd) {\r
-        /***\r
-         *\r
-         * IWBPTQ,20-10-11,19:32:02,6674,32,27,22,30,20-10-12,19:32:02,6674,32,27,22,30,20-10-13,19:32:02,6674,32,27,22,30,53575C71533A\r
-         * IWBPTQ, 16-09-24,11:00:00,b6e0d4c6,2,-5,-12,22,16-09-25,11:00:00,b6e0d4c6,2,-5,-12,22,16-09-26,11:00:00,b6e0d4c6,2,-5,-12,22,316df15733#\r
-         * 年-月-日,时:分:秒,天气描述,天气编号,当前温度,最低温,最高温,年-月-日,时:分:秒,天气描述,天气编号,当前温度,最低温,最高温,年-月-日,时:分:秒,天气描述,天气编号,当前温度,最低温,最高温,城市名\r
-         * 注:天气描述用Unicode编码,城市名使用Unicode编码, 第一组为当天,后2组依次为后续2天天气\r
-         * 如天气编号及描述对应如下(天气描述不需要发送括号内的白天晚上)\r
-         * 0:龙卷风\r
-         * 1:热带风暴\r
-         * 2:飓风\r
-         * 3:严重的雷暴\r
-         * 4:雷暴\r
-         * 5:混合雨雪\r
-         * 6:混合降雨和冰雹\r
-         * 7:混合雪和雨夹雪\r
-         * 8:冻结小雨\r
-         * 9:小雨\r
-         * 10:冻雨\r
-         * 11:阵雨\r
-         * 12:阵雨\r
-         * 13:雪飘雪\r
-         * 14:小雪阵雨\r
-         * 15:吹雪\r
-         * 16:雪\r
-         * 17:冰雹\r
-         * 18:雨夹雪\r
-         * 19:尘埃\r
-         * 20:雾\r
-         * 21:霾\r
-         * 22:黑烟\r
-         * 23:大风\r
-         * 24:风\r
-         * 25:低温\r
-         * 26:多云\r
-         * 27:多云(晚上)\r
-         * 28:多云(白天)\r
-         * 29:局部多云(晚上)\r
-         * 30:局部多云(天)\r
-         * 31:清爽(晚)\r
-         * 32:晴天\r
-         * 33:晴朗(晚)\r
-         * 34:晴朗(天)\r
-         * 35:混合雨和冰雹\r
-         * 36:热\r
-         * 37:局部地区性雷暴\r
-         * 38:零星雷暴\r
-         * 39:零星雷暴\r
-         * 40:零星阵雨\r
-         * 41:大雪\r
-         * 42:零星阵雪\r
-         * 43:大雪\r
-         * 44:多云\r
-         * 45:雷阵雨\r
-         * 46:阵雪\r
-         * 47:局部雷阵雨\r
-         */\r
-\r
-        log("BPTQ "+cmd);\r
-        String[] cmdlist=cmd.split(CMDSPLIT);\r
-        if (cmdlist.length==23){\r
-\r
-            StringBuilder sb=new StringBuilder();\r
-            StringBuilder msg=new StringBuilder();\r
-            for(int i=0;i<3;i++) {\r
-                String DayTime = cmdlist[1+i*7] + " " + cmdlist[2+i*7];\r
-                String date= "20"+cmdlist[1+i*7].trim();\r
-                String weather_name = Util.decodeUnicode2Utf8(cmdlist[3+i*7].trim());\r
-                String weather_id = cmdlist[4+i*7];\r
-                String temp_current = cmdlist[5+i*7];\r
-                String temp_high = cmdlist[6+i*7];\r
-                String temp_low = cmdlist[7+i*7];\r
-\r
-                sb.append(" "+DayTime);\r
-                sb.append(",天气:"+weather_name);\r
-                sb.append(",ID "+weather_id);\r
-                sb.append(",当前温度 "+temp_current);\r
-                sb.append(",最高温度 "+temp_high);\r
-                sb.append(",最低温度 "+temp_low);\r
-                sb.append("\n");\r
-\r
-                msg.append(date);\r
-                msg.append(","+weather_name);\r
-                msg.append(","+weather_id);\r
-                msg.append(","+temp_current);\r
-                msg.append(","+temp_high);\r
-                msg.append(","+temp_low);\r
-                msg.append(";");\r
-            }\r
-            String City=Util.decodeUnicode2Utf8(cmdlist[22]);\r
-\r
-            ICLogger.i(City+" \n"+sb.toString());\r
-\r
-            msg.insert(0,City+";");\r
-            String weatherstr=msg.toString();\r
-            if (weatherstr.endsWith(";"))\r
-            {\r
-                weatherstr=weatherstr.substring(0,weatherstr.lastIndexOf(";"));\r
-            }\r
-            Intent intent=new Intent(Constants.ACTION_WEATHER_RECEIVED);\r
-            intent.putExtra(Constants.KEY_Weather,weatherstr);\r
-            ICLogger.i("send Broadcast "+ Constants.ACTION_WEATHER_RECEIVED +"\n"+weatherstr+"\n");\r
-            CoreService.getInstance().sendBroadcast(intent);\r
-\r
-        }else{\r
-            ICLogger.i(" BPTQ Format error!");\r
-        }\r
-    }\r
-\r
-\r
-\r
-    public static StringMessage AP94( ){\r
-        /***\r
-         * 15确认已读文字(上行协议号:AP94,响应:BP94)\r
-         * 示例:\r
-         * IWAP94,123456,1#\r
-         * 说明:\r
-         * IWAP94:标识符\r
-         * APHCI: 命令字符\r
-         * 123456: 文字来源系统流水号\r
-         * 1:确认阅读、0:取消阅读\r
-         * 平台响应:     IWBP94#\r
-         * 表示平台已接收,可不作响应\r
-         * 说明:   本消息适用所有终端\r
-         */\r
-\r
-        //在UI逻辑中,只要有处理就都是已经阅读。所以不存在取消阅读的说法。\r
-        return genStringMessage(cmdMap.get(protocol_ic.CMD_TYPE.AP94),new StringBuffer(CMDHEADER).append(cmdMap.get(protocol_ic.CMD_TYPE.AP94))\r
-                .append(CMDSPLIT).append(Runtime.PushtxtMsg_srv_index)\r
-                .append(CMDSPLIT).append("1")\r
-                .append(CMDEND).toString());\r
-\r
-    }\r
-\r
-\r
-    public static StringMessage APAT(String id,String cmd)\r
-    {\r
-        return genStringMessage("APAT",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APAT))\r
-                .append(CMDSPLIT).append(id)\r
-                .append(CMDSPLIT).append(cmd)\r
-                .append(CMDEND).toString());\r
-    }\r
-\r
-    /***\r
-     * 响应剪断开关设定消息\r
-     * @param connection\r
-     * @param runtime\r
-     * @param cmd\r
-     */\r
-    public void handleBPAT( Connection connection,Runtime runtime,String cmd) {\r
-/***\r
- * IWBPAT,353456789012345,080835,1#\r
- * 说明:是否提示表带是否连接的开关,即剪断报警开关\r
- * IW:标识符\r
- * BPAT : 命令字符\r
- * 353456789012345:IMEI号,设备唯一ID\r
- * 080835:指令流水号\r
- * 1: 表示剪断报警开关,1为开,0 为关\r
- * 设备响应:     IWAPAT,080835, 1#\r
- * 080835:指令流水号\r
- * 1: 剪断开关状态(实际上与下行的命令一致)\r
- */\r
-\r
-        log("BPAT "+cmd);\r
-        String[] cmdlist=cmd.split(CMDSPLIT);\r
-        if (cmdlist.length==4){\r
-\r
-            String imei=cmdlist[1];\r
-            String id=cmdlist[2];\r
-            String cmdid=cmdlist[3];\r
-            connection.send(APAT(id,cmdid));\r
-            if(cmdid.trim().equals("1")){\r
-                WakeLockUtil.ScreenOnWakeLockTemperary(runtime.getContextProxy().context);\r
-//                    runtime.getContextProxy().sendMsgBroadcast(runtime.getContextProxy().context.getResources().getString(R.string.alarm_lock_success), 2);\r
-                Util.ShowToast(runtime,runtime.getContextProxy().context.getResources().getString(R.string.alarm_lock_success));\r
-                Config.setNeedAntiOff(runtime.getContextProxy().context,true);\r
-                Config.setNeedCutOff(runtime.getContextProxy().context,true);\r
-                runtime.setNeedAntioff(true);\r
-                runtime.setNeddReportCutoff(true);\r
-            } else {\r
-                WakeLockUtil.ScreenOnWakeLockTemperary(runtime.getContextProxy().context);\r
-                runtime.getContextProxy().sendMsgBroadcast(runtime.getContextProxy().context.getResources().getString(R.string.alarm_unbind_success), 2);\r
-                Config.setNeedAntiOff(runtime.getContextProxy().context,false);\r
-                Config.setNeedCutOff(runtime.getContextProxy().context,false);\r
-                runtime.setNeedAntioff(false);\r
-                runtime.setNeddReportCutoff(false);\r
-            }\r
-        }else{\r
-            ICLogger.i(" BPAT Format error!");\r
-        }\r
-    }\r
-\r
-\r
-    public static StringMessage APCH(int charging)\r
-    {\r
-        return genStringMessage("APCH",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APCH))\r
-                .append(CMDSPLIT).append(charging)\r
-                .append(CMDEND).toString());\r
-    }\r
-\r
-\r
-\r
-    public static StringMessage APBT(String id,String cycle)\r
-    {\r
-        return genStringMessage("APBT",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APBT))\r
-                .append(CMDSPLIT).append(id)\r
-                .append(CMDSPLIT).append(cycle)\r
-                .append(CMDEND).toString());\r
-    }\r
-\r
-    /***\r
-     * 响应蓝牙扫描周期设定\r
-     * @param connection\r
-     * @param runtime\r
-     * @param cmd\r
-     */\r
-    public void handleBPBT( Connection connection,Runtime runtime,String cmd) {\r
-/***\r
- * IWBPBT,353456789012345,080835,1#\r
- * 说明:设置蓝牙扫描周期,单位时间分钟\r
- * IW:标识符\r
- * BPBT : 命令字符\r
- * 353456789012345:IMEI号,设备唯一ID\r
- * 080835:指令流水号\r
- * 1: 扫描周期,对应单位为分钟\r
- * 设备响应:     IWAPBT,080835, 1#\r
- * 080835:指令流水号\r
- * 1: 剪断开关状态(实际上与下行的命令一致)\r
- */\r
-\r
-        log("BPBT "+cmd);\r
-        String[] cmdlist=cmd.split(CMDSPLIT);\r
-        if (cmdlist.length==4){\r
-            String id=cmdlist[2];\r
-            String cycle=cmdlist[3].replace("#","");\r
-            connection.send(APBT(id,cycle));\r
-\r
-            if(Util.isNumeric(cycle)){\r
-                int intcycle=Integer.parseInt(cycle);\r
-                Config.setBleScanCycle(runtime.getContextProxy().context,intcycle);\r
-                runtime.bleInfo.bleScanCycle=intcycle;\r
-                ICLogger.i("设置蓝牙扫描周期 "+intcycle+" 分钟");\r
-                CoreService.getInstance().setBleScanAlarm(intcycle);\r
-            }else{\r
-                ICLogger.i(" BPBT Format error!");\r
-            }\r
-\r
-        }else{\r
-            ICLogger.i(" BPBT Format error!");\r
-        }\r
-    }\r
-\r
-    /***\r
-     * 发送蓝牙扫描结果\r
-     * @param runtime\r
-     * @return\r
-     */\r
-    public static StringMessage APBR(Runtime runtime) {\r
-        /**\r
-         * #IWAPBR,353456789012345,080835,1#\r
-         *\r
-         * #IWBPBR#\r
-         */\r
-        if (runtime.bleInfo.btScanResult.size() > 0) {\r
-            StringBuffer sb=new StringBuffer();\r
-            sb.append(runtime.bleInfo.btScanResult.size());\r
-            for(String it:runtime.bleInfo.btScanResult){\r
-                sb.append(CMDSPLIT).append(it);\r
-            }\r
-            return genStringMessage("APBR", new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APBR))\r
-                    .append(CMDSPLIT).append(TimeUtil.getSystemTimeyyyyMMddHHmmss())\r
-                    .append(CMDSPLIT).append(sb.toString())\r
-                    .append(CMDEND).toString());\r
-\r
-        }else{\r
-            return null;\r
-        }\r
-    }\r
-\r
-    /**\r
-     * 85.设置联系人白名单(10个)(下行协议:BPWL,响应:APWL)\r
-     * 示例:\r
-     * IWBPWL,353456789012345,080835,D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx #\r
-     * 说明:\r
-     * IW:标识符\r
-     * BPWL : 命令字符\r
-     * 353456789012345:IMEI号,设备唯一ID\r
-     * 080835 :指令流水号\r
-     * D3590D54|135xxxxxxxxxx|9507xxxxxxxx : 一组联系人,使用|分隔名称和电话号码和绑定号码,名称使用UNICODE编码直接下发byte,多组之间使用逗号分隔,未填写的可为空,但位置仍需保留\r
-     * 设备响应: IWAPWL,080835, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx, D3590D54|135xxxxxxxxxx#\r
-     * 080835: 设备响应的时候带上响应流水号\r
-     * D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx回复设备当前设置的主控号码供平台同步使用\r
-     * 说明:       本消息适用所有终端\r
-     */\r
-    public static StringMessage  APWL(String index,String[] phnumbs){\r
-        return genStringMessage("APWL",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APWL))\r
-                .append(CMDSPLIT).append(index)\r
-                .append(CMDSPLIT).append(phnumbs[0])\r
-                .append(CMDSPLIT).append(phnumbs[1])\r
-                .append(CMDSPLIT).append(phnumbs[2])\r
-                .append(CMDSPLIT).append(phnumbs[3])\r
-                .append(CMDSPLIT).append(phnumbs[4])\r
-                .append(CMDSPLIT).append(phnumbs[5])\r
-                .append(CMDSPLIT).append(phnumbs[6])\r
-                .append(CMDSPLIT).append(phnumbs[7])\r
-                .append(CMDSPLIT).append(phnumbs[8])\r
-                .append(CMDSPLIT).append(phnumbs[9])\r
-                .append(CMDEND).toString());\r
-    }\r
-    //设置通讯录,白名单(10个)\r
-    public void handleBPWL(Connection connection,String cmd , Runtime runtime){\r
-//        IWBPWL,867155030001063,357444,9b44529b|13554820016,,,,,,,,,\r
-/**\r
- * IWBPWL,353456789012345,080835,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx,\r
- * D3590D54|135xxxxxxxxxx#\r
- */\r
-        String[] cmdlist=cmd.split(CMDSPLIT);\r
-        String[] phnums=new String[]{"","","","","","","","","",""};\r
-        StringBuffer sb=new StringBuffer().append("recv phone Numbs ");\r
-        if (cmdlist.length>=3){\r
-            switch (cmdlist.length){\r
-                case 13:\r
-                    phnums[9]=cmdlist[12];\r
-                    sb.append(phnums[9]).append(",");\r
-                case 12:\r
-                    phnums[8]=cmdlist[11];\r
-                    sb.append(phnums[8]).append(",");\r
-                case 11:\r
-                    phnums[7]=cmdlist[10];\r
-                    sb.append(phnums[7]).append(",");\r
-                case 10:\r
-                    phnums[6]=cmdlist[9];\r
-                    sb.append(phnums[6]).append(",");\r
-                case 9:\r
-                    phnums[5]=cmdlist[8];\r
-                    sb.append(phnums[5]).append(",");\r
-                case 8:\r
-                    phnums[4]=cmdlist[7];\r
-                    sb.append(phnums[4]).append(",");\r
-                case 7:\r
-                    phnums[3]=cmdlist[6];\r
-                    sb.append(phnums[3]).append(",");\r
-                case 6:\r
-                    phnums[2]=cmdlist[5];\r
-                    sb.append(phnums[2]).append(",");\r
-                case 5:\r
-                    phnums[1]=cmdlist[4];\r
-                    sb.append(phnums[1]).append(",");\r
-                case 4:\r
-                    phnums[0]=cmdlist[3];\r
-                    sb.append(phnums[0]).append(",");\r
-\r
-            }\r
-\r
-            String index=cmdlist[2];\r
-            ICLogger.i(sb.toString());\r
-            connection.send(AP14(index,phnums));\r
-            ArrayList<Contact> contactArray=new ArrayList<Contact>();\r
-\r
-            if(Config.custom_name.equals("YT")) {\r
-                ICLogger.i("=====add hotline 96885 ");\r
-                contactArray.add(new Contact(Contact.CATEGORY_CALL, runtime.getContextProxy().context.getResources().getString(R.string.hotline), "96885"));\r
-            }\r
-            for (int i=0; i< phnums.length;i++){\r
-                String[] tmp= phnums[i].split("\\|");\r
-                if (tmp.length==2){\r
-                    String name= Util.decodeUnicode2Utf8(tmp[0]);\r
-                    String phonem=tmp[1];\r
-                    ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length+" , name="+name+",-"+phonem);\r
-                    contactArray.add(new Contact(Contact.CATEGORY_CALL,name,phonem));\r
-                }else{\r
-                    ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length);\r
-\r
-                }\r
-            }\r
-//            contactArray.add(new Contact(Contact.CATEGORY_GROUP,"All","666"));\r
-//            contactArray.add(new Contact(Contact.CATEGORY_PARTNER,"PARTNER","666"));\r
-//            contactArray.add(new Contact(Contact.CATEGORY_CARE,"CARE","666"));\r
-//            contactArray.add(new Contact(Contact.CATEGORY_VOLTE,"VOLTE","666"));\r
-\r
-            runtime.getDbHelper().saveContacts(contactArray,false,false,true,false,false,false);\r
-\r
-        }else{\r
-            ICLogger.i(" BPWL format error!");\r
-        }\r
-\r
-    }\r
-\r
-\r
-\r
-\r
-    public static StringMessage AP65(String id,String cy)\r
-    {\r
-        return genStringMessage("AP65",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP65))\r
-                .append(CMDSPLIT).append(id)\r
-                .append(CMDSPLIT).append(cy)\r
-                .append(CMDEND).toString());\r
-    }\r
-\r
-    public void handleBP65( Connection connection,Runtime runtime,String cmd) {\r
-/***\r
- * 36.音量设置(下行协议:BP65,响应:AP65)\r
- * 示例:\r
- * IWBP65,353456789012345,080835,1#\r
- * 说明:\r
- * IW:标识符\r
- * BP65: 命令字符\r
- * 353456789012345:IMEI号,设备唯一ID\r
- * 080835 :指令流水号\r
- * 1 : 表示音量等级为1\r
- * 设备响应:     IWAP65,080835, 1#\r
- * 080835: 设备响应的时候带上响应流水号\r
- * 1: 表示指令执行成功,音量等级为1\r
- */\r
-\r
-        log("BP65 "+cmd);\r
-        String[] cmdlist=cmd.split(CMDSPLIT);\r
-        if (cmdlist.length==4){\r
-            String id=cmdlist[2];\r
-            String cycle=cmdlist[3].replace("#","");\r
-            connection.send(AP65(id,cycle));\r
-\r
-            if(Util.isNumeric(cycle)){\r
-                int mastervolume=Integer.parseInt(cycle);\r
-\r
-                ICLogger.i("设置音量 "+mastervolume);\r
-                //实际设备音量 0~15  协议音量0~7需要转换\r
-                int volume=mastervolume*2;\r
-                if (volume<0)volume=0;\r
-                if(volume>=14) volume=15;\r
-                Config.setMasterVolume(runtime.getContextProxy().context,mastervolume*2);\r
-                ICAudioManager.setMasterVolumn(runtime.getContextProxy().context,mastervolume*2);\r
-\r
-            }else{\r
-                ICLogger.i(" BP65 Format error!");\r
-            }\r
-\r
-        }else{\r
-            ICLogger.i(" BP65 Format error!");\r
-        }\r
-    }\r
-\r
-    public static StringMessage AP47(String id,String cycle)\r
-    {\r
-        return genStringMessage("AP47",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP47))\r
-                .append(CMDSPLIT).append(id)\r
-                .append(CMDSPLIT).append(cycle)\r
-                .append(CMDEND).toString());\r
-    }\r
-\r
-\r
-    public void handleBP47( Connection connection,Runtime runtime,String cmd) {\r
-/***\r
- * 37.震动设置(下行协议号:BP47,响应:AP47)\r
- * 示例:\r
- * IWBP47,353456789012345,080835,10#\r
- * 说明:\r
- * IW:标识符\r
- * BP47 : 命令字符\r
- * 353456789012345:IMEI号,设备唯一ID\r
- * 080835 :指令流水号\r
- * 10: 表示震动时长,此处单位为称,表示震动10秒钟\r
- * 设备响应:     IWAP47,080835,1#\r
- * 080835:指令流水号\r
- * 1:表示设备执行成功,0 表示设备执行失败\r
- */\r
-\r
-        log("BP47 "+cmd);\r
-        String[] cmdlist=cmd.split(CMDSPLIT);\r
-        if (cmdlist.length==4){\r
-            String id=cmdlist[2];\r
-            String cycle=cmdlist[3].replace("#","");\r
-            connection.send(AP47(id,cycle));\r
-\r
-            if(Util.isNumeric(cycle)){\r
-                int vibduration=Integer.parseInt(cycle);\r
-                ICLogger.i("设置震动时长 "+vibduration+" 秒");\r
-                Config.setDurationOfVibration(runtime.getContextProxy().context,vibduration);\r
-                VibrateUtil.setVibPattern(vibduration*1000);\r
-\r
-            }else{\r
-                ICLogger.i(" BP47 Format error!");\r
-            }\r
-\r
-        }else{\r
-            ICLogger.i(" BP47 Format error!");\r
-        }\r
-    }\r
-    public boolean handleCmd(CMD_TYPE type, String cmd) {\r
-\r
-           //普通非二进制命令用此函数处理\r
-        boolean ret=true;\r
-        ICLogger.i("handleCmd "+type.name() + " strLen="+cmd.length());\r
-        if (Config.LOG_TOFILE)ICLogger.logToFile("APILog", " recv " + cmd);\r
-        cmd=cmd.replace(" ","");\r
-        switch (type){\r
-            case BP00: //登录包\r
-                handleBP00(mRuntime,cmd);\r
-                ICLogger.i("服务器收到登录包AP00");\r
-                mConnection.DeliverCMDMessageToSystem("login",cmd);//通知下面线程状态变化\r
-                break;\r
-            case BP01: //gps定位包\r
-                handleBP01(cmd);\r
-                ICLogger.i("服务器收到定位AP01");\r
-                mConnection.DeliverCMDMessageToSystem("AP01",cmd);//通知下面线程状态变化\r
-                break;\r
-            case BP02:// wifi定位包\r
-                handleBP02(cmd);\r
-                ICLogger.i("服务器收到定位AP02");\r
-                mConnection.DeliverCMDMessageToSystem("AP02",cmd);//通知下面线程状态变化\r
-                break;\r
-            case BP03: //心跳包\r
-                handleBP03(cmd);\r
-                ICLogger.i("服务器收到心跳包AP03");\r
-                mConnection.DeliverCMDMessageToSystem("heartbeat",cmd);//通知下面线程状态变化\r
-                break;\r
-\r
-            case BP07:\r
-                //收到发送的语音包\r
-                handleBP07(cmd,mConnection);\r
-                break;\r
-            case BP10:\r
-                //报警包\r
-                mConnection.DeliverCMDMessageToSystem("AP10",cmd);//通知下面线程状态变化\r
-                break;\r
-\r
-            case BPTM:\r
-                //校时命令\r
-                handleBPTM(cmd);\r
-                ICLogger.i("服务器收到校时命令APTM");\r
-                mConnection.DeliverCMDMessageToSystem("APTM",cmd);//通知下面线程状态变化\r
-                break;\r
-            case BP85://设置闹钟\r
-                handleBP85(cmd,mConnection,mRuntime);\r
-                ICLogger.i("收到服务器设置闹钟命令BP85");\r
-                mConnection.DeliverCMDMessageToSystem("AP85",cmd);//通知下面线程状态变化\r
-                break;\r
-\r
-            case BP87:\r
-                handleBP87(cmd,mConnection,mRuntime);\r
-                ICLogger.i("收到服务器 QRCode uri BP87");\r
-                break;\r
-            case BP33:\r
-                //设置工作模式\r
-                handleBP33(mConnection,mRuntime,cmd);\r
-                mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化\r
-\r
-                break;\r
-            case BP34:\r
-                //设置工作模式\r
-                handleBP34(mConnection,mRuntime,cmd);\r
-                mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化\r
-                break;\r
-            case BP16:\r
-                //立即定位指令(长链接有效)\r
-                handleBP16(mConnection,mRuntime,cmd);\r
-                mConnection.DeliverCMDMessageToSystem("StartLocate",cmd);//通知下面线程状态变化\r
-                break;\r
-\r
-            case BP46: //立即拍照\r
-                ICLogger.i("立即拍照!");\r
-                handleBP46(cmd,mConnection,mRuntime);\r
-                break;\r
-\r
-            case BP12:\r
-                //收到设置SOS号码\r
-                handleBP12(mConnection,cmd,mRuntime);\r
-                ICLogger.i("收到服务器设置SOS号码命令BP12");\r
-                break;\r
-            case BP14:\r
-                //收到设置白名单号码\r
-                handleBP14(mConnection,cmd,mRuntime);\r
-                ICLogger.i("收到服务器设置白名单号码命令BP14");\r
-                break;\r
-            case BPWL:\r
-                //收到设置白名单号码\r
-                handleBPWL(mConnection,cmd,mRuntime);\r
-                ICLogger.i("收到服务器设置白名单号码命令BPWL");\r
-                break;\r
-            case BP15:\r
-                handleBP15(cmd,mConnection,mRuntime);\r
-                ICLogger.i("收到服务器设置定位命令BP15");\r
-                break;\r
-            case BP17:\r
-                //收到恢复出厂设置\r
-                handleBP17(mConnection,cmd);\r
-                ICLogger.i("收到服务器恢复出厂设置命令BP17");\r
-                mConnection.DeliverCMDMessageToSystem("FactoryReset",cmd);//通知下面线程状态变化\r
-                break;\r
-\r
-            case BP18:\r
-                //收到重启\r
-                handleBP18(mConnection,cmd);\r
-                ICLogger.i("收到服务器重启命令BP18");\r
-                mConnection.DeliverCMDMessageToSystem("Reboot",cmd);//通知下面线程状态变化\r
-                break;\r
-\r
-            case BP31:\r
-                //收到关机\r
-                handleBP31(mConnection,cmd);\r
-                ICLogger.i("收到服务器关机命令BP31");\r
-                mConnection.DeliverCMDMessageToSystem("poweroff",cmd);//通知下面线程状态变化\r
-                break;\r
-            case BP40:\r
-                //服务器推送文本\r
-                handleBP40(mConnection,mRuntime,cmd);\r
-                ICLogger.i("收到服务器推送文本消息");\r
-                mConnection.DeliverCMDMessageToSystem("showTxt",cmd);//通知下面线程状态变化\r
-                break;\r
-\r
-            case BPXL:\r
-                handleBPXL(cmd,mConnection);\r
-                ICLogger.i("收到服务器心率检测命令");\r
-                if(mRuntime.check_stat_do_ppg_test()) HeartRateManager.triggerPPGtest();\r
-                break;\r
-            case BPXY:\r
-                handleBPXY(cmd,mConnection);\r
-                ICLogger.i("收到服务器血压检测命令");\r
-                if(mRuntime.check_stat_do_ppg_test()) HeartRateManager.triggerPPGtest();\r
-                break;\r
-            case BPJZ:\r
-                handleBPJZ(cmd,mConnection,mRuntime);\r
-                ICLogger.i("收到服务器血压校准命令");\r
-                break;\r
-            case BPHT:\r
-                ICLogger.i("服务器收到上传的心率血压");\r
-                mConnection.DeliverCMDMessageToSystem("APHT",cmd);//通知下面线程状态变化\r
-                break;\r
-            case BP84:\r
-                handleBP84(cmd,mConnection);\r
-                ICLogger.i("收到服务器白名单命令");\r
-                break;\r
-\r
-            case BP86:\r
-                //心率周期\r
-                handleBP86(cmd,mConnection,mRuntime);\r
-                mConnection.DeliverCMDMessageToSystem("AP86",cmd);//通知下面线程状态变化\r
-\r
-                break;\r
-            case BP68: //绑定解绑\r
-                handleBP68(cmd,mConnection,mRuntime);\r
-                break;\r
-            case BP88:\r
-                //收到查找设备消息\r
-                handleBP88(cmd,mConnection);\r
-                mConnection.DeliverCMDMessageToSystem("findDev",cmd);//通知下面线程状态变化\r
-                break;\r
-            case BP89:\r
-                //心率/血压阀值\r
-                handleBP89(cmd,mConnection);\r
-                mConnection.DeliverCMDMessageToSystem("AP89",cmd);//通知下面线程状态变化\r
-                break;\r
-\r
-            case BPTE: //设置测试体温\r
-                handleBPTE(cmd,mConnection,mRuntime);\r
-                mConnection.DeliverCMDMessageToSystem("APTE",cmd);//通知下面线程状态变化\r
-                break;\r
-\r
-            case BPTP:\r
-                handleBPTP();\r
-                mConnection.DeliverCMDMessageToSystem("APTP",cmd);//通知下面线程状态变化\r
-                break;\r
-            case BPHP:\r
-                handleBPHP();\r
-                mConnection.DeliverCMDMessageToSystem("APHP",cmd);//通知下面线程状态变化\r
-                break;\r
-            case BPX1://设置 心率血压血氧修正值\r
-                handleBPX1(cmd,mConnection,mRuntime);\r
-                ICLogger.i("收到服务器设置 心率血压血氧修正值BPX1");\r
-                mConnection.DeliverCMDMessageToSystem("APX1",cmd);//通知下面线程状态变化\r
-                break;\r
-\r
-            case BPS4: //提醒设置(时间段) 主要为久坐设置提醒时长。\r
-                handleBPS4(cmd,mConnection,mRuntime);\r
-                ICLogger.i("收到 提醒设置(时间段)");\r
-                mConnection.DeliverCMDMessageToSystem("APS4",cmd);//通知下面线程状态变化\r
-                break;\r
-            case BPDE:\r
-                handleBPDE(mConnection,cmd,mRuntime);\r
-                ICLogger.i(" 收到 进出围栏通知!");\r
-                mConnection.DeliverCMDMessageToSystem("APDE",cmd);//通知下面线程状态变化\r
-                break;\r
-\r
-            case BPTU:\r
-                handleBPTU(cmd, mConnection);\r
-                ICLogger.i("收到服务器 图片语音 消息 BPTU");\r
-            //    mConnection.DeliverCMDMessageToSystem("APTU", "");//通知下面线程状态变化\r
-                break;\r
-            case BPDG:\r
-                handleBPDG(mConnection,cmd,mRuntime);\r
-                ICLogger.i(" 收到 体温阈值设置!");\r
-                mConnection.DeliverCMDMessageToSystem("APDG",cmd);//通知下面线程状态变化\r
-                break;\r
-            case BPSL:\r
-                ICLogger.i("睡眠数据上传完毕!");\r
-                mConnection.DeliverCMDMessageToSystem("APSL",cmd);//通知下面线程状态变化\r
-                break;\r
-\r
-            case BPDH:\r
-                ICLogger.i("聆听");\r
-                handleBPDH(mConnection,mRuntime,cmd);\r
-                break;\r
-\r
-            case BPTQ: //天气下发\r
-                handleBPTQ(mConnection,mRuntime,cmd);\r
-                break;\r
-            case BPAT://剪断开关设定\r
-                handleBPAT(mConnection,mRuntime,cmd);\r
-                break;\r
-\r
-            case BPBT://蓝牙扫描设置\r
-                handleBPBT(mConnection,mRuntime,cmd);\r
-                break;\r
-\r
-            case BP65://声音设置\r
-                handleBP65(mConnection,mRuntime,cmd);\r
-                break;\r
-            case BP47://震动设置\r
-                handleBP47(mConnection,mRuntime,cmd);\r
-                break;\r
-\r
-        }\r
-\r
-        return ret;\r
-\r
-    }\r
-\r
-\r
-    public boolean handleCmd(CMD_TYPE type, String cmd, byte[] bytes) {\r
-\r
-        //只有需要传递二进制数据的才需要这个函数,目前只有BP28需要\r
-        boolean ret=true;\r
-        ICLogger.i("handleCmd "+type.name() + " "+cmd+" bytelen="+bytes.length );\r
-        if (Config.LOG_TOFILE) ICLogger.logToFile("APILog", " recv " +new String(bytes));\r
-        switch (type) {\r
-            case BP28:\r
-                handleBP28(mConnection,cmd, mRuntime,bytes);\r
-                ICLogger.i("收到服务器语音BP28");\r
-//                mConnection.DeliverCMDMessageToSystem("BP28", "");//通知下面线程状态变化\r
-                break;\r
-        }\r
-        return ret;\r
-    }\r
-}\r
+package com.ic.protocols;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Environment;
+import android.os.Handler;
+
+import com.enqualcomm.support.Config;
+import com.enqualcomm.support.Constants;
+import com.enqualcomm.support.CoreService;
+import com.enqualcomm.support.R;
+import com.enqualcomm.support.bean.Alarm;
+import com.enqualcomm.support.bean.Contact;
+import com.enqualcomm.support.bean.Content;
+import com.enqualcomm.support.bean.ICLocation;
+import com.enqualcomm.support.bean.Runtime;
+import com.enqualcomm.support.bean.StringMessage;
+import com.enqualcomm.support.bean.VoiceContent;
+import com.enqualcomm.support.bean.voicePacket;
+import com.enqualcomm.support.service.HeartRateManager;
+import com.enqualcomm.support.utils.CameraUtil;
+import com.enqualcomm.support.utils.Connection;
+import com.enqualcomm.support.utils.ICAudioManager;
+import com.enqualcomm.support.utils.ICLogger;
+import com.enqualcomm.support.utils.TemperatureUtil;
+import com.enqualcomm.support.utils.TimeUtil;
+import com.enqualcomm.support.utils.Util;
+import com.enqualcomm.support.utils.VibrateUtil;
+import com.enqualcomm.support.utils.WakeLockUtil;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Locale;
+
+import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
+import static android.content.Intent.FLAG_INCLUDE_STOPPED_PACKAGES;
+import static com.enqualcomm.support.Constants.ACTION_HEATR_RATE_START;
+import static com.enqualcomm.support.Constants.ACTION_REMOTE_CAMERA;
+import static com.enqualcomm.support.Constants.DIALOG_ACTION;
+import static com.enqualcomm.support.LocationClient.LOCATION_MODE;
+import static com.enqualcomm.support.bean.Contact.GROUP_ALL;
+import static java.lang.Math.abs;
+
+public class protocol_ic {
+    private static final String TAG = "ICSrv." + protocol_ic.class.getSimpleName();
+
+    private static final String CMDHEADER = "IW";
+    private static final String CMDEND = "#";
+    private static final String CMDSPLIT = ",";
+    public static final String defaultServerIP="watch.jiai.pro";
+    public static final int defaultServerPort=8090;
+    public enum CMD_TYPE {
+        /*终端发起*/
+        AP00,//登录包
+        BP00,
+        AP01,//混合定位
+        BP01,
+        AP02,//多基站定位
+        BP02,
+        AP92,//CDMA 混合定位
+        BP92,
+        AP94,
+        BP94,
+        AP03,//心跳包
+        BP03,
+        AP05,//语音查询接收
+        BP05,
+        AP07,//语音上行
+        BP07,
+        AP10,//报警与地址回复
+        BP10,
+        AP49,//心率上传
+        BP49,
+        APHT,//心率血压上传
+        BPHT,
+        APTM,//基站校时及获取定位
+        BPTM,
+        APCH,//充电提示
+        BPCH,
+        APBR,//上传蓝牙扫描结果
+        BPBR,
+        /* 服务器发起*/
+        AP12,
+        BP12,//SOS 号码设置
+        AP14,
+        BP14,//设置联系人白名单
+        AP15,
+        BP15,//设置定位周期
+        AP16,
+        BP16,//立即定位
+        AP17,
+        BP17,//恢复出厂设置
+        AP18,
+        BP18,//重启设备
+        AP21,
+        BP21,//设置计步开关
+        AP28,
+        BP28, //语音下行
+        AP31,
+        BP31,//关机
+        AP33,
+        BP33,//工作模式
+        AP34,
+        BP34,//自定义工作模式
+        AP40,
+        BP40,//下发文本
+        AP68,
+        BP68,//绑定解绑
+        APXL,
+        BPXL,//测量心率
+        APXY,
+        BPXY,//测量血压
+        APJZ,
+        BPJZ,//血压校准
+        AP84,
+        BP84,//白名单开关
+        AP85,
+        BP85,//设置闹钟
+        AP86,
+        BP86,//绑定解绑
+        AP87,
+        BP87,//二维码更新
+        AP88,
+        BP88,//查找手表
+        AP89,
+        BP89,//心率血压阀值设置
+        APTE,
+        BPTE,//体温间隔设置
+        APTP,
+        BPTP,//体温上行
+        APX1,
+        BPX1,//心率血压血氧修正
+        APS4,
+        BPS4,//提醒设置(时间段)
+        APHP,//上报心率血压血氧
+        BPHP,
+        APDE,//进出围栏通知
+        BPDE,
+        APDG,//体温阀值设置
+        BPDG,
+        APTU,//上传语音图片
+        BPTU,
+        APSL,//上传睡眠数据
+        BPSL,
+        AP46,//立即拍照
+        BP46,
+        APDH,//聆听
+        BPDH,
+        AP99,//监听电话
+        BP99,
+        APTQ,//天气
+        BPTQ,
+        APAT,//剪断消息开关
+        BPAT,
+        APBT,
+        BPBT,//设置蓝牙扫描间隔
+        APWL,
+        BPWL,//设置白名单
+        AP65,
+        BP65,//设置音量
+        AP47,
+        BP47,//设置震动
+        UNKNOWN_CMD,
+    }
+
+    private static HashMap<CMD_TYPE, String> cmdMap = null;
+
+    static {
+        cmdMap = new HashMap<CMD_TYPE, String>();
+        cmdMap.put(CMD_TYPE.AP00, "AP00");
+        cmdMap.put(CMD_TYPE.BP00, "BP00");
+        cmdMap.put(CMD_TYPE.AP01, "AP01");
+        cmdMap.put(CMD_TYPE.BP01, "BP01");
+        cmdMap.put(CMD_TYPE.AP02, "AP02");
+        cmdMap.put(CMD_TYPE.BP02, "BP02");
+        cmdMap.put(CMD_TYPE.AP92, "AP92");
+        cmdMap.put(CMD_TYPE.BP92, "BP92");
+        cmdMap.put(CMD_TYPE.AP94, "AP94");
+        cmdMap.put(CMD_TYPE.BP94, "BP94");
+        cmdMap.put(CMD_TYPE.AP03, "AP03");
+        cmdMap.put(CMD_TYPE.BP03, "BP03");
+        cmdMap.put(CMD_TYPE.AP05, "AP05");
+        cmdMap.put(CMD_TYPE.BP05, "BP05");
+        cmdMap.put(CMD_TYPE.AP07, "AP07");
+        cmdMap.put(CMD_TYPE.BP07, "BP07");
+        cmdMap.put(CMD_TYPE.AP10, "AP10");
+        cmdMap.put(CMD_TYPE.BP10, "BP10");
+        cmdMap.put(CMD_TYPE.AP49, "AP49");
+        cmdMap.put(CMD_TYPE.BP49, "BP49");
+        cmdMap.put(CMD_TYPE.APHT, "APHT");
+        cmdMap.put(CMD_TYPE.BPHT, "BPHT");
+        cmdMap.put(CMD_TYPE.APTM, "APTM");
+        cmdMap.put(CMD_TYPE.BPTM, "BPTM");
+        cmdMap.put(CMD_TYPE.APCH, "APCH");
+        cmdMap.put(CMD_TYPE.BPCH, "BPCH");
+        cmdMap.put(CMD_TYPE.APBR, "APBR");
+        cmdMap.put(CMD_TYPE.BPBR, "BPBR");
+        /* 服务器发起*/
+        cmdMap.put(CMD_TYPE.AP12, "AP12");
+        cmdMap.put(CMD_TYPE.BP12, "BP12");
+        cmdMap.put(CMD_TYPE.AP14, "AP14");
+        cmdMap.put(CMD_TYPE.BP14, "BP14");
+        cmdMap.put(CMD_TYPE.AP15, "AP15");
+        cmdMap.put(CMD_TYPE.BP15, "BP15");
+        cmdMap.put(CMD_TYPE.AP16, "AP16");
+        cmdMap.put(CMD_TYPE.BP16, "BP16");
+        cmdMap.put(CMD_TYPE.AP17, "AP17");
+        cmdMap.put(CMD_TYPE.BP17, "BP17");
+        cmdMap.put(CMD_TYPE.AP18, "AP18");
+        cmdMap.put(CMD_TYPE.BP18, "BP18");
+        cmdMap.put(CMD_TYPE.AP21, "AP21");
+        cmdMap.put(CMD_TYPE.BP21, "BP21");
+        cmdMap.put(CMD_TYPE.AP28, "AP28");
+        cmdMap.put(CMD_TYPE.BP28, "BP28");
+        cmdMap.put(CMD_TYPE.AP31, "AP31");
+        cmdMap.put(CMD_TYPE.BP31, "BP31");
+        cmdMap.put(CMD_TYPE.AP33, "AP33");
+        cmdMap.put(CMD_TYPE.BP33, "BP33");
+        cmdMap.put(CMD_TYPE.AP34, "AP34");
+        cmdMap.put(CMD_TYPE.BP34, "BP34");
+        cmdMap.put(CMD_TYPE.AP40, "AP40");
+        cmdMap.put(CMD_TYPE.BP40, "BP40");
+        cmdMap.put(CMD_TYPE.AP68, "AP68");
+        cmdMap.put(CMD_TYPE.BP68, "BP68");
+        cmdMap.put(CMD_TYPE.APXL, "APXL");
+        cmdMap.put(CMD_TYPE.BPXL, "BPXL");
+        cmdMap.put(CMD_TYPE.APXY, "APXY");
+        cmdMap.put(CMD_TYPE.BPXY, "BPXY");
+        cmdMap.put(CMD_TYPE.APJZ, "APJZ");
+        cmdMap.put(CMD_TYPE.BPJZ, "BPJZ");
+        cmdMap.put(CMD_TYPE.AP84, "AP84");
+        cmdMap.put(CMD_TYPE.BP84, "BP84");
+        cmdMap.put(CMD_TYPE.AP85, "AP85");
+        cmdMap.put(CMD_TYPE.BP85, "BP85");
+        cmdMap.put(CMD_TYPE.AP86, "AP86");
+        cmdMap.put(CMD_TYPE.BP86, "BP86");
+        cmdMap.put(CMD_TYPE.AP87, "AP87");
+        cmdMap.put(CMD_TYPE.BP87, "BP87");
+        cmdMap.put(CMD_TYPE.AP88, "AP88");
+        cmdMap.put(CMD_TYPE.BP88, "BP88");
+        cmdMap.put(CMD_TYPE.AP89, "AP89");
+        cmdMap.put(CMD_TYPE.BP89, "BP89");
+        cmdMap.put(CMD_TYPE.APTE, "APTE");
+        cmdMap.put(CMD_TYPE.BPTE, "BPTE");
+        cmdMap.put(CMD_TYPE.APTP, "APTP");
+        cmdMap.put(CMD_TYPE.BPTP, "BPTP");
+        cmdMap.put(CMD_TYPE.APX1, "APX1");
+        cmdMap.put(CMD_TYPE.BPX1, "BPX1");
+        cmdMap.put(CMD_TYPE.APS4, "APS4");
+        cmdMap.put(CMD_TYPE.BPS4, "BPS4");
+        cmdMap.put(CMD_TYPE.APHP, "APHP");
+        cmdMap.put(CMD_TYPE.BPHP, "BPHP");
+        cmdMap.put(CMD_TYPE.APDE, "APDE");
+        cmdMap.put(CMD_TYPE.BPDE, "BPDE");
+        cmdMap.put(CMD_TYPE.APDG, "APDG");
+        cmdMap.put(CMD_TYPE.BPDG, "BPDG");
+        cmdMap.put(CMD_TYPE.APTU, "APTU");
+        cmdMap.put(CMD_TYPE.BPTU, "BPTU");
+        cmdMap.put(CMD_TYPE.APSL, "APSL");
+        cmdMap.put(CMD_TYPE.BPSL, "BPSL");
+        cmdMap.put(CMD_TYPE.AP46, "AP46");
+        cmdMap.put(CMD_TYPE.BP46, "BP46");
+        cmdMap.put(CMD_TYPE.APDH, "APDH");
+        cmdMap.put(CMD_TYPE.BPDH, "BPDH");
+        cmdMap.put(CMD_TYPE.AP99, "AP99");
+        cmdMap.put(CMD_TYPE.BP99, "BP99");
+        cmdMap.put(CMD_TYPE.APTQ, "APTQ");
+        cmdMap.put(CMD_TYPE.BPTQ, "BPTQ");
+        cmdMap.put(CMD_TYPE.APAT, "APAT");
+        cmdMap.put(CMD_TYPE.BPAT, "BPAT");
+        cmdMap.put(CMD_TYPE.APBT, "APBT");
+        cmdMap.put(CMD_TYPE.BPBT, "BPBT");
+        cmdMap.put(CMD_TYPE.APWL, "APWL");
+        cmdMap.put(CMD_TYPE.BPWL, "BPWL");
+        cmdMap.put(CMD_TYPE.AP65, "AP65");
+        cmdMap.put(CMD_TYPE.BP65, "BP65");
+        cmdMap.put(CMD_TYPE.AP47, "AP47");
+        cmdMap.put(CMD_TYPE.BP47, "BP47");
+    }
+
+
+    private Connection mConnection=null;
+    private Runtime mRuntime=null;
+
+    public protocol_ic(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());
+
+                }
+            }catch (Exception e) {
+                ICLogger.e(e.getMessage(), e);
+            }
+//            Set Datetime 20200505112734
+//            Set TimeZone 8
+
+        }else{
+            log("handleBP00","format Error");
+        }
+    }
+
+
+    public static StringMessage AP03(Runtime ds) {
+        //示例数据:IWAP03,06000908000102,5555,30#  IWAP03,000000null00000,0,0#
+        //IW: 标识符
+        //AP03:命令字
+        //设备在静止时,可以通过该指令与平台保持连接和解决静态漂移
+        //06000908000102:
+        //060为GSM信号,
+        //009为参与定位的卫星数,
+        //080为电池电量,
+        //0 为保留位,
+        //01为设防状态,此处由两位十六进制表示,无取值时为 00 ,长度必需为两位,一共 8个bit 表示8种状态,各bit定义如下:(未列出的为当前未使用, 1表示有效 ,0 表示无效)
+        //Bit0 设防状态<手表无效>
+        //Bit1 为 1 表示夜灯为开,为0 夜灯为 关
+        //02为工作模式 ,(设防,工作模式如果为00,则代表无或未设置)
+        //5555: 计步步数,每次到达 9999 后重 0 开始计 (此处 9999 为示例,可以为2字节int 然后溢出归零)
+        //30: 翻滚次数
+        return genStringMessage(cmdMap.get(CMD_TYPE.AP03),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP03)).append(CMDSPLIT).append(String.format("%03d",abs(ds.getSignalStrength())))
+                .append(ds.getGPSLocationStarNums()).append(ds.getBattery()).append(ds.isPowerConnected()?"1":"0")
+                .append(ds.getProtection()).append(ds.getWorkModeStr()).append(CMDSPLIT)
+                .append(ds.getTotalStepCount()).append(CMDSPLIT).append(ds.getRolltimes()).append(CMDEND).toString());
+    }
+    //处理 心跳 BP03
+    public void handleBP03(String cmd){
+
+        log("BP03心跳接收成功");
+    }
+
+
+    public static StringMessage AP10(Runtime ds){
+
+        /**
+         * IWAP10080524A2232.9806N11404.9355E000.1061830323.8706000908000502,
+         * 460,0,9520,3671,
+         * 00,zh-cn,00,
+         * 00为报警状态,00为无任何报警(01:SOS,02:低电,03:脱落报警,04:佩戴提醒,05:剪断报警,06:跌倒报警,07:心率异常, 08:心率过高, 09:心率过低,10:收缩压过高,11:收缩压过低,12:舒张压过高,13:舒张压过低,14:久坐提醒,15:非法解锁(剪断报警),16:锁定提醒(佩戴提醒),17:体温过高,18体温过低)
+         * zh-cn:设备语言
+         * 00:第一个0:是否需要回复地址信息,0:不回复,1回复.
+         * HOME|74-DE-2B-44-88-8C|97&HOME1|74-DE-2B-44-88-8C|97&HOME2|74-DE-2B-44-88-8C|97&HOME3|74-DE-2B-44-88-8C|97#
+         */
+        return genStringMessage(cmdMap.get(CMD_TYPE.AP10),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP10)).append(TimeUtil.getShortDate())
+                .append(ds.getGPSData()).append(TimeUtil.getShortTime()).append(ds.getGPSHeading())
+                .append(String.format("%03d",abs(ds.getSignalStrength())))
+                .append(ds.getGPSLocationStarNums()).append(ds.getBattery()).append("0")
+                .append(ds.getProtection()).append(ds.getWorkModeStr()).append(CMDSPLIT)
+                .append(ds.getLBSData()).append(CMDSPLIT)
+                .append(ds.getAlarmType()).append(CMDSPLIT)
+                .append(ds.getLanguage()).append(CMDSPLIT)
+                .append("00").append(CMDSPLIT)  //不回复地址
+                .append(ds.getWifiInfo()).append(CMDEND).toString());
+
+    }
+
+    /*LBS+GPS混合定位*/
+    public static StringMessage AP01(Runtime ds) {
+        //示例数据:IWAP01080524A2232.9806N11404.9355E000.1061830323.8706000908000102,
+        // 460,0,9520,3671,
+        // Home|74-DE-2B-44-88-8C|97& Home1|74-DE-2B-44-88-8C|97&Home2|74-DE-2B-44-88-8C|97& Home3|74-DE-2B-44-88-8C|97#
+//        IWAP01191230A2232.9807N11404.9355E000.1161320000.0006000910000000,460,00,9520,3671,#
+        return genStringMessage(cmdMap.get(CMD_TYPE.AP01),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP01)).append(TimeUtil.getShortDate())
+                .append(ds.getGPSData()).append(TimeUtil.getShortTime()).append(ds.getGPSHeading()).append(String.format("%03d",abs(ds.getSignalStrength())))
+                .append(ds.getGPSLocationStarNums()).append(ds.getBattery()).append("0")
+                .append(ds.getProtection()).append(ds.getWorkModeStr()).append(CMDSPLIT)
+                .append(ds.getLBSData()).append(CMDSPLIT).append(ds.getWifiInfo()).append(CMDEND).toString());
+    }
+
+    //处理 定位 BP01
+    public void handleBP01(String cmd){
+        log("BP01定位接收成功");
+    }
+
+
+
+    /*LBS+WiFi混合定位*/
+    public static StringMessage AP02(Runtime ds) {
+        //示例数据:IWAP02,
+        // zh_cn,
+        // 0,
+        // 7,
+        // 460,0,
+        // 9520|3671|13,9520|3672|12,9520|3673|11,9520|3674|10,9520|3675|9,9520|3676|8,9520|3677|7,
+        // 4,
+        // 1|D8-24-BD-79-FA-1F|59&2|3C-46-D8-6D-CE-01|81&3|0C-4C-39-1A-7C-65|69&4|70-A8-E3-5D-D7-C0|65#
+//        IW标识符
+//        AP02:命令字
+//        zh_cn: 语言标志
+//        0:回复标识,为0时不回复地址,为 1 时,服务器回复地址信息
+//        7: 表示共有7组基站
+//        460: MCC 国家码
+//        0: MNC运营商代码
+//        9520|3671|10: LAC|CID|dbm表示一组基站信息,后面数量需和基站组数地应  10:dbm为信号强度多基站信号强度建议从高到低排列后上传,信号强度转正数:150 – abs(dbm)
+//        4: 表示WIFI组数,
+//                1|D8-24-BD-79-FA-1F|59: ssid|mac地址|信号强度,信号强度转正数:150 – abs(信号强度)
+
+        int apsum=0;
+        String wifiinfo=ds.getWifiInfo();
+        if (!wifiinfo.isEmpty()) {
+            String[] list = wifiinfo.split("&");
+            apsum = list.length;
+        }
+
+        ICLogger.i("Wifi ap sum "+apsum);
+        return genStringMessage(cmdMap.get(CMD_TYPE.AP02),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP02)).append(CMDSPLIT)
+                .append(ds.getLanguage()).append(CMDSPLIT)
+                .append(0).append(CMDSPLIT) //为0时不回复地址
+                .append(ds.getLBSMultiStationData()).append(CMDSPLIT)  //基站信息数据
+                .append(apsum).append(CMDSPLIT).append(ds.getWifiInfo()).append(CMDEND).toString());  //wifi信息数据
+    }
+
+    //处理 定位 BP01
+    public void handleBP02(String cmd){
+        log("BP02定位接收成功");
+    }
+
+
+
+    public static StringMessage APXL(String id){
+//设备响应:      IWAPXL,080835#
+        //080835:指令流水号
+        return genStringMessage(cmdMap.get(CMD_TYPE.APXL),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APXL))
+                .append(CMDSPLIT).append(id)
+                .append(CMDEND).toString());
+    }
+
+    /**
+     * 测量心率
+     * @param cmd
+     * @param connection
+     */
+    public void handleBPXL(String cmd, Connection connection){
+        //IWBPXL,353456789012345,080835#
+        //说明:
+        //IW:标识符
+        //BPXL : 命令字符
+        //353456789012345:IMEI号,设备唯一ID
+        //080835 :指令流水号
+        //设备响应:      IWAPXL,080835#
+        //080835:指令流水号
+        String[] list=cmd.split(CMDSPLIT);
+        if (list.length==3){
+            String index=list[2];
+            String imei=list[1];
+            ICLogger.i("Handle BPXL IMEI "+imei+",index "+index);
+            connection.send(APXL(index));
+        }else{
+            ICLogger.i("BPXL format error!");
+        }
+
+    }
+
+    public static StringMessage APXY(String id){
+//设备响应:      IWAPXY,080835#
+        //080835:指令流水号
+        return genStringMessage(cmdMap.get(CMD_TYPE.APXY),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APXY))
+                .append(CMDSPLIT).append(id)
+                .append(CMDEND).toString());
+    }
+
+    /**
+     * 测量血压
+     * @param cmd
+     * @param connection
+     */
+    public void handleBPXY(String cmd,Connection connection){
+        //IWBPXY,353456789012345,080835#
+        //说明:
+        //IW:标识符
+        //BPXL : 命令字符
+        //353456789012345:IMEI号,设备唯一ID
+        //080835 :指令流水号
+        //设备响应:      IWAPXY,080835#
+        //080835:指令流水号
+        String[] list=cmd.split(CMDSPLIT);
+        if (list.length==3){
+            String index=list[2];
+            String imei=list[1];
+            ICLogger.i("Handle BPXY IMEI "+imei+",index "+index);
+            connection.send(APXY(index));
+        }else{
+            ICLogger.i("BPXY format error!");
+        }
+
+    }
+
+
+
+    public static StringMessage APJZ(String id,String BPH,String BPL,String Age,String Sex){
+        //设备响应:      IWAPJZ,792997,120,85,42,1#
+        //792997:指令流水号
+        // 高压120,低压85,年龄42,1 男性
+        return genStringMessage(cmdMap.get(CMD_TYPE.APJZ),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APJZ))
+                .append(CMDSPLIT).append(id)
+                .append(CMDSPLIT).append(BPH)
+                .append(CMDSPLIT).append(BPL)
+                .append(CMDSPLIT).append(Age)
+                .append(CMDSPLIT).append(Sex)
+                .append(CMDEND).toString());
+    }
+
+    /**
+     *
+     * @param cmd
+     * @param connection
+     * @param runtime
+     */
+    public void handleBPJZ(String cmd,Connection connection,Runtime runtime){
+        //cmdbuf.size 42 IWBPJZ,867155030001063,199600,120,85,45,1#   高压120,低压85,年龄45,男性
+//        cmdbuf.size 42 IWBPJZ,867155030001063,909957,120,85,42,0#  高压120,低压85,年龄42,女性
+        //IWBPJZ,353456789012345,080835,110,75#
+        //说明:
+        //IW:标识符
+        //BPJZ : 命令字符
+        //353456789012345:IMEI号,设备唯一ID
+        //110:高压值
+        //75:低压值
+        //080835 :指令流水号
+        //设备响应:      IWAPJZ,792997,120,85,42,1#
+        //792997:指令流水号
+        String[] list=cmd.split(CMDSPLIT);
+        if (list.length==7){
+            try {
+                String index = list[2];
+                String imei = list[1];
+                String strBPH = list[3];
+                String strBPL = list[4];
+                String strAge = list[5];
+                String strSex = list[6];
+
+                connection.send(APJZ(index, strBPH, strBPL, strAge, strSex));
+                runtime.getHRS().setXY_Ref(Integer.parseInt(strBPH), Integer.parseInt(strBPL), Integer.parseInt(strAge), Integer.parseInt(strSex));
+                ICLogger.i("Handle BPJZ IMEI " + imei + ",index " + index + ", BPH " + strBPH + ", BPL " + strBPL + ", Age " + strAge + ", Sex " + (strSex.equals("1") ? "男" : "女"));
+            }catch (Exception e){
+                ICLogger.e(e.getMessage(),e);
+            }
+        }else{
+            ICLogger.i("BPXY format error!");
+        }
+    }
+
+
+
+    //重启
+
+
+    public static StringMessage AP18(String index){
+        return genStringMessage(cmdMap.get(CMD_TYPE.AP18),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP18))
+                .append(CMDSPLIT).append(index)
+                .append(CMDEND).toString());
+    }
+
+    public void handleBP18(Connection connection,String cmd) {
+
+        //    IWBP18,867155030001063,161723
+        String[] cmdlist=cmd.split(CMDSPLIT);
+        if (cmdlist.length==3) {
+
+            connection.send(AP18(cmdlist[2]));
+
+        }
+    }
+    //恢复出厂设置
+
+    public static StringMessage AP17(String index){
+        return genStringMessage(cmdMap.get(CMD_TYPE.AP17),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP17))
+                .append(CMDSPLIT).append(index)
+                .append(CMDEND).toString());
+    }
+    public void handleBP17(Connection connection,String cmd) {
+
+        //    IWBP17,867155030001063,161723
+        String[] cmdlist=cmd.split(CMDSPLIT);
+        if (cmdlist.length==3) {
+
+            connection.send(AP17(cmdlist[2]));
+
+        }
+    }
+
+    //关机
+
+
+    public static StringMessage AP31(String index){
+        return genStringMessage("AP31",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP31))
+                .append(CMDSPLIT).append(index)
+                .append(CMDEND).toString());
+    }
+    public void handleBP31(Connection connection,String cmd) {
+
+        //    IWBP31,867155030001063,161723
+        String[] cmdlist=cmd.split(CMDSPLIT);
+        if (cmdlist.length==3) {
+
+            connection.send(AP31(cmdlist[2]));
+
+        }
+    }
+
+    //设置SOS号码
+    public static StringMessage AP12(String index,String phNum1,String phNum2,String phNum3){
+        return genStringMessage("AP12",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP12))
+                .append(CMDSPLIT).append(index)
+                .append(CMDSPLIT).append(phNum1)
+                .append(CMDSPLIT).append(phNum2)
+                .append(CMDSPLIT).append(phNum3)
+                .append(CMDEND).toString());
+    }
+
+    //设置SOS号码
+    public void handleBP12(Connection connection,String cmd,Runtime runtime){
+        //    IWBP12,353456789012345,080835,135XXXXXXXX,135XXXXXXXX,135XXXXXXXX#
+        String[] cmdlist=cmd.split(CMDSPLIT);
+        if (cmdlist.length>=3){
+            String index=cmdlist[2];
+            String phNum1=cmdlist.length==3?"":cmdlist[3];
+            String phNum2=cmdlist.length>3?(cmdlist.length==4?"":cmdlist[4]):"";
+            String phNum3=(cmdlist.length>4)?(cmdlist.length==5? "":cmdlist[5]):"";
+            ICLogger.i(new StringBuffer().append("get Emegency Numbs "+phNum1+","+phNum2+","+phNum3).toString());
+            connection.send(AP12(index,phNum1,phNum2,phNum3));
+
+            ArrayList<Contact> contactArray=new ArrayList<Contact>();
+//            if(Config.custom_branch_name.equals("AK")){
+//
+//                contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos1", "07522312120"));
+//                if (!phNum1.isEmpty())
+//                    contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos2", phNum1));
+//                if (!phNum2.isEmpty())
+//                    contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos3", phNum2));
+//            }else {
+                if (!phNum1.isEmpty())
+                    contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos1", phNum1));
+                if (!phNum2.isEmpty())
+                    contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos2", phNum2));
+                if (!phNum3.isEmpty())
+                    contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos3", phNum3));
+//            }
+            runtime.getDbHelper().saveContacts(contactArray,false,false,false,false,false,true);
+        }else{
+            ICLogger.i(" BP12 format error!");
+        }
+    }
+
+
+    public static StringMessage  AP14(String index,String[] phnumbs){
+        return genStringMessage("AP14",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP14))
+                .append(CMDSPLIT).append(index)
+                .append(CMDSPLIT).append(phnumbs[0])
+                .append(CMDSPLIT).append(phnumbs[1])
+                .append(CMDSPLIT).append(phnumbs[2])
+                .append(CMDSPLIT).append(phnumbs[3])
+                .append(CMDSPLIT).append(phnumbs[4])
+                .append(CMDSPLIT).append(phnumbs[5])
+                .append(CMDSPLIT).append(phnumbs[6])
+                .append(CMDSPLIT).append(phnumbs[7])
+                .append(CMDSPLIT).append(phnumbs[8])
+                .append(CMDSPLIT).append(phnumbs[9])
+                .append(CMDEND).toString());
+    }
+    //设置通讯录,白名单(10个)
+    public void handleBP14(Connection connection,String cmd , Runtime runtime){
+//        IWBP14,867155030001063,357444,9b44529b|13554820016,,,,,,,,,
+/**
+ * IWBP14,353456789012345,080835,
+ * D3590D54|135xxxxxxxxxx,
+ * D3590D54|135xxxxxxxxxx,
+ * D3590D54|135xxxxxxxxxx,
+ * D3590D54|135xxxxxxxxxx,
+ * D3590D54|135xxxxxxxxxx,
+ * D3590D54|135xxxxxxxxxx,
+ * D3590D54|135xxxxxxxxxx,
+ * D3590D54|135xxxxxxxxxx,
+ * D3590D54|135xxxxxxxxxx,
+ * D3590D54|135xxxxxxxxxx#
+ */
+        String[] cmdlist=cmd.split(CMDSPLIT);
+        String[] phnums=new String[]{"","","","","","","","","",""};
+        StringBuffer sb=new StringBuffer().append("recv phone Numbs ");
+        if (cmdlist.length>=3){
+            switch (cmdlist.length){
+                case 13:
+                    phnums[9]=cmdlist[12];
+                    sb.append(phnums[9]).append(",");
+                case 12:
+                    phnums[8]=cmdlist[11];
+                    sb.append(phnums[8]).append(",");
+                case 11:
+                    phnums[7]=cmdlist[10];
+                    sb.append(phnums[7]).append(",");
+                case 10:
+                    phnums[6]=cmdlist[9];
+                    sb.append(phnums[6]).append(",");
+                case 9:
+                    phnums[5]=cmdlist[8];
+                    sb.append(phnums[5]).append(",");
+                case 8:
+                    phnums[4]=cmdlist[7];
+                    sb.append(phnums[4]).append(",");
+                case 7:
+                    phnums[3]=cmdlist[6];
+                    sb.append(phnums[3]).append(",");
+                case 6:
+                    phnums[2]=cmdlist[5];
+                    sb.append(phnums[2]).append(",");
+                case 5:
+                    phnums[1]=cmdlist[4];
+                    sb.append(phnums[1]).append(",");
+                case 4:
+                    phnums[0]=cmdlist[3];
+                    sb.append(phnums[0]).append(",");
+
+            }
+
+            String index=cmdlist[2];
+            ICLogger.i(sb.toString());
+            connection.send(AP14(index,phnums));
+            ArrayList<Contact> contactArray=new ArrayList<Contact>();
+
+            if(Config.custom_name.equals("YT")) {
+                ICLogger.i("=====add hotline 96885 ");
+                contactArray.add(new Contact(Contact.CATEGORY_CALL, runtime.getContextProxy().context.getResources().getString(R.string.hotline), "96885"));
+            }
+            for (int i=0; i< phnums.length;i++){
+                String[] tmp= phnums[i].split("\\|");
+                if (tmp.length==2){
+                    String name= Util.decodeUnicode2Utf8(tmp[0]);
+                    String phonem=tmp[1];
+                    ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length+" , name="+name+",-"+phonem);
+                    contactArray.add(new Contact(Contact.CATEGORY_CALL,name,phonem));
+                }else{
+                    ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length);
+
+                }
+            }
+//            contactArray.add(new Contact(Contact.CATEGORY_GROUP,"All","666"));
+//            contactArray.add(new Contact(Contact.CATEGORY_PARTNER,"PARTNER","666"));
+//            contactArray.add(new Contact(Contact.CATEGORY_CARE,"CARE","666"));
+//            contactArray.add(new Contact(Contact.CATEGORY_VOLTE,"VOLTE","666"));
+
+            runtime.getDbHelper().saveContacts(contactArray,false,false,true,false,false,false);
+
+        }else{
+            ICLogger.i(" BP14 format error!");
+        }
+
+    }
+
+
+
+    public static StringMessage AP85(Runtime ds,String cmddata){
+//示例数据:IWAP49,68##
+        return genStringMessage("AP85",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP85))
+                .append(CMDSPLIT).append(cmddata)
+                .append(CMDEND).toString());
+
+    }
+    //设置闹钟
+    public void handleBP85(String cmd , Connection connection,Runtime runtime){
+//        IWBP85,867155030001063,155312,1,1,0235,12,1,1
+//        IWBP85,867155030002145,945166,1,0,
+//        IWBP85,867155030001064,265960,1,1,1130,,1,1
+//        IWBP85,353456789012345,080835,1,3, 0900,135,1,1@0900 ,135,1,2@0900 ,135,1,3#
+//353456789012345:IMEI号,设备唯一ID
+//080835 :指令流水号
+//1: 表示闹钟总开关,1为开,0 为关
+//3: 表示闹钟个数
+//0900 ,135,1,1,表示一组闹钟,0900表示早上09:00, 135表示周一周三周五,使用24小时制
+//1表示该组闹钟开启或关闭状态   1表示开启  0表示关闭
+//1表示吃药提醒
+//2 表示喝水提醒
+//3 表示久坐提醒
+//多组闹钟之间用”@”符号分隔
+
+        String imei="",cmdindex="0"/*指令流水号*/;
+        int     all_alarmswitch=0 /*总开关 1为开,0 为关*/,
+                alarmswitch=0 /*1为开,0 为关*/,
+                alarmcount=0 /*表示闹钟个数*/;
+        String alarmtime="";//0900表示早上09:00
+        int alarmtype=1; //1表示吃药提醒 , 2 表示喝水提醒 ,3 表示久坐提醒
+        String repeat="";// 135表示周一周三周五,使用24小时制
+        String[] datalist= cmd.split("@");
+        ArrayList<Alarm> alarmlist=new ArrayList<>();
+        if (datalist.length >0){
+            for (int i =0 ; i< datalist.length;i++){
+                String [] cmdarglist=datalist[i].split(",");
+
+                if (i == 0){
+                    if (cmdarglist.length == 9){
+                        try {
+                            imei = cmdarglist[1];
+                            cmdindex = cmdarglist[2];
+                            all_alarmswitch = Integer.parseInt(cmdarglist[3]);
+                            alarmcount = Integer.parseInt(cmdarglist[4]);
+                            alarmtime = cmdarglist[5];
+                            repeat = cmdarglist[6];
+                            alarmswitch = Integer.parseInt(cmdarglist[7]);
+                            alarmtype = Integer.parseInt(cmdarglist[8]);
+                            log(new StringBuilder("imei ").append(imei)
+                                    .append(", cmdindex ").append(cmdindex)
+                                    .append(", allswitch=").append(all_alarmswitch)
+                                    .append(", all alarm count=").append(alarmcount)
+                                    .toString()
+                            );
+
+                            log(new StringBuilder("alarmtime ").append(alarmtime)
+                                    .append(", relpeat ").append(repeat)
+                                    .append(", switch=").append(alarmswitch)
+                                    .append(", alarmtype=").append(alarmtype)
+                                    .toString()
+                            );
+                            alarmlist.add(new Alarm("ST" + alarmtime.substring(0, 2) + "." + alarmtime.substring(2), "W" + repeat, "CON", alarmswitch == 1 ? "ON" : "OFF", "闹铃"));
+                        }catch (Exception e) {
+                            ICLogger.e(e.getMessage(), e);
+                        }
+                    }else if (cmdarglist.length == 5) {
+                     try {
+                         imei = cmdarglist[1];
+                         cmdindex = cmdarglist[2];
+                         all_alarmswitch = Integer.parseInt(cmdarglist[3]);
+                         alarmcount = Integer.parseInt(cmdarglist[4]);
+                     }catch (Exception e) {
+                         ICLogger.e(e.getMessage(), e);
+                     }
+                    }else{
+                        log("data len is too small!");
+                    }
+                }else{
+                    if (cmdarglist.length == 4){
+                        try {
+                            alarmtime = cmdarglist[0];
+                            repeat = cmdarglist[1];
+                            alarmswitch = Integer.parseInt(cmdarglist[2]);
+                            alarmtype = Integer.parseInt(cmdarglist[3]);
+
+                            log(new StringBuilder("set alarmtime ").append(alarmtime)
+                                    .append(", relpeat ").append(repeat)
+                                    .append(", switch=").append(alarmswitch)
+                                    .append(", alarmtype=").append(alarmtype)
+                                    .toString()
+                            );
+
+                            alarmlist.add(new Alarm("ST" + alarmtime.substring(0, 2) + "." + alarmtime.substring(2), "W" + repeat, "CON", alarmswitch == 1 ? "ON" : "OFF", "闹铃"));
+                        }catch (Exception e){
+                            ICLogger.e(e.getMessage(),e);
+                        }
+                    }else{
+                        log("data len is too small!");
+                    }
+
+                }
+            }//循环获取alarm数据结束
+            runtime.getDbHelper().saveAlarm(alarmlist);
+
+            //do clean and set alarm things
+
+        }
+//IWBP85,867155030002145,410385,1,0,#
+
+        String replacement=new StringBuilder("IWBP85,").append(imei).append(",").toString();
+        String replycmd = cmd.replace(replacement,"");
+        ICLogger.i("gen reply "+replacement+" "+replycmd);
+        connection.send(AP85(runtime,replycmd));
+    }
+
+
+// AP05命令L02服务器不适用
+//    public static String AP05(boolean recvFlag){
+//
+////        IWAP05,1#
+//        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP05))
+//                .append(CMDSPLIT).append(recvFlag?1:0)
+//                .append(CMDEND).toString();
+//
+//    }
+//
+//
+//    public void handleBP05(String cmd){
+////        IWBP05,6#
+//        String[] cmdlist=cmd.split(CMDSPLIT);
+//        if (cmdlist.length>1){
+//            ICLogger.i(" 服务器有 " +cmdlist[1]+" 条语音未接收!");
+//        }
+//    }
+
+
+
+
+    public static byte[] AP07(String  packetTime,int count,int index,int datalen,byte[] amrdata){
+//IWAP07,20140818064408,6,1,1024,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#
+//说明:
+//IW:标识符
+//AP07 : 命令字符
+//20140818064408 :yyyyMMddHHmmss 格式的年月日时分秒,设备录音时间
+//6:语音包分包总数
+//1 :当前包数,第一包为1,第二包为2,。。。。。。同一个语音包的语音时间相同
+//1024 :语音包长度
+//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:当前音频数据, 每个音频数据包大小为1024字节,最后一包不足1024的取实际字节数
+//语音包上传规则:
+//按包次序依次上传,上传后如果没有收到服务器的响应包,则继续上传该语音包。
+//收到设备回复确认数据包接收成功状态后,继续开始依次上传下一个数据包。。。。。。
+//如果设备回复确认数据包接收失败状态,则重复发送上一个数据包
+
+
+        String sb=new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP07))
+                .append(CMDSPLIT).append(packetTime)
+                .append(CMDSPLIT).append(count)
+                .append(CMDSPLIT).append(index)
+                .append(CMDSPLIT).append(datalen)
+                .append(CMDSPLIT).toString();
+
+        byte[] sentbuf=new byte[sb.length()+datalen+1];
+        System.arraycopy(sb.getBytes(),0,sentbuf,0,sb.length());
+        System.arraycopy(amrdata,0,sentbuf,sb.length(),datalen);
+        sentbuf[sb.length()+datalen]='#';
+
+        return sentbuf;
+
+    }
+
+
+    public void handleBP07(String cmd , Connection connection ){
+//平台响应:      IWBP07,20140818064408,6,1,1#
+//20140818064408:设备语音时间,yyyyMMddHHmmss 格式的年月日时分秒
+//6:语音包分包总数
+//1:当前设备收到的是第几个包
+//1:表示服务器接受数据成功,0表示服务器接受数据失败
+        String[] cmdlist=cmd.split(CMDSPLIT);
+        if (cmdlist.length==5){
+            try {
+                String time = cmdlist[1];
+                int packetCount = Integer.parseInt(cmdlist[2]);
+                int packetIndex = Integer.parseInt(cmdlist[3]);
+                int receiveSuccess = Integer.parseInt(cmdlist[4]);
+                ICLogger.i("服务器在" + time + " 收到语音 " + packetIndex + "/" + packetCount + " " + (receiveSuccess == 1 ? "成功" : "失敗"));
+                if (receiveSuccess == 1) {
+                    //如果服务器接收 语音成功,则设置下一个要发送的语音包Index,当index == packetCount的时候表示所有包发送完毕,停止继续发送
+                    voicePacket.getInstanceSent().setCurrentIndexToSent(packetIndex);
+                }
+                //发送消息,再次检查要发送的语音包,确认其发送完毕
+                connection.DeliverCMDMessageToSystem("SentVoicePacket", "SentVoicePacket");
+            }catch (Exception e){
+                ICLogger.e(e.getMessage(),e);
+            }
+        }else{
+            ICLogger.i(" BP07 Format error!");
+        }
+    }
+
+
+
+    public static StringMessage AP33(String cmdindex,int workMode){
+//IWAP33,080835,1#
+//080835:指令流水号
+//1:设置信息,供服务器同步
+        return genStringMessage("AP33",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP33))
+                .append(CMDSPLIT).append(cmdindex)
+                .append(CMDSPLIT).append(workMode)
+                .append(CMDEND).toString());
+    }
+
+    //设置工作模式
+    public void handleBP33(Connection connection,Runtime runtime,String cmd){
+
+//    IWBP33,867155030001063,560555,1
+//        IW:标识符
+//        BP33 : 命令字符
+//        353456789012345:IMEI号,设备唯一ID
+//        080835:指令流水号
+//        1:设备工作模式,1:正常模式,2:省电模式,3:紧急模式
+
+        String[] cmdlist=cmd.split(",");
+        if (cmdlist.length == 4){
+
+
+            log("work mode "+cmdlist[3]);
+            try {
+                int mod = Integer.parseInt(cmdlist[3]);
+                int Cycle = 900;
+                switch (mod) {
+                    case ICLocation.NORMAL_MOD:
+                        Cycle = 900;
+                        break;
+                    case ICLocation.LOWPOWER_MOD:
+                        Cycle = 3600;
+                        break;
+                    case ICLocation.EMERGNECY_MOD:
+                    case ICLocation.REALTIME_MOD:
+                        Cycle = 60;
+                        break;
+
+                }
+
+                StringMessage msg = AP33(cmdlist[2], mod);
+                //设定当前工作模式及循环频率
+                connection.send(msg);
+                log("reply msg " + msg);
+                log("LOCATION_MODE  " + LOCATION_MODE + " mod " + mod);
+                Config.setLocationMode(runtime.getContextProxy().context, mod);
+                Config.setLocationCycle(runtime.getContextProxy().context, Cycle);
+                runtime.getLocationInstance().setLocation_cycle(Cycle);
+                runtime.getLocationInstance().setWorkingMod(mod);
+            }catch (Exception e){
+                ICLogger.e(e.getMessage(),e);
+            }
+//            CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod());
+            //此处设置好配置后,会在LocationClient通过消息开始执行及时定位操作。
+        }
+
+    }
+
+
+    public static StringMessage AP34(String cmdindex,int workMode){
+//IWAP34,588854,1#
+//080835:指令流水号
+//8:模式
+        return genStringMessage("AP34",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP34))
+                .append(CMDSPLIT).append(cmdindex)
+                .append(CMDSPLIT).append(workMode)
+                .append(CMDEND).toString());
+    }
+
+    //设置自定义工作模式
+    public void handleBP34(Connection connection,Runtime runtime,String cmd){
+
+//    IWBP34,867155030001063,588854,8,900,1#
+//        IW:标识符
+//        BP33 : 命令字符
+//        353456789012345:IMEI号,设备唯一ID
+//        080835:指令流水号
+//        1:设备工作模式,1:正常模式,2:省电模式,3:紧急模式
+
+        String[] cmdlist=cmd.split(",");
+        if (cmdlist.length == 6){
+
+
+            log("work mode "+cmdlist[3]);
+            try {
+                int mod = Integer.parseInt(cmdlist[3]);
+                int Cycle = Integer.parseInt(cmdlist[4]);
+                int gpson = Integer.parseInt(cmdlist[5]);
+
+                StringMessage msg = AP34(cmdlist[2], mod);
+                //设定当前工作模式及循环频率
+                connection.send(msg);
+
+                if (gpson == 1) {
+                    mod = ICLocation.CUSTOM_MOD8_GPS;
+                } else {
+                    mod = ICLocation.CUSTOM_MOD8_WIFI;
+                }
+                log("reply msg " + msg.isFromCache());
+                log("LOCATION_MODE  " + LOCATION_MODE + " mod " + mod + ", cycle = " + Cycle + ", GPS On= " + gpson);
+                Config.setLocationMode(runtime.getContextProxy().context, mod);
+                Config.setLocationCycle(runtime.getContextProxy().context, Cycle);
+                runtime.getLocationInstance().setLocation_cycle(Cycle);
+                runtime.getLocationInstance().setWorkingMod(mod);
+//            CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod());
+                //此处设置好配置后,会在LocationClient通过消息开始执行及时定位操作。
+            }catch (Exception e){
+                ICLogger.e(e.getMessage(),e);
+            }
+        }
+
+    }
+    public void handleBP40(Connection connection,Runtime runtime,String cmd){
+
+//        IWBP40,353456789012345,080835,XXXXXXXXXXXXXX#
+//        IW:标识符
+//        BP40 : 命令字符
+//        353456789012345:IMEI号,设备唯一ID
+//        080835 :指令流水号
+//        XXXXXXXXXXXX : 表示文字内容GB2312编码
+
+
+        String[] cmdlist=cmd.split(",");
+        if (cmdlist.length == 4){
+            String cmdindex=cmdlist[2];
+            String txtmsg=cmdlist[3];
+            StringBuilder sb=new StringBuilder();
+            runtime.PushtxtMsg_srv_index=cmdindex;//给回复AP94用
+            sb.append(cmdindex).append(CMDSPLIT).append(TimeUtil.getSystemTimeyyyyMMddHHmmss()).append(CMDSPLIT).append(txtmsg);
+            if (Config.custom_name.equals("VitracK")){
+
+            }else{
+//                txtmsg = Util.decodeUnicode2Utf8(txtmsg);
+                txtmsg = Util.UrlGB2312ToUTF8(txtmsg);
+            }
+            StringMessage msg=AP40(cmdindex,1);
+            //设定当前工作模式及循环频率
+            connection.send(msg);
+            ICLogger.i("received Txt Msg "+txtmsg);
+            if(!Config.noPushTxtReadReply) {
+                Config.setLastUnReadMessage(runtime.getContextProxy().context, sb.toString());
+                runtime.getContextProxy().sendMsgBroadcast(txtmsg,3);//msgType 3需要回复,0不需要回复
+            }else{
+                runtime.getContextProxy().sendMsgBroadcast(txtmsg,0);//msgType 3需要回复,0不需要回复
+            }
+            runtime.getContextProxy().saveMstToSMSDB(txtmsg);
+        }else{
+            ICLogger.i("BP40 format error!");
+        }
+    }
+    public static StringMessage AP40(String cmdindex,int success){
+
+//        IWAP40,080835,1#
+//        080835:指令流水号
+//        1:表示设备接受数据成功,0表示设备接受数据失败
+        return genStringMessage("AP40",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP40))
+                .append(CMDSPLIT).append(cmdindex)
+                .append(CMDSPLIT).append(success)
+                .append(CMDEND).toString());
+    }
+
+
+    /**
+     * 心率上传,返回协议字串
+     * @param ds
+     * @return
+     */
+    public static StringMessage AP49(Runtime ds){
+        //示例数据:IWAP49,68##
+        return genStringMessage(cmdMap.get(CMD_TYPE.AP49),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP49))
+                .append(CMDSPLIT).append(ds.getHRS().getPPG())
+                .append(CMDEND).toString());
+
+    }
+
+
+
+
+    /**
+     * 返回上传心率血压的协议字串
+     * @param ds
+     * @return
+     */
+    public static StringMessage APHT(Runtime ds){
+        //IWAPHT,60,130,85#
+        //说明:
+        //IW:标识符
+        //APHT : 命令字符
+        //60 : 表示心率
+        //130: 血压高压 [收缩压]
+        //85 : 血压低压 [舒张压]
+        //平台响应:      IWBPHT#
+        //表示平台已接收,可不作响应
+        return genStringMessage(cmdMap.get(CMD_TYPE.APHT),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APHT))
+                .append(CMDSPLIT).append(ds.getHRS().getPPG())
+                .append(CMDSPLIT).append(ds.getHRS().getBPH())
+                .append(CMDSPLIT).append(ds.getHRS().getBPL())
+                .append(CMDEND).toString());
+    }
+    public static StringMessage APHT(int  ppg,int bph,int bpl){
+        //IWAPHT,60,130,85#
+        //说明:
+        //IW:标识符
+        //APHT : 命令字符
+        //60 : 表示心率
+        //130: 血压高压 [收缩压]
+        //85 : 血压低压 [舒张压]
+        //平台响应:      IWBPHT#
+        //表示平台已接收,可不作响应
+        return genStringMessage(cmdMap.get(CMD_TYPE.APHT),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APHT))
+                .append(CMDSPLIT).append(ppg)
+                .append(CMDSPLIT).append(bph)
+                .append(CMDSPLIT).append(bpl)
+                .append(CMDEND).toString());
+    }
+
+
+    //立即定位反馈
+    public static StringMessage AP16(String  cmdindex){
+//IWAP16,080835#
+//080835:指令流水号
+        return genStringMessage(cmdMap.get(CMD_TYPE.AP16),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP16))
+                .append(CMDSPLIT).append(cmdindex)
+                .append(CMDEND).toString());
+    }
+    //    立即定位指令(长链接有效)
+    public void handleBP16(Connection connection,Runtime runtime,String cmd){
+        //示例数据:IWBP16,867155030001063,335386
+//        IWBP16,353456789012345,080835#
+//        说明:
+//        IW:标识符
+//        BP16 : 命令字符
+//        353456789012345:IMEI号,设备唯一ID
+//        080835 :指令流水号
+        String[] cmdlist = cmd.split(",");
+        if(cmdlist.length==3){
+            log("imei "+cmdlist[1]+", cmdindex "+cmdlist[2]);
+
+            connection.send(AP16(cmdlist[2]));
+        }else{
+            log("error BP16 format");
+        }
+    }
+
+
+    /*通过基站获取时间和坐标*/
+    public static StringMessage APTM(Runtime ds){
+        //示例数据:IWAPTM,460,0,9750,3613#
+        //说明:
+        //IW:标识符
+        //APTM : 命令字符
+        //460:MCC
+        //0: MNC
+        //9750: LAC
+        //3613: CID
+
+        return genStringMessage(cmdMap.get(CMD_TYPE.APTM),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTM))
+                .append(CMDSPLIT).append(ds.getLocationInstance().getMCC())
+                .append(CMDSPLIT).append(ds.getLocationInstance().getMNC())
+                .append(CMDSPLIT).append(ds.getLocationInstance().getLAC())
+                .append(CMDSPLIT).append(ds.getLocationInstance().getGSMStationCID())
+                .append(CMDEND).toString());
+
+    }
+
+    public void handleBPTM(String cmd){
+        //平台响应:      IWBPTM,20160225090909,22.123456,113.654321#
+        //返回时间,格式为:yyyyMMddHHmmss ,为UTC0 时间
+        //经纬度保留六位小数,若没取到则返回 0
+        String[] list=cmd.split(CMDSPLIT);
+
+        if(list.length==4){
+
+            String time=list[1];
+            String lat=list[2];
+            String lon=list[3];
+            ICLogger.i("BPTM , time="+time+", lat="+lat+", lon="+lon);
+        }else{
+            ICLogger.i("BPTM format error");
+        }
+
+
+    }
+
+    public static StringMessage AP15(String index){
+//IWAP15, 080835#
+//080835:指令流水号
+        return genStringMessage("AP15",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP15))
+                .append(CMDSPLIT).append(index)
+                .append(CMDEND).toString());
+    }
+
+    //设置定位周期
+    public void handleBP15(String cmd ,Connection connection,Runtime runtime){
+//        IWBP15, 353456789012345, 080835, 30#
+//        353456789012345:IMEI号,设备唯一ID
+//        080835 :指令流水号
+//        30: 表示频率为30分钟
+
+        String[] list=cmd.split(CMDSPLIT);
+
+        if(list.length==4){
+            String index=list[2];
+            String time=list[3];
+            connection.send(AP15(index));
+            ICLogger.i("BP15 , 定位周期="+time+"秒");
+
+            try {
+                Config.setLocationMode(runtime.getContextProxy().context, ICLocation.CUSTOM_MOD8_GPS);
+                Config.setLocationCycle(runtime.getContextProxy().context, Integer.parseInt(time) );
+                runtime.getLocationInstance().setWorkingMod(Config.getLocationMode(runtime.getContextProxy().context));
+                runtime.getLocationInstance().setLocation_cycle(Config.getLocationCycle(runtime.getContextProxy().context));
+                //set AlarmCycle  and trigger Location
+                CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod());
+            }catch (Exception e){
+                ICLogger.e(e.getMessage(),e);
+            }
+        }else{
+            ICLogger.i("BP15 format error");
+        }
+
+    }
+
+
+
+
+
+
+    /*语音下行反馈*/
+    public static StringMessage AP28(String name, String msg, int packagecount, int currentpackageindex, int received_success) {
+        //示例数据:IWAP28,D3590D54,xxxx,6,1,1#
+        return genStringMessage("AP28",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP28))
+                .append(CMDSPLIT).append(name)
+                .append(CMDSPLIT).append(msg)
+                .append(CMDSPLIT).append(packagecount)
+                .append(CMDSPLIT).append(currentpackageindex)
+                .append(CMDSPLIT).append(received_success)
+                .append(CMDEND).toString());
+    }
+
+    //处理 BP28 语音消息
+    public void handleBP28(Connection connection,String cmd,Runtime runtime,byte[] bytes) {
+        //log("handleBP28 msg"+cmd);
+/**
+ * IWBP28, D3590D54,XXXX,6,1,1024,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#
+ * 说明:
+ * IW:标识符
+ * BP28 : 命令字符
+ * D3590D54:UNICODE编码,发送者名称
+ * XXXX: 附加信息,在响应数据包时,将附加信息原样响应,类似流水号
+ * 6:语音包分包总数
+ * 1 :当前包数,第一包为1,第二包为2,。。。。。。同一个语音包的语音时间相同
+ * 1024 :语音包长度
+ * XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:当前音频数据, 每个音频数据包大小为1024字节,最后一包不足1024的取实际字节数
+ * 语音包上传规则:
+ * 按包次序依次上传,上传后如果没有收到服务器的响应包,则继续上传该语音包。
+ * 收到设备回复确认数据包接收成功状态后,继续开始依次上传下一个数据包。。。。。。
+ * 如果设备回复确认数据包接收失败状态,则重复发送上一个数据包
+ * 设备响应:     IWAP28,D3590D54,XXXX,6,1,1#
+ * D3590D54:UNICODE编码,发送者名称
+ * XXXX: 附加信息,原样返回
+ * 6:语音包分包总数
+ * 1:当前设备收到的是第几个包
+ * 1:表示设备接受数据成功,0表示设备接受数据失败
+ */
+        String Name;
+        String appendIndex;
+        int packetCount;
+        int currentId;
+        int packetLen;
+        byte[] packetData;
+
+        String[] msg= cmd.split(CMDSPLIT);
+        if (msg.length>=6){
+
+            try {
+                Name = msg[1];
+                appendIndex = msg[2];
+                packetCount = Integer.parseInt(msg[3]);
+                currentId = Integer.parseInt(msg[4]);
+                packetLen = Integer.parseInt(msg[5]);
+                packetData = Util.subArray(bytes, msg[0].length() + msg[1].length() + msg[2].length() + msg[3].length() + msg[4].length() + msg[5].length() + 6, bytes.length - 1);
+
+                StringBuffer stringBuffer = new StringBuffer();
+                stringBuffer.append("recv BP28 name = ").append(Name)
+                        .append(",appendIndex = ").append(appendIndex)
+                        .append(",packetCount = ").append(packetCount)
+                        .append(",currentId = ").append(currentId)
+                        .append(",packetLen = ").append(packetLen)
+                        .append(",packetDatalen = ").append(packetData.length);
+
+                log(stringBuffer.toString());
+                connection.send(AP28(Name, appendIndex, packetCount, currentId, 1));
+                voicePacket.getInstance().appendVoice(Name, appendIndex, packetCount, currentId, packetLen, packetData);
+                log("================" + voicePacket.getInstance().toString());
+                if (voicePacket.getInstance().isFinished()) {
+
+                    String dir = Environment.getExternalStorageDirectory() + "/Android/VoiceCache";
+                    String amrFilepath = Util.saveFile(voicePacket.getInstance().getVoicePacketBytes(), 0, voicePacket.getInstance().getVoicePacketLen(), new File(dir), "receive_" + voicePacket.getInstance().getPacketTime() + ".amr");
+                    ICLogger.i("save Amr file to " + amrFilepath);
+                    voicePacket.getInstance().clearPacket();
+                    VoiceContent voiceContent = VoiceContent.placeHolderIn(Content.CONTACT_CATEGORY_GROUP, GROUP_ALL, amrFilepath);
+
+
+                    final Uri uri2 = runtime.getDbHelper().insertMessage(voiceContent);
+
+                    //回复UI消息,表示已经接收到
+                    voiceContent.status = 3;
+                    voiceContent.serverTime = TimeUtil.getSystemTime3();
+                    voiceContent.preview = String.valueOf(Util.getDuration(voiceContent.content));
+                    runtime.getDbHelper().updateMessage(voiceContent, uri2);
+
+//                runtime.getContextProxy().sendBroadcast(ACTION_IMESSAGE, runtime);
+
+                    connection.DeliverCMDMessageToSystem("NewVoice", amrFilepath);//通知下面线程状态变化
+                }
+            }catch (Exception e){
+                ICLogger.e(e.getMessage(),e);
+            }
+
+        }else{
+            log("handleBP28","format Error");
+//            connection.send(genStringMessage("AP28",AP28(Name,appendIndex,packetCount,currentId,0)));
+
+        }
+
+    }
+
+    public void sendBroadcast(String cmd, Runtime dev) {
+
+        ComponentName componentName = new ComponentName("com.eqc.watch", "com.eqc.watch.launcher.ChatActivity");
+        Intent intent = new Intent("android.intent.action.MAIN");
+//              intent.putExtra("ACTIVITY_TYPE", 2);
+//              intent.addCategory("android.intent.category.DEFAULT");
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        intent.setComponent(componentName);
+        dev.getContextProxy().context.startActivity(intent);
+    }
+
+    //白名单开关(下行协议号:BP84,响应:AP84)
+    public static StringMessage AP84(String index,int success){
+
+        //设备响应:      IWAP80,080835,1#
+        //080835:指令流水号
+        //1:表示设备执行成功,0 表示设备执行失败
+        return genStringMessage("AP84",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP84))
+                .append(CMDSPLIT).append(index)
+                .append(CMDSPLIT).append(success)
+                .append(CMDEND).toString());
+    }
+
+    public void handleBP84(String cmd,Connection connection){
+//示例:
+        //IWBP84,353456789012345,080835,1#
+        //说明:
+        //IW:标识符
+        //BP84 : 命令字符
+        //353456789012345:IMEI号,设备唯一ID
+        //080835 :指令流水号
+        //1: 表示白名单开,0 表示白名单关
+        String[] list=cmd.split(CMDSPLIT);
+
+        if (list.length==4){
+            String index=list[2];
+            String whitelist_switch=list[3];
+            connection.send(AP84(index,1));
+
+            if (whitelist_switch.equals("1")){
+                Util.setSystemProperties("persist.sys.whitelist.enable","true");
+            }else{
+                Util.setSystemProperties("persist.sys.whitelist.enable","false");
+            }
+            ICLogger.i("收到服务器指令:白名单"+(whitelist_switch.equals("1")?"开":"关"));
+
+        }else{
+
+            ICLogger.i("BP84 format error!");
+        }
+
+    }
+
+    //17.绑定解绑(下行协议号:BP68,响应:AP68)
+    public static StringMessage AP68(String index,String cmd){
+
+        //设备响应:      IWAP86, 080835,1#
+        //080835:指令流水号
+        return genStringMessage("AP86",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP68))
+                .append(CMDSPLIT).append(index)
+                .append(CMDSPLIT).append(cmd)
+                .append(CMDEND).toString());
+    }
+
+    public void handleBP68(String cmd,Connection connection,Runtime runtime){
+
+        //示例:
+        //IWBP68,353456789012345,080835,1#
+        //说明:
+        //IW:标识符
+        //BP68 : 命令字符
+        //353456789012345:IMEI号,设备唯一ID
+        //080835 :指令流水号
+        //1 : 表示设备为激活状态(绑定成功) 0:表示设备为未激活状态(解绑成功)
+
+        String[] list=cmd.split(CMDSPLIT);
+
+        if (list.length==4){
+            String index=list[2];
+            String type=list[3];
+            connection.send(AP68(index,type));
+            ICLogger.i("收到服务器消息:"+(type.equals("1")?"绑定成功 ":"未激活或者解绑"));
+            if (Config.custom_name.equals("YQ")||Config.custom_name.equals("YQ_EN")) {//AK-YQ
+                if (type.equals("1")) {
+                    WakeLockUtil.ScreenOnWakeLockTemperary(runtime.getContextProxy().context);
+//                    runtime.getContextProxy().sendMsgBroadcast(runtime.getContextProxy().context.getResources().getString(R.string.alarm_lock_success), 2);
+                    Util.ShowToast(runtime,runtime.getContextProxy().context.getResources().getString(R.string.alarm_lock_success));
+                    Config.setNeedAntiOff(runtime.getContextProxy().context,true);
+                    Config.setNeedCutOff(runtime.getContextProxy().context,true);
+                    runtime.setNeedAntioff(true);
+                    runtime.setNeddReportCutoff(true);
+                } else {
+                    WakeLockUtil.ScreenOnWakeLockTemperary(runtime.getContextProxy().context);
+                    runtime.getContextProxy().sendMsgBroadcast(runtime.getContextProxy().context.getResources().getString(R.string.alarm_unbind_success), 2);
+                    Config.setNeedAntiOff(runtime.getContextProxy().context,false);
+                    Config.setNeedCutOff(runtime.getContextProxy().context,false);
+                    runtime.setNeedAntioff(false);
+                    runtime.setNeddReportCutoff(false);
+                    //1 分钟后重置
+                    new Handler().postDelayed(new Runnable() {
+                        @Override
+                        public void run() {
+                            Util.doMasterClear(runtime.getContextProxy().context);
+                        }
+                    },5000);
+                }
+            }
+
+        }else{
+            ICLogger.i("BP86 format error!");
+        }
+
+    }
+
+
+
+    //17.设置心率/血压测量周期(下行协议号:BP86,响应:AP86)
+    public static StringMessage AP86(String index){
+
+        //设备响应:      IWAP86, 080835#
+        //080835:指令流水号
+        return genStringMessage("AP86",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP86))
+                .append(CMDSPLIT).append(index)
+                .append(CMDEND).toString());
+    }
+
+    public void handleBP86(String cmd,Connection connection,Runtime runtime){
+
+        //示例:
+        //IWBP86, 353456789012345, 080835,1,720#
+        //说明:IWBP86,867400020316612,858663,1,30
+        //IW:标识符
+        //BP86 : 命令字符
+        //353456789012345:IMEI号,设备唯一ID
+        //080835 :指令流水号
+        //1: 表示心率周期;2 :表示血压周期
+        //720: 表示720分钟
+
+        String[] list=cmd.split(CMDSPLIT);
+
+        if (list.length==5){
+            String index=list[2];
+            String type=list[3];
+            String cycle=list[4];
+            connection.send(AP86(index));
+            ICLogger.i("收到服务器指令:设置"+(type.equals("1")?"心率周期 ":"血压周期 ")+cycle+"分钟");
+
+            try {
+                //发送重置PPGCycle的广播,会在CoreServer里面执行
+                Intent intent = new Intent();
+                intent.putExtra("PPGTestCycle", Integer.parseInt(cycle));
+                intent.setFlags(FLAG_INCLUDE_STOPPED_PACKAGES);
+                intent.setFlags(FLAG_ACTIVITY_NEW_TASK);
+                runtime.getContextProxy().sendBrodcast(ACTION_HEATR_RATE_START, intent);
+            }catch (Exception e){
+                ICLogger.e(e.getMessage(),e);
+            }
+        }else{
+            ICLogger.i("BP86 format error!");
+        }
+
+    }
+
+    //IWBP87,http://cn.map20000.com/physicalReport.html?lang=zh-CN&imeis=866671044898063#
+    public static StringMessage AP87(){
+
+        //设备响应:      IWAP86, 080835#
+        //080835:指令流水号
+        return genStringMessage("AP87",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP87))
+                .append(CMDEND).toString());
+    }
+
+    public void handleBP87(String cmd,Connection connection,Runtime runtime){
+
+        //IWBP87,http://cn.map20000.com/physicalReport.html?lang=zh-CN&imeis=866671044898063#
+
+        String[] list=cmd.split(CMDSPLIT);
+
+        if (list.length==2){
+            String furl=list[1];//.replace("#","");
+            ICLogger.i("收到服务器指令 BP87:Qrcode url "+furl);
+//            connection.send(AP87());
+            try {
+                String qrfilepath=Util.getLogfilePath(runtime,TimeUtil.getSystemDateYYMMDD());
+                Util.setSystemProperties(Config.KeyQRURIFILE,qrfilepath);
+                FileOutputStream fos=new FileOutputStream(new File(qrfilepath));
+                fos.write(furl.getBytes());
+                fos.close();
+            }catch (Exception e){
+                ICLogger.e(e.getMessage(),e);
+            }
+        }else{
+            ICLogger.i("BP87 format error!");
+        }
+
+    }
+    public static StringMessage AP88(String index){
+        //设备响应:      IWAP88, 080835#
+        //080835:指令流水号
+        return genStringMessage("AP88",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP88))
+                .append(CMDSPLIT).append(index)
+                .append(CMDEND).toString());
+    }
+
+    public static void handleBP88(String cmd,Connection connection){
+//        IWBP88,080835#
+        String[] list=cmd.split(CMDSPLIT);
+
+        if (list.length==2){
+            String index=list[1];
+            connection.send(AP88(index));
+            ICLogger.i("收到服务器消息:查询设备");
+
+        }else{
+            ICLogger.i("BP88 format error!");
+        }
+    }
+
+    //18.18.设置心率/血压阀值(下行协议号:BP89,响应:AP89)
+    public static StringMessage AP89(String index){
+
+        //设备响应:      IWAP89, 080835#
+        //080835:指令流水号
+        return genStringMessage("AP89",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP89))
+                .append(CMDSPLIT).append(index)
+                .append(CMDEND).toString());
+    }
+
+    public void handleBP89(String cmd,Connection connection){
+
+        //示例:
+        //IWBP89, 353456789012345, 080835,50,90,80,90,110,140#
+        //说明:
+        //IW:标识符
+        //BP89 : 命令字符
+        //353456789012345:IMEI号,设备唯一ID
+        //080835 :指令流水号
+        //50: 心率低阀值,低于该阀值上传心率,如果未设置,则留空
+        //90: 心率高阀值,高于该阀值上传心率,如果未设置,则留空
+        //80: 低压阀值,低压低于该阀值上传血压,如果未设置,则留空
+        //90: 低压阀值,低压高于该阀值上传血压,如果未设置,则留空
+        //110: 高压阀值,高压低于该阀值上传血压,如果未设置,则留空
+        //140: 高压阀值,高压高于该阀值上传血压,如果未设置,则留空
+        String[] list=cmd.split(CMDSPLIT);
+        if (list.length==9){
+            String index=list[2];
+            String PPGH=list[3];
+            String PPGL=list[4];
+            String BPH_H=list[5];
+            String BPH_L=list[6];
+            String BPL_H=list[7];
+            String BPL_L=list[8];
+            connection.send(AP89(index));
+
+
+            
+            ICLogger.i("收到服务器指令:心率/血压阀值 "+PPGH+","+PPGL+","+BPH_H+","+BPH_L+","+BPL_H+","+BPL_L);
+        }else{
+            ICLogger.i("BP89 format error!");
+        }
+
+    }
+
+    //体温间隔测量 (后台测试体温)(下行协议号:BPTE,响应:APTE)
+    public static StringMessage APTE(String index,int freq){
+
+        //设备响应:      IWAPTE,080835,60#
+        //080835:指令流水号
+        //1:表示设备接受数据成功,0表示设备接受数据失败
+        return genStringMessage("APTE",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTE))
+                .append(CMDSPLIT).append(index)
+                .append(CMDSPLIT).append(freq)
+                .append(CMDEND).toString());
+    }
+
+    public void handleBPTE(String cmd,Connection connection,Runtime runtime){
+
+        //示例:
+        //IWBPTE,353456789012345,080835,60#
+        //说明:
+        //IW:标识符
+        //BPTE : 命令字符
+        //353456789012345:IMEI号,设备唯一ID
+        //080835 :指令流水号
+        //60 : 上传间隔,单位分钟(60分钟上传一次体温,终端收到后立即开始测量一次并重置定时器)
+        String[] list=cmd.split(CMDSPLIT);
+        if (list.length==4){
+            try {
+                String index = list[2];
+                String freqstr = list[3];
+                int freq = Integer.parseInt(freqstr);
+                connection.send(APTE(index, freq));
+                ICLogger.i("收到服务器指令:测量体温 " + freq + "分钟一次。");
+                Config.setTemperatureTestCycle(runtime, freq * 60);
+                CoreService.getInstance().setTempAlarm();
+
+
+                if(runtime.check_stat_do_temp_test()) TemperatureUtil.doTempTestInThread();
+            }catch (Exception e){
+                ICLogger.e(e.getMessage(),e);
+            }
+        }else{
+            ICLogger.i("BPTE format error!");
+        }
+
+    }
+
+    //体温上行(上行协议号:APTP,响应:BPTP)
+    public static StringMessage APTP(double wrist_temp,double body_temp,double tempout){
+
+        //设备:    IWAPTP,36.3,33,132#
+        //IW:标识符
+        //APTP : 命令字符
+        //35.3:测量体温 (摄氏度)
+        //33,132:温补用的参数,此处不用,可以用0 来代替。 目前是代表的腕温,室外温度
+        return genStringMessage(cmdMap.get(CMD_TYPE.APTP),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTP))
+                .append(CMDSPLIT).append(String.format("%1$.1f",body_temp))
+                .append(CMDSPLIT).append(String.format("%1$.1f",wrist_temp))
+                .append(CMDSPLIT).append(String.format("%1$.1f",tempout))
+                .append(CMDEND).toString());
+    }
+
+    public void handleBPTP(){
+
+        ICLogger.d("BPTP 服务器收到体温数据!");
+
+    }
+
+
+    public static StringMessage APX1(String id){
+        //设备响应:      IWAPX1, 080835#
+        //080835:指令流水号
+        return genStringMessage("APX1",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APX1))
+                .append(CMDSPLIT).append(id)
+                .append(CMDEND).toString());
+    }
+
+    /**
+     *
+     * @param cmd
+     * @param connection
+     * @param runtime
+     */
+    public void handleBPX1(String cmd,Connection connection,Runtime runtime){
+        //IWBPX1,353456789012345,080835,2,1,-3,0#
+        //说明:
+//        IW:标识符
+//        BPX1 : 命令字符
+//        353456789012345:IMEI号,设备唯一ID
+//        080835 :指令流水号
+//        2: 心率修正值
+//        1:高压修正值
+//                -3:低压修正值
+//        0:血氧修正值
+        String[] list=cmd.split(CMDSPLIT);
+        if (list.length==7){
+            String index=list[2];
+            String imei=list[1];
+            String strXL=list[3];
+            String strBPH=list[4];
+            String strBPL=list[5];
+            String strSpO2=list[6];
+
+            connection.send(APX1(index));
+
+            try {
+                int ppg_adjust, bph_adjust, bpl_adjust, spo2_adjust;
+                ppg_adjust = Integer.parseInt(strXL);
+                bph_adjust = Integer.parseInt(strBPH);
+                bpl_adjust = Integer.parseInt(strBPL);
+                spo2_adjust = Integer.parseInt(strSpO2);
+
+                runtime.getHRS().setAdjust(ppg_adjust, bph_adjust, bpl_adjust, spo2_adjust);
+                Config.setPPGAdjust(mRuntime.getContextProxy().context, ppg_adjust);
+                Config.setBPHAdjust(mRuntime.getContextProxy().context, bph_adjust);
+                Config.setBPLAdjust(mRuntime.getContextProxy().context, bpl_adjust);
+                Config.setSPo2Adjust(mRuntime.getContextProxy().context, spo2_adjust);
+                String ShareAdjValue = new StringBuilder().append(ppg_adjust).append(CMDSPLIT)
+                        .append(bph_adjust).append(CMDSPLIT)
+                        .append(bpl_adjust).append(CMDSPLIT)
+                        .append(spo2_adjust).append(CMDSPLIT).toString();
+                Config.setPPG_ECG_adjustValue(ShareAdjValue);
+                ICLogger.i("Handle BPX1 IMEI " + imei + ",index " + index + ", BPH " + strBPH + ", BPL " + strBPL + ", PPG " + strXL + ", Sp02 " + strSpO2 + " , Shared Adjust Value " + ShareAdjValue);
+            }catch (Exception e){
+                ICLogger.e(e.getMessage(),e);
+            }
+        }else{
+            ICLogger.i("BPX1 format error!");
+        }
+    }
+
+
+
+    public static StringMessage APS4(String id){
+        //设备响应:      IWAPS4,080835#
+        //080835:指令流水号
+        return genStringMessage("APS4",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APS4))
+                .append(CMDSPLIT).append(id)
+                .append(CMDEND).toString());
+    }
+
+    /**
+     * 主要为久坐设置提醒时长。
+     * @param cmd
+     * @param connection
+     * @param runtime
+     */
+    public void handleBPS4(String cmd,Connection connection,Runtime runtime){
+        //IWBPS4,353456789012345,080835,1|1234567|0900|1100|180, 2|1234567|0900|1100|180, 1|1234567|0900|1100|180#
+        //说明:
+//        IW:标识符
+//        BPS4: 命令字符
+//        353456789012345:设备IMEI或者ID
+//        080835 :指令流水号
+//        1|1234567|0900|1100|180:类型(1久坐,2喝水)|重复周期|开始时间|结束时间|时间间隔(单位秒)
+//        重复周期、开始结束时间格式 参考BP85闹钟设置,
+//#:结尾标识符
+        String[] list=cmd.split(CMDSPLIT);
+        if (list.length>=4){
+
+            String index=list[2];
+            String imei=list[1];
+            connection.send(APS4(index));
+
+            String setting1;
+            switch(list.length){
+                case 10:
+                    setting1=list[9];
+                    ICLogger.i("set 7th alarm "+setting1);
+                case 9:
+                    setting1=list[8];
+                    ICLogger.i("set 6th alarm "+setting1);
+                case 8:
+                    setting1=list[7];
+                    ICLogger.i("set 5th alarm "+setting1);
+                case 7:
+                    setting1=list[6];
+                    ICLogger.i("set 4th alarm "+setting1);
+                case 6:
+                    setting1=list[5];
+                    ICLogger.i("set 3rd alarm "+setting1);
+                case 5:
+                    setting1=list[4];
+                    ICLogger.i("set 2nt alarm "+setting1);
+                case 4:
+                    setting1=list[3];
+                    ICLogger.i("set 1st alarm "+setting1);
+                    break;
+            }
+
+            ICLogger.i("Handle BPX1 IMEI "+imei+",index "+index+", get "+(list.length-3) +" settings");
+        }else{
+            ICLogger.i("BPX1 format error!");
+        }
+    }
+
+    public static StringMessage APHP(Runtime ds){
+        //IWAPHP,60,130,85,95,90, , , , , , , , #
+        //IW:标识符
+        //APHT : 命令字符
+        //60 : 表示心率
+        //130: 血压高压 [收缩压]
+        //85 : 血压低压 [舒张压]
+        //95:血氧
+        //90:血糖
+//        本消息适用所有终端,其中需要每项指标不一定全部有值,如果无值,则留空
+        return genStringMessage(cmdMap.get(CMD_TYPE.APHP),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APHP))
+                .append(CMDSPLIT).append(ds.getHRS().getPPG())
+                .append(CMDSPLIT).append(ds.getHRS().getBPH())
+                .append(CMDSPLIT).append(ds.getHRS().getBPL())
+                .append(CMDSPLIT).append(ds.getHRS().getSpo2())
+                .append(CMDSPLIT).append(0)
+                .append(CMDSPLIT)
+                .append(CMDSPLIT)
+                .append(CMDSPLIT)
+                .append(CMDSPLIT)
+                .append(CMDSPLIT)
+                .append(CMDSPLIT)
+                .append(CMDSPLIT)
+                .append(CMDSPLIT)
+                .append(CMDEND).toString());
+    }
+    public static StringMessage APHP(int ppg,int bph, int bpl, int spo2){
+        //IWAPHP,60,130,85,95,90, , , , , , , , #
+        //IW:标识符
+        //APHT : 命令字符
+        //60 : 表示心率
+        //130: 血压高压 [收缩压]
+        //85 : 血压低压 [舒张压]
+        //95:血氧
+        //90:血糖
+//        本消息适用所有终端,其中需要每项指标不一定全部有值,如果无值,则留空
+        return genStringMessage(cmdMap.get(CMD_TYPE.APHP),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APHP))
+                .append(CMDSPLIT).append(ppg)
+                .append(CMDSPLIT).append(bph)
+                .append(CMDSPLIT).append(bpl)
+                .append(CMDSPLIT).append(spo2)
+                .append(CMDSPLIT).append(0)
+                .append(CMDSPLIT)
+                .append(CMDSPLIT)
+                .append(CMDSPLIT)
+                .append(CMDSPLIT)
+                .append(CMDSPLIT)
+                .append(CMDSPLIT)
+                .append(CMDSPLIT)
+                .append(CMDSPLIT)
+                .append(CMDEND).toString());
+    }
+
+
+    public void handleBPHP(){
+
+        ICLogger.i("服务器收到APHP 心率血压血氧 !");
+
+    }
+
+    public static StringMessage APDE(String id){
+        /***
+         * 示例:
+        * 设备响应:      IWAPDE,080835#
+         * 080835:指令流水号
+         * 说明:   本消息适用所有终端
+         */
+        return genStringMessage("APDE",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APDE))
+                .append(CMDSPLIT).append(id)
+                .append(CMDEND).toString());
+    }
+
+    public void handleBPDE(Connection connection,String cmd,Runtime runtime){
+/***
+ * 示例:
+ * IWBPDE,867400020316612,853676,0
+ * 说明:
+ * IW:标识符
+ * BPDE: 命令字符
+ * 353456789012345:设备IMEI或者ID
+ * 080835 :指令流水号
+ * 0:进入禁止区域 1离开禁止区域
+ * #:结尾标识符
+ * 设备响应:     IWAPDE,080835#
+ * 080835:指令流水号
+ * 说明:   本消息适用所有终端
+ */
+        String[] list=cmd.split(CMDSPLIT);
+        if (list.length==4){
+
+            String index=list[2];
+            String msg=list[3];
+            connection.send(APDE(index));
+            try {
+                if (Integer.parseInt(msg) == 0) {
+                    ICLogger.i("Handle BPDE index " + index + ", 进入禁止区域 ");
+                    runtime.Fence_Warning_flag = 1;
+                    WakeLockUtil.ScreenOnWakeLockTemperary(runtime.getContextProxy().context);
+                    runtime.getContextProxy().sendMsgBroadcast(runtime.getContextProxy().context.getResources().getString(R.string.alarm_out_wall), 2);
+                } else {
+                    ICLogger.i("Handle BPDE index " + index + ", 离开禁止区域 ");
+                    runtime.Fence_Warning_flag = 0;
+//                Util.ShowToast(runtime,"");
+                    runtime.getContextProxy().sendMsgBroadcast(runtime.getContextProxy().context.getResources().getString(R.string.alarm_cross_boundary), 0);
+                }
+            }catch (Exception e){
+                ICLogger.e(e.getMessage(),e);
+            }
+        }else{
+            ICLogger.i("BPDE format error!");
+        }
+
+
+    }
+    public static StringMessage APDG(String id){
+        return genStringMessage("APDG",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APDG))
+                .append(CMDSPLIT).append(id)
+                .append(CMDEND).toString());
+    }
+
+    public void handleBPDG(Connection connection,String cmd,Runtime runtime){
+/**
+ * 示例:
+ * IWBPDG,353456789012345,1,30.0,37.3 #
+ * 说明:IWBPDG,867400020316612,502102,1,33,44
+ * IW:标识符
+ * BPDG: 命令字符
+ * 353456789012345:设备IMEI或者ID
+ * 080835 :指令流水号
+ * 1:开关 1开,  0 关
+ * 30.0: 低温阀值
+ * 37.3: 高温阀值
+ * #:结尾标识符
+ * */
+        String[] list=cmd.split(CMDSPLIT);
+        if (list.length==6){
+
+            try {
+                String index = list[2];
+                String switch_on = list[3];
+                String min_temp = list[4];
+                String max_temp = list[5];
+                connection.send(APDG(index));
+                if (Integer.parseInt(switch_on) == 1) {
+                    ICLogger.i("Handle BPDG index " + index + ", 体温报警阈值开 min=" + min_temp + ",max=" + max_temp);
+                    runtime.tempInfo.setBodyTempThreshold(Double.valueOf(max_temp), Double.valueOf(min_temp));
+                    Config.needTemperature_abnormal_alarm = true;
+                } else {
+                    ICLogger.i("Handle BPDG index " + index + ", 体温报警阈值关 ");
+                    Config.needTemperature_abnormal_alarm = false;
+                }
+            }catch (Exception e){
+                ICLogger.e(e.getMessage(),e);
+            }
+
+        }else{
+            ICLogger.i("BPDG format error!");
+        }
+    }
+
+    /***
+     *
+     * @param packetTime  做指令流水号用
+     * @param filetype  文件类型, 1语音,2图片
+     * @param datatype  数据内容类型,例如和文件类型相关,例如 监听语音,sos语音,签到图片等等
+     * @param count  内容分包总数
+     * @param index  当前分包数
+     * @param datalen 分包数据长度,最长1024,不足按照实际大小。
+     * @param amrdata  文件分包内容数据
+     * @return
+     */
+    public static byte[] APTU(String  packetTime,int filetype, int datatype ,int count,int index,int datalen,byte[] amrdata){
+        /**
+         * 10.设备录音图片(设备上行)(上行协议:APTU,响应:BPTU)
+         * 示例:
+         * IWAPTU,6654111,080835,1,1,6,1,1024,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#
+         * 说明:
+         * IW:标识符
+         * BPCU : 命令字符
+         * 6654111:语音图片文字目标 (同步监护人列表的用户唯一标识ID)<扩展字段目前不需要,可以传空字符>
+         * 080835 :指令流水号
+         * 1:文件类型
+         * 1:内容类型 类型说明如下表
+         * 文件类型        内容类型
+         * 1 语音——      1.监听语音      *   2.SOS语音      *      3.扩展
+         * 2 图片——      1.签到图片      *   2.指令图片      *   3.设备图片      *   4.扩展
+         * 6:内容包分包总数
+         * 1 :当前包数,第一包为1,第二包为2,。。。。。。同一个语音包的语音时间相同
+         * 1024 :语音包长度
+         * XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:当前音频数据, 每个音频数据包大小为1024字节,最后一包不足1024的取实际字节数
+         * 语音包上传规则:
+         * 按包次序依次上传,上传后如果没有收到服务器的响应包,则继续上传该语音包。
+         * 收到设备回复确认数据包接收成功状态后,继续开始依次上传下一个数据包。。。。。。
+         * 如果设备回复确认数据包接收失败状态,则重复发送上一个数据包
+         */
+        String sb=new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTU))
+                .append(CMDSPLIT)
+                .append(CMDSPLIT).append(packetTime)
+                .append(CMDSPLIT).append(filetype)
+                .append(CMDSPLIT).append(datatype)
+                .append(CMDSPLIT).append(count)
+                .append(CMDSPLIT).append(index)
+                .append(CMDSPLIT).append(datalen*2)
+                .append(CMDSPLIT).toString();
+
+        byte[] sentbuf=new byte[sb.length()+datalen*2+1];
+        byte[] amrdata2=Util.bytesToHexString(amrdata).getBytes();
+        System.arraycopy(sb.getBytes(),0,sentbuf,0,sb.length());
+        System.arraycopy(amrdata2,0,sentbuf,sb.length(),datalen*2);
+        sentbuf[sb.length()+datalen*2]='#';
+        return sentbuf;
+    }
+
+
+    public void handleBPTU(String cmd , Connection connection ){
+/***
+ * 平台响应
+ * IWBPTU,6654111,080835,1,1,6,1,1#
+ * IW:标识符
+ * APCU : 命令字符
+ * 6654111:语音图片文字目标
+ * 080835 :流水号
+ * 1:文件类型
+ * 1:内容类型
+ * 6:内容总包数
+ * 1:当前包序号
+ * 1:成功 (0:失败)
+ */
+        String[] cmdlist=cmd.split(CMDSPLIT);
+        if (cmdlist.length==8){
+            try {
+                String time = cmdlist[2];
+                String filetype = cmdlist[3];
+                String datatype = cmdlist[4];
+                String count = cmdlist[5];
+                String index = cmdlist[6];
+                String success = cmdlist[7];
+                int ftype = Integer.parseInt(filetype);
+                int dtype = Integer.parseInt(datatype);
+                int packetCount = Integer.parseInt(count);
+                int packetIndex = Integer.parseInt(index);
+                int receiveSuccess = Integer.parseInt(success);
+                ICLogger.i("服务器在收到 index " + time + ", 文件类型 " + ftype + ",内容类型 " + dtype + " " + packetIndex + "/" + packetCount + " " + (receiveSuccess == 1 ? "成功" : "失敗"));
+                if (receiveSuccess == 1) {
+                    //如果服务器接收 语音成功,则设置下一个要发送的语音包Index,当index == packetCount的时候表示所有包发送完毕,停止继续发送
+                    voicePacket.getInstanceSent().setCurrentIndexToSent(packetIndex);
+                    //voicePacket.getInstanceSent().setFileType(ftype,dtype);
+                }
+                //发送消息,再次检查要发送的语音包,确认其发送完毕
+                connection.DeliverCMDMessageToSystem("SentVoicePacket", "SentBPFilePacket");
+            }catch (Exception e){
+                ICLogger.e(e.getMessage(),e);
+            }
+        }else{
+            ICLogger.i(" BPTU Format error!");
+        }
+    }
+
+    public static StringMessage APSL(String date,int deepsleep,int lightsleep,int score){
+/***
+ * 示例:
+ * IWAPSL,20200803,240,120,90#
+ * 说明:睡眠计算时间 当日21:00至 次日 9:00, 睡眠时间记录为当日时间。如2020-8-3的睡眠时间段为 2020-8-3 21:00 ~ 2020-8-4 09:00
+ * IW:标识符
+ * APSL:命令字
+ * 202008003:睡眠时间 (手表本地时间)
+ * 240:深睡时间 (手表本地时间),单位分钟
+ * 120:浅睡时间(手表本地时间),单位分钟
+ * 90睡眠分数
+ * 睡眠算法
+ * 使用记步同样的算法,计算翻身次数
+ * 平均每60秒记录一次
+ * 深睡眠,通过加速度传感器,在60秒内翻身次数小于6
+ * 浅睡眠,通过加速度传感器,在60秒内翻身次数大于等于6, 且小于12 ,否则认为未睡
+ * 换算分数后发送到服务器
+ * #:结束符
+ */
+        String sb=new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APSL))
+                .append(CMDSPLIT).append(date)
+                .append(CMDSPLIT).append(deepsleep)
+                .append(CMDSPLIT).append(lightsleep)
+                .append(CMDSPLIT).append(score)
+                .append(CMDEND).toString();
+        return genStringMessage(cmdMap.get(CMD_TYPE.APSL),sb);
+    }
+
+    public static StringMessage AP46(String id,String cmd)
+    {
+        return genStringMessage(cmdMap.get(CMD_TYPE.AP46),new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP46))
+                .append(CMDSPLIT).append(id)
+                .append(CMDSPLIT).append(cmd)
+                .append(CMDEND).toString());
+    }
+
+    public void handleBP46(String cmd , Connection connection,Runtime runtime) {
+/***
+ * IWBP46,353456789012345,080835,1,[参数]#
+ * 说明:
+ * IW:标识符
+ * BP46 : 命令字符
+ * 353456789012345:IMEI号,设备唯一ID
+ * 080835 :指令流水号
+ * 1: 表示立即拍照
+ * [参数]: 此为可选项。根据不同类型设备扩展
+ * #:结尾标识符
+ * 设备响应:     IWAP46,080835,1#
+ * 080835:指令流水号
+ * 1 成功 0失败
+ * # 结尾标识符
+ */
+        String[] cmdlist=cmd.split(CMDSPLIT);
+
+        if (cmdlist.length>=4 ){
+            String imei=cmdlist[1];
+            String id=cmdlist[2];
+            String cdd=cmdlist[3];
+            if (cmdlist.length==5) {
+                String tmp = cmdlist[4];
+            }
+            connection.send(AP46(id,cdd));
+            Context context = mRuntime.getContextProxy().context.getApplicationContext();
+            if (cdd.equals("1")) {
+                //delay 启动
+
+//            Intent intent = new Intent(context, com.enqualcomm.support.CoreService.class);
+//            intent.setAction(ACTION_REMOTE_CAMERA);
+//            intent.putExtra("remote_number", id);
+//                context.startService(intent);
+//            runtime.getContextProxy().context.sendBroadcast(intent);
+                new Handler().post(new Runnable() {
+                    @Override
+                    public void run() {
+                        (new CameraUtil(context)).getPictur(id);
+                    }
+                });
+
+            }else if(cdd.equals("2")){
+                Intent intent = new Intent();
+                intent.setAction(DIALOG_ACTION);
+                intent.putExtra("takephoto", "Take Photo !");
+                context.sendBroadcast(intent);
+            }
+        }else{
+            ICLogger.i(" BP46 Format error!");
+        }
+
+    }
+
+
+    public static StringMessage APDH(String id,String cmd)
+    {
+        return genStringMessage("APDH",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APDH))
+                .append(CMDSPLIT).append(id)
+                .append(CMDSPLIT).append(cmd)
+                .append(CMDEND).toString());
+    }
+
+
+    public void handleBPDH( Connection connection,Runtime runtime,String cmd) {
+        /***
+         * IWBPDH,353456789012345,080835,1,[参数]#
+         * 说明:
+         * IW:标识符
+         * BPDH : 命令字符
+         * 353456789012345:IMEI号,设备唯一ID
+         * 080835 :指令流水号
+         * 1:  表示立即聆听 可扩展
+         * [参数]: 此为可选项。录音时间 为空默认15秒
+         * #:结尾标识符
+         * 设备响应:     IWAPDH,080835,1#
+         * 080835:指令流水号
+         * 1 成功 0失败
+         * # 结尾标识符
+         */
+
+        String[] cmdlist=cmd.split(CMDSPLIT);
+        if (cmdlist.length==5){
+            String imei=cmdlist[1];
+            String id=cmdlist[2];
+            String cdd=cmdlist[3];
+            String tmp=cmdlist[4];
+
+            tmp=tmp.replace(CMDEND,"").trim();
+
+            if (tmp.isEmpty()) tmp="15";
+            connection.send(APDH(id,cdd));
+
+            if (cdd.equals("1")) {
+                //delay 启动
+//                Context context = mRuntime.getContextProxy().context.getApplicationContext();
+                CoreService.getInstance().DevliverStringMessage("StartMonitor",tmp);
+            }
+        }else{
+            ICLogger.i(" BPDH Format error!");
+        }
+    }
+
+    public static StringMessage APTQ(Runtime runtime)
+    {
+        /**
+         * IWAPTQ,460,0,9520,3671,0#
+         * APTQ : 命令字符
+         * 460,0,9520,3671基站信息
+         * 0:语言标志位   0 默认为中文,1为英文
+         */
+        //或者仅仅使用 locale = Locale.getDefault(); 不需要考虑接口 deprecated(弃用)问题
+        Locale locale = Locale.getDefault();
+        String lang = locale.getLanguage() + "-" + locale.getCountry();
+        int language=0;
+        if(!lang.contains("zh"))
+        {
+            language=1;
+        }
+        return genStringMessage("APTQ",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTQ))
+                .append(CMDSPLIT).append(runtime.getLocationInstance().getMCC())
+                .append(CMDSPLIT).append(runtime.getLocationInstance().getMNC())
+                .append(CMDSPLIT).append(runtime.getLocationInstance().getLAC())
+                .append(CMDSPLIT).append(runtime.getLocationInstance().getGSMStationCID())
+                .append(CMDSPLIT).append(language)
+                .append(CMDEND).toString());
+    }
+
+
+    public void handleBPTQ( Connection connection,Runtime runtime,String cmd) {
+        /***
+         *
+         * IWBPTQ,20-10-11,19:32:02,6674,32,27,22,30,20-10-12,19:32:02,6674,32,27,22,30,20-10-13,19:32:02,6674,32,27,22,30,53575C71533A
+         * IWBPTQ, 16-09-24,11:00:00,b6e0d4c6,2,-5,-12,22,16-09-25,11:00:00,b6e0d4c6,2,-5,-12,22,16-09-26,11:00:00,b6e0d4c6,2,-5,-12,22,316df15733#
+         * 年-月-日,时:分:秒,天气描述,天气编号,当前温度,最低温,最高温,年-月-日,时:分:秒,天气描述,天气编号,当前温度,最低温,最高温,年-月-日,时:分:秒,天气描述,天气编号,当前温度,最低温,最高温,城市名
+         * 注:天气描述用Unicode编码,城市名使用Unicode编码, 第一组为当天,后2组依次为后续2天天气
+         * 如天气编号及描述对应如下(天气描述不需要发送括号内的白天晚上)
+         * 0:龙卷风
+         * 1:热带风暴
+         * 2:飓风
+         * 3:严重的雷暴
+         * 4:雷暴
+         * 5:混合雨雪
+         * 6:混合降雨和冰雹
+         * 7:混合雪和雨夹雪
+         * 8:冻结小雨
+         * 9:小雨
+         * 10:冻雨
+         * 11:阵雨
+         * 12:阵雨
+         * 13:雪飘雪
+         * 14:小雪阵雨
+         * 15:吹雪
+         * 16:雪
+         * 17:冰雹
+         * 18:雨夹雪
+         * 19:尘埃
+         * 20:雾
+         * 21:霾
+         * 22:黑烟
+         * 23:大风
+         * 24:风
+         * 25:低温
+         * 26:多云
+         * 27:多云(晚上)
+         * 28:多云(白天)
+         * 29:局部多云(晚上)
+         * 30:局部多云(天)
+         * 31:清爽(晚)
+         * 32:晴天
+         * 33:晴朗(晚)
+         * 34:晴朗(天)
+         * 35:混合雨和冰雹
+         * 36:热
+         * 37:局部地区性雷暴
+         * 38:零星雷暴
+         * 39:零星雷暴
+         * 40:零星阵雨
+         * 41:大雪
+         * 42:零星阵雪
+         * 43:大雪
+         * 44:多云
+         * 45:雷阵雨
+         * 46:阵雪
+         * 47:局部雷阵雨
+         */
+
+        log("BPTQ "+cmd);
+        String[] cmdlist=cmd.split(CMDSPLIT);
+        if (cmdlist.length==23){
+
+            StringBuilder sb=new StringBuilder();
+            StringBuilder msg=new StringBuilder();
+            for(int i=0;i<3;i++) {
+                String DayTime = cmdlist[1+i*7] + " " + cmdlist[2+i*7];
+                String date= "20"+cmdlist[1+i*7].trim();
+                String weather_name = Util.decodeUnicode2Utf8(cmdlist[3+i*7].trim());
+                String weather_id = cmdlist[4+i*7];
+                String temp_current = cmdlist[5+i*7];
+                String temp_high = cmdlist[6+i*7];
+                String temp_low = cmdlist[7+i*7];
+
+                sb.append(" "+DayTime);
+                sb.append(",天气:"+weather_name);
+                sb.append(",ID "+weather_id);
+                sb.append(",当前温度 "+temp_current);
+                sb.append(",最高温度 "+temp_high);
+                sb.append(",最低温度 "+temp_low);
+                sb.append("\n");
+
+                msg.append(date);
+                msg.append(","+weather_name);
+                msg.append(","+weather_id);
+                msg.append(","+temp_current);
+                msg.append(","+temp_high);
+                msg.append(","+temp_low);
+                msg.append(";");
+            }
+            String City=Util.decodeUnicode2Utf8(cmdlist[22]);
+
+            ICLogger.i(City+" \n"+sb.toString());
+
+            msg.insert(0,City+";");
+            String weatherstr=msg.toString();
+            if (weatherstr.endsWith(";"))
+            {
+                weatherstr=weatherstr.substring(0,weatherstr.lastIndexOf(";"));
+            }
+            Intent intent=new Intent(Constants.ACTION_WEATHER_RECEIVED);
+            intent.putExtra(Constants.KEY_Weather,weatherstr);
+            ICLogger.i("send Broadcast "+ Constants.ACTION_WEATHER_RECEIVED +"\n"+weatherstr+"\n");
+            CoreService.getInstance().sendBroadcast(intent);
+
+        }else{
+            ICLogger.i(" BPTQ Format error!");
+        }
+    }
+
+
+
+    public static StringMessage AP94( ){
+        /***
+         * 15确认已读文字(上行协议号:AP94,响应:BP94)
+         * 示例:
+         * IWAP94,123456,1#
+         * 说明:
+         * IWAP94:标识符
+         * APHCI: 命令字符
+         * 123456: 文字来源系统流水号
+         * 1:确认阅读、0:取消阅读
+         * 平台响应:     IWBP94#
+         * 表示平台已接收,可不作响应
+         * 说明:   本消息适用所有终端
+         */
+
+        //在UI逻辑中,只要有处理就都是已经阅读。所以不存在取消阅读的说法。
+        return genStringMessage(cmdMap.get(protocol_ic.CMD_TYPE.AP94),new StringBuffer(CMDHEADER).append(cmdMap.get(protocol_ic.CMD_TYPE.AP94))
+                .append(CMDSPLIT).append(Runtime.PushtxtMsg_srv_index)
+                .append(CMDSPLIT).append("1")
+                .append(CMDEND).toString());
+
+    }
+
+
+    public static StringMessage APAT(String id,String cmd)
+    {
+        return genStringMessage("APAT",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APAT))
+                .append(CMDSPLIT).append(id)
+                .append(CMDSPLIT).append(cmd)
+                .append(CMDEND).toString());
+    }
+
+    /***
+     * 响应剪断开关设定消息
+     * @param connection
+     * @param runtime
+     * @param cmd
+     */
+    public void handleBPAT( Connection connection,Runtime runtime,String cmd) {
+/***
+ * IWBPAT,353456789012345,080835,1#
+ * 说明:是否提示表带是否连接的开关,即剪断报警开关
+ * IW:标识符
+ * BPAT : 命令字符
+ * 353456789012345:IMEI号,设备唯一ID
+ * 080835:指令流水号
+ * 1: 表示剪断报警开关,1为开,0 为关
+ * 设备响应:     IWAPAT,080835, 1#
+ * 080835:指令流水号
+ * 1: 剪断开关状态(实际上与下行的命令一致)
+ */
+
+        log("BPAT "+cmd);
+        String[] cmdlist=cmd.split(CMDSPLIT);
+        if (cmdlist.length==4){
+
+            String imei=cmdlist[1];
+            String id=cmdlist[2];
+            String cmdid=cmdlist[3];
+            connection.send(APAT(id,cmdid));
+            if(cmdid.trim().equals("1")){
+                WakeLockUtil.ScreenOnWakeLockTemperary(runtime.getContextProxy().context);
+//                    runtime.getContextProxy().sendMsgBroadcast(runtime.getContextProxy().context.getResources().getString(R.string.alarm_lock_success), 2);
+                Util.ShowToast(runtime,runtime.getContextProxy().context.getResources().getString(R.string.alarm_lock_success));
+                Config.setNeedAntiOff(runtime.getContextProxy().context,true);
+                Config.setNeedCutOff(runtime.getContextProxy().context,true);
+                runtime.setNeedAntioff(true);
+                runtime.setNeddReportCutoff(true);
+            } else {
+                WakeLockUtil.ScreenOnWakeLockTemperary(runtime.getContextProxy().context);
+                runtime.getContextProxy().sendMsgBroadcast(runtime.getContextProxy().context.getResources().getString(R.string.alarm_unbind_success), 2);
+                Config.setNeedAntiOff(runtime.getContextProxy().context,false);
+                Config.setNeedCutOff(runtime.getContextProxy().context,false);
+                runtime.setNeedAntioff(false);
+                runtime.setNeddReportCutoff(false);
+            }
+        }else{
+            ICLogger.i(" BPAT Format error!");
+        }
+    }
+
+
+    public static StringMessage APCH(int charging)
+    {
+        return genStringMessage("APCH",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APCH))
+                .append(CMDSPLIT).append(charging)
+                .append(CMDEND).toString());
+    }
+
+
+
+    public static StringMessage APBT(String id,String cycle)
+    {
+        return genStringMessage("APBT",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APBT))
+                .append(CMDSPLIT).append(id)
+                .append(CMDSPLIT).append(cycle)
+                .append(CMDEND).toString());
+    }
+
+    /***
+     * 响应蓝牙扫描周期设定
+     * @param connection
+     * @param runtime
+     * @param cmd
+     */
+    public void handleBPBT( Connection connection,Runtime runtime,String cmd) {
+/***
+ * IWBPBT,353456789012345,080835,1#
+ * 说明:设置蓝牙扫描周期,单位时间分钟
+ * IW:标识符
+ * BPBT : 命令字符
+ * 353456789012345:IMEI号,设备唯一ID
+ * 080835:指令流水号
+ * 1: 扫描周期,对应单位为分钟
+ * 设备响应:     IWAPBT,080835, 1#
+ * 080835:指令流水号
+ * 1: 剪断开关状态(实际上与下行的命令一致)
+ */
+
+        log("BPBT "+cmd);
+        String[] cmdlist=cmd.split(CMDSPLIT);
+        if (cmdlist.length==4){
+            String id=cmdlist[2];
+            String cycle=cmdlist[3].replace("#","");
+            connection.send(APBT(id,cycle));
+
+            if(Util.isNumeric(cycle)){
+                int intcycle=Integer.parseInt(cycle);
+                Config.setBleScanCycle(runtime.getContextProxy().context,intcycle);
+                runtime.bleInfo.bleScanCycle=intcycle;
+                ICLogger.i("设置蓝牙扫描周期 "+intcycle+" 分钟");
+                CoreService.getInstance().setBleScanAlarm(intcycle);
+            }else{
+                ICLogger.i(" BPBT Format error!");
+            }
+
+        }else{
+            ICLogger.i(" BPBT Format error!");
+        }
+    }
+
+    /***
+     * 发送蓝牙扫描结果
+     * @param runtime
+     * @return
+     */
+    public static StringMessage APBR(Runtime runtime) {
+        /**
+         * #IWAPBR,353456789012345,080835,1#
+         *
+         * #IWBPBR#
+         */
+        if (runtime.bleInfo.btScanResult.size() > 0) {
+            StringBuffer sb=new StringBuffer();
+            sb.append(runtime.bleInfo.btScanResult.size());
+            for(String it:runtime.bleInfo.btScanResult){
+                sb.append(CMDSPLIT).append(it);
+            }
+            return genStringMessage("APBR", new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APBR))
+                    .append(CMDSPLIT).append(TimeUtil.getSystemTimeyyyyMMddHHmmss())
+                    .append(CMDSPLIT).append(sb.toString())
+                    .append(CMDEND).toString());
+
+        }else{
+            return null;
+        }
+    }
+
+    /**
+     * 85.设置联系人白名单(10个)(下行协议:BPWL,响应:APWL)
+     * 示例:
+     * IWBPWL,353456789012345,080835,D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx #
+     * 说明:
+     * IW:标识符
+     * BPWL : 命令字符
+     * 353456789012345:IMEI号,设备唯一ID
+     * 080835 :指令流水号
+     * D3590D54|135xxxxxxxxxx|9507xxxxxxxx : 一组联系人,使用|分隔名称和电话号码和绑定号码,名称使用UNICODE编码直接下发byte,多组之间使用逗号分隔,未填写的可为空,但位置仍需保留
+     * 设备响应: IWAPWL,080835, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx, D3590D54|135xxxxxxxxxx#
+     * 080835: 设备响应的时候带上响应流水号
+     * D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx, D3590D54|135xxxxxxxxxx|9507xxxxxxxx回复设备当前设置的主控号码供平台同步使用
+     * 说明:       本消息适用所有终端
+     */
+    public static StringMessage  APWL(String index,String[] phnumbs){
+        return genStringMessage("APWL",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APWL))
+                .append(CMDSPLIT).append(index)
+                .append(CMDSPLIT).append(phnumbs[0])
+                .append(CMDSPLIT).append(phnumbs[1])
+                .append(CMDSPLIT).append(phnumbs[2])
+                .append(CMDSPLIT).append(phnumbs[3])
+                .append(CMDSPLIT).append(phnumbs[4])
+                .append(CMDSPLIT).append(phnumbs[5])
+                .append(CMDSPLIT).append(phnumbs[6])
+                .append(CMDSPLIT).append(phnumbs[7])
+                .append(CMDSPLIT).append(phnumbs[8])
+                .append(CMDSPLIT).append(phnumbs[9])
+                .append(CMDEND).toString());
+    }
+    //设置通讯录,白名单(10个)
+    public void handleBPWL(Connection connection,String cmd , Runtime runtime){
+//        IWBPWL,867155030001063,357444,9b44529b|13554820016,,,,,,,,,
+/**
+ * IWBPWL,353456789012345,080835,
+ * D3590D54|135xxxxxxxxxx,
+ * D3590D54|135xxxxxxxxxx,
+ * D3590D54|135xxxxxxxxxx,
+ * D3590D54|135xxxxxxxxxx,
+ * D3590D54|135xxxxxxxxxx,
+ * D3590D54|135xxxxxxxxxx,
+ * D3590D54|135xxxxxxxxxx,
+ * D3590D54|135xxxxxxxxxx,
+ * D3590D54|135xxxxxxxxxx,
+ * D3590D54|135xxxxxxxxxx#
+ */
+        String[] cmdlist=cmd.split(CMDSPLIT);
+        String[] phnums=new String[]{"","","","","","","","","",""};
+        StringBuffer sb=new StringBuffer().append("recv phone Numbs ");
+        if (cmdlist.length>=3){
+            switch (cmdlist.length){
+                case 13:
+                    phnums[9]=cmdlist[12];
+                    sb.append(phnums[9]).append(",");
+                case 12:
+                    phnums[8]=cmdlist[11];
+                    sb.append(phnums[8]).append(",");
+                case 11:
+                    phnums[7]=cmdlist[10];
+                    sb.append(phnums[7]).append(",");
+                case 10:
+                    phnums[6]=cmdlist[9];
+                    sb.append(phnums[6]).append(",");
+                case 9:
+                    phnums[5]=cmdlist[8];
+                    sb.append(phnums[5]).append(",");
+                case 8:
+                    phnums[4]=cmdlist[7];
+                    sb.append(phnums[4]).append(",");
+                case 7:
+                    phnums[3]=cmdlist[6];
+                    sb.append(phnums[3]).append(",");
+                case 6:
+                    phnums[2]=cmdlist[5];
+                    sb.append(phnums[2]).append(",");
+                case 5:
+                    phnums[1]=cmdlist[4];
+                    sb.append(phnums[1]).append(",");
+                case 4:
+                    phnums[0]=cmdlist[3];
+                    sb.append(phnums[0]).append(",");
+
+            }
+
+            String index=cmdlist[2];
+            ICLogger.i(sb.toString());
+            connection.send(AP14(index,phnums));
+            ArrayList<Contact> contactArray=new ArrayList<Contact>();
+
+            if(Config.custom_name.equals("YT")) {
+                ICLogger.i("=====add hotline 96885 ");
+                contactArray.add(new Contact(Contact.CATEGORY_CALL, runtime.getContextProxy().context.getResources().getString(R.string.hotline), "96885"));
+            }
+            for (int i=0; i< phnums.length;i++){
+                String[] tmp= phnums[i].split("\\|");
+                if (tmp.length==2){
+                    String name= Util.decodeUnicode2Utf8(tmp[0]);
+                    String phonem=tmp[1];
+                    ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length+" , name="+name+",-"+phonem);
+                    contactArray.add(new Contact(Contact.CATEGORY_CALL,name,phonem));
+                }else{
+                    ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length);
+
+                }
+            }
+//            contactArray.add(new Contact(Contact.CATEGORY_GROUP,"All","666"));
+//            contactArray.add(new Contact(Contact.CATEGORY_PARTNER,"PARTNER","666"));
+//            contactArray.add(new Contact(Contact.CATEGORY_CARE,"CARE","666"));
+//            contactArray.add(new Contact(Contact.CATEGORY_VOLTE,"VOLTE","666"));
+
+            runtime.getDbHelper().saveContacts(contactArray,false,false,true,false,false,false);
+
+        }else{
+            ICLogger.i(" BPWL format error!");
+        }
+
+    }
+
+
+
+
+    public static StringMessage AP65(String id,String cy)
+    {
+        return genStringMessage("AP65",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP65))
+                .append(CMDSPLIT).append(id)
+                .append(CMDSPLIT).append(cy)
+                .append(CMDEND).toString());
+    }
+
+    public void handleBP65( Connection connection,Runtime runtime,String cmd) {
+/***
+ * 36.音量设置(下行协议:BP65,响应:AP65)
+ * 示例:
+ * IWBP65,353456789012345,080835,1#
+ * 说明:
+ * IW:标识符
+ * BP65: 命令字符
+ * 353456789012345:IMEI号,设备唯一ID
+ * 080835 :指令流水号
+ * 1 : 表示音量等级为1
+ * 设备响应:     IWAP65,080835, 1#
+ * 080835: 设备响应的时候带上响应流水号
+ * 1: 表示指令执行成功,音量等级为1
+ */
+
+        log("BP65 "+cmd);
+        String[] cmdlist=cmd.split(CMDSPLIT);
+        if (cmdlist.length==4){
+            String id=cmdlist[2];
+            String cycle=cmdlist[3].replace("#","");
+            connection.send(AP65(id,cycle));
+
+            if(Util.isNumeric(cycle)){
+                int mastervolume=Integer.parseInt(cycle);
+
+                ICLogger.i("设置音量 "+mastervolume);
+                //实际设备音量 0~15  协议音量0~7需要转换
+                int volume=mastervolume*2;
+                if (volume<0)volume=0;
+                if(volume>=14) volume=15;
+                Config.setMasterVolume(runtime.getContextProxy().context,mastervolume*2);
+                ICAudioManager.setMasterVolumn(runtime.getContextProxy().context,mastervolume*2);
+
+            }else{
+                ICLogger.i(" BP65 Format error!");
+            }
+
+        }else{
+            ICLogger.i(" BP65 Format error!");
+        }
+    }
+
+    public static StringMessage AP47(String id,String cycle)
+    {
+        return genStringMessage("AP47",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP47))
+                .append(CMDSPLIT).append(id)
+                .append(CMDSPLIT).append(cycle)
+                .append(CMDEND).toString());
+    }
+
+
+    public void handleBP47( Connection connection,Runtime runtime,String cmd) {
+/***
+ * 37.震动设置(下行协议号:BP47,响应:AP47)
+ * 示例:
+ * IWBP47,353456789012345,080835,10#
+ * 说明:
+ * IW:标识符
+ * BP47 : 命令字符
+ * 353456789012345:IMEI号,设备唯一ID
+ * 080835 :指令流水号
+ * 10: 表示震动时长,此处单位为称,表示震动10秒钟
+ * 设备响应:     IWAP47,080835,1#
+ * 080835:指令流水号
+ * 1:表示设备执行成功,0 表示设备执行失败
+ */
+
+        log("BP47 "+cmd);
+        String[] cmdlist=cmd.split(CMDSPLIT);
+        if (cmdlist.length==4){
+            String id=cmdlist[2];
+            String cycle=cmdlist[3].replace("#","");
+            connection.send(AP47(id,cycle));
+
+            if(Util.isNumeric(cycle)){
+                int vibduration=Integer.parseInt(cycle);
+                ICLogger.i("设置震动时长 "+vibduration+" 秒");
+                Config.setDurationOfVibration(runtime.getContextProxy().context,vibduration);
+                VibrateUtil.setVibPattern(vibduration*1000);
+
+            }else{
+                ICLogger.i(" BP47 Format error!");
+            }
+
+        }else{
+            ICLogger.i(" BP47 Format error!");
+        }
+    }
+    public boolean handleCmd(CMD_TYPE type, String cmd) {
+
+           //普通非二进制命令用此函数处理
+        boolean ret=true;
+        ICLogger.i("handleCmd "+type.name() + " strLen="+cmd.length());
+        if (Config.LOG_TOFILE)ICLogger.logToFile("APILog", " recv " + cmd);
+        cmd=cmd.replace(" ","");
+        switch (type){
+            case BP00: //登录包
+                handleBP00(mRuntime,cmd);
+                ICLogger.i("服务器收到登录包AP00");
+                mConnection.DeliverCMDMessageToSystem("login",cmd);//通知下面线程状态变化
+                break;
+            case BP01: //gps定位包
+                handleBP01(cmd);
+                ICLogger.i("服务器收到定位AP01");
+                mConnection.DeliverCMDMessageToSystem("AP01",cmd);//通知下面线程状态变化
+                break;
+            case BP02:// wifi定位包
+                handleBP02(cmd);
+                ICLogger.i("服务器收到定位AP02");
+                mConnection.DeliverCMDMessageToSystem("AP02",cmd);//通知下面线程状态变化
+                break;
+            case BP03: //心跳包
+                handleBP03(cmd);
+                ICLogger.i("服务器收到心跳包AP03");
+                mConnection.DeliverCMDMessageToSystem("heartbeat",cmd);//通知下面线程状态变化
+                break;
+
+            case BP07:
+                //收到发送的语音包
+                handleBP07(cmd,mConnection);
+                break;
+            case BP10:
+                //报警包
+                mConnection.DeliverCMDMessageToSystem("AP10",cmd);//通知下面线程状态变化
+                break;
+
+            case BPTM:
+                //校时命令
+                handleBPTM(cmd);
+                ICLogger.i("服务器收到校时命令APTM");
+                mConnection.DeliverCMDMessageToSystem("APTM",cmd);//通知下面线程状态变化
+                break;
+            case BP85://设置闹钟
+                handleBP85(cmd,mConnection,mRuntime);
+                ICLogger.i("收到服务器设置闹钟命令BP85");
+                mConnection.DeliverCMDMessageToSystem("AP85",cmd);//通知下面线程状态变化
+                break;
+
+            case BP87:
+                handleBP87(cmd,mConnection,mRuntime);
+                ICLogger.i("收到服务器 QRCode uri BP87");
+                break;
+            case BP33:
+                //设置工作模式
+                handleBP33(mConnection,mRuntime,cmd);
+                mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化
+
+                break;
+            case BP34:
+                //设置工作模式
+                handleBP34(mConnection,mRuntime,cmd);
+                mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化
+                break;
+            case BP16:
+                //立即定位指令(长链接有效)
+                handleBP16(mConnection,mRuntime,cmd);
+                mConnection.DeliverCMDMessageToSystem("StartLocate",cmd);//通知下面线程状态变化
+                break;
+
+            case BP46: //立即拍照
+                ICLogger.i("立即拍照!");
+                handleBP46(cmd,mConnection,mRuntime);
+                break;
+
+            case BP12:
+                //收到设置SOS号码
+                handleBP12(mConnection,cmd,mRuntime);
+                ICLogger.i("收到服务器设置SOS号码命令BP12");
+                break;
+            case BP14:
+                //收到设置白名单号码
+                handleBP14(mConnection,cmd,mRuntime);
+                ICLogger.i("收到服务器设置白名单号码命令BP14");
+                break;
+            case BPWL:
+                //收到设置白名单号码
+                handleBPWL(mConnection,cmd,mRuntime);
+                ICLogger.i("收到服务器设置白名单号码命令BPWL");
+                break;
+            case BP15:
+                handleBP15(cmd,mConnection,mRuntime);
+                ICLogger.i("收到服务器设置定位命令BP15");
+                break;
+            case BP17:
+                //收到恢复出厂设置
+                handleBP17(mConnection,cmd);
+                ICLogger.i("收到服务器恢复出厂设置命令BP17");
+                mConnection.DeliverCMDMessageToSystem("FactoryReset",cmd);//通知下面线程状态变化
+                break;
+
+            case BP18:
+                //收到重启
+                handleBP18(mConnection,cmd);
+                ICLogger.i("收到服务器重启命令BP18");
+                mConnection.DeliverCMDMessageToSystem("Reboot",cmd);//通知下面线程状态变化
+                break;
+
+            case BP31:
+                //收到关机
+                handleBP31(mConnection,cmd);
+                ICLogger.i("收到服务器关机命令BP31");
+                mConnection.DeliverCMDMessageToSystem("poweroff",cmd);//通知下面线程状态变化
+                break;
+            case BP40:
+                //服务器推送文本
+                handleBP40(mConnection,mRuntime,cmd);
+                ICLogger.i("收到服务器推送文本消息");
+                mConnection.DeliverCMDMessageToSystem("showTxt",cmd);//通知下面线程状态变化
+                break;
+
+            case BPXL:
+                handleBPXL(cmd,mConnection);
+                ICLogger.i("收到服务器心率检测命令");
+                if(mRuntime.check_stat_do_ppg_test()) HeartRateManager.triggerPPGtest();
+                break;
+            case BPXY:
+                handleBPXY(cmd,mConnection);
+                ICLogger.i("收到服务器血压检测命令");
+                if(mRuntime.check_stat_do_ppg_test()) HeartRateManager.triggerPPGtest();
+                break;
+            case BPJZ:
+                handleBPJZ(cmd,mConnection,mRuntime);
+                ICLogger.i("收到服务器血压校准命令");
+                break;
+            case BPHT:
+                ICLogger.i("服务器收到上传的心率血压");
+                mConnection.DeliverCMDMessageToSystem("APHT",cmd);//通知下面线程状态变化
+                break;
+            case BP84:
+                handleBP84(cmd,mConnection);
+                ICLogger.i("收到服务器白名单命令");
+                break;
+
+            case BP86:
+                //心率周期
+                handleBP86(cmd,mConnection,mRuntime);
+                mConnection.DeliverCMDMessageToSystem("AP86",cmd);//通知下面线程状态变化
+
+                break;
+            case BP68: //绑定解绑
+                handleBP68(cmd,mConnection,mRuntime);
+                break;
+            case BP88:
+                //收到查找设备消息
+                handleBP88(cmd,mConnection);
+                mConnection.DeliverCMDMessageToSystem("findDev",cmd);//通知下面线程状态变化
+                break;
+            case BP89:
+                //心率/血压阀值
+                handleBP89(cmd,mConnection);
+                mConnection.DeliverCMDMessageToSystem("AP89",cmd);//通知下面线程状态变化
+                break;
+
+            case BPTE: //设置测试体温
+                handleBPTE(cmd,mConnection,mRuntime);
+                mConnection.DeliverCMDMessageToSystem("APTE",cmd);//通知下面线程状态变化
+                break;
+
+            case BPTP:
+                handleBPTP();
+                mConnection.DeliverCMDMessageToSystem("APTP",cmd);//通知下面线程状态变化
+                break;
+            case BPHP:
+                handleBPHP();
+                mConnection.DeliverCMDMessageToSystem("APHP",cmd);//通知下面线程状态变化
+                break;
+            case BPX1://设置 心率血压血氧修正值
+                handleBPX1(cmd,mConnection,mRuntime);
+                ICLogger.i("收到服务器设置 心率血压血氧修正值BPX1");
+                mConnection.DeliverCMDMessageToSystem("APX1",cmd);//通知下面线程状态变化
+                break;
+
+            case BPS4: //提醒设置(时间段) 主要为久坐设置提醒时长。
+                handleBPS4(cmd,mConnection,mRuntime);
+                ICLogger.i("收到 提醒设置(时间段)");
+                mConnection.DeliverCMDMessageToSystem("APS4",cmd);//通知下面线程状态变化
+                break;
+            case BPDE:
+                handleBPDE(mConnection,cmd,mRuntime);
+                ICLogger.i(" 收到 进出围栏通知!");
+                mConnection.DeliverCMDMessageToSystem("APDE",cmd);//通知下面线程状态变化
+                break;
+
+            case BPTU:
+                handleBPTU(cmd, mConnection);
+                ICLogger.i("收到服务器 图片语音 消息 BPTU");
+            //    mConnection.DeliverCMDMessageToSystem("APTU", "");//通知下面线程状态变化
+                break;
+            case BPDG:
+                handleBPDG(mConnection,cmd,mRuntime);
+                ICLogger.i(" 收到 体温阈值设置!");
+                mConnection.DeliverCMDMessageToSystem("APDG",cmd);//通知下面线程状态变化
+                break;
+            case BPSL:
+                ICLogger.i("睡眠数据上传完毕!");
+                mConnection.DeliverCMDMessageToSystem("APSL",cmd);//通知下面线程状态变化
+                break;
+
+            case BPDH:
+                ICLogger.i("聆听");
+                handleBPDH(mConnection,mRuntime,cmd);
+                break;
+
+            case BPTQ: //天气下发
+                handleBPTQ(mConnection,mRuntime,cmd);
+                break;
+            case BPAT://剪断开关设定
+                handleBPAT(mConnection,mRuntime,cmd);
+                break;
+
+            case BPBT://蓝牙扫描设置
+                handleBPBT(mConnection,mRuntime,cmd);
+                break;
+
+            case BP65://声音设置
+                handleBP65(mConnection,mRuntime,cmd);
+                break;
+            case BP47://震动设置
+                handleBP47(mConnection,mRuntime,cmd);
+                break;
+
+        }
+
+        return ret;
+
+    }
+
+
+    public boolean handleCmd(CMD_TYPE type, String cmd, byte[] bytes) {
+
+        //只有需要传递二进制数据的才需要这个函数,目前只有BP28需要
+        boolean ret=true;
+        ICLogger.i("handleCmd "+type.name() + " "+cmd+" bytelen="+bytes.length );
+        if (Config.LOG_TOFILE) ICLogger.logToFile("APILog", " recv " +new String(bytes));
+        switch (type) {
+            case BP28:
+                handleBP28(mConnection,cmd, mRuntime,bytes);
+                ICLogger.i("收到服务器语音BP28");
+//                mConnection.DeliverCMDMessageToSystem("BP28", "");//通知下面线程状态变化
+                break;
+        }
+        return ret;
+    }
+}