From: snickersun Date: Sat, 28 Nov 2020 02:40:34 +0000 (+0800) Subject: 1、温度检测 发送APTP格式修正。过滤不合理数据 X-Git-Url: http://git.snicker.com.cn/Users/apple/Desktop/static/gitweb.css?a=commitdiff_plain;h=dc90e752d79f2fa75b0a79988986c26a566b9a3e;p=protocol_srv.git 1、温度检测 发送APTP格式修正。过滤不合理数据 2、添加与上层应用通讯广播佩戴消息的机制,persist.sys.ic_antioff com.ic.ACTION_ANTIOFF --- diff --git a/app/src/main/java/com/enqualcomm/support/Constants.java b/app/src/main/java/com/enqualcomm/support/Constants.java index a5343a1c..e4bfc3be 100644 --- a/app/src/main/java/com/enqualcomm/support/Constants.java +++ b/app/src/main/java/com/enqualcomm/support/Constants.java @@ -1,396 +1,399 @@ -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_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"; - - -} - +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"; + + +} + diff --git a/app/src/main/java/com/enqualcomm/support/service/AntiMonitorService.java b/app/src/main/java/com/enqualcomm/support/service/AntiMonitorService.java index 5790ec68..1324a1b5 100644 --- a/app/src/main/java/com/enqualcomm/support/service/AntiMonitorService.java +++ b/app/src/main/java/com/enqualcomm/support/service/AntiMonitorService.java @@ -1,479 +1,500 @@ -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_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); - - } - private void send_antiof_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; - 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; - 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_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 antioff){ - ICLogger.i("send_cutoff_event_broadcast "+antioff); - Intent intent=new Intent(); - intent.setAction(ACTION_ANTI_OFF); - intent.putExtra(KEY_ANTI_EVENT,antioff); - if (antioff==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); - } - } -} +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); + } + } +} diff --git a/app/src/main/java/com/enqualcomm/support/service/SilentManager.java b/app/src/main/java/com/enqualcomm/support/service/SilentManager.java index 2cad02cc..241e0f76 100644 --- a/app/src/main/java/com/enqualcomm/support/service/SilentManager.java +++ b/app/src/main/java/com/enqualcomm/support/service/SilentManager.java @@ -1,880 +1,880 @@ -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 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 sAntioffList; - private ArrayList silentList; - private ArrayList stheartRateList; - private ArrayList 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 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 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 var7 = new Intent(this.mContext, CoreService.class); - var7.setAction(ACTION_CARE_ALARM); - var7.setData(Uri.parse(var2)); - return PendingIntent.getService(this.mContext, 0, var7, 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 queryAlarm() { - ArrayList var1 = this.mDbHelper.queryAlarm(); - if (!this.mInSilent) { - if (this.alarms != null) { - this.cancelAlarm(this.alarms); - } - - this.setNewAlarm(var1); - } - - return var1; - } - - private ArrayList queryAntioff() { - return this.mDbHelper.queryAntioff(true); - } - - private ArrayList 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 querySilent() { - return this.mDbHelper.querySilence(true); - } - - private ArrayList queryStheartRate() { - return this.mDbHelper.queryStheartRate(true); - } - - private void setNewAlarm(ArrayList 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 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); - } - - } - } +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 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 sAntioffList; + private ArrayList silentList; + private ArrayList stheartRateList; + private ArrayList 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 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 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 queryAlarm() { + ArrayList var1 = this.mDbHelper.queryAlarm(); + if (!this.mInSilent) { + if (this.alarms != null) { + this.cancelAlarm(this.alarms); + } + + this.setNewAlarm(var1); + } + + return var1; + } + + private ArrayList queryAntioff() { + return this.mDbHelper.queryAntioff(true); + } + + private ArrayList 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 querySilent() { + return this.mDbHelper.querySilence(true); + } + + private ArrayList queryStheartRate() { + return this.mDbHelper.queryStheartRate(true); + } + + private void setNewAlarm(ArrayList 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 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 diff --git a/app/src/main/java/com/enqualcomm/support/utils/TemperatureUtil.java b/app/src/main/java/com/enqualcomm/support/utils/TemperatureUtil.java index a57f3caf..23842fe0 100644 --- a/app/src/main/java/com/enqualcomm/support/utils/TemperatureUtil.java +++ b/app/src/main/java/com/enqualcomm/support/utils/TemperatureUtil.java @@ -1,163 +1,162 @@ -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< 0.001f){ - Util.mSleep(1000); - ICLogger.i("retry read temp for 0"); - 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 < 0.001f) { - Util.mSleep(1000); - ICLogger.i("retry read tempOut for 0"); - temout = TemperatureUtil.get_tempOut_value_origin(); - } - if (temout > 60 || temout < 0) { - temout = 0.0f; - } - if (temout > 0.001f) { - 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; - } - } - - - } - } -} +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; + } + } + + + } + } +} diff --git a/app/src/main/java/com/ic/protocols/protocol_ic.java b/app/src/main/java/com/ic/protocols/protocol_ic.java index f47250b9..90df28bb 100644 --- a/app/src/main/java/com/ic/protocols/protocol_ic.java +++ b/app/src/main/java/com/ic/protocols/protocol_ic.java @@ -1,3181 +1,3181 @@ -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 cmdMap = null; - - static { - cmdMap = new HashMap(); - cmdMap.put(CMD_TYPE.AP00, "AP00"); - cmdMap.put(CMD_TYPE.BP00, "BP00"); - cmdMap.put(CMD_TYPE.AP01, "AP01"); - cmdMap.put(CMD_TYPE.BP01, "BP01"); - cmdMap.put(CMD_TYPE.AP02, "AP02"); - cmdMap.put(CMD_TYPE.BP02, "BP02"); - cmdMap.put(CMD_TYPE.AP92, "AP92"); - cmdMap.put(CMD_TYPE.BP92, "BP92"); - cmdMap.put(CMD_TYPE.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 contactArray=new ArrayList(); -// if(Config.custom_branch_name.equals("AK")){ -// -// contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos1", "07522312120")); -// if (!phNum1.isEmpty()) -// contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos2", phNum1)); -// if (!phNum2.isEmpty()) -// contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos3", phNum2)); -// }else { - if (!phNum1.isEmpty()) - contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos1", phNum1)); - if (!phNum2.isEmpty()) - contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos2", phNum2)); - if (!phNum3.isEmpty()) - contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos3", phNum3)); -// } - runtime.getDbHelper().saveContacts(contactArray,false,false,false,false,false,true); - }else{ - ICLogger.i(" BP12 format error!"); - } - } - - - public static StringMessage AP14(String index,String[] phnumbs){ - return genStringMessage("AP14",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP14)) - .append(CMDSPLIT).append(index) - .append(CMDSPLIT).append(phnumbs[0]) - .append(CMDSPLIT).append(phnumbs[1]) - .append(CMDSPLIT).append(phnumbs[2]) - .append(CMDSPLIT).append(phnumbs[3]) - .append(CMDSPLIT).append(phnumbs[4]) - .append(CMDSPLIT).append(phnumbs[5]) - .append(CMDSPLIT).append(phnumbs[6]) - .append(CMDSPLIT).append(phnumbs[7]) - .append(CMDSPLIT).append(phnumbs[8]) - .append(CMDSPLIT).append(phnumbs[9]) - .append(CMDEND).toString()); - } - //设置通讯录,白名单(10个) - public void handleBP14(Connection connection,String cmd , Runtime runtime){ -// IWBP14,867155030001063,357444,9b44529b|13554820016,,,,,,,,, -/** - * IWBP14,353456789012345,080835, - * D3590D54|135xxxxxxxxxx, - * D3590D54|135xxxxxxxxxx, - * D3590D54|135xxxxxxxxxx, - * D3590D54|135xxxxxxxxxx, - * D3590D54|135xxxxxxxxxx, - * D3590D54|135xxxxxxxxxx, - * D3590D54|135xxxxxxxxxx, - * D3590D54|135xxxxxxxxxx, - * D3590D54|135xxxxxxxxxx, - * D3590D54|135xxxxxxxxxx# - */ - String[] cmdlist=cmd.split(CMDSPLIT); - String[] phnums=new String[]{"","","","","","","","","",""}; - StringBuffer sb=new StringBuffer().append("recv phone Numbs "); - if (cmdlist.length>=3){ - switch (cmdlist.length){ - case 13: - phnums[9]=cmdlist[12]; - sb.append(phnums[9]).append(","); - case 12: - phnums[8]=cmdlist[11]; - sb.append(phnums[8]).append(","); - case 11: - phnums[7]=cmdlist[10]; - sb.append(phnums[7]).append(","); - case 10: - phnums[6]=cmdlist[9]; - sb.append(phnums[6]).append(","); - case 9: - phnums[5]=cmdlist[8]; - sb.append(phnums[5]).append(","); - case 8: - phnums[4]=cmdlist[7]; - sb.append(phnums[4]).append(","); - case 7: - phnums[3]=cmdlist[6]; - sb.append(phnums[3]).append(","); - case 6: - phnums[2]=cmdlist[5]; - sb.append(phnums[2]).append(","); - case 5: - phnums[1]=cmdlist[4]; - sb.append(phnums[1]).append(","); - case 4: - phnums[0]=cmdlist[3]; - sb.append(phnums[0]).append(","); - - } - - String index=cmdlist[2]; - ICLogger.i(sb.toString()); - connection.send(AP14(index,phnums)); - ArrayList contactArray=new ArrayList(); - - if(Config.custom_name.equals("YT")) { - ICLogger.i("=====add hotline 96885 "); - contactArray.add(new Contact(Contact.CATEGORY_CALL, runtime.getContextProxy().context.getResources().getString(R.string.hotline), "96885")); - } - for (int i=0; i< phnums.length;i++){ - String[] tmp= phnums[i].split("\\|"); - if (tmp.length==2){ - String name= Util.decodeUnicode2Utf8(tmp[0]); - String phonem=tmp[1]; - ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length+" , name="+name+",-"+phonem); - contactArray.add(new Contact(Contact.CATEGORY_CALL,name,phonem)); - }else{ - ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length); - - } - } -// contactArray.add(new Contact(Contact.CATEGORY_GROUP,"All","666")); -// contactArray.add(new Contact(Contact.CATEGORY_PARTNER,"PARTNER","666")); -// contactArray.add(new Contact(Contact.CATEGORY_CARE,"CARE","666")); -// contactArray.add(new Contact(Contact.CATEGORY_VOLTE,"VOLTE","666")); - - runtime.getDbHelper().saveContacts(contactArray,false,false,true,false,false,false); - - }else{ - ICLogger.i(" BP14 format error!"); - } - - } - - - - public static StringMessage AP85(Runtime ds,String cmddata){ -//示例数据:IWAP49,68## - return genStringMessage("AP85",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP85)) - .append(CMDSPLIT).append(cmddata) - .append(CMDEND).toString()); - - } - //设置闹钟 - public void handleBP85(String cmd , Connection connection,Runtime runtime){ -// IWBP85,867155030001063,155312,1,1,0235,12,1,1 -// IWBP85,867155030002145,945166,1,0, -// IWBP85,867155030001064,265960,1,1,1130,,1,1 -// IWBP85,353456789012345,080835,1,3, 0900,135,1,1@0900 ,135,1,2@0900 ,135,1,3# -//353456789012345:IMEI号,设备唯一ID -//080835 :指令流水号 -//1: 表示闹钟总开关,1为开,0 为关 -//3: 表示闹钟个数 -//0900 ,135,1,1,表示一组闹钟,0900表示早上09:00, 135表示周一周三周五,使用24小时制 -//1表示该组闹钟开启或关闭状态 1表示开启 0表示关闭 -//1表示吃药提醒 -//2 表示喝水提醒 -//3 表示久坐提醒 -//多组闹钟之间用”@”符号分隔 - - String imei="",cmdindex="0"/*指令流水号*/; - int all_alarmswitch=0 /*总开关 1为开,0 为关*/, - alarmswitch=0 /*1为开,0 为关*/, - alarmcount=0 /*表示闹钟个数*/; - String alarmtime="";//0900表示早上09:00 - int alarmtype=1; //1表示吃药提醒 , 2 表示喝水提醒 ,3 表示久坐提醒 - String repeat="";// 135表示周一周三周五,使用24小时制 - String[] datalist= cmd.split("@"); - ArrayList alarmlist=new ArrayList<>(); - if (datalist.length >0){ - for (int i =0 ; i< datalist.length;i++){ - String [] cmdarglist=datalist[i].split(","); - - if (i == 0){ - if (cmdarglist.length == 9){ - 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$.2f",wrist_temp)) - .append(CMDSPLIT).append(String.format("%1$.2f",body_temp)) - .append(CMDSPLIT).append(String.format("%1$.2f",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 contactArray=new ArrayList(); - - if(Config.custom_name.equals("YT")) { - ICLogger.i("=====add hotline 96885 "); - contactArray.add(new Contact(Contact.CATEGORY_CALL, runtime.getContextProxy().context.getResources().getString(R.string.hotline), "96885")); - } - for (int i=0; i< phnums.length;i++){ - String[] tmp= phnums[i].split("\\|"); - if (tmp.length==2){ - String name= Util.decodeUnicode2Utf8(tmp[0]); - String phonem=tmp[1]; - ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length+" , name="+name+",-"+phonem); - contactArray.add(new Contact(Contact.CATEGORY_CALL,name,phonem)); - }else{ - ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length); - - } - } -// contactArray.add(new Contact(Contact.CATEGORY_GROUP,"All","666")); -// contactArray.add(new Contact(Contact.CATEGORY_PARTNER,"PARTNER","666")); -// contactArray.add(new Contact(Contact.CATEGORY_CARE,"CARE","666")); -// contactArray.add(new Contact(Contact.CATEGORY_VOLTE,"VOLTE","666")); - - runtime.getDbHelper().saveContacts(contactArray,false,false,true,false,false,false); - - }else{ - ICLogger.i(" BPWL format error!"); - } - - } - - - - - public static StringMessage AP65(String id,String cy) - { - return genStringMessage("AP65",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.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; - } -} +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 cmdMap = null; + + static { + cmdMap = new HashMap(); + cmdMap.put(CMD_TYPE.AP00, "AP00"); + cmdMap.put(CMD_TYPE.BP00, "BP00"); + cmdMap.put(CMD_TYPE.AP01, "AP01"); + cmdMap.put(CMD_TYPE.BP01, "BP01"); + cmdMap.put(CMD_TYPE.AP02, "AP02"); + cmdMap.put(CMD_TYPE.BP02, "BP02"); + cmdMap.put(CMD_TYPE.AP92, "AP92"); + cmdMap.put(CMD_TYPE.BP92, "BP92"); + cmdMap.put(CMD_TYPE.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 contactArray=new ArrayList(); +// if(Config.custom_branch_name.equals("AK")){ +// +// contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos1", "07522312120")); +// if (!phNum1.isEmpty()) +// contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos2", phNum1)); +// if (!phNum2.isEmpty()) +// contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos3", phNum2)); +// }else { + if (!phNum1.isEmpty()) + contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos1", phNum1)); + if (!phNum2.isEmpty()) + contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos2", phNum2)); + if (!phNum3.isEmpty()) + contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos3", phNum3)); +// } + runtime.getDbHelper().saveContacts(contactArray,false,false,false,false,false,true); + }else{ + ICLogger.i(" BP12 format error!"); + } + } + + + public static StringMessage AP14(String index,String[] phnumbs){ + return genStringMessage("AP14",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP14)) + .append(CMDSPLIT).append(index) + .append(CMDSPLIT).append(phnumbs[0]) + .append(CMDSPLIT).append(phnumbs[1]) + .append(CMDSPLIT).append(phnumbs[2]) + .append(CMDSPLIT).append(phnumbs[3]) + .append(CMDSPLIT).append(phnumbs[4]) + .append(CMDSPLIT).append(phnumbs[5]) + .append(CMDSPLIT).append(phnumbs[6]) + .append(CMDSPLIT).append(phnumbs[7]) + .append(CMDSPLIT).append(phnumbs[8]) + .append(CMDSPLIT).append(phnumbs[9]) + .append(CMDEND).toString()); + } + //设置通讯录,白名单(10个) + public void handleBP14(Connection connection,String cmd , Runtime runtime){ +// IWBP14,867155030001063,357444,9b44529b|13554820016,,,,,,,,, +/** + * IWBP14,353456789012345,080835, + * D3590D54|135xxxxxxxxxx, + * D3590D54|135xxxxxxxxxx, + * D3590D54|135xxxxxxxxxx, + * D3590D54|135xxxxxxxxxx, + * D3590D54|135xxxxxxxxxx, + * D3590D54|135xxxxxxxxxx, + * D3590D54|135xxxxxxxxxx, + * D3590D54|135xxxxxxxxxx, + * D3590D54|135xxxxxxxxxx, + * D3590D54|135xxxxxxxxxx# + */ + String[] cmdlist=cmd.split(CMDSPLIT); + String[] phnums=new String[]{"","","","","","","","","",""}; + StringBuffer sb=new StringBuffer().append("recv phone Numbs "); + if (cmdlist.length>=3){ + switch (cmdlist.length){ + case 13: + phnums[9]=cmdlist[12]; + sb.append(phnums[9]).append(","); + case 12: + phnums[8]=cmdlist[11]; + sb.append(phnums[8]).append(","); + case 11: + phnums[7]=cmdlist[10]; + sb.append(phnums[7]).append(","); + case 10: + phnums[6]=cmdlist[9]; + sb.append(phnums[6]).append(","); + case 9: + phnums[5]=cmdlist[8]; + sb.append(phnums[5]).append(","); + case 8: + phnums[4]=cmdlist[7]; + sb.append(phnums[4]).append(","); + case 7: + phnums[3]=cmdlist[6]; + sb.append(phnums[3]).append(","); + case 6: + phnums[2]=cmdlist[5]; + sb.append(phnums[2]).append(","); + case 5: + phnums[1]=cmdlist[4]; + sb.append(phnums[1]).append(","); + case 4: + phnums[0]=cmdlist[3]; + sb.append(phnums[0]).append(","); + + } + + String index=cmdlist[2]; + ICLogger.i(sb.toString()); + connection.send(AP14(index,phnums)); + ArrayList contactArray=new ArrayList(); + + if(Config.custom_name.equals("YT")) { + ICLogger.i("=====add hotline 96885 "); + contactArray.add(new Contact(Contact.CATEGORY_CALL, runtime.getContextProxy().context.getResources().getString(R.string.hotline), "96885")); + } + for (int i=0; i< phnums.length;i++){ + String[] tmp= phnums[i].split("\\|"); + if (tmp.length==2){ + String name= Util.decodeUnicode2Utf8(tmp[0]); + String phonem=tmp[1]; + ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length+" , name="+name+",-"+phonem); + contactArray.add(new Contact(Contact.CATEGORY_CALL,name,phonem)); + }else{ + ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length); + + } + } +// contactArray.add(new Contact(Contact.CATEGORY_GROUP,"All","666")); +// contactArray.add(new Contact(Contact.CATEGORY_PARTNER,"PARTNER","666")); +// contactArray.add(new Contact(Contact.CATEGORY_CARE,"CARE","666")); +// contactArray.add(new Contact(Contact.CATEGORY_VOLTE,"VOLTE","666")); + + runtime.getDbHelper().saveContacts(contactArray,false,false,true,false,false,false); + + }else{ + ICLogger.i(" BP14 format error!"); + } + + } + + + + public static StringMessage AP85(Runtime ds,String cmddata){ +//示例数据:IWAP49,68## + return genStringMessage("AP85",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP85)) + .append(CMDSPLIT).append(cmddata) + .append(CMDEND).toString()); + + } + //设置闹钟 + public void handleBP85(String cmd , Connection connection,Runtime runtime){ +// IWBP85,867155030001063,155312,1,1,0235,12,1,1 +// IWBP85,867155030002145,945166,1,0, +// IWBP85,867155030001064,265960,1,1,1130,,1,1 +// IWBP85,353456789012345,080835,1,3, 0900,135,1,1@0900 ,135,1,2@0900 ,135,1,3# +//353456789012345:IMEI号,设备唯一ID +//080835 :指令流水号 +//1: 表示闹钟总开关,1为开,0 为关 +//3: 表示闹钟个数 +//0900 ,135,1,1,表示一组闹钟,0900表示早上09:00, 135表示周一周三周五,使用24小时制 +//1表示该组闹钟开启或关闭状态 1表示开启 0表示关闭 +//1表示吃药提醒 +//2 表示喝水提醒 +//3 表示久坐提醒 +//多组闹钟之间用”@”符号分隔 + + String imei="",cmdindex="0"/*指令流水号*/; + int all_alarmswitch=0 /*总开关 1为开,0 为关*/, + alarmswitch=0 /*1为开,0 为关*/, + alarmcount=0 /*表示闹钟个数*/; + String alarmtime="";//0900表示早上09:00 + int alarmtype=1; //1表示吃药提醒 , 2 表示喝水提醒 ,3 表示久坐提醒 + String repeat="";// 135表示周一周三周五,使用24小时制 + String[] datalist= cmd.split("@"); + ArrayList alarmlist=new ArrayList<>(); + if (datalist.length >0){ + for (int i =0 ; i< datalist.length;i++){ + String [] cmdarglist=datalist[i].split(","); + + if (i == 0){ + if (cmdarglist.length == 9){ + 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 contactArray=new ArrayList(); + + if(Config.custom_name.equals("YT")) { + ICLogger.i("=====add hotline 96885 "); + contactArray.add(new Contact(Contact.CATEGORY_CALL, runtime.getContextProxy().context.getResources().getString(R.string.hotline), "96885")); + } + for (int i=0; i< phnums.length;i++){ + String[] tmp= phnums[i].split("\\|"); + if (tmp.length==2){ + String name= Util.decodeUnicode2Utf8(tmp[0]); + String phonem=tmp[1]; + ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length+" , name="+name+",-"+phonem); + contactArray.add(new Contact(Contact.CATEGORY_CALL,name,phonem)); + }else{ + ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length); + + } + } +// contactArray.add(new Contact(Contact.CATEGORY_GROUP,"All","666")); +// contactArray.add(new Contact(Contact.CATEGORY_PARTNER,"PARTNER","666")); +// contactArray.add(new Contact(Contact.CATEGORY_CARE,"CARE","666")); +// contactArray.add(new Contact(Contact.CATEGORY_VOLTE,"VOLTE","666")); + + runtime.getDbHelper().saveContacts(contactArray,false,false,true,false,false,false); + + }else{ + ICLogger.i(" BPWL format error!"); + } + + } + + + + + public static StringMessage AP65(String id,String cy) + { + return genStringMessage("AP65",new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.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; + } +}