Browse Source

添加ppg数据采集功能

nisiyuan 1 year ago
parent
commit
c27309ad06

File diff suppressed because it is too large
+ 1 - 0
app/src/main/assets/syjk_master.cer


+ 1 - 1
app/src/main/java/com/syjk/watch/dealer/MyApplication.java

@@ -82,7 +82,7 @@ public class MyApplication extends Application {
         ServiceClient serviceClient = IndustryWear.getServiceClient(this);
 
         // 填写证书名称,证书名称需要与src/main/assets目录下的证书文件名称保持一致
-        String certPath = "huaweiwatch.cer";
+        String certPath = "syjk_master.cer";
 
         // 设置证书
         serviceClient.setCertPath(certPath, (statusCode, data) -> {

+ 30 - 0
app/src/main/java/com/syjk/watch/dealer/bean/PPGDetail.java

@@ -0,0 +1,30 @@
+package com.syjk.watch.dealer.bean;
+
+import java.util.List;
+
+/**
+ * @author:nisiyuan
+ * @file: PPGDetail.class
+ * @time: 2023/10/24
+ * @describe
+ */
+public class PPGDetail {
+    private int channel;
+    private String data;
+
+    public int getChannel() {
+        return channel;
+    }
+
+    public void setChannel(int channel) {
+        this.channel = channel;
+    }
+
+    public String getData() {
+        return data;
+    }
+
+    public void setData(String data) {
+        this.data = data;
+    }
+}

+ 38 - 0
app/src/main/java/com/syjk/watch/dealer/bean/PPGResult.java

@@ -0,0 +1,38 @@
+package com.syjk.watch.dealer.bean;
+
+import java.util.List;
+
+/**
+ * @author:nisiyuan
+ * @file: PPGResult.class
+ * @time: 2023/10/24
+ * @describe
+ */
+public class PPGResult {
+    private long timeStamp;
+    private List<PPGDetail> ppg;
+
+    public long getTimeStamp() {
+        return timeStamp;
+    }
+
+    public void setTimeStamp(long timeStamp) {
+        this.timeStamp = timeStamp;
+    }
+
+    public List<PPGDetail> getPpg() {
+        return ppg;
+    }
+
+    public void setPpg(List<PPGDetail> ppg) {
+        this.ppg = ppg;
+    }
+
+    @Override
+    public String toString() {
+        return "PPGResult{" +
+                "timeStamp=" + timeStamp +
+                ", ppg=" + ppg +
+                '}';
+    }
+}

+ 7 - 2
app/src/main/java/com/syjk/watch/dealer/http/WatchApi.java

@@ -2,7 +2,6 @@ package com.syjk.watch.dealer.http;
 
 import androidx.annotation.Nullable;
 
-import com.syjk.watch.dealer.bean.BaseCallModel;
 import com.syjk.watch.dealer.bean.BindDeviceInfo;
 import com.syjk.watch.dealer.bean.CalenderInfo;
 import com.syjk.watch.dealer.bean.CheckDetail;
@@ -15,6 +14,8 @@ import com.syjk.watch.dealer.bean.HWOverviewInfo;
 import com.syjk.watch.dealer.bean.HWSleepResponse;
 import com.syjk.watch.dealer.bean.HWSleepStatistics;
 import com.syjk.watch.dealer.bean.MonthRecordItem;
+import com.syjk.watch.dealer.bean.PPGDetail;
+import com.syjk.watch.dealer.bean.PPGResult;
 import com.syjk.watch.dealer.bean.PaxzRiskFactorInfo;
 import com.syjk.watch.dealer.bean.SleepBatchUpload;
 import com.syjk.watch.dealer.bean.Upgrade;
@@ -507,5 +508,9 @@ public interface WatchApi {
     @FormUrlEncoded
     Observable<BaseDataModel<HWSleepStatistics>> getSleepPressure(@Field("tab") String tab, @Field("start_day") String start_day, @Field("end_day") String end_day);
 
-
+    /**
+     * 上传ppg数据
+     */
+    @POST("apo/cs_server/watch/hw/receive/realtimePpgData")
+    Observable<BaseDataModel<String>> uploadPPGData(@Body PPGResult result, @Header("watch-mac") String mac);
 }

+ 67 - 33
app/src/main/java/com/syjk/watch/dealer/permission/UtilsWithPermission.java

@@ -13,8 +13,6 @@ import android.provider.Settings;
 import android.telephony.TelephonyManager;
 import android.widget.Toast;
 
-import androidx.annotation.RequiresApi;
-
 import com.qw.soul.permission.SoulPermission;
 import com.qw.soul.permission.bean.Permission;
 import com.qw.soul.permission.bean.Permissions;
@@ -92,14 +90,14 @@ public class UtilsWithPermission {
     /**
      * 获取摄像头/读写权限
      */
-    public static void getCameraPermission(final PermissionsListener listener){
+    public static void getCameraPermission(final PermissionsListener listener) {
         SoulPermission.getInstance().checkAndRequestPermissions(
                 Permissions.build(Manifest.permission.CAMERA,
                         Manifest.permission.WRITE_EXTERNAL_STORAGE),
                 new CheckPermissionsAdapter() {
                     @Override
                     public void onAllPermissionOk(Permission[] allPermissions) {
-                        if (listener!=null) {
+                        if (listener != null) {
                             listener.onPermissionsOk();
                         }
                     }
@@ -107,7 +105,7 @@ public class UtilsWithPermission {
                     @Override
                     public void onPermissionDenied(Permission[] refusedPermissions) {
                         super.onPermissionDenied(refusedPermissions);
-                        if (listener!=null) {
+                        if (listener != null) {
                             listener.onPermissionsDenied();
                         }
                     }
@@ -117,13 +115,13 @@ public class UtilsWithPermission {
     /**
      * 获取自定义权限组
      */
-    public static void getPermissions(final PermissionsListener listener,String... permissions) {
+    public static void getPermissions(final PermissionsListener listener, String... permissions) {
         SoulPermission.getInstance().checkAndRequestPermissions(
                 Permissions.build(permissions),
                 new CheckPermissionsAdapter() {
                     @Override
                     public void onAllPermissionOk(Permission[] allPermissions) {
-                        if (listener!=null) {
+                        if (listener != null) {
                             listener.onPermissionsOk();
                         }
                     }
@@ -131,7 +129,7 @@ public class UtilsWithPermission {
                     @Override
                     public void onPermissionDenied(Permission[] refusedPermissions) {
                         super.onPermissionDenied(refusedPermissions);
-                        if (listener!=null) {
+                        if (listener != null) {
                             listener.onPermissionsDenied();
                         }
                     }
@@ -140,20 +138,21 @@ public class UtilsWithPermission {
 
     /**
      * 6.0获取蓝牙权限
+     *
      * @param listener
      */
     public static void getBlueToothPermission(final PermissionsListener listener) {
-        SoulPermission.getInstance().checkAndRequestPermissions(
-                Permissions.build(Manifest.permission.ACCESS_COARSE_LOCATION,
-                        Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.BLUETOOTH_SCAN,
-                        Manifest.permission.BLUETOOTH_ADVERTISE,
-                        Manifest.permission.BLUETOOTH_CONNECT),
-                new CheckPermissionsAdapter() {
-                    @Override
-                    public void onAllPermissionOk(Permission[] allPermissions) {
-                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+        if (Build.VERSION.SDK_INT >= 31) {
+            SoulPermission.getInstance().checkAndRequestPermissions(
+                    Permissions.build(Manifest.permission.ACCESS_COARSE_LOCATION,
+                            Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.BLUETOOTH_SCAN,
+                            Manifest.permission.BLUETOOTH_ADVERTISE,
+                            Manifest.permission.BLUETOOTH_CONNECT),
+                    new CheckPermissionsAdapter() {
+                        @Override
+                        public void onAllPermissionOk(Permission[] allPermissions) {
                             LocationManager alm = (LocationManager) SDKUtils.mContext.getSystemService(Context.LOCATION_SERVICE);
-                            if (!alm.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)) {
+                            if (!alm.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
                                 ToastUtils.showToast("请开启定位服务!");
                                 Intent intent = new Intent();
                                 intent.setAction(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
@@ -161,33 +160,65 @@ public class UtilsWithPermission {
                                 SDKUtils.mContext.startActivity(intent);
                                 return;
                             }
+                            if (listener != null) {
+                                listener.onPermissionsOk();
+                            }
                         }
-                        if (listener!=null) {
-                            listener.onPermissionsOk();
+
+                        @Override
+                        public void onPermissionDenied(Permission[] refusedPermissions) {
+                            super.onPermissionDenied(refusedPermissions);
+                            if (listener != null) {
+                                listener.onPermissionsDenied();
+                            }
+                        }
+                    });
+        } else {
+            SoulPermission.getInstance().checkAndRequestPermissions(
+                    Permissions.build(Manifest.permission.ACCESS_COARSE_LOCATION,
+                            Manifest.permission.ACCESS_FINE_LOCATION),
+                    new CheckPermissionsAdapter() {
+                        @Override
+                        public void onAllPermissionOk(Permission[] allPermissions) {
+                            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+                                LocationManager alm = (LocationManager) SDKUtils.mContext.getSystemService(Context.LOCATION_SERVICE);
+                                if (!alm.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)) {
+                                    ToastUtils.showToast("请开启定位服务!");
+                                    Intent intent = new Intent();
+                                    intent.setAction(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
+                                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+                                    SDKUtils.mContext.startActivity(intent);
+                                    return;
+                                }
+                            }
+                            if (listener != null) {
+                                listener.onPermissionsOk();
+                            }
                         }
-                    }
 
-                    @Override
-                    public void onPermissionDenied(Permission[] refusedPermissions) {
-                        super.onPermissionDenied(refusedPermissions);
-                        if (listener!=null) {
-                            listener.onPermissionsDenied();
+                        @Override
+                        public void onPermissionDenied(Permission[] refusedPermissions) {
+                            super.onPermissionDenied(refusedPermissions);
+                            if (listener != null) {
+                                listener.onPermissionsDenied();
+                            }
                         }
-                    }
-                });
+                    });
+        }
     }
 
     /**
      * 读写文件权限
      * 读写文件权限是一组,只要一个授权就可以
+     *
      * @param listener
      */
-    public static void getReadAndWritePermission(final PermissionListener listener){
+    public static void getReadAndWritePermission(final PermissionListener listener) {
         SoulPermission.getInstance().checkAndRequestPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, new CheckPermissionAdapter() {
             @SuppressLint("MissingPermission")
             @Override
             public void onPermissionOk(Permission permission) {
-                if (listener!=null){
+                if (listener != null) {
                     listener.onPermissionOk();
                 }
             }
@@ -195,7 +226,7 @@ public class UtilsWithPermission {
             @Override
             public void onPermissionDenied(Permission permission) {
                 super.onPermissionDenied(permission);
-                if (listener!=null){
+                if (listener != null) {
                     listener.onPermissionDenied();
                 }
             }
@@ -204,6 +235,7 @@ public class UtilsWithPermission {
 
     /**
      * 6.0获取通知权限
+     *
      * @param listener
      */
     public static void getNotification(final PermissionListener listener) {
@@ -211,7 +243,7 @@ public class UtilsWithPermission {
             SoulPermission.getInstance().checkAndRequestPermission(Manifest.permission.ACCESS_NOTIFICATION_POLICY, new CheckPermissionAdapter() {
                 @Override
                 public void onPermissionOk(Permission permission) {
-                    if (listener!=null){
+                    if (listener != null) {
                         listener.onPermissionOk();
                     }
                 }
@@ -219,13 +251,15 @@ public class UtilsWithPermission {
         }
     }
 
-    public interface PermissionListener{
+    public interface PermissionListener {
         void onPermissionOk();
+
         void onPermissionDenied();
     }
 
     public interface PermissionsListener {
         void onPermissionsOk();
+
         void onPermissionsDenied();
     }
 }

+ 84 - 3
app/src/main/java/com/syjk/watch/dealer/ui/Fragment/HWWatchHomeFragment.java

@@ -30,6 +30,7 @@ import com.github.mikephil.charting.interfaces.datasets.ILineDataSet;
 import com.github.mikephil.charting.utils.Utils;
 import com.google.gson.Gson;
 import com.huawei.health.industry.client.IndustryWear;
+import com.huawei.health.industry.client.callback.ServiceCallback;
 import com.huawei.health.industry.client.deviceconnect.DeviceConnectClient;
 import com.huawei.health.industry.client.devicemanager.DeviceManageClient;
 import com.jakewharton.rxbinding4.view.RxView;
@@ -50,6 +51,7 @@ import com.syjk.watch.dealer.bean.HWSleepDetail;
 import com.syjk.watch.dealer.bean.HWSleepHome;
 import com.syjk.watch.dealer.bean.HWSpoInfo;
 import com.syjk.watch.dealer.bean.HWStepInfo;
+import com.syjk.watch.dealer.bean.PPGResult;
 import com.syjk.watch.dealer.bean.UploadBaseInfo;
 import com.syjk.watch.dealer.constant.WatchConst;
 import com.syjk.watch.dealer.event.ConnectEvent;
@@ -150,6 +152,9 @@ public class HWWatchHomeFragment extends BaseFragment {
     private LinearLayout llReviveSleep;
     private long sleepStartTime;
     private LinearLayout llZeroSleep;
+    private FrameLayout flBlood;
+    private FrameLayout flSleep;
+    private ServiceCallback ppgServiceCallback;
 
     @Override
     public int initLayout() {
@@ -212,6 +217,9 @@ public class HWWatchHomeFragment extends BaseFragment {
         lineEcg = view.findViewById(R.id.line_ecg);
         initDayLineChart();
 
+        flBlood = view.findViewById(R.id.fl_blood);
+        flSleep = view.findViewById(R.id.fl_sleep);
+
         tvBODate = view.findViewById(R.id.tv_bo_date);
         tvBO = view.findViewById(R.id.tv_bo);
         llBO1 = view.findViewById(R.id.ll_bo_1);
@@ -304,14 +312,14 @@ public class HWWatchHomeFragment extends BaseFragment {
 
         queryOverview();
         getDeviceList();
-        initSyncTask();
+//        initSyncTask();
     }
 
     /**
      * 定时10分钟上传一次数据
      */
     private void initSyncTask() {
-        Observable.interval(30, 30, TimeUnit.MINUTES)
+        Observable.interval(20, 20, TimeUnit.MINUTES)
                 .compose(this.bindToLifecycle())
                 .compose(SchedulersUtils.applySchedulers())
                 .subscribe(new Observer<Long>() {
@@ -1173,11 +1181,23 @@ public class HWWatchHomeFragment extends BaseFragment {
         observableList.add(queryBloodOxygen());
 
         if (!TextUtils.isEmpty(deviceName)) {
-            if (deviceName.contains(WatchConst.HW_WATCH_B9) && deviceName.contains(WatchConst.HW_WATCH_B7)) {
+            if (deviceName.contains(WatchConst.HW_WATCH_B9)) {
+                observableList.add(queryBlood());
+                flBlood.setVisibility(View.VISIBLE);
+                flSleep.setVisibility(View.GONE);
+                queryEcgData();
+
+                subscribePPG();
+            }
+            if (deviceName.contains(WatchConst.HW_WATCH_B7)) {
                 observableList.add(queryBlood());
+                flBlood.setVisibility(View.GONE);
+                flSleep.setVisibility(View.GONE);
                 queryEcgData();
             }
             if (deviceName.contains(WatchConst.HW_WATCH_HA580)) {
+                flBlood.setVisibility(View.GONE);
+                flSleep.setVisibility(View.VISIBLE);
                 setSleepSwitch();
                 observableList.add(querySleep());
             }
@@ -1213,6 +1233,47 @@ public class HWWatchHomeFragment extends BaseFragment {
                 });
     }
 
+    private void subscribePPG() {
+        // 获取DeviceManageClient对象
+        DeviceManageClient manageClient = IndustryWear.getDeviceManageClient(getContext());
+
+        String deviceId = SPUtils.getString(getContext(), WatchConst.HW_DEVICE_ID_KEY);
+        // 参考获取设备列表获取设备列表后选择需要操作的设备,获取设备Id
+        // 构造用于订阅或取消订阅实时PPG数据的JSON格式的入参数据
+        JSONObject jsonObject = new JSONObject();
+        try {
+            jsonObject.put("item", "realtimePpgData");
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+
+        // 调用subscribe方法订阅实时PPG数据
+        ppgServiceCallback = (statusCode, result) -> {
+            Logger.i("[华为ppg数据] : " + statusCode + " ; result : " + result);
+            // 处理订阅返回信息
+            if (statusCode == 8) {
+                Gson gson = new Gson();
+                PPGResult ppgResult = gson.fromJson(result, PPGResult.class);
+                Logger.i("[华为ppg数据上传] :" + ppgResult.toString());
+                mApi.uploadPPGData(ppgResult, current_device_address)
+                        .compose(this.bindToLifecycle())
+                        .compose(SchedulersUtils.applySchedulers())
+                        .subscribe(new DataHttpResultObserver<String>() {
+                            @Override
+                            protected void onSuccess(BaseDataModel<String> response) {
+
+                            }
+
+                            @Override
+                            protected void onFail(String moreInfo) {
+
+                            }
+                        });
+            }
+        };
+        manageClient.subscribe(deviceId, jsonObject.toString(), ppgServiceCallback);
+    }
+
     private void retryConnect(String deviceId) {
         // 获取DeviceConnectClient对象
         DeviceConnectClient deviceConnectClient = IndustryWear.getDeviceConnectClient(getContext());
@@ -1234,5 +1295,25 @@ public class HWWatchHomeFragment extends BaseFragment {
         });
     }
 
+    @Override
+    public void onDestroy() {
+        // 获取DeviceManageClient对象
+        DeviceManageClient manageClient = IndustryWear.getDeviceManageClient(getContext());
+
+        // 参考获取设备列表获取设备列表后选择需要操作的设备,获取设备Id
+        String deviceId = SPUtils.getString(getContext(), WatchConst.HW_DEVICE_ID_KEY);
+
+        // 构造用于订阅或取消订阅实时PPG数据的JSON格式的入参数据
+        JSONObject jsonObject = new JSONObject();
+        try {
+            jsonObject.put("item", "realtimePpgData");
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+
+        if (!TextUtils.isEmpty(deviceId) && ppgServiceCallback != null)
+            manageClient.unSubscribe(deviceId, jsonObject.toString(), ppgServiceCallback);
+        super.onDestroy();
+    }
 }
 

+ 4 - 1
app/src/main/res/layout/fragment_hw_watch_home_layout.xml

@@ -177,13 +177,14 @@
                     app:flexWrap="wrap">
 
                     <FrameLayout
+                        android:id="@+id/fl_blood"
                         android:layout_width="491mm"
                         android:layout_height="wrap_content"
                         android:layout_marginStart="16mm"
                         android:layout_marginTop="33mm"
                         android:layout_marginEnd="16mm"
                         android:layout_weight="1"
-                        android:visibility="gone">
+                        android:visibility="visible">
 
                         <RelativeLayout
                             android:id="@+id/rl_blood"
@@ -489,6 +490,8 @@
                     </FrameLayout>
 
                     <FrameLayout
+                        android:visibility="gone"
+                        android:id="@+id/fl_sleep"
                         android:layout_width="491mm"
                         android:layout_height="wrap_content"
                         android:layout_marginStart="16mm"

+ 2 - 2
app/syjk/release/output-metadata.json

@@ -11,10 +11,10 @@
       "type": "SINGLE",
       "filters": [],
       "properties": [],
-      "versionCode": 202309051,
+      "versionCode": 202309250,
       "versionName": "1.0.0",
       "enabled": true,
-      "outputFile": "2023-09-05-11-05-35.apk"
+      "outputFile": "2023-09-25-15-30-23.apk"
     }
   ]
 }

+ 1 - 1
config.gradle

@@ -1,7 +1,7 @@
 ext {
     //version配置
     versions = [
-            "version-code": 202309051,
+            "version-code": 202310310,
             "watch-sdk-version": "1.0.0"
     ]
 }