完成心率,血氧,血压指令下发测试数据,以及数据的上传。
authorTrillGates <williamtrillgates@gmail.com>
Wed, 25 Aug 2021 02:44:25 +0000 (10:44 +0800)
committerTrillGates <williamtrillgates@gmail.com>
Wed, 25 Aug 2021 02:44:25 +0000 (10:44 +0800)
这三个指令下发的都是调用同一个接口,目前还不支持体温。

app/src/main/aidl/com/ic/workservice/IBloodInfoInterface.aidl [new file with mode: 0644]
app/src/main/aidl/com/ic/workservice/IBloodRemoteService.aidl [new file with mode: 0644]
app/src/main/java/com/ic/protocolSrv/Config.java
app/src/main/java/com/ic/protocolSrv/CoreService.java
app/src/main/java/com/ic/protocolSrv/service/HeartRateManager.java
app/src/main/java/com/ic/protocolSrv/utils/BloodState.java [new file with mode: 0644]
app/src/main/java/com/ic/protocols/protocol_fzd.java
local.properties

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 (file)
index 0000000..16a7fb5
--- /dev/null
@@ -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 (file)
index 0000000..136f074
--- /dev/null
@@ -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
index 22207b6..7b71137 100644 (file)
@@ -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) {
index d37f23f..1ac6cad 100644 (file)
@@ -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
index a3db024..702d3d8 100644 (file)
@@ -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 (file)
index 0000000..13f6c90
--- /dev/null
@@ -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;
+}
index c6c9552..11245c6 100644 (file)
@@ -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 = "";
index f8b6c3a..fbab3b2 100644 (file)
@@ -4,5 +4,5 @@
 # Location of the SDK. This is only used by Gradle.\r
 # For customization when using a Version Control System, please read the\r
 # header note.\r
-#Fri Aug 20 10:44:06 CST 2021\r
-sdk.dir=C\:\\Users\\incar\\AppData\\Local\\Android\\Sdk\r
+#Tue Aug 24 16:58:39 CST 2021\r
+sdk.dir=E\:\\Android\\Sdk\r