ICProtocol81_V964_2306112300_release.apk
authorSnickerSun <snickersun@163.com>
Sun, 11 Jun 2023 15:17:40 +0000 (23:17 +0800)
committerSnickerSun <snickersun@163.com>
Sun, 11 Jun 2023 15:17:40 +0000 (23:17 +0800)
同步 L005  SMS protocolBeehome 协议
心率体温已经可以测试

32 files changed:
app/app.iml [new file with mode: 0644]
app/build.gradle
app/release/ICProtocol81_V964_2306112300_release.apk [moved from app/release/ICProtocol81_V963_2305182354_release.apk with 78% similarity]
app/release/output.json
app/src/main/AndroidManifest.xml
app/src/main/aidl/com/ic/work/IHeartRateSensorCallback.aidl
app/src/main/aidl/com/ic/work/ITempSensorCallback.aidl
app/src/main/aidl/com/ic/work/ITempSensorService.aidl
app/src/main/java/com/ic/protocolSrv/Config.java
app/src/main/java/com/ic/protocolSrv/Constants.java
app/src/main/java/com/ic/protocolSrv/CoreService.java
app/src/main/java/com/ic/protocolSrv/ICSmsManager.java
app/src/main/java/com/ic/protocolSrv/NMEAListener.java
app/src/main/java/com/ic/protocolSrv/bean/ICLocation.java
app/src/main/java/com/ic/protocolSrv/bean/Runtime.java
app/src/main/java/com/ic/protocolSrv/provider/ICGlobalSettingsProvider.java
app/src/main/java/com/ic/protocolSrv/service/HeartRateManager.java
app/src/main/java/com/ic/protocolSrv/service/SilentManager.java
app/src/main/java/com/ic/protocolSrv/toolActivity.java
app/src/main/java/com/ic/protocolSrv/utils/CellInfoUtil.java
app/src/main/java/com/ic/protocolSrv/utils/DeviceInfoUtil.java
app/src/main/java/com/ic/protocolSrv/utils/SendEmail.java
app/src/main/java/com/ic/protocolSrv/utils/StorageUtils.java
app/src/main/java/com/ic/protocolSrv/utils/TemperatureUtil.java
app/src/main/java/com/ic/protocolSrv/utils/TimeUtil.java
app/src/main/java/com/ic/protocols/protocolAPIHelper.java
app/src/main/java/com/ic/protocols/protocol_beehome.java
app/src/main/java/com/ic/protocols/protocol_s123.java
app/version_code.properties
core/core.iml [new file with mode: 0644]
dNSCache/dNSCache.iml [new file with mode: 0644]
protocol8.1.iml [new file with mode: 0644]

diff --git a/app/app.iml b/app/app.iml
new file mode 100644 (file)
index 0000000..2d2bd7d
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<module version="4">\r
+  <component name="FacetManager">\r
+    <facet type="android-gradle" name="Android-Gradle">\r
+      <configuration>\r
+        <option name="GRADLE_PROJECT_PATH" value=":app" />\r
+        <option name="LAST_SUCCESSFUL_SYNC_AGP_VERSION" value="3.5.3" />\r
+        <option name="LAST_KNOWN_AGP_VERSION" value="3.5.3" />\r
+      </configuration>\r
+    </facet>\r
+    <facet type="android" name="Android">\r
+      <configuration>\r
+        <option name="SELECTED_BUILD_VARIANT" value="debug" />\r
+        <option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />\r
+        <option name="COMPILE_JAVA_TASK_NAME" value="compileDebugSources" />\r
+        <afterSyncTasks>\r
+          <task>generateDebugSources</task>\r
+        </afterSyncTasks>\r
+        <option name="ALLOW_USER_CONFIGURATION" value="false" />\r
+        <option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />\r
+        <option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />\r
+        <option name="RES_FOLDERS_RELATIVE_PATH" value="file://$MODULE_DIR$/src/main/res;file://$MODULE_DIR$/build/generated/res/resValues/debug" />\r
+        <option name="TEST_RES_FOLDERS_RELATIVE_PATH" value="" />\r
+        <option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" />\r
+      </configuration>\r
+    </facet>\r
+  </component>\r
+</module>
\ No newline at end of file
index f7e7931..94d45d5 100644 (file)
@@ -7,14 +7,14 @@ static def getApkBaseName() {
 }
 
 android {
-    compileSdkVersion 29
-    buildToolsVersion "29.0.3"
+    compileSdkVersion 28
+    buildToolsVersion "28.0.3"
     def currentVersionCode = getVersionCode()
     def currentVersionName = releaseTime()
     defaultConfig {
         applicationId "com.ic.protocolSrv"
         minSdkVersion 19
-        targetSdkVersion 29
+        targetSdkVersion 28
         versionCode currentVersionCode
         versionName "${currentVersionName}"
         multiDexEnabled true
similarity index 78%
rename from app/release/ICProtocol81_V963_2305182354_release.apk
rename to app/release/ICProtocol81_V964_2306112300_release.apk
index adbacad..6d1962d 100644 (file)
Binary files a/app/release/ICProtocol81_V963_2305182354_release.apk and b/app/release/ICProtocol81_V964_2306112300_release.apk differ
index f8f8d77..77d4973 100644 (file)
@@ -1 +1 @@
-[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":963,"versionName":"2305182354","enabled":true,"outputFile":"ICProtocol81_V963_2305182354_release.apk","fullName":"release","baseName":"release"},"path":"ICProtocol81_V963_2305182354_release.apk","properties":{}}]
\ No newline at end of file
+[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":964,"versionName":"2306112300","enabled":true,"outputFile":"ICProtocol81_V964_2306112300_release.apk","fullName":"release","baseName":"release"},"path":"ICProtocol81_V964_2306112300_release.apk","properties":{}}]
\ No newline at end of file
index dd4d5a6..fed0ad5 100644 (file)
@@ -9,6 +9,7 @@
     <!-- 按用户发送消息 -->
     <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" />
     <!-- 允许程序读取或写入系统设置 -->
+    <uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE" />
     <uses-permission android:name="android.permission.WRITE_SETTINGS" />
     <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
     <!-- 联网的权限 -->
         android:protectionLevel="signature" />
 
     <uses-permission android:name="com.ic.protocolSrv.permission.MIPUSH_RECEIVE" />
+    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
+    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
+
+
 
     <protected-broadcast android:name="com.ic.protocolSrv.ACTION_EQC_ALARM" />
     <protected-broadcast android:name="com.ic.heartrate.action.SILENT_START" />
 
         <provider
             android:name=".provider.ICGlobalSettingsProvider"
-            android:authorities="com.ic.protocolSrv.settings"
+            android:authorities="com.ic.fzd.settings"
             android:exported="true" />
 
         <provider
index 88ce873..296985d 100644 (file)
@@ -5,8 +5,8 @@ package com.ic.work;
 import com.ic.work.domain.HeartRate;
 
 interface IHeartRateSensorCallback {
-     void onHeartRateGet(in HeartRate heartRate);
-     void onHeartRateUpdate(in HeartRate heartRate);
-    void onGettingData();
-    void onWaiting();
+     oneway void onHeartRateGet(in HeartRate heartRate);
+     oneway void onHeartRateUpdate(in HeartRate heartRate);
+     oneway void onGettingData();
+     oneway void onWaiting();
 }
\ No newline at end of file
index d8cdca8..4f43311 100644 (file)
@@ -4,8 +4,14 @@ package com.ic.work;
 import com.ic.work.domain.Temperature;
 
 interface ITempSensorCallback {
-    void onTemperatureGet(in Temperature temperature);
-    void onTemperatureUpdating(in Temperature temperature);
+    //测试出错,比如说主办温度过高
+   void onTemperatureTestError(in String message,in int code);
+    //获取到了温度数据,这个是最终数据
+   void onTemperatureGet(in Temperature temperature);
+   //温度数据更新中
+   void onTemperatureUpdating(in Temperature temperature);
+   //正在获取数据
    void onGettingData();
+   //等待中
    void onWaiting();
 }
\ No newline at end of file
index 156a851..3d1847e 100644 (file)
@@ -3,7 +3,11 @@ package com.ic.work;
 import com.ic.work.ITempSensorCallback;
 
 interface ITempSensorService {
+    //注册接口
     void registerCallback(in ITempSensorCallback callback,in String callbackTag);
+    //取消接口注册
     void unRegisterCallback(in ITempSensorCallback callback);
-    void getTemperatureInfo(int from,in String callbackTag);
+    //获取体温:0表示Alarm,1表示客户端用户发出的,3表示服务端发出的单次获取指令
+    //callbackTag,可以使用报名+类名的字符串组合
+    oneway void getTemperatureInfo(int from,in String callbackTag);
 }
\ No newline at end of file
index 483d6f2..47dbbf1 100644 (file)
@@ -1,7 +1,9 @@
 package com.ic.protocolSrv;
 
 import android.content.Context;
+import android.os.SystemProperties;
 import android.provider.Settings;
+import android.text.TextUtils;
 import android.util.JsonReader;
 
 import com.ic.protocolSrv.bean.ICLocation;
@@ -44,6 +46,11 @@ public class Config {
     public static final boolean LOG_TOFILE = true;
     public static int sw_release_no = -1;
 
+    public static boolean needHRSTestOnSOS = Util.getSystemProperties("persist.sys.needHRSOnSOS", "false").equals("true");
+
+    public static String DEFAULT_MCCMNC = "46000";
+    //
+    public static boolean isSilentMode = false;
     public static HeartRateOxygenTestType testType = HeartRateOxygenTestType.ALL;
 
     //默认协议心跳时间
@@ -57,6 +64,9 @@ public class Config {
     public static boolean forceGPSMoveCheck = true;
     public static boolean forceWearCheck = true;
 
+
+    private static final String KEYGlobalSkipMoveCheckFlag = "SkipMoveCheckGlobalFlag";
+
     private static final String KEYDurationOfVibration = "DurationVib";
     private static final String KeyMasterVolume = "MasterVolume";
 
@@ -64,12 +74,15 @@ public class Config {
     public static final String DefaultLogFtpUser = "ftpuser";
     public static final String DefaultLogFtpPWD = "iclog";
 
-    public static String DefaultHttpLogServerUrl = "http://icfota.snicker.com.cn:8089/UploadFile.jsp";
+    //public static String DefaultHttpLogServerUrl = "http://icfota.snicker.com.cn:8089/UploadFile.jsp";
+    public static String DefaultHttpLogServerUrl = "http://icfota.snicker.com.cn:8089/upfile.jsp";
 
     public static String DefaultWiFiSSID = "icwifi20210417";
     public static String DefaultWiFiPWD = "87654321";
     public static String DefaultWiFiEncryptType = "psk";
 
+    public static final int TemperatureTestResultSendTimeOut = 2; // 温度测试结果发送超时2秒 ,两秒内更新不发送,超过两秒不更新才发送
+
     public static final int GPSLocationTimeoutInSeconds = 50;
     public static final int WiFiLocationTimeoutInSeconds = 12;
 
@@ -224,6 +237,30 @@ public class Config {
         }
     }
 
+    public static void ReloadModCycleSettingsWhenEmergencyStop(Runtime runtime) {
+        Context context = runtime.getContextProxy().context;
+        ICLogger.i("current Cycles PPG " + runtime.getPpgTestCycleInMinutes() + " , LocationCycle " + runtime.getLocationInstance().getLocation_cycle() + " LocationMode " + runtime.getLocationInstance().getWorkingMod());
+        runtime.setPpgTestCycleInMinutes(Config.getPPGTestCycleInMinutes(context));
+        runtime.getLocationInstance().setLocation_cycle(runtime.getLocationInstance().getLocation_cycle());
+        runtime.getLocationInstance().setWorkingMod(runtime.getLocationInstance().getLastWorkingMode());
+        ICLogger.i("current Cycles PPG " + runtime.getPpgTestCycleInMinutes() + " , LocationCycle " + runtime.getLocationInstance().getLocation_cycle() + " LocationMode " + runtime.getLocationInstance().getWorkingMod());
+    }
+
+
+    public static void setSkipMoveCheckFlagGlobal(Context context, boolean en) {
+        //修改的时候把prop的也修改掉
+        SystemProperties.set("persist.sys.skip_move", String.valueOf(en));
+        SharePreferenceUtil.setPrefBoolean(context, KEYGlobalSkipMoveCheckFlag, en);
+    }
+
+    public static boolean getSkipMoveCheckFlagGlobal(Context context) {
+        boolean prefBoolean = SharePreferenceUtil.getPrefBoolean(context, KEYGlobalSkipMoveCheckFlag, true);
+        String isSkipMoveStr = SystemProperties.get("persist.sys.skip_move");
+        if (TextUtils.isEmpty(isSkipMoveStr)) {
+            return prefBoolean;
+        }
+        return "true".equals(isSkipMoveStr);
+    }
     public static void setDurationOfVibration(Context context, int cycle) {
         SharePreferenceUtil.setPrefInt(context, KEYDurationOfVibration, cycle);
     }
@@ -236,16 +273,6 @@ public class Config {
         SharePreferenceUtil.setPrefInt(context, KeyMasterVolume, cycle);
     }
 
-    private static final String KEYGlobalSkipMoveCheckFlag = "SkipMoveCheckGlobalFlag";
-
-    public static void setSkipMoveCheckFlagGlobal(Context context, boolean en) {
-        SharePreferenceUtil.setPrefBoolean(context, KEYGlobalSkipMoveCheckFlag, en);
-    }
-
-    public static boolean getSkipMoveCheckFlagGlobal(Context context) {
-        return SharePreferenceUtil.getPrefBoolean(context, KEYGlobalSkipMoveCheckFlag, true);
-    }
-
     public static int getMasterVolume(Context context) {
         return SharePreferenceUtil.getPrefInt(context, KeyMasterVolume, 15);
     }
@@ -358,6 +385,8 @@ public class Config {
 
     public static void loadModCycleSettings(Runtime runtime) {
         Context context = runtime.getContextProxy().context;
+        //初始化定位模式
+        LocationClient.setSkipMoveCheck(Config.getSkipMoveCheckFlagGlobal(context));
         ICLogger.i("current Cycles PPG " + runtime.getPpgTestCycleInMinutes() + " , LocationCycle " + runtime.getLocationInstance().getLocation_cycle() + " LocationMode " + runtime.getLocationInstance().getWorkingMod());
         runtime.setPpgTestCycleInMinutes(Config.getPPGTestCycleInMinutes(context));
         runtime.getLocationInstance().setLocation_cycle(Config.getLocationCycle(context));
@@ -921,8 +950,9 @@ public class Config {
             ConfigAlarm(Runtime.AlarmType.ALARM_LOCK_WATCH, true);
             DefaultLocationMode = CUSTOM_MOD8_GPS;
             DefaultLocationCycle = 10 * 60;
-            DefaultPPGTestCycleInMinutes = 60;
-            DefaultTemperatureTestCycle = 60 * 60;
+            //微信记录:心率体温血氧默认都是10分钟自动测一次。
+            DefaultPPGTestCycleInMinutes = 10;
+            DefaultTemperatureTestCycle = 10*60;
             noPushTxtNotifyDialog = true;
             noSMSNotifyDialog = true;
             noVoiceNotifyDialog = true;
@@ -937,7 +967,8 @@ public class Config {
             enableDataRoaming = true;
             Config.forceGPSMoveCheck = false; //即爱对gps不进行运动检测,此变量专门为了给其他协议GPS进行强制运动检测用的。
 
-        } else if (Config.custom_name.equals("l005")) {
+        } else if (Config.custom_name.equals("l005") ||
+                Config.custom_name.equals("PT460")) {
             ConfigAlarm(Runtime.AlarmType.ALARM_CUTOFF, true);
             ConfigAlarm(Runtime.AlarmType.ALARM_ILLEGAL_CUTOFF, true);
             ConfigAlarm(Runtime.AlarmType.ALARM_LOCK_WATCH, true);
@@ -1033,7 +1064,7 @@ public class Config {
             forceGPSMoveCheck = false; //对定位不进行运动检测。
 
             DefaultLocationMode = CUSTOM_MOD8_GPS;
-            DefaultLocationCycle = 5 * 60;
+            DefaultLocationCycle = 15 * 60;
             DefaultPPGTestCycleInMinutes = 0;
             DefaultTemperatureTestCycle = 0;
 
@@ -1070,7 +1101,7 @@ public class Config {
             DefaultLocationCycle = 15 * 60;
             DefaultPPGTestCycleInMinutes = 15;
             DefaultTemperatureTestCycle = 15 * 60;
-        } else if (Config.custom_name.equals("18cube")) {
+        } else if (Config.custom_name.equals("18cube") || Config.custom_name.equalsIgnoreCase("lfj")) {
             //C46-W100 config
             Config.ConfigAlarm(Runtime.AlarmType.ALARM_SOS, true);
             Config.ConfigAlarm(Runtime.AlarmType.ALARM_LOWBATTERY, true);
index 86a3d66..c7c185a 100644 (file)
@@ -10,6 +10,8 @@ public interface Constants {
 
     String ACTION_PLAYTIME = "com.ic.action.playtime";
 
+    String ACTION_ALARM_DELETE_ALARM = "com.ic.alarm.action.DELETE_ALARM";
+    String ACTION_ALARM_DELETE_ALARM_RESULT = "com.ic.alarm.action.DELETE_ALARM_RESULT";
     String ACTION_BROADCAST_PPG = "com.ic.protocolSrv.ACTION_BROADCAST_PPG";
     String ACTION_ADDTEST_CONTACTS = "com.ic.imessage.ACTION_ADDTEST_CONTACTS";
 
@@ -40,6 +42,10 @@ public interface Constants {
     String ACTION_EQC_ALARM = "com.ic.protocolSrv.ACTION_EQC_ALARM";
 
     String ACTION_LOCATION_ALARM = "com.ic.protocolSrv.ACTION_LOCATION_ALARM";
+    //add by TrillGates
+    //这个action是用于检查消息发送状态的
+    //如果只用handler检查的话,休眠就发不了了.
+    String ACTION_MSG_STATE_CHECK_ALARM = "com.ic.ACTION_MSG_STATE_CHECK_ALARM";
 
     String ACTION_EXIT_MONITOR_MODE = "com.ic.protocolSrv.MONITOR_EXIT";
 
@@ -48,6 +54,7 @@ public interface Constants {
     String ACTION_HEATR_RATE_START = "com.ic.heartrate.action.SILENT_START";
     String ACTION_CHECK_ANTIOFF_EVENT = "com.ic.action.CHECK_ANTIOFF_EVENT";
     String ACTION_CHECK_CUTOFF_EVENT = "com.ic.action.CHECK_CUTOFF_EVENT";
+    String ACTION_ALARM_CUTOFF_EVENT = "com.ic.action.ALARM_CUTOFF_EVENT";
 
     String ACTION_IMESSAGE = "action.message";
 
@@ -256,6 +263,7 @@ public interface Constants {
 
     String ACTION_START_FOTA_UPDATE = "com.ic.action.startfotaUpdate";
     String ACTION_SMSCMD = "com.ic.protocolSrv.SMSCMD";
+    String ACTION_CMD_TESTER = "com.ic.action.CMD_TESTER";
     String ACTION_SMSCMD_Reply = "com.ic.action.fotaUpdateReply";
     String ACTION_TINTERNAL_TEST = "com.ic.action.internaltest";
 
index cf91cf9..7f35642 100644 (file)
@@ -154,7 +154,7 @@ public class CoreService extends Service {
     public static final int RINGER_MODE_OUTDOOR = 3;
     public static Handler mHandler = null;
     //    public static Handler mHandler=new Handler();
-    private static ICSmsManager smsManager = null;
+    public static ICSmsManager smsManager = null;
     private ShutdownFlagObserver shutdownFlagObserver;
     private WeTalkMsgObserver weTalkMsgObserver;
     private AirplaneModeObserver airplaneModeObserver;
index 9a8e604..7bdf77d 100644 (file)
@@ -23,6 +23,7 @@ import com.ic.protocolSrv.bean.Runtime;
 import com.ic.protocolSrv.bean.StringMessage;
 import com.ic.protocolSrv.provider.ICDatabaseHelper;
 import com.ic.protocolSrv.provider.ICGlobalSettingsProvider;
+import com.ic.protocolSrv.provider.ICMembersProvider;
 import com.ic.protocolSrv.provider.ICNotificationProvider;
 import com.ic.protocolSrv.service.AudioService;
 import com.ic.protocolSrv.service.Deliver;
@@ -37,6 +38,7 @@ import com.ic.protocolSrv.utils.ICHttpUtil;
 import com.ic.protocolSrv.utils.ICLogger;
 import com.ic.protocolSrv.utils.LanguageUtils;
 import com.ic.protocolSrv.utils.SendEmail;
+import com.ic.protocolSrv.utils.SharePreferenceUtil;
 import com.ic.protocolSrv.utils.SimSignalUtil;
 import com.ic.protocolSrv.utils.TemperatureUtil;
 import com.ic.protocolSrv.utils.TimeUtil;
@@ -55,6 +57,7 @@ import chestnut.utils.PhoneUtils;
 
 import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
 import static com.ic.protocolSrv.Config.PROTOCOL_S123;
+import static com.ic.protocolSrv.Constants.ACTION_CMD_TESTER;
 import static com.ic.protocolSrv.Constants.ACTION_SMSCMD;
 import static com.ic.protocolSrv.Constants.ACTION_SMSCMD_Reply;
 import static com.ic.protocolSrv.Constants.ACTION_SMSCMD_TEST;
@@ -158,10 +161,16 @@ public class ICSmsManager extends BroadcastReceiver {
                     ContextProxy.sendMsgBroadcast(context, message, 1);
                 }
             }
+        } else if (ACTION_CMD_TESTER.equals(action)) {
+            //模拟指令,传到各个协议里去
+            String cmd = intent.getStringExtra("cmd");
+            ICLogger.d("cmd ==> " + cmd);
+            if (!TextUtils.isEmpty(cmd)) {
+                protocolAPIHelper.parseTestData(cmd);
+            }
         }
     }
 
-
     private void updateMsgSettingsValue() {
         ContentValues contentValues = new ContentValues();
         //分类是心率的包名
@@ -194,7 +203,15 @@ public class ICSmsManager extends BroadcastReceiver {
             if (locationClient != null) {
                 locationClient.setLocationResponse(null);
             }
-            sendSMS(cell_number_to_reply, "http://maps.google.com/?q=" + locationResponseUrl);
+            //IMEI号,时间,电量,信号,
+            ICLogger.d("locationResponseUrl => " + locationResponseUrl);
+            String response = runtime.IMEI() + ",G:" + TimeUtil.getLocalTimeForGoogle(System.currentTimeMillis()) +
+                    runtime.getBatterylevel() + "%"
+                    + runtime.getSignalInfo()
+                    + runtime.getGPSHeading()
+                    + ",http://maps.google.com/maps?f=q&hl=en&q=" + locationResponseUrl;
+            ICLogger.d("response ==> " + response);
+            sendSMS(cell_number_to_reply, response);
             cell_number_to_reply = "";
         }
     }
@@ -207,6 +224,7 @@ public class ICSmsManager extends BroadcastReceiver {
         intentfilter.addAction(ACTION_SMSCMD_Reply);
         intentfilter.addAction(ACTION_SMS_RECEIVED);
         intentfilter.addAction(ACTION_SMSCMD);
+        intentfilter.addAction(ACTION_CMD_TESTER);
         intentfilter.addAction(ACTION_TINTERNAL_TEST);
         mContext.registerReceiver(this, intentfilter);
         ICLogger.i("ICSmsManager register filter ");
@@ -272,11 +290,31 @@ public class ICSmsManager extends BroadcastReceiver {
             }
             return false;
         });
+        //获取到配置中的短信密码
+        String smsCmdPwd = Util.getSystemProperties("persist.sys.sms.pwd", Config.DefaultSMSPassword);
+        String ENCRYPED_HEADER = Config.getSMSPwd(mContext);
+        //如果没有设置密码,那么就设置一下
+        if (ENCRYPED_HEADER.equals(Config.DefaultSMSPassword)) {
+            Config.setSMSPwd(mContext, smsCmdPwd);
+        }
+        //获取到短信中的配置密码,如果有配置就进行密码校验
     }
 
     public static void sendSMS(String phoneNumber, String msg) {
-        if (TextUtils.isEmpty(phoneNumber)) {
-            ICLogger.d("phone number is null...");
+        ICLogger.d("reply ==> " + msg);
+        if (TextUtils.isEmpty(phoneNumber) || phoneNumber.contains("Broadcast") // || phoneNumber.contains("WEB")
+               ) {
+            ICLogger.d("phone number is empty.");
+            return;
+        }
+        if (phoneNumber.startsWith("WEB")) {
+            ICLogger.d("send msg to web...");
+            //拿到流水号
+            String[] split = phoneNumber.split("-");
+            if (split.length == 2) {
+                String cmdIndex = split[1];
+                protocolAPIHelper.sendMsg2Web(cmdIndex, msg);
+            }
             return;
         }
         android.telephony.SmsManager smsManager = android.telephony.SmsManager.getDefault();
@@ -294,8 +332,28 @@ public class ICSmsManager extends BroadcastReceiver {
         mContext.unregisterReceiver(this);
     }
     private boolean isAdminNumber(String phoneNumb) {
+        //如果Web的下发指令,直接让过吧
+        if (phoneNumb.startsWith("WEB-") || phoneNumb.startsWith("Broadcast")) {
+            ICLogger.d("后台的指令,不判断管理员账号..." + phoneNumb);
+            return true;
+        }
 
-        return true;
+        //检查是否有设置管理员账号
+        String admin_number = SharePreferenceUtil.getPrefString(mContext, "admin_number", "");
+        ICLogger.d("admin_number ==> " + admin_number);
+        if (TextUtils.isEmpty(admin_number)) {
+            return true;
+        }
+        //有数据如果不一样,false,一样true,如果没有记录,返回true.
+        try {
+            boolean isSamePhoneNum = admin_number.contains(phoneNumb) || phoneNumb.contains(admin_number);
+            ICLogger.d("isSamePhoneNum ==> " + isSamePhoneNum);
+            return isSamePhoneNum;
+            //防止有空指针
+        } catch (Exception e) {
+            ICLogger.e("phone number admin error...", e);
+        }
+        return false;
     }
 
     private static void broadCastStartFotaUpdate(Context context) {
@@ -345,33 +403,36 @@ public class ICSmsManager extends BroadcastReceiver {
      *  return false表示不是命令, true表示是命令,且已经执行
      * */
     public boolean handleSMS_CMD(String phoneNumber, String sms) {
+
+            ICLogger.d("phoneNumber ==> " + phoneNumber);
+        //唯一一个指令,只管密码正确就可以获取到管理员的号是啥
+        String admin_number = SharePreferenceUtil.getPrefString(mContext, "admin_number", "");
+        String ENCRYPED_HEADER = Config.getSMSPwd(mContext);
+        if (ENCRYPED_HEADER.equals(Config.DefaultSMSPassword)
+                || phoneNumber.startsWith("WEB-") ||
+                phoneNumber.startsWith("Broadcast")) {
+            ENCRYPED_HEADER = "";
+        }
+
+        if (!sms.startsWith(ENCRYPED_HEADER + "#")) {
+            ICLogger.d("非指令短信...");
+            return false;
+        }
+
+        if (sms.equals(ENCRYPED_HEADER + "#ADMIN_NUMBER#")) {
+            sendSMS(phoneNumber, "admin phone number is:" + admin_number);
+            ICLogger.d("just get admin number...success");
+            return true;
+        }
         if (isAdminNumber(phoneNumber)) {
             if (sms == null || sms.trim().isEmpty()) return false;
             ICLogger.i("received SMSCMD " + sms);
             sms = sms.trim();
         }
-        return handleSms(runtime, sms, phoneNumber, mHandler);
-    }
 
-    /**
-     * phoneNumber可以为空
-     * Handler可以为空
-     *
-     * @param runtime
-     * @param sms
-     * @param phoneNumber
-     * @param handler
-     * @return
-     */
-    public static boolean handleSms(Runtime runtime, String sms, String phoneNumber, Handler handler) {
-        Context mContext = runtime.getContextProxy().context;
-        String ENCRYPED_HEADER = Config.getSMSPwd(mContext);
-        if (ENCRYPED_HEADER.equals(Config.DefaultSMSPassword)) {
-            ENCRYPED_HEADER = "";
-        }
 
         if (sms.equals(ENCRYPED_HEADER + "#logctl#=upload,all")) {
-            sms = ENCRYPED_HEADER + "#logctl#=upload,SDLog:Android/V20";
+            sms = ENCRYPED_HEADER + "#logctl#=upload,SDLog:Android/ic";
         }
         //$HX,SSER,OK,91.201.4.79,5018,C,589883
         if (sms.startsWith(ENCRYPED_HEADER + "$HX,SSER,OK,")) {
@@ -381,7 +442,7 @@ public class ICSmsManager extends BroadcastReceiver {
                 String ServerPort = tmplist[4];
                 String imeiend = tmplist[6];
                 if (runtime.IMEI().endsWith(imeiend)) {
-                    sms = ENCRYPED_HEADER + "#IP#=" + ServeriIp + ":" + ServerPort + "#";
+                    sms = ENCRYPED_HEADER + "#ip#=" + ServeriIp + ":" + ServerPort + "#";
                     ICLogger.i("收到客户自定义 服务器IP设置命令,转化为 #IP#命令!");
                 } else {
                     sendSMS(phoneNumber, imeiend + " IMEI 校验错误!");
@@ -404,6 +465,7 @@ public class ICSmsManager extends BroadcastReceiver {
                     String apn = apnvalues[3];
                     String user = "";
                     String password = "";
+                        ICLogger.d("set up apn...");
                     if (APNUtil.addVPN(apnName, apn, mcc, mnc, user, password, mContext) == true) {
                         sendSMS(phoneNumber, "apn add success!");
                     } else {
@@ -446,7 +508,7 @@ public class ICSmsManager extends BroadcastReceiver {
             ICLogger.i("SMS " + sms + " reply " + DeviceInfoUtil.getShortDeviceInfo(runtime));
             sendSMS(phoneNumber, DeviceInfoUtil.getShortDeviceInfo(runtime));
         } else if (sms.startsWith(ENCRYPED_HEADER + "#status#")) {
-            String reply = "IMEI=" + runtime.IMEI() + "\nSW:" + DeviceInfoUtil.getVersionCode(mContext) + " " + DeviceInfoUtil.getSWVersionDisplayName() + "\nBattery:" + runtime.getBattery() + "%";
+                String reply = "IMEI=" + runtime.IMEI() +"\nIMSI=" + runtime.getImsi() + "\nSW:" + DeviceInfoUtil.getVersionCode(mContext) + " " + DeviceInfoUtil.getSWVersionDisplayName() + "\nBattery:" + runtime.getBattery() + "%";
 
             ICLogger.i("SMS " + sms + " reply \n" + reply);
             sendSMS(phoneNumber, reply);
@@ -459,7 +521,7 @@ public class ICSmsManager extends BroadcastReceiver {
             } else {
                 sendSMS(phoneNumber, "At cmd empty error!");
             }
-        } else if (sms.startsWith(ENCRYPED_HEADER + "#imei:")) {
+        } else if (sms.startsWith(ENCRYPED_HEADER + "#imei:") || sms.startsWith(ENCRYPED_HEADER + "#imei=") ) {
             String imei = sms.substring(6);
             ICLogger.i("SMS " + sms + " imei=" + imei);
             if (imei.length() == 15) {
@@ -520,12 +582,12 @@ public class ICSmsManager extends BroadcastReceiver {
                             CoreService.getInstance().disconnect_server();
                             CoreService.getInstance().ReConnectToServer();
                         } else {
-                            reply = sms + " falied! ";
+                                reply = sms + " failed!";
                         }
                     }
                 }
             } else {
-                reply = sms + " falied! ";
+                    reply = sms + " failed!";
             }
             sendSMS(phoneNumber, reply);
         } else if (sms.startsWith(ENCRYPED_HEADER + "#setlocation#=") && sms.endsWith("#")) {
@@ -546,7 +608,8 @@ public class ICSmsManager extends BroadcastReceiver {
                             e.printStackTrace();
                             ICLogger.e(e.getMessage(), e);
                         }
-                        if (mod > 0 && cycle >= 30) {
+                            //客户要求5秒的
+                        if (mod > 0 && cycle >= 5) {
                             switch (mod) {
                                 case ICLocation.NORMAL_MOD:
                                     cycle = 60 * 15;
@@ -614,6 +677,23 @@ public class ICSmsManager extends BroadcastReceiver {
                     Config.setWiFiSSID(mContext, Config.DefaultWiFiSSID);
                     Config.setWiFiPasswd(mContext, Config.DefaultWiFiPWD);
                     sendSMS(phoneNumber, "reset Wifi Setting to SSID " + Config.getWiFiSSID(mContext) + ", WiFiPassword " + Config.getWiFiPasswd(mContext) + "!");
+                    } else if (tmp[1].startsWith("switch,")) {
+                        String tmplist[] = tmp[1].split(",");
+                        if (tmplist.length == 2) {
+                            if (tmplist[1].trim().equalsIgnoreCase("on") || tmplist[1].trim().equalsIgnoreCase("1")) {
+                                Util.turnOnWifiForConnect(null,runtime);
+                                Util.setSystemProperties("persist.sys.ic.wifi_enable", "true");
+                                sendSMS(phoneNumber, "WiFi Switch On !");
+                            } else if (tmplist[1].trim().equalsIgnoreCase("off") || tmplist[1].trim().equalsIgnoreCase("0")) {
+                                Util.turnOffWifiForSleep(null,runtime);
+                                Util.setSystemProperties("persist.sys.ic.wifi_enable", "false");
+                                sendSMS(phoneNumber, "WiFi Switch Off !");
+                            } else {
+                                sendSMS(phoneNumber, "WiFi Switch Control " + tmplist[1].trim() + " format error!");
+                            }
+                        } else {
+                            sendSMS(phoneNumber, "WiFi Switch Control format error!");
+                        }
                 } else if (tmp[1].startsWith("connect,")) {
                     String tmplist[] = tmp[1].split(",");
                     if (tmplist.length == 4) {
@@ -624,8 +704,8 @@ public class ICSmsManager extends BroadcastReceiver {
                         Config.setWiFiPasswd(mContext, PWD);
                         sendSMS(phoneNumber, "set and connect to Wifi SSID " + Config.getWiFiSSID(mContext) + ", WiFiPassword " + Config.getWiFiPasswd(mContext) + ", encryptType " + encyptType + "!");
                         //connect to wifi
-                        if (handler != null) {
-                            handler.postDelayed(new Runnable() {
+                        if (mHandler != null) {
+                            mHandler.postDelayed(new Runnable() {
                                 @Override
                                 public void run() {
                                     Deliver.connectToWifi(SSID, PWD, encyptType);
@@ -683,8 +763,8 @@ public class ICSmsManager extends BroadcastReceiver {
                             String sdfilelist[] = logfile.split(":");
                             if (sdfilelist.length == 2) {
                                 String fileOrDir = sdfilelist[1];
-                                if (handler != null) {
-                                    handler.postDelayed(() -> {
+                                if (mHandler != null) {
+                                    mHandler.postDelayed(() -> {
                                         String filepath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + fileOrDir;
                                         if (new File(filepath).exists()) {
                                             Util.getDBFile();
@@ -694,7 +774,7 @@ public class ICSmsManager extends BroadcastReceiver {
                                                 Util.ShowToast(runtime, "start Upload " + filepath + " to " + Config.getFtpServer(mContext) + " ...");
                                             }
                                             String logTime = TimeUtil.getSystemTime3();
-                                            ICHttpUtil.uploadFile(filepath, runtime, logTime, handler);
+                                            ICHttpUtil.uploadFile(filepath, runtime, logTime, mHandler);
                                         } else {
                                             sendSMS(phoneNumber, filepath + " not exist !");
                                             if (needShowToast) {
@@ -708,14 +788,14 @@ public class ICSmsManager extends BroadcastReceiver {
                             }
 
                         } else {
-                            if (handler != null) {
-                                handler.postDelayed(() -> {
+                            if (mHandler != null) {
+                                mHandler.postDelayed(() -> {
                                     String filepath = Util.getLogfilePath(runtime, logfile);
                                     if (Util.LogfileExist(runtime, logfile)) {
                                         Util.getDBFile();
                                         sendSMS(phoneNumber, "start Upload " + logfile + " to " + Config.getFtpServer(mContext) + " ...");
                                         String logTime = TimeUtil.getSystemTime3();
-                                        ICHttpUtil.uploadFile(filepath, runtime, logTime, handler);
+                                        ICHttpUtil.uploadFile(filepath, runtime, logTime, mHandler);
                                     } else {
                                         sendSMS(phoneNumber, logfile + " not exist !");
                                     }
@@ -862,8 +942,22 @@ public class ICSmsManager extends BroadcastReceiver {
                     if (!phNum3.isEmpty())
                         contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos3", phNum3));
 
-                    runtime.getDbHelper().saveContacts(contactArray, false, false, false, false, false, true);
-
+                        ICLogger.d("contactArray size ==> " + contactArray.size());
+                        //保存到IC的数据库上
+                        for (int i = 0; i < contactArray.size(); i++) {
+                            //数据入库
+                            Contact contact = contactArray.get(i);
+                            ContentValues item = new ContentValues();
+                            item.put(ICDatabaseHelper.fType, ICDatabaseHelper.MemberType.SOS);
+                            item.put(ICDatabaseHelper.fUserName, contact.name);
+                            item.put(ICDatabaseHelper.fPhoneNum, contact.number);
+                            runtime.getContextProxy()
+                                    .getResolver()
+                                    .insert(Uri.parse(ICMembersProvider.MEMBERS), item);
+                        }
+                        runtime.getDbHelper().saveContacts(contactArray,
+                                false, false, false,
+                                false, false, true);
                     sendSMS(phoneNumber, "set SOS number ok!");
 
                 } else {
@@ -876,8 +970,8 @@ public class ICSmsManager extends BroadcastReceiver {
         } else if (sms.equals(ENCRYPED_HEADER + "#listen#")) {
             sendSMS(phoneNumber, "start listen !");
             ICAudioManager.needMute = true;
-            if (handler != null) {
-                handler.postDelayed(new Runnable() {
+            if (mHandler != null) {
+                mHandler.postDelayed(new Runnable() {
                     @Override
                     public void run() {
                         SimSignalUtil.send_at_cmd(runtime, "atd" + phoneNumber + ";");
@@ -945,8 +1039,8 @@ public class ICSmsManager extends BroadcastReceiver {
                     cell_number_to_reply = phoneNumber;
                     sendSMS(phoneNumber, sb.toString());
                     //connect to wifi
-                    if (handler != null) {
-                        handler.postDelayed(() -> {
+                    if (mHandler != null) {
+                        mHandler.postDelayed(() -> {
                             Deliver.connectToWifi(SSID, PWD, encyptType);
                             broadCastStartFotaUpdate(mContext);
                         }, 500);
@@ -1084,15 +1178,55 @@ public class ICSmsManager extends BroadcastReceiver {
                 sendSMS(phoneNumber, " setprotocol cmd Format error!");
             }
 
-        } else if (sms.startsWith(ENCRYPED_HEADER + "#maillog#=")) {
+        } else if (sms.startsWith(ENCRYPED_HEADER + "#maillog#")) {
             String tmp[] = sms.split("=");
-            if (tmp.length == 2) {
+                needShowToast = sms.contains("SDLogInfo");
+                if(tmp.length==1){
+                   // String mailaddr="13554820016@163.com";
+                    String mailaddr="tangrixin716@163.com";
+                    mHandler.postDelayed(new Runnable() {
+                        @Override
+                        public void run() {
+                            String logfile = "";
+                            String fileOrDir = "Android/ic";
+
+                            Util.getDBFile();
+
+                            logfile = Util.zipfiles(fileOrDir);
+                            if (new File(logfile).exists()) {
+
+                                sendSMS(phoneNumber, "mail " + fileOrDir + " to " + mailaddr + " ...");
+                                if(needShowToast)
+                                    Util.ShowToast(runtime, "mail " + fileOrDir + " to " + mailaddr + " ...");
+
+                                String logtime = TimeUtil.getSystemTime3();
+                                if (SendEmail.getInstance().sendLogViaMail(logfile, mailaddr, logtime,runtime.IMEI())) {
+                                    sendSMS(phoneNumber, "mail " + fileOrDir + " to " + mailaddr + " success!");
+                                    if(needShowToast)
+                                        Util.ShowToast(runtime,"mail " + fileOrDir + " to " + mailaddr + " success!");
+                                } else {
+                                    sendSMS(phoneNumber, "mail " + fileOrDir + " to " + mailaddr + " failed!");
+                                    if(needShowToast)
+                                        Util.ShowToast(runtime,"mail " + fileOrDir + " to " + mailaddr + " failed!");
+                                }
+
+                            } else {
+                                sendSMS(phoneNumber, fileOrDir + " not exist !");
+                                if(needShowToast)
+                                    Util.ShowToast(runtime, fileOrDir + " not exist !");
+                            }
+                            if(needShowToast)
+                                needShowToast=false;
+                        }
+
+                    }, 500);
+                }else if (tmp.length == 2) {
                 String mailaddr = tmp[1];
                 if (!mailaddr.contains("@")) {
                     sendSMS(phoneNumber, "mail address error !");
                 } else {
-                    if (handler != null) {
-                        handler.postDelayed(() -> {
+                    if (mHandler != null) {
+                        mHandler.postDelayed(() -> {
                             String logfile = "";
                             String fileOrDir = "Android/ic";
                             Util.getDBFile();
@@ -1101,7 +1235,7 @@ public class ICSmsManager extends BroadcastReceiver {
                                 sendSMS(phoneNumber, "mail " + fileOrDir + " to " + mailaddr + " ...");
                                 Util.ShowToast(runtime, "mail " + fileOrDir + " to " + mailaddr + " ...");
                                 String logtime = TimeUtil.getSystemTime3();
-                                if (SendEmail.getInstance().sendLogViaMail(logfile, mailaddr, logtime)) {
+                                    if (SendEmail.getInstance().sendLogViaMail(logfile, mailaddr, logtime,runtime.IMEI())) {
                                     sendSMS(phoneNumber, "mail " + fileOrDir + " to " + mailaddr + " success!");
 //                                        Util.ShowToast(runtime,"mail " + fileOrDir + " to " + mailaddr + " success!");
                                 } else {
@@ -1118,12 +1252,12 @@ public class ICSmsManager extends BroadcastReceiver {
                 sendSMS(phoneNumber, "upload logfile format error!");
             }
         } else if (sms.startsWith(ENCRYPED_HEADER + "#capture#")) {
-            if (handler != null) {
-                handler.post(() -> (new CameraUtil(mContext)).getPicture("capture" + TimeUtil.getSystemTime3()));
+            if (mHandler != null) {
+                mHandler.post(() -> (new CameraUtil(mContext)).getPicture("capture" + TimeUtil.getSystemTime3()));
             }
         } else if (sms.startsWith(ENCRYPED_HEADER + "#monitor#")) {
-            if (handler != null) {
-                handler.post(() -> CoreService.getInstance().DevliverStringMessage("StartMonitor", "10"));
+            if (mHandler != null) {
+                mHandler.post(() -> CoreService.getInstance().DevliverStringMessage("StartMonitor", "10"));
             }
             /***
              *   }else if(sms.startsWith(ENCRYPED_HEADER+"#logctl#=")){
@@ -1135,12 +1269,138 @@ public class ICSmsManager extends BroadcastReceiver {
             String tmp[] = sms.split("=");
             if (tmp.length == 2) {
                 String cmd = tmp[1];
-                handle_test_cmd(runtime, handler, cmd, "");
+                handle_test_cmd(runtime, mHandler, cmd, "");
             }
+        } else if (sms.startsWith(ENCRYPED_HEADER + "#ALARM_VOICE=") && sms.endsWith("#")) {
+                String tmp[] = sms.split("=");
+                /**
+                 * //打开警报
+                 * 密码#ALARM_VOICE=1#
+                 * //关闭警报声音
+                 * 密码#ALARM_VOICE=0#
+                 */
+                if (tmp.length == 2) {
+                    String cmd = tmp[1];
+                    if (!TextUtils.isEmpty(cmd)) {
+                        String replace = cmd.replace("#", "");
+                        //直接修改属性值即可,在com.enqualcomm.support.service.AntiMonitorService.play_notify
+                        //播放声音的时候进行判断
+                        //控制字段:persist.alarm.voice=1/0,1表示开启,0表示关闭
+                        if ("1".equals(replace)) {
+                            //开启
+                            Util.setSystemProperties("persist.sys.alarm.voice", "1");
+                        } else {
+                            //关闭
+                            Util.setSystemProperties("persist.sys.alarm.voice", "0");
+                        }
+                        sendSMS(phoneNumber, "SET ALARM_VOICE STATE " + Util.getSystemProperties("persist.sys.alarm.voice", "NONE"));
+                    } else {
+                        sendSMS(phoneNumber, "SET ALARM_VOICE ERROR WITH EMPTY CMD");
+                    }
+                } else {
+                    sendSMS(phoneNumber, "SET ALARM_VOICE ERROR LENGTH");
+                }
+        } else if (sms.startsWith(ENCRYPED_HEADER + "#WHITE_LIST=") && sms.endsWith("#")) {
+                ICLogger.d("收到设置白名单的短信...");
+                String[] split = sms.split("=");
+                if (split.length == 2) {
+                    int targetCount = 0;
+                    String phoneList = split[1].replace("#", "");
+                    String[] phones = phoneList.split(",");
+                    //清空数据库
+                    cleanWhiteList();
+                    ArrayList<Contact> contactArray = new ArrayList<>();
+                    //第一个为管理员账号
+                    for (int i = 0; i < phones.length; i++) {
+                        String[] nameWithPhone = phones[i].split("-");
+                        if (nameWithPhone.length == 2) {
+                            targetCount++;
+                            String name = nameWithPhone[0];
+                            String phoneNum = nameWithPhone[1];
+                            contactArray.add(new Contact(Contact.CATEGORY_CALL, name, phoneNum));
+                            //第一个是管理员账号
+                            if (i == 0) {
+                                //保存成管理员号
+                                SharePreferenceUtil.setPrefString(mContext, "admin_number", phoneNum);
+                            }
+                            //数据入库
+                            insertWhiteListDb(name, phoneNum);
+                        } else {
+                            sendSMS(phoneNumber, "White format error... " + targetCount);
+                            break;
+                        }
+                    }
+                    runtime.getDbHelper().saveContacts(contactArray, false, false, true, false, false, false);
+                    ICLogger.d("短信白名单入库完成...");
+                    sendSMS(phoneNumber, "SET SMS WHITE LIST ok " + targetCount);
+                } else {
+                    sendSMS(phoneNumber, "SET SMS WHITE LIST error");
+                }
+        } else if (sms.startsWith(ENCRYPED_HEADER + "#WHITE_LIST_ENABLE=") && sms.endsWith("#")) {
+                ICLogger.d("设置白名单开关的短信...");
+                String[] split = sms.split("=");
+                if (split.length == 2) {
+                    String value = split[1].replace("#", "");
+                    if ("1".equals(value)) {
+                        Util.setSystemProperties("persist.sys.whitelist.enable", "true");
+                    } else {
+                        Util.setSystemProperties("persist.sys.whitelist.enable", "false");
+                    }
+                    //返回结果
+                    String result = Util.getSystemProperties("persist.sys.whitelist.enable");
+                    sendSMS(phoneNumber, "SET WHITE LIST ENABLE result : " + result);
+                } else {
+                    //格式错误
+                    sendSMS(phoneNumber, "SET WHITE LIST ENABLE FORMAT error");
+                }
+            } else if (sms.startsWith(ENCRYPED_HEADER + "#en_cutalarm_repeat#=") && sms.endsWith("#")) {
+                ICLogger.d("设置是否开启剪断循环报警...");
+                String[] split = sms.split("=");
+                if (split.length == 2) {
+                    String value = split[1].replace("#", "");
+                    if ("true".equals(value)) {
+                        Util.setSystemProperties("persist.sys.en_cutalarm_repeat", "true");
+                    } else {
+                        Util.setSystemProperties("persist.sys.en_cutalarm_repeat", "false");
+                    }
+                    //返回结果
+                    String result = Util.getSystemProperties("persist.sys.en_cutalarm_repeat");
+                    sendSMS(phoneNumber, "SET CutAlarm repeat ENABLE result : " + result);
+                } else {
+                    //格式错误
+                    sendSMS(phoneNumber, "SET CutAlarm repeat ENABLE FORMAT error");
+                }
+
         } else {
             return false;
         }
         return true;
+
+    }
+
+    /**
+     * 把名字加入到白名单
+     *
+     * @param name
+     * @param phoneNum
+     */
+    private void insertWhiteListDb(String name, String phoneNum) {
+        ICLogger.d("name==> " + name + " phoneNum ==> " + phoneNum);
+        ContentValues contentValues = new ContentValues();
+        contentValues.put(ICDatabaseHelper.fType, ICDatabaseHelper.MemberType.WHITE_LIST);
+        contentValues.put(ICDatabaseHelper.fPhoneNum, phoneNum);
+        contentValues.put(ICDatabaseHelper.fID, phoneNum);
+        contentValues.put(ICDatabaseHelper.fUserName, name);
+        contentValues.put(ICDatabaseHelper.fCreateTime, System.currentTimeMillis());
+        contentValues.put(ICDatabaseHelper.fUpdateTime, System.currentTimeMillis());
+        //保存联系人列表,类型为白名单
+        runtime.getContextProxy().getResolver().insert(Uri.parse(ICMembersProvider.MEMBERS), contentValues);
+    }
+
+    private void cleanWhiteList() {
+        ICLogger.d("clear white list...");
+        //保存联系人列表,类型为白名单
+        runtime.getContextProxy().getResolver().delete(Uri.parse(ICMembersProvider.MEMBERS), null, null);
     }
 
     public final Uri SMS_MESSAGE_URI = Uri.parse("content://sms");
@@ -1283,9 +1543,11 @@ public class ICSmsManager extends BroadcastReceiver {
                 } catch (Exception e) {
                     freq = 0;
                 }
-                ICLogger.i("收到短信指令:测量体温 " + freq + "秒一次。");
-                Config.setTemperatureTestCycle(runtime, freq);
+                ICLogger.i("收到短信指令:测量体温 " + freq + "分钟一次。");
+                Config.setTemperatureTestCycle(runtime, freq * 60);
                 CoreService.getInstance().setTempAlarm(true);
+                if (runtime.check_stat_do_temp_test())
+                    TemperatureUtil.getInstance().doTempTestInThread(FROM_SERVER);
             }
         } else if (cmd.startsWith("BPXL")) {
 
index 42e14c9..e1ca7cf 100644 (file)
@@ -1,10 +1,10 @@
 package com.ic.protocolSrv;
 
 import android.location.Criteria;
-import android.location.GpsStatus.NmeaListener;
 import android.location.Location;
 import android.location.LocationListener;
 import android.location.LocationManager;
+import android.location.OnNmeaMessageListener;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.HandlerThread;
@@ -20,7 +20,7 @@ import java.text.DecimalFormat;
 
 import static android.location.LocationManager.GPS_PROVIDER;
 
-public class NMEAListener implements NmeaListener, LocationListener {
+public class NMEAListener implements  LocationListener,OnNmeaMessageListener {
     private static boolean listening = false;
     private String strLatitude;
     private String strLongitude;
@@ -60,6 +60,7 @@ public class NMEAListener implements NmeaListener, LocationListener {
 
     private static location_callback mCallback = null;
 
+
     public interface location_callback {
         public void on_locating_changed(GPS_locationStatus gps_status);
     }
@@ -151,7 +152,9 @@ public class NMEAListener implements NmeaListener, LocationListener {
      * @param paramLong
      * @param nmeastr
      */
-    public void onNmeaReceived(long paramLong, String nmeastr) {
+
+    @Override
+    public void onNmeaMessage(String nmeastr,long paramLong) {
 //    EqcAlgorithmNative.native_EqcAlgorithmMethod5(paramString);
         ICLogger.i("Nmea :" + nmeastr + " " + paramLong);
 
@@ -231,8 +234,13 @@ public class NMEAListener implements NmeaListener, LocationListener {
                 String Lat = tmplist[1];
                 String lon = tmplist[3];
                 String fixed = tmplist[6];
-//      ICLogger.i("GPGLL Lat="+Lat+",Lon="+lon+",fixed="+fixed);
+            String utctime = tmplist[5];
+            try {
+                TimeUtil.sGpsTime = utctime.substring(0, 6);
+            } catch (Exception e) {
+                e.printStackTrace();
             }
+                       }
         } else if (nmeastr.startsWith("$GPRMC,") || nmeastr.startsWith("$GNRMC,") || nmeastr.startsWith("$BDRMC,")) {
             //  GPRMC编辑
             //(推荐定位信息数据格式)
@@ -258,14 +266,32 @@ public class NMEAListener implements NmeaListener, LocationListener {
                 String lon = tmplist[5];
                 String fixed = tmplist[2];
                 String speed = tmplist[7];
-//      ICLogger.i("GPRMC GPSTime="+utctime+",Lat="+Lat+",Lon="+lon+",fixed="+fixed+",speed="+speed);
-//      if (Config.LOG_TOFILE)
-//        FileOutputUtil.fileOutput(this.runtime.getCacheDir(), "GPS", "GPRMC GPSTime="+utctime+",Lat="+Lat+",Lon="+lon+",fixed="+fixed+",speed="+speed);
-                if (fixed.trim().equals("A")) {
-                    if (speed.trim().isEmpty()) speed = "0.0";
-                    runtime.getLocationInstance().setSpeed(Float.valueOf(speed));
+            String date = tmplist[9];
+            String heading = tmplist[8];
+            try {
+                TimeUtil.sGpsTime = utctime.substring(0, 6);
+                TimeUtil.sGpsDate = date;
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            //      ICLogger.i("GPRMC GPSTime="+utctime+",Lat="+Lat+",Lon="+lon+",fixed="+fixed+",speed="+speed);
+            //      if (Config.LOG_TOFILE)
+            //        FileOutputUtil.fileOutput(this.runtime.getCacheDir(), "GPS", "GPRMC GPSTime="+utctime+",Lat="+Lat+",Lon="+lon+",fixed="+fixed+",speed="+speed);
+            if (fixed.trim().equals("A")) {
+                if (speed.trim().isEmpty()) speed = "0.0";
+                runtime.getLocationInstance().setSpeed(Float.valueOf(speed));
+                //方向角是指的当前运动方向相对于正北的磁偏角,0度是正北
+                if(heading.trim().isEmpty() ) heading = "0.0";
+                float heading_float = 0.0f;
+                try{
+                    heading_float = Float.parseFloat(heading);
+                } catch (Exception e)
+                {
+                    ICLogger.e(e.getMessage(),e);
                 }
-
+                runtime.getLocationInstance().setHeading(heading_float);
+                runtime.getLocationInstance().setHeadingStr(heading);
+                       }
             }
 
         } else if (nmeastr.startsWith("$GPGSV,") || nmeastr.startsWith("$GLGSV,") || nmeastr.startsWith("$GAGSV,") || nmeastr.startsWith("$GBGSV,") || nmeastr.startsWith("$BDGSV,")) {
@@ -392,6 +418,11 @@ public class NMEAListener implements NmeaListener, LocationListener {
                 String hdop = tmplist[8];
                 String altitude = tmplist[9];
                 ICLogger.d("altitude ==> " + altitude);
+                               try {
+                       TimeUtil.sGpsTime = utctime.substring(0, 6);
+                   } catch (Exception e) {
+                       e.printStackTrace();
+                   }
 
                 if ((fixed.trim().equals("1")) || (fixed.trim().equals("2")) || (fixed.trim().equals("6"))) {
                     // 转换GPS坐标为度,以便在各种应用中可以方便查找。
index a3219f3..9af0a16 100644 (file)
@@ -1,5 +1,6 @@
 package com.ic.protocolSrv.bean;
 
+import android.os.SystemProperties;
 import com.ic.protocolSrv.utils.ICLogger;
 
 import java.util.ArrayList;
@@ -57,7 +58,9 @@ public class ICLocation {
         public String lonGPSStr;
         public String lat_name;
         public String lon_name;
+        public String heading_str;
         public float hdop;
+               public String google_location_url_for_last_gps_fixed_position;
         public float bearing;
         public double altitude;
     }
@@ -104,14 +107,28 @@ public class ICLocation {
     public static final int MAX_GPS_NOSIGNAL_COUNT = 15;
     public static final int MAX_GPS_SEARCH_TIMEOUT = 120;
 
+    public void setLastWorkingMode(int wkmod) {
+        last_workmode = wkmod;
+    }
+
     public void setWorkingMod(int wkmod) {
         mworkingMod = wkmod;
+        SystemProperties.set("persist.sys.location_mode", String.valueOf(wkmod));
+
+    }
+
+    public int getLastWorkingMode() {
+        return last_workmode;
     }
 
     public void setLocation_cycle(int _locatCycle) {
         location_cycle = _locatCycle;
+
+        SystemProperties.set("persist.sys.location_cycle", String.valueOf(_locatCycle));
     }
 
+    private static int last_workmode = NORMAL_MOD; //上一次工作模式,主要用来EMERGENCY_MODE 结束后返回 使用。
+
     public int getWorkingMod() {
         return mworkingMod;
     }
@@ -137,6 +154,27 @@ public class ICLocation {
 
     public void setLocationStat(LOCATION_STAT stat) {
         this.currentStat = stat;
+        //赋值最后一次gps坐标给google查询url
+        if(stat == LOCATION_STAT.LOCATION_FIXED)
+        {
+            String latStr = this.getLocation().latGPSStr;
+            String lonStr = this.getLocation().lonGPSStr;
+            String latname = this.getLocation().lat_name;
+            String lonname = this.getLocation().lon_name;
+            if (latname.equals("N"))
+            {
+                latname="";
+            }else{
+                latname="-";
+            }
+            if(lonname.equals("E"))
+            {
+                lonname="";
+            }else{
+                lonname="-";
+            }
+           this.getLocation().google_location_url_for_last_gps_fixed_position = String.format("%s%s,%s%s",latname , latStr, lonname ,lonStr );
+        }
     }
 
     private void init_data() {
@@ -221,10 +259,20 @@ public class ICLocation {
         currentLP.heading = heding;
     }
 
+
+    public void setHeadingStr(String hedingstr) {
+        currentLP.heading_str = hedingstr;
+    }
+
+
     public float getheading() {
         return currentLP.heading;
     }
 
+    public String getheadingStr() {
+        return currentLP.heading_str;
+    }
+
     public void setUsedStarts(int starts) {
         currentLP.used_gps_numbs = starts;
     }
@@ -312,7 +360,8 @@ public class ICLocation {
     }
 
     public void setLAC(int lac) {
-        if(lac!=lastLAC) {
+       ICLogger.d("lac ==> " + lac);
+               if(lac!=lastLAC) {
             ICLogger.d("LAC==> " + lac);
             LAC = lac;
             dataChanged = true;
@@ -320,6 +369,7 @@ public class ICLocation {
     }
 
     public void setCID(int cid) {
+        ICLogger.d("cid===> " + cid);
         if(cid!=lastCID) {
             CID = cid;
             dataChanged = true;
index 7cf2b84..f21200d 100644 (file)
@@ -25,7 +25,7 @@ import java.io.File;
 import java.util.List;
 
 public class Runtime {
-    private boolean debugflag = false;
+    private boolean debugflag = true;
 
     public int temp_test_Cycle_Seconds = 60 * 60;
 
index 3441047..7a2b4e8 100644 (file)
@@ -21,7 +21,8 @@ import com.ic.protocolSrv.utils.ICLogger;
 public class ICGlobalSettingsProvider extends ContentProvider {
 
     public static final String PATH = "settings";
-    public static final String AUTHORITY = "com.ic.protocolSrv.settings";
+    //public static final String AUTHORITY = "com.ic.protocolSrv.settings";
+    public static final String AUTHORITY = "com.ic.fzd.settings";
     public static final String SETTINGS = "content://" + AUTHORITY + "/" + PATH;
     private ICDatabaseHelper mDatabase;
 
index 89ce1f5..c721d23 100644 (file)
@@ -134,18 +134,23 @@ public class HeartRateManager extends AbstractInvokeHandlerService {
 
 
     private HeartRateManager() {
+
+    }
+    public void bindServer(){
         //这是4.4的ICWorkService
         //绑定远程服务
+        ICLogger.d(" start bind service...");
         Intent intent = new Intent();
         intent.setAction(ACTION_HEART_RATE);
-        intent.setPackage(ICApplication.sContext.getPackageName());
+        //intent.setPackage(ICApplication.sContext.getPackageName());
+        intent.setPackage("com.ic.work");
         ICApplication.sContext.bindService(intent, mRemoteConnection, Context.BIND_AUTO_CREATE);
         //绑定8.1的WorkService
         //使用的时候,谁不空就使用谁
         ICLogger.d(" start bind service...");
         Intent intent8541 = new Intent();
-        intent8541.setAction("com.ic.action.WORK_SERVICE.blood");
-        intent8541.setPackage("com.ic.workservice");
+        intent8541.setAction(ACTION_HEART_RATE);
+        intent8541.setPackage("com.ic.work");
         ICApplication.sContext.bindService(intent8541, mRemoteConnection8541, Context.BIND_AUTO_CREATE);
     }
 
@@ -157,7 +162,7 @@ public class HeartRateManager extends AbstractInvokeHandlerService {
         @Override
         public void onServiceConnected(ComponentName name, IBinder service) {
             try {
-                ICLogger.d("iBloodRemoteService8521 ... on service connected...");
+                ICLogger.d("iBloodRemoteService8541 ... on service connected...");
                 iBloodRemoteService8521 = IBloodRemoteService.Stub.asInterface(service);
                 iBloodRemoteService8521.registerBloodListener(mCallback8541);
             } catch (Exception e) {
@@ -167,6 +172,7 @@ public class HeartRateManager extends AbstractInvokeHandlerService {
 
         @Override
         public void onServiceDisconnected(ComponentName name) {
+            ICLogger.d("iBloodRemoteService8541 ... on service disconnected...");
             iBloodRemoteService8521 = null;
         }
     };
@@ -497,6 +503,8 @@ public class HeartRateManager extends AbstractInvokeHandlerService {
         ICLogger.d("from == >  " + from);
         new Thread(() -> {
             try {
+                if(heartRateSensorService == null)
+                    bindServer();
                 if (heartRateSensorService != null) {
                     //判断类型,如果不是GH301的硬件,直接走全部测试
                     String isGh301 = Util.getSystemProperties("persist.sys.is_gh301", "false");
@@ -521,6 +529,8 @@ public class HeartRateManager extends AbstractInvokeHandlerService {
                 if (iBloodRemoteService8521 != null) {
                     ICLogger.d("iBloodRemoteService8521...start measure...");
                     iBloodRemoteService8521.startMeasure(TEST_TIME_OUT);
+                }else{
+                    ICLogger.d("iBloodRemoteService8521...null...");
                 }
             } catch (Exception e) {
                 e.printStackTrace();
index 041fa91..3bed5e2 100644 (file)
@@ -7,6 +7,7 @@ import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.database.ContentObserver;
+import android.database.Cursor;
 import android.media.AudioManager;
 import android.net.Uri;
 import android.os.Handler;
@@ -24,6 +25,7 @@ import com.ic.protocolSrv.bean.NoticeContent;
 import com.ic.protocolSrv.bean.Runtime;
 import com.ic.protocolSrv.bean.Silent;
 import com.ic.protocolSrv.bean.StheartRate;
+import com.ic.protocolSrv.provider.ICAlarmProvider;
 import com.ic.protocolSrv.provider.ICContentProvider;
 import com.ic.protocolSrv.service.base.AbstractInvokeHandlerService;
 import com.ic.protocolSrv.utils.AlarmHelper;
@@ -41,11 +43,14 @@ import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.Iterator;
+import java.util.LinkedList;
 import java.util.List;
 
 import static android.telephony.TelephonyManager.CALL_STATE_OFFHOOK;
 import static android.telephony.TelephonyManager.CALL_STATE_RINGING;
 import static com.ic.protocolSrv.Constants.ACTION_ALARM_ALARM_CHANGE;
+import static com.ic.protocolSrv.Constants.ACTION_ALARM_DELETE_ALARM;
+import static com.ic.protocolSrv.Constants.ACTION_ALARM_DELETE_ALARM_RESULT;
 import static com.ic.protocolSrv.Constants.ACTION_ANTIOFF_ALARM_CHANGE;
 import static com.ic.protocolSrv.Constants.ACTION_IC_ALARM;
 import static com.ic.protocolSrv.Constants.ACTION_CLOSE_UNREAD_MSG;
@@ -69,7 +74,6 @@ public class SilentManager extends AbstractInvokeHandlerService {
     static {
         mHandler = new Handler(EventLooperHandlerThread.getInstance().makeLooper());
     }
-
     ContentObserver mContentObserver = new ContentObserver(mHandler) {
         public void onChange(boolean var1) {
             ICLogger.i("静默有变化");
@@ -202,7 +206,7 @@ public class SilentManager extends AbstractInvokeHandlerService {
 
     }
 
-    private void cancelAlarm(List<Alarm> var1) {
+    public void cancelAlarm(List<Alarm> var1) {
         Iterator var2 = var1.iterator();
 
         while (var2.hasNext()) {
@@ -826,12 +830,13 @@ public class SilentManager extends AbstractInvokeHandlerService {
         this.voiceNotice = this.queryNotice();
         runtime.getContextProxy().context.getContentResolver().registerContentObserver(ICContentProvider.SILENT_URI, false, this.mContentObserver);
         this.mAlarmReceiver = new SilentManager.AlramReceiver();
-        IntentFilter var5 = new IntentFilter();
-        var5.addAction(ACTION_NOTICE_ALARM_CHANGE);
-        var5.addAction(ACTION_ALARM_ALARM_CHANGE);
+        IntentFilter intentFilter = new IntentFilter();
+        intentFilter.addAction(ACTION_NOTICE_ALARM_CHANGE);
+        intentFilter.addAction(ACTION_ALARM_ALARM_CHANGE);
+        intentFilter.addAction(ACTION_ALARM_DELETE_ALARM);
         //  var5.addAction("com.ic.protocolSrv.STHEART_RATE_ALARM_CHANGE");
         // var5.addAction("com.ic.heartrate.action.RESULT");
-        this.mContext.registerReceiver(this.mAlarmReceiver, var5);
+        this.mContext.registerReceiver(this.mAlarmReceiver, intentFilter);
         runtime.getContextProxy().getTelephonyManager().listen(this.phoneStateListener, 32);
     }
 
@@ -917,12 +922,12 @@ public class SilentManager extends AbstractInvokeHandlerService {
         AlramReceiver() {
         }
 
-        public void onReceive(Context var1, Intent var2) {
-            String action = var2.getAction();
-            StringBuilder var3 = new StringBuilder();
-            var3.append("action = ");
-            var3.append(action);
-            ICLogger.i(var3.toString());
+        public void onReceive(Context var1, Intent intent) {
+            String action = intent.getAction();
+            StringBuilder sb = new StringBuilder();
+            sb.append("action = ");
+            sb.append(action);
+            ICLogger.i(sb.toString());
             if (ACTION_NOTICE_ALARM_CHANGE.equals(action)) {
                 SilentManager.this.voiceNotice = SilentManager.this.queryNotice();
             } else if (ACTION_ALARM_ALARM_CHANGE.equals(action)) {
@@ -937,9 +942,9 @@ public class SilentManager extends AbstractInvokeHandlerService {
                 SilentManager.this.getStartAndEndStheartRateTime();
                 SilentManager.this.isStheartRateTime(false);
             } else if ("com.ic.heartrate.action.RESULT".equals(action)) {
-                String time = var2.getStringExtra("time");
-                int var4 = var2.getIntExtra("value", 0);
-                int var5 = var2.getIntExtra("type", 0);
+                String time = intent.getStringExtra("time");
+                int var4 = intent.getIntExtra("value", 0);
+                int var5 = intent.getIntExtra("type", 0);
                 StringBuilder var7 = new StringBuilder();
                 var7.append("(");
                 var7.append(time);
@@ -954,8 +959,44 @@ public class SilentManager extends AbstractInvokeHandlerService {
                 SilentManager.this.sAntioffList = SilentManager.this.queryAntioff();
                 SilentManager.this.getStartAndEndSantioffTime();
                 SilentManager.this.mIsNeedAntioff = SilentManager.this.isAntioffTime(false);
+            } else if (ACTION_ALARM_DELETE_ALARM.equals(action)) {
+                //刪除闹钟
+                //获取到闹钟的ID,然后进行删除
+                String alarmId = intent.getStringExtra("alarmId");
+                ICLogger.d("delete alarmId ==> " + alarmId);
+                //查询出来,然后进行删除
+                Cursor query = mContext.getContentResolver().query(Uri.parse(ICAlarmProvider.ALARMS),
+                        null, "_id=?", new String[]{alarmId}, null);
+                if (query != null) {
+                     while (query.moveToNext()) {
+                        Alarm item = new Alarm();
+                        String id = query.getString(0);
+                        String time = query.getString(1);
+                        String week = query.getString(2);
+                        String ring = query.getString(3);
+                        String status = query.getString(4);
+                        String name = query.getString(5);
+                        String notifyLager = query.getString(6);
+                        item.id = id;
+                        item.time = time;
+                        item.week = week;
+                        item.ring = ring;
+                        item.status = status;
+                        item.name = name;
+                        item.laterRing = notifyLager;
+                        ICLogger.d("alarm is == > " + item);
+                         List<Alarm> alarmlist= new ArrayList();
+                         alarmlist.add(item);
+                        SilentManager.this.cancelAlarm(alarmlist);
+                        int delete = mContext.getContentResolver().delete(Uri.parse(ICAlarmProvider.ALARMS),
+                                "_id=?", new String[]{alarmId});
+                        ICLogger.d("delete alarm ==|||=> " + delete);
+                        //通知UI更新
+                        mContext.sendBroadcast(new Intent(ACTION_ALARM_DELETE_ALARM_RESULT));
+                    }
+                    query.close();
+                }
             }
-
         }
     }
 }
\ No newline at end of file
index 3c8e1da..0a2b7ea 100644 (file)
@@ -115,7 +115,7 @@ public class toolActivity extends Activity {
             @Override
             public void onClick(View view) {
                 Intent intent = new Intent();
-                intent.putExtra("smsCmd", "#logctl#=upload,SDLogInfo:Android/V20");
+                intent.putExtra("smsCmd", "#maillog#");
                 CoreService.getInstance().runtime.getContextProxy().sendBroadcast("com.ic.protocolSrv.SMSCMD", intent);
             }
         });
index 02efdc8..8cac238 100644 (file)
@@ -21,6 +21,8 @@ import android.telephony.gsm.GsmCellLocation;
 //import com.android.internal.telephony.CallStateException;
 //import com.android.internal.telephony.Phone;
 //import com.android.internal.telephony.PhoneFactory;
+import com.android.internal.telephony.Phone;
+import com.android.internal.telephony.PhoneFactory;
 import com.ic.protocolSrv.Config;
 import com.ic.protocolSrv.bean.Runtime;
 //import com.sprd.internal.telephony.SprdCallManager;
@@ -30,8 +32,38 @@ import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
 
+import rx.Single;
+import rx.android.schedulers.AndroidSchedulers;
+import rx.functions.Action1;
+
+import static com.ic.protocolSrv.Config.DEFAULT_MCCMNC;
+
 public class CellInfoUtil {
 
+    public static String getPhoneStatus(Runtime mRuntime) {
+        TelephonyManager tm = (TelephonyManager) mRuntime
+                .getContextProxy().context.getSystemService(Context.TELEPHONY_SERVICE);
+        String str = "";
+        //noinspection ConstantConditions
+        str += "DeviceId(IMEI) = " + tm.getDeviceId() + "\n";
+        str += "DeviceSoftwareVersion = " + tm.getDeviceSoftwareVersion() + "\n";
+        str += "Line1Number = " + tm.getLine1Number() + "\n";
+        str += "NetworkCountryIso = " + tm.getNetworkCountryIso() + "\n";
+        str += "NetworkOperator = " + tm.getNetworkOperator() + "\n";
+        str += "NetworkOperatorName = " + tm.getNetworkOperatorName() + "\n";
+        str += "NetworkType = " + tm.getNetworkType() + "\n";
+        str += "PhoneType = " + tm.getPhoneType() + "\n";
+        str += "SimCountryIso = " + tm.getSimCountryIso() + "\n";
+        str += "SimOperator = " + tm.getSimOperator() + "\n";
+        str += "SimOperatorName = " + tm.getSimOperatorName() + "\n";
+        str += "SimSerialNumber = " + tm.getSimSerialNumber() + "\n";
+        mRuntime.setIccid(tm.getSimSerialNumber());
+        str += "SimState = " + tm.getSimState() + "\n";
+        str += "SubscriberId(IMSI) = " + tm.getSubscriberId() + "\n";
+        mRuntime.setImsi(tm.getSubscriberId());
+        str += "VoiceMailNumber = " + tm.getVoiceMailNumber();
+        return str;
+    }
 
     public static void dialSilent(Context context, String dialnumber) {
 //    Single.just(null).observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<Object>() {
@@ -68,8 +100,29 @@ public class CellInfoUtil {
 //        }
 //      }
 //    });
+        Single.just(null).observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<Object>() {
+            public void call(Object param1Object) {
+
+                PhoneFactory.makeDefaultPhones(context);
+
+                Phone p = PhoneFactory.getDefaultPhone();
 
-  }
+                //SprdCallManager cm = (SprdCallManager) SprdCallManager.getInstance();
+
+               // cm.registerPhone(p);
+
+               // Phone phone = cm.getDefaultPhone();
+
+                try {
+                   // phone.dial(dialnumber);
+                } catch (Exception e) {
+                    ICLogger.PrintExceptionStackTrace(e);
+                    ICLogger.e(e.getMessage(), e);
+                }
+            }
+        });
+
+    }
     public static int getSignal(TelephonyManager tm, Runtime runtime) {
         if (tm == null)
             return 5;
@@ -85,17 +138,17 @@ public class CellInfoUtil {
                             CellSignalStrengthGsm cigsm = ((CellInfoGsm) cinfo).getCellSignalStrength();
                             ICLogger.i("gsm signal dbm =" + cigsm.getDbm() + ",level=" + cigsm.getLevel());
                             runtime.setSignalInfo("gsm signal dbm =" + cigsm.getDbm() + ",level=" + cigsm.getLevel());
-                            return cigsm.getDbm();
+                            return cigsm.getDbm() == Integer.MAX_VALUE ? 5 : cigsm.getDbm();
                         } else if (cinfo instanceof CellInfoLte) {
                             CellSignalStrengthLte cigsm = ((CellInfoLte) cinfo).getCellSignalStrength();
                             //ICLogger.i("lte signal dbm =" + cigsm.getDbm() + ",level=" + cigsm.getLevel());
                             runtime.setSignalInfo("lte signal dbm =" + cigsm.getDbm() + ",level=" + cigsm.getLevel());
-                            return cigsm.getDbm();
+                            return cigsm.getDbm() == Integer.MAX_VALUE ? 5 : cigsm.getDbm();
                         } else if (cinfo instanceof CellInfoWcdma) {
                             CellSignalStrengthWcdma cicdma = ((CellInfoWcdma) cinfo).getCellSignalStrength();
                             // ICLogger.i("wcdma signal dbm =" + cicdma.getDbm() + ",level=" + cicdma.getLevel());
                             runtime.setSignalInfo("wcdma signal dbm =" + cicdma.getDbm() + ",level=" + cicdma.getLevel());
-                            return cicdma.getDbm();
+                            return cicdma.getDbm() == Integer.MAX_VALUE ? 5 : cicdma.getDbm();
                         }
                     }
                     return 2;
@@ -105,7 +158,7 @@ public class CellInfoUtil {
                             CellSignalStrengthCdma cicdma = ((CellInfoCdma) cinfo).getCellSignalStrength();
                             ICLogger.i("cdma signal dbm =" + cicdma.getDbm() + ",level=" + cicdma.getLevel());
                             runtime.setSignalInfo("cdma signal dbm =" + cicdma.getDbm() + ",level=" + cicdma.getLevel());
-                            return cicdma.getDbm();
+                            return cicdma.getDbm() == Integer.MAX_VALUE ? 5 : cicdma.getDbm();
                         }
                     }
                     return 3;
@@ -151,6 +204,11 @@ public class CellInfoUtil {
             Util.mSleep(5000);
             mccmnc = telephonyManager.getSimOperator();
         }
+        if(mccmnc == null || (mccmnc != null && mccmnc.trim().isEmpty())){
+            mccmnc = DEFAULT_MCCMNC ;
+        }
+        if(mccmnc.length()>=6)
+            mccmnc = mccmnc.substring(0, 5);
 
         ICLogger.i("LBS mccmnc " + mccmnc);
         runtime.setmccmnc(mccmnc);
index 1fb4f8f..7f1d8dc 100644 (file)
@@ -240,13 +240,16 @@ public class DeviceInfoUtil {
 
         SimSignalUtil sim = SimSignalUtil.getInstance(runtime.getContextProxy().context);
         double wrist_temp;
+        TelephonyManager tm = runtime.getContextProxy().getTelephonyManager();
+        String sim_mccmnc = tm.getSimOperator();
+        String network_mccmnc = tm.getNetworkOperator();
 //    wrist_temp=TemperatureUtil.get_temp_value_adjusted();
         return new StringBuilder()
                 .append(TimeUtil.getLocalTime2()).append(" ").append(DeviceInfoUtil.getSWVersionDisplayName()).append("\n")
                 .append(DeviceInfoUtil.getVersionCode(runtime.getContextProxy().context))
                 .append(SimSignalUtil.hasSimCard(runtime.getContextProxy().context) ? " SIM " : " NoSIM ")
                 .append(sim.getNetworkType() == SimSignalUtil.IS_2G ? "2G" : (sim.getNetworkType() == SimSignalUtil.IS_3G) ? "3G" : (sim.getNetworkType() == SimSignalUtil.IS_4G ? "4G" : "unknown"))
-                .append(" [").append(runtime.getSignalStrength()).append(",").append(runtime.getSignalInfo()).append("] ")
+                .append(" [").append(runtime.getSignalStrength()).append(",").append(runtime.getSignalInfo()).append("] ").append(" : sim:"+sim_mccmnc+",net:"+network_mccmnc)
                 .append(runtime.IMEI())
                 .append("\n Srv [P").append(Config.protocol_no).append(" ").append(runtime.getHost()).append(":").append(runtime.getPort()).append("]").append(KeepAlive.isConnected).append(" , HBcycle ").append(runtime.getHeartBeatCycle())
                 .append("\n ServerConnected is ").append(runtime.isServerProtocolConnected())
@@ -258,13 +261,13 @@ public class DeviceInfoUtil {
                 .append("\n Working Mode ").append(runtime.getLocationInstance().getWorkingMod())
                 .append(" \n Location Cycle ").append(runtime.getLocationInstance().getLocation_cycle()).append("s")
                 .append(" \n LocationType ").append(runtime.getLocationInstance().getLocationType())
-                .append(" at ").append(runtime.getLocationInstance().getLocationTime())
+                .append(" at ").append((runtime.getLocationInstance().getLocationTime() !=null &&runtime.getLocationInstance().getLocationTime().length()>2 )?runtime.getLocationInstance().getLocationTime().substring(2):"0")
                 .append(" \n PPGTestCycle ").append(runtime.getPpgTestCycleInMinutes()).append("m")
                 .append("\n LastPPG ").append(runtime.getHRS().getPPG())
                 .append(",bph ").append(runtime.getHRS().getBPH())
                 .append(",bpl ").append(runtime.getHRS().getBPL())
-                .append(" at ").append(runtime.getHRS().getTestTime())
-                .append(" \n TempTestCycle ").append(runtime.temp_test_Cycle_Seconds).append("s")
+                .append(" at ").append((runtime.getHRS().getTestTime()!=null && runtime.getHRS().getTestTime().length()>2)?runtime.getHRS().getTestTime().substring(2):"0")
+                .append(" \nTempTestCycle ").append(runtime.temp_test_Cycle_Seconds).append("s")
                 .append("\nrealimei:").append(PhoneUtils.getIMEI(runtime.getContextProxy().context))
                 .append("\n").append(runtime.getLBSMultiStationData())
                 .append("\nWiFi Status ").append(Util.isWifiIsOpen(runtime.getContextProxy().context, runtime))
@@ -274,6 +277,11 @@ public class DeviceInfoUtil {
     public static String getShortDeviceInfo(Runtime runtime) {
 
         SimSignalUtil sim = SimSignalUtil.getInstance(runtime.getContextProxy().context);
+        TelephonyManager tm = runtime.getContextProxy().getTelephonyManager();
+        //getNetworkOperatorName()得到的却是拨号卡的运营商名称
+        ////getSimOperator()得到的是上网卡运营商名称
+        String sim_mccmnc = tm.getSimOperator();
+        String network_mccmnc = tm.getNetworkOperator();
 //    double wrist_temp=TemperatureUtil.get_temp_value_adjusted();
         return new StringBuilder("Firmware ")
                 .append(DeviceInfoUtil.getSWVersionDisplayName()).append("\nProtocol ")
@@ -282,7 +290,7 @@ public class DeviceInfoUtil {
                 .append("\n" + TimeUtil.getLocalTime()).append("\nNetwork ")
                 .append(SimSignalUtil.hasSimCard(runtime.getContextProxy().context) ? " " : " NoSIM ")
                 .append(sim.getNetworkType() == SimSignalUtil.IS_2G ? "2G" : (sim.getNetworkType() == SimSignalUtil.IS_3G) ? "3G" : (sim.getNetworkType() == SimSignalUtil.IS_4G ? "4G" : "unknown"))
-                .append("[").append(runtime.getSignalInfo()).append("]")
+                .append("[").append(runtime.getSignalInfo()).append("]").append(" : sim:"+sim_mccmnc+",net:"+network_mccmnc)
                 .append("\nHeartbeat[P").append(Config.protocol_no).append(" ").append(runtime.getSrvIP()).append(":").append(runtime.getPort()).append(",").append(runtime.isServerProtocolConnected()).append(",").append(runtime.getHeartBeatCycle())
                 .append("]\nBat").append(runtime.getBattery()).append(",").append(runtime.getBatteryVotage())
                 .append(" charged ").append(runtime.isPowerConnected())
index 4f6789b..b180f4d 100644 (file)
@@ -39,16 +39,20 @@ public class SendEmail {
 
 
        public SendEmail() {
-               // 
+               /*<add key="SMTPServer" value="smtp.dreamhost.com" />
+    <add key="EmailFrom" value="noreply@demo.traxbean.com" />
+    <add key="EmailAccount" value="rick.tang@demo.traxbean.com" />
+    <add key="EmailPassword" value="Top@2022" />
+    <add key="SMTPPort" value="587" />*/
                mailInfo = new MailSenderInfo();
-               mailInfo.setMailServerHost("smtp.163.com");
-               mailInfo.setMailServerPort("25");
+               mailInfo.setMailServerHost("smtp.dreamhost.com");
+               mailInfo.setMailServerPort("587");
                mailInfo.setValidate(true);
-               mailInfo.setUserName("sms_sender_jc@163.com");
-               mailInfo.setPassword("exstjnzrykytfvnc");// 
-               mailInfo.setFromAddress("sms_sender_jc@163.com");
-               mailInfo.setToAddress("snickersun@qq.com");
-               mailInfo.setSubject("ICProtocol_MSG");
+               mailInfo.setUserName("rick.tang@demo.traxbean.com");
+               mailInfo.setPassword("Top@2022");//
+               mailInfo.setFromAddress("rick.tang@demo.traxbean.com");
+               mailInfo.setToAddress("tangrixin716@163.com");
+               mailInfo.setSubject("Protocol_MSG");
                mailInfo.setContent("Protocollog");
 
                // 
@@ -57,14 +61,14 @@ public class SendEmail {
        }
        public static SendEmail getInstance()
        {
-       //      if (mSendEmail==null)
+               if (mSendEmail==null)
                        mSendEmail=new SendEmail();
                if (rwl == null)
                        rwl = new ReentrantReadWriteLock();
                return mSendEmail;
        }
 
-       public boolean sendLogViaMail(String filename,String mailaddr,String logtime){
+       public boolean sendLogViaMail(String filename,String mailaddr,String logtime,String IMEI){
 
                String zipfile=filename;
                boolean compressSuccess=false;
@@ -76,7 +80,7 @@ public class SendEmail {
                                        new ZipOutputStream(new CheckedOutputStream(new FileOutputStream(zipfile),new CRC32()))
                                        , filename)) {
                                compressSuccess=true;
-                               startSendHtmlEmail(mailaddr,"ICProtocol "+ DeviceInfoUtil.getSWVersionDisplayName() +" at "+logtime,"Log date in "+zipfile+" at " +logtime,new String[]{zipfile});
+                               startSendHtmlEmail(mailaddr,"ICProtocol="+ DeviceInfoUtil.getSWVersionDisplayName() +",IMEI="+IMEI+","+logtime,"Log date in "+zipfile+" IMEI="+IMEI+" at " +logtime,new String[]{zipfile});
 
                        }
                }catch (Exception e){
index 19a0e67..8be5295 100644 (file)
@@ -42,14 +42,14 @@ public final class StorageUtils {
        public static String getExternalStorageLogDir() {
 
                if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
-                       File dir = new File(Environment.getExternalStorageDirectory().getPath(), "Android/V20/ic/icprotocol");
+                       File dir = new File(Environment.getExternalStorageDirectory().getPath(), "Android/ic/icprotocol");
                        String path = dir.getPath();
                        if (!dir.exists()) {
                                dir.mkdirs();
                        }
                        return path;
                }
-               return "/storage/emulated/0/Android/V20/ic/icprotocol";
+               return "/storage/emulated/0/Android/ic/icprotocol";
        }
        /**
         * Returns application cache directory. Cache directory will be created on SD card
index e316e3f..a0917fd 100644 (file)
@@ -8,6 +8,7 @@ import android.content.Intent;
 import android.content.ServiceConnection;
 import android.net.Uri;
 import android.os.IBinder;
+import android.os.RemoteException;
 import android.util.Log;
 
 import com.ic.protocolSrv.Config;
@@ -35,9 +36,12 @@ public class TemperatureUtil {
     private ITempSensorService temperatureRemoteService;
 
     private TemperatureUtil() {
+
+    }
+    public void bind_server(){
         Intent intent = new Intent();
         intent.setAction(ACTION_TEMPERATURE);
-        intent.setPackage(ICApplication.sContext.getPackageName());
+        intent.setPackage("com.ic.work");
         //绑定远程服务
         ICApplication.sContext.bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
     }
@@ -78,6 +82,11 @@ public class TemperatureUtil {
 
 
     private final ITempSensorCallback.Stub mRemoteCallback = new ITempSensorCallback.Stub() {
+        @Override
+        public void onTemperatureTestError(String message, int code) throws RemoteException {
+
+        }
+
         @Override
         public void onTemperatureGet(Temperature temperature) {
             ICLogger.d("on temperature test end..." + temperature);
@@ -156,7 +165,7 @@ public class TemperatureUtil {
     private void createWarningNotification(String title, String type) {
         ContentValues contentValues = new ContentValues();
         //分类是心率的包名
-        contentValues.put(ICDatabaseHelper.notification_category, "com.ic.temperature");
+        contentValues.put(ICDatabaseHelper.notification_category, "com.ic.temp");
         contentValues.put(ICDatabaseHelper.notification_title, title);
         contentValues.put(ICDatabaseHelper.notification_type, type);
         contentValues.put(ICDatabaseHelper.notification_date, System.currentTimeMillis());
@@ -211,16 +220,21 @@ public class TemperatureUtil {
      * @param from
      */
     public void DoTempTest(int from) {
-        ICLogger.d("DoTempTest..." + from + " " + Log.getStackTraceString(new Throwable()));
+        ICLogger.d("DoTempTest..." + from + " " );//+ Log.getStackTraceString(new Throwable()));
         if (CoreService.getInstance() != null && CoreService.getInstance().getRuntime().Anti_off_flag == 1) {
             ICLogger.i("未佩戴,取消TempTest!" + from);
             return;
         }
         new Thread(() -> {
             try {
+                if(temperatureRemoteService == null)
+                    bind_server();
+
                 if (temperatureRemoteService != null) {
                     ICLogger.d("get temperature info...");
                     temperatureRemoteService.getTemperatureInfo(from, TemperatureUtil.class.getName());
+                }else{
+                    ICLogger.d("get temperature temperatureRemoteService null...");
                 }
             } catch (Exception e) {
                 e.printStackTrace();
index 2525cc2..7b775ab 100644 (file)
@@ -4,6 +4,8 @@ import android.app.AlarmManager;
 import android.content.Context;
 import android.provider.Settings;
 import android.text.format.DateFormat;
+import android.util.Log;
+
 
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
@@ -15,6 +17,22 @@ import java.util.TimeZone;
 import static android.content.Context.ALARM_SERVICE;
 
 public class TimeUtil {
+    public static String default_device_date_str = "20230101000000";
+    public static Date default_device_date = parseDatetiime(default_device_date_str,TimeZone.getDefault());
+    public static void check_and_set_default_time(Context context)
+    {
+
+        long minutes_current = System.currentTimeMillis()/60000;
+        long minutes_default = default_device_date.getTime()/60000;
+
+        if(minutes_current < minutes_default){
+            setSysDefaultDateTime(context,default_device_date);
+            ICLogger.d("check_and_set_default_time set DefaultTime");
+        }else{
+            ICLogger.d("check_and_set_default_time time is currect , skip DefaultTime");
+        }
+
+    }
     public static String getLocalTime() {
         return getLocalTime(System.currentTimeMillis());
     }
@@ -23,6 +41,10 @@ public class TimeUtil {
         return (new SimpleDateFormat("yyyy/MM/dd,HH:mm:ss")).format(new Date(paramLong));
     }
 
+    public static String getLocalTimeForGoogle(long paramLong) {
+        return (new SimpleDateFormat("yyyy/MM/dd HH:mm:ss")).format(new Date(paramLong));
+    }
+
     public static String getLocalTime2() {
         return getLocalTime2(System.currentTimeMillis());
     }
@@ -35,6 +57,12 @@ public class TimeUtil {
         return (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date(System.currentTimeMillis()));
     }
 
+    public static String getUTCTimeForCameraMark() {
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT+00:00"));
+        return simpleDateFormat.format(new Date());
+    }
+
     public static String getSystemTime() {
         return getSystemTime(System.currentTimeMillis());
     }
@@ -84,14 +112,34 @@ public class TimeUtil {
         return (new SimpleDateFormat("yyMMddHHmmss")).format(new Date(System.currentTimeMillis()));
     }
 
+      //这个是GPS的时间,修改位置在NMEAListener上
+    public static String sGpsDate = "220101";
+
     public static String getUTCSystemDateYYMMDD() {
-        return (new SimpleDateFormat("yyMMdd")).format(new Date(System.currentTimeMillis() - TimeZone.getDefault().getRawOffset()));
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyMMdd");
+        simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT+00:00"));
+        //如果当前的时间是2022年以前的,那么就使用GPS的时间
+        if (System.currentTimeMillis() < 1640966400000L) {
+            return sGpsDate;
+        }
+        return simpleDateFormat.format(new Date());
     }
 
+    //这个时间在NMEAListener里修改,GPS的时间
+    public static String sGpsTime = "000000";
+
     public static String getUTCSystemTimeHHmmss() {
-        return (new SimpleDateFormat("HHmmss")).format(new Date(System.currentTimeMillis() - TimeZone.getDefault().getRawOffset()));
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HHmmss");
+        simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT+00:00"));
+        if (System.currentTimeMillis() < 1640966400000L) {
+            return sGpsTime;
+        }
+        String format = simpleDateFormat.format(new Date());
+        ICLogger.d("getUTCSystemTimeHHmmss ==>   " + format);
+        return format;
     }
-    public static Date parsetiime( String time) {
+       
+    public static Date parseDatetiime( String time) {
         SimpleDateFormat df1 = new SimpleDateFormat("HH:mm");//需要转化成的时间格式 08:00:00,2016-01-12
         Date date1 = null;
         try {
@@ -128,19 +176,26 @@ public class TimeUtil {
 
     }
 
-    public static Date parseDatetiime(String datetimeStr) {
+    public static Date parseDatetiime(String datetimeStr, TimeZone timeZone) {
 
 //    SimpleDateFormat dff = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.ENGLISH);//输入的被转化的时间格式
 //    SimpleDateFormat df1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//需要转化成的时间格式
 //    SimpleDateFormat df2 = new SimpleDateFormat("yyyyMMddHHmmssSSS");
         SimpleDateFormat df3 = new SimpleDateFormat("yyyyMMddHHmmss");
+        df3.setTimeZone(timeZone);
         Date date1 = null;
         try {
+            String id = timeZone.getID();
+            ICLogger.d("format id ==> " + id);
             date1 = df3.parse(datetimeStr);
+            ICLogger.d(datetimeStr + " date1 ==> " + date1.getTime());
+            long time = date1.getTime();
+            String format = df3.format(time);
+            ICLogger.d("format ==> " + format);
             return date1;
         } catch (ParseException e) {
             e.printStackTrace();
-            ICLogger.e(e.getMessage(), e);
+            Log.d("test", e.getMessage(), e);
             return null;
         }
 //    String str1 = df1.format(date1);
@@ -264,7 +319,39 @@ public class TimeUtil {
         android.provider.Settings.Global.putInt(mContext.getContentResolver(),
                 android.provider.Settings.Global.AUTO_TIME, checked);
     }
-    public static void setSysDateTime(Context mContext, Date datetime, String timezoneStr, boolean addtimezoneToTime) {
+    public static void setSysDefaultDateTime(Context mContext, Date datetime) {
+        AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
+        Locale.getDefault().getDisplayCountry();
+        boolean addtimezoneToTime = true;
+        TimeZone tz = TimeZone.getDefault();
+        ICLogger.i("====set timezone " + tz.getDisplayName());
+
+        Calendar c = Calendar.getInstance();
+
+        ICLogger.i("====origin time " + c.getTime().toString() + " time zone " + c.getTimeZone());
+        c.setTime(datetime);
+
+        c.setTimeZone(tz);
+
+//    alarmManager.setTimeZone();
+        long when = c.getTimeInMillis();
+        if (when / 1000 < Integer.MAX_VALUE) {
+            //SystemClock.setCurrentTimeMillis(when);
+            alarmManager.setTime(when);
+        }
+
+        Calendar d = Calendar.getInstance();
+        long now = d.getTimeInMillis();
+        //Log.d(TAG, "set tm="+when + ", now tm="+now);
+
+        if (now - when > 1000) {
+            ICLogger.i("====set time failed now(" + now + ")-when(" + when + ") > 1000 !");
+        }
+
+        ICLogger.i("====set time to " + d.getTime().toString() + " time zone " + d.getTimeZone());
+
+    }
+        public static void setSysDateTime(Context mContext, Date datetime, String timezoneStr, boolean addtimezoneToTime) {
         AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
         Locale.getDefault().getDisplayCountry();
         String timezone_name = "";
@@ -320,10 +407,31 @@ public class TimeUtil {
 
 
     }
+
+
     public static void setSysDateTime(Context mContext, Date datetime, int timezone, boolean addtimezoneToTime) {
+        //Log.d(TAG, "set tm="+when + ", now tm="+now);
+        ICLogger.d("timezone ==> " + timezone);
+        Calendar d = Calendar.getInstance();
+        ICLogger.d("====before " + d.getTime().toString() + " time zone " + d.getTimeZone());
+        doTimeSet(mContext, datetime, timezone, addtimezoneToTime);
+        Calendar c = Calendar.getInstance();
+        ICLogger.d("====aftert " + c.getTime().toString() + " time zone " + c.getTimeZone());
+        //当前系统时间
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        long l = System.currentTimeMillis();
+        ICLogger.d("current time ==> " + l);
+        TimeZone timeZone = simpleDateFormat.getTimeZone();
+        ICLogger.d("timeZone after ==> " + timeZone.getID());
+        String format = simpleDateFormat.format(l);
+        ICLogger.d("format == " + format);
+        String utcSystemTimeHHmmss = getUTCSystemTimeHHmmss();
+        ICLogger.d("utcSystemTimeHHmmss ==> " + utcSystemTimeHHmmss);
+    }
 
+
+    private static void doTimeSet(Context mContext, Date datetime, int timezone, boolean addtimezoneToTime) {
         AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
-        Locale.getDefault().getDisplayCountry();
         String timezone_name = "";
         if (timezone > 0) {
             timezone_name = String.format("GMT+%1$02d:00", Math.abs(timezone));
@@ -331,38 +439,38 @@ public class TimeUtil {
         } else {
             timezone_name = String.format("GMT-%1$02d:00", Math.abs(timezone));
         }
-        TimeZone tz = TimeZone.getTimeZone(timezone_name);
-        ICLogger.i("====set timezone " + tz.getDisplayName());
+        ICLogger.d("dataTime ==> " + datetime.getTime());
+        ICLogger.d("timezone_name ==> " + timezone_name);
+        Date date = convertTimezone(datetime, TimeZone.getTimeZone(timezone_name));
+        long time = date.getTime();
+        ICLogger.d("time ==> " + time);
+        alarmManager.setTimeZone(timezone_name);
+        alarmManager.setTime(time);
+    }
 
-        Calendar c = Calendar.getInstance();
+    public static Date convertTimezone(Date sourceDate, TimeZone targetTimezone) {
 
-        ICLogger.i("====origin time " + c.getTime().toString() + " time zone " + c.getTimeZone());
-        c.setTime(datetime);
-        if (addtimezoneToTime) {
-            if (is24Hour(mContext)) {
-                c.add(Calendar.HOUR_OF_DAY, timezone);//24小时制
-            } else {
-                c.add(Calendar.HOUR, timezone);//12小时制
-            }
-            c.setTimeZone(tz);
-        }
 
-//    alarmManager.setTimeZone();
-        long when = c.getTimeInMillis();
-        if (when / 1000 < Integer.MAX_VALUE) {
-            //SystemClock.setCurrentTimeMillis(when);
-            alarmManager.setTime(when);
-        }
+        // targetDate - sourceDate=targetTimezone-sourceTimezone
+        // --->
+        // targetDate=sourceDate + (targetTimezone-sourceTimezone)
 
-        Calendar d = Calendar.getInstance();
-        long now = d.getTimeInMillis();
-        //Log.d(TAG, "set tm="+when + ", now tm="+now);
 
-        if (now - when > 1000) {
-            ICLogger.i("====set time failed now(" + now + ")-when(" + when + ") > 1000 !");
-        }
+        Calendar calendar = Calendar.getInstance();
+        // date.getTime() 为时间戳, 为格林尼治到系统现在的时间差,世界各个地方获取的时间戳是一样的,
+        // 格式化输出时,因为设置了不同的时区,所以输出不一样
+        long sourceTime = sourceDate.getTime();
 
-        ICLogger.i("====set time to " + d.getTime().toString() + " time zone " + d.getTimeZone());
+
+        calendar.setTimeZone(targetTimezone);
+        calendar.setTimeInMillis(sourceTime);// 设置之后,calendar会计算各种filed对应的值,并保存
+
+        //获取源时区的到UTC的时区差
+        int sourceZoneOffset = calendar.get(Calendar.ZONE_OFFSET);
+        ICLogger.d("sourceZoneOffset ==> " + sourceZoneOffset);
+        long targetTime = sourceTime + sourceZoneOffset;
+        ICLogger.d("targetTime ==> " + targetTime);
+        return new Date(targetTime);
 
     }
 
@@ -513,8 +621,8 @@ public class TimeUtil {
     }
 
     public static long diffBetween2DateInMinutes(String dateBefore_yyyyMMDDhhmmss, String dateAfter_yyyyMMDDhhmmss) {
-        long date1_ms = parseDatetiime(dateBefore_yyyyMMDDhhmmss).getTime();
-        long date2_ms = parseDatetiime(dateAfter_yyyyMMDDhhmmss).getTime();
+        long date1_ms = parseDatetiime(dateBefore_yyyyMMDDhhmmss, TimeZone.getDefault()).getTime();
+        long date2_ms = parseDatetiime(dateAfter_yyyyMMDDhhmmss, TimeZone.getDefault()).getTime();
         return (date2_ms - date1_ms) / 60000;
     }
 
index 172b3f3..ae4af6d 100644 (file)
@@ -79,6 +79,8 @@ public class protocolAPIHelper {
             case Config.PROTOCOL_JIAI:
                 break;
             case Config.PROTOCOL_BEEHOME:
+                //TODO:获取天气信息
+                connection.send(protocol_beehome.APTQ(runtime));
                 break;
             case Config.PROTOCOL_IC:
                 break;
@@ -102,6 +104,83 @@ public class protocolAPIHelper {
         }
     }
 
+ public static StringMessage getJustBloodPresureMsg(Runtime runtime) {
+        if (is_protocol_not_Initialled()) return null;
+        StringMessage ret = null;
+
+        if (runtime == null || runtime.getHRS().getBPH() <= 0) {
+            ICLogger.d(" 血压 值 <=0 跳过异常数据!");
+            return null;
+        }
+        switch (Config.protocol_no) {
+            case Config.PROTOCOL_BEEHOME:
+                ret = protocol_beehome.APJK(1, runtime);
+                break;
+        }
+        return ret;
+    }
+
+    public static boolean parseTestData(String cmd) {
+        if (is_protocol_not_Initialled()) return false;
+        switch (Config.protocol_no) {
+            case Config.PROTOCOL_BEEHOME:
+                protocolbeehome_handler.parserTesterCmdStr(cmd);
+                break;
+        }
+        return true;
+    }
+
+    public static StringMessage getJustBloodOxygenMsg(Runtime runtime) {
+        if (is_protocol_not_Initialled()) return null;
+        StringMessage ret = null;
+
+        if (runtime == null || runtime.getHRS().getBPH() <= 0) {
+            ICLogger.d(" 血压 值 <=0 跳过异常数据!");
+            return null;
+        }
+        switch (Config.protocol_no) {
+            case Config.PROTOCOL_BEEHOME:
+                ret = protocol_beehome.APJK(4, runtime);
+                break;
+        }
+        return ret;
+    }
+
+    public static boolean sendMsg2Web(String cmdIndex, String msg) {
+        //只要服务器收到消息,就认为服务器是联通的,保存联通的时间
+        Runtime.lastLinkReceiveStamp = System.currentTimeMillis();
+        if (is_protocol_not_Initialled()) return false;
+        switch (Config.protocol_no) {
+            case Config.PROTOCOL_JIAI:
+                break;
+            case Config.PROTOCOL_BEEHOME:
+                protocolbeehome_handler.sendMsg2Web(cmdIndex, msg);
+                break;
+            case Config.PROTOCOL_IC:
+                break;
+            case Config.PROTOCOL_FZD:
+                break;
+            case Config.PROTOCOL_MQTT:
+                break;
+            case PROTOCOL_ANAN:
+                break;
+            case Config.PROTOCOL_S123:
+                break;
+            case Config.PROTOCOL_GATOR:
+                break;
+        }
+        return true;
+    }
+
+    public static boolean requestWeTalkMsg() {
+        if (is_protocol_not_Initialled()) return false;
+        switch (Config.protocol_no) {
+            case Config.PROTOCOL_BEEHOME:
+                protocolbeehome_handler.doAP05();
+                break;
+        }
+        return true;
+    }
     public static void sendShutdownMsg() {
         switch (Config.protocol_no) {
             case Config.PROTOCOL_JIAI:
@@ -447,7 +526,7 @@ public class protocolAPIHelper {
                 ret = protocol_jiai.AP50(runtime);
                 break;
             case Config.PROTOCOL_BEEHOME:
-                ret = protocol_beehome.APTP(temp_adusted, body_temp);
+                ret = protocol_beehome.APJK(3, runtime);
                 break;
             case Config.PROTOCOL_IC:
                 ret = protocol_ic.APTP(temp_adusted, body_temp, tempout);
@@ -669,6 +748,7 @@ public class protocolAPIHelper {
             case Config.PROTOCOL_JIAI:
                 break;
             case Config.PROTOCOL_BEEHOME:
+                protocolbeehome_handler.sendVoice(duration, remoteNum, content, voiceId);
                 break;
             case Config.PROTOCOL_IC:
                 break;
@@ -734,7 +814,14 @@ public class protocolAPIHelper {
                 ret = protocol_jiai.AP07(packetTime, count, index, datalen, amrdata);
                 break;
             case Config.PROTOCOL_BEEHOME:
-                ret = protocol_beehome.AP07(packetTime, count, index, datalen, amrdata);
+                ICLogger.d("fileType ==> " + filetype);
+                ICLogger.d("dataType ==> " + datatype);
+                if (filetype == 1 && datatype == 3) {
+                    //对讲用的类型
+                       ret = protocol_beehome.AP07(packetTime, count, index, datalen, amrdata);
+                } else {
+                    ret = protocol_beehome.AP42(packetTime, count, index, datalen, amrdata);
+                }
                 break;
             case Config.PROTOCOL_IC:
                 /***
@@ -790,7 +877,7 @@ public class protocolAPIHelper {
                 ret = protocol_jiai.APHT(runtime);
                 break;
             case Config.PROTOCOL_BEEHOME:
-                ret = protocol_beehome.APHT(runtime);
+                ret = protocol_beehome.APJK(2, runtime);
                 break;
             case Config.PROTOCOL_IC:
                 ret = protocol_ic.APHP(runtime);
@@ -1226,7 +1313,7 @@ public class protocolAPIHelper {
                 ret = null;
                 break;
             case Config.PROTOCOL_BEEHOME:
-                ret = null;
+                ret = protocol_beehome.genUD2FromUD(msg);
                 break;
             case Config.PROTOCOL_IC:
                 ret = null;
index 830f550..6d82904 100644 (file)
@@ -1,36 +1,64 @@
 package com.ic.protocols;
 
+import android.Manifest;
 import android.content.ComponentName;
+import android.content.ContentResolver;
+import android.content.ContentValues;
+import android.content.Context;
 import android.content.Intent;
+import android.content.pm.PackageManager;
 import android.net.Uri;
 import android.os.Environment;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.support.v4.app.ActivityCompat;
+import android.text.TextUtils;
+import android.widget.Toast;
 
 import com.ic.protocolSrv.Config;
+import com.ic.protocolSrv.Constants;
 import com.ic.protocolSrv.CoreService;
+import com.ic.protocolSrv.LocationClient;
 import com.ic.protocolSrv.bean.Alarm;
 import com.ic.protocolSrv.bean.Contact;
-import com.ic.protocolSrv.bean.Content;
 import com.ic.protocolSrv.bean.ICLocation;
 import com.ic.protocolSrv.bean.Runtime;
 import com.ic.protocolSrv.bean.StringMessage;
 import com.ic.protocolSrv.bean.VoiceContent;
 import com.ic.protocolSrv.bean.voicePacket;
+import com.ic.protocolSrv.provider.ICAlarmProvider;
+import com.ic.protocolSrv.provider.ICDatabaseHelper;
+import com.ic.protocolSrv.provider.ICMembersProvider;
+import com.ic.protocolSrv.provider.WeTalkMessageProvider;
 import com.ic.protocolSrv.service.HeartRateManager;
+import com.ic.protocolSrv.service.SilentManager;
+import com.ic.protocolSrv.utils.CameraUtil;
+import com.ic.protocolSrv.utils.CellInfoUtil;
 import com.ic.protocolSrv.utils.Connection;
 import com.ic.protocolSrv.utils.DeviceInfoUtil;
+import com.ic.protocolSrv.utils.HeartRateOxygenTestType;
 import com.ic.protocolSrv.utils.ICLogger;
 import com.ic.protocolSrv.utils.TemperatureUtil;
 import com.ic.protocolSrv.utils.TimeUtil;
+
+
 import com.ic.protocolSrv.utils.Util;
+import com.ic.s123.GenericWeatherInfo;
 
 import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.RandomAccessFile;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.List;
+import java.util.TimeZone;
 
+import static com.ic.protocolSrv.Constants.ACTION_ALARM_ALARM_CHANGE;
+import static com.ic.protocolSrv.Constants.DIALOG_ACTION;
 import static com.ic.protocolSrv.Constants.FROM_SERVER;
 import static com.ic.protocolSrv.LocationClient.LOCATION_MODE;
-import static com.ic.protocolSrv.bean.Contact.GROUP_ALL;
 import static java.lang.Math.abs;
 
 public class protocol_beehome {
@@ -41,6 +69,73 @@ public class protocol_beehome {
     private static final String CMDSPLIT = ",";
     public static final String defaultServerIP = "en.beehome360.com";
     public static final int defaultServerPort = 5018;
+    private Handler mHandler = null;
+
+
+    public static byte[] AP42(String packetTime, int count, int index, int datalen, byte[] amrdata) {
+        String sb = new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP42))
+                .append(CMDSPLIT).append(packetTime)
+                .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 static StringMessage genUD2FromUD(StringMessage ud) {
+        String data, tmp;
+        tmp = ud.isFromCache();
+        if (isCmdStr(tmp).equals("AP01")) {
+            tmp = ud.isFromCache().replace("]", "");
+            int index = tmp.indexOf("AP01,");
+            data = tmp.substring(index + 3);
+            return genStringMessage("APH1 ", data);
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * 解析测试指令
+     *
+     * @param cmd
+     */
+    public void parserTesterCmdStr(String cmd) {
+        if (cmd.length() < 4) {
+            ICLogger.d("cmd length error..." + cmd);
+            return;
+        }
+
+        ICLogger.d("cmd ==> " + cmd);
+        String cmdKey = cmd.substring(2, 6);
+        ICLogger.d("cmdKey ==> " + cmdKey);
+        CMD_TYPE cmd_type = cmdMap.get(cmdKey);
+        handleCmd(cmd_type, cmd);
+    }
+
+    public void sendMsg2Web(String cmdIndex, String msg) {
+        //返回的消息在短信处理之后进行返回
+        mConnection.send(genStringMessage(cmdStrMap.get(CMD_TYPE.APSM),
+                new StringBuffer(CMDHEADER)
+                        .append(cmdStrMap.get(CMD_TYPE.APSM))
+                        .append(CMDSPLIT)
+                        .append(cmdIndex)
+                        .append(CMDSPLIT)
+                        .append(msg)
+                        .toString()));
+    }
+
+    public void doAP05() {
+        ICLogger.d("doAP05...");
+        String ap05Msg = AP05(true);
+        StringMessage stringMessage = genStringMessage(cmdStrMap.get(CMD_TYPE.AP05), ap05Msg);
+        mConnection.send(stringMessage);
+    }
 
     public enum CMD_TYPE {
         /*终端发起*/
@@ -87,6 +182,8 @@ public class protocol_beehome {
         BP28, //语音下行
         AP31,
         BP31,//关机
+        BP32,//拨号指令
+        AP32,
         AP33,
         BP33,//工作模式
         AP34,
@@ -107,6 +204,8 @@ public class protocol_beehome {
         BP85,//设置闹钟
         AP86,
         BP86,//绑定解绑
+        AP87,//二维码获取
+        BP87,
         AP88,
         BP88,//查找手表
         AP89,
@@ -124,90 +223,241 @@ public class protocol_beehome {
         UNKNOWN_CMD,
         BPTF,//时间设置
         APTF,//时间设置
-    }
-
-    private static HashMap<CMD_TYPE, String> cmdMap = null;
+        BPSQ,//设置体征信息监测间隔
+        APSQ,
+        BPMC,//专门控制skipmovecheck
+        APMC,//
+        BPPH,//拨号功能开关
+        APPH,
+        APJK,//上传健康数据,用这个接口,可以去掉体温心率的接口了
+        BPJK,//平台响应
+        BPSM,//平台下发短信指令
+        APSM,//设备回复是否收到平台短信指令
+        APTQ,//天气信息请求
+        BPTQ,//天气信息响应
+        BP75,//闹钟数据下发
+        AP75,//闹钟数据回复
+        AP46,//立即拍照
+        BP46,
+        AP42,//图片上传
+        BP42,
+        APH1,//无网络状态下的定位数据
+        BPH1,
+        BPOX, //IWBPOX,IMEI,流水号,1#
+        APOX,
+    }
+
+    private static HashMap<CMD_TYPE, String> cmdStrMap = null;
+    private static HashMap<String, CMD_TYPE> cmdMap = null;
 
     static {
-        cmdMap = new HashMap<CMD_TYPE, String>();
-        cmdMap.put(CMD_TYPE.AP00, "AP00");
-        cmdMap.put(CMD_TYPE.BP00, "BP00");
-        cmdMap.put(CMD_TYPE.AP01, "AP01");
-        cmdMap.put(CMD_TYPE.BP01, "BP01");
-        cmdMap.put(CMD_TYPE.AP02, "AP02");
-        cmdMap.put(CMD_TYPE.BP02, "BP02");
-        cmdMap.put(CMD_TYPE.AP92, "AP92");
-        cmdMap.put(CMD_TYPE.BP92, "BP92");
-        cmdMap.put(CMD_TYPE.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.BPVR,"BPVR");
-        cmdMap.put(CMD_TYPE.APVR,"APVR");
-        cmdMap.put(CMD_TYPE.AP12, "AP12");
-        cmdMap.put(CMD_TYPE.BP12, "BP12");
-        cmdMap.put(CMD_TYPE.AP14, "AP14");
-        cmdMap.put(CMD_TYPE.BP14, "BP14");
-        cmdMap.put(CMD_TYPE.AP15, "AP15");
-        cmdMap.put(CMD_TYPE.BP15, "BP15");
-        cmdMap.put(CMD_TYPE.AP16, "AP16");
-        cmdMap.put(CMD_TYPE.BP16, "BP16");
-        cmdMap.put(CMD_TYPE.AP17, "AP17");
-        cmdMap.put(CMD_TYPE.BP17, "BP17");
-        cmdMap.put(CMD_TYPE.AP18, "AP18");
-        cmdMap.put(CMD_TYPE.BP18, "BP18");
-        cmdMap.put(CMD_TYPE.AP21, "AP21");
-        cmdMap.put(CMD_TYPE.BP21, "BP21");
-        cmdMap.put(CMD_TYPE.AP28, "AP28");
-        cmdMap.put(CMD_TYPE.BP28, "BP28");
-        cmdMap.put(CMD_TYPE.AP31, "AP31");
-        cmdMap.put(CMD_TYPE.BP31, "BP31");
-        cmdMap.put(CMD_TYPE.AP33, "AP33");
-        cmdMap.put(CMD_TYPE.BP33, "BP33");
-        cmdMap.put(CMD_TYPE.AP34, "AP34");
-        cmdMap.put(CMD_TYPE.BP34, "BP34");
-        cmdMap.put(CMD_TYPE.AP40, "AP40");
-        cmdMap.put(CMD_TYPE.BP40, "BP40");
-        cmdMap.put(CMD_TYPE.AP68, "AP68");
-        cmdMap.put(CMD_TYPE.BP68, "BP68");
-        cmdMap.put(CMD_TYPE.APXL, "APXL");
-        cmdMap.put(CMD_TYPE.BPXL, "BPXL");
-        cmdMap.put(CMD_TYPE.APXY, "APXY");
-        cmdMap.put(CMD_TYPE.BPXY, "BPXY");
-        cmdMap.put(CMD_TYPE.APJZ, "APJZ");
-        cmdMap.put(CMD_TYPE.BPJZ, "BPJZ");
-        cmdMap.put(CMD_TYPE.AP84, "AP84");
-        cmdMap.put(CMD_TYPE.BP84, "BP84");
-        cmdMap.put(CMD_TYPE.AP85, "AP85");
-        cmdMap.put(CMD_TYPE.BP85, "BP85");
-        cmdMap.put(CMD_TYPE.AP86, "AP86");
-        cmdMap.put(CMD_TYPE.BP86, "BP86");
-        cmdMap.put(CMD_TYPE.AP88, "AP88");
-        cmdMap.put(CMD_TYPE.BP88, "BP88");
-        cmdMap.put(CMD_TYPE.AP89, "AP89");
-        cmdMap.put(CMD_TYPE.BP89, "BP89");
-        cmdMap.put(CMD_TYPE.APTE, "APTE");
-        cmdMap.put(CMD_TYPE.BPTE, "BPTE");
-        cmdMap.put(CMD_TYPE.APTP, "APTP");
-        cmdMap.put(CMD_TYPE.BPTP, "BPTP");
-        cmdMap.put(CMD_TYPE.APX1, "APX1");
-        cmdMap.put(CMD_TYPE.BPX1, "BPX1");
-        cmdMap.put(CMD_TYPE.APS4, "APS4");
-        cmdMap.put(CMD_TYPE.BPS4, "BPS4");
-        cmdMap.put(CMD_TYPE.APHP, "APHP");
-        cmdMap.put(CMD_TYPE.BPHP, "BPHP");
-        cmdMap.put(CMD_TYPE.BPTF, "BPTF");
-        cmdMap.put(CMD_TYPE.APTF, "APTF");
+        cmdStrMap = new HashMap<>();
+        cmdStrMap.put(CMD_TYPE.AP00, "AP00");
+        cmdStrMap.put(CMD_TYPE.BP00, "BP00");
+        cmdStrMap.put(CMD_TYPE.AP01, "AP01");
+        cmdStrMap.put(CMD_TYPE.BP01, "BP01");
+        cmdStrMap.put(CMD_TYPE.AP02, "AP02");
+        cmdStrMap.put(CMD_TYPE.BP02, "BP02");
+        cmdStrMap.put(CMD_TYPE.AP92, "AP92");
+        cmdStrMap.put(CMD_TYPE.BP92, "BP92");
+        cmdStrMap.put(CMD_TYPE.AP03, "AP03");
+        cmdStrMap.put(CMD_TYPE.BP03, "BP03");
+        cmdStrMap.put(CMD_TYPE.AP05, "AP05");
+        cmdStrMap.put(CMD_TYPE.BP05, "BP05");
+        cmdStrMap.put(CMD_TYPE.AP07, "AP07");
+        cmdStrMap.put(CMD_TYPE.BP07, "BP07");
+        cmdStrMap.put(CMD_TYPE.AP10, "AP10");
+        cmdStrMap.put(CMD_TYPE.BP10, "BP10");
+        cmdStrMap.put(CMD_TYPE.AP49, "AP49");
+        cmdStrMap.put(CMD_TYPE.BP49, "BP49");
+        cmdStrMap.put(CMD_TYPE.APHT, "APHT");
+        cmdStrMap.put(CMD_TYPE.BPHT, "BPHT");
+        cmdStrMap.put(CMD_TYPE.APTM, "APTM");
+        cmdStrMap.put(CMD_TYPE.BPTM, "BPTM");
+        cmdStrMap.put(CMD_TYPE.BPVR, "BPVR");
+        cmdStrMap.put(CMD_TYPE.APVR, "APVR");
+        cmdStrMap.put(CMD_TYPE.AP12, "AP12");
+        cmdStrMap.put(CMD_TYPE.BP12, "BP12");
+        cmdStrMap.put(CMD_TYPE.AP14, "AP14");
+        cmdStrMap.put(CMD_TYPE.BP14, "BP14");
+        cmdStrMap.put(CMD_TYPE.AP15, "AP15");
+        cmdStrMap.put(CMD_TYPE.BP15, "BP15");
+        cmdStrMap.put(CMD_TYPE.AP16, "AP16");
+        cmdStrMap.put(CMD_TYPE.BP16, "BP16");
+        cmdStrMap.put(CMD_TYPE.AP17, "AP17");
+        cmdStrMap.put(CMD_TYPE.BP17, "BP17");
+        cmdStrMap.put(CMD_TYPE.AP18, "AP18");
+        cmdStrMap.put(CMD_TYPE.BP18, "BP18");
+        cmdStrMap.put(CMD_TYPE.AP21, "AP21");
+        cmdStrMap.put(CMD_TYPE.BP21, "BP21");
+        cmdStrMap.put(CMD_TYPE.AP28, "AP28");
+        cmdStrMap.put(CMD_TYPE.BP28, "BP28");
+        cmdStrMap.put(CMD_TYPE.AP31, "AP31");
+        cmdStrMap.put(CMD_TYPE.BP31, "BP31");
+        cmdStrMap.put(CMD_TYPE.BP32, "BP32");
+        cmdStrMap.put(CMD_TYPE.AP32, "AP32");
+        cmdStrMap.put(CMD_TYPE.AP33, "AP33");
+        cmdStrMap.put(CMD_TYPE.BP33, "BP33");
+        cmdStrMap.put(CMD_TYPE.AP34, "AP34");
+        cmdStrMap.put(CMD_TYPE.BP34, "BP34");
+        cmdStrMap.put(CMD_TYPE.AP40, "AP40");
+        cmdStrMap.put(CMD_TYPE.BP40, "BP40");
+        cmdStrMap.put(CMD_TYPE.AP68, "AP68");
+        cmdStrMap.put(CMD_TYPE.BP68, "BP68");
+        cmdStrMap.put(CMD_TYPE.APXL, "APXL");
+        cmdStrMap.put(CMD_TYPE.BPXL, "BPXL");
+        cmdStrMap.put(CMD_TYPE.APXY, "APXY");
+        cmdStrMap.put(CMD_TYPE.BPXY, "BPXY");
+        cmdStrMap.put(CMD_TYPE.APJZ, "APJZ");
+        cmdStrMap.put(CMD_TYPE.BPJZ, "BPJZ");
+        cmdStrMap.put(CMD_TYPE.AP84, "AP84");
+        cmdStrMap.put(CMD_TYPE.BP84, "BP84");
+        cmdStrMap.put(CMD_TYPE.AP85, "AP85");
+        cmdStrMap.put(CMD_TYPE.BP85, "BP85");
+        cmdStrMap.put(CMD_TYPE.AP86, "AP86");
+        cmdStrMap.put(CMD_TYPE.BP86, "BP86");
+        cmdStrMap.put(CMD_TYPE.AP88, "AP88");
+        cmdStrMap.put(CMD_TYPE.BP88, "BP88");
+        cmdStrMap.put(CMD_TYPE.AP89, "AP89");
+        cmdStrMap.put(CMD_TYPE.BP89, "BP89");
+        cmdStrMap.put(CMD_TYPE.APTE, "APTE");
+        cmdStrMap.put(CMD_TYPE.BPTE, "BPTE");
+        cmdStrMap.put(CMD_TYPE.APTP, "APTP");
+        cmdStrMap.put(CMD_TYPE.BPTP, "BPTP");
+        cmdStrMap.put(CMD_TYPE.APX1, "APX1");
+        cmdStrMap.put(CMD_TYPE.BPX1, "BPX1");
+        cmdStrMap.put(CMD_TYPE.APS4, "APS4");
+        cmdStrMap.put(CMD_TYPE.BPS4, "BPS4");
+        cmdStrMap.put(CMD_TYPE.APHP, "APHP");
+        cmdStrMap.put(CMD_TYPE.BPHP, "BPHP");
+        cmdStrMap.put(CMD_TYPE.BPTF, "BPTF");
+        cmdStrMap.put(CMD_TYPE.APTF, "APTF");
+        cmdStrMap.put(CMD_TYPE.BPSQ, "BPSQ");
+        cmdStrMap.put(CMD_TYPE.APSQ, "APSQ");
+        cmdStrMap.put(CMD_TYPE.BPMC, "BPMC");
+        cmdStrMap.put(CMD_TYPE.APMC, "APMC");
+        cmdStrMap.put(CMD_TYPE.BPPH, "BPPH");
+        cmdStrMap.put(CMD_TYPE.APPH, "APPH");
+        cmdStrMap.put(CMD_TYPE.APJK, "APJK");
+        cmdStrMap.put(CMD_TYPE.BPJK, "BPJK");
+        cmdStrMap.put(CMD_TYPE.BPSM, "BPSM");
+        cmdStrMap.put(CMD_TYPE.APSM, "APSM");
+        cmdStrMap.put(CMD_TYPE.APTQ, "APTQ");
+        cmdStrMap.put(CMD_TYPE.BPTQ, "BPTQ");
+        cmdStrMap.put(CMD_TYPE.BP75, "BP75");
+        cmdStrMap.put(CMD_TYPE.AP75, "AP75");
+        cmdStrMap.put(CMD_TYPE.AP46, "AP46");
+        cmdStrMap.put(CMD_TYPE.BP46, "BP46");
+        cmdStrMap.put(CMD_TYPE.AP42, "AP42");
+        cmdStrMap.put(CMD_TYPE.BP42, "BP42");
+        cmdStrMap.put(CMD_TYPE.APH1, "APH1");
+        cmdStrMap.put(CMD_TYPE.BPH1, "BPH1");
+        cmdStrMap.put(CMD_TYPE.BPOX, "BPOX");
+        cmdStrMap.put(CMD_TYPE.APOX, "APOX");
+
+        //
+        cmdMap = new HashMap<>();
+        cmdMap.put("AP00", CMD_TYPE.AP00);
+        cmdMap.put("BP00", CMD_TYPE.BP00);
+        cmdMap.put("AP01", CMD_TYPE.AP01);
+        cmdMap.put("BP01", CMD_TYPE.BP01);
+        cmdMap.put("AP02", CMD_TYPE.AP02);
+        cmdMap.put("BP02", CMD_TYPE.BP02);
+        cmdMap.put("AP92", CMD_TYPE.AP92);
+        cmdMap.put("BP92", CMD_TYPE.BP92);
+        cmdMap.put("AP03", CMD_TYPE.AP03);
+        cmdMap.put("BP03", CMD_TYPE.BP03);
+        cmdMap.put("AP05", CMD_TYPE.AP05);
+        cmdMap.put("BP05", CMD_TYPE.BP05);
+        cmdMap.put("AP07", CMD_TYPE.AP07);
+        cmdMap.put("BP07", CMD_TYPE.BP07);
+        cmdMap.put("AP10", CMD_TYPE.AP10);
+        cmdMap.put("BP10", CMD_TYPE.BP10);
+        cmdMap.put("AP49", CMD_TYPE.AP49);
+        cmdMap.put("BP49", CMD_TYPE.BP49);
+        cmdMap.put("APHT", CMD_TYPE.APHT);
+        cmdMap.put("BPHT", CMD_TYPE.BPHT);
+        cmdMap.put("APTM", CMD_TYPE.APTM);
+        cmdMap.put("BPTM", CMD_TYPE.BPTM);
+        cmdMap.put("BPVR", CMD_TYPE.BPVR);
+        cmdMap.put("APVR", CMD_TYPE.APVR);
+        cmdMap.put("AP12", CMD_TYPE.AP12);
+        cmdMap.put("BP12", CMD_TYPE.BP12);
+        cmdMap.put("AP14", CMD_TYPE.AP14);
+        cmdMap.put("BP14", CMD_TYPE.BP14);
+        cmdMap.put("AP15", CMD_TYPE.AP15);
+        cmdMap.put("BP15", CMD_TYPE.BP15);
+        cmdMap.put("AP16", CMD_TYPE.AP16);
+        cmdMap.put("BP16", CMD_TYPE.BP16);
+        cmdMap.put("AP17", CMD_TYPE.AP17);
+        cmdMap.put("BP17", CMD_TYPE.BP17);
+        cmdMap.put("AP18", CMD_TYPE.AP18);
+        cmdMap.put("BP18", CMD_TYPE.BP18);
+        cmdMap.put("AP21", CMD_TYPE.AP21);
+        cmdMap.put("BP21", CMD_TYPE.BP21);
+        cmdMap.put("AP28", CMD_TYPE.AP28);
+        cmdMap.put("BP28", CMD_TYPE.BP28);
+        cmdMap.put("AP31", CMD_TYPE.AP31);
+        cmdMap.put("BP31", CMD_TYPE.BP31);
+        cmdMap.put("AP33", CMD_TYPE.AP33);
+        cmdMap.put("BP33", CMD_TYPE.BP33);
+        cmdMap.put("AP34", CMD_TYPE.AP34);
+        cmdMap.put("BP34", CMD_TYPE.BP34);
+        cmdMap.put("AP40", CMD_TYPE.AP40);
+        cmdMap.put("BP40", CMD_TYPE.BP40);
+        cmdMap.put("AP68", CMD_TYPE.AP68);
+        cmdMap.put("BP68", CMD_TYPE.BP68);
+        cmdMap.put("APXL", CMD_TYPE.APXL);
+        cmdMap.put("BPXL", CMD_TYPE.BPXL);
+        cmdMap.put("APXY", CMD_TYPE.APXY);
+        cmdMap.put("BPXY", CMD_TYPE.BPXY);
+        cmdMap.put("APJZ", CMD_TYPE.APJZ);
+        cmdMap.put("BPJZ", CMD_TYPE.BPJZ);
+        cmdMap.put("AP84", CMD_TYPE.AP84);
+        cmdMap.put("BP84", CMD_TYPE.BP84);
+        cmdMap.put("AP85", CMD_TYPE.AP85);
+        cmdMap.put("BP85", CMD_TYPE.BP85);
+        cmdMap.put("AP86", CMD_TYPE.AP86);
+        cmdMap.put("BP86", CMD_TYPE.BP86);
+        cmdMap.put("AP88", CMD_TYPE.AP88);
+        cmdMap.put("BP88", CMD_TYPE.BP88);
+        cmdMap.put("AP89", CMD_TYPE.AP89);
+        cmdMap.put("BP89", CMD_TYPE.BP89);
+        cmdMap.put("APTE", CMD_TYPE.APTE);
+        cmdMap.put("BPTE", CMD_TYPE.BPTE);
+        cmdMap.put("APTP", CMD_TYPE.APTP);
+        cmdMap.put("BPTP", CMD_TYPE.BPTP);
+        cmdMap.put("APX1", CMD_TYPE.APX1);
+        cmdMap.put("BPX1", CMD_TYPE.BPX1);
+        cmdMap.put("APS4", CMD_TYPE.APS4);
+        cmdMap.put("BPS4", CMD_TYPE.BPS4);
+        cmdMap.put("APHP", CMD_TYPE.APHP);
+        cmdMap.put("BPHP", CMD_TYPE.BPHP);
+        cmdMap.put("BPTF", CMD_TYPE.BPTF);
+        cmdMap.put("APTF", CMD_TYPE.APTF);
+        cmdMap.put("BPSQ", CMD_TYPE.BPSQ);
+        cmdMap.put("APSQ", CMD_TYPE.APSQ);
+        cmdMap.put("BPMC", CMD_TYPE.BPMC);
+        cmdMap.put("APMC", CMD_TYPE.APMC);
+        cmdMap.put("BPPH", CMD_TYPE.BPPH);
+        cmdMap.put("APPH", CMD_TYPE.APPH);
+        cmdMap.put("APJK", CMD_TYPE.APJK);
+        cmdMap.put("BPJK", CMD_TYPE.BPJK);
+        cmdMap.put("BPSM", CMD_TYPE.BPSM);
+        cmdMap.put("APSM", CMD_TYPE.APSM);
+        cmdMap.put("BPTQ", CMD_TYPE.BPTQ);
+        cmdMap.put("APTQ", CMD_TYPE.APTQ);
+        cmdMap.put("AP75", CMD_TYPE.AP75);
+        cmdMap.put("BP75", CMD_TYPE.BP75);
+        cmdMap.put("BP46", CMD_TYPE.BP46);
+        cmdMap.put("AP46", CMD_TYPE.AP46);
+        cmdMap.put("BP42", CMD_TYPE.BP42);
+        cmdMap.put("AP42", CMD_TYPE.AP42);
+        cmdMap.put("APH1", CMD_TYPE.APH1);
+        cmdMap.put("BPH1", CMD_TYPE.BPH1);
+        cmdMap.put("BPOX", CMD_TYPE.BPOX);
+        cmdMap.put("APOX", CMD_TYPE.APOX);
+
     }
 
 
@@ -217,7 +467,11 @@ public class protocol_beehome {
     public protocol_beehome(Connection connect, Runtime runtime) {
         mConnection = connect;
         mRuntime = runtime;
-
+        if (mHandler == null) {
+            HandlerThread handlerThread = new HandlerThread("ic:protocol_s123-handler-thread");
+            handlerThread.start();
+            mHandler = new Handler(handlerThread.getLooper());
+        }
     }
 
     private StringBuffer cmdbuf = new StringBuffer();
@@ -239,10 +493,10 @@ public class protocol_beehome {
             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);
+        for (CMD_TYPE key : cmdStrMap.keySet()) {
+            if (msg.startsWith(CMDHEADER + cmdStrMap.get(key))) {
+                ICLogger.i("found cmd keyid=" + key + " ,keyname=" + cmdStrMap.get(key));
+                return cmdStrMap.get(key);
             }
         }
 
@@ -258,14 +512,14 @@ public class protocol_beehome {
     }
 
 
-    /**/
     public static StringMessage genStringMessage(String cmdName, String msg) {
+        ICLogger.d("msg ==> " + msg);
         //设置cmdName,在这里配置进去的msg没有实际用到
         StringMessage sm = new StringMessage(new String[]{cmdName, msg});
         //用此函数设置要发送的内容
         sm.refresh(msg);
         //设置信息创建时间
-        sm.setDate(TimeUtil.getSystemDateYYMMDD(), TimeUtil.getSystemTimeHHmmss());
+        sm.setDate(TimeUtil.getUTCSystemDateYYMMDD(), TimeUtil.getUTCSystemTimeHHmmss());
         return sm;
     }
 
@@ -280,10 +534,10 @@ public class protocol_beehome {
         boolean ret = true;
         String last_inCompletecmd = "";
         String cmd_msgbuf = new String(bytes);
-        log("bytes.size " + bytes.length);
+        ICLogger.d("bytes.size " + bytes.length);
 //        cmdbuf.append(cmd_msgbuf);
         cmdbuf.append(cmd_msgbuf);
-        log("cmdbuf.size " + cmdbuf.length() + " " + cmdbuf.toString());
+        ICLogger.d("cmdbuf.size " + cmdbuf.length() + " " + cmdbuf.toString());
     /*
         如果不是 #结尾,就认为 接收数据不全,置位。
          */
@@ -292,29 +546,35 @@ public class protocol_beehome {
         }
         String[] cmdlist = cmd_msgbuf.split(CMDEND);
         int listlen = cmdlist.length;
-        log("listlen " + listlen);
+        ICLogger.d("listlen " + listlen);
          /*
         如果解析出来的cmdlist不是空,且数据不是完整cmd则保留 最后一条数据到last_inCompletecmd
          */
         if (cmdlist.length > 0 && iscmdComplete == false) {
             listlen -= 1;
             last_inCompletecmd = cmdlist[listlen];
-            log("cmd not complete , " + last_inCompletecmd);
+            ICLogger.d("cmd not complete , " + last_inCompletecmd);
         }
         for (int i = 0; i < listlen; i++) {
-            for (CMD_TYPE key : cmdMap.keySet()) {
-                if (cmdlist[i].startsWith(CMDHEADER + cmdMap.get(key))) {
-                    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]);
+            String cmdItem = cmdlist[i];
+            if (cmdItem.startsWith(CMDHEADER)) {
+                //获取到指令
+                String cmdStr = cmdItem.substring(2, 6);
+                ICLogger.d("cmdStr ==> " + cmdStr);
+                CMD_TYPE key = cmdMap.get(cmdStr);
+                if (key == null) {
+                    ICLogger.d("不支持该指令==> " + cmdlist[i]);
+                    return false;
+                }
+                ICLogger.d("found cmd keyid=" + key + " ,keyname=" + cmdStrMap.get(key) + " ,  " + cmdlist[i]);
+                if (key == CMD_TYPE.BP28) {
+                    //如果是BP28则 后面的数据是音频,需要保留
+                    int amrLen = getBP28Amrlen(cmdlist[i]);
+                    if (bytes.length > amrLen) {
+                        handleCmd(key, cmdlist[i], bytes);
                     }
+                } else {
+                    handleCmd(key, cmdlist[i]);
                 }
             }
         }
@@ -323,6 +583,43 @@ public class protocol_beehome {
         return ret;
     }
 
+
+    public void handleBP42(String cmd, Connection connection) {
+        /***
+         * 平台响应
+         * IWBP42,20140818064408,6,1,1#
+         * IW:标识符
+         * BP42 : 命令字符
+         * 20220217174924:语音图片文字目标
+         * 11:内容总包数
+         * 1:当前包序号
+         */
+        String[] cmdlist = cmd.split(CMDSPLIT);
+        if (cmdlist.length == 5) {
+            try {
+                String time = cmdlist[1];
+                String count = cmdlist[2];
+                String index = cmdlist[3];
+                String success = cmdlist[4];
+                int packetCount = Integer.parseInt(count);
+                int packetIndex = Integer.parseInt(index);
+                ICLogger.d("是否成功===>" + success);
+                ICLogger.i("服务器在收到 index " + time + " " + packetIndex + "/" + packetCount);
+                //如果服务器接收 语音成功,则设置下一个要发送的语音包Index,当index == packetCount的时候表示所有包发送完毕,停止继续发送
+                if ("1".equals(success)) {
+                    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 int getBP28Amrlen(String cmd) {
 
         String Name;
@@ -348,8 +645,6 @@ public class protocol_beehome {
                         .append(",packetCount = ").append(packetCount)
                         .append(",currentId = ").append(currentId)
                         .append(",packetLen = ").append(packetLen);
-
-
                 log(stringBuffer.toString());
                 return packetLen;
             } catch (Exception e) {
@@ -365,33 +660,42 @@ public class protocol_beehome {
     /*登录*/
     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());
+//        IWAP00860315002003375,12345678901234567890,9466970701492096# 三个参数分别是IMEI,ICCID,IMSI
+        CellInfoUtil.getPhoneStatus(ds);//获取IMSI,ICCID
+        StringBuffer cmdbuf = new StringBuffer(CMDHEADER);
+        cmdbuf.append(cmdStrMap.get(CMD_TYPE.AP00)).append(ds.IMEI())
+                .append(CMDSPLIT).append(ds.getIccid())
+                .append(CMDSPLIT).append(ds.getImsi())
+                .append(CMDEND);
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.AP00), cmdbuf.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.ic.protocolSrv I/ICSrv.protocolAPIHelper: found cmd keyid=BP00 ,keyname=BP00 ,  IWBP00,20191229171933,8
-
+        //get Msg :IWBP00,20191229171933,8# (size)24
+        //12-30 01:19:33.861 6492-6492/com.ic.protocolSrv
+        //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]);
+                String timezone_name = "";
+                if (timezone > 0) {
+                    timezone_name = String.format("GMT+%1$02d:00", Math.abs(timezone));
+
+                } else {
+                    timezone_name = String.format("GMT-%1$02d:00", Math.abs(timezone));
+                }
+                Date datetime = TimeUtil.parseDatetiime(msg[1], TimeZone.getTimeZone(timezone_name));
                 if (datetime != null) {
                     ICLogger.i("===" + TimeUtil.getDefaultTimeZone());
-                    TimeUtil.setTimeZone(runtime.getContextProxy().context, timezone);
-
+                    //TimeUtil.setTimeZone(runtime.getContextProxy().context, timezone);
                     ICLogger.i("===" + TimeUtil.getDefaultTimeZone());
                     TimeUtil.setSysDateTime(runtime.getContextProxy().context, datetime, timezone, true);
                     ICLogger.i("===" + TimeUtil.getDefaultTimeZone());
-
                 }
 //            Set Datetime 20200505112734
 //            Set TimeZone 8
@@ -403,6 +707,37 @@ public class protocol_beehome {
         }
     }
 
+    /**
+     * 发送语音数据
+     *
+     * @param duration
+     * @param remoteNum
+     * @param content
+     * @param voiceId
+     */
+    public void sendVoice(int duration, String remoteNum, String content, String voiceId) {
+        // IWAP07,353456789012345,080835,20140818064408 ,135xxx,0,6,1,1024,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#
+        File file = new File(content);
+        if (!file.exists()) {
+            ICLogger.d("语音文件不存在.");
+            return;
+        }
+        if (remoteNum == null || remoteNum.isEmpty()) {
+            remoteNum = "0";
+        }
+        ICLogger.d("remoteNum =====> " + remoteNum);
+        //这个分类目前用不了,用号码就是单聊,没号码就是群聊
+        final VoiceContent voiceContent =
+                VoiceContent.placeHolderOut(1, remoteNum, String.format("%04X", duration), content, 1, 3);
+        // 把voiceContent拆解成1024的分包
+        Util.parseToVoicePacketSent(voiceContent, 1024);
+        //trigger 分包发送
+        if (CoreService.getInstance().getConnection() != null) {
+            CoreService.getInstance().getConnection()
+                    .DeliverCMDMessageToSystem("SentVoicePacket", "");
+        }
+    }
+
 
     public static StringMessage AP03(Runtime ds) {
         //示例数据:IWAP03,06000908000102,5555,30#  IWAP03,000000null00000,0,0#
@@ -420,10 +755,16 @@ public class protocol_beehome {
         //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())))
+        //定位模式
+        //定位周期cycle 单位秒
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.AP03), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP03)).append(CMDSPLIT).append(String.format("%03d", abs(ds.getSignalStrength())))
                 .append(ds.getGPSLocationStarNums()).append(ds.getBattery()).append("0")
                 .append(ds.getProtection()).append(ds.getWorkModeStr()).append(CMDSPLIT)
-                .append(ds.getTotalStepCount()).append(CMDSPLIT).append(ds.getRolltimes()).append(CMDEND).toString());
+                .append(ds.getTotalStepCount()).append(CMDSPLIT)
+                .append(ds.getRolltimes()).append(CMDSPLIT)
+                .append(ds.getLocationInstance().getWorkingMod()).append(CMDSPLIT)
+                .append(ds.getLocationInstance().getLocation_cycle())
+                .append(CMDEND).toString());
     }
 
     //处理 心跳 BP03
@@ -445,8 +786,8 @@ public class protocol_beehome {
          * 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())
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.AP10), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP10)).append(TimeUtil.getUTCSystemDateYYMMDD())
+                .append(ds.getGPSData()).append(TimeUtil.getUTCSystemTimeHHmmss()).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)
@@ -464,11 +805,13 @@ public class protocol_beehome {
         // 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());
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.AP01),
+                new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP01)).append(TimeUtil.getUTCSystemDateYYMMDD())
+                        .append(ds.getGPSData())
+                        .append(TimeUtil.getUTCSystemTimeHHmmss()).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
@@ -506,7 +849,7 @@ public class protocol_beehome {
         }
 
         ICLogger.i("Wifi ap sum " + apsum);
-        return genStringMessage(cmdMap.get(CMD_TYPE.AP02), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP02)).append(CMDSPLIT)
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.AP02), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP02)).append(CMDSPLIT)
                 .append(ds.getLanguage()).append(CMDSPLIT)
                 .append(0).append(CMDSPLIT) //为0时不回复地址
                 .append(ds.getLBSMultiStationData()).append(CMDSPLIT)  //基站信息数据
@@ -522,11 +865,10 @@ public class protocol_beehome {
     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))
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.APXL), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.APXL))
                 .append(CMDSPLIT).append(id)
                 .append(CMDEND).toString());
     }
-
     /**
      * 测量心率
      *
@@ -554,10 +896,42 @@ public class protocol_beehome {
 
     }
 
+
+    public static StringMessage APOX(String id,String cmdname) {
+//设备响应:      IWAPOX,080835,1#
+        //080835:指令流水号
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.APOX), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.APOX))
+                .append(CMDSPLIT).append(id)
+                .append(CMDSPLIT).append(cmdname)
+                .append(CMDEND).toString());
+    }
+    /**
+     * 测量血氧
+     *
+     * @param cmd
+     * @param connection
+     */
+    public void handleBPOX(String cmd, Connection connection) {
+        //IWBPOX,353456789012345,080835,1#
+        //IWBPOX,IMEI,流水号,1#
+
+        String[] list = cmd.split(CMDSPLIT);
+        if (list.length == 4) {
+            String index = list[2];
+            String imei = list[1];
+            String cmdname = list[3];
+            ICLogger.i("Handle BPOX IMEI " + imei + ",index " + index +",cmdname "+cmdname);
+            connection.send(APOX(index,cmdname));
+        } else {
+            ICLogger.i("BPOX 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))
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.APXY), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.APXY))
                 .append(CMDSPLIT).append(id)
                 .append(CMDEND).toString());
     }
@@ -594,7 +968,7 @@ public class protocol_beehome {
         //设备响应:      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))
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.APJZ), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.APJZ))
                 .append(CMDSPLIT).append(id)
                 .append(CMDSPLIT).append(BPH)
                 .append(CMDSPLIT).append(BPL)
@@ -647,7 +1021,7 @@ public class protocol_beehome {
 
 
     public static StringMessage AP18(String index) {
-        return genStringMessage(cmdMap.get(CMD_TYPE.AP18), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP18))
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.AP18), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP18))
                 .append(CMDSPLIT).append(index)
                 .append(CMDEND).toString());
     }
@@ -665,7 +1039,7 @@ public class protocol_beehome {
     //恢复出厂设置
 
     public static StringMessage AP17(String index) {
-        return genStringMessage(cmdMap.get(CMD_TYPE.AP17), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP17))
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.AP17), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP17))
                 .append(CMDSPLIT).append(index)
                 .append(CMDEND).toString());
     }
@@ -675,35 +1049,50 @@ public class protocol_beehome {
         //    IWBP17,867155030001063,161723
         String[] cmdlist = cmd.split(CMDSPLIT);
         if (cmdlist.length == 3) {
-
             connection.send(AP17(cmdlist[2]));
-
         }
     }
 
-    //关机
-
+    /**
+     * 1.   请求天气(上行协议号:APTQ,响应:BPTQ)(不支持国外)
+     * 示例:
+     * IWAPTQ,460,0,9520,3671,0#
+     * 说明:
+     * IW:标识符APTQ : 命令字符460,0,9520,3671基站信息0:语言标志位   0 默认为中文,1为英文
+     *
+     * @param runtime
+     * @return
+     */
+    public static StringMessage APTQ(Runtime runtime) {
+        //IWAPTQ,460,0,9520,3671,0#
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.APTQ),
+                new StringBuffer(CMDHEADER)
+                        .append(cmdStrMap.get(CMD_TYPE.APTQ))
+                        .append(CMDSPLIT)
+                        .append(runtime.getLBSMultiStationData())
+                        .append(CMDSPLIT)
+                        .append("0")//中文
+                        .toString());
+    }
 
+    //关机
     public static StringMessage AP31(String index) {
-        return genStringMessage(cmdMap.get(CMD_TYPE.AP31), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP31))
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.AP31), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP31))
                 .append(CMDSPLIT).append(index)
                 .append(CMDEND).toString());
     }
 
     public void handleBP31(Connection connection, String cmd) {
-
-        //    IWBP31,867155030001063,161723
+        //IWBP31,867155030001063,161723
         String[] cmdlist = cmd.split(CMDSPLIT);
         if (cmdlist.length == 3) {
-
             connection.send(AP31(cmdlist[2]));
-
         }
     }
 
     //设置SOS号码
     public static StringMessage AP12(String index, String phNum1, String phNum2, String phNum3) {
-        return genStringMessage(cmdMap.get(CMD_TYPE.AP12), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP12))
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.AP12), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP12))
                 .append(CMDSPLIT).append(index)
                 .append(CMDSPLIT).append(phNum1)
                 .append(CMDSPLIT).append(phNum2)
@@ -714,25 +1103,40 @@ public class protocol_beehome {
     //设置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]) : "";
+        String[] cmdList = cmd.split(CMDSPLIT);
+        if (cmdList.length >= 3) {
+            String index = cmdList[2];
+            String phNum1 = cmdList.length == 3 ? "" : cmdList[3];
+            String phNum2 = cmdList.length > 3 ? (cmdList.length == 4 ? "" : cmdList[4]) : "";
+            String phNum3 = (cmdList.length > 4) ? (cmdList.length == 5 ? "" : cmdList[5]) : "";
             ICLogger.i(new StringBuffer().append("get Emegency Numbs " + phNum1 + "," + phNum2 + "," + phNum3).toString());
             connection.send(AP12(index, phNum1, phNum2, phNum3));
-
-            ArrayList<Contact> contactArray = new ArrayList<Contact>();
-            if (!phNum1.isEmpty())
+            runtime.getContextProxy()
+                    .getResolver().delete(Uri.parse(ICMembersProvider.MEMBERS),
+                    ICDatabaseHelper.fType + "=?", new String[]{String.valueOf(ICDatabaseHelper.MemberType.SOS)});
+            ArrayList<Contact> contactArray = new ArrayList<>();
+            if (!phNum1.isEmpty()) {
                 contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos1", phNum1));
-            if (!phNum2.isEmpty())
+            }
+            if (!phNum2.isEmpty()) {
                 contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos2", phNum2));
-            if (!phNum3.isEmpty())
+            }
+            if (!phNum3.isEmpty()) {
                 contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos3", phNum3));
-
+            }
+            //保存到IC的数据库上
+            for (int i = 0; i < contactArray.size(); i++) {
+                //数据入库
+                Contact contact = contactArray.get(i);
+                ContentValues item = new ContentValues();
+                item.put(ICDatabaseHelper.fType, ICDatabaseHelper.MemberType.SOS);
+                item.put(ICDatabaseHelper.fUserName, contact.name);
+                item.put(ICDatabaseHelper.fPhoneNum, contact.number);
+                runtime.getContextProxy()
+                        .getResolver()
+                        .insert(Uri.parse(ICMembersProvider.MEMBERS), item);
+            }
             runtime.getDbHelper().saveContacts(contactArray, false, false, false, false, false, true);
-
         } else {
             ICLogger.i(" BP12 format error!");
         }
@@ -740,37 +1144,38 @@ public class protocol_beehome {
 
 
     public static StringMessage AP14(String index, String[] phnumbs) {
-        return genStringMessage(cmdMap.get(CMD_TYPE.AP14), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP14))
-                .append(CMDSPLIT).append(index)
-                .append(CMDSPLIT).append(phnumbs[0])
-                .append(CMDSPLIT).append(phnumbs[1])
-                .append(CMDSPLIT).append(phnumbs[2])
-                .append(CMDSPLIT).append(phnumbs[3])
-                .append(CMDSPLIT).append(phnumbs[4])
-                .append(CMDSPLIT).append(phnumbs[5])
-                .append(CMDSPLIT).append(phnumbs[6])
-                .append(CMDSPLIT).append(phnumbs[7])
-                .append(CMDSPLIT).append(phnumbs[8])
-                .append(CMDSPLIT).append(phnumbs[9])
-                .append(CMDEND).toString());
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.AP14),
+                new StringBuffer(CMDHEADER).append(cmdStrMap.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#
- */
+        //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 ");
@@ -817,31 +1222,33 @@ public class protocol_beehome {
                 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));
+                    String phoneNum = tmp[1];
+                    //保存到数据库中
+                    ICLogger.i(i / 2 + " 姓名 " + name + ", 电话 " + phoneNum);
+                    contactArray.add(new Contact(Contact.CATEGORY_CALL, name, phoneNum));
+                    ContentValues contentValues = new ContentValues();
+                    contentValues.put(ICDatabaseHelper.fType, ICDatabaseHelper.MemberType.WHITE_LIST);
+                    contentValues.put(ICDatabaseHelper.fPhoneNum, phoneNum);
+                    contentValues.put(ICDatabaseHelper.fID, phoneNum);
+                    contentValues.put(ICDatabaseHelper.fUserName, name);
+                    contentValues.put(ICDatabaseHelper.fCreateTime, System.currentTimeMillis());
+                    contentValues.put(ICDatabaseHelper.fUpdateTime, System.currentTimeMillis());
+                    //保存联系人列表,类型为白名单
+                    runtime.getContextProxy().getResolver().insert(Uri.parse(ICMembersProvider.MEMBERS), contentValues);
                 } else {
-                    ICLogger.i("phnums[" + i + "]=" + phnums[i] + ",split = " + tmp.length);
-
+                    ICLogger.i("phoneNumber[" + 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);
-
+            runtime.getDbHelper().saveContacts(contactArray,false,false,true,false,false,false);
         } else {
             ICLogger.i(" BP14 format error!");
         }
-
     }
 
 
     public static StringMessage AP85(Runtime ds, String cmddata) {
 //示例数据:IWAP49,68##
-        return genStringMessage(cmdMap.get(CMD_TYPE.AP85), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP85))
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.AP85), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP85))
                 .append(CMDSPLIT).append(cmddata)
                 .append(CMDEND).toString());
 
@@ -849,20 +1256,20 @@ public class protocol_beehome {
 
     //设置闹钟
     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 表示久坐提醒
-//多组闹钟之间用”@”符号分隔
+        //        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 为关*/,
@@ -924,7 +1331,7 @@ public class protocol_beehome {
                                     .append(", alarmtype=").append(alarmtype)
                                     .toString()
                             );
-
+                            //TODO:
                             alarmlist.add(new Alarm("ST" + alarmtime.substring(0, 2) + "." + alarmtime.substring(2), "W" + repeat, "CON", alarmswitch == 1 ? "ON" : "OFF", "闹铃"));
 
                         } else {
@@ -933,15 +1340,11 @@ public class protocol_beehome {
 
                     }
                 }//循环获取alarm数据结束
-                runtime.getDbHelper().saveAlarm(alarmlist);
-
-                //do clean and set alarm things
             } catch (Exception e) {
                 ICLogger.e(e.getMessage(), e);
             }
         }
-//IWBP85,867155030002145,410385,1,0,#
-
+        //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);
@@ -949,93 +1352,90 @@ public class protocol_beehome {
     }
 
 
-// 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))
+    // AP05命令L02服务器不适用
+    public static String AP05(boolean recFlat) {
+        return new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP05))
+                .append(CMDSPLIT).append(recFlat ? 1 : 0)
+                .append(CMDEND).toString();
+    }
+
+    public void handleBP05(String cmd) {
+        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(cmdStrMap.get(CMD_TYPE.AP07))
                 .append(CMDSPLIT).append(packetTime)
                 .append(CMDSPLIT).append(count)
                 .append(CMDSPLIT).append(index)
-                .append(CMDSPLIT).append(datalen)
+                .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] = '#';
+        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;
+        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) {
+    //IWBP07,20211222103621,6,1,1#
+    public void handleBP07(String cmd) {
+        //TODO:判断是否要进行下一个包发送
+        String[] split = cmd.split(CMDSPLIT);
+        if (split.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的时候表示所有包发送完毕,停止继续发送
+                String totalPackageCount = split[2];
+                ICLogger.d("totalPackageCount ==> " + totalPackageCount);
+                String currentPackage = split[3];
+                ICLogger.d("currentPackage ==> " + currentPackage);
+                String isSuccessStr = split[4];
+                ICLogger.d("是否接收成功:" + isSuccessStr);
+                if ("1".equals(isSuccessStr) && !currentPackage.equals(totalPackageCount)) {
+                    int packetIndex = Integer.parseInt(currentPackage);
+                    //发送下一包
                     voicePacket.getInstanceSent().setCurrentIndexToSent(packetIndex);
                 }
-                //发送消息,再次检查要发送的语音包,确认其发送完毕
-                connection.DeliverCMDMessageToSystem("SentVoicePacket", "SentVoicePacket");
+
+                //如果不成功则重发
+                if (!currentPackage.equals(totalPackageCount)) {
+                    ICLogger.d("发送下一包数据..." + currentPackage);
+                    mConnection.DeliverCMDMessageToSystem("SentVoicePacket", "SentVoicePacket");
+                }
             } catch (Exception e) {
-                ICLogger.e(e.getMessage(), e);
+                e.printStackTrace();
             }
         } else {
-            ICLogger.i(" BP07 Format error!");
+            ICLogger.d("parse BP07 error.");
         }
+        //平台收到语音数据
+        ICLogger.d("平台收到语音数据" + cmd);
     }
 
 
     public static StringMessage AP33(String cmdindex, int workMode) {
-//IWAP33,080835,1#
-//080835:指令流水号
-//1:设置信息,供服务器同步
-        return genStringMessage(cmdMap.get(CMD_TYPE.AP33), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP33))
+        //IWAP33,080835,1#
+        //080835:指令流水号
+        //1:设置信息,供服务器同步
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.AP33), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP33))
                 .append(CMDSPLIT).append(cmdindex)
                 .append(CMDSPLIT).append(workMode)
                 .append(CMDEND).toString());
@@ -1044,18 +1444,18 @@ public class protocol_beehome {
     //设置工作模式
     public void handleBP33(Connection connection, Runtime runtime, String cmd) {
 
-//    IWBP33,867155030001063,560555,1
-//        IW:标识符
-//        BP33 : 命令字符
-//        353456789012345:IMEI号,设备唯一ID
-//        080835:指令流水号
-//        1:设备工作模式,1:正常模式,2:省电模式,3:紧急模式
+        //IWBP33,867155030001063,560555,1
+        //IW:标识符
+        //BP33 : 命令字符
+        //353456789012345:IMEI号,设备唯一ID
+        //080835:指令流水号
+        //1:设备工作模式,1:正常模式,2:省电模式,3:紧急模式
 
-        String[] cmdlist = cmd.split(",");
-        if (cmdlist.length == 4) {
-            log("com.ic.work mode " + cmdlist[3]);
+        String[] cmdList = cmd.split(",");
+        if (cmdList.length == 4) {
+            log("com.ic.work mode " + cmdList[3]);
             try {
-                int mod = Integer.parseInt(cmdlist[3]);
+                int mod = Integer.parseInt(cmdList[3]);
                 int Cycle = 900;
                 switch (mod) {
                     case ICLocation.NORMAL_MOD:
@@ -1068,10 +1468,8 @@ public class protocol_beehome {
                     case ICLocation.REALTIME_MOD:
                         Cycle = 60;
                         break;
-
                 }
-
-                StringMessage msg = AP33(cmdlist[2], mod);
+                StringMessage msg = AP33(cmdList[2], mod);
                 //设定当前工作模式及循环频率
                 connection.send(msg);
                 log("reply msg " + msg);
@@ -1080,7 +1478,7 @@ public class protocol_beehome {
                 Config.setLocationCycle(runtime.getContextProxy().context, Cycle);
                 runtime.getLocationInstance().setLocation_cycle(Cycle);
                 runtime.getLocationInstance().setWorkingMod(mod);
-//            CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod());
+                //CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod());
                 //此处设置好配置后,会在LocationClient通过消息开始执行及时定位操作。
             } catch (Exception e) {
                 ICLogger.e(e.getMessage(), e);
@@ -1091,10 +1489,10 @@ public class protocol_beehome {
 
 
     public static StringMessage AP34(String cmdindex, int workMode) {
-//IWAP34,588854,1#
-//080835:指令流水号
-//8:模式
-        return genStringMessage(cmdMap.get(CMD_TYPE.AP34), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP34))
+        //IWAP34,588854,1#
+        //080835:指令流水号
+        //8:模式
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.AP34), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP34))
                 .append(CMDSPLIT).append(cmdindex)
                 .append(CMDSPLIT).append(workMode)
                 .append(CMDEND).toString());
@@ -1103,24 +1501,22 @@ public class protocol_beehome {
     //设置自定义工作模式
     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) {
-
+        //IWBP34,867155030001063,588854,8,900,1#
+        //IW:标识符
+        //BP33 : 命令字符
+        //353456789012345:IMEI号,设备唯一ID
+        //080835:指令流水号
+        //1:设备工作模式,1:正常模式,2:省电模式,3:紧急模式
 
-            log("com.ic.work mode " + cmdlist[3]);
+        String[] cmdList = cmd.split(",");
+        if (cmdList.length == 6) {
+            log("com.ic.work mode " + cmdList[3]);
             try {
-                int mod = Integer.parseInt(cmdlist[3]);
-                int Cycle = Integer.parseInt(cmdlist[4]);
-                int gpson = Integer.parseInt(cmdlist[5]);
+                int mod = Integer.parseInt(cmdList[3]);
+                int Cycle = Integer.parseInt(cmdList[4]);
+                int gpson = Integer.parseInt(cmdList[5]);
 
-                StringMessage msg = AP34(cmdlist[2], mod);
+                StringMessage msg = AP34(cmdList[2], mod);
                 //设定当前工作模式及循环频率
                 connection.send(msg);
 
@@ -1135,7 +1531,7 @@ public class protocol_beehome {
                 Config.setLocationCycle(runtime.getContextProxy().context, Cycle);
                 runtime.getLocationInstance().setLocation_cycle(Cycle);
                 runtime.getLocationInstance().setWorkingMod(mod);
-//            CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod());
+                //CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod());
                 //此处设置好配置后,会在LocationClient通过消息开始执行及时定位操作。
             } catch (Exception e) {
                 ICLogger.e(e.getMessage(), e);
@@ -1146,26 +1542,24 @@ public class protocol_beehome {
 
     public void handleBP40(Connection connection, Runtime runtime, String cmd) {
 
-//        IWBP40,353456789012345,080835,XXXXXXXXXXXXXX#
-//        IW:标识符
-//        BP40 : 命令字符
-//        353456789012345:IMEI号,设备唯一ID
-//        080835 :指令流水号
-//        XXXXXXXXXXXX : 表示文字内容GB2312编码
-
-
-        String[] cmdlist = cmd.split(",");
-        if (cmdlist.length == 4) {
-            String cmdindex = cmdlist[2];
-            String txtmsg = cmdlist[3];
-
-            txtmsg = Util.UrlGB2312ToUTF8(txtmsg);
-            StringMessage msg = AP40(cmdindex, 1);
+        //IWBP40,353456789012345,080835,XXXXXXXXXXXXXX#
+        //IW:标识符
+        //BP40 : 命令字符
+        //353456789012345:IMEI号,设备唯一ID
+        //080835 :指令流水号
+        //XXXXXXXXXXXX : 表示文字内容GB2312编码
+
+        String[] cmdList = cmd.split(",");
+        if (cmdList.length == 4) {
+            String cmdIndex = cmdList[2];
+            String txtMsg = cmdList[3];
+            txtMsg = Util.UrlGB2312ToUTF8(txtMsg);
+            StringMessage msg = AP40(cmdIndex, 1);
             //设定当前工作模式及循环频率
             connection.send(msg);
-            ICLogger.i("received Txt Msg " + txtmsg);
-            runtime.getContextProxy().sendMsgBroadcast(txtmsg, 0);
-            runtime.getContextProxy().saveMstToSMSDB(txtmsg);
+            ICLogger.i("received Txt Msg " + txtMsg);
+            runtime.getContextProxy().sendMsgBroadcast(txtMsg, 0);
+            runtime.getContextProxy().saveMstToSMSDB(txtMsg);
         } else {
             ICLogger.i("BP40 format error!");
         }
@@ -1176,7 +1570,7 @@ public class protocol_beehome {
 //        IWAP40,080835,1#
 //        080835:指令流水号
 //        1:表示设备接受数据成功,0表示设备接受数据失败
-        return genStringMessage(cmdMap.get(CMD_TYPE.AP40), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP40))
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.AP40), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP40))
                 .append(CMDSPLIT).append(cmdindex)
                 .append(CMDSPLIT).append(success)
                 .append(CMDEND).toString());
@@ -1191,7 +1585,7 @@ public class protocol_beehome {
      */
     public static StringMessage AP49(Runtime ds) {
         //示例数据:IWAP49,68##
-        return genStringMessage(cmdMap.get(CMD_TYPE.AP49), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP49))
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.AP49), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP49))
                 .append(CMDSPLIT).append(ds.getHRS().getPPG())
                 .append(CMDEND).toString());
 
@@ -1214,7 +1608,7 @@ public class protocol_beehome {
         //85 : 血压低压 [舒张压]
         //平台响应:      IWBPHT#
         //表示平台已接收,可不作响应
-        return genStringMessage(cmdMap.get(CMD_TYPE.APHT), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APHT))
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.APHT), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.APHT))
                 .append(CMDSPLIT).append(ds.getHRS().getPPG())
                 .append(CMDSPLIT).append(ds.getHRS().getBPH())
                 .append(CMDSPLIT).append(ds.getHRS().getBPL())
@@ -1231,7 +1625,7 @@ public class protocol_beehome {
         //85 : 血压低压 [舒张压]
         //平台响应:      IWBPHT#
         //表示平台已接收,可不作响应
-        return genStringMessage(cmdMap.get(CMD_TYPE.APHT), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APHT))
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.APHT), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.APHT))
                 .append(CMDSPLIT).append(ppg)
                 .append(CMDSPLIT).append(bph)
                 .append(CMDSPLIT).append(bpl)
@@ -1241,22 +1635,22 @@ public class protocol_beehome {
 
     //立即定位反馈
     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))
+        //IWAP16,080835#
+        //080835:指令流水号
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.AP16), new StringBuffer(CMDHEADER).append(cmdStrMap.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 :指令流水号
+        //IWBP16,353456789012345,080835#
+        //说明:
+        //IW:标识符
+        //BP16 : 命令字符
+        //353456789012345:IMEI号,设备唯一ID
+        //080835 :指令流水号
         String[] cmdlist = cmd.split(",");
         if (cmdlist.length == 3) {
             log("imei " + cmdlist[1] + ", cmdindex " + cmdlist[2]);
@@ -1279,7 +1673,7 @@ public class protocol_beehome {
         //9750: LAC
         //3613: CID
 
-        return genStringMessage(cmdMap.get(CMD_TYPE.APTM), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTM))
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.APTM), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.APTM))
                 .append(CMDSPLIT).append(ds.getLocationInstance().getMCC())
                 .append(CMDSPLIT).append(ds.getLocationInstance().getMNC())
                 .append(CMDSPLIT).append(ds.getLocationInstance().getLAC())
@@ -1313,7 +1707,7 @@ public class protocol_beehome {
         //IMEI:
         /// Version String
 
-        return genStringMessage(cmdMap.get(CMD_TYPE.APVR), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APVR))
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.APVR), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.APVR))
                 .append(CMDSPLIT).append(ds.IMEI())
                 .append(CMDSPLIT).append(DeviceInfoUtil.getSWVersionDisplayName())
                 .append(CMDEND).toString());
@@ -1323,7 +1717,7 @@ public class protocol_beehome {
     public static StringMessage AP15(String index) {
 //IWAP15, 080835#
 //080835:指令流水号
-        return genStringMessage(cmdMap.get(CMD_TYPE.AP15), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP15))
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.AP15), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP15))
                 .append(CMDSPLIT).append(index)
                 .append(CMDEND).toString());
     }
@@ -1359,45 +1753,46 @@ public class protocol_beehome {
 
     }
 
-
     /*语音下行反馈*/
-    public static StringMessage AP28(String name, String msg, int packagecount, int currentpackageindex, int received_success) {
+    public static StringMessage AP28(String name, String msg, int packageCount, int currentPackageIndex, int received_success) {
         //示例数据:IWAP28,D3590D54,xxxx,6,1,1#
-        return genStringMessage(cmdMap.get(CMD_TYPE.AP28), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP28))
-                .append(CMDSPLIT).append(name)
-                .append(CMDSPLIT).append(msg)
-                .append(CMDSPLIT).append(packagecount)
-                .append(CMDSPLIT).append(currentpackageindex)
-                .append(CMDSPLIT).append(received_success)
-                .append(CMDEND).toString());
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.AP28),
+                new StringBuffer(CMDHEADER).append(cmdStrMap.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) {
+    public void handleBP28(Connection connection, String cmd, 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;
+        /**
+         * 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;
@@ -1408,7 +1803,13 @@ public class protocol_beehome {
         if (msg.length >= 6) {
 
             try {
-                Name = msg[1];
+                String originalName = msg[1];
+//                if (TextUtils.isEmpty(originalName)) {
+//                    name = "group";
+//                } else {
+//                    name = Util.decodeUnicode2Utf8(originalName);
+//                }
+                name = "group";
                 appendIndex = msg[2];
                 packetCount = Integer.parseInt(msg[3]);
                 currentId = Integer.parseInt(msg[4]);
@@ -1416,50 +1817,110 @@ public class protocol_beehome {
                 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)
+                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);
+                        .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);
+                connection.send(AP28(originalName, 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);
-
+                    message2Db("", amrFilepath, ICDatabaseHelper.MessageType.VOICE);
                     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)));
+            ICLogger.d("format Error");
+        }
+
+    }
 
+
+    private void message2Db(String remoteId, String amrFilepath, int type) {
+        //计算文件时长
+        int amrDuration = 0;
+        if (type == ICDatabaseHelper.MessageType.VOICE ||
+                type == ICDatabaseHelper.MessageType.FRIEND_VOICE) {
+            try {
+                File file = new File(amrFilepath);
+                amrDuration = getAmrDuration(file);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
         }
+        ContentResolver resolver = mRuntime.getContextProxy().getResolver();
+        ContentValues contentValues = new ContentValues();
+        //路径
+        contentValues.put("content", amrFilepath);
+        //类型为声音
+        contentValues.put("type", type);
+        //状态:0表示未读
+        contentValues.put("state", 0);
+        //文件时长
+        contentValues.put("duration", amrDuration);
+        //接受还是发送,1表示来信
+        contentValues.put("in_or_out", 1);
+        //对方号码是没有的
+        contentValues.put("remote_num", remoteId);
+        contentValues.put("create_time", System.currentTimeMillis());
+        contentValues.put("update_time", System.currentTimeMillis());
+        resolver.insert(Uri.parse(WeTalkMessageProvider.MESSAGES), contentValues);
+    }
 
+    /**
+     * 获取声音时长,代码来源于网络,单位:秒
+     *
+     * @param file
+     * @return
+     * @throws IOException
+     */
+    public int getAmrDuration(File file) throws IOException {
+        long duration = -1;
+        int[] packedSize = {12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0,
+                0, 0};
+        RandomAccessFile randomAccessFile = null;
+        try {
+            randomAccessFile = new RandomAccessFile(file, "rw");
+            // 文件的长度
+            long length = file.length();
+            // 设置初始位置
+            int pos = 6;
+            // 初始帧数
+            int frameCount = 0;
+            int packedPos = -1;
+            // 初始数据值
+            byte[] data = new byte[1];
+            while (pos <= length) {
+                randomAccessFile.seek(pos);
+                if (randomAccessFile.read(data, 0, 1) != 1) {
+                    duration = length > 0 ? ((length - 6) / 650) : 0;
+                    break;
+                }
+                packedPos = (data[0] >> 3) & 0x0F;
+                pos += packedSize[packedPos] + 1;
+                frameCount++;
+            }
+            // 帧数*20
+            duration += frameCount * 20;
+        } finally {
+            if (randomAccessFile != null) {
+                randomAccessFile.close();
+            }
+        }
+        return (int) ((duration / 1000) + 1);
     }
 
+
     public void sendBroadcast(String cmd, Runtime dev) {
 
         ComponentName componentName = new ComponentName("com.ic.watch", "com.ic.watch.launcher.ChatActivity");
@@ -1477,7 +1938,7 @@ public class protocol_beehome {
         //设备响应:      IWAP80,080835,1#
         //080835:指令流水号
         //1:表示设备执行成功,0 表示设备执行失败
-        return genStringMessage(cmdMap.get(CMD_TYPE.AP84), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP84))
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.AP84), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP84))
                 .append(CMDSPLIT).append(index)
                 .append(CMDSPLIT).append(success)
                 .append(CMDEND).toString());
@@ -1493,21 +1954,17 @@ public class protocol_beehome {
         //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!");
         }
 
@@ -1518,7 +1975,7 @@ public class protocol_beehome {
 
         //设备响应:      IWAP86, 080835#
         //080835:指令流水号
-        return genStringMessage(cmdMap.get(CMD_TYPE.AP68), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP68))
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.AP68), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP68))
                 .append(CMDSPLIT).append(index)
                 .append(CMDEND).toString());
     }
@@ -1553,7 +2010,7 @@ public class protocol_beehome {
 
         //设备响应:      IWAP86, 080835#
         //080835:指令流水号
-        return genStringMessage(cmdMap.get(CMD_TYPE.AP86), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP86))
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.AP86), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP86))
                 .append(CMDSPLIT).append(index)
                 .append(CMDEND).toString());
     }
@@ -1597,7 +2054,7 @@ public class protocol_beehome {
     public static StringMessage AP88(String index) {
         //设备响应:      IWAP88, 080835#
         //080835:指令流水号
-        return genStringMessage(cmdMap.get(CMD_TYPE.AP88), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP88))
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.AP88), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP88))
                 .append(CMDSPLIT).append(index)
                 .append(CMDEND).toString());
     }
@@ -1605,12 +2062,10 @@ public class protocol_beehome {
     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!");
         }
@@ -1621,7 +2076,7 @@ public class protocol_beehome {
 
         //设备响应:      IWAP89, 080835#
         //080835:指令流水号
-        return genStringMessage(cmdMap.get(CMD_TYPE.AP89), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP89))
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.AP89), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP89))
                 .append(CMDSPLIT).append(index)
                 .append(CMDEND).toString());
     }
@@ -1664,7 +2119,7 @@ public class protocol_beehome {
         //设备响应:      IWAPTE,080835,60#
         //080835:指令流水号
         //1:表示设备接受数据成功,0表示设备接受数据失败
-        return genStringMessage(cmdMap.get(CMD_TYPE.APTE), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTE))
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.APTE), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.APTE))
                 .append(CMDSPLIT).append(index)
                 .append(CMDSPLIT).append(freq)
                 .append(CMDEND).toString());
@@ -1681,18 +2136,25 @@ public class protocol_beehome {
         //080835 :指令流水号
         //60 : 上传间隔,单位分钟(60分钟上传一次体温,终端收到后立即开始测量一次并重置定时器)
         String[] list = cmd.split(CMDSPLIT);
-        if (list.length == 4) {
+        if (list.length >= 3) {
             try {
                 String index = list[2];
-                String freqstr = list[3];
+
+                String freqstr = "0";
+                if (list.length == 4)
+                    freqstr =list[3];
+
                 int freq = Integer.parseInt(freqstr);
                 connection.send(APTE(index, freq));
                 ICLogger.i("收到服务器指令:测量体温 " + freq + "分钟一次。");
-                Config.setTemperatureTestCycle(runtime, freq * 60);
+                //if(freq>0) {
+                    Config.setTemperatureTestCycle(runtime, freq * 60);
+                //}
                 CoreService.getInstance().setTempAlarm(true);
+                //setTempAlarm中执行温度检测,下面无需再执行了!
 
-                if (runtime.check_stat_do_temp_test())
-                    TemperatureUtil.getInstance().doTempTestInThread(FROM_SERVER);
+                //if (runtime.check_stat_do_temp_test())
+                //    TemperatureUtil.getInstance().doTempTestInThread(FROM_SERVER);
             } catch (Exception e) {
                 ICLogger.e(e.getMessage(), e);
             }
@@ -1703,7 +2165,7 @@ public class protocol_beehome {
 //            connection.send(genStringMessage("APTP",temperatureMsg));
 //            ICLogger.i("发送体温测量值 "+temperatureMsg);
         } else {
-            ICLogger.i("BP89 format error!");
+            ICLogger.i("BPTE format error!");
         }
 
     }
@@ -1716,8 +2178,8 @@ public class protocol_beehome {
         //APTP : 命令字符
         //35.3:测量体温 (摄氏度)
         //33,132:温补用的参数,此处不用,可以用0 来代替。
-        return genStringMessage(cmdMap.get(CMD_TYPE.APTP),
-                new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTP))
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.APTP),
+                new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.APTP))
                         .append(CMDSPLIT).append(String.format("%1$.2f", body_temp))
                         .append(CMDSPLIT).append(String.format("%1$.2f", wrist_temp))
                         .append(CMDSPLIT).append(0)
@@ -1734,7 +2196,7 @@ public class protocol_beehome {
     public static StringMessage APX1(String id) {
         //设备响应:      IWAPX1, 080835#
         //080835:指令流水号
-        return genStringMessage(cmdMap.get(CMD_TYPE.APX1), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APX1))
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.APX1), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.APX1))
                 .append(CMDSPLIT).append(id)
                 .append(CMDEND).toString());
     }
@@ -1792,7 +2254,7 @@ public class protocol_beehome {
     public static StringMessage APS4(String id) {
         //设备响应:      IWAPS4,080835#
         //080835:指令流水号
-        return genStringMessage(cmdMap.get(CMD_TYPE.APS4), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APS4))
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.APS4), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.APS4))
                 .append(CMDSPLIT).append(id)
                 .append(CMDEND).toString());
     }
@@ -1811,9 +2273,9 @@ public class protocol_beehome {
             ICLogger.d("is24Hour == > " + is24Hour);
             TimeUtil.set24Hour(mRuntime.getContextProxy().context, is24Hour);
             mConnection.send(
-                    genStringMessage(cmdMap.get(CMD_TYPE.APTF),
+                    genStringMessage(cmdStrMap.get(CMD_TYPE.APTF),
                             new StringBuilder(CMDHEADER)
-                                    .append(cmdMap.get(CMD_TYPE.APTF))
+                                    .append(cmdStrMap.get(CMD_TYPE.APTF))
                                     .append(CMDSPLIT)
                                     .append(split[2]).append(CMDEND).toString())
             );
@@ -1881,17 +2343,390 @@ public class protocol_beehome {
         }
     }
 
+    public static StringMessage APSQ(String id, int type, int cycle) {
+        //设备响应:      IWAPSQ,080835,1,60#
+        //080835:指令流水号
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.APSQ),
+                new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.APSQ))
+                        .append(CMDSPLIT).append(id)
+                        .append(CMDSPLIT).append(type)
+                        .append(CMDSPLIT).append(cycle)
+                        .append(CMDEND).toString());
+    }
+
+    /**
+     * 上传健康数据,IWAPJK,2021-05-29 13:00:00,1,69|120#
+     *
+     * @param type 1表示血压,2表示心率,3表示体温
+     * @return
+     */
+    public static StringMessage APJK(int type, Runtime runtime) {
+        StringBuilder sb = new StringBuilder(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.APJK));
+        sb.append(CMDSPLIT);
+        //添加时间
+        sb.append(TimeUtil.getUTCTimeForCameraMark()).append(CMDSPLIT);
+        sb.append(type).append(CMDSPLIT);
+        if (type == 1) {
+            //血压
+            sb.append(runtime.getHRS().getBPL()).append("|").append(runtime.getHRS().getBPH());
+        } else if (type == 2) {
+            //心率
+            sb.append(runtime.getHRS().getPPG());
+        } else if (type == 3) {
+            sb.append(String.format("%1$.2f", runtime.tempInfo.currentBodyTemp));
+        } else if (type == 4) {
+            sb.append(runtime.getHRS().getSpo2());
+        }
+        sb.append(CMDEND);
+        String s = sb.toString();
+        ICLogger.d("apjk ==>  " + s);
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.APTP), s);
+    }
+
+    private void handleBPMC(String cmd) {
+        //指令,IMEI,流水,值:0,1,2。
+        //0表示关闭,1表示打开,2表示获取当前的状态,不做设置,只返回
+        //IWBPMC,353456789012345,080835,1#
+        String[] split = cmd.split(CMDSPLIT);
+        if (split.length == 4) {
+            String index = split[2];
+            String value = split[3];
+            ICLogger.d("BPMC index ==> " + index + " value==> " + value);
+            //判断value,返回内容
+            boolean responseValue = false;
+            if ("0".equals(value)) {
+                responseValue = false;
+                LocationClient.setSkipMoveCheck(false);
+                Config.setSkipMoveCheckFlagGlobal(mRuntime.getContextProxy().context, false);
+            } else if ("1".equals(value)) {
+                responseValue = true;
+                LocationClient.setSkipMoveCheck(true);
+                Config.setSkipMoveCheckFlagGlobal(mRuntime.getContextProxy().context, true);
+            } else if ("2".equals(value)) {
+                responseValue = LocationClient.getSkipMoveCheck();
+            }
+            //返回结果
+            StringMessage apmc = APMC(index, responseValue);
+            ICLogger.d("apmc ==> " + apmc);
+            mConnection.send(apmc);
+        } else {
+            ICLogger.d("parse error ==> " + cmd);
+        }
+    }
+
+    private StringMessage APMC(String index, boolean responseValue) {
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.APMC), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.APMC))
+                .append(CMDSPLIT).append(index)
+                .append(CMDSPLIT).append(responseValue)
+                .append(CMDEND).toString());
+    }
+
+    /**
+     * 处理天气信息
+     * 平台响应: 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天天气如天气编号及描述对应如下
+     * (天气描述不需要发送括号内的白天晚上)
+     * 因天气接口的变更 返
+     * 回天气类型暂时支持 11 16 26 32
+     * 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:局部雷阵雨      
+     *
+     * @param cmd
+     */
+    private void handleBPTQ(String cmd) {
+        //对指令进行切割
+        String[] cmdList = cmd.split(CMDSPLIT);
+        if (cmdList.length == 23) {
+
+            StringBuilder sb = new StringBuilder();
+            StringBuilder msg = new StringBuilder();
+            String cityName = Util.decodeUnicode2Utf8(cmdList[22]);
+            List<GenericWeatherInfo> weatherInfo = new ArrayList<>();
+            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(";");
+
+                //返回数据给UI
+                GenericWeatherInfo itemFirst = new GenericWeatherInfo(DayTime,
+                        weather_name, weather_id, temp_current, temp_low, temp_high, cityName);
+                //封装数据
+                weatherInfo.add(itemFirst);
+            }
+            ICLogger.i(cityName + " \n" + sb.toString());
+
+            msg.insert(0, cityName + ";");
+            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);
+            mRuntime.updateS123Weather(weatherInfo);
+        } else {
+            ICLogger.i(" BPTQ Format error!");
+        }
+    }
+
+    public void handleBP87(String cmd, 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);
+            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!");
+        }
+
+    }
+
+    /**
+     * 拨打电话(下行协议号:BP32,响应:AP32)
+     * IWBP32,353456789012345,080835,133xxxxxxxx#
+     * <p>
+     * 响应:
+     * IWAP32,080835#
+     *
+     * @param cmd
+     */
+    private void handleBP32(String cmd) {
+        String[] split = cmd.split(CMDSPLIT);
+        if (split.length == 4) {
+            String cmdIndex = split[2];
+            //回复消息
+            mConnection.send(AP32(cmdIndex));
+            //开始拨号
+            String targetNumber = split[3];
+            ICLogger.d("target number is ==> " + targetNumber);
+            Intent intent = new Intent(Intent.ACTION_CALL);
+            intent.setData(Uri.parse("tel:" + targetNumber));
+            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+            if (ActivityCompat.checkSelfPermission(mRuntime.getContextProxy().context,
+                    Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
+                ICLogger.d("no permission to call...");
+                return;
+            }
+            mRuntime.getContextProxy().context.startActivity(intent);
+        } else {
+            ICLogger.d("BP32 format error==> " + cmd);
+        }
+    }
+
+    /**
+     * 拨号指令返回
+     *
+     * @param cmdIndex
+     * @return
+     */
+    private StringMessage AP32(String cmdIndex) {
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.AP32),
+                new StringBuilder(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP32))
+                        .append(CMDSPLIT).append(cmdIndex).append(CMDEND).toString());
+    }
+
+    /**
+     * 下发内容
+     * IWBP75,353456789012345,080835,1,3,D3590D54,0900 ,135,1@D3590D54,0900 ,135,1@D3590D54,0900 ,135,1#
+     * 回复消息
+     * IWAP75,080835, 1,3,D3590D54,0900 ,135,1@D3590D54,0900 ,135,1@D3590D54,0900 ,135,1#
+     *
+     * @param mRuntime
+     * @param cmd
+     */
+    private void handleBP75(Runtime mRuntime, String cmd) {
+        //IWBP75,353456789012345,080835,
+        // 1,
+        // 3,
+        // D3590D54,0900 ,135,1
+        // @
+        // D3590D54,0900 ,135,1
+        // @
+        // D3590D54,0900 ,135,1#
+        //解析数据
+        ICLogger.d("cmd is == > " + cmd);
+        String ap75Str = cmd.replace("BP75", "AP75");
+        String responseMsg =
+                ap75Str.replace(mRuntime.IMEI() + CMDSPLIT,
+                        "") + CMDEND;
+        ICLogger.d("responseMsg == > " + responseMsg);
+        mConnection.send(genStringMessage(cmdStrMap.get(CMD_TYPE.AP75), responseMsg));
+        try {
+            String[] split = cmd.split(CMDSPLIT);
+            int cmdLen = 0;
+            cmdLen += split[0].length() + 1;
+            cmdLen += split[1].length() + 1;
+            String streamCode = split[2];
+            cmdLen += streamCode.length() + 1;
+            ICLogger.d("streamCode == > " + streamCode);
+            String isAllOpen = split[3];
+            cmdLen += isAllOpen.length() + 1;
+            ICLogger.d("isAllOpen == > " + isAllOpen);
+            String alarmCount = split[4];
+            ICLogger.d("alarmCount = > " + alarmCount);
+            cmdLen += alarmCount.length() + 1;
+            String substring = cmd.substring(cmdLen);
+            String[] alarmItemArray = substring.split("@");
+            ContentResolver resolver = mRuntime.getContextProxy().getResolver();
+            //删除之前先取消已经设置的闹钟
+            List<Alarm> oldAlarmList = mRuntime.getDbHelper().queryIcAlarm();
+            //取消掉上次的闹钟,再进行设置新的
+            SilentManager.getInstance().cancelAlarm(oldAlarmList);
+            //闹钟下发,也是要清空闹钟的
+            resolver.delete(Uri.parse(ICAlarmProvider.ALARMS), null, null);
+            for (String itemStr : alarmItemArray) {
+                ICLogger.d("itemStr==> " + itemStr);
+                String[] itemDetail = itemStr.split(CMDSPLIT);
+                //第一个是名称
+                String alarmName = Util.decodeUnicode2Utf8(itemDetail[0]);
+                ICLogger.d("alarmName == > " + alarmName);
+                //第二个是时间
+                String alarmTime = itemDetail[1];
+                ICLogger.d("alarmTime == > " + alarmTime);
+                //第三个是循环星期
+                String weekItem = itemDetail[2];
+                ICLogger.d("weekItem == > " + weekItem);
+                //第四个是开关,有可能是 2,如果是2的话,那么就是单次响铃
+                String isOpen = itemDetail[3];
+                ICLogger.d("isOpen == > " + isOpen);
+                //如果是全部关闭,那么所有的闹钟都会为0
+                if ("0".equals(isAllOpen)) {
+                    isOpen = "0";
+                }
+                if (TextUtils.isEmpty(alarmTime)) {
+                    continue;
+                }
+                //添加到闹钟数据库中
+                String hour = alarmTime.substring(0, 2);
+                String minute = alarmTime.substring(2);
+                if (TextUtils.isEmpty(hour) || TextUtils.isEmpty(minute)) {
+                    ICLogger.d("date ERROR...");
+                    continue;
+                }
+                String status = "ON";
+                if ("0".equals(isOpen)) {
+                    status = "OFF";
+                } else if ("1".equals(isOpen)) {
+                    status = "ON";
+                } else if ("2".equals(isOpen)) {
+                    status = "ONCE";
+                }
+                Alarm alarmItem = new Alarm("ST" + hour + "." + minute,
+                        "W" + weekItem, "CON", status, alarmName);
+                ICLogger.d("alarmItem == > " + alarmName);
+                //入库
+                ICLogger.d(" alarmItem.name==> " + alarmItem.name);
+                ContentValues contentValues = new ContentValues();
+                contentValues.put(ICDatabaseHelper.alarm_name, alarmItem.name);
+                contentValues.put(ICDatabaseHelper.alarm_week, alarmItem.week);
+                contentValues.put(ICDatabaseHelper.alarm_ring, alarmItem.ring);
+                contentValues.put(ICDatabaseHelper.alarm_time, alarmItem.time);
+                contentValues.put(ICDatabaseHelper.alarm_status, alarmItem.status);
+                contentValues.put(ICDatabaseHelper.updateTime, System.currentTimeMillis());
+                contentValues.put(ICDatabaseHelper.createTime, System.currentTimeMillis());
+                resolver.insert(Uri.parse(ICAlarmProvider.ALARMS), contentValues);
+            }
+            //设置闹钟
+            mRuntime.getContextProxy().context.sendBroadcast(new Intent(ACTION_ALARM_ALARM_CHANGE));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public void handleBPSQ(String cmd, Connection connection, Runtime runtime) {
+        //IWBPSQ,353456789012345,080835,1,60#
+        //说明:
+        //  080835为序列号,1,是传感器类型(1是心率,2是血压,3是体温,4是血氧),60为间隔时间,单位为秒
+        String[] list = cmd.split(CMDSPLIT);
+        if (list.length >= 5) {
+            String imei = list[1];
+            String index = list[2];
+            String typestr = list[3].trim();
+            String cyclestr = list[4].trim();
+            int type = 0;
+            int cycle_seconds = 0;
+            int cycle_minutes = 0;
+            try {
+                type = Integer.parseInt(typestr);
+                cycle_seconds = Integer.parseInt(cyclestr);
+                connection.send(APSQ(index, type, cycle_seconds));
+                cycle_minutes = cycle_seconds / 60;
+                String type_name = "未知";
+                switch (type) {
+                    case 1:
+                        type_name = "心率";
+                        //发送重置PPGCycle的广播,会在CoreServer里面执行
+                        CoreService.getInstance().setHeartRateDetectAlarm(cycle_minutes);
+                        break;
+                    case 2:
+                        type_name = "血压";
+                        //发送重置PPGCycle的广播,会在CoreServer里面执行
+                        CoreService.getInstance().setHeartRateDetectAlarm(cycle_minutes);
+                        break;
+                    case 3:
+                        type_name = "体温";
+                        Config.setTemperatureTestCycle(runtime, cycle_seconds);
+                        CoreService.getInstance().setTempAlarm(true);
+                        break;
+                    case 4:
+                        type_name = "血氧";
+                        //发送重置PPGCycle的广播,会在CoreServer里面执行
+                        CoreService.getInstance().setHeartRateDetectAlarm(cycle_minutes);
+                        break;
+                    default:
+                        type_name = "未知";
+                        break;
+                }
+                ICLogger.i("收到 BPSQ  指令,设置体征传感器测试周期, IMEI " + imei + ", index " + index + ", 传感器类型 " + type + " " + type_name + " 间隔" + cycle_seconds + "秒,相当于" + cycle_minutes + "分钟");
+            } catch (Exception e) {
+                ICLogger.e(e.getMessage(), e);
+            }
+        } else {
+            ICLogger.i("BPSQ format error!");
+        }
+    }
+
     public static StringMessage APHP(Runtime ds) {
         //IWAPHP,60,130,85,95,90, , , , , , , , #
         //IW:标识符
-        //APHT : 命令字符
+        //APHP : 命令字符
         //60 : 表示心率
         //130: 血压高压 [收缩压]
         //85 : 血压低压 [舒张压]
         //95:血氧
         //90:血糖
 //        本消息适用所有终端,其中需要每项指标不一定全部有值,如果无值,则留空
-        return genStringMessage(cmdMap.get(CMD_TYPE.APHP), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APHP))
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.APHP), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.APHP))
                 .append(CMDSPLIT).append(ds.getHRS().getPPG())
                 .append(CMDSPLIT).append(ds.getHRS().getBPH())
                 .append(CMDSPLIT).append(ds.getHRS().getBPL())
@@ -1908,6 +2743,140 @@ public class protocol_beehome {
                 .append(CMDEND).toString());
     }
 
+    /**
+     * 处理拨号开关,数据入库,进入拨号前要获取一下,是否可以拨号,
+     *
+     * @param cmd IWBPPH,353456789012345,080835,1#
+     *            IWAPPH,080835,1#
+     */
+    private void handleBPPH(String cmd) {
+        //解析数据
+        String[] split = cmd.split(CMDSPLIT);
+        if (split.length == 4) {
+            try {
+                String id = split[2];
+                String value = split[3];
+                //1 : 表示设备可以拨号   0:表示设备不可拨号, 用于同步平台设置。
+                Util.setSystemProperties("persist.sys.phone.enable", value);
+                //返回结果
+                responseWithId(cmdStrMap.get(CMD_TYPE.APPH), id, value);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        } else {
+            ICLogger.d("handleBPPH error...");
+        }
+    }
+
+    /**
+     * 处理服务器模拟的短信指令
+     *
+     * @param cmd
+     */
+    private void handleBPSM(String cmd) {
+        //短信指令里的#要用@替换掉,逗号要用-代替(建议是平台去完成这个替换,用户还是按原指令去写)
+        //比如说短信指令是:#logctl#=upload,all
+        //改成:@logctl@=upload-all
+        //IWBPSM,353456789012345,080835,指令内容#
+        //IWBPSM:标示符
+        //353456789012345:IMEI号
+        //080835:流水号
+        //设备回复:
+        //IWAPSM,080835,1/0#
+        //1表示成功,0表示失败
+        String[] split = cmd.split(CMDSPLIT);
+        if (split.length == 4) {
+            String indexId = split[2];
+            String smsContent = split[3];
+            String targetSmsContent = smsContent.replaceAll("@", "#").replaceAll("-", ",");
+            ICLogger.d("targetSmsContent ==> " + targetSmsContent);
+            if (CoreService.smsManager != null) {
+                ICLogger.d("handle sms cmd....");
+                //"WEB-"就是靠这个标记给后台发送东西的了
+                CoreService.smsManager.handleSMS_CMD("WEB-" + indexId, targetSmsContent);
+            }
+        } else {
+            ICLogger.d("parse BPSM error..");
+        }
+    }
+
+
+    private void responseWithId(String cmd, String id, String... args) {
+        StringBuilder append = new StringBuilder(CMDHEADER).append(cmd)
+                .append(CMDSPLIT).append(id);
+        for (String arg : args) {
+            append.append(CMDSPLIT).append(arg);
+        }
+        append.append(CMDEND);
+        ICLogger.d("response content ==> " + append.toString());
+        StringMessage stringMessage = genStringMessage(cmd, append.toString());
+        mConnection.send(stringMessage);
+    }
+
+
+    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.ic.protocolSrv.CoreService.class);
+//            intent.setAction(ACTION_REMOTE_CAMERA);
+//            intent.putExtra("remote_number", id);
+//                context.startService(intent);
+//            runtime.getContextProxy().context.sendBroadcast(intent);
+                mHandler.post(new Runnable() {
+                    @Override
+                    public void run() {
+                        (new CameraUtil(context)).getPicture(id);
+                    }
+                });
+
+            } else if (cdd.equals("2")) {
+                Intent intent = new Intent();
+                intent.setAction(DIALOG_ACTION);
+                intent.putExtra("takephoto", "Take Photo !");
+                context.sendBroadcast(intent);
+            }
+        } else {
+            ICLogger.i(" BP46 Format error!");
+        }
+    }
+
+
+    public static StringMessage AP46(String id, String cmd) {
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.AP46),
+                new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP46))
+                        .append(CMDSPLIT).append(id)
+                        .append(CMDSPLIT).append(cmd)
+                        .append(CMDEND).toString());
+    }
+
+
     public static StringMessage APHP(int ppg, int bph, int bpl, int spo2) {
         //IWAPHP,60,130,85,95,90, , , , , , , , #
         //IW:标识符
@@ -1918,7 +2887,7 @@ public class protocol_beehome {
         //95:血氧
         //90:血糖
 //        本消息适用所有终端,其中需要每项指标不一定全部有值,如果无值,则留空
-        return genStringMessage(cmdMap.get(CMD_TYPE.APHP), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APHP))
+        return genStringMessage(cmdStrMap.get(CMD_TYPE.APHP), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.APHP))
                 .append(CMDSPLIT).append(ppg)
                 .append(CMDSPLIT).append(bph)
                 .append(CMDSPLIT).append(bpl)
@@ -1936,13 +2905,14 @@ public class protocol_beehome {
     }
 
     public void handleBPHP() {
-
         ICLogger.i("服务器收到APHP 心率血压血氧 !");
-
     }
 
     public boolean handleCmd(CMD_TYPE type, String cmd) {
-
+        if (type == null) {
+            ICLogger.d("type is null ==> " + cmd);
+            return false;
+        }
         //普通非二进制命令用此函数处理
         boolean ret = true;
         ICLogger.i("handleCmd " + type.name() + " strLen=" + cmd.length());
@@ -1958,6 +2928,11 @@ public class protocol_beehome {
                 ICLogger.i("服务器收到定位AP01");
                 mConnection.DeliverCMDMessageToSystem("AP01", cmd);//通知下面线程状态变化
                 break;
+            case BPH1: //gps定位包
+                handleBP01(cmd);
+                ICLogger.i("服务器收到历史定位BPH1");
+                mConnection.DeliverCMDMessageToSystem("BPH1", cmd);//通知下面线程状态变化
+                break;
             case BP02:// wifi定位包
                 handleBP02(cmd);
                 ICLogger.i("服务器收到定位AP02");
@@ -1968,16 +2943,14 @@ public class protocol_beehome {
                 ICLogger.i("服务器收到心跳包AP03");
                 mConnection.DeliverCMDMessageToSystem("heartbeat", cmd);//通知下面线程状态变化
                 break;
-
             case BP07:
                 //收到发送的语音包
-                handleBP07(cmd, mConnection);
+                handleBP07(cmd);
                 break;
             case BP10:
                 //报警包
                 mConnection.DeliverCMDMessageToSystem("AP10", cmd);//通知下面线程状态变化
                 break;
-
             case BPTM:
                 //校时命令
                 handleBPTM(cmd);
@@ -2005,12 +2978,6 @@ public class protocol_beehome {
                 handleBP16(mConnection, mRuntime, cmd);
                 mConnection.DeliverCMDMessageToSystem("StartLocate", cmd);//通知下面线程状态变化
                 break;
-
-//                            case BP05: //L02服务器不适用
-//                                //查询服务器语音 返回信息
-//                                API.handleBP05(cmd);
-//                                break;
-
             case BP12:
                 //收到设置SOS号码
                 handleBP12(mConnection, cmd, mRuntime);
@@ -2031,7 +2998,6 @@ public class protocol_beehome {
                 ICLogger.i("收到服务器恢复出厂设置命令BP17");
                 mConnection.DeliverCMDMessageToSystem("FactoryReset", cmd);//通知下面线程状态变化
                 break;
-
             case BP18:
                 //收到重启
                 handleBP18(mConnection, cmd);
@@ -2051,10 +3017,17 @@ public class protocol_beehome {
                 ICLogger.i("收到服务器推送文本消息");
                 mConnection.DeliverCMDMessageToSystem("showTxt", cmd);//通知下面线程状态变化
                 break;
-
             case BPXL:
                 handleBPXL(cmd, mConnection);
                 ICLogger.i("收到服务器心率检测命令");
+                Config.testType = HeartRateOxygenTestType.JUST_HEART_RATE;
+                if (mRuntime.check_stat_do_ppg_test())
+                    HeartRateManager.getInstance().triggerPPGTest(FROM_SERVER);
+                break;
+            case BPOX:
+                handleBPOX(cmd, mConnection);
+                ICLogger.i("收到服务器血氧检测命令");
+                Config.testType = HeartRateOxygenTestType.JUST_OXYGEN;
                 if (mRuntime.check_stat_do_ppg_test())
                     HeartRateManager.getInstance().triggerPPGTest(FROM_SERVER);
                 break;
@@ -2079,55 +3052,109 @@ public class protocol_beehome {
             case BP86:
                 //绑定解绑消息
                 handleBP86(cmd, mConnection, mRuntime);
-                mConnection.DeliverCMDMessageToSystem("AP86", cmd);//通知下面线程状态变化
-
+                //通知下面线程状态变化
+                mConnection.DeliverCMDMessageToSystem("AP86", cmd);
                 break;
-
             case BP88:
                 //收到查找设备消息
                 handleBP88(cmd, mConnection);
-                mConnection.DeliverCMDMessageToSystem("findDev", cmd);//通知下面线程状态变化
+                //通知下面线程状态变化
+                mConnection.DeliverCMDMessageToSystem("findDev", cmd);
                 break;
             case BP89:
                 //心率/血压阀值
                 handleBP89(cmd, mConnection);
-                mConnection.DeliverCMDMessageToSystem("AP89", cmd);//通知下面线程状态变化
+                //通知下面线程状态变化
+                mConnection.DeliverCMDMessageToSystem("AP89", cmd);
                 break;
 
             case BPTE: //设置测试体温
                 handleBPTE(cmd, mConnection, mRuntime);
-                mConnection.DeliverCMDMessageToSystem("APTE", cmd);//通知下面线程状态变化
+                //通知下面线程状态变化
+                mConnection.DeliverCMDMessageToSystem("APTE", cmd);
                 break;
 
             case BPTP:
                 handleBPTP();
-                mConnection.DeliverCMDMessageToSystem("APTP", cmd);//通知下面线程状态变化
+                //通知下面线程状态变化
+                mConnection.DeliverCMDMessageToSystem("APTP", cmd);
                 break;
             case BPHP:
                 handleBPHP();
-                mConnection.DeliverCMDMessageToSystem("APHP", cmd);//通知下面线程状态变化
+                //通知下面线程状态变化
+                mConnection.DeliverCMDMessageToSystem("APHP", cmd);
                 break;
             case BPX1://设置 心率血压血氧修正值
                 handleBPX1(cmd, mConnection, mRuntime);
                 ICLogger.i("收到服务器设置 心率血压血氧修正值BPX1");
-                mConnection.DeliverCMDMessageToSystem("APX1", cmd);//通知下面线程状态变化
+                //通知下面线程状态变化
+                mConnection.DeliverCMDMessageToSystem("APX1", cmd);
                 break;
 
             case BPS4: //提醒设置(时间段) 主要为久坐设置提醒时长。
                 handleBPS4(cmd, mConnection, mRuntime);
                 ICLogger.i("收到 提醒设置(时间段)");
-                mConnection.DeliverCMDMessageToSystem("APS4", cmd);//通知下面线程状态变化
+                //通知下面线程状态变化
+                mConnection.DeliverCMDMessageToSystem("APS4", cmd);
                 break;
             case BPTF:
                 handleBPTF(cmd, mConnection, mRuntime);
                 ICLogger.d("收到修改时间格式的指令...");
                 break;
-        }
+            case BPSQ:
+                handleBPSQ(cmd, mConnection, mRuntime);
+                ICLogger.d("收到设置体征信息检测间隔的指令...");
+                break;
+            case BPMC:
+                ICLogger.d("收到服务器下发的修改skipmovecheck");
+                handleBPMC(cmd);
+                break;
+            case BPPH:
+                //收到服务器拨号功能开关
+                ICLogger.d("收到服务器拨号功能开关.");
+                handleBPPH(cmd);
+                break;
+            case BPJK:
+                mConnection.DeliverCMDMessageToSystem("APJK", cmd);//通知下面线程状态变化
+                ICLogger.d("服务器收到健康数据上报" + cmd);
+                break;
+            case BPSM:
+                //收到设置短信指令的信息
+                handleBPSM(cmd);
+                break;
+            case BPTQ:
+                //处理下发的天气信息
+                handleBPTQ(cmd);
+                break;
+            case BP75:
+                ICLogger.d("收到闹钟设置指令BP75");
+                handleBP75(mRuntime, cmd);
+                break;
+            case BP32:
+                ICLogger.d("收到后台下发的拨号指令BP32.");
+                handleBP32(cmd);
+                break;
+            case BP87:
+                ICLogger.d("接收到二维码的图片.");
+                handleBP87(cmd, mRuntime);
+                break;
+            case BP05:
+                ICLogger.d("收到服务器BP05");
+                handleBP05(cmd);
+                break;
+            case BP46: //立即拍照
+                ICLogger.i("立即拍照!");
+                handleBP46(cmd, mConnection, mRuntime);
+                break;
+            case BP42:
+                handleBP42(cmd, mConnection);
+                break;
 
+        }
         return ret;
-
     }
 
+
     public boolean handleCmd(CMD_TYPE type, String cmd, byte[] bytes) {
 
         //只有需要传递二级制数据的才需要这个函数,目前只有BP28需要
@@ -2136,7 +3163,7 @@ public class protocol_beehome {
         if (Config.LOG_TOFILE) ICLogger.logToFile("APILog", " recv " + new String(bytes));
         switch (type) {
             case BP28:
-                handleBP28(mConnection, cmd, mRuntime, bytes);
+                handleBP28(mConnection, cmd, bytes);
                 ICLogger.i("收到服务器语音BP28");
                 mConnection.DeliverCMDMessageToSystem("BP28", "");//通知下面线程状态变化
                 break;
index 7f68dff..4bd564a 100644 (file)
@@ -4017,7 +4017,7 @@ public class protocol_s123 {
                 content = content.replaceAll("%%", "#");
                 //把这个消息转到短信的执行流程中去
                 ICLogger.d("content == > " + content);
-                ICSmsManager.handleSms(mRuntime, content, null, null);
+               // ICSmsManager.handleSms(mRuntime, content, null, null);
                 //回复
                 // 1:表示设备接受数据成功,0表示设备接受数据失败
                 responseWithId(cmdMap.get(CMD_TYPE.APSS), id, "1");
index 7763136..d75c4c4 100644 (file)
@@ -1,2 +1,2 @@
-#Thu May 18 23:54:57 GMT+08:00 2023\r
-VERSION_CODE=963\r
+#Sun Jun 11 23:00:31 GMT+08:00 2023\r
+VERSION_CODE=964\r
diff --git a/core/core.iml b/core/core.iml
new file mode 100644 (file)
index 0000000..b32a942
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<module version="4">\r
+  <component name="FacetManager">\r
+    <facet type="android-gradle" name="Android-Gradle">\r
+      <configuration>\r
+        <option name="GRADLE_PROJECT_PATH" value=":core" />\r
+        <option name="LAST_SUCCESSFUL_SYNC_AGP_VERSION" />\r
+        <option name="LAST_KNOWN_AGP_VERSION" />\r
+      </configuration>\r
+    </facet>\r
+    <facet type="java-gradle" name="Java-Gradle">\r
+      <configuration>\r
+        <option name="BUILD_FOLDER_PATH" value="$MODULE_DIR$/build" />\r
+        <option name="BUILDABLE" value="true" />\r
+      </configuration>\r
+    </facet>\r
+  </component>\r
+</module>
\ No newline at end of file
diff --git a/dNSCache/dNSCache.iml b/dNSCache/dNSCache.iml
new file mode 100644 (file)
index 0000000..c54b500
--- /dev/null
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<module version="4">\r
+  <component name="FacetManager">\r
+    <facet type="android-gradle" name="Android-Gradle">\r
+      <configuration>\r
+        <option name="GRADLE_PROJECT_PATH" value=":dNSCache" />\r
+        <option name="LAST_SUCCESSFUL_SYNC_AGP_VERSION" value="3.5.3" />\r
+        <option name="LAST_KNOWN_AGP_VERSION" value="3.5.3" />\r
+      </configuration>\r
+    </facet>\r
+    <facet type="android" name="Android">\r
+      <configuration>\r
+        <option name="SELECTED_BUILD_VARIANT" value="debug" />\r
+        <option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />\r
+        <option name="COMPILE_JAVA_TASK_NAME" value="compileDebugSources" />\r
+        <afterSyncTasks>\r
+          <task>generateDebugSources</task>\r
+        </afterSyncTasks>\r
+        <option name="ALLOW_USER_CONFIGURATION" value="false" />\r
+        <option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />\r
+        <option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />\r
+        <option name="RES_FOLDERS_RELATIVE_PATH" value="file://$MODULE_DIR$/src/main/res;file://$MODULE_DIR$/build/generated/res/resValues/debug" />\r
+        <option name="TEST_RES_FOLDERS_RELATIVE_PATH" value="" />\r
+        <option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" />\r
+        <option name="PROJECT_TYPE" value="1" />\r
+      </configuration>\r
+    </facet>\r
+  </component>\r
+</module>
\ No newline at end of file
diff --git a/protocol8.1.iml b/protocol8.1.iml
new file mode 100644 (file)
index 0000000..584b44a
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<module version="4">\r
+  <component name="FacetManager">\r
+    <facet type="java-gradle" name="Java-Gradle">\r
+      <configuration>\r
+        <option name="BUILD_FOLDER_PATH" value="$MODULE_DIR$/build" />\r
+        <option name="BUILDABLE" value="false" />\r
+      </configuration>\r
+    </facet>\r
+  </component>\r
+</module>
\ No newline at end of file