把协议区分为Beehome和Jiai两个。
authorsnickersun <scy@incartech.cn>
Wed, 13 May 2020 12:18:04 +0000 (20:18 +0800)
committersnickersun <scy@incartech.cn>
Wed, 13 May 2020 12:18:04 +0000 (20:18 +0800)
18 files changed:
app/build.gradle
app/src/main/java/com/enqualcomm/support/Config.java
app/src/main/java/com/enqualcomm/support/CoreService.java
app/src/main/java/com/enqualcomm/support/LocationClient.java
app/src/main/java/com/enqualcomm/support/MainActivity.java
app/src/main/java/com/enqualcomm/support/service/Deliver.java
app/src/main/java/com/enqualcomm/support/service/HeartRateManager.java
app/src/main/java/com/enqualcomm/support/service/Initialize.java
app/src/main/java/com/enqualcomm/support/service/KeepAlive.java
app/src/main/java/com/enqualcomm/support/service/SynchronousTime.java
app/src/main/java/com/enqualcomm/support/utils/BatteryUtil.java
app/src/main/java/com/enqualcomm/support/utils/DeviceInfoUtil.java
app/src/main/java/com/enqualcomm/support/utils/NettyConnection.java
app/src/main/java/com/enqualcomm/support/utils/TimeUtil.java
app/src/main/java/com/enqualcomm/support/utils/Util.java
app/src/main/java/com/ic/protocols/protocolAPIHelper.java [new file with mode: 0644]
app/src/main/java/com/ic/protocols/protocol_beehome.java [new file with mode: 0644]
app/src/main/java/com/ic/protocols/protocol_jiai.java [moved from app/src/main/java/com/enqualcomm/support/adapter/protocolAPIHelper.java with 83% similarity]

index 8c57b57..0dc26bf 100644 (file)
@@ -96,6 +96,7 @@ dependencies {
     implementation 'com.android.support:recyclerview-v7:25.1.0'
     compile files ('libs/android-logging-log4j-1.0.3.jar','libs/ftp4j-1.7.2.jar','libs/log4j-1.2.17.jar','libs/okio-2.4.3.jar')
     provided files ('libs/telephony_common-full-debug.jar')
+    //provided files ('libs/frameworks-full-debug.jar')
 
 //    implementation "androidx.recyclerview:recyclerview:1.1.0
 }
index c6c4ac4..bf5a589 100644 (file)
@@ -307,5 +307,38 @@ public class Config {
       noLocationCycle=ret;\r
      return ret;\r
   }\r
+\r
+  public static final int PROTOCOL_JIAI=0;\r
+  public static final int PROTOCOL_BEEHOME=1;\r
+  public static final int PROTOCOL_FZD=2;\r
+\r
+  public static int protocol_no=getProtocolNumber();\r
+  public static int getProtocolNumber(){\r
+    String tmp=Util.getSystemProperties("persist.sys.protocol_no");\r
+    int ret=0;\r
+    if (tmp!=null && !tmp.isEmpty()&& Util.isNumeric(tmp)) {\r
+      ret = Integer.getInteger(tmp);\r
+      switch(ret){\r
+        case PROTOCOL_JIAI:\r
+          ICLogger.i("协议 JIAI");\r
+          break;\r
+        case PROTOCOL_BEEHOME:\r
+          ICLogger.i("协议 BEEHOME");\r
+          break;\r
+\r
+        case PROTOCOL_FZD:\r
+          ICLogger.i("协议 FZD");\r
+          break;\r
+\r
+        default:\r
+          ICLogger.i("协议版本 目前支持0,1,2");\r
+          break;\r
+      }\r
+    }else{\r
+      ICLogger.i("协议版本要是数字目前支持0,1");\r
+    }\r
+    protocol_no=ret;\r
+    return ret;\r
+  }\r
 }\r
 \r
index 8e5b7a5..26b48a6 100644 (file)
@@ -1,14 +1,11 @@
 package com.enqualcomm.support;\r
 \r
-import android.annotation.SuppressLint;\r
 import android.app.AlarmManager;\r
 import android.app.Notification;\r
 import android.app.PendingIntent;\r
 import android.app.Service;\r
 import android.content.Intent;\r
 import android.media.AudioManager;\r
-import android.net.wifi.WifiManager;\r
-import android.os.Build;\r
 import android.os.Handler;\r
 import android.os.IBinder;\r
 \r
@@ -16,29 +13,21 @@ import android.os.Message;
 import android.os.Messenger;\r
 import android.os.PowerManager;\r
 import android.os.SystemClock;\r
-import android.util.Log;\r
 import android.widget.Toast;\r
 \r
-import com.enqualcomm.support.bean.ICLocation;\r
-import com.enqualcomm.support.bean.StepCount;\r
 import com.enqualcomm.support.utils.DeviceInfoUtil;\r
 import com.enqualcomm.support.utils.LedUtil;\r
-import com.enqualcomm.support.utils.ServiceUtil;\r
 import com.enqualcomm.support.utils.StorageUtils;\r
 import com.enqualcomm.support.utils.VibrateUtil;\r
 import com.ic.jni.ICJniUtils;\r
-import com.enqualcomm.support.Constants;\r
-import com.enqualcomm.support.GSensorListener;\r
-import com.enqualcomm.support.LocationClient;\r
 import com.enqualcomm.support.adapter.LBSHelper;\r
-import com.enqualcomm.support.adapter.protocolAPIHelper;\r
+import com.ic.protocols.protocolAPIHelper;\r
 import com.enqualcomm.support.bean.Runtime;\r
 import com.enqualcomm.support.bean.StringMessage;\r
 import com.enqualcomm.support.bean.heartRateStatus;\r
 import com.enqualcomm.support.service.CheckSIM;\r
 import com.enqualcomm.support.service.Deliver;\r
 import com.enqualcomm.support.service.HeartRateManager;\r
-import com.enqualcomm.support.service.Initialize;\r
 import com.enqualcomm.support.service.KeepAlive;\r
 import com.enqualcomm.support.service.SendChatMessage;\r
 import com.enqualcomm.support.service.SilentManager;\r
@@ -56,44 +45,32 @@ import com.enqualcomm.support.utils.ICLogger;
 import com.enqualcomm.support.utils.NettyConnection;\r
 import com.enqualcomm.support.utils.SharPreferenceUtil;\r
 import com.enqualcomm.support.utils.SimSignalUtil;\r
-import com.enqualcomm.support.utils.TimeUtil;\r
 import com.enqualcomm.support.utils.Util;\r
-import com.sina.util.dnscache.log.FileUtil;\r
 \r
 import java.lang.ref.WeakReference;\r
 import chestnut.ui.Toastc;\r
-import chestnut.utils.PhoneUtils;\r
 import rx.Observable;\r
 import rx.functions.Action1;\r
 \r
 import android.content.BroadcastReceiver;\r
 import android.content.Context;\r
 import android.content.IntentFilter;\r
-import android.os.BatteryManager;\r
 \r
-import android.telephony.TelephonyManager;\r
-\r
-import java.util.Random;\r
 import java.util.concurrent.ScheduledThreadPoolExecutor;\r
 import java.util.concurrent.TimeUnit;\r
 \r
 import static android.app.PendingIntent.FLAG_UPDATE_CURRENT;\r
 import static com.enqualcomm.support.Constants.ACTION_ALARM_ADD_DATAPOINTS;\r
-import static com.enqualcomm.support.Constants.ACTION_BATTERY_LOW_MSG;\r
 import static com.enqualcomm.support.Constants.ACTION_EQC_ALARM;\r
 import static com.enqualcomm.support.Constants.ACTION_HEATR_RATE_START;\r
 import static com.enqualcomm.support.Constants.ACTION_LOCAL_SOS_ACTION;\r
 import static com.enqualcomm.support.Constants.ACTION_LOCATION_ALARM;\r
 import static com.enqualcomm.support.Constants.ACTION_SEND_EMEGENCY_LOCATION_START;\r
 import static com.enqualcomm.support.Constants.ACTION_SEND_EMEGENCY_LOCATION_STOP;\r
-import static com.enqualcomm.support.Constants.ACTION_SEND_SOS_MSG;\r
 import static com.enqualcomm.support.Constants.HEART_ALARM;\r
 import static com.enqualcomm.support.Constants.KEY_SAVE_STEP_COUNT;\r
 import static com.enqualcomm.support.Constants.KEY_STEP_COUNT;\r
-import static com.enqualcomm.support.Constants.SLEEP_ALARM;\r
 import static com.enqualcomm.support.Constants.STEP_COUNT_ALARM_ACTION;\r
-import static com.enqualcomm.support.Constants.WAKE_ALARM;\r
-import static com.enqualcomm.support.Constants.WEATHER_ALARM;\r
 import static com.enqualcomm.support.bean.ICLocation.*;\r
 \r
 \r
@@ -203,7 +180,7 @@ public class CoreService extends Service {
                     runtime.setAlarmType(false,runtime.getBatteryLow(),true,false);\r
                     //trigger AP10 报警定位\r
 //                   CoreService.this.locationClient.triggerSOSLocationProcess();\r
-                    connection.send(protocolAPIHelper.genStringMessage("AP10",protocolAPIHelper.AP10(runtime)));\r
+                    connection.send(protocolAPIHelper.genStringMessage("AP10",protocolAPIHelper.getWarningMSG(runtime)));\r
 \r
                     //开启紧急定位模式,GPS 优先1分钟一次定位,持续5分钟\r
                     runtime.getLocationInstance().setWorkingMod(EMERGNECY_MOD);\r
@@ -269,7 +246,7 @@ public class CoreService extends Service {
             coreService.locationClient.onReceive(param1StringMessage);\r
         }\r
     }\r
-    final NettyConnection connection = new NettyConnection(new ServerHandler(this));\r
+    NettyConnection connection = null;\r
     AbstractConnectionService connectionServiceChain;\r
 \r
     AbstractInvokeHandlerService invokeHandlerServiceChain;\r
@@ -512,6 +489,9 @@ public class CoreService extends Service {
         this.runtime.setHRS(new heartRateStatus());\r
         this.runtime.setUseQueue(true);\r
         this.runtime.initDnsUtil(ICApplication.getInstance().getApplicationContext());\r
+\r
+\r
+        connection=new NettyConnection(new ServerHandler(this),runtime);\r
         this.connectionServiceChain = getConnectionServiceChain();\r
         this.invokeHandlerServiceChain = getInvokeHandlerServiceChain();\r
 //        if (cmcm_call_eiot_into_powersave_mode() == 1) {\r
index 9bf3bec..bec8269 100644 (file)
@@ -1,6 +1,5 @@
 package com.enqualcomm.support;\r
 \r
-import android.app.AlarmManager;\r
 import android.content.BroadcastReceiver;\r
 import android.content.Context;\r
 import android.content.Intent;\r
@@ -9,47 +8,31 @@ import android.os.Handler;
 import android.os.Message;\r
 import android.os.PowerManager;\r
 import android.os.SystemClock;\r
-import android.provider.Settings;\r
 \r
 import com.enqualcomm.support.utils.AlarmHelper;\r
-import com.enqualcomm.support.utils.Util;\r
-import com.ic.jni.ICJniUtils;\r
 import com.enqualcomm.support.adapter.LBSHelper;\r
-import com.enqualcomm.support.adapter.protocolAPIHelper;\r
+import com.ic.protocols.protocolAPIHelper;\r
 import com.enqualcomm.support.bean.ICLocation;\r
 import com.enqualcomm.support.bean.StringMessage;\r
 import com.enqualcomm.support.service.Deliver;\r
-import com.enqualcomm.support.service.KeepAlive;\r
-import com.enqualcomm.support.CoreService;\r
 import com.enqualcomm.support.utils.CellInfoUtil;\r
 import com.enqualcomm.support.utils.DeviceInfoUtil;\r
-import com.enqualcomm.support.utils.FileCache;\r
-import com.enqualcomm.support.utils.FileOutputUtil;\r
 import com.enqualcomm.support.utils.ICLogger;\r
 import com.enqualcomm.support.utils.NettyConnection;\r
-import com.enqualcomm.support.utils.ServiceUtil;\r
-import com.enqualcomm.support.utils.SharPreferenceUtil;\r
 import com.enqualcomm.support.utils.SimSignalUtil;\r
 import com.enqualcomm.support.bean.Runtime;\r
 import com.enqualcomm.support.utils.TimeUtil;\r
 \r
 import java.util.concurrent.ExecutorService;\r
 import java.util.concurrent.Executors;\r
-import java.util.concurrent.LinkedBlockingDeque;\r
-import java.util.concurrent.ScheduledThreadPoolExecutor;\r
-import java.util.concurrent.TimeUnit;\r
-import java.util.concurrent.locks.Condition;\r
-import java.util.concurrent.locks.ReentrantLock;\r
 \r
 import rx.Single;\r
 import rx.android.schedulers.AndroidSchedulers;\r
 import rx.functions.Action1;\r
 \r
-import static android.location.LocationManager.GPS_PROVIDER;\r
 import static com.enqualcomm.support.Config.GPSLocationTimeoutInSeconds;\r
 import static com.enqualcomm.support.Config.WiFiLocationTimeoutInSeconds;\r
 import static com.enqualcomm.support.Constants.ACTION_CHECK_LOCATION_RESULT;\r
-import static com.enqualcomm.support.Constants.HEART_ALARM;\r
 \r
 public class LocationClient {\r
   private static final String TAG = LocationClient.class.getSimpleName();\r
@@ -374,16 +357,16 @@ public class LocationClient {
                     ||(lbs_ok&&gps_nosignal&&wifi_ok)\r
             ){\r
               if (startSOSLocation==true){\r
-                String AP10_CMD = protocolAPIHelper.AP10(runtime);\r
+                String AP10_CMD = protocolAPIHelper.getWarningMSG(runtime);\r
                 Deliver.sendLocationMSG(AP10_CMD);\r
                 startSOSLocation=false;\r
               }else {\r
 \r
                 if (gps_ok) {\r
-                  String AP01_CMD = protocolAPIHelper.AP01(runtime);\r
+                  String AP01_CMD = protocolAPIHelper.getGPSLocationMSG(runtime);\r
                   Deliver.sendLocationMSG(AP01_CMD);\r
                 }else{\r
-                  String AP02_CMD = protocolAPIHelper.AP02(runtime);\r
+                  String AP02_CMD = protocolAPIHelper.getLBSLocationMSG(runtime);\r
                   Deliver.sendLocationMSG(AP02_CMD);\r
                 }\r
 \r
@@ -448,12 +431,12 @@ public class LocationClient {
 \r
 \r
               if (startSOSLocation==true){\r
-                String AP10_CMD = protocolAPIHelper.AP10(runtime);\r
+                String AP10_CMD = protocolAPIHelper.getWarningMSG(runtime);\r
                 Deliver.sendLocationMSG(AP10_CMD);\r
                 startSOSLocation=false;\r
 \r
               }else {\r
-                String AP02_CMD = protocolAPIHelper.AP02(runtime);\r
+                String AP02_CMD = protocolAPIHelper.getLBSLocationMSG(runtime);\r
                 Deliver.sendLocationMSG(AP02_CMD);\r
               }\r
 \r
@@ -792,7 +775,7 @@ public void updateCellInfo() {
 \r
       runtime.setAlarmType(false,runtime.getBatteryLow(),false,false);\r
       //trigger AP10 报警低电\r
-      connection.send(protocolAPIHelper.genStringMessage("AP10",protocolAPIHelper.AP10(runtime)));\r
+      connection.send(protocolAPIHelper.genStringMessage("AP10",protocolAPIHelper.getWarningMSG(runtime)));\r
 \r
       this.batteryLowNotification = true;\r
     }\r
index d54389a..74b5642 100644 (file)
@@ -1,28 +1,17 @@
 package com.enqualcomm.support;
 
 import android.content.ComponentName;
-import android.content.Context;
 import android.content.Intent;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
 import android.os.Handler;
 import android.os.Message;
 import android.support.v7.app.AppCompatActivity;
 import android.os.Bundle;
 import android.view.View;
 import android.widget.Button;
-import android.widget.CompoundButton;
 import android.widget.TextView;
-import android.widget.ToggleButton;
 
-import com.enqualcomm.support.R;
-import com.enqualcomm.support.adapter.protocolAPIHelper;
 import com.enqualcomm.support.utils.DeviceInfoUtil;
-import com.enqualcomm.support.utils.SimSignalUtil;
 import com.enqualcomm.support.utils.Util;
-import com.ic.jni.ICJniUtils;
-import com.enqualcomm.support.CoreService;
-import com.enqualcomm.support.utils.ICLogger;
 
 import java.util.concurrent.ScheduledThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
index ae325e6..8a6bbde 100644 (file)
@@ -5,9 +5,7 @@ import android.app.PendingIntent;
 import android.content.BroadcastReceiver;\r
 import android.content.Context;\r
 import android.content.Intent;\r
-import android.content.IntentFilter;\r
 import android.net.ConnectivityManager;\r
-import android.net.Uri;\r
 import android.net.wifi.WifiConfiguration;\r
 import android.net.wifi.WifiManager;\r
 import android.os.Build;\r
@@ -16,26 +14,18 @@ import android.os.Message;
 import android.os.Parcelable;\r
 import android.os.PowerManager;\r
 import android.os.SystemClock;\r
-import android.text.TextUtils;\r
 \r
 import com.enqualcomm.support.Config;\r
 import com.enqualcomm.support.CoreService;\r
-import com.enqualcomm.support.LocationClient;\r
 import com.enqualcomm.support.R;\r
-import com.enqualcomm.support.adapter.protocolAPIHelper;\r
+import com.ic.protocols.protocolAPIHelper;\r
 import com.enqualcomm.support.bean.Contact;\r
 import com.enqualcomm.support.bean.StringMessage;\r
-import com.enqualcomm.support.bean.VoiceContent;\r
 import com.enqualcomm.support.bean.voicePacket;\r
 import com.enqualcomm.support.service.base.AbstractConnectionService;\r
-import com.enqualcomm.support.utils.AlarmHelper;\r
-import com.enqualcomm.support.utils.AlarmWakeUp;\r
 import com.enqualcomm.support.utils.Connection;\r
 import com.enqualcomm.support.bean.Runtime;\r
-import com.enqualcomm.support.utils.DBHelper;\r
 import com.enqualcomm.support.utils.FileCache;\r
-import com.enqualcomm.support.utils.FileOutputUtil;\r
-import com.enqualcomm.support.utils.GetContact;\r
 import com.enqualcomm.support.utils.ICLogger;\r
 import com.enqualcomm.support.utils.NettyConnection;\r
 import com.enqualcomm.support.utils.ServiceUtil;\r
@@ -43,19 +33,15 @@ import com.enqualcomm.support.utils.SharPreferenceUtil;
 import com.enqualcomm.support.utils.SimSignalUtil;\r
 import com.enqualcomm.support.utils.Util;\r
 \r
-import java.util.ArrayList;\r
 import java.util.concurrent.LinkedBlockingDeque;\r
 import java.util.concurrent.TimeUnit;\r
 import java.util.concurrent.locks.Condition;\r
 import java.util.concurrent.locks.ReentrantLock;\r
 \r
 import rx.Observable;\r
-import rx.Subscriber;\r
 import rx.functions.Action1;\r
-import rx.schedulers.Schedulers;\r
 \r
 import static android.app.PendingIntent.FLAG_UPDATE_CURRENT;\r
-import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;\r
 import static com.enqualcomm.support.Constants.ACTION_WAKEUP_ALARM;\r
 import static com.enqualcomm.support.Constants.DIALOG_ACTION;\r
 import static com.enqualcomm.support.bean.Contact.CATEGORY_GROUP;\r
@@ -344,7 +330,7 @@ public static void sendLocationMSG( String Msg){
       if (voicepacket.getCurrentIndexToSent() < voicepacket.getPacketCount()) {\r
         ICLogger.i("voicepacket " + voicepacket.getName() + " " + voicepacket.getPacketTime() + " send " + (voicepacket.getCurrentIndexToSent() + 1) + "/" + voicepacket.getPacketCount());\r
         ((NettyConnection) mConnection).sendMsg(\r
-                protocolAPIHelper.AP07(voicepacket.getPacketTime(),\r
+                protocolAPIHelper.getVoicePacketItem(voicepacket.getPacketTime(),\r
                         voicepacket.getPacketCount(),\r
                         (voicepacket.getCurrentIndexToSent() + 1),\r
                         voicepacket.getVoicePacketWithIndex(voicepacket.getCurrentIndexToSent()).getPacketLen(),\r
index 8c5ae42..ad96c3d 100644 (file)
@@ -4,7 +4,6 @@ import android.content.BroadcastReceiver;
 import android.content.Context;\r
 import android.content.Intent;\r
 import android.content.IntentFilter;\r
-import android.net.Uri;\r
 import android.os.Bundle;\r
 import android.os.Handler;\r
 import android.os.Message;\r
@@ -15,10 +14,8 @@ import com.enqualcomm.support.Config;
 import com.enqualcomm.support.Constants;\r
 import com.enqualcomm.support.CoreService;\r
 import com.ic.jni.ICJniUtils;\r
-import com.enqualcomm.support.LocationClient;\r
-import com.enqualcomm.support.adapter.protocolAPIHelper;\r
+import com.ic.protocols.protocolAPIHelper;\r
 import com.enqualcomm.support.bean.Runtime;\r
-import com.enqualcomm.support.bean.StringMessage;\r
 import com.enqualcomm.support.bean.heartRateStatus;\r
 import com.enqualcomm.support.service.base.AbstractInvokeHandlerService;\r
 import com.enqualcomm.support.utils.Connection;\r
@@ -63,7 +60,7 @@ public class HeartRateManager extends AbstractInvokeHandlerService {
             //只有检测PPG成功,且网络连接中才发送数据\r
             if (runtime.getHRS().getHeartrateWorkingStat() == heartRateStatus.HEARTRATE_WORKINGSTAT.HEARTRATE_TEST_SUCCESS) {\r
               runtime.getHRS().setLastTestTime(TimeUtil.getSystemTime3());\r
-              String PPGDATA = protocolAPIHelper.APHT(runtime);\r
+              String PPGDATA = protocolAPIHelper.getPPG_ECG_MSG(runtime);\r
               sendBroadcastPPGResult();\r
               //因为协议中没有时间变量,所以只能实时传输,如果恰巧没有网络也只能丢弃,有时间变量的话,可以考虑通过deliver的buffer来进行缓存发送\r
               if (connection.isServerConnected()) {\r
@@ -206,7 +203,7 @@ public class HeartRateManager extends AbstractInvokeHandlerService {
   }\r
   PowerManager.WakeLock mWakeLock=null;\r
   public PowerManager.WakeLock getPPGWakeLock() {\r
-    mWakeLock = ((PowerManager)(runtime.getContextProxy()).context.getSystemService(Context.POWER_SERVICE)).newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "PPGTest");\r
+    mWakeLock = ((PowerManager)(runtime.getContextProxy()).context.getSystemService(Context.POWER_SERVICE)).newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, HeartRateManager.class.getSimpleName());\r
     mWakeLock.acquire(30000L);\r
     return mWakeLock;\r
   }\r
@@ -316,7 +313,7 @@ public static void triggerPPGtest(){
           return true;\r
         }\r
 \r
-          String PPGDATA = protocolAPIHelper.APHT(ppg,bph,bpl);\r
+          String PPGDATA = protocolAPIHelper.getPPG_ECG_MSG(ppg,bph,bpl);\r
           if (((NettyConnection)connection).isServerConnected()) {\r
             connection.send(protocolAPIHelper.genStringMessage("APHT", PPGDATA));\r
             ICLogger.i("Send PPG " + PPGDATA);\r
index fa5e798..8bf4f4d 100644 (file)
@@ -4,19 +4,14 @@ import android.database.Cursor;
 \r
 import com.enqualcomm.support.Config;\r
 import com.enqualcomm.support.ICContentProvider;\r
-import com.enqualcomm.support.adapter.protocolAPIHelper;\r
+import com.ic.protocols.protocolAPIHelper;\r
 import com.enqualcomm.support.bean.StringMessage;\r
 import com.enqualcomm.support.service.base.AbstractConnectionService;\r
 import com.enqualcomm.support.utils.Connection;\r
 import com.enqualcomm.support.bean.Runtime;\r
-import com.enqualcomm.support.utils.DeviceInfoUtil;\r
 import com.enqualcomm.support.utils.ICLogger;\r
-import com.enqualcomm.support.utils.SharPreferenceUtil;\r
 import com.enqualcomm.support.utils.SimSignalUtil;\r
 \r
-import org.json.JSONObject;\r
-import org.json.JSONTokener;\r
-\r
 public class Initialize extends AbstractConnectionService {\r
   private boolean hasChange = false;\r
   \r
@@ -81,7 +76,7 @@ public class Initialize extends AbstractConnectionService {
     Config.loadServerSettings(paramRuntime);\r
 \r
     //发送登录包\r
-    paramConnection.send(new StringMessage(protocolAPIHelper.AP00(paramRuntime)));\r
+    paramConnection.send(new StringMessage(protocolAPIHelper.getLoginMSG(paramRuntime)));\r
 \r
 \r
     return false;\r
index ec12ab8..605e80e 100644 (file)
@@ -4,23 +4,19 @@ import android.content.BroadcastReceiver;
 import android.content.Context;\r
 import android.content.Intent;\r
 import android.content.IntentFilter;\r
-import android.os.SystemClock;\r
-import android.util.Log;\r
 \r
 //import com.eiot.watch_lib.LauncherCtrl;\r
 import com.enqualcomm.support.CoreService;\r
 import com.enqualcomm.support.LocationClient;\r
-import com.enqualcomm.support.adapter.protocolAPIHelper;\r
+import com.ic.protocols.protocolAPIHelper;\r
 import com.enqualcomm.support.bean.StringMessage;\r
 import com.enqualcomm.support.service.base.AbstractConnectionService;\r
-import com.enqualcomm.support.utils.AlarmHelper;\r
 import com.enqualcomm.support.utils.AlarmWakeUp;\r
 import com.enqualcomm.support.utils.Connection;\r
 import com.enqualcomm.support.utils.DeviceInfoUtil;\r
 import com.enqualcomm.support.utils.ICLogger;\r
 import com.enqualcomm.support.utils.NettyConnection;\r
 import com.enqualcomm.support.utils.NetworkObservable;\r
-import com.enqualcomm.support.utils.ServiceUtil;\r
 import com.enqualcomm.support.bean.Runtime;\r
 import com.enqualcomm.support.utils.SimSignalUtil;\r
 \r
@@ -112,7 +108,7 @@ public class KeepAlive extends AbstractConnectionService {
           //更新系统的IMEI\r
           boolean ret=DeviceInfoUtil.updateImei(mRuntime);\r
           ICLogger.i("Update IMEI "+ret);\r
-          connection.send(protocolAPIHelper.genStringMessage("heart", protocolAPIHelper.AP03(mRuntime)));\r
+          connection.send(protocolAPIHelper.genStringMessage("heart", protocolAPIHelper.getHeartbeatMSG(mRuntime)));\r
         }\r
       }\r
 \r
@@ -253,7 +249,7 @@ public class KeepAlive extends AbstractConnectionService {
     //发送登录包\r
     Observable.timer(500L, TimeUnit.MILLISECONDS).subscribe(new Action1<Long>() {\r
       public void call(Long param1Long) {\r
-        connection.send(protocolAPIHelper.genStringMessage("AP00",protocolAPIHelper.AP00(paramRuntime)));\r
+        connection.send(protocolAPIHelper.genStringMessage("AP00",protocolAPIHelper.getLoginMSG(paramRuntime)));\r
 \r
       }\r
     });\r
@@ -264,7 +260,7 @@ public class KeepAlive extends AbstractConnectionService {
       public void call(Long param1Long) {\r
         //这时重新连接服务器才进行的连接,理论上close已经设置false,此次可以认为协议定然断开,所以设置为false作为双重保险。\r
         mRuntime.setServerProtocolConnected(false);\r
-        connection.send(protocolAPIHelper.genStringMessage("heart",protocolAPIHelper.AP03(paramRuntime)));\r
+        connection.send(protocolAPIHelper.genStringMessage("heart",protocolAPIHelper.getHeartbeatMSG(paramRuntime)));\r
         //发送完心跳后,开始检查服务器响应\r
         startResponseCheckTimer();\r
       }\r
@@ -294,7 +290,7 @@ public class KeepAlive extends AbstractConnectionService {
 \r
     //这个是正常心跳包,暂时不能认为服务器连接时失败的,所以正常发送检测。\r
     //发送心跳包\r
-    connection.send(protocolAPIHelper.genStringMessage("heart",protocolAPIHelper.AP03(paramRuntime)));\r
+    connection.send(protocolAPIHelper.genStringMessage("heart",protocolAPIHelper.getHeartbeatMSG(paramRuntime)));\r
         //发送完心跳后,开始检查服务器响应\r
     startResponseCheckTimer();\r
 \r
@@ -340,7 +336,7 @@ public class KeepAlive extends AbstractConnectionService {
       if (KeepAlive.this.mRuntime.getBatteryLow() && !KeepAlive.this.mRuntime.getBatterychanging() && !bool && !KeepAlive.this.mRuntime.isShutdown()/*不是服务器让关闭的*/){\r
 \r
           KeepAlive.this.mRuntime.setAlarmType(false,KeepAlive.this.mRuntime.getBatteryLow(),false,false);\r
-          KeepAlive.this.connection.send(protocolAPIHelper.genStringMessage("AP10",protocolAPIHelper.AP10(KeepAlive.this.mRuntime)));\r
+          KeepAlive.this.connection.send(protocolAPIHelper.genStringMessage("AP10",protocolAPIHelper.getWarningMSG(KeepAlive.this.mRuntime)));\r
 \r
           ICLogger.i("Shutdown Received! send AP10 !");\r
 \r
index b391ff8..acc188d 100644 (file)
@@ -2,19 +2,13 @@ package com.enqualcomm.support.service;
 \r
 import android.os.SystemClock;\r
 \r
-import com.enqualcomm.support.adapter.protocolAPIHelper;\r
+import com.ic.protocols.protocolAPIHelper;\r
 import com.enqualcomm.support.bean.Runtime;\r
 import com.enqualcomm.support.bean.StringMessage;\r
 import com.enqualcomm.support.service.base.AbstractConnectionService;\r
 import com.enqualcomm.support.utils.Connection;\r
 import com.enqualcomm.support.utils.ICLogger;\r
-import com.enqualcomm.support.utils.NettyConnection;\r
 import com.enqualcomm.support.utils.TimeUtil;\r
-import  com.enqualcomm.support.bean.Runtime;\r
-\r
-import java.text.ParseException;\r
-import java.text.SimpleDateFormat;\r
-import java.util.TimeZone;\r
 \r
 public class SynchronousTime extends AbstractConnectionService {\r
   private boolean synchronousTimeOK = false;\r
@@ -44,9 +38,9 @@ public class SynchronousTime extends AbstractConnectionService {
   public boolean onConnectionOpen(Connection paramConnection, Runtime paramRuntime) {\r
     if (this.synchronousTimeOK)\r
       return false; \r
-    StringMessage stringMessage = new StringMessage( protocolAPIHelper.APTM(paramRuntime));\r
+    //StringMessage stringMessage = new StringMessage( protocolAPIHelper.APTM(paramRuntime));\r
 //    byte[] arrayOfByte = (new StringMessageSocketEngine(paramRuntime.getHost(), paramRuntime.getPort() - 2)).request(stringMessage);\r
-    paramConnection.sendBlocking(stringMessage);\r
+   // paramConnection.sendBlocking(stringMessage);\r
 //    if (arrayOfByte != null) {\r
 //      this.synchronousTimeOK = true;\r
 //      str = new String(arrayOfByte);\r
index 5df9c17..ce5289d 100644 (file)
@@ -1,7 +1,6 @@
 package com.enqualcomm.support.utils;\r
 \r
 import android.content.BroadcastReceiver;\r
-import android.content.ComponentName;\r
 import android.content.Context;\r
 import android.content.ContextWrapper;\r
 import android.content.Intent;\r
@@ -10,8 +9,7 @@ import android.os.BatteryManager;
 import android.os.Build;\r
 \r
 import com.enqualcomm.support.Config;\r
-import com.enqualcomm.support.CoreService;\r
-import com.enqualcomm.support.adapter.protocolAPIHelper;\r
+import com.ic.protocols.protocolAPIHelper;\r
 import com.enqualcomm.support.bean.Runtime;\r
 \r
 import static android.content.Context.BATTERY_SERVICE;\r
@@ -24,7 +22,6 @@ import static android.os.BatteryManager.EXTRA_LEVEL;
 import static android.os.BatteryManager.EXTRA_SCALE;\r
 import static android.os.BatteryManager.EXTRA_STATUS;\r
 import static android.os.BatteryManager.EXTRA_VOLTAGE;\r
-import static com.enqualcomm.support.Constants.ACTION_BATTERY_LOW_MSG;\r
 \r
 public class BatteryUtil {\r
   private BroadcastReceiver batteryChangedReceiver = new BroadcastReceiver() {\r
@@ -87,7 +84,7 @@ public class BatteryUtil {
             if (Config.LOG_TOFILE) ICLogger.logToFile("Battery","BatteryLow !");\r
             mRuntime.setAlarmType(false,mRuntime.getBatteryLow(),false,false);\r
             //trigger AP10 报警定位\r
-            connection.send(protocolAPIHelper.genStringMessage("AP10",protocolAPIHelper.AP10(mRuntime)));\r
+            connection.send(protocolAPIHelper.genStringMessage("AP10",protocolAPIHelper.getWarningMSG(mRuntime)));\r
           }\r
 \r
         }else if (Intent.ACTION_BATTERY_LOW.equals(intent.getAction())) {\r
@@ -95,7 +92,7 @@ public class BatteryUtil {
           if (Config.LOG_TOFILE) ICLogger.logToFile("Battery","BatteryLow !");\r
           mRuntime.setAlarmType(false,mRuntime.getBatteryLow(),false,false);\r
           //trigger AP10 报警定位\r
-          connection.send(protocolAPIHelper.genStringMessage("AP10",protocolAPIHelper.AP10(mRuntime)));\r
+          connection.send(protocolAPIHelper.genStringMessage("AP10",protocolAPIHelper.getWarningMSG(mRuntime)));\r
 \r
         }else if (Intent.ACTION_BATTERY_OKAY.equals(intent.getAction())){\r
           ICLogger.i("Battery OKAY !");\r
index 8214e1b..6ec11af 100644 (file)
@@ -257,7 +257,7 @@ public class DeviceInfoUtil {
     return new StringBuilder("Network ")\r
             .append(SimSignalUtil.hasSimCard(runtime.getContextProxy().context)?" ":" NoSIM ")\r
             .append(sim.getNetworkType()==SimSignalUtil.IS_2G?"2G":(sim.getNetworkType()==SimSignalUtil.IS_3G)?"3G":(sim.getNetworkType()==SimSignalUtil.IS_4G?"4G":"unknown"))\r
-            .append("[").append(runtime.getSignalStrength()).append("]")\r
+            .append("[").append(runtime.getSignalInfo()).append("]")\r
             .append("\nHeartbeat[").append(runtime.getSrvIP()).append(":").append(runtime.getPort()).append(",").append(runtime.isServerProtocolConnected()).append(",").append(runtime.getHeartBeatCycle())\r
             .append("]\nBat").append(runtime.getBattery()).append(",").append(runtime.getBatteryVotage())\r
             .append(" charged ").append(runtime.isPowerConnected())\r
@@ -279,6 +279,7 @@ public class DeviceInfoUtil {
             .append(DeviceInfoUtil.getSWVersionDisplayName()).append("\nProtocol ")\r
             .append(DeviceInfoUtil.getVersionCode(runtime.getContextProxy().context))\r
             .append("\nIMEI ").append(runtime.IMEI())\r
+            .append("\n"+TimeUtil.getLocalTime())\r
             .toString();\r
   }\r
   public static void setLockSimInfo(Context paramContext) {\r
index 83bba98..34c4969 100644 (file)
@@ -1,6 +1,5 @@
 package com.enqualcomm.support.utils;\r
 \r
-import android.content.Intent;\r
 import android.os.Bundle;\r
 import android.os.Handler;\r
 import android.os.Message;\r
@@ -8,25 +7,20 @@ import android.os.SystemClock;
 \r
 \r
 import com.enqualcomm.support.Config;\r
-import com.enqualcomm.support.LocationClient;\r
-import com.enqualcomm.support.adapter.protocolAPIHelper;\r
+import com.ic.protocols.protocolAPIHelper;\r
 import com.enqualcomm.support.bean.StringMessage;\r
 import com.enqualcomm.support.service.HeartRateManager;\r
 import com.enqualcomm.support.CoreService;\r
 \r
-import java.io.UnsupportedEncodingException;\r
-import java.net.InetAddress;\r
-import java.net.InetSocketAddress;\r
 import java.nio.ByteBuffer;\r
 import java.util.concurrent.ExecutorService;\r
 import java.util.concurrent.Executors;\r
 \r
-import rx.Subscription;\r
 import rx.android.schedulers.AndroidSchedulers;\r
 import rx.schedulers.Schedulers;\r
 \r
 import static com.enqualcomm.support.utils.RxSocket.SocketStatus.CONNECTED;\r
-import static com.enqualcomm.support.utils.RxSocket.SocketStatus.DIS_CONNECT;\r
+\r
 import com.enqualcomm.support.bean.Runtime;\r
 \r
 public class NettyConnection implements Connection {\r
@@ -40,172 +34,10 @@ public class NettyConnection implements Connection {
   \r
   private int timeout = 60;\r
   \r
-  public NettyConnection(ConnectionListener paramConnectionListener) {\r
+  public NettyConnection(ConnectionListener paramConnectionListener,Runtime runtime) {\r
     this.listener = paramConnectionListener;\r
-//    RxSocket.getInstance().setConnectionListener(this);\r
-    if (API == null) API=new protocolAPIHelper(\r
-            new protocolAPIHelper.CmdHandler() {\r
-                @Override\r
-                public boolean handleCmd(protocolAPIHelper.CMD_TYPE type, String cmd) {\r
-\r
-                    //普通非二进制命令用此函数处理\r
-                        Runtime runtime=CoreService.getInstance().getRuntime();\r
-                        boolean ret=true;\r
-                        ICLogger.i("handleCmd "+type.name() + " strLen="+cmd.length());\r
-                    if (Config.LOG_TOFILE)ICLogger.logToFile("APILog", " recv " + cmd);\r
-                        switch (type){\r
-                            case BP00:\r
-                                API.handleBP00(runtime,cmd);\r
-                                ICLogger.i("服务器收到登录包AP00");\r
-                                DeliverCMDMessageToSystem("BP00",cmd);//通知下面线程状态变化\r
-                                break;\r
-                            case BP01:\r
-                                API.handleBP01(cmd);\r
-                                ICLogger.i("服务器收到定位AP01");\r
-                                DeliverCMDMessageToSystem("IWAP01",cmd);//通知下面线程状态变化\r
-                                break;\r
-                            case BP02:\r
-                                API.handleBP02(cmd);\r
-                                ICLogger.i("服务器收到定位AP02");\r
-                                DeliverCMDMessageToSystem("IWAP02",cmd);//通知下面线程状态变化\r
-                                break;\r
-                            case BP03:\r
-                                API.handleBP03(cmd);\r
-                                ICLogger.i("服务器收到心跳包AP03");\r
-                                DeliverCMDMessageToSystem("BP03",cmd);//通知下面线程状态变化\r
-                                break;\r
-\r
-                            case BP07:\r
-                                //收到发送的语音包\r
-                                API.handleBP07(cmd,NettyConnection.this);\r
-                                break;\r
-                            case BP10:\r
-                                DeliverCMDMessageToSystem("IWAP10",cmd);//通知下面线程状态变化\r
-                                break;\r
-\r
-                            case BPTM:\r
-                                API.handleBPTM(cmd);\r
-                                ICLogger.i("服务器收到校时命令APTM");\r
-                                DeliverCMDMessageToSystem("APTM",cmd);//通知下面线程状态变化\r
-                                break;\r
-                            case BP85://设置闹钟\r
-                                API.handleBP85(cmd,NettyConnection.this,runtime);\r
-                                ICLogger.i("收到服务器设置闹钟命令BP85");\r
-                                DeliverCMDMessageToSystem("AP85",cmd);//通知下面线程状态变化\r
-                                break;\r
-                            case BP33:\r
-                                //设置工作模式\r
-                                API.handleBP33(NettyConnection.this,runtime,cmd);\r
-                                DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化\r
-\r
-                                break;\r
-                            case BP34:\r
-                                //设置工作模式\r
-                                API.handleBP34(NettyConnection.this,runtime,cmd);\r
-                                DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化\r
-                                break;\r
-                            case BP16:\r
-                                //立即定位指令(长链接有效)\r
-                                API.handleBP16(NettyConnection.this,runtime,cmd);\r
-                                DeliverCMDMessageToSystem("StartLocate",cmd);//通知下面线程状态变化\r
-                                break;\r
-\r
-//                            case BP05: //L02服务器不适用\r
-//                                //查询服务器语音 返回信息\r
-//                                API.handleBP05(cmd);\r
-//                                break;\r
-\r
-                            case BP12:\r
-                                //收到设置SOS号码\r
-                                API.handleBP12(NettyConnection.this,cmd,runtime);\r
-                                ICLogger.i("收到服务器设置SOS号码命令BP12");\r
-                                break;\r
-                            case BP14:\r
-                                //收到设置白名单号码\r
-                                API.handleBP14(NettyConnection.this,cmd,runtime);\r
-                                ICLogger.i("收到服务器设置白名单号码命令BP14");\r
-                                break;\r
-                            case BP15:\r
-                                API.handleBP15(cmd,NettyConnection.this,runtime);\r
-                                ICLogger.i("收到服务器设置定位命令BP15");\r
-                                break;\r
-                            case BP17:\r
-                                //收到恢复出厂设置\r
-                                API.handleBP17(NettyConnection.this,cmd);\r
-                                ICLogger.i("收到服务器恢复出厂设置命令BP17");\r
-                                DeliverCMDMessageToSystem("FactoryReset",cmd);//通知下面线程状态变化\r
-                                break;\r
-\r
-                            case BP18:\r
-                                //收到重启\r
-                                API.handleBP18(NettyConnection.this,cmd);\r
-                                ICLogger.i("收到服务器重启命令BP18");\r
-                                DeliverCMDMessageToSystem("Reboot",cmd);//通知下面线程状态变化\r
-                                break;\r
-\r
-                            case BP31:\r
-                                //收到关机\r
-                                API.handleBP31(NettyConnection.this,cmd);\r
-                                ICLogger.i("收到服务器关机命令BP31");\r
-                                DeliverCMDMessageToSystem("poweroff",cmd);//通知下面线程状态变化\r
-                                break;\r
-\r
-                            case BPXL:\r
-                                API.handleBPXL(cmd,NettyConnection.this);\r
-                                ICLogger.i("收到服务器心率检测命令");\r
-                                HeartRateManager.triggerPPGtest();\r
-                                break;\r
-                            case BPXY:\r
-                                API.handleBPXY(cmd,NettyConnection.this);\r
-                                ICLogger.i("收到服务器血压检测命令");\r
-                                HeartRateManager.triggerPPGtest();\r
-                                break;\r
-                            case BPJZ:\r
-                                API.handleBPJZ(cmd,NettyConnection.this,runtime);\r
-                                ICLogger.i("收到服务器血压校准命令");\r
-                                break;\r
-                            case BPHT:\r
-                                ICLogger.i("服务器收到上传的心率血压");\r
-                                break;\r
-                            case BP84:\r
-                                API.handleBP84(cmd,NettyConnection.this);\r
-                                ICLogger.i("收到服务器白名单命令");\r
-                                break;\r
-\r
-                            case BP86:\r
-                                //心率血压周期设置\r
-                                API.handleBP86(cmd,NettyConnection.this,runtime);\r
-//                                ICLogger.i("");\r
-                                break;\r
-                            case BP89:\r
-                                //心率/血压阀值\r
-                                API.handleBP89(cmd,NettyConnection.this);\r
-                                break;\r
-                        }\r
-\r
-                        return ret;\r
 \r
-                }\r
-\r
-                @Override\r
-                public boolean handleCmd(protocolAPIHelper.CMD_TYPE type, String cmd, byte[] bytes) {\r
-\r
-                    //只有需要传递二级制数据的才需要这个函数,目前只有BP28需要\r
-                    Runtime runtime=CoreService.getInstance().getRuntime();\r
-                    boolean ret=true;\r
-                    ICLogger.i("handleCmd "+type.name() + " "+cmd+" bytelen="+bytes.length );\r
-                    if (Config.LOG_TOFILE) ICLogger.logToFile("APILog", " recv " +new String(bytes));\r
-                    switch (type) {\r
-                        case BP28:\r
-                            API.handleBP28(NettyConnection.this,cmd, runtime,bytes);\r
-                            ICLogger.i("收到服务器语音BP28");\r
-                            DeliverCMDMessageToSystem("BP28", "");//通知下面线程状态变化\r
-                            break;\r
-                    }\r
-                    return ret;\r
-                }\r
-            }\r
-    );\r
+    if (API == null) API=new protocolAPIHelper(NettyConnection.this,runtime );\r
 \r
       initReadListener();\r
       init_connection_listener();\r
index db86919..b6078b2 100644 (file)
@@ -2,6 +2,7 @@ package com.enqualcomm.support.utils;
 \r
 import android.app.AlarmManager;\r
 import android.content.Context;\r
+import android.os.SystemClock;\r
 import android.provider.Settings;\r
 import android.text.format.DateFormat;\r
 \r
@@ -156,9 +157,19 @@ public class TimeUtil {
     c.setTimeZone(tz);\r
     long when = c.getTimeInMillis();\r
     ICLogger.i("====set time "+c.toString());\r
-    if(when / 1000 < Integer.MAX_VALUE){\r
-      ((AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE)).setTime(when);\r
+\r
+    if (when / 1000 < Integer.MAX_VALUE) {\r
+      SystemClock.setCurrentTimeMillis(when);\r
     }\r
+\r
+    long now = Calendar.getInstance().getTimeInMillis();\r
+    //Log.d(TAG, "set tm="+when + ", now tm="+now);\r
+\r
+    if(now - when > 1000)\r
+    {\r
+      ICLogger.i("====set time failed now("+now+")-when("+when+") > 1000 !");\r
+    }\r
+\r
   }\r
 \r
   public static void setSysTime(Context mContext,int hour,int minute,int secounds){\r
@@ -187,7 +198,6 @@ public class TimeUtil {
   }\r
   public static void setTimeZone(int timeZone){\r
     final Calendar now = Calendar.getInstance();\r
-    timeZone--;\r
     String timezone_name="";\r
     if(timeZone>0) {\r
       timezone_name=String.format("GMT+%1$02d:00", Math.abs(timeZone));\r
index 6daf2f5..2ad5e1d 100644 (file)
@@ -38,6 +38,8 @@ import java.util.Enumeration;
 import java.util.Iterator;\r
 import java.util.List;\r
 import java.util.UUID;\r
+import java.util.regex.Matcher;\r
+import java.util.regex.Pattern;\r
 import java.util.zip.CRC32;\r
 import java.util.zip.CheckedOutputStream;\r
 import java.util.zip.ZipEntry;\r
@@ -235,6 +237,16 @@ public class Util {
     }\r
     return str;\r
   }\r
+\r
+  public static boolean isNumeric(String str){\r
+    Pattern pattern = Pattern.compile("[0-9]*");\r
+    Matcher isNum = pattern.matcher(str);\r
+    if( !isNum.matches() ){\r
+      return false;\r
+    }\r
+    return true;\r
+  }\r
+\r
   static public void setSystemProperties(String key, String defaultValue) {\r
 \r
     String value = defaultValue;\r
diff --git a/app/src/main/java/com/ic/protocols/protocolAPIHelper.java b/app/src/main/java/com/ic/protocols/protocolAPIHelper.java
new file mode 100644 (file)
index 0000000..aedb741
--- /dev/null
@@ -0,0 +1,155 @@
+package com.ic.protocols;\r
+\r
+import com.enqualcomm.support.Config;\r
+import com.enqualcomm.support.bean.Runtime;\r
+import com.enqualcomm.support.bean.StringMessage;\r
+import com.enqualcomm.support.utils.ICLogger;\r
+import com.enqualcomm.support.utils.NettyConnection;\r
+\r
+\r
+public class protocolAPIHelper {\r
+\r
+    private protocol_jiai protocoljiai_handler=null;\r
+    private protocol_beehome protocolbeehome_handler=null;\r
+    public protocolAPIHelper(NettyConnection connect,Runtime runtime) {\r
+        ICLogger.i("init Protocol "+Config.getProtocolNumber());\r
+        if (protocolbeehome_handler==null)\r
+            protocolbeehome_handler=new protocol_beehome(connect,runtime);\r
+        if (protocoljiai_handler==null)\r
+            protocoljiai_handler=new protocol_jiai(connect,runtime);\r
+    }\r
+    /*\r
+       返回true 表示 cmd 全部解析成功\r
+       返回false表示 cmd至少有一条解析失败,失败的数据归入buffer,下一次识别接着使用\r
+       字符串通过#号进行识别。\r
+       每个字符串如果发现 #,却又没有Header,“IW”则会被丢弃\r
+        */\r
+    public boolean parserCmd(byte[] bytes) {\r
+        switch(Config.protocol_no)\r
+        {\r
+            case 0:\r
+                protocoljiai_handler.parserCmd(bytes);\r
+                break;\r
+            case 1:\r
+                protocolbeehome_handler.parserCmd(bytes);\r
+                break;\r
+        }\r
+        return true;\r
+    }\r
+    public static StringMessage genStringMessage(String cmdName, String msg){\r
+        StringMessage sm=new StringMessage(new String[]{cmdName,msg});\r
+        sm.refresh(msg);\r
+        return sm;\r
+    }\r
+\r
+    public static String getWarningMSG(Runtime runtime){\r
+        String ret="";\r
+        switch(Config.protocol_no)\r
+        {\r
+            case 0:\r
+                ret=protocol_jiai.AP10(runtime);\r
+                break;\r
+            case 1:\r
+                ret=protocol_beehome.AP10(runtime);\r
+                break;\r
+        }\r
+        return ret;\r
+    }\r
+\r
+    public static String getLoginMSG(Runtime runtime){\r
+        String ret="";\r
+        switch(Config.protocol_no)\r
+        {\r
+            case 0:\r
+                ret=protocol_jiai.AP00(runtime);\r
+                break;\r
+            case 1:\r
+                ret=protocol_beehome.AP00(runtime);\r
+                break;\r
+        }\r
+        return ret;\r
+    }\r
+\r
+    public static String getHeartbeatMSG(Runtime runtime){\r
+        String ret="";\r
+        switch(Config.protocol_no)\r
+        {\r
+            case 0:\r
+                ret=protocol_jiai.AP03(runtime);\r
+                break;\r
+            case 1:\r
+                ret=protocol_beehome.AP03(runtime);\r
+                break;\r
+        }\r
+        return ret;\r
+    }\r
+\r
+    public static String getGPSLocationMSG(Runtime runtime){\r
+        String ret="";\r
+        switch(Config.protocol_no)\r
+        {\r
+            case 0:\r
+                ret=protocol_jiai.AP01(runtime);\r
+                break;\r
+            case 1:\r
+                ret=protocol_beehome.AP01(runtime);\r
+                break;\r
+        }\r
+        return ret;\r
+    }\r
+    public static String getLBSLocationMSG(Runtime runtime){\r
+        String ret="";\r
+        switch(Config.protocol_no)\r
+        {\r
+            case 0:\r
+                ret=protocol_jiai.AP02(runtime);\r
+                break;\r
+            case 1:\r
+                ret=protocol_beehome.AP02(runtime);\r
+                break;\r
+        }\r
+        return ret;\r
+    }\r
+\r
+    public static byte[] getVoicePacketItem(String  packetTime,int count,int index,int datalen,byte[] amrdata){\r
+        byte[] ret=null;\r
+        switch(Config.protocol_no)\r
+        {\r
+            case 0:\r
+                ret=protocol_jiai.AP07(packetTime,count,index,datalen,amrdata);\r
+                break;\r
+            case 1:\r
+                ret=protocol_beehome.AP07(packetTime,count,index,datalen,amrdata);\r
+                break;\r
+        }\r
+        return ret;\r
+    }\r
+    public static String getPPG_ECG_MSG(Runtime runtime){\r
+\r
+        String ret="";\r
+        switch(Config.protocol_no)\r
+        {\r
+            case 0:\r
+                ret=protocol_jiai.APHT(runtime);\r
+                break;\r
+            case 1:\r
+                ret=protocol_beehome.APHT(runtime);\r
+                break;\r
+        }\r
+        return ret;\r
+    }\r
+    public static String getPPG_ECG_MSG(String  ppg,String bph,String bpl){\r
+\r
+        String ret="";\r
+        switch(Config.protocol_no)\r
+        {\r
+            case 0:\r
+                ret=protocol_jiai.APHT(ppg,bph,bpl);\r
+                break;\r
+            case 1:\r
+                ret=protocol_beehome.APHT(ppg,bph,bpl);\r
+                break;\r
+        }\r
+        return ret;\r
+    }\r
+}\r
diff --git a/app/src/main/java/com/ic/protocols/protocol_beehome.java b/app/src/main/java/com/ic/protocols/protocol_beehome.java
new file mode 100644 (file)
index 0000000..339fa9b
--- /dev/null
@@ -0,0 +1,1595 @@
+package com.ic.protocols;\r
+\r
+import android.content.ComponentName;\r
+import android.content.Intent;\r
+import android.net.Uri;\r
+import android.os.Environment;\r
+\r
+import com.enqualcomm.support.Config;\r
+import com.enqualcomm.support.CoreService;\r
+import com.enqualcomm.support.bean.Alarm;\r
+import com.enqualcomm.support.bean.Contact;\r
+import com.enqualcomm.support.bean.Content;\r
+import com.enqualcomm.support.bean.ICLocation;\r
+import com.enqualcomm.support.bean.Runtime;\r
+import com.enqualcomm.support.bean.StringMessage;\r
+import com.enqualcomm.support.bean.VoiceContent;\r
+import com.enqualcomm.support.bean.voicePacket;\r
+import com.enqualcomm.support.service.HeartRateManager;\r
+import com.enqualcomm.support.utils.Connection;\r
+import com.enqualcomm.support.utils.ICLogger;\r
+import com.enqualcomm.support.utils.NettyConnection;\r
+import com.enqualcomm.support.utils.TimeUtil;\r
+import com.enqualcomm.support.utils.Util;\r
+\r
+import java.io.File;\r
+import java.util.ArrayList;\r
+import java.util.Date;\r
+import java.util.HashMap;\r
+\r
+import static com.enqualcomm.support.Constants.ACTION_HEATR_RATE_START;\r
+import static com.enqualcomm.support.LocationClient.LOCATION_MODE;\r
+import static com.enqualcomm.support.bean.Contact.GROUP_ALL;\r
+import static java.lang.Math.abs;\r
+\r
+public class protocol_beehome {\r
+    private static final String TAG = "ICSrv." + protocol_jiai.class.getSimpleName();\r
+\r
+    private static final String CMDHEADER = "IW";\r
+    private static final String CMDEND = "#";\r
+    private static final String CMDSPLIT = ",";\r
+    public enum CMD_TYPE {\r
+        /*终端发起*/\r
+        AP00,//登录包\r
+        BP00,\r
+        AP01,//混合定位\r
+        BP01,\r
+        AP02,//多基站定位\r
+        BP02,\r
+        AP92,//CDMA 混合定位\r
+        BP92,\r
+        AP03,//心跳包\r
+        BP03,\r
+        AP05,//语音查询接收\r
+        BP05,\r
+        AP07,//语音上行\r
+        BP07,\r
+        AP10,//报警与地址回复\r
+        BP10,\r
+        AP49,//心率上传\r
+        BP49,\r
+        APHT,//心率血压上传\r
+        BPHT,\r
+        APTM,//基站校时及获取定位\r
+        BPTM,\r
+        /* 服务器发起*/\r
+        AP12,\r
+        BP12,//SOS 号码设置\r
+        AP14,\r
+        BP14,//设置联系人白名单\r
+        AP15,\r
+        BP15,//设置定位周期\r
+        AP16,\r
+        BP16,//立即定位\r
+        AP17,\r
+        BP17,//恢复出厂设置\r
+        AP18,\r
+        BP18,//重启设备\r
+        AP21,\r
+        BP21,//设置计步开关\r
+        AP28,\r
+        BP28, //语音下行\r
+        AP31,\r
+        BP31,//关机\r
+        AP33,\r
+        BP33,//工作模式\r
+        AP34,\r
+        BP34,//自定义工作模式\r
+        APXL,\r
+        BPXL,//测量心率\r
+        APXY,\r
+        BPXY,//测量血压\r
+        APJZ,\r
+        BPJZ,//血压校准\r
+        AP84,\r
+        BP84,//白名单开关\r
+        AP85,\r
+        BP85,//设置闹钟\r
+        AP86,\r
+        BP86,//心率血压测试周期\r
+        AP89,\r
+        BP89,//心率血压阀值设置\r
+        UNKNOWN_CMD,\r
+    }\r
+\r
+    private static HashMap<CMD_TYPE, String> cmdMap = null;\r
+\r
+    static {\r
+        cmdMap = new HashMap<CMD_TYPE, String>();\r
+        cmdMap.put(CMD_TYPE.AP00, "AP00");\r
+        cmdMap.put(CMD_TYPE.BP00, "BP00");\r
+        cmdMap.put(CMD_TYPE.AP01, "AP01");\r
+        cmdMap.put(CMD_TYPE.BP01, "BP01");\r
+        cmdMap.put(CMD_TYPE.AP02, "AP02");\r
+        cmdMap.put(CMD_TYPE.BP02, "BP02");\r
+        cmdMap.put(CMD_TYPE.AP92, "AP92");\r
+        cmdMap.put(CMD_TYPE.BP92, "BP92");\r
+        cmdMap.put(CMD_TYPE.AP03, "AP03");\r
+        cmdMap.put(CMD_TYPE.BP03, "BP03");\r
+        cmdMap.put(CMD_TYPE.AP05, "AP05");\r
+        cmdMap.put(CMD_TYPE.BP05, "BP05");\r
+        cmdMap.put(CMD_TYPE.AP07, "AP07");\r
+        cmdMap.put(CMD_TYPE.BP07, "BP07");\r
+        cmdMap.put(CMD_TYPE.AP10, "AP10");\r
+        cmdMap.put(CMD_TYPE.BP10, "BP10");\r
+        cmdMap.put(CMD_TYPE.AP49, "AP49");\r
+        cmdMap.put(CMD_TYPE.BP49, "BP49");\r
+        cmdMap.put(CMD_TYPE.APHT, "APHT");\r
+        cmdMap.put(CMD_TYPE.BPHT, "BPHT");\r
+        cmdMap.put(CMD_TYPE.APTM, "APTM");\r
+        cmdMap.put(CMD_TYPE.BPTM, "BPTM");\r
+        cmdMap.put(CMD_TYPE.AP12, "AP12");\r
+        cmdMap.put(CMD_TYPE.BP12, "BP12");\r
+        cmdMap.put(CMD_TYPE.AP14, "AP14");\r
+        cmdMap.put(CMD_TYPE.BP14, "BP14");\r
+        cmdMap.put(CMD_TYPE.AP15, "AP15");\r
+        cmdMap.put(CMD_TYPE.BP15, "BP15");\r
+        cmdMap.put(CMD_TYPE.AP16, "AP16");\r
+        cmdMap.put(CMD_TYPE.BP16, "BP16");\r
+        cmdMap.put(CMD_TYPE.AP17, "AP17");\r
+        cmdMap.put(CMD_TYPE.BP17, "BP17");\r
+        cmdMap.put(CMD_TYPE.AP18, "AP18");\r
+        cmdMap.put(CMD_TYPE.BP18, "BP18");\r
+        cmdMap.put(CMD_TYPE.AP21, "AP21");\r
+        cmdMap.put(CMD_TYPE.BP21, "BP21");\r
+        cmdMap.put(CMD_TYPE.AP28, "AP28");\r
+        cmdMap.put(CMD_TYPE.BP28, "BP28");\r
+        cmdMap.put(CMD_TYPE.AP31, "AP31");\r
+        cmdMap.put(CMD_TYPE.BP31, "BP31");\r
+        cmdMap.put(CMD_TYPE.AP33, "AP33");\r
+        cmdMap.put(CMD_TYPE.BP33, "BP33");\r
+        cmdMap.put(CMD_TYPE.AP34, "AP34");\r
+        cmdMap.put(CMD_TYPE.BP34, "BP34");\r
+        cmdMap.put(CMD_TYPE.APXL, "APXL");\r
+        cmdMap.put(CMD_TYPE.BPXL, "BPXL");\r
+        cmdMap.put(CMD_TYPE.APXY, "APXY");\r
+        cmdMap.put(CMD_TYPE.BPXY, "BPXY");\r
+        cmdMap.put(CMD_TYPE.APJZ, "APJZ");\r
+        cmdMap.put(CMD_TYPE.BPJZ, "BPJZ");\r
+        cmdMap.put(CMD_TYPE.AP84, "AP84");\r
+        cmdMap.put(CMD_TYPE.BP84, "BP84");\r
+        cmdMap.put(CMD_TYPE.AP85, "AP85");\r
+        cmdMap.put(CMD_TYPE.BP85, "BP85");\r
+        cmdMap.put(CMD_TYPE.AP86, "AP86");\r
+        cmdMap.put(CMD_TYPE.BP86, "BP86");\r
+        cmdMap.put(CMD_TYPE.AP89, "AP89");\r
+        cmdMap.put(CMD_TYPE.BP89, "BP89");\r
+    }\r
+\r
+\r
+    private NettyConnection mConnection=null;\r
+    private Runtime mRuntime=null;\r
+\r
+    public protocol_beehome(NettyConnection connect,Runtime runtime) {\r
+            mConnection=connect;\r
+            mRuntime=runtime;\r
+\r
+        }\r
+\r
+    private StringBuffer cmdbuf = new StringBuffer();\r
+\r
+    /*\r
+    输入的字符串,如果有完整命令,返回 true\r
+    否则返回 false\r
+     */\r
+    public boolean isCmdStr(String msg) {\r
+        int head_index = msg.indexOf(CMDHEADER);\r
+        if (head_index >= 0) {\r
+            int end_index = msg.indexOf("#", head_index);\r
+            if (end_index >= 0) {\r
+                return true;\r
+            }\r
+        }\r
+        return false;\r
+    }\r
+\r
+    private void log(String msg) {\r
+        ICLogger.log(TAG, msg);\r
+    }\r
+\r
+    private void log(String function, String msg) {\r
+        ICLogger.log(TAG, function, msg);\r
+    }\r
+\r
+\r
+\r
+    /**/\r
+    public static StringMessage genStringMessage(String cmdName, String msg){\r
+        StringMessage sm=new StringMessage(new String[]{cmdName,msg});\r
+        sm.refresh(msg);\r
+        return sm;\r
+    }\r
+    /*\r
+    返回true 表示 cmd 全部解析成功\r
+    返回false表示 cmd至少有一条解析失败,失败的数据归入buffer,下一次识别接着使用\r
+    字符串通过#号进行识别。\r
+    每个字符串如果发现 #,却又没有Header,“IW”则会被丢弃\r
+     */\r
+    public boolean parserCmd(byte[] bytes) {\r
+        boolean iscmdComplete = false;\r
+        boolean ret = true;\r
+        String last_inCompletecmd = "";\r
+        String cmd_msgbuf=new String(bytes);\r
+        log("bytes.size "+bytes.length);\r
+//        cmdbuf.append(cmd_msgbuf);\r
+        cmdbuf.append(cmd_msgbuf);\r
+        log("cmdbuf.size "+cmdbuf.length() +" "+cmdbuf.toString());\r
+    /*\r
+        如果不是 #结尾,就认为 接收数据不全,置位。\r
+         */\r
+        if (cmdbuf.toString().endsWith(CMDEND)) {\r
+            iscmdComplete = true;\r
+        }\r
+        String[] cmdlist = cmd_msgbuf.split(CMDEND);\r
+        int listlen = cmdlist.length;\r
+        log("listlen "+listlen);\r
+         /*\r
+        如果解析出来的cmdlist不是空,且数据不是完整cmd则保留 最后一条数据到last_inCompletecmd\r
+         */\r
+        if (cmdlist.length > 0 && iscmdComplete == false) {\r
+            listlen -= 1;\r
+            last_inCompletecmd = cmdlist[listlen];\r
+            log("cmd not complete , " + last_inCompletecmd);\r
+        }\r
+        for (int i = 0; i < listlen; i++) {\r
+            for (CMD_TYPE key : cmdMap.keySet()) {\r
+                if (cmdlist[i].startsWith(CMDHEADER + cmdMap.get(key))) {\r
+                    log("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key) + " ,  " + cmdlist[i]);\r
+                    if (key == CMD_TYPE.BP28) {\r
+                        //如果是BP28则 后面的数据是音频,需要保留\r
+                        byte[] amrBuf;\r
+                        int amrLen = getBP28Amrlen(cmdlist[i] );\r
+                        if (bytes.length > amrLen) {\r
+                            handleCmd(key, cmdlist[i], bytes);\r
+                        }\r
+                    } else {\r
+                       handleCmd(key, cmdlist[i]);\r
+                    }\r
+                }\r
+            }\r
+        }\r
+\r
+        cmdbuf = new StringBuffer().append(last_inCompletecmd);\r
+        return ret;\r
+    }\r
+    public int getBP28Amrlen(String cmd) {\r
+\r
+        String Name;\r
+        String appendIndex;\r
+        int packetCount;\r
+        int currentId;\r
+        int packetLen;\r
+\r
+\r
+        String[] msg=cmd.split(CMDSPLIT);\r
+        if (msg.length>=6){\r
+\r
+            Name=msg[1];\r
+            appendIndex=msg[2];\r
+            packetCount= Integer.valueOf(msg[3]);\r
+            currentId= Integer.valueOf(msg[4]);\r
+            packetLen= Integer.valueOf(msg[5]);\r
+\r
+            StringBuffer stringBuffer=new StringBuffer();\r
+            stringBuffer.append("getBP28AmrLen name = ").append(Name)\r
+                    .append(",appendIndex = ").append(appendIndex)\r
+                    .append(",packetCount = ").append(packetCount)\r
+                    .append(",currentId = ").append(currentId)\r
+                    .append(",packetLen = ").append(packetLen);\r
+\r
+\r
+            log( stringBuffer.toString());\r
+            return packetLen;\r
+        }else{\r
+            log("getBP28AmrLen","format Error");\r
+\r
+        }\r
+        return -1;\r
+    }\r
+    /*登录*/\r
+    public static String AP00(Runtime ds) {\r
+        //示例数据:IWAP00867155030001063#\r
+        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP00)).append(ds.IMEI()).append(CMDEND).toString();\r
+    }\r
+\r
+    //处理 登录 BP00\r
+    public void handleBP00(Runtime runtime,String cmd){\r
+        String[] msg=cmd.split(CMDSPLIT);\r
+//        get Msg :IWBP00,20191229171933,8# (size)24\r
+//        12-30 01:19:33.861 6492-6492/com.enqualcomm.support I/ICSrv.protocolAPIHelper: found cmd keyid=BP00 ,keyname=BP00 ,  IWBP00,20191229171933,8\r
+\r
+        if (msg.length>=3) {\r
+            log("handleBP00", "Set Datetime " + msg[1]);\r
+            log("handleBP00", "Set TimeZone " + msg[2]);\r
+\r
+            Date datetime= TimeUtil.parseDatetiime(msg[1]);\r
+            int timezone=Integer.parseInt(msg[2]);\r
+            if (datetime!=null){\r
+                ICLogger.i("==="+TimeUtil.getDefaultTimeZone());\r
+                TimeUtil.setTimeZone(timezone);\r
+\r
+\r
+                ICLogger.i("==="+TimeUtil.getDefaultTimeZone());\r
+                TimeUtil.setSysDateTime(runtime.getContextProxy().context,datetime,timezone);\r
+                ICLogger.i("==="+TimeUtil.getDefaultTimeZone());\r
+\r
+            }\r
+//            Set Datetime 20200505112734\r
+//            Set TimeZone 8\r
+\r
+        }else{\r
+            log("handleBP00","format Error");\r
+        }\r
+    }\r
+\r
+\r
+    public static String AP03(Runtime ds) {\r
+        //示例数据:IWAP03,06000908000102,5555,30#  IWAP03,000000null00000,0,0#\r
+        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP03)).append(CMDSPLIT).append(String.format("%03d",abs(ds.getSignalStrength())))\r
+                .append(ds.getGPSLocationStarNums()).append(ds.getBattery()).append("0")\r
+                .append(ds.getProtection()).append(ds.getWorkModeStr()).append(CMDSPLIT)\r
+                .append(ds.getTotalStepCount()).append(CMDSPLIT).append(ds.getRolltimes()).append(CMDEND).toString();\r
+    }\r
+    //处理 心跳 BP03\r
+    public void handleBP03(String cmd){\r
+\r
+        log("BP03心跳接收成功");\r
+    }\r
+\r
+\r
+    public static String AP10(Runtime ds){\r
+\r
+        /**\r
+         * IWAP10080524A2232.9806N11404.9355E000.1061830323.8706000908000502,\r
+         * 460,0,9520,3671,\r
+         * 00,zh-cn,00,\r
+         * 00为报警状态,00为无任何报警(01:SOS,02:低电,03:脱落报警,04:佩戴提醒,05/06:跌倒报警))\r
+         * zh-cn:设备语言\r
+         * 00:第一个0:是否需要回复地址信息,0:不回复,1回复.\r
+         * HOME|74-DE-2B-44-88-8C|97&HOME1|74-DE-2B-44-88-8C|97&HOME2|74-DE-2B-44-88-8C|97&HOME3|74-DE-2B-44-88-8C|97#\r
+         */\r
+        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP10)).append(TimeUtil.getShortDate())\r
+                .append(ds.getGPSData()).append(TimeUtil.getShortTime()).append(ds.getGPSHeading()).append(String.format("%03d",abs(ds.getSignalStrength())))\r
+                .append(ds.getGPSLocationStarNums()).append(ds.getBattery()).append("0")\r
+                .append(ds.getProtection()).append(ds.getWorkModeStr()).append(CMDSPLIT)\r
+                .append(ds.getLBSData()).append(CMDSPLIT)\r
+                .append(ds.getAlarmType()).append(CMDSPLIT)\r
+                .append(ds.getLanguage()).append(CMDSPLIT)\r
+                .append("00").append(CMDSPLIT)  //不回复地址\r
+                .append(ds.getWifiInfo()).append(CMDEND).toString();\r
+\r
+    }\r
+\r
+    /*LBS+GPS混合定位*/\r
+    public static String AP01(Runtime ds) {\r
+        //示例数据:IWAP01080524A2232.9806N11404.9355E000.1061830323.8706000908000102,\r
+        // 460,0,9520,3671,\r
+        // Home|74-DE-2B-44-88-8C|97& Home1|74-DE-2B-44-88-8C|97&Home2|74-DE-2B-44-88-8C|97& Home3|74-DE-2B-44-88-8C|97#\r
+//        IWAP01191230A2232.9807N11404.9355E000.1161320000.0006000910000000,460,00,9520,3671,#\r
+        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP01)).append(TimeUtil.getShortDate())\r
+                .append(ds.getGPSData()).append(TimeUtil.getShortTime()).append(ds.getGPSHeading()).append(String.format("%03d",abs(ds.getSignalStrength())))\r
+                .append(ds.getGPSLocationStarNums()).append(ds.getBattery()).append("0")\r
+                .append(ds.getProtection()).append(ds.getWorkModeStr()).append(CMDSPLIT)\r
+                .append(ds.getLBSData()).append(CMDSPLIT).append(ds.getWifiInfo()).append(CMDEND).toString();\r
+    }\r
+\r
+    //处理 定位 BP01\r
+    public void handleBP01(String cmd){\r
+        log("BP01定位接收成功");\r
+    }\r
+\r
+\r
+\r
+    /*LBS+WiFi混合定位*/\r
+    public static String AP02(Runtime ds) {\r
+        //示例数据:IWAP02,\r
+        // zh_cn,\r
+        // 0,\r
+        // 7,\r
+        // 460,0,\r
+        // 9520|3671|13,9520|3672|12,9520|3673|11,9520|3674|10,9520|3675|9,9520|3676|8,9520|3677|7,\r
+        // 4,\r
+        // 1|D8-24-BD-79-FA-1F|59&2|3C-46-D8-6D-CE-01|81&3|0C-4C-39-1A-7C-65|69&4|70-A8-E3-5D-D7-C0|65#\r
+//        IW标识符\r
+//        AP02:命令字\r
+//        zh_cn: 语言标志\r
+//        0:回复标识,为0时不回复地址,为 1 时,服务器回复地址信息\r
+//        7: 表示共有7组基站\r
+//        460: MCC 国家码\r
+//        0: MNC运营商代码\r
+//        9520|3671|10: LAC|CID|dbm表示一组基站信息,后面数量需和基站组数地应  10:dbm为信号强度多基站信号强度建议从高到低排列后上传,信号强度转正数:150 – abs(dbm)\r
+//        4: 表示WIFI组数,\r
+//                1|D8-24-BD-79-FA-1F|59: ssid|mac地址|信号强度,信号强度转正数:150 – abs(信号强度)\r
+\r
+        int apsum=0;\r
+        String wifiinfo=ds.getWifiInfo();\r
+        if (!wifiinfo.isEmpty()) {\r
+            String[] list = wifiinfo.split("&");\r
+            apsum = list.length;\r
+        }\r
+\r
+        ICLogger.i("Wifi ap sum "+apsum);\r
+        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP02)).append(CMDSPLIT)\r
+                .append(ds.getLanguage()).append(CMDSPLIT)\r
+                .append(0).append(CMDSPLIT) //为0时不回复地址\r
+                .append(ds.getLBSMultiStationData()).append(CMDSPLIT)  //基站信息数据\r
+                .append(apsum).append(CMDSPLIT).append(ds.getWifiInfo()).append(CMDEND).toString();  //wifi信息数据\r
+    }\r
+\r
+    //处理 定位 BP01\r
+    public void handleBP02(String cmd){\r
+        log("BP02定位接收成功");\r
+    }\r
+\r
+\r
+\r
+    public static String APXL(String id){\r
+//设备响应:      IWAPXL,080835#\r
+        //080835:指令流水号\r
+        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APXL))\r
+                .append(CMDSPLIT).append(id)\r
+                .append(CMDEND).toString();\r
+    }\r
+\r
+    /**\r
+     * 测量心率\r
+     * @param cmd\r
+     * @param connection\r
+     */\r
+    public void handleBPXL(String cmd, Connection connection){\r
+        //IWBPXL,353456789012345,080835#\r
+        //说明:\r
+        //IW:标识符\r
+        //BPXL : 命令字符\r
+        //353456789012345:IMEI号,设备唯一ID\r
+        //080835 :指令流水号\r
+        //设备响应:      IWAPXL,080835#\r
+        //080835:指令流水号\r
+        String[] list=cmd.split(CMDSPLIT);\r
+        if (list.length==3){\r
+            String index=list[2];\r
+            String imei=list[1];\r
+            ICLogger.i("Handle BPXL IMEI "+imei+",index "+index);\r
+            connection.send(genStringMessage("APXL",APXL(index)));\r
+        }else{\r
+            ICLogger.i("BPXL format error!");\r
+        }\r
+\r
+    }\r
+\r
+    public static String APXY(String id){\r
+//设备响应:      IWAPXY,080835#\r
+        //080835:指令流水号\r
+        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APXY))\r
+                .append(CMDSPLIT).append(id)\r
+                .append(CMDEND).toString();\r
+    }\r
+\r
+    /**\r
+     * 测量血压\r
+     * @param cmd\r
+     * @param connection\r
+     */\r
+    public void handleBPXY(String cmd,Connection connection){\r
+        //IWBPXY,353456789012345,080835#\r
+        //说明:\r
+        //IW:标识符\r
+        //BPXL : 命令字符\r
+        //353456789012345:IMEI号,设备唯一ID\r
+        //080835 :指令流水号\r
+        //设备响应:      IWAPXY,080835#\r
+        //080835:指令流水号\r
+        String[] list=cmd.split(CMDSPLIT);\r
+        if (list.length==3){\r
+            String index=list[2];\r
+            String imei=list[1];\r
+            ICLogger.i("Handle BPXY IMEI "+imei+",index "+index);\r
+            connection.send(genStringMessage("APXY",APXY(index)));\r
+        }else{\r
+            ICLogger.i("BPXY format error!");\r
+        }\r
+\r
+    }\r
+\r
+\r
+\r
+    public static String APJZ(String id,String BPH,String BPL,String Age,String Sex){\r
+        //设备响应:      IWAPJZ,792997,120,85,42,1#\r
+        //792997:指令流水号\r
+        // 高压120,低压85,年龄42,1 男性\r
+        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APJZ))\r
+                .append(CMDSPLIT).append(id)\r
+                .append(CMDSPLIT).append(BPH)\r
+                .append(CMDSPLIT).append(BPL)\r
+                .append(CMDSPLIT).append(Age)\r
+                .append(CMDSPLIT).append(Sex)\r
+                .append(CMDEND).toString();\r
+    }\r
+\r
+    /**\r
+     *\r
+     * @param cmd\r
+     * @param connection\r
+     * @param runtime\r
+     */\r
+    public void handleBPJZ(String cmd,Connection connection,Runtime runtime){\r
+        //cmdbuf.size 42 IWBPJZ,867155030001063,199600,120,85,45,1#   高压120,低压85,年龄45,男性\r
+//        cmdbuf.size 42 IWBPJZ,867155030001063,909957,120,85,42,0#  高压120,低压85,年龄42,女性\r
+        //IWBPJZ,353456789012345,080835,110,75#\r
+        //说明:\r
+        //IW:标识符\r
+        //BPJZ : 命令字符\r
+        //353456789012345:IMEI号,设备唯一ID\r
+        //110:高压值\r
+        //75:低压值\r
+        //080835 :指令流水号\r
+        //设备响应:      IWAPJZ,792997,120,85,42,1#\r
+        //792997:指令流水号\r
+        String[] list=cmd.split(CMDSPLIT);\r
+        if (list.length==7){\r
+            String index=list[2];\r
+            String imei=list[1];\r
+            String strBPH=list[3];\r
+            String strBPL=list[4];\r
+            String strAge=list[5];\r
+            String strSex=list[6];\r
+\r
+            connection.send(genStringMessage("APJZ",APJZ(index,strBPH,strBPL,strAge,strSex)));\r
+            runtime.getHRS().setXY_Ref(Integer.valueOf(strBPH),Integer.valueOf(strBPL),Integer.valueOf(strAge),Integer.valueOf(strSex));\r
+            ICLogger.i("Handle BPJZ IMEI "+imei+",index "+index+", BPH "+strBPH+", BPL "+strBPL+", Age "+ strAge +", Sex "+ (strSex.equals("1")?"男":"女"));\r
+        }else{\r
+            ICLogger.i("BPXY format error!");\r
+        }\r
+    }\r
+\r
+\r
+\r
+    //重启\r
+\r
+\r
+    public static String AP18(String index){\r
+        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP18))\r
+                .append(CMDSPLIT).append(index)\r
+                .append(CMDEND).toString();\r
+    }\r
+\r
+    public void handleBP18(Connection connection,String cmd) {\r
+\r
+        //    IWBP18,867155030001063,161723\r
+        String[] cmdlist=cmd.split(CMDSPLIT);\r
+        if (cmdlist.length==3) {\r
+\r
+            connection.send(genStringMessage("AP18",AP18(cmdlist[2])));\r
+\r
+        }\r
+    }\r
+    //恢复出厂设置\r
+\r
+    public static String AP17(String index){\r
+        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP17))\r
+                .append(CMDSPLIT).append(index)\r
+                .append(CMDEND).toString();\r
+    }\r
+    public void handleBP17(Connection connection,String cmd) {\r
+\r
+        //    IWBP17,867155030001063,161723\r
+        String[] cmdlist=cmd.split(CMDSPLIT);\r
+        if (cmdlist.length==3) {\r
+\r
+            connection.send(genStringMessage("AP17",AP17(cmdlist[2])));\r
+\r
+        }\r
+    }\r
+\r
+    //关机\r
+\r
+\r
+    public static String AP31(String index){\r
+        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP31))\r
+                .append(CMDSPLIT).append(index)\r
+                .append(CMDEND).toString();\r
+    }\r
+    public void handleBP31(Connection connection,String cmd) {\r
+\r
+        //    IWBP31,867155030001063,161723\r
+        String[] cmdlist=cmd.split(CMDSPLIT);\r
+        if (cmdlist.length==3) {\r
+\r
+            connection.send(genStringMessage("AP31",AP31(cmdlist[2])));\r
+\r
+        }\r
+    }\r
+\r
+    //设置SOS号码\r
+    public static String AP12(String index,String phNum1,String phNum2,String phNum3){\r
+        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP12))\r
+                .append(CMDSPLIT).append(index)\r
+                .append(CMDSPLIT).append(phNum1)\r
+                .append(CMDSPLIT).append(phNum2)\r
+                .append(CMDSPLIT).append(phNum3)\r
+                .append(CMDEND).toString();\r
+    }\r
+\r
+    //设置SOS号码\r
+    public void handleBP12(Connection connection,String cmd,Runtime runtime){\r
+        //    IWBP12,353456789012345,080835,135XXXXXXXX,135XXXXXXXX,135XXXXXXXX#\r
+        String[] cmdlist=cmd.split(CMDSPLIT);\r
+        if (cmdlist.length>=3){\r
+            String index=cmdlist[2];\r
+            String phNum1=cmdlist.length==3?"":cmdlist[3];\r
+            String phNum2=cmdlist.length>3?(cmdlist.length==4?"":cmdlist[4]):"";\r
+            String phNum3=(cmdlist.length>4)?(cmdlist.length==5? "":cmdlist[5]):"";\r
+            ICLogger.i(new StringBuffer().append("get Emegency Numbs "+phNum1+","+phNum2+","+phNum3).toString());\r
+            connection.send(genStringMessage("AP12",AP12(index,phNum1,phNum2,phNum3)));\r
+\r
+            ArrayList<Contact> contactArray=new ArrayList<Contact>();\r
+            if (!phNum1.isEmpty())  contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos1",phNum1));\r
+            if (!phNum2.isEmpty())  contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos2",phNum2));\r
+            if (!phNum3.isEmpty())  contactArray.add(new Contact(Contact.CATEGORY_SOS,"sos3",phNum3));\r
+\r
+            runtime.getDbHelper().saveContacts(contactArray,false,false,false,false,false,true);\r
+\r
+        }else{\r
+            ICLogger.i(" BP12 format error!");\r
+        }\r
+    }\r
+\r
+\r
+    public static String  AP14(String index,String[] phnumbs){\r
+        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP14))\r
+                .append(CMDSPLIT).append(index)\r
+                .append(CMDSPLIT).append(phnumbs[0])\r
+                .append(CMDSPLIT).append(phnumbs[1])\r
+                .append(CMDSPLIT).append(phnumbs[2])\r
+                .append(CMDSPLIT).append(phnumbs[3])\r
+                .append(CMDSPLIT).append(phnumbs[4])\r
+                .append(CMDSPLIT).append(phnumbs[5])\r
+                .append(CMDSPLIT).append(phnumbs[6])\r
+                .append(CMDSPLIT).append(phnumbs[7])\r
+                .append(CMDSPLIT).append(phnumbs[8])\r
+                .append(CMDSPLIT).append(phnumbs[9])\r
+                .append(CMDEND).toString();\r
+    }\r
+    //设置通讯录,白名单(10个)\r
+    public void handleBP14(Connection connection,String cmd , Runtime runtime){\r
+//        IWBP14,867155030001063,357444,9b44529b|13554820016,,,,,,,,,\r
+/**\r
+ * IWBP14,353456789012345,080835,\r
+ * D3590D54|135xxxxxxxxxx,\r
+ * D3590D54|135xxxxxxxxxx,\r
+ * D3590D54|135xxxxxxxxxx,\r
+ * D3590D54|135xxxxxxxxxx,\r
+ * D3590D54|135xxxxxxxxxx,\r
+ * D3590D54|135xxxxxxxxxx,\r
+ * D3590D54|135xxxxxxxxxx,\r
+ * D3590D54|135xxxxxxxxxx,\r
+ * D3590D54|135xxxxxxxxxx,\r
+ * D3590D54|135xxxxxxxxxx#\r
+ */\r
+        String[] cmdlist=cmd.split(CMDSPLIT);\r
+        String[] phnums=new String[]{"","","","","","","","","",""};\r
+        StringBuffer sb=new StringBuffer().append("recv phone Numbs ");\r
+        if (cmdlist.length>=3){\r
+            switch (cmdlist.length){\r
+                case 13:\r
+                    phnums[9]=cmdlist[12];\r
+                    sb.append(phnums[9]).append(",");\r
+                case 12:\r
+                    phnums[8]=cmdlist[11];\r
+                    sb.append(phnums[8]).append(",");\r
+                case 11:\r
+                    phnums[7]=cmdlist[10];\r
+                    sb.append(phnums[7]).append(",");\r
+                case 10:\r
+                    phnums[6]=cmdlist[9];\r
+                    sb.append(phnums[6]).append(",");\r
+                case 9:\r
+                    phnums[5]=cmdlist[8];\r
+                    sb.append(phnums[5]).append(",");\r
+                case 8:\r
+                    phnums[4]=cmdlist[7];\r
+                    sb.append(phnums[4]).append(",");\r
+                case 7:\r
+                    phnums[3]=cmdlist[6];\r
+                    sb.append(phnums[3]).append(",");\r
+                case 6:\r
+                    phnums[2]=cmdlist[5];\r
+                    sb.append(phnums[2]).append(",");\r
+                case 5:\r
+                    phnums[1]=cmdlist[4];\r
+                    sb.append(phnums[1]).append(",");\r
+                case 4:\r
+                    phnums[0]=cmdlist[3];\r
+                    sb.append(phnums[0]).append(",");\r
+\r
+            }\r
+\r
+            String index=cmdlist[2];\r
+            ICLogger.i(sb.toString());\r
+            connection.send(genStringMessage("AP14",AP14(index,phnums)));\r
+            ArrayList<Contact> contactArray=new ArrayList<Contact>();\r
+            for (int i=0; i< phnums.length;i++){\r
+                String[] tmp= phnums[i].split("\\|");\r
+                if (tmp.length==2){\r
+                    String name= Util.decodeUnicode2Utf8(tmp[0]);\r
+                    String phonem=tmp[1];\r
+                    ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length+" , name="+name+",-"+phonem);\r
+                    contactArray.add(new Contact(Contact.CATEGORY_CALL,name,phonem));\r
+                }else{\r
+                    ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length);\r
+\r
+                }\r
+            }\r
+//            contactArray.add(new Contact(Contact.CATEGORY_GROUP,"All","666"));\r
+//            contactArray.add(new Contact(Contact.CATEGORY_PARTNER,"PARTNER","666"));\r
+//            contactArray.add(new Contact(Contact.CATEGORY_CARE,"CARE","666"));\r
+//            contactArray.add(new Contact(Contact.CATEGORY_VOLTE,"VOLTE","666"));\r
+\r
+            runtime.getDbHelper().saveContacts(contactArray,false,false,true,false,false,false);\r
+\r
+        }else{\r
+            ICLogger.i(" BP14 format error!");\r
+        }\r
+\r
+    }\r
+\r
+\r
+\r
+    public static String AP85(Runtime ds,String cmddata){\r
+//示例数据:IWAP49,68##\r
+        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP85))\r
+                .append(CMDSPLIT).append(cmddata)\r
+                .append(CMDEND).toString();\r
+\r
+    }\r
+    //设置闹钟\r
+    public void handleBP85(String cmd , Connection connection,Runtime runtime){\r
+//        IWBP85,867155030001063,155312,1,1,0235,12,1,1\r
+//        IWBP85,867155030002145,945166,1,0,\r
+//        IWBP85,867155030001064,265960,1,1,1130,,1,1\r
+//        IWBP85,353456789012345,080835,1,3, 0900,135,1,1@0900 ,135,1,2@0900 ,135,1,3#\r
+//353456789012345:IMEI号,设备唯一ID\r
+//080835 :指令流水号\r
+//1: 表示闹钟总开关,1为开,0 为关\r
+//3: 表示闹钟个数\r
+//0900 ,135,1,1,表示一组闹钟,0900表示早上09:00, 135表示周一周三周五,使用24小时制\r
+//1表示该组闹钟开启或关闭状态   1表示开启  0表示关闭\r
+//1表示吃药提醒\r
+//2 表示喝水提醒\r
+//3 表示久坐提醒\r
+//多组闹钟之间用”@”符号分隔\r
+\r
+        String imei="",cmdindex="0"/*指令流水号*/;\r
+        int     all_alarmswitch=0 /*总开关 1为开,0 为关*/,\r
+                alarmswitch=0 /*1为开,0 为关*/,\r
+                alarmcount=0 /*表示闹钟个数*/;\r
+        String alarmtime="";//0900表示早上09:00\r
+        int alarmtype=1; //1表示吃药提醒 , 2 表示喝水提醒 ,3 表示久坐提醒\r
+        String repeat="";// 135表示周一周三周五,使用24小时制\r
+        String[] datalist= cmd.split("@");\r
+        ArrayList<Alarm> alarmlist=new ArrayList<>();\r
+        if (datalist.length >0){\r
+            for (int i =0 ; i< datalist.length;i++){\r
+                String [] cmdarglist=datalist[i].split(",");\r
+\r
+                if (i == 0){\r
+                    if (cmdarglist.length == 9){\r
+                        imei=cmdarglist[1];\r
+                        cmdindex=cmdarglist[2];\r
+                        all_alarmswitch=Integer.valueOf(cmdarglist[3]);\r
+                        alarmcount=Integer.valueOf(cmdarglist[4]);\r
+                        alarmtime=cmdarglist[5];\r
+                        repeat=cmdarglist[6];\r
+                        alarmswitch=Integer.valueOf(cmdarglist[7]);\r
+                        alarmtype = Integer.valueOf(cmdarglist[8]);\r
+                        log(new StringBuilder("imei ").append(imei)\r
+                                .append(", cmdindex ").append(cmdindex)\r
+                                .append(", allswitch=").append(all_alarmswitch)\r
+                                .append(", all alarm count=").append(alarmcount)\r
+                                .toString()\r
+                        );\r
+\r
+                        log(new StringBuilder("alarmtime ").append(alarmtime)\r
+                                .append(", relpeat ").append(repeat)\r
+                                .append(", switch=").append(alarmswitch)\r
+                                .append(", alarmtype=").append(alarmtype)\r
+                                .toString()\r
+                        );\r
+                        alarmlist.add(new Alarm("ST"+alarmtime.substring(0,2)+"."+alarmtime.substring(2),"W"+repeat,"CON",alarmswitch==1?"ON":"OFF","闹铃"));\r
+\r
+                    }else if (cmdarglist.length == 5) {\r
+                        imei=cmdarglist[1];\r
+                        cmdindex=cmdarglist[2];\r
+                        all_alarmswitch=Integer.valueOf(cmdarglist[3]);\r
+                        alarmcount=Integer.valueOf(cmdarglist[4]);\r
+                    }else{\r
+                        log("data len is too small!");\r
+                    }\r
+                }else{\r
+                    if (cmdarglist.length == 4){\r
+                        alarmtime=cmdarglist[0];\r
+                        repeat=cmdarglist[1];\r
+                        alarmswitch=Integer.valueOf(cmdarglist[2]);\r
+                        alarmtype = Integer.valueOf(cmdarglist[3]);\r
+\r
+                        log(new StringBuilder("set alarmtime ").append(alarmtime)\r
+                                .append(", relpeat ").append(repeat)\r
+                                .append(", switch=").append(alarmswitch)\r
+                                .append(", alarmtype=").append(alarmtype)\r
+                                .toString()\r
+                        );\r
+\r
+                        alarmlist.add(new Alarm("ST"+alarmtime.substring(0,2)+"."+alarmtime.substring(2),"W"+repeat,"CON",alarmswitch==1?"ON":"OFF","闹铃"));\r
+\r
+                    }else{\r
+                        log("data len is too small!");\r
+                    }\r
+\r
+                }\r
+            }//循环获取alarm数据结束\r
+            runtime.getDbHelper().saveAlarm(alarmlist);\r
+\r
+            //do clean and set alarm things\r
+\r
+        }\r
+//IWBP85,867155030002145,410385,1,0,#\r
+\r
+        String replacement=new StringBuilder("IWBP85,").append(imei).append(",").toString();\r
+        String replycmd = cmd.replace(replacement,"");\r
+        ICLogger.i("gen reply "+replacement+" "+replycmd);\r
+        connection.send(genStringMessage("AP85",AP85(runtime,replycmd)));\r
+    }\r
+\r
+\r
+// AP05命令L02服务器不适用\r
+//    public static String AP05(boolean recvFlag){\r
+//\r
+////        IWAP05,1#\r
+//        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP05))\r
+//                .append(CMDSPLIT).append(recvFlag?1:0)\r
+//                .append(CMDEND).toString();\r
+//\r
+//    }\r
+//\r
+//\r
+//    public void handleBP05(String cmd){\r
+////        IWBP05,6#\r
+//        String[] cmdlist=cmd.split(CMDSPLIT);\r
+//        if (cmdlist.length>1){\r
+//            ICLogger.i(" 服务器有 " +cmdlist[1]+" 条语音未接收!");\r
+//        }\r
+//    }\r
+\r
+\r
+\r
+\r
+    public static byte[] AP07(String  packetTime,int count,int index,int datalen,byte[] amrdata){\r
+//IWAP07,20140818064408,6,1,1024,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#\r
+//说明:\r
+//IW:标识符\r
+//AP07 : 命令字符\r
+//20140818064408 :yyyyMMddHHmmss 格式的年月日时分秒,设备录音时间\r
+//6:语音包分包总数\r
+//1 :当前包数,第一包为1,第二包为2,。。。。。。同一个语音包的语音时间相同\r
+//1024 :语音包长度\r
+//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:当前音频数据, 每个音频数据包大小为1024字节,最后一包不足1024的取实际字节数\r
+//语音包上传规则:\r
+//按包次序依次上传,上传后如果没有收到服务器的响应包,则继续上传该语音包。\r
+//收到设备回复确认数据包接收成功状态后,继续开始依次上传下一个数据包。。。。。。\r
+//如果设备回复确认数据包接收失败状态,则重复发送上一个数据包\r
+\r
+\r
+        String sb=new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP07))\r
+                .append(CMDSPLIT).append(packetTime)\r
+                .append(CMDSPLIT).append(count)\r
+                .append(CMDSPLIT).append(index)\r
+                .append(CMDSPLIT).append(datalen)\r
+                .append(CMDSPLIT).toString();\r
+\r
+        byte[] sentbuf=new byte[sb.length()+datalen+1];\r
+        System.arraycopy(sb.getBytes(),0,sentbuf,0,sb.length());\r
+        System.arraycopy(amrdata,0,sentbuf,sb.length(),datalen);\r
+        sentbuf[sb.length()+datalen]='#';\r
+\r
+        return sentbuf;\r
+\r
+    }\r
+\r
+\r
+    public void handleBP07(String cmd , NettyConnection connection ){\r
+//平台响应:      IWBP07,20140818064408,6,1,1#\r
+//20140818064408:设备语音时间,yyyyMMddHHmmss 格式的年月日时分秒\r
+//6:语音包分包总数\r
+//1:当前设备收到的是第几个包\r
+//1:表示服务器接受数据成功,0表示服务器接受数据失败\r
+        String[] cmdlist=cmd.split(CMDSPLIT);\r
+        if (cmdlist.length==5){\r
+            String time=cmdlist[1];\r
+            int packetCount=Integer.valueOf(cmdlist[2]);\r
+            int packetIndex=Integer.valueOf(cmdlist[3]);\r
+            int receiveSuccess=Integer.valueOf(cmdlist[4]);\r
+            ICLogger.i("服务器在"+time+" 收到语音 "+packetIndex+"/"+packetCount+" "+ (receiveSuccess==1?"成功":"失敗"));\r
+            if (receiveSuccess == 1){\r
+                //如果服务器接收 语音成功,则设置下一个要发送的语音包Index,当index == packetCount的时候表示所有包发送完毕,停止继续发送\r
+                voicePacket.getInstanceSent().setCurrentIndexToSent(packetIndex);\r
+            }\r
+            //发送消息,再次检查要发送的语音包,确认其发送完毕\r
+            connection.DeliverCMDMessageToSystem("BP07","SentVoicePacket");\r
+\r
+        }else{\r
+            ICLogger.i(" BP07 Format error!");\r
+        }\r
+    }\r
+\r
+\r
+\r
+    public static String AP33(String cmdindex,int workMode){\r
+//IWAP33,080835,1#\r
+//080835:指令流水号\r
+//1:设置信息,供服务器同步\r
+        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP33))\r
+                .append(CMDSPLIT).append(cmdindex)\r
+                .append(CMDSPLIT).append(workMode)\r
+                .append(CMDEND).toString();\r
+    }\r
+\r
+    //设置工作模式\r
+    public void handleBP33(Connection connection,Runtime runtime,String cmd){\r
+\r
+//    IWBP33,867155030001063,560555,1\r
+//        IW:标识符\r
+//        BP33 : 命令字符\r
+//        353456789012345:IMEI号,设备唯一ID\r
+//        080835:指令流水号\r
+//        1:设备工作模式,1:正常模式,2:省电模式,3:紧急模式\r
+\r
+        String[] cmdlist=cmd.split(",");\r
+        if (cmdlist.length == 4){\r
+\r
+\r
+            log("work mode "+cmdlist[3]);\r
+            int mod=Integer.valueOf(cmdlist[3]);\r
+            int Cycle=900;\r
+            switch(mod){\r
+                case ICLocation.NORMAL_MOD:\r
+                    Cycle=900;\r
+                    break;\r
+                case ICLocation.LOWPOWER_MOD:\r
+                    Cycle=3600;\r
+                    break;\r
+                case ICLocation.EMERGNECY_MOD:\r
+                case ICLocation.REALTIME_MOD:\r
+                    Cycle=60;\r
+                    break;\r
+\r
+            }\r
+\r
+            String msg=AP33(cmdlist[2],mod);\r
+            //设定当前工作模式及循环频率\r
+            connection.send(genStringMessage("AP33",msg));\r
+            log("reply msg "+msg);\r
+            log("LOCATION_MODE  "+LOCATION_MODE+" mod "+ mod);\r
+            Config.setLocationMode(runtime.getContextProxy().context,mod);\r
+            Config.setLocationCycle(runtime.getContextProxy().context,Cycle);\r
+            runtime.getLocationInstance().setLocation_cycle(Cycle);\r
+            runtime.getLocationInstance().setWorkingMod(mod);\r
+//            CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod());\r
+            //此处设置好配置后,会在LocationClient通过消息开始执行及时定位操作。\r
+        }\r
+\r
+    }\r
+\r
+\r
+    public static String AP34(String cmdindex,int workMode){\r
+//IWAP34,588854,1#\r
+//080835:指令流水号\r
+//8:模式\r
+        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP34))\r
+                .append(CMDSPLIT).append(cmdindex)\r
+                .append(CMDSPLIT).append(workMode)\r
+                .append(CMDEND).toString();\r
+    }\r
+\r
+    //设置自定义工作模式\r
+    public void handleBP34(Connection connection,Runtime runtime,String cmd){\r
+\r
+//    IWBP34,867155030001063,588854,8,900,1#\r
+//        IW:标识符\r
+//        BP33 : 命令字符\r
+//        353456789012345:IMEI号,设备唯一ID\r
+//        080835:指令流水号\r
+//        1:设备工作模式,1:正常模式,2:省电模式,3:紧急模式\r
+\r
+        String[] cmdlist=cmd.split(",");\r
+        if (cmdlist.length == 6){\r
+\r
+\r
+            log("work mode "+cmdlist[3]);\r
+            int mod=Integer.valueOf(cmdlist[3]);\r
+            int Cycle=Integer.valueOf(cmdlist[4]);\r
+            int gpson=Integer.valueOf(cmdlist[5]);\r
+\r
+            String msg=AP34(cmdlist[2],mod);\r
+            //设定当前工作模式及循环频率\r
+            connection.send(genStringMessage("AP34",msg));\r
+\r
+            if(gpson==1){\r
+                mod=ICLocation.CUSTOM_MOD8_GPS;\r
+            }else{\r
+                mod=ICLocation.CUSTOM_MOD8_WIFI;\r
+            }\r
+            log("reply msg "+msg);\r
+            log("LOCATION_MODE  "+LOCATION_MODE+" mod "+ mod + ", cycle = "+Cycle+", GPS On= "+gpson);\r
+            Config.setLocationMode(runtime.getContextProxy().context,mod);\r
+            Config.setLocationCycle(runtime.getContextProxy().context,Cycle);\r
+            runtime.getLocationInstance().setLocation_cycle(Cycle);\r
+            runtime.getLocationInstance().setWorkingMod(mod);\r
+//            CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod());\r
+            //此处设置好配置后,会在LocationClient通过消息开始执行及时定位操作。\r
+        }\r
+\r
+    }\r
+\r
+    /**\r
+     * 心率上传,返回协议字串\r
+     * @param ds\r
+     * @return\r
+     */\r
+    public static String AP49(Runtime ds){\r
+        //示例数据:IWAP49,68##\r
+        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP49))\r
+                .append(CMDSPLIT).append(ds.getHRS().getPPG())\r
+                .append(CMDEND).toString();\r
+\r
+    }\r
+\r
+\r
+\r
+\r
+    /**\r
+     * 返回上传心率血压的协议字串\r
+     * @param ds\r
+     * @return\r
+     */\r
+    public static String APHT(Runtime ds){\r
+        //IWAPHT,60,130,85#\r
+        //说明:\r
+        //IW:标识符\r
+        //APHT : 命令字符\r
+        //60 : 表示心率\r
+        //130: 血压高压 [收缩压]\r
+        //85 : 血压低压 [舒张压]\r
+        //平台响应:      IWBPHT#\r
+        //表示平台已接收,可不作响应\r
+        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APHT))\r
+                .append(CMDSPLIT).append(ds.getHRS().getPPG())\r
+                .append(CMDSPLIT).append(ds.getHRS().getBPH())\r
+                .append(CMDSPLIT).append(ds.getHRS().getBPL())\r
+                .append(CMDEND).toString();\r
+    }\r
+    public static String APHT(String  ppg,String bph,String bpl){\r
+        //IWAPHT,60,130,85#\r
+        //说明:\r
+        //IW:标识符\r
+        //APHT : 命令字符\r
+        //60 : 表示心率\r
+        //130: 血压高压 [收缩压]\r
+        //85 : 血压低压 [舒张压]\r
+        //平台响应:      IWBPHT#\r
+        //表示平台已接收,可不作响应\r
+        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APHT))\r
+                .append(CMDSPLIT).append(ppg)\r
+                .append(CMDSPLIT).append(bph)\r
+                .append(CMDSPLIT).append(bpl)\r
+                .append(CMDEND).toString();\r
+    }\r
+\r
+\r
+    //立即定位反馈\r
+    public static String AP16(String  cmdindex){\r
+//IWAP16,080835#\r
+//080835:指令流水号\r
+        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP16))\r
+                .append(CMDSPLIT).append(cmdindex)\r
+                .append(CMDEND).toString();\r
+    }\r
+    //    立即定位指令(长链接有效)\r
+    public void handleBP16(Connection connection,Runtime runtime,String cmd){\r
+        //示例数据:IWBP16,867155030001063,335386\r
+//        IWBP16,353456789012345,080835#\r
+//        说明:\r
+//        IW:标识符\r
+//        BP16 : 命令字符\r
+//        353456789012345:IMEI号,设备唯一ID\r
+//        080835 :指令流水号\r
+        String[] cmdlist = cmd.split(",");\r
+        if(cmdlist.length==3){\r
+            log("imei "+cmdlist[1]+", cmdindex "+cmdlist[2]);\r
+\r
+            connection.send(genStringMessage("AP16",AP16(cmdlist[2])));\r
+        }else{\r
+            log("error BP16 format");\r
+        }\r
+    }\r
+\r
+\r
+    /*通过基站获取时间和坐标*/\r
+    public static String APTM(Runtime ds){\r
+        //示例数据:IWAPTM,460,0,9750,3613#\r
+        //说明:\r
+        //IW:标识符\r
+        //APTM : 命令字符\r
+        //460:MCC\r
+        //0: MNC\r
+        //9750: LAC\r
+        //3613: CID\r
+\r
+        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTM))\r
+                .append(CMDSPLIT).append(ds.getLocationInstance().getMCC())\r
+                .append(CMDSPLIT).append(ds.getLocationInstance().getMNC())\r
+                .append(CMDSPLIT).append(ds.getLocationInstance().getLAC())\r
+                .append(CMDSPLIT).append(ds.getLocationInstance().getGSMStationCID())\r
+                .append(CMDEND).toString();\r
+\r
+    }\r
+\r
+    public void handleBPTM(String cmd){\r
+        //平台响应:      IWBPTM,20160225090909,22.123456,113.654321#\r
+        //返回时间,格式为:yyyyMMddHHmmss ,为UTC0 时间\r
+        //经纬度保留六位小数,若没取到则返回 0\r
+        String[] list=cmd.split(CMDSPLIT);\r
+\r
+        if(list.length==4){\r
+\r
+            String time=list[1];\r
+            String lat=list[2];\r
+            String lon=list[3];\r
+            ICLogger.i("BPTM , time="+time+", lat="+lat+", lon="+lon);\r
+        }else{\r
+            ICLogger.i("BPTM format error");\r
+        }\r
+\r
+\r
+    }\r
+\r
+    public static String AP15(String index){\r
+//IWAP15, 080835#\r
+//080835:指令流水号\r
+        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP15))\r
+                .append(CMDSPLIT).append(index)\r
+                .append(CMDEND).toString();\r
+    }\r
+\r
+    //设置定位周期\r
+    public void handleBP15(String cmd ,Connection connection,Runtime runtime){\r
+//        IWBP15, 353456789012345, 080835, 30#\r
+//        353456789012345:IMEI号,设备唯一ID\r
+//        080835 :指令流水号\r
+//        30: 表示频率为30分钟\r
+\r
+        String[] list=cmd.split(CMDSPLIT);\r
+\r
+        if(list.length==4){\r
+            String index=list[2];\r
+            String time=list[3];\r
+            connection.send(genStringMessage("AP15",AP15(index)));\r
+            ICLogger.i("BP15 , 定位周期="+time+"秒");\r
+\r
+            Config.setLocationMode(runtime.getContextProxy().context, ICLocation.CUSTOM_MOD8_GPS);\r
+            Config.setLocationCycle(runtime.getContextProxy().context,Integer.valueOf(time));\r
+            runtime.getLocationInstance().setWorkingMod(Config.getLocationMode(runtime.getContextProxy().context));\r
+            runtime.getLocationInstance().setLocation_cycle(Config.getLocationCycle(runtime.getContextProxy().context));\r
+            //set AlarmCycle  and trigger Location\r
+            CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod());\r
+        }else{\r
+            ICLogger.i("BP15 format error");\r
+        }\r
+\r
+    }\r
+\r
+\r
+\r
+\r
+\r
+\r
+    /*语音下行反馈*/\r
+    public static String AP28(String name, String msg, int packagecount, int currentpackageindex, int received_success) {\r
+        //示例数据:IWAP28,D3590D54,xxxx,6,1,1#\r
+        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP28))\r
+                .append(CMDSPLIT).append(name)\r
+                .append(CMDSPLIT).append(msg)\r
+                .append(CMDSPLIT).append(packagecount)\r
+                .append(CMDSPLIT).append(currentpackageindex)\r
+                .append(CMDSPLIT).append(received_success)\r
+                .append(CMDEND).toString();\r
+    }\r
+\r
+    //处理 BP28 语音消息\r
+    public void handleBP28(NettyConnection connection,String cmd,Runtime runtime,byte[] bytes) {\r
+        //log("handleBP28 msg"+cmd);\r
+/**\r
+ * IWBP28, D3590D54,XXXX,6,1,1024,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#\r
+ * 说明:\r
+ * IW:标识符\r
+ * BP28 : 命令字符\r
+ * D3590D54:UNICODE编码,发送者名称\r
+ * XXXX: 附加信息,在响应数据包时,将附加信息原样响应,类似流水号\r
+ * 6:语音包分包总数\r
+ * 1 :当前包数,第一包为1,第二包为2,。。。。。。同一个语音包的语音时间相同\r
+ * 1024 :语音包长度\r
+ * XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:当前音频数据, 每个音频数据包大小为1024字节,最后一包不足1024的取实际字节数\r
+ * 语音包上传规则:\r
+ * 按包次序依次上传,上传后如果没有收到服务器的响应包,则继续上传该语音包。\r
+ * 收到设备回复确认数据包接收成功状态后,继续开始依次上传下一个数据包。。。。。。\r
+ * 如果设备回复确认数据包接收失败状态,则重复发送上一个数据包\r
+ * 设备响应:     IWAP28,D3590D54,XXXX,6,1,1#\r
+ * D3590D54:UNICODE编码,发送者名称\r
+ * XXXX: 附加信息,原样返回\r
+ * 6:语音包分包总数\r
+ * 1:当前设备收到的是第几个包\r
+ * 1:表示设备接受数据成功,0表示设备接受数据失败\r
+ */\r
+        String Name;\r
+        String appendIndex;\r
+        int packetCount;\r
+        int currentId;\r
+        int packetLen;\r
+        byte[] packetData;\r
+\r
+        String[] msg= cmd.split(CMDSPLIT);\r
+        if (msg.length>=6){\r
+\r
+            Name=msg[1];\r
+            appendIndex=msg[2];\r
+            packetCount= Integer.valueOf(msg[3]);\r
+            currentId= Integer.valueOf(msg[4]);\r
+            packetLen= Integer.valueOf(msg[5]);\r
+            packetData= Util.subArray(bytes,msg[0].length()+msg[1].length()+msg[2].length()+msg[3].length()+msg[4].length()+msg[5].length()+6,bytes.length-1);\r
+\r
+            StringBuffer stringBuffer=new StringBuffer();\r
+            stringBuffer.append("recv BP28 name = ").append(Name)\r
+                    .append(",appendIndex = ").append(appendIndex)\r
+                    .append(",packetCount = ").append(packetCount)\r
+                    .append(",currentId = ").append(currentId)\r
+                    .append(",packetLen = ").append(packetLen)\r
+                    .append(",packetDatalen = ").append(packetData.length);\r
+\r
+            log( stringBuffer.toString());\r
+            connection.send(genStringMessage("AP28",AP28(Name,appendIndex,packetCount,currentId,1)));\r
+            voicePacket.getInstance().appendVoice(Name,appendIndex,packetCount,currentId,packetLen,packetData);\r
+            log("================"+voicePacket.getInstance().toString());\r
+            if (voicePacket.getInstance().isFinished())\r
+            {\r
+\r
+                String dir = Environment.getExternalStorageDirectory()+ "/Android/VoiceCache";\r
+                String amrFilepath=Util.saveFile(voicePacket.getInstance().getVoicePacketBytes(),0,voicePacket.getInstance().getVoicePacketLen(),new File(dir),"receive_"+voicePacket.getInstance().getPacketTime()+".amr");\r
+                ICLogger.i("save Amr file to "+amrFilepath);\r
+                voicePacket.getInstance().clearPacket();\r
+                VoiceContent voiceContent=VoiceContent.placeHolderIn(Content.CONTACT_CATEGORY_GROUP,GROUP_ALL,amrFilepath);\r
+\r
+\r
+                final Uri uri2 = runtime.getDbHelper().insertMessage( voiceContent);\r
+\r
+                //回复UI消息,表示已经接收到\r
+                voiceContent.status = 3;\r
+                voiceContent.serverTime = TimeUtil.getSystemTime3();\r
+                voiceContent.preview = String.valueOf(Util.getDuration(voiceContent.content));\r
+                runtime.getDbHelper().updateMessage(voiceContent, uri2);\r
+\r
+//                runtime.getContextProxy().sendBroadcast(ACTION_IMESSAGE, runtime);\r
+\r
+                connection.DeliverCMDMessageToSystem("NewVoice", "");//通知下面线程状态变化\r
+            }\r
+\r
+        }else{\r
+            log("handleBP28","format Error");\r
+//            connection.send(genStringMessage("AP28",AP28(Name,appendIndex,packetCount,currentId,0)));\r
+\r
+        }\r
+\r
+    }\r
+\r
+    public void sendBroadcast(String cmd, Runtime dev) {\r
+\r
+        ComponentName componentName = new ComponentName("com.eqc.watch", "com.eqc.watch.launcher.ChatActivity");\r
+        Intent intent = new Intent("android.intent.action.MAIN");\r
+//              intent.putExtra("ACTIVITY_TYPE", 2);\r
+//              intent.addCategory("android.intent.category.DEFAULT");\r
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\r
+        intent.setComponent(componentName);\r
+        dev.getContextProxy().context.startActivity(intent);\r
+    }\r
+\r
+    //白名单开关(下行协议号:BP84,响应:AP84)\r
+    public static String AP84(String index,int success){\r
+\r
+        //设备响应:      IWAP80,080835,1#\r
+        //080835:指令流水号\r
+        //1:表示设备执行成功,0 表示设备执行失败\r
+        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP84))\r
+                .append(CMDSPLIT).append(index)\r
+                .append(CMDSPLIT).append(success)\r
+                .append(CMDEND).toString();\r
+    }\r
+\r
+    public void handleBP84(String cmd,Connection connection){\r
+//示例:\r
+        //IWBP84,353456789012345,080835,1#\r
+        //说明:\r
+        //IW:标识符\r
+        //BP84 : 命令字符\r
+        //353456789012345:IMEI号,设备唯一ID\r
+        //080835 :指令流水号\r
+        //1: 表示白名单开,0 表示白名单关\r
+        String[] list=cmd.split(CMDSPLIT);\r
+\r
+        if (list.length==4){\r
+            String index=list[2];\r
+            String whitelist_switch=list[3];\r
+            connection.send(genStringMessage("AP84",AP84(index,1)));\r
+\r
+            if (whitelist_switch.equals("1")){\r
+                Util.setSystemProperties("persist.sys.whitelist.enable","true");\r
+            }else{\r
+                Util.setSystemProperties("persist.sys.whitelist.enable","false");\r
+            }\r
+            ICLogger.i("收到服务器指令:白名单"+(whitelist_switch.equals("1")?"开":"关"));\r
+\r
+        }else{\r
+\r
+            ICLogger.i("BP84 format error!");\r
+        }\r
+\r
+    }\r
+\r
+    //17.设置心率/血压测量周期(下行协议号:BP86,响应:AP86)\r
+    public static String AP86(String index){\r
+\r
+        //设备响应:      IWAP86, 080835#\r
+        //080835:指令流水号\r
+        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP86))\r
+                .append(CMDSPLIT).append(index)\r
+                .append(CMDEND).toString();\r
+    }\r
+\r
+    public void handleBP86(String cmd,Connection connection,Runtime runtime){\r
+\r
+        //示例:\r
+        //IWBP86, 353456789012345, 080835,1,720#\r
+        //说明:\r
+        //IW:标识符\r
+        //BP86 : 命令字符\r
+        //353456789012345:IMEI号,设备唯一ID\r
+        //080835 :指令流水号\r
+        //1: 表示心率周期;2 :表示血压周期\r
+        //720: 表示720分钟\r
+\r
+        String[] list=cmd.split(CMDSPLIT);\r
+\r
+        if (list.length==5){\r
+            String index=list[2];\r
+            String type=list[3];\r
+            String cycle=list[4];\r
+            connection.send(genStringMessage("AP86",AP86(index)));\r
+            ICLogger.i("收到服务器指令:设置"+(type.equals("1")?"心率周期 ":"血压周期 ")+cycle+"分钟");\r
+\r
+            //发送重置PPGCycle的广播,会在CoreServer里面执行\r
+            Intent intent = new Intent();\r
+            intent.putExtra("PPGTestCycle",Integer.valueOf(cycle));\r
+            runtime.getContextProxy().sendBrodcast(ACTION_HEATR_RATE_START,intent);\r
+        }else{\r
+            ICLogger.i("BP86 format error!");\r
+        }\r
+\r
+    }\r
+\r
+    //18.18.设置心率/血压阀值(下行协议号:BP89,响应:AP89)\r
+    public static String AP89(String index){\r
+\r
+        //设备响应:      IWAP89, 080835#\r
+        //080835:指令流水号\r
+        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP89))\r
+                .append(CMDSPLIT).append(index)\r
+                .append(CMDEND).toString();\r
+    }\r
+\r
+    public void handleBP89(String cmd,Connection connection){\r
+\r
+        //示例:\r
+        //IWBP89, 353456789012345, 080835,50,90,80,90,110,140#\r
+        //说明:\r
+        //IW:标识符\r
+        //BP89 : 命令字符\r
+        //353456789012345:IMEI号,设备唯一ID\r
+        //080835 :指令流水号\r
+        //50: 心率低阀值,低于该阀值上传心率,如果未设置,则留空\r
+        //90: 心率高阀值,高于该阀值上传心率,如果未设置,则留空\r
+        //80: 低压阀值,低压低于该阀值上传血压,如果未设置,则留空\r
+        //90: 低压阀值,低压高于该阀值上传血压,如果未设置,则留空\r
+        //110: 高压阀值,高压低于该阀值上传血压,如果未设置,则留空\r
+        //140: 高压阀值,高压高于该阀值上传血压,如果未设置,则留空\r
+        String[] list=cmd.split(CMDSPLIT);\r
+        if (list.length==9){\r
+            String index=list[2];\r
+            String PPGH=list[3];\r
+            String PPGL=list[4];\r
+            String BPH_H=list[5];\r
+            String BPH_L=list[6];\r
+            String BPL_H=list[7];\r
+            String BPL_L=list[8];\r
+            connection.send(genStringMessage("AP89",AP89(index)));\r
+            ICLogger.i("收到服务器指令:心率/血压阀值 "+PPGH+","+PPGL+","+BPH_H+","+BPH_L+","+BPL_H+","+BPL_L);\r
+        }else{\r
+            ICLogger.i("BP89 format error!");\r
+        }\r
+\r
+    }\r
+    public boolean handleCmd(CMD_TYPE type, String cmd) {\r
+\r
+        //普通非二进制命令用此函数处理\r
+        boolean ret=true;\r
+        ICLogger.i("handleCmd "+type.name() + " strLen="+cmd.length());\r
+        if (Config.LOG_TOFILE)ICLogger.logToFile("APILog", " recv " + cmd);\r
+        switch (type){\r
+            case BP00: //登录包\r
+                handleBP00(mRuntime,cmd);\r
+                ICLogger.i("服务器收到登录包AP00");\r
+                mConnection.DeliverCMDMessageToSystem("BP00",cmd);//通知下面线程状态变化\r
+                break;\r
+            case BP01: //gps定位包\r
+                handleBP01(cmd);\r
+                ICLogger.i("服务器收到定位AP01");\r
+                mConnection.DeliverCMDMessageToSystem("IWAP01",cmd);//通知下面线程状态变化\r
+                break;\r
+            case BP02:// wifi定位包\r
+                handleBP02(cmd);\r
+                ICLogger.i("服务器收到定位AP02");\r
+                mConnection.DeliverCMDMessageToSystem("IWAP02",cmd);//通知下面线程状态变化\r
+                break;\r
+            case BP03: //心跳包\r
+                handleBP03(cmd);\r
+                ICLogger.i("服务器收到心跳包AP03");\r
+                mConnection.DeliverCMDMessageToSystem("BP03",cmd);//通知下面线程状态变化\r
+                break;\r
+\r
+            case BP07:\r
+                //收到发送的语音包\r
+                handleBP07(cmd,mConnection);\r
+                break;\r
+            case BP10:\r
+                //报警包\r
+                mConnection.DeliverCMDMessageToSystem("IWAP10",cmd);//通知下面线程状态变化\r
+                break;\r
+\r
+            case BPTM:\r
+                //校时命令\r
+                handleBPTM(cmd);\r
+                ICLogger.i("服务器收到校时命令APTM");\r
+                mConnection.DeliverCMDMessageToSystem("APTM",cmd);//通知下面线程状态变化\r
+                break;\r
+            case BP85://设置闹钟\r
+                handleBP85(cmd,mConnection,mRuntime);\r
+                ICLogger.i("收到服务器设置闹钟命令BP85");\r
+                mConnection.DeliverCMDMessageToSystem("AP85",cmd);//通知下面线程状态变化\r
+                break;\r
+            case BP33:\r
+                //设置工作模式\r
+                handleBP33(mConnection,mRuntime,cmd);\r
+                mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化\r
+\r
+                break;\r
+            case BP34:\r
+                //设置工作模式\r
+                handleBP34(mConnection,mRuntime,cmd);\r
+                mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化\r
+                break;\r
+            case BP16:\r
+                //立即定位指令(长链接有效)\r
+                handleBP16(mConnection,mRuntime,cmd);\r
+                mConnection.DeliverCMDMessageToSystem("StartLocate",cmd);//通知下面线程状态变化\r
+                break;\r
+\r
+//                            case BP05: //L02服务器不适用\r
+//                                //查询服务器语音 返回信息\r
+//                                API.handleBP05(cmd);\r
+//                                break;\r
+\r
+            case BP12:\r
+                //收到设置SOS号码\r
+                handleBP12(mConnection,cmd,mRuntime);\r
+                ICLogger.i("收到服务器设置SOS号码命令BP12");\r
+                break;\r
+            case BP14:\r
+                //收到设置白名单号码\r
+                handleBP14(mConnection,cmd,mRuntime);\r
+                ICLogger.i("收到服务器设置白名单号码命令BP14");\r
+                break;\r
+            case BP15:\r
+                handleBP15(cmd,mConnection,mRuntime);\r
+                ICLogger.i("收到服务器设置定位命令BP15");\r
+                break;\r
+            case BP17:\r
+                //收到恢复出厂设置\r
+                handleBP17(mConnection,cmd);\r
+                ICLogger.i("收到服务器恢复出厂设置命令BP17");\r
+                mConnection.DeliverCMDMessageToSystem("FactoryReset",cmd);//通知下面线程状态变化\r
+                break;\r
+\r
+            case BP18:\r
+                //收到重启\r
+                handleBP18(mConnection,cmd);\r
+                ICLogger.i("收到服务器重启命令BP18");\r
+                mConnection.DeliverCMDMessageToSystem("Reboot",cmd);//通知下面线程状态变化\r
+                break;\r
+\r
+            case BP31:\r
+                //收到关机\r
+                handleBP31(mConnection,cmd);\r
+                ICLogger.i("收到服务器关机命令BP31");\r
+                mConnection.DeliverCMDMessageToSystem("poweroff",cmd);//通知下面线程状态变化\r
+                break;\r
+\r
+            case BPXL:\r
+                handleBPXL(cmd,mConnection);\r
+                ICLogger.i("收到服务器心率检测命令");\r
+                HeartRateManager.triggerPPGtest();\r
+                break;\r
+            case BPXY:\r
+                handleBPXY(cmd,mConnection);\r
+                ICLogger.i("收到服务器血压检测命令");\r
+                HeartRateManager.triggerPPGtest();\r
+                break;\r
+            case BPJZ:\r
+                handleBPJZ(cmd,mConnection,mRuntime);\r
+                ICLogger.i("收到服务器血压校准命令");\r
+                break;\r
+            case BPHT:\r
+                ICLogger.i("服务器收到上传的心率血压");\r
+                break;\r
+            case BP84:\r
+                handleBP84(cmd,mConnection);\r
+                ICLogger.i("收到服务器白名单命令");\r
+                break;\r
+\r
+            case BP86:\r
+                //心率血压周期设置\r
+                handleBP86(cmd,mConnection,mRuntime);\r
+//                                ICLogger.i("");\r
+                break;\r
+            case BP89:\r
+                //心率/血压阀值\r
+                handleBP89(cmd,mConnection);\r
+                break;\r
+        }\r
+\r
+        return ret;\r
+\r
+    }\r
+\r
+\r
+    public boolean handleCmd(CMD_TYPE type, String cmd, byte[] bytes) {\r
+\r
+        //只有需要传递二级制数据的才需要这个函数,目前只有BP28需要\r
+        boolean ret=true;\r
+        ICLogger.i("handleCmd "+type.name() + " "+cmd+" bytelen="+bytes.length );\r
+        if (Config.LOG_TOFILE) ICLogger.logToFile("APILog", " recv " +new String(bytes));\r
+        switch (type) {\r
+            case BP28:\r
+                handleBP28(mConnection,cmd, mRuntime,bytes);\r
+                ICLogger.i("收到服务器语音BP28");\r
+                mConnection.DeliverCMDMessageToSystem("BP28", "");//通知下面线程状态变化\r
+                break;\r
+        }\r
+        return ret;\r
+    }\r
+}\r
@@ -1,15 +1,12 @@
-package com.enqualcomm.support.adapter;\r
+package com.ic.protocols;\r
 \r
 import android.content.ComponentName;\r
 import android.content.Intent;\r
 import android.net.Uri;\r
 import android.os.Environment;\r
-import android.os.Messenger;\r
-import android.util.Log;\r
 \r
 import com.enqualcomm.support.Config;\r
-import com.enqualcomm.support.Constants;\r
-import com.enqualcomm.support.LocationClient;\r
+import com.enqualcomm.support.CoreService;\r
 import com.enqualcomm.support.bean.Alarm;\r
 import com.enqualcomm.support.bean.Contact;\r
 import com.enqualcomm.support.bean.Content;\r
@@ -18,39 +15,29 @@ import com.enqualcomm.support.bean.Runtime;
 import com.enqualcomm.support.bean.StringMessage;\r
 import com.enqualcomm.support.bean.VoiceContent;\r
 import com.enqualcomm.support.bean.voicePacket;\r
-import com.enqualcomm.support.CoreService;\r
-import com.enqualcomm.support.service.Deliver;\r
+import com.enqualcomm.support.service.HeartRateManager;\r
 import com.enqualcomm.support.utils.Connection;\r
-import com.enqualcomm.support.utils.DBHelper;\r
 import com.enqualcomm.support.utils.ICLogger;\r
 import com.enqualcomm.support.utils.NettyConnection;\r
-import com.enqualcomm.support.utils.ProcessReceiver;\r
-import com.enqualcomm.support.utils.ServiceUtil;\r
-import com.enqualcomm.support.utils.SharPreferenceUtil;\r
 import com.enqualcomm.support.utils.TimeUtil;\r
 import com.enqualcomm.support.utils.Util;\r
 \r
 import java.io.File;\r
-import java.sql.Time;\r
 import java.util.ArrayList;\r
 import java.util.Date;\r
 import java.util.HashMap;\r
 \r
-import static com.enqualcomm.support.Constants.ACTION_EQC_ALARM;\r
 import static com.enqualcomm.support.Constants.ACTION_HEATR_RATE_START;\r
-import static com.enqualcomm.support.Constants.ACTION_IMESSAGE;\r
-import static com.enqualcomm.support.LocationClient.LOCATION_CYCLE;\r
 import static com.enqualcomm.support.LocationClient.LOCATION_MODE;\r
 import static com.enqualcomm.support.bean.Contact.GROUP_ALL;\r
 import static java.lang.Math.abs;\r
 \r
-public class protocolAPIHelper {\r
-    private static final String TAG = "ICSrv." + protocolAPIHelper.class.getSimpleName();\r
+public class protocol_jiai {\r
+    private static final String TAG = "ICSrv." + protocol_jiai.class.getSimpleName();\r
 \r
     private static final String CMDHEADER = "IW";\r
     private static final String CMDEND = "#";\r
     private static final String CMDSPLIT = ",";\r
-    private CmdHandler cmdHandler=null;\r
     public enum CMD_TYPE {\r
         /*终端发起*/\r
         AP00,//登录包\r
@@ -179,9 +166,13 @@ public class protocolAPIHelper {
         cmdMap.put(CMD_TYPE.BP89, "BP89");\r
     }\r
 \r
-    public protocolAPIHelper(CmdHandler handler) {\r
+    private NettyConnection mConnection=null;\r
+    private Runtime mRuntime=null;\r
+\r
+    public protocol_jiai(NettyConnection connect,Runtime runtime) {\r
+        mConnection=connect;\r
+        mRuntime=runtime;\r
 \r
-        cmdHandler=handler;\r
     }\r
 \r
     private StringBuffer cmdbuf = new StringBuffer();\r
@@ -212,10 +203,10 @@ public class protocolAPIHelper {
 \r
 \r
     /**/\r
-    public static StringMessage genStringMessage(String cmdName,String msg){\r
-            StringMessage sm=new StringMessage(new String[]{cmdName,msg});\r
-            sm.refresh(msg);\r
-            return sm;\r
+    public static StringMessage genStringMessage(String cmdName, String msg){\r
+        StringMessage sm=new StringMessage(new String[]{cmdName,msg});\r
+        sm.refresh(msg);\r
+        return sm;\r
     }\r
     /*\r
     返回true 表示 cmd 全部解析成功\r
@@ -258,11 +249,10 @@ public class protocolAPIHelper {
                         byte[] amrBuf;\r
                         int amrLen = getBP28Amrlen(cmdlist[i] );\r
                         if (bytes.length > amrLen) {\r
-                            if (cmdHandler != null)\r
-                                cmdHandler.handleCmd(key, cmdlist[i], bytes);\r
+                            handleCmd(key, cmdlist[i], bytes);\r
                         }\r
                     } else {\r
-                        if (cmdHandler!=null) cmdHandler.handleCmd(key, cmdlist[i]);\r
+                        handleCmd(key, cmdlist[i]);\r
                     }\r
                 }\r
             }\r
@@ -321,7 +311,7 @@ public class protocolAPIHelper {
             log("handleBP00", "Set Datetime " + msg[1]);\r
             log("handleBP00", "Set TimeZone " + msg[2]);\r
 \r
-            Date datetime=TimeUtil.parseDatetiime(msg[1]);\r
+            Date datetime= TimeUtil.parseDatetiime(msg[1]);\r
             int timezone=Integer.parseInt(msg[2]);\r
             if (datetime!=null){\r
                 ICLogger.i("==="+TimeUtil.getDefaultTimeZone());\r
@@ -455,7 +445,7 @@ public class protocolAPIHelper {
      * @param cmd\r
      * @param connection\r
      */\r
-    public void handleBPXL(String cmd,Connection connection){\r
+    public void handleBPXL(String cmd, Connection connection){\r
         //IWBPXL,353456789012345,080835#\r
         //说明:\r
         //IW:标识符\r
@@ -469,7 +459,7 @@ public class protocolAPIHelper {
             String index=list[2];\r
             String imei=list[1];\r
             ICLogger.i("Handle BPXL IMEI "+imei+",index "+index);\r
-            connection.send(protocolAPIHelper.genStringMessage("APXL",APXL(index)));\r
+            connection.send(genStringMessage("APXL",APXL(index)));\r
         }else{\r
             ICLogger.i("BPXL format error!");\r
         }\r
@@ -503,7 +493,7 @@ public class protocolAPIHelper {
             String index=list[2];\r
             String imei=list[1];\r
             ICLogger.i("Handle BPXY IMEI "+imei+",index "+index);\r
-            connection.send(protocolAPIHelper.genStringMessage("APXY",APXY(index)));\r
+            connection.send(genStringMessage("APXY",APXY(index)));\r
         }else{\r
             ICLogger.i("BPXY format error!");\r
         }\r
@@ -553,7 +543,7 @@ public class protocolAPIHelper {
             String strAge=list[5];\r
             String strSex=list[6];\r
 \r
-            connection.send(protocolAPIHelper.genStringMessage("APJZ",APJZ(index,strBPH,strBPL,strAge,strSex)));\r
+            connection.send(genStringMessage("APJZ",APJZ(index,strBPH,strBPL,strAge,strSex)));\r
             runtime.getHRS().setXY_Ref(Integer.valueOf(strBPH),Integer.valueOf(strBPL),Integer.valueOf(strAge),Integer.valueOf(strSex));\r
             ICLogger.i("Handle BPJZ IMEI "+imei+",index "+index+", BPH "+strBPH+", BPL "+strBPL+", Age "+ strAge +", Sex "+ (strSex.equals("1")?"男":"女"));\r
         }else{\r
@@ -619,7 +609,7 @@ public class protocolAPIHelper {
         }\r
     }\r
 \r
-        //设置SOS号码\r
+    //设置SOS号码\r
     public static String AP12(String index,String phNum1,String phNum2,String phNum3){\r
         return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP12))\r
                 .append(CMDSPLIT).append(index)\r
@@ -669,7 +659,7 @@ public class protocolAPIHelper {
                 .append(CMDSPLIT).append(phnumbs[9])\r
                 .append(CMDEND).toString();\r
     }\r
-//设置通讯录,白名单(10个)\r
+    //设置通讯录,白名单(10个)\r
     public void handleBP14(Connection connection,String cmd , Runtime runtime){\r
 //        IWBP14,867155030001063,357444,9b44529b|13554820016,,,,,,,,,\r
 /**\r
@@ -728,16 +718,16 @@ public class protocolAPIHelper {
             connection.send(genStringMessage("AP14",AP14(index,phnums)));\r
             ArrayList<Contact> contactArray=new ArrayList<Contact>();\r
             for (int i=0; i< phnums.length;i++){\r
-               String[] tmp= phnums[i].split("\\|");\r
-               if (tmp.length==2){\r
-                      String name=Util.decodeUnicode2Utf8(tmp[0]);\r
-                      String phonem=tmp[1];\r
-                      ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length+" , name="+name+",-"+phonem);\r
-                      contactArray.add(new Contact(Contact.CATEGORY_CALL,name,phonem));\r
-               }else{\r
-                   ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length);\r
-\r
-               }\r
+                String[] tmp= phnums[i].split("\\|");\r
+                if (tmp.length==2){\r
+                    String name= Util.decodeUnicode2Utf8(tmp[0]);\r
+                    String phonem=tmp[1];\r
+                    ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length+" , name="+name+",-"+phonem);\r
+                    contactArray.add(new Contact(Contact.CATEGORY_CALL,name,phonem));\r
+                }else{\r
+                    ICLogger.i("phnums["+i+"]="+phnums[i]+",split = "+tmp.length);\r
+\r
+                }\r
             }\r
 //            contactArray.add(new Contact(Contact.CATEGORY_GROUP,"All","666"));\r
 //            contactArray.add(new Contact(Contact.CATEGORY_PARTNER,"PARTNER","666"));\r
@@ -761,7 +751,7 @@ public class protocolAPIHelper {
                 .append(CMDEND).toString();\r
 \r
     }\r
-//设置闹钟\r
+    //设置闹钟\r
     public void handleBP85(String cmd , Connection connection,Runtime runtime){\r
 //        IWBP85,867155030001063,155312,1,1,0235,12,1,1\r
 //        IWBP85,867155030002145,945166,1,0,\r
@@ -1171,13 +1161,13 @@ public class protocolAPIHelper {
 \r
     }\r
 \r
-public static String AP15(String index){\r
+    public static String AP15(String index){\r
 //IWAP15, 080835#\r
 //080835:指令流水号\r
-    return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP15))\r
-            .append(CMDSPLIT).append(index)\r
-            .append(CMDEND).toString();\r
-}\r
+        return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP15))\r
+                .append(CMDSPLIT).append(index)\r
+                .append(CMDEND).toString();\r
+    }\r
 \r
     //设置定位周期\r
     public void handleBP15(String cmd ,Connection connection,Runtime runtime){\r
@@ -1191,8 +1181,8 @@ public static String AP15(String index){
         if(list.length==4){\r
             String index=list[2];\r
             String time=list[3];\r
-            connection.send(protocolAPIHelper.genStringMessage("AP15",AP15(index)));\r
-            ICLogger.i("BP15 , 定位周期="+time+"分钟");\r
+            connection.send(genStringMessage("AP15",AP15(index)));\r
+            ICLogger.i("BP15 , 定位周期="+time+"秒");\r
 \r
             Config.setLocationMode(runtime.getContextProxy().context, ICLocation.CUSTOM_MOD8_GPS);\r
             Config.setLocationCycle(runtime.getContextProxy().context,Integer.valueOf(time));\r
@@ -1310,13 +1300,13 @@ public static String AP15(String index){
 \r
     public void sendBroadcast(String cmd, Runtime dev) {\r
 \r
-              ComponentName componentName = new ComponentName("com.eqc.watch", "com.eqc.watch.launcher.ChatActivity");\r
-              Intent intent = new Intent("android.intent.action.MAIN");\r
+        ComponentName componentName = new ComponentName("com.eqc.watch", "com.eqc.watch.launcher.ChatActivity");\r
+        Intent intent = new Intent("android.intent.action.MAIN");\r
 //              intent.putExtra("ACTIVITY_TYPE", 2);\r
 //              intent.addCategory("android.intent.category.DEFAULT");\r
-              intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\r
-              intent.setComponent(componentName);\r
-              dev.getContextProxy().context.startActivity(intent);\r
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\r
+        intent.setComponent(componentName);\r
+        dev.getContextProxy().context.startActivity(intent);\r
     }\r
 \r
     //白名单开关(下行协议号:BP84,响应:AP84)\r
@@ -1345,7 +1335,7 @@ public static String AP15(String index){
         if (list.length==4){\r
             String index=list[2];\r
             String whitelist_switch=list[3];\r
-            connection.send(protocolAPIHelper.genStringMessage("AP84",AP84(index,1)));\r
+            connection.send(genStringMessage("AP84",AP84(index,1)));\r
 \r
             if (whitelist_switch.equals("1")){\r
                 Util.setSystemProperties("persist.sys.whitelist.enable","true");\r
@@ -1389,7 +1379,7 @@ public static String AP15(String index){
             String index=list[2];\r
             String type=list[3];\r
             String cycle=list[4];\r
-            connection.send(protocolAPIHelper.genStringMessage("AP86",AP86(index)));\r
+            connection.send(genStringMessage("AP86",AP86(index)));\r
             ICLogger.i("收到服务器指令:设置"+(type.equals("1")?"心率周期 ":"血压周期 ")+cycle+"分钟");\r
 \r
             //发送重置PPGCycle的广播,会在CoreServer里面执行\r
@@ -1436,19 +1426,171 @@ public static String AP15(String index){
             String BPH_L=list[6];\r
             String BPL_H=list[7];\r
             String BPL_L=list[8];\r
-            connection.send(protocolAPIHelper.genStringMessage("AP89",AP89(index)));\r
+            connection.send(genStringMessage("AP89",AP89(index)));\r
             ICLogger.i("收到服务器指令:心率/血压阀值 "+PPGH+","+PPGL+","+BPH_H+","+BPH_L+","+BPL_H+","+BPL_L);\r
         }else{\r
             ICLogger.i("BP89 format error!");\r
         }\r
 \r
     }\r
-    public interface CmdHandler\r
-    {\r
+    public boolean handleCmd(CMD_TYPE type, String cmd) {\r
+\r
+        //普通非二进制命令用此函数处理\r
+        boolean ret=true;\r
+        ICLogger.i("handleCmd "+type.name() + " strLen="+cmd.length());\r
+        if (Config.LOG_TOFILE)ICLogger.logToFile("APILog", " recv " + cmd);\r
+        switch (type){\r
+            case BP00: //登录包\r
+                handleBP00(mRuntime,cmd);\r
+                ICLogger.i("服务器收到登录包AP00");\r
+                mConnection.DeliverCMDMessageToSystem("BP00",cmd);//通知下面线程状态变化\r
+                break;\r
+            case BP01: //gps定位包\r
+                handleBP01(cmd);\r
+                ICLogger.i("服务器收到定位AP01");\r
+                mConnection.DeliverCMDMessageToSystem("IWAP01",cmd);//通知下面线程状态变化\r
+                break;\r
+            case BP02:// wifi定位包\r
+                handleBP02(cmd);\r
+                ICLogger.i("服务器收到定位AP02");\r
+                mConnection.DeliverCMDMessageToSystem("IWAP02",cmd);//通知下面线程状态变化\r
+                break;\r
+            case BP03: //心跳包\r
+                handleBP03(cmd);\r
+                ICLogger.i("服务器收到心跳包AP03");\r
+                mConnection.DeliverCMDMessageToSystem("BP03",cmd);//通知下面线程状态变化\r
+                break;\r
+\r
+            case BP07:\r
+                //收到发送的语音包\r
+                handleBP07(cmd,mConnection);\r
+                break;\r
+            case BP10:\r
+                //报警包\r
+                mConnection.DeliverCMDMessageToSystem("IWAP10",cmd);//通知下面线程状态变化\r
+                break;\r
+\r
+            case BPTM:\r
+                //校时命令\r
+                handleBPTM(cmd);\r
+                ICLogger.i("服务器收到校时命令APTM");\r
+                mConnection.DeliverCMDMessageToSystem("APTM",cmd);//通知下面线程状态变化\r
+                break;\r
+            case BP85://设置闹钟\r
+                handleBP85(cmd,mConnection,mRuntime);\r
+                ICLogger.i("收到服务器设置闹钟命令BP85");\r
+                mConnection.DeliverCMDMessageToSystem("AP85",cmd);//通知下面线程状态变化\r
+                break;\r
+            case BP33:\r
+                //设置工作模式\r
+                handleBP33(mConnection,mRuntime,cmd);\r
+                mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化\r
+\r
+                break;\r
+            case BP34:\r
+                //设置工作模式\r
+                handleBP34(mConnection,mRuntime,cmd);\r
+                mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化\r
+                break;\r
+            case BP16:\r
+                //立即定位指令(长链接有效)\r
+                handleBP16(mConnection,mRuntime,cmd);\r
+                mConnection.DeliverCMDMessageToSystem("StartLocate",cmd);//通知下面线程状态变化\r
+                break;\r
+\r
+//                            case BP05: //L02服务器不适用\r
+//                                //查询服务器语音 返回信息\r
+//                                API.handleBP05(cmd);\r
+//                                break;\r
+\r
+            case BP12:\r
+                //收到设置SOS号码\r
+                handleBP12(mConnection,cmd,mRuntime);\r
+                ICLogger.i("收到服务器设置SOS号码命令BP12");\r
+                break;\r
+            case BP14:\r
+                //收到设置白名单号码\r
+                handleBP14(mConnection,cmd,mRuntime);\r
+                ICLogger.i("收到服务器设置白名单号码命令BP14");\r
+                break;\r
+            case BP15:\r
+                handleBP15(cmd,mConnection,mRuntime);\r
+                ICLogger.i("收到服务器设置定位命令BP15");\r
+                break;\r
+            case BP17:\r
+                //收到恢复出厂设置\r
+                handleBP17(mConnection,cmd);\r
+                ICLogger.i("收到服务器恢复出厂设置命令BP17");\r
+                mConnection.DeliverCMDMessageToSystem("FactoryReset",cmd);//通知下面线程状态变化\r
+                break;\r
+\r
+            case BP18:\r
+                //收到重启\r
+                handleBP18(mConnection,cmd);\r
+                ICLogger.i("收到服务器重启命令BP18");\r
+                mConnection.DeliverCMDMessageToSystem("Reboot",cmd);//通知下面线程状态变化\r
+                break;\r
+\r
+            case BP31:\r
+                //收到关机\r
+                handleBP31(mConnection,cmd);\r
+                ICLogger.i("收到服务器关机命令BP31");\r
+                mConnection.DeliverCMDMessageToSystem("poweroff",cmd);//通知下面线程状态变化\r
+                break;\r
+\r
+            case BPXL:\r
+                handleBPXL(cmd,mConnection);\r
+                ICLogger.i("收到服务器心率检测命令");\r
+                HeartRateManager.triggerPPGtest();\r
+                break;\r
+            case BPXY:\r
+                handleBPXY(cmd,mConnection);\r
+                ICLogger.i("收到服务器血压检测命令");\r
+                HeartRateManager.triggerPPGtest();\r
+                break;\r
+            case BPJZ:\r
+                handleBPJZ(cmd,mConnection,mRuntime);\r
+                ICLogger.i("收到服务器血压校准命令");\r
+                break;\r
+            case BPHT:\r
+                ICLogger.i("服务器收到上传的心率血压");\r
+                break;\r
+            case BP84:\r
+                handleBP84(cmd,mConnection);\r
+                ICLogger.i("收到服务器白名单命令");\r
+                break;\r
+\r
+            case BP86:\r
+                //心率血压周期设置\r
+                handleBP86(cmd,mConnection,mRuntime);\r
+//                                ICLogger.i("");\r
+                break;\r
+            case BP89:\r
+                //心率/血压阀值\r
+                handleBP89(cmd,mConnection);\r
+                break;\r
+        }\r
+\r
+        return ret;\r
+\r
+    }\r
+\r
+\r
+    public boolean handleCmd(CMD_TYPE type, String cmd, byte[] bytes) {\r
 \r
-        boolean handleCmd(CMD_TYPE type, String cmd);\r
-        boolean handleCmd(CMD_TYPE type, String cmd,byte[] bytes);\r
+        //只有需要传递二级制数据的才需要这个函数,目前只有BP28需要\r
 \r
+        boolean ret=true;\r
+        ICLogger.i("handleCmd "+type.name() + " "+cmd+" bytelen="+bytes.length );\r
+        if (Config.LOG_TOFILE) ICLogger.logToFile("APILog", " recv " +new String(bytes));\r
+        switch (type) {\r
+            case BP28:\r
+                handleBP28(mConnection,cmd, mRuntime,bytes);\r
+                ICLogger.i("收到服务器语音BP28");\r
+                mConnection.DeliverCMDMessageToSystem("BP28", "");//通知下面线程状态变化\r
+                break;\r
+        }\r
+        return ret;\r
     }\r
 \r
 }\r