From 25ecb0633602d44d03542ceead5a7f4f05422b7b Mon Sep 17 00:00:00 2001 From: TrillGates Date: Wed, 25 Aug 2021 10:44:25 +0800 Subject: [PATCH] =?utf8?q?=E5=AE=8C=E6=88=90=E5=BF=83=E7=8E=87=EF=BC=8C?= =?utf8?q?=E8=A1=80=E6=B0=A7=EF=BC=8C=E8=A1=80=E5=8E=8B=E6=8C=87=E4=BB=A4?= =?utf8?q?=E4=B8=8B=E5=8F=91=E6=B5=8B=E8=AF=95=E6=95=B0=E6=8D=AE=EF=BC=8C?= =?utf8?q?=E4=BB=A5=E5=8F=8A=E6=95=B0=E6=8D=AE=E7=9A=84=E4=B8=8A=E4=BC=A0?= =?utf8?q?=E3=80=82=20=E8=BF=99=E4=B8=89=E4=B8=AA=E6=8C=87=E4=BB=A4?= =?utf8?q?=E4=B8=8B=E5=8F=91=E7=9A=84=E9=83=BD=E6=98=AF=E8=B0=83=E7=94=A8?= =?utf8?q?=E5=90=8C=E4=B8=80=E4=B8=AA=E6=8E=A5=E5=8F=A3=EF=BC=8C=E7=9B=AE?= =?utf8?q?=E5=89=8D=E8=BF=98=E4=B8=8D=E6=94=AF=E6=8C=81=E4=BD=93=E6=B8=A9?= =?utf8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../ic/workservice/IBloodInfoInterface.aidl | 11 ++ .../ic/workservice/IBloodRemoteService.aidl | 16 +++ .../main/java/com/ic/protocolSrv/Config.java | 19 ++- .../java/com/ic/protocolSrv/CoreService.java | 21 ++-- .../protocolSrv/service/HeartRateManager.java | 118 +++++++++++++++--- .../com/ic/protocolSrv/utils/BloodState.java | 21 ++++ .../java/com/ic/protocols/protocol_fzd.java | 27 ++-- local.properties | 4 +- 8 files changed, 184 insertions(+), 53 deletions(-) create mode 100644 app/src/main/aidl/com/ic/workservice/IBloodInfoInterface.aidl create mode 100644 app/src/main/aidl/com/ic/workservice/IBloodRemoteService.aidl create mode 100644 app/src/main/java/com/ic/protocolSrv/utils/BloodState.java diff --git a/app/src/main/aidl/com/ic/workservice/IBloodInfoInterface.aidl b/app/src/main/aidl/com/ic/workservice/IBloodInfoInterface.aidl new file mode 100644 index 00000000..16a7fb58 --- /dev/null +++ b/app/src/main/aidl/com/ic/workservice/IBloodInfoInterface.aidl @@ -0,0 +1,11 @@ +package com.ic.workservice; +/** + * 8.1上使用的 + */ +interface IBloodInfoInterface { + + void statusChanged(int status); + + void valueChanged(int heart,int weared,int BHP,int BPL,int spo2); + +} \ No newline at end of file diff --git a/app/src/main/aidl/com/ic/workservice/IBloodRemoteService.aidl b/app/src/main/aidl/com/ic/workservice/IBloodRemoteService.aidl new file mode 100644 index 00000000..136f0740 --- /dev/null +++ b/app/src/main/aidl/com/ic/workservice/IBloodRemoteService.aidl @@ -0,0 +1,16 @@ +package com.ic.workservice; +import com.ic.workservice.IBloodInfoInterface; + +/** + * 8.1上使用的 + */ +interface IBloodRemoteService { + + void registerBloodListener(IBloodInfoInterface cp); + + void unregisterBloodCallback(IBloodInfoInterface cb); + + void sendStatus(boolean status); + + void startMeasure(long timeout); +} \ No newline at end of file diff --git a/app/src/main/java/com/ic/protocolSrv/Config.java b/app/src/main/java/com/ic/protocolSrv/Config.java index 22207b64..7b71137d 100644 --- a/app/src/main/java/com/ic/protocolSrv/Config.java +++ b/app/src/main/java/com/ic/protocolSrv/Config.java @@ -525,22 +525,19 @@ public class Config { public static boolean isUsingCustomServer = false; public static void setCustomServer(Context context, - boolean isusingCutomerServer, - String serverip, - int serverport) { - - if (isusingCutomerServer) { + boolean isUsingCustomServer, + String serverIp, + int serverPort) { + if (isUsingCustomServer) { Util.setSystemProperties("persist.sys.UsingCustomServer", "true"); } else { Util.setSystemProperties("persist.sys.UsingCustomServer", "false"); } - - Util.setSystemProperties("persist.sys.customserverip", serverip); - Util.setSystemProperties("persist.sys.customserverport", String.valueOf(serverport)); - setProtocolServerHost(context, serverip); - setProtocolServerPort(context, serverport); + Util.setSystemProperties("persist.sys.customserverip", serverIp); + Util.setSystemProperties("persist.sys.customserverport", String.valueOf(serverPort)); + setProtocolServerHost(context, serverIp); + setProtocolServerPort(context, serverPort); loadCustomServerAddr(context); - } public static void loadCustomServerAddr(Context context) { diff --git a/app/src/main/java/com/ic/protocolSrv/CoreService.java b/app/src/main/java/com/ic/protocolSrv/CoreService.java index d37f23f6..1ac6cadd 100644 --- a/app/src/main/java/com/ic/protocolSrv/CoreService.java +++ b/app/src/main/java/com/ic/protocolSrv/CoreService.java @@ -16,7 +16,6 @@ import android.content.IntentFilter; import android.database.Cursor; import android.media.AudioManager; import android.net.Uri; -import android.os.Build; import android.os.Handler; import android.os.HandlerThread; import android.os.IBinder; @@ -31,9 +30,9 @@ import android.text.TextUtils; import android.util.Log; import android.widget.Toast; +import com.ic.jni.ICJniUtils; import com.ic.protocolSrv.adapter.LBSHelper; import com.ic.protocolSrv.bean.Contact; -import com.ic.protocolSrv.bean.ICLocation; import com.ic.protocolSrv.bean.Runtime; import com.ic.protocolSrv.bean.SleepInfo; import com.ic.protocolSrv.bean.SleepRecord; @@ -81,7 +80,6 @@ import com.ic.protocolSrv.utils.WakeLockUtil; import com.ic.protocolSrv.utils.mqttConnection; import com.ic.protocolSrv.weather.IFZDWeatherCallback; import com.ic.protocolSrv.weather.IFZDWeatherService; -import com.ic.jni.ICJniUtils; import com.ic.protocols.protocolAPIHelper; import com.ic.s123.IS123WeatherCallback; import com.ic.s123.IS123WeatherService; @@ -92,7 +90,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.TimeUnit; import chestnut.ui.Toastc; import chestnut.utils.PhoneUtils; @@ -679,12 +676,14 @@ public class CoreService extends Service { //开启定位 // locationClient.triggerLocationProcess(); //开启测温 - if (runtime.check_stat_do_temp_test()) + if (runtime.check_stat_do_temp_test()) { TemperatureUtil.getInstance().DoTempTest(FROM_ALARM); + } //开启测量PPG - if (runtime.check_stat_do_ppg_test()) + if (runtime.check_stat_do_ppg_test()) { HeartRateManager.getInstance().triggerPPGTest(FROM_ALARM); + } } }; @@ -902,8 +901,6 @@ public class CoreService extends Service { } - - //注册接收 时间和tiimezone 变更消息 IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("android.intent.action.TIME_SET"); @@ -1022,8 +1019,8 @@ public class CoreService extends Service { Uri.parse(WeTalkMessageProvider.MESSAGES_SEND), true, weTalkMsgObserver ); - }catch (Exception e){ - ICLogger.e(e.getMessage(),e); + } catch (Exception e) { + ICLogger.e(e.getMessage(), e); } shutdownFlagObserver = new ShutdownFlagObserver(mHandler, resolver); @@ -1772,7 +1769,7 @@ public class CoreService extends Service { // 试,证明网络断开的,那么KeepAlive也需要重连(心跳包) retry_connect_count = 0; KeepAlive.isConnected = false; - mHandler.postDelayed(mReConnectSrvThread,5000); + mHandler.postDelayed(mReConnectSrvThread, 5000); } private final ReConnectSrvThread mReConnectSrvThread = new ReConnectSrvThread(); @@ -1825,7 +1822,7 @@ public class CoreService extends Service { SimSignalUtil.send_at_to_reset_simcard(runtime); //直接下此命令不能实现断网重连,所以干脆采用关闭网络再打开的方式。 no_network_Heartbeats_Count = 0;//重置Sim卡后重置计数。防止后面多次重置Sim卡。 } - mHandler.postDelayed(mReConnectSrvThread,20000); + mHandler.postDelayed(mReConnectSrvThread, 20000); } @Override diff --git a/app/src/main/java/com/ic/protocolSrv/service/HeartRateManager.java b/app/src/main/java/com/ic/protocolSrv/service/HeartRateManager.java index a3db024b..702d3d8f 100644 --- a/app/src/main/java/com/ic/protocolSrv/service/HeartRateManager.java +++ b/app/src/main/java/com/ic/protocolSrv/service/HeartRateManager.java @@ -36,9 +36,13 @@ import com.ic.protocols.protocolAPIHelper; import com.ic.work.IHeartRateSensorCallback; import com.ic.work.IHeartRateSensorService; import com.ic.work.domain.HeartRate; +import com.ic.workservice.IBloodInfoInterface; +import com.ic.workservice.IBloodRemoteService; import static com.ic.protocolSrv.Constants.ACTION_BROADCAST_PPG; import static com.ic.protocolSrv.Constants.ACTION_HEATR_RATE_START; +import static com.ic.protocolSrv.utils.BloodState.BLOOD_START_MEASURE; +import static com.ic.protocolSrv.utils.BloodState.BLOOD_STOP_MEASURE; public class HeartRateManager extends AbstractInvokeHandlerService { @@ -46,6 +50,7 @@ public class HeartRateManager extends AbstractInvokeHandlerService { private static final Handler mHandler = null; public final static String ACTION_HEART_RATE = "com.ic.sensor.data.action.HEART_RATE"; + private IBloodRemoteService iBloodRemoteService8521; private void checkWarning() { //ppg @@ -128,17 +133,83 @@ public class HeartRateManager extends AbstractInvokeHandlerService { private HeartRateManager() { + //这是4.4的ICWorkService //绑定远程服务 Intent intent = new Intent(); intent.setAction(ACTION_HEART_RATE); intent.setPackage(ICApplication.sContext.getPackageName()); ICApplication.sContext.bindService(intent, mRemoteConnection, Context.BIND_AUTO_CREATE); + //绑定8.1的WorkService + //使用的时候,谁不空就使用谁 + ICLogger.d(" start bind service..."); + Intent intent8541 = new Intent(); + intent8541.setAction("com.ic.action.WORK_SERVICE.blood"); + intent8541.setPackage("com.ic.workservice"); + ICApplication.sContext.bindService(intent8541, mRemoteConnection8541, Context.BIND_AUTO_CREATE); } public void init(Runtime runtime) { this.runtime = runtime; } + private final ServiceConnection mRemoteConnection8541 = new ServiceConnection() { + @Override + public void onServiceConnected(ComponentName name, IBinder service) { + try { + ICLogger.d("iBloodRemoteService8521 ... on service connected..."); + iBloodRemoteService8521 = IBloodRemoteService.Stub.asInterface(service); + iBloodRemoteService8521.registerBloodListener(mCallback8541); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void onServiceDisconnected(ComponentName name) { + iBloodRemoteService8521 = null; + } + }; + + private int currentState = -100; + + private final IBloodInfoInterface mCallback8541 = new IBloodInfoInterface.Stub() { + private int BHP; + private int heart; + private int BPL; + private int spo2; + + @Override + public void statusChanged(int status) { + ICLogger.d("status==> " + status); + currentState = status; + if (status == BLOOD_START_MEASURE) { + //开始测量 + ICLogger.d("开始测量..."); + } else if (status == BLOOD_STOP_MEASURE) { + ICLogger.d("测量完成..."); + if (spo2 != 0 && BHP != 0 && BPL != 0 && heart != 0) { + HeartRate heartRate = new HeartRate(BHP, BPL, heart, spo2); + handleResultData(heartRate); + } + currentState = -100; + } + } + + @Override + public void valueChanged(int heart, int wear, int BHP, int BPL, int spo2) { + //处理结果 + ICLogger.d("heart ==> " + heart); + ICLogger.d("wear ==> " + wear); + ICLogger.d("BHP ==> " + BHP); + ICLogger.d("BPL ==> " + BPL); + ICLogger.d("spo2 ==> " + spo2); + this.heart = heart; + this.BHP = BHP; + this.BPL = BPL; + this.spo2 = spo2; + } + }; + private IHeartRateSensorService heartRateSensorService; private final ServiceConnection mRemoteConnection = new ServiceConnection() { @@ -166,19 +237,7 @@ public class HeartRateManager extends AbstractInvokeHandlerService { public void onHeartRateGet(HeartRate heartRate) { //处理心率结果 ICLogger.d("心率测试结果来了..." + heartRate); - //如果为0,那么就不上传了 - if (heartRate.getHeartRate() == 0) { - ICLogger.d("result invalidate..."); - return; - } - //BY TrillGates - //判断是否有超出阀值 - //如果超出的话,插入一条警告通知 - //如果数据为0,不处理 - checkHeartRateValue(heartRate); - runtime.getHRS().setHeartrateStat(heartRateStatus.HEARTRATE_WORKINGSTAT.HEARTRATE_TEST_SUCCESS); - runtime.getHRS().setLastHeartrate(heartRate.getHeartRate(), heartRate.getBloodHeight(), heartRate.getBloodLow(), heartRate.getOxygen()); - uploadResult(); + handleResultData(heartRate); } @Override @@ -197,6 +256,22 @@ public class HeartRateManager extends AbstractInvokeHandlerService { } }; + private void handleResultData(HeartRate heartRate) { + //如果为0,那么就不上传了 + if (heartRate.getHeartRate() == 0) { + ICLogger.d("result invalidate..."); + return; + } + //BY TrillGates + //判断是否有超出阀值 + //如果超出的话,插入一条警告通知 + //如果数据为0,不处理 + checkHeartRateValue(heartRate); + runtime.getHRS().setHeartrateStat(heartRateStatus.HEARTRATE_WORKINGSTAT.HEARTRATE_TEST_SUCCESS); + runtime.getHRS().setLastHeartrate(heartRate.getHeartRate(), heartRate.getBloodHeight(), heartRate.getBloodLow(), heartRate.getOxygen()); + uploadResult(); + } + private void checkHeartRateValue(HeartRate heartRate) { int oxygenValue = heartRate.getOxygen(); int heartRateValue = heartRate.getHeartRate(); @@ -385,9 +460,15 @@ public class HeartRateManager extends AbstractInvokeHandlerService { } catch (Exception e) { e.printStackTrace(); } - ICApplication.sContext.unbindService(mRemoteConnection); + if (heartRateSensorService != null) { + ICApplication.sContext.unbindService(mRemoteConnection); + } + if (iBloodRemoteService8521 != null) { + ICApplication.sContext.unbindService(mRemoteConnection8541); + } } + public void triggerPPGTest(int from) { if (CoreService.getInstance() != null) { if (CoreService.getInstance().getRuntime().Anti_off_flag == 1) { @@ -403,7 +484,7 @@ public class HeartRateManager extends AbstractInvokeHandlerService { //判断类型,如果不是GH301的硬件,直接走全部测试 String isGh301 = Util.getSystemProperties("persist.sys.is_gh301", "false"); String customname = Util.getSystemProperties("persist.sys.customname"); - ICLogger.i("customname = "+customname); + ICLogger.i("customname = " + customname); if (!Boolean.parseBoolean(isGh301) || customname.equals("AA")) { heartRateSensorService.getHeartRateInfo(from, HeartRateManager.class.getName()); } else { @@ -419,6 +500,11 @@ public class HeartRateManager extends AbstractInvokeHandlerService { } } } + ICLogger.d("iBloodRemoteService8521..."); + if (iBloodRemoteService8521 != null) { + ICLogger.d("iBloodRemoteService8521...start measure..."); + iBloodRemoteService8521.startMeasure(TEST_TIME_OUT); + } } catch (Exception e) { e.printStackTrace(); ICLogger.e("exception -- > ", e); @@ -426,6 +512,8 @@ public class HeartRateManager extends AbstractInvokeHandlerService { }).start(); } + public static final int TEST_TIME_OUT = 1000 * 60 * 2; + @Override public boolean onUserRequest(Intent paramIntent, Connection paramConnection, Runtime paramRuntime) { diff --git a/app/src/main/java/com/ic/protocolSrv/utils/BloodState.java b/app/src/main/java/com/ic/protocolSrv/utils/BloodState.java new file mode 100644 index 00000000..13f6c903 --- /dev/null +++ b/app/src/main/java/com/ic/protocolSrv/utils/BloodState.java @@ -0,0 +1,21 @@ +package com.ic.protocolSrv.utils; + +/** + * 8.1上使用的 + */ +public class BloodState { + + public static final int BLOOD_NOT_SUPPORT = -1; + + public static final int BLOOD_NOT_DEVICE = 1001; + + public static final int BLOOD_START_MEASURE = 1002; + + public static final int BLOOD_ING_MEASURE = 1003; + + public static final int BLOOD_PAUSE_MEASURE = 1004; + + public static final int BLOOD_STOP_MEASURE = 1005; + + public static final int BLOOD_TIME_OUT_MEASURE = 1006; +} diff --git a/app/src/main/java/com/ic/protocols/protocol_fzd.java b/app/src/main/java/com/ic/protocols/protocol_fzd.java index c6c95527..11245c64 100644 --- a/app/src/main/java/com/ic/protocols/protocol_fzd.java +++ b/app/src/main/java/com/ic/protocols/protocol_fzd.java @@ -89,12 +89,12 @@ public class protocol_fzd { private static final String PRIVATE_KEY = "XMQcHi0lGIdru6xzW7lygBwBT8N0c09P"; private static final String CMD_HEADER = "["; private static final String CMD_COMPANY = "IC"; -// private static final String CMD_COMPANY = "DW"; + // private static final String CMD_COMPANY = "DW"; private static final String CMD_END = "]"; private static final String CMD_HEADER_SPLIT = "*"; private static final String CMD_SPLIT = ","; private static final boolean doEncryption = Util.getSystemProperties("persist.sys.encrypt_fzd", "false").equals("true"); -// public static final String defaultServerIP = "fzd.xcloudtech.com"; //测试服务器 + // public static final String defaultServerIP = "fzd.xcloudtech.com"; //测试服务器 public static final String defaultServerIP = "api.xcloudtech.com"; //正式服务器 public static final int defaultServerPort = 9000; private final SharedPreferences sharedPreferences; @@ -138,7 +138,6 @@ public class protocol_fzd { //fos.flush(); //fos.close(); //以上代码,验证成功,说明转换是对的 - //判断远程ID,remoteNum,如果这个不为空,那么是单聊 //如果remoteNum为空,那么是群聊 ICLogger.d("remote id == > " + remoteNum); @@ -574,17 +573,16 @@ public class protocol_fzd { String cmd = cmd_msgbuf.substring(0, cmdindex); cmd_msgbuf = cmd; } - ICLogger.d("cmd_msgbuf "+cmd_msgbuf); - if (regexUtil.isFZDCompanyCMD(CMD_COMPANY,cmd_msgbuf)) { + ICLogger.d("cmd_msgbuf " + cmd_msgbuf); + if (regexUtil.isFZDCompanyCMD(CMD_COMPANY, cmd_msgbuf)) { for (CMD_TYPE key : cmdMap.keySet()) { - if (regexUtil.isFZDCompanyCMD(CMD_COMPANY,cmdMap.get(key), cmd_msgbuf)) { //如果是FZD命令,则进行处理,否则保留数据动 + if (regexUtil.isFZDCompanyCMD(CMD_COMPANY, cmdMap.get(key), cmd_msgbuf)) { //如果是FZD命令,则进行处理,否则保留数据动 // ICLogger.i("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key)); return cmdMap.get(key); } } return ""; - } else - { + } else { // ICLogger.d("not fzd cmd format !"); return ""; } @@ -615,6 +613,7 @@ public class protocol_fzd { private int dataPart = 1; private StringBuffer cmdbuf = new StringBuffer(); private byte[] totalByte; + /* 返回true 表示 cmd 全部解析成功 返回false表示 cmd至少有一条解析失败,失败的数据归入buffer,下一次识别接着使用 @@ -623,9 +622,9 @@ public class protocol_fzd { */ public boolean parserCmd(byte[] bytes) { ICLogger.d("bytes.size " + bytes.length); - cmdbuf.append( new String(bytes)); + cmdbuf.append(new String(bytes)); ICLogger.d("cmdbuf.size " + cmdbuf.length() + " " + cmdbuf.toString()); - while( cmdbuf.indexOf(CMD_HEADER)>=0 && cmdbuf.indexOf(CMD_END)>0 ) { + while (cmdbuf.indexOf(CMD_HEADER) >= 0 && cmdbuf.indexOf(CMD_END) > 0) { String cmd_msgbuf = ""; int cmdindexHead = cmdbuf.indexOf(CMD_HEADER); int cmdindexEnd = cmdbuf.indexOf(CMD_END); @@ -670,7 +669,7 @@ public class protocol_fzd { } } - }else{//走到这里,已经证明是fzd格式,但未找到cmd,说明不支持cmd,跳过处理,这条数据也是必须从buffer里清除的。 + } else {//走到这里,已经证明是fzd格式,但未找到cmd,说明不支持cmd,跳过处理,这条数据也是必须从buffer里清除的。 ICLogger.d("no cmd found ! skip cmd " + cmd_msgbuf); cmdbuf.delete(0, cmd_msgbuf.length() + 2); } @@ -678,6 +677,7 @@ public class protocol_fzd { ICLogger.d("parserCmd done"); return true; } + /** * 图片下发 * @@ -1308,6 +1308,7 @@ public class protocol_fzd { public void handlePOWEROFF(Connection connection) { connection.send(POWEROFF()); } + public static StringMessage RESET() { return genFZDCMD(cmdMap.get(CMD_TYPE.RESET)); } @@ -1647,8 +1648,9 @@ public class protocol_fzd { handleHrtstart(mConnection); ICLogger.i("收到服务器心率检测命令"); Config.testType = HeartRateOxygenTestType.JUST_HEART_RATE; - if (mRuntime.check_stat_do_ppg_test()) + if (mRuntime.check_stat_do_ppg_test()) { HeartRateManager.getInstance().triggerPPGTest(FROM_SERVER); + } break; case bldstart: handleBldstart(mConnection); @@ -1924,7 +1926,6 @@ public class protocol_fzd { ICLogger.d("交友结果--> " + data); //第一种情况[XT*8800000015*000A*PP, 5F204E0,555] //另外一种情况 情况[XT*8800000015*0001*PP,1]/[XT*8800000015*0002*PP,2] - // boolean contains = data.contains(CMD_SPLIT); int result = 0; String friendName = ""; diff --git a/local.properties b/local.properties index f8b6c3a1..fbab3b27 100644 --- a/local.properties +++ b/local.properties @@ -4,5 +4,5 @@ # Location of the SDK. This is only used by Gradle. # For customization when using a Version Control System, please read the # header note. -#Fri Aug 20 10:44:06 CST 2021 -sdk.dir=C\:\\Users\\incar\\AppData\\Local\\Android\\Sdk +#Tue Aug 24 16:58:39 CST 2021 +sdk.dir=E\:\\Android\\Sdk -- 2.17.1