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