Kaynağa Gözat

更新demo

master
陈福行 2 yıl önce
ebeveyn
işleme
49d1b81aca
100 değiştirilmiş dosya ile 13767 ekleme ve 557 silme
  1. 10
    3
      app/build.gradle
  2. 79
    34
      app/src/main/AndroidManifest.xml
  3. 2
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ADWeightScaleCmdActivity.java
  4. 46
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/AboutActivity.java
  5. 923
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/AiLinkScooterActivity.java
  6. 2
    3
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BLDWeightScaleBleActivity.java
  7. 2
    3
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BabyBodyFatCmdActivity.java
  8. 2
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BabyCmdActivity.java
  9. 26
    10
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BleCmdActivity.java
  10. 3
    4
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BloodOxygenActivity.java
  11. 4
    5
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BloodSugar4GActivity.java
  12. 2
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BroadcastBloodOxygenActivity.java
  13. 2
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BroadcastScaleActivity.java
  14. 4
    5
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ClearShakeHandsActivity.java
  15. 6
    6
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ConnectBleTestActivity.java
  16. 15
    10
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/EightBodyfatActivity.java
  17. 8
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/EightBodyfatAdc.java
  18. 4
    5
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/HeightCmdActivity.java
  19. 5
    11
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/HeightWeightScaleActivity.java
  20. 305
    45
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/MainActivity.java
  21. 773
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/PublicBleNetworkCmdActivity.java
  22. 3
    3
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/RopeSkippingActivity.java
  23. 243
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/RopeSkippingSetActivity.java
  24. 384
    111
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ShowBleActivity.java
  25. 2
    3
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/SmartMaskActivity.java
  26. 83
    22
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/SphyCmdActivity.java
  27. 180
    47
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TempCmdActivity.java
  28. 4
    5
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TempGunCmdActivity.java
  29. 27
    4
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TempHumidityActivity.java
  30. 61
    25
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TestCmdActivity.java
  31. 2
    4
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ToothBrushBleActivity.java
  32. 21
    15
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ToothBrushBleUtilsData.java
  33. 3
    3
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ToothBrushWifiBleActivity.java
  34. 4
    5
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TpmsConnectCmdActivity.java
  35. 52
    10
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TransmissionActivity.java
  36. 1
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/WeightScaleBleActivity.java
  37. 4
    5
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/WifiConfigActivity.java
  38. 127
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/adapter/StringAdapter.java
  39. 363
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/base/AppBaseActivity.java
  40. 18
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/base/BleAppBaseActivity.java
  41. 6
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/base/BleBaseActivity.java
  42. 18
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/base/MyApplication.java
  43. 101
    40
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/config/BleDeviceConfig.java
  44. 1
    3
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/AddUserDialog.java
  45. 1
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/DialogStringImageAdapter.java
  46. 18
    18
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/HintDataDialogFragment.java
  47. 0
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/LoadingIosDialogFragment.java
  48. 4
    5
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/ShowListDialogFragment.java
  49. 1
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/WifiDialog.java
  50. 2
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/find/FindDeviceActivity.java
  51. 1
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/find/FindDeviceAdapter.java
  52. 5
    5
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/find/FindDeviceNewActivity.java
  53. 82
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/BleDemoActivity.java
  54. 900
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/TempInstrument/TempInstrumentActivity.java
  55. 608
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/airdetector/AirDetectorActivity.java
  56. 284
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/airdetector/AirDetectorShowUtil.java
  57. 278
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/airdetector/AirUtil.java
  58. 18
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/airdetector/SetType.java
  59. 1070
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/airdetector_test/AirDetectorActivityTest.java
  60. 130
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/airdetector_test/AirDetectorTestAdapter.java
  61. 75
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/airdetector_test/AirDetectorTestBean.java
  62. 364
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/airdetector_test/AirDetectorTestShowUtil.java
  63. 179
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/airdetector_test/SettingResultInterface.java
  64. 328
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/ble_nutrition/BleNutritionActivity.java
  65. 5
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/blood_glucose/BloodGlucoseActivity.java
  66. 2
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/blood_glucose/BloodGlucoseTestActivity.java
  67. 150
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/blood_pressure_tc/BloodPressureTcActivity.java
  68. 639
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/body_scale_4g/BodyScale4GActivity.java
  69. 2
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/broadcast_height/BroadcastHeightActivity.java
  70. 4
    4
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/broadcast_nutrition/BroadNutritionActivity.java
  71. 368
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/broadcast_weight_sacle/BroadcastWeightScaleActivity.java
  72. 2
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/coffee_scale/CoffeeScaleActivity.java
  73. 260
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/fascia_gun/FasciaGunActivity.java
  74. 40
    5
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/food_temp/FoodTempActivity.java
  75. 143
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/leaone_broadcast/LeaOneBroadcastActivity.java
  76. 201
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/noise_meter/BleNoiseMeterActivity.java
  77. 435
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/noise_meter/WifiBleNoiseMeterActivity.java
  78. 2
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/share_charger/ShareChargerActivity.java
  79. 2
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/share_condom/ShareCondomActivity.java
  80. 2
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/share_socket/ShareSocketActivity.java
  81. 662
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/toothbrush/ToothBrushWifiBleActivity.java
  82. 497
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/toothbrush_test/ToothbrushTestActivity.java
  83. 122
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/toothbrush_test/ToothbrushTestAdapter.java
  84. 59
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/toothbrush_test/ToothbrushTestBean.java
  85. 327
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/weight_scale/WeightScaleActivity.java
  86. 13
    5
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/EightBodyFatAlgorithms.java
  87. 68
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/FileProvider7.java
  88. 297
    13
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/FileUtils.java
  89. 39
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/ResultContact.java
  90. 0
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/SP.java
  91. 13
    13
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/ToothBrushUtils.java
  92. 20
    0
      app/src/main/res/drawable/bg_public_white_gray.xml
  93. 10
    0
      app/src/main/res/drawable/ic_round.xml
  94. 72
    0
      app/src/main/res/layout/activity_about.xml
  95. 519
    0
      app/src/main/res/layout/activity_ailink_scooter.xml
  96. 403
    0
      app/src/main/res/layout/activity_air_detector.xml
  97. 26
    0
      app/src/main/res/layout/activity_air_detector_test.xml
  98. 5
    4
      app/src/main/res/layout/activity_ble.xml
  99. 79
    0
      app/src/main/res/layout/activity_ble_noise_meter.xml
  100. 0
    0
      app/src/main/res/layout/activity_ble_toothbrush_bak.xml

+ 10
- 3
app/build.gradle Dosyayı Görüntüle

@@ -21,6 +21,12 @@ android {
sourceCompatibility '1.8'
targetCompatibility '1.8'
}

repositories {
flatDir {
dirs 'libs'
}
}
sourceSets {
main {
jniLibs.srcDirs = ['libs']
@@ -34,11 +40,12 @@ dependencies {
implementation 'androidx.appcompat:appcompat:1.4.2'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
testImplementation 'junit:junit:4.12'
implementation 'com.github.elinkthings:AILinkSDKRepositoryAndroid:1.10.3'//蓝牙核心库
implementation 'com.github.elinkthings:AILinkSDKRepositoryAndroid:1.10.9'//蓝牙核心库
implementation 'com.github.elinkthings:AILinkSDKOtaLibraryAndroid:1.0.3'//OTA库,需要依赖核心库
implementation 'com.github.elinkthings:AILinkSDKParsingLibraryAndroid:1.6.8'//蓝牙解析库
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'com.github.elinkthings:AILinkSDKParsingLibraryAndroid:1.8.0'//蓝牙解析库
implementation 'androidx.recyclerview:recyclerview:1.2.1'
implementation 'com.jakewharton:butterknife:10.2.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.0'
api 'com.squareup.retrofit2:converter-gson:2.5.0'
// implementation (name: 'modulelibrary-release', ext: 'aar')
}

+ 79
- 34
app/src/main/AndroidManifest.xml Dosyayı Görüntüle

@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest package="aicare.net.cn.sdk.ailinksdkdemoandroid"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="aicare.net.cn.sdk.ailinksdkdemoandroid">

<!--兼容6.0以上的手机Ble-->

<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
@@ -10,10 +11,20 @@
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!--OTA需要读写文件-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />


<!--兼容6.0以上的手机Ble-->
<uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission-sdk-23 android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission-sdk-23
android:name="android.permission.ACCESS_COARSE_LOCATION"/>

<uses-permission-sdk-23
android:name="android.permission.ACCESS_FINE_LOCATION"/>

<uses-permission
android:name="android.permission.BLUETOOTH"
android:maxSdkVersion="30" />
@@ -21,13 +32,16 @@
android:name="android.permission.BLUETOOTH_ADMIN"
android:maxSdkVersion="30" />
<!--android12还需要增加如下权限,也需求动态申请-->
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"
<uses-permission
android:name="android.permission.BLUETOOTH_SCAN"
android:usesPermissionFlags="neverForLocation"
tools:targetApi="s"/>
tools:targetApi="s" />
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<!--android10,11需要后台扫描的,需要添加如下权限-->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

<uses-feature
android:name="android.hardware.bluetooth_le"
android:required="false" />
@@ -35,25 +49,25 @@
android:name="android.hardware.bluetooth"
android:required="false" />

<!--OTA需要读写文件-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

<application
android:name=".base.MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:requestLegacyExternalStorage="true"
android:roundIcon="@mipmap/ic_launcher"
android:screenOrientation="portrait"
android:supportsRtl="true"
android:usesCleartextTraffic="true"
android:theme="@style/AppTheme"
android:usesCleartextTraffic="true"
tools:targetApi="q">
<activity android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
@@ -70,38 +84,69 @@
<activity android:name=".ADWeightScaleCmdActivity" />
<activity android:name=".ADWeightScaleUserActivity" />
<activity android:name=".WeightScaleWifiBleActivity" />
<activity android:name=".WeightScaleBleActivity"/>
<activity android:name=".WifiConfigActivity"/>
<activity android:name=".EightBodyfatActivity"/>
<activity android:name=".TestOtaActivity"/>
<activity android:name=".BloodGlucoseActivity"/>
<activity android:name=".WeightScaleBleActivity" />
<activity android:name=".WifiConfigActivity" />
<activity android:name=".EightBodyfatActivity" />
<activity android:name=".TestOtaActivity" />
<activity android:name=".modules.blood_glucose.BloodGlucoseActivity" />
<activity android:name=".BabyBodyFatCmdActivity" />
<activity android:name=".BroadcastScaleActivity" />
<activity android:name=".TransmissionActivity"/>
<activity android:name=".TransmissionActivity" />
<activity android:name=".BroadcastBloodOxygenActivity" />
<activity android:name=".SmartMaskActivity" />
<activity android:name=".ToothBrushWifiBleActivity" />
<activity android:name=".TempHumidityActivity" />
<activity android:name=".modules.toothbrush.ToothBrushWifiBleActivity" />
<activity android:name=".BLDWeightScaleBleActivity" />
<activity android:name=".BloodOxygenActivity" />
<activity android:name=".SkateboardDataActivity" />
<activity android:name=".modules.blood_glucose.BloodGlucoseTestActivity" />
<activity android:name=".modules.share_charger.ShareChargerActivity" />
<activity android:name=".modules.broadcast_height.BroadcastHeightActivity" />
<activity android:name=".modules.coffee_scale.CoffeeScaleActivity" />
<activity android:name=".HeightWeightScaleActivity" />
<activity android:name=".ClearShakeHandsActivity" />
<activity android:name=".BloodSugar4GActivity" />
<activity android:name=".BloodOxygenActivity" />
<activity android:name=".find.FindDeviceActivity" />
<activity android:name=".TempHumidityActivity" />
<activity android:name=".RopeSkippingActivity" />
<activity android:name=".modules.broadcast_nutrition.BroadNutritionActivity" />
<activity android:name=".modules.coffee_scale.CoffeeScaleActivity" />
<activity android:name=".modules.food_temp.FoodTempActivity" />
<activity android:name=".modules.share_charger.ShareChargerActivity" />
<activity android:name=".modules.share_condom.ShareCondomActivity" />
<activity android:name=".modules.airdetector.AirDetectorActivity" />
<activity android:name=".modules.airdetector_test.AirDetectorActivityTest" />
<activity
android:name=".modules.food_temp.FoodTempActivity"
android:windowSoftInputMode="adjustPan|stateHidden" />
<activity android:name=".find.FindDeviceNewActivity" />
<activity android:name=".BloodSugar4GActivity" />
<activity android:name=".modules.share_socket.ShareSocketActivity" />
<activity android:name=".modules.broadcast_height.BroadcastHeightActivity" />
<activity android:name=".modules.blood_glucose.BloodGlucoseActivity" />
<activity android:name=".modules.blood_glucose.BloodGlucoseTestActivity" />
<activity android:name=".BLDWeightScaleBleActivity" />
<activity android:name=".ToothBrushBleActivity"/>
<activity android:name=".modules.share_condom.ShareCondomActivity" />
<activity android:name=".modules.broadcast_nutrition.BroadNutritionActivity" />
<activity android:name=".modules.ble_nutrition.BleNutritionActivity" />
<activity android:name=".modules.toothbrush_test.ToothbrushTestActivity" />
<activity android:name=".modules.leaone_broadcast.LeaOneBroadcastActivity" />
<activity android:name=".modules.fascia_gun.FasciaGunActivity" />
<activity android:name=".modules.blood_pressure_tc.BloodPressureTcActivity" />
<activity android:name=".RopeSkippingSetActivity" />
<activity android:name=".modules.body_scale_4g.BodyScale4GActivity" />
<activity android:name=".AiLinkScooterActivity" />
<activity android:name=".modules.TempInstrument.TempInstrumentActivity" />
<activity android:name=".AboutActivity" />
<activity android:name=".PublicBleNetworkCmdActivity" />
<activity android:name=".modules.noise_meter.WifiBleNoiseMeterActivity" />
<activity android:name=".modules.noise_meter.BleNoiseMeterActivity" />

<activity
android:name=".modules.weight_scale.WeightScaleActivity"
android:screenOrientation="portrait" />

<activity
android:name=".modules.broadcast_weight_sacle.BroadcastWeightScaleActivity"
android:screenOrientation="unspecified" />

<service android:name="com.pingwang.bluetoothlib.server.ELinkBleServer"/>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
</application>

</manifest>

+ 2
- 2
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ADWeightScaleCmdActivity.java Dosyayı Görüntüle

@@ -28,12 +28,12 @@ import com.pingwang.bluetoothlib.listener.OnMcuParameterListener;
import com.pingwang.bluetoothlib.utils.BleDensityUtil;
import com.pingwang.bluetoothlib.utils.BleLog;
import com.pingwang.bluetoothlib.utils.BleStrUtils;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;

import java.util.ArrayList;
import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.ADWeight.ADWeightScaleBleConfig;

+ 46
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/AboutActivity.java Dosyayı Görüntüle

@@ -0,0 +1,46 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid;

import android.os.Message;
import android.view.View;

import aicare.net.cn.sdk.ailinksdkdemoandroid.base.AppBaseActivity;


/**
* xing<br>
* 2022/4/6<br>
* java类作用描述
*/
public class AboutActivity extends AppBaseActivity {


@Override
protected void uiHandlerMessage(Message msg) {

}

@Override
protected int getLayoutId() {
return R.layout.activity_about;
}

@Override
protected void initListener() {
findViewById(R.id.img_finish).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}

@Override
protected void initData() {

}

@Override
protected void initView() {

}
}

+ 923
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/AiLinkScooterActivity.java Dosyayı Görüntüle

@@ -0,0 +1,923 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid;

import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ListView;

import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.listener.OnCallbackBle;
import com.pingwang.bluetoothlib.utils.BleStrUtils;

import java.util.ArrayList;
import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.ailinkScooter.AilinkScooterBleData;

public class AiLinkScooterActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, AilinkScooterBleData.ScooterListener {
private Button btn_support_function, btn_hear, btn_unit_kg, btn_unit_mi, btn_add_gear, btn_cut_gear, btn_zero_start, btn_set_charge_time,
btn_un_zero_start, btn_cruise_open, btn_cruise_close, btn_clear_total_mileage, btn_clear_single_mileage_time, btn_reset, btn_clear_other, btn_left_light, btn_right_light,
btn_atmosphere_light, btn_day_light, btn_brake_light, btn_head_light, btn_set_password, btn_unlock, btn_lock, btn_check_password, btn_boot, btn_shutdown, btn_after_password, btn_auto_bg_light, btn_bg_light_100, btn_bg_light_0, btn_shutdown_unlock,
btn_check_shutdown_time, btn_check_single_use_time, btn_check_battery_info, btn_check_total_mileage, btn_check_battery_no, btn_check_controller_no, btn_check_meter_version, btn_check_charge_time, btn_set_charge_capacity, btn_read_charge_capacity, btn_find_car_open, btn_find_car_close, btn_auto_lock_open, btn_auto_lock_close, btn_auto_unlock_open, btn_auto_unlock_close,
btn_move_warm_open, btn_move_warm_close, btn_collision_warm_open, btn_collision_warm_close, btn_read_warm_auto_lock, btn_find_car, btn_navigation_open, btn_navigation_close;

private ListView lv_log;
private List<String> logList;
private ArrayAdapter listAdapter;
private String mAddress;
private EditText et_password, et_charge_start_time, et_charge_end_time, et_charge_capacity;

private int currentGear;

private int unlockShutTime = 300;
private int lockShutTime = 180;

private CheckBox cb_monday, cb_tuesday, cb_wednesday, cb_thursday, cb_friday, cb_saturday, cb_sunday;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mAddress = getIntent().getStringExtra("mac");
setContentView(R.layout.activity_ailink_scooter);
findView();
setListener();
logList = new ArrayList<>();
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, logList);
lv_log.setAdapter(listAdapter);
}

private void findView() {
lv_log = findViewById(R.id.lv_log);
btn_support_function = findViewById(R.id.btn_support_function);
btn_hear = findViewById(R.id.btn_hear);
btn_unit_kg = findViewById(R.id.btn_unit_kg);
btn_unit_mi = findViewById(R.id.btn_unit_mi);
btn_add_gear = findViewById(R.id.btn_add_gear);
btn_cut_gear = findViewById(R.id.btn_cut_gear);
btn_zero_start = findViewById(R.id.btn_zero_start);
btn_un_zero_start = findViewById(R.id.btn_un_zero_start);
btn_cruise_open = findViewById(R.id.btn_cruise_open);
btn_cruise_close = findViewById(R.id.btn_cruise_close);
btn_clear_total_mileage = findViewById(R.id.btn_clear_total_mileage);
btn_clear_single_mileage_time = findViewById(R.id.btn_clear_single_mileage_time);
btn_reset = findViewById(R.id.btn_reset);
btn_clear_other = findViewById(R.id.btn_clear_other);
btn_left_light = findViewById(R.id.btn_left_light);
btn_right_light = findViewById(R.id.btn_right_light);
btn_atmosphere_light = findViewById(R.id.btn_atmosphere_light);
btn_day_light = findViewById(R.id.btn_day_light);
btn_brake_light = findViewById(R.id.btn_brake_light);
btn_head_light = findViewById(R.id.btn_head_light);
btn_set_password = findViewById(R.id.btn_set_password);
btn_unlock = findViewById(R.id.btn_unlock);
btn_lock = findViewById(R.id.btn_lock);
btn_check_password = findViewById(R.id.btn_check_password);
btn_boot = findViewById(R.id.btn_boot);
btn_shutdown = findViewById(R.id.btn_shutdown);
btn_after_password = findViewById(R.id.btn_after_password);
btn_auto_bg_light = findViewById(R.id.btn_auto_bg_light);
btn_bg_light_100 = findViewById(R.id.btn_bg_light_100);
btn_bg_light_0 = findViewById(R.id.btn_bg_light_0);
btn_shutdown_unlock = findViewById(R.id.btn_shutdown_unlock);
btn_check_shutdown_time = findViewById(R.id.btn_check_shutdown_time);
btn_check_single_use_time = findViewById(R.id.btn_check_single_use_time);
btn_check_battery_info = findViewById(R.id.btn_check_battery_info);
btn_check_total_mileage = findViewById(R.id.btn_check_total_mileage);
btn_check_battery_no = findViewById(R.id.btn_check_battery_no);
btn_check_controller_no = findViewById(R.id.btn_check_controller_no);
btn_check_meter_version = findViewById(R.id.btn_check_meter_version);
btn_check_charge_time = findViewById(R.id.btn_check_charge_time);
btn_set_charge_capacity = findViewById(R.id.btn_set_charge_capacity);
btn_read_charge_capacity = findViewById(R.id.btn_read_charge_capacity);
btn_find_car_open = findViewById(R.id.btn_find_car_open);
btn_find_car_close = findViewById(R.id.btn_find_car_close);
btn_auto_lock_open = findViewById(R.id.btn_auto_lock_open);
btn_auto_lock_close = findViewById(R.id.btn_auto_lock_close);
btn_auto_unlock_open = findViewById(R.id.btn_auto_unlock_open);
btn_auto_unlock_close = findViewById(R.id.btn_auto_unlock_close);
btn_move_warm_open = findViewById(R.id.btn_move_warm_open);
btn_move_warm_close = findViewById(R.id.btn_move_warm_close);
btn_collision_warm_open = findViewById(R.id.btn_collision_warm_open);
btn_collision_warm_close = findViewById(R.id.btn_collision_warm_close);
btn_read_warm_auto_lock = findViewById(R.id.btn_read_warm_auto_lock);
btn_find_car = findViewById(R.id.btn_find_car);
btn_navigation_open = findViewById(R.id.btn_navigation_open);
btn_navigation_close = findViewById(R.id.btn_navigation_close);
et_password = findViewById(R.id.et_password);
cb_monday = findViewById(R.id.cb_monday);
cb_tuesday = findViewById(R.id.cb_tuesday);
cb_wednesday = findViewById(R.id.cb_wednesday);
cb_thursday = findViewById(R.id.cb_thursday);
cb_friday = findViewById(R.id.cb_friday);
cb_saturday = findViewById(R.id.cb_saturday);
cb_sunday = findViewById(R.id.cb_sunday);
et_charge_start_time = findViewById(R.id.et_charge_start_time);
et_charge_end_time = findViewById(R.id.et_charge_end_time);
btn_set_charge_time = findViewById(R.id.btn_set_charge_time);
et_charge_capacity = findViewById(R.id.et_charge_capacity);
}

private void setListener() {
btn_support_function.setOnClickListener(this);
btn_hear.setOnClickListener(this);
btn_unit_kg.setOnClickListener(this);
btn_unit_mi.setOnClickListener(this);
btn_add_gear.setOnClickListener(this);
btn_cut_gear.setOnClickListener(this);
btn_zero_start.setOnClickListener(this);
btn_un_zero_start.setOnClickListener(this);
btn_cruise_open.setOnClickListener(this);
btn_cruise_close.setOnClickListener(this);
btn_clear_total_mileage.setOnClickListener(this);
btn_clear_single_mileage_time.setOnClickListener(this);
btn_reset.setOnClickListener(this);
btn_clear_other.setOnClickListener(this);
btn_left_light.setOnClickListener(this);
btn_right_light.setOnClickListener(this);
btn_atmosphere_light.setOnClickListener(this);
btn_day_light.setOnClickListener(this);
btn_brake_light.setOnClickListener(this);
btn_head_light.setOnClickListener(this);
btn_set_password.setOnClickListener(this);
btn_unlock.setOnClickListener(this);
btn_lock.setOnClickListener(this);
btn_check_password.setOnClickListener(this);
btn_boot.setOnClickListener(this);
btn_shutdown.setOnClickListener(this);
btn_after_password.setOnClickListener(this);
btn_auto_bg_light.setOnClickListener(this);
btn_bg_light_100.setOnClickListener(this);
btn_bg_light_0.setOnClickListener(this);
btn_shutdown_unlock.setOnClickListener(this);

btn_check_shutdown_time.setOnClickListener(this);
btn_check_single_use_time.setOnClickListener(this);
btn_check_battery_info.setOnClickListener(this);
btn_check_total_mileage.setOnClickListener(this);
btn_check_battery_no.setOnClickListener(this);
btn_check_controller_no.setOnClickListener(this);
btn_check_meter_version.setOnClickListener(this);
btn_check_charge_time.setOnClickListener(this);
btn_set_charge_capacity.setOnClickListener(this);
btn_read_charge_capacity.setOnClickListener(this);
btn_find_car_open.setOnClickListener(this);
btn_find_car_close.setOnClickListener(this);
btn_auto_lock_open.setOnClickListener(this);
btn_auto_lock_close.setOnClickListener(this);
btn_auto_unlock_open.setOnClickListener(this);
btn_auto_unlock_close.setOnClickListener(this);
btn_move_warm_open.setOnClickListener(this);
btn_move_warm_close.setOnClickListener(this);
btn_collision_warm_open.setOnClickListener(this);
btn_collision_warm_close.setOnClickListener(this);
btn_read_warm_auto_lock.setOnClickListener(this);
btn_find_car.setOnClickListener(this);
btn_navigation_open.setOnClickListener(this);
btn_navigation_close.setOnClickListener(this);
btn_set_charge_time.setOnClickListener(this);
}

@Override
public void onServiceSuccess() {
mBluetoothService.setOnCallback(this);
logList.add(0,"绑定服务成功");
if (mBluetoothService != null) {
mBluetoothService.setOnCallback(this);
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress);
if (bleDevice != null) {
AilinkScooterBleData.init(bleDevice);
AilinkScooterBleData.getInstance().setScooterListener(this);

}
}

}

@Override
public void onServiceErr() {

}

@Override
public void unbindServices() {

}

@Override
public void onDisConnected(String mac, int code) {
if (mac.equalsIgnoreCase(mAddress)) {
logList.add(0,"连接断开");
listAdapter.notifyDataSetChanged();
}
}

private boolean isOpenR;
private boolean isOpenL;
private boolean isAtmosphere;
private boolean isDay;
private boolean isBrake;
private boolean isHead;

@Override
public void onClick(View v) {
if(AilinkScooterBleData.getInstance()==null)return;
switch (v.getId()) {
case R.id.btn_support_function:
logList.add(0,"查询支持的功能");
listAdapter.notifyDataSetChanged();
AilinkScooterBleData.getInstance().getSupportedFunction();
break;
case R.id.btn_hear:
logList.add(0,"心跳数据交互");
listAdapter.notifyDataSetChanged();
AilinkScooterBleData.getInstance().sendHearData();
break;
case R.id.btn_unit_kg:
logList.add(0,"设置公制单位(结果在心跳包中看)");
listAdapter.notifyDataSetChanged();
AilinkScooterBleData.getInstance().sendUnitData(0);
break;
case R.id.btn_unit_mi:
logList.add(0,"设置英制单位(结果在心跳包中看)");
listAdapter.notifyDataSetChanged();
AilinkScooterBleData.getInstance().sendUnitData(1);
break;
case R.id.btn_add_gear:
currentGear++;
if (currentGear > 7) currentGear = 7;
logList.add(0,"设置档位(结果在心跳包中看):" + currentGear);
listAdapter.notifyDataSetChanged();
AilinkScooterBleData.getInstance().sendGearData(currentGear);
break;
case R.id.btn_cut_gear:
currentGear--;
if (currentGear < 0) currentGear = 0;
logList.add(0,"设置档位(结果在心跳包中看):" + currentGear);
listAdapter.notifyDataSetChanged();
AilinkScooterBleData.getInstance().sendGearData(currentGear);
break;
case R.id.btn_zero_start:
logList.add(0,"零启动(结果在心跳包中看)");
listAdapter.notifyDataSetChanged();
AilinkScooterBleData.getInstance().sendStartModeData(0);
break;
case R.id.btn_un_zero_start:
logList.add(0,"非零启动(结果在心跳包中看)");
listAdapter.notifyDataSetChanged();
AilinkScooterBleData.getInstance().sendStartModeData(1);
break;
case R.id.btn_cruise_open:
logList.add(0,"开启巡航(结果在心跳包中看)");
listAdapter.notifyDataSetChanged();
AilinkScooterBleData.getInstance().sendCruiseControlFunctionData(1);

break;
case R.id.btn_cruise_close:
logList.add(0,"关闭巡航(结果在心跳包中看)");
listAdapter.notifyDataSetChanged();
AilinkScooterBleData.getInstance().sendCruiseControlFunctionData(0);
break;
case R.id.btn_clear_total_mileage:
logList.add(0,"清除总里程(结果在心跳包中看)");
listAdapter.notifyDataSetChanged();
AilinkScooterBleData.getInstance().sendClearData(0x02);


break;
case R.id.btn_clear_single_mileage_time:
logList.add(0,"清除单次里程时间(结果在心跳包中看)");
listAdapter.notifyDataSetChanged();
AilinkScooterBleData.getInstance().sendClearData(0x01);

break;
case R.id.btn_reset:
logList.add(0,"清除单次里程时间(结果在心跳包中看)");
listAdapter.notifyDataSetChanged();
AilinkScooterBleData.getInstance().sendClearData(0x80);
break;
case R.id.btn_clear_other:
logList.add(0,"清除除里程和时间外的其它控制器及仪表参数");
listAdapter.notifyDataSetChanged();
AilinkScooterBleData.getInstance().sendClearData(0x04);
break;
case R.id.btn_left_light:
if (isOpenR) {
isOpenR = false;
logList.add(0,"右转灯开");
AilinkScooterBleData.getInstance().sendLightOpenData(0x20);
} else {
isOpenR = true;
logList.add(0,"右转灯关");
AilinkScooterBleData.getInstance().sendLightCloseData(0x20);
}
listAdapter.notifyDataSetChanged();
break;
case R.id.btn_right_light:
if (isOpenL) {
isOpenL = false;
logList.add(0,"左转灯开");
AilinkScooterBleData.getInstance().sendLightOpenData(0x10);
} else {
isOpenL = true;
logList.add(0,"左转灯关");
AilinkScooterBleData.getInstance().sendLightCloseData(0x10);
}
listAdapter.notifyDataSetChanged();
break;
case R.id.btn_atmosphere_light:
if (isAtmosphere) {
isAtmosphere = false;
logList.add(0,"氛围灯开");
AilinkScooterBleData.getInstance().sendLightOpenData(0x08);
} else {
isAtmosphere = true;
logList.add(0,"氛围灯关");
AilinkScooterBleData.getInstance().sendLightCloseData(0x08);
}
listAdapter.notifyDataSetChanged();
break;
case R.id.btn_day_light:
if (isDay) {
isDay = false;
logList.add(0,"日行灯开");
AilinkScooterBleData.getInstance().sendLightOpenData(0x04);
} else {
isDay = true;
logList.add(0,"日行灯关");
AilinkScooterBleData.getInstance().sendLightCloseData(0x04);
}
listAdapter.notifyDataSetChanged();

break;
case R.id.btn_brake_light:
if (isBrake) {
isBrake = false;
logList.add(0,"刹车灯开");
AilinkScooterBleData.getInstance().sendLightOpenData(0x02);
} else {
isBrake = true;
logList.add(0,"刹车灯关");
AilinkScooterBleData.getInstance().sendLightCloseData(0x02);
}
listAdapter.notifyDataSetChanged();
break;
case R.id.btn_head_light:
if (isHead) {
isHead = false;
logList.add(0,"前车灯开");
AilinkScooterBleData.getInstance().sendLightOpenData(0x01);
} else {
isHead = true;
logList.add(0,"前车灯关");
AilinkScooterBleData.getInstance().sendLightCloseData(0x01);
}
listAdapter.notifyDataSetChanged();
break;
case R.id.btn_set_password:
String oldPassword = et_password.getText().toString();
if (oldPassword.isEmpty()) {
logList.add(0,"请输入原始密码");
} else {
logList.add(0,"修改密码");
AilinkScooterBleData.getInstance().changeLockCarPassword(oldPassword, "123456");
}
listAdapter.notifyDataSetChanged();
break;
case R.id.btn_unlock:
String password = et_password.getText().toString();
if (password.isEmpty()) {
logList.add(0,"请输入密码");
} else {
logList.add(0,"解锁");
AilinkScooterBleData.getInstance().setLockCarPassword(0, password);
}
listAdapter.notifyDataSetChanged();

break;
case R.id.btn_lock:
logList.add(0,"锁车");
AilinkScooterBleData.getInstance().setLockCarPassword(1, "000000");
listAdapter.notifyDataSetChanged();
break;
case R.id.btn_check_password:
String checkPassword = et_password.getText().toString();
if (checkPassword.isEmpty()) {
logList.add(0,"请输入密码");
} else {
logList.add(0,"验证密码");
AilinkScooterBleData.getInstance().setLockCarPassword(2, checkPassword);
}

listAdapter.notifyDataSetChanged();
break;
case R.id.btn_boot:
String boot = et_password.getText().toString();
if (boot.isEmpty()) {
logList.add(0,"请输入密码");
} else {
logList.add(0,"验证密码");
AilinkScooterBleData.getInstance().setLockCarPassword(3, boot);
}

listAdapter.notifyDataSetChanged();

break;
case R.id.btn_shutdown:
logList.add(0,"锁车");
AilinkScooterBleData.getInstance().setLockCarPassword(4, "000000");
listAdapter.notifyDataSetChanged();
break;
case R.id.btn_after_password:
logList.add(0,"获取售后密码");
AilinkScooterBleData.getInstance().readServicePassword();
listAdapter.notifyDataSetChanged();
break;
case R.id.btn_auto_bg_light:
logList.add(0,"开启自动背光");
AilinkScooterBleData.getInstance().sendBgAuto();
listAdapter.notifyDataSetChanged();
break;
case R.id.btn_bg_light_100:
logList.add(0,"开启手动背光:100");
AilinkScooterBleData.getInstance().sendBgUnAuto(100);
listAdapter.notifyDataSetChanged();
break;
case R.id.btn_bg_light_0:
logList.add(0,"开启手动背光:0");
AilinkScooterBleData.getInstance().sendBgUnAuto(0);
listAdapter.notifyDataSetChanged();
break;
case R.id.btn_shutdown_unlock:
logList.add(0,"设置自动关机");
AilinkScooterBleData.getInstance().sendAutoShutDownTime(unlockShutTime, lockShutTime);
listAdapter.notifyDataSetChanged();
break;
case R.id.btn_check_shutdown_time:
logList.add(0,"查询自动关机时间");
AilinkScooterBleData.getInstance().sendGetShutDownTime();
listAdapter.notifyDataSetChanged();
break;
case R.id.btn_check_single_use_time:

logList.add(0,"查询单次行驶里程时间");
AilinkScooterBleData.getInstance().sendSingleMileageTime();
listAdapter.notifyDataSetChanged();
break;
case R.id.btn_check_battery_info:
logList.add(0,"查询总里程");
AilinkScooterBleData.getInstance().sendTotalMileage();
listAdapter.notifyDataSetChanged();
break;
case R.id.btn_check_total_mileage:
logList.add(0,"查询电池信息");
AilinkScooterBleData.getInstance().sendBatteryInfo();
listAdapter.notifyDataSetChanged();
break;
case R.id.btn_check_battery_no:
logList.add(0,"查询电池厂商代码及编号");
AilinkScooterBleData.getInstance().sendBatteryNo();
listAdapter.notifyDataSetChanged();
break;
case R.id.btn_check_controller_no:
logList.add(0,"查询控制器厂商代码及编号");
AilinkScooterBleData.getInstance().sendControllerNo();
listAdapter.notifyDataSetChanged();

break;
case R.id.btn_check_meter_version:
logList.add(0,"查询仪表固件版本");
AilinkScooterBleData.getInstance().sendMeterVersion();
listAdapter.notifyDataSetChanged();

break;
case R.id.btn_check_charge_time:
logList.add(0,"读取充电时间");
AilinkScooterBleData.getInstance().sendCheckChargeTime();
listAdapter.notifyDataSetChanged();
break;

case R.id.btn_set_charge_time:
String startTime = et_charge_start_time.getText().toString().trim();
String endTime = et_charge_end_time.getText().toString().trim();
if (startTime.isEmpty() || endTime.isEmpty() || startTime.contains(":") || endTime.contains(":")) {
logList.add(0,"输入正确的时间和格式");
return;
}
int monday = cb_monday.isChecked() ? 1 : 0;
int tuesday = cb_tuesday.isChecked() ? 1 : 0;
int wednesday = cb_wednesday.isChecked() ? 1 : 0;
int thursday = cb_thursday.isChecked() ? 1 : 0;
int friday = cb_friday.isChecked() ? 1 : 0;
int saturday = cb_saturday.isChecked() ? 1 : 0;
int sunday = cb_sunday.isChecked() ? 1 : 0;

int repeat = 1;
StringBuffer stringBuffer = new StringBuffer();
if (monday == 1 || tuesday == 1 || wednesday == 1 || thursday == 1 || friday == 1 || saturday == 1 || sunday == 1) {
repeat = 0;
stringBuffer.append("设置充电时间:重复:");
stringBuffer.append(monday == 1 ? "周一 " : "");
stringBuffer.append(tuesday == 1 ? "周二 " : "");
stringBuffer.append(wednesday == 1 ? "周三 " : "");
stringBuffer.append(thursday == 1 ? "周四 " : "");
stringBuffer.append(friday == 1 ? "周五 " : "");
stringBuffer.append(saturday == 1 ? "周六 " : "");
stringBuffer.append(sunday == 1 ? "周日 " : "");
} else {
stringBuffer.append("设置充电时间:不重复");
}
String[] startTimes = startTime.split(":");
String[] endTimes = startTime.split(":");
logList.add(0,stringBuffer.toString());
try {
AilinkScooterBleData.getInstance().sendChargeTime(repeat, monday, tuesday, wednesday, thursday, friday, saturday, sunday,
Integer.parseInt(startTimes[0]), Integer.parseInt(startTimes[1]), Integer.parseInt(endTimes[0]), Integer.parseInt(endTimes[1]));
} catch (NumberFormatException e) {
logList.add(0,"出现异常。时间格式解析错误");
e.printStackTrace();
}
listAdapter.notifyDataSetChanged();
break;
case R.id.btn_set_charge_capacity:
String capacity = et_charge_capacity.getText().toString().trim();
if (capacity.isEmpty()) {
logList.add(0,"请填写容量");
return;
}
int percentage = 0;
try {
percentage = Integer.parseInt(capacity);
logList.add(0,"充电容量:" + percentage);
} catch (NumberFormatException e) {
e.printStackTrace();
logList.add(0,"请填数据啊");
}
AilinkScooterBleData.getInstance().sendSetChargeCapacity(percentage);
listAdapter.notifyDataSetChanged();
break;
case R.id.btn_read_charge_capacity:
logList.add(0,"读取充电容量");
AilinkScooterBleData.getInstance().sendGetChargeCapacity();
listAdapter.notifyDataSetChanged();
break;
case R.id.btn_find_car_open:
logList.add(0,"打开寻车功能");
AilinkScooterBleData.getInstance().sendFindCarFunction(1);
listAdapter.notifyDataSetChanged();

break;
case R.id.btn_find_car_close:
logList.add(0,"关闭寻车功能");
AilinkScooterBleData.getInstance().sendFindCarFunction(0);
listAdapter.notifyDataSetChanged();
break;
case R.id.btn_auto_lock_open:

logList.add(0,"打开自动锁车");
AilinkScooterBleData.getInstance().sendAutoLockCar(1);
listAdapter.notifyDataSetChanged();
break;
case R.id.btn_auto_lock_close:
logList.add(0,"关闭自动锁车");
AilinkScooterBleData.getInstance().sendAutoLockCar(0);
listAdapter.notifyDataSetChanged();
break;
case R.id.btn_auto_unlock_open:
logList.add(0,"打开自动解锁");
AilinkScooterBleData.getInstance().sendAutoUnLockCar(1);
listAdapter.notifyDataSetChanged();
break;
case R.id.btn_auto_unlock_close:
logList.add(0,"关闭自动解锁");
AilinkScooterBleData.getInstance().sendAutoUnLockCar(0);
listAdapter.notifyDataSetChanged();
break;
case R.id.btn_move_warm_open:
logList.add(0,"打开移位报警");
AilinkScooterBleData.getInstance().sendMoveWarm(1);
listAdapter.notifyDataSetChanged();
break;
case R.id.btn_move_warm_close:
logList.add(0,"关闭移位报警");
AilinkScooterBleData.getInstance().sendMoveWarm(0);
listAdapter.notifyDataSetChanged();
break;
case R.id.btn_collision_warm_open:
logList.add(0,"打开碰撞报警");
AilinkScooterBleData.getInstance().sendCollisionWarm(1);
listAdapter.notifyDataSetChanged();
break;
case R.id.btn_collision_warm_close:
logList.add(0,"关闭碰撞报警");
AilinkScooterBleData.getInstance().sendCollisionWarm(0);
listAdapter.notifyDataSetChanged();
break;
case R.id.btn_read_warm_auto_lock:
logList.add(0,"读取车辆报警、自动锁");
AilinkScooterBleData.getInstance().sendCarWarmAndLock();
listAdapter.notifyDataSetChanged();
break;
case R.id.btn_find_car:

logList.add(0,"寻车");
AilinkScooterBleData.getInstance().sendFindCar();
listAdapter.notifyDataSetChanged();
break;
case R.id.btn_navigation_open:
logList.add(0,"导航:向左转弯,当前方向剩余500米,总剩余路程1000米");
AilinkScooterBleData.getInstance().sendNavigation(1,2,500,1000);
listAdapter.notifyDataSetChanged();
break;
case R.id.btn_navigation_close:
logList.add(0,"关闭导航");
AilinkScooterBleData.getInstance().sendNavigation(0,0,0,0);
listAdapter.notifyDataSetChanged();
break;
}
}

@Override
public void onSupportFunction(byte[] payload, int MeterBridgeOrBlePayload, int autoBgLight, int unAutoBgLight,
int chargeManage, int chargeCapacityManage, int navigation, int weatherPush,
int msgPush, int cruiseControl, int cruiseControlSwitch, int zeroOrUnzeroStart,
int boostMode, int appSwitchMachine, int controllerNo,
int batteryInfo, int batteryNo, int rightLight, int leftLight,
int ambientLight, int dayLight, int brakeLight, int headingLight,
int findCar, int autoLock, int autoUnLock, int moveWarm, int collisionWarm) {
logList.add(0,"payload收:" + BleStrUtils.byte2HexStr(payload));
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(MeterBridgeOrBlePayload == 0 ? "仪表桥接" : "BLE透传");
stringBuffer.append(" 自动背光:");
stringBuffer.append(supportOrUnSupport(autoBgLight));
stringBuffer.append(" 手动背光:");
stringBuffer.append(supportOrUnSupport(unAutoBgLight));
stringBuffer.append(" 充电时间管理:");
stringBuffer.append(supportOrUnSupport(chargeManage));
stringBuffer.append(" 充电容量管理:");
stringBuffer.append(supportOrUnSupport(chargeCapacityManage));
stringBuffer.append(" 导航数据:");
stringBuffer.append(supportOrUnSupport(navigation));
stringBuffer.append(" 天气推送:");
stringBuffer.append(supportOrUnSupport(weatherPush));
stringBuffer.append(" 消息推送:");
stringBuffer.append(supportOrUnSupport(msgPush));
stringBuffer.append(" 定速巡航功能:");
stringBuffer.append(supportOrUnSupport(cruiseControl));
stringBuffer.append(" 定速巡航开关:");
stringBuffer.append(supportOrUnSupport(cruiseControlSwitch));
stringBuffer.append(" 零启动、非零启动切换:");
stringBuffer.append(supportOrUnSupport(zeroOrUnzeroStart));
stringBuffer.append(" 助力模式:");
stringBuffer.append(supportOrUnSupport(boostMode));
stringBuffer.append(" APP开关机:");
stringBuffer.append(supportOrUnSupport(appSwitchMachine));
stringBuffer.append(" 控制器厂商代码编号:");
stringBuffer.append(supportOrUnSupport(controllerNo));
stringBuffer.append(" 电池信息:");
stringBuffer.append(supportOrUnSupport(batteryInfo));
stringBuffer.append(" 电池厂商代码编号:");
stringBuffer.append(supportOrUnSupport(batteryNo));
stringBuffer.append(" 右转灯开关:");
stringBuffer.append(supportOrUnSupport(rightLight));
stringBuffer.append(" 左转灯开关:");
stringBuffer.append(supportOrUnSupport(leftLight));
stringBuffer.append(" 氛围灯开关:");
stringBuffer.append(supportOrUnSupport(ambientLight));
stringBuffer.append(" 日行灯开关:");
stringBuffer.append(supportOrUnSupport(dayLight));
stringBuffer.append(" 刹车灯开关:");
stringBuffer.append(supportOrUnSupport(brakeLight));
stringBuffer.append(" 前车灯开关:");
stringBuffer.append(supportOrUnSupport(headingLight));
stringBuffer.append(" 寻车功能:");
stringBuffer.append(supportOrUnSupport(findCar));
stringBuffer.append(" 自动锁车:");
stringBuffer.append(supportOrUnSupport(autoLock));
stringBuffer.append(" 自动解锁:");
stringBuffer.append(supportOrUnSupport(autoUnLock));
stringBuffer.append(" 车辆移位报警:");
stringBuffer.append(supportOrUnSupport(moveWarm));
stringBuffer.append(" 车辆碰撞报警:");
stringBuffer.append(supportOrUnSupport(collisionWarm));

logList.add(0,stringBuffer.toString());
listAdapter.notifyDataSetChanged();
}

@Override
public void onHeartData(byte[] payload, int batteryState, int battery, float currentSpeed, int deviceState, int cruiseControlState, int unit, int cruiseControlSwitchState, int startMode, int lockState, int maxSpeed, int minGearStartZero, int currentGear, int supportGear, int handlerbarState, int electronicBrakeState, int mechanicalBrakeState, int motorState, int rightLight, int leftLight, int ambientLight, int dayLight, int brakeLight, int headingLight, int errorBattery, int errorControl, int errorMotor, int errorMotorHall, int errorBrake, int errorHandlerBar, int errorCommunication, float singleMileage, int singleTime, int updateState) {
this.currentGear = currentGear;
logList.add(0,"payload收:" + BleStrUtils.byte2HexStr(payload));
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("心跳:充电状态:");
stringBuffer.append(batteryState == 0 ? "未充电" : "充电中");
stringBuffer.append(" 电池电量百分比:");
stringBuffer.append(battery);
stringBuffer.append(" 车辆实时速度:");
stringBuffer.append(currentSpeed);
stringBuffer.append(" 开关机状态:");
stringBuffer.append(deviceState == 0 ? "开机" : "关机");
stringBuffer.append(" 巡航状态:");
stringBuffer.append(cruiseControlState == 0 ? "未巡航" : "巡航中");
stringBuffer.append(" 当前单位:");
stringBuffer.append(unit == 0 ? "公里制" : "英里制");
stringBuffer.append(" 巡航功能开关状态:");
stringBuffer.append(cruiseControlSwitchState == 0 ? "巡航关闭" : "巡航开启");
stringBuffer.append(" 启动方式:");
stringBuffer.append(startMode == 0 ? "零启动" : "非零启动");
stringBuffer.append(" 锁车状态:");
stringBuffer.append(lockState == 0 ? "解锁" : "锁车");
stringBuffer.append(" 车辆支持的最高速度(km/h):");
stringBuffer.append(maxSpeed);
stringBuffer.append(" 最低档位是否从0开始:");
stringBuffer.append(minGearStartZero == 0 ? "从1开始" : "从0开始");
stringBuffer.append(" 当前档位:");
stringBuffer.append(currentGear);
stringBuffer.append(" 支持的档位个数:");
stringBuffer.append(supportGear);
stringBuffer.append(" 转把有效状态:");
stringBuffer.append(handlerbarState == 0 ? "无效" : "有效");
stringBuffer.append(" 电子刹车状态:");
stringBuffer.append(electronicBrakeState == 0 ? "未刹车" : "刹车中");
stringBuffer.append(" 机械刹车状态:");
stringBuffer.append(mechanicalBrakeState == 0 ? "未刹车" : "刹车中");
stringBuffer.append(" 电机运行状态:");
stringBuffer.append(motorState == 0 ? "电机未运行" : "电机运行");
stringBuffer.append(" 右转灯开关:");
stringBuffer.append(openOrClose(rightLight));
stringBuffer.append(" 左转灯开关:");
stringBuffer.append(openOrClose(leftLight));
stringBuffer.append(" 氛围灯开关:");
stringBuffer.append(openOrClose(ambientLight));
stringBuffer.append(" 日行灯开关:");
stringBuffer.append(openOrClose(dayLight));
stringBuffer.append(" 刹车灯开关:");
stringBuffer.append(openOrClose(brakeLight));
stringBuffer.append(" 前车灯开关:");
stringBuffer.append(openOrClose(headingLight));
stringBuffer.append(" 电池故障:");
stringBuffer.append(unFaultOrFault(errorBattery));
stringBuffer.append(" 控制器故障:");
stringBuffer.append(unFaultOrFault(errorControl));
stringBuffer.append(" 电机相线或者MOS管短路故障:");
stringBuffer.append(unFaultOrFault(errorMotor));
stringBuffer.append(" 电机霍尔故障:");
stringBuffer.append(unFaultOrFault(errorMotorHall));
stringBuffer.append(" 刹车故障:");
stringBuffer.append(unFaultOrFault(errorBrake));
stringBuffer.append(" 转把故障:");
stringBuffer.append(unFaultOrFault(errorHandlerBar));
stringBuffer.append(" 通讯故障:");
stringBuffer.append(unFaultOrFault(errorCommunication));
stringBuffer.append(" 单次行驶里程:");
stringBuffer.append(singleMileage);
stringBuffer.append(" 单次行驶时间:");
stringBuffer.append(singleTime);
stringBuffer.append(" 升级状态:");
stringBuffer.append(updateState == 0 ? "未升级1" : updateState == 1 ? "仪表升级中" : "控制器升级中");
logList.add(0,stringBuffer.toString());
listAdapter.notifyDataSetChanged();
}

@Override
public void onChangePassword(byte[] payload, int result) {
logList.add(0,"payload收:" + BleStrUtils.byte2HexStr(payload));
logList.add(0,"修改密码" + (result == 0 ? "成功" : result == 1 ? "失败" : "不支持"));
listAdapter.notifyDataSetChanged();
}

@Override
public void onLockState(byte[] payload, int result, int passwordResult) {
logList.add(0,"payload收:" + BleStrUtils.byte2HexStr(payload));
logList.add(0,(result == 0 ? "解锁:" : result == 1 ? "上锁" : "验证密码:") + (passwordResult == 0 ? "密码正确" : "密码错误") + " (锁车时,不校验密码.该结果无效)");
listAdapter.notifyDataSetChanged();
}


@Override
public void onAfterPassword(byte[] payload, String afterPassword) {
logList.add(0,"payload收:" + BleStrUtils.byte2HexStr(payload));
logList.add(0,"售后密码: " + afterPassword);
listAdapter.notifyDataSetChanged();
}

@Override
public void onAutoShutDownTime(byte[] payload, int unlockTime, int lockTime) {
logList.add(0,"payload收:" + BleStrUtils.byte2HexStr(payload));
logList.add(0,"自动关机时间: 开锁状态下,自动关机" + unlockTime + " 锁车状态下,自动关机:" + lockTime);
listAdapter.notifyDataSetChanged();
}

@Override
public void onSingleMileageAndTime(byte[] payload, float mileage, int second) {
logList.add(0,"payload收:" + BleStrUtils.byte2HexStr(payload));
logList.add(0,"单次行驶里程" + mileage + " 时间:" + second);
listAdapter.notifyDataSetChanged();
}

@Override
public void onTotalMileage(byte[] payload, float mileage) {
logList.add(0,"payload收:" + BleStrUtils.byte2HexStr(payload));
logList.add(0,"行驶总里程" + mileage);
listAdapter.notifyDataSetChanged();
}

@Override
public void onBatteryInfo(byte[] payload, int temp, int currentType, float current, float voltage, int totalCapacity, int chargeAndDischargeTimes) {
logList.add(0,"payload收:" + BleStrUtils.byte2HexStr(payload));
logList.add(0,"电池温度:" + temp + (currentType == 0 ? " 实时电流" : " 电池限流") + " 电流:" + current + " 电压:" + voltage + " 总容量:" + totalCapacity + " 充放电次数:" + chargeAndDischargeTimes);
listAdapter.notifyDataSetChanged();

}

@Override
public void onBatteryNo(byte[] payload, String no, String hardwareVersion, String softwareVersion) {
logList.add(0,"payload收:" + BleStrUtils.byte2HexStr(payload));
logList.add(0,"厂商代码编号:" + no + " 硬件版本:" + hardwareVersion + " 软件版本:" + softwareVersion);
listAdapter.notifyDataSetChanged();
}

@Override
public void onControllerVersion(byte[] payload, String no, String hardwareVersion, String softwareVersion) {
logList.add(0,"payload收:" + BleStrUtils.byte2HexStr(payload));
logList.add(0,"控制器厂商代码:" + no + " 硬件版本:" + hardwareVersion + " 软件版本:" + softwareVersion);
listAdapter.notifyDataSetChanged();
}

@Override
public void onMeterVersion(byte[] payload, String no, String hardwareVersion, String softwareVersion) {
logList.add(0,"payload收:" + BleStrUtils.byte2HexStr(payload));
logList.add(0,"仪表固件版本:" + no + " 硬件版本:" + hardwareVersion + " 软件版本:" + softwareVersion);
listAdapter.notifyDataSetChanged();
}


@Override
public void onChargeTime(byte[] payload, int repeat, int monday, int tuesday, int wednesday, int thursday, int friday, int saturday, int sunday, int startHour, int startMin, int endHour, int endMin) {
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("设置充电时间:重复:");
stringBuffer.append(repeat == 0 ? "重复:" : "不重复");
stringBuffer.append(monday == 1 ? "周一 " : "");
stringBuffer.append(tuesday == 1 ? "周二 " : "");
stringBuffer.append(wednesday == 1 ? "周三 " : "");
stringBuffer.append(thursday == 1 ? "周四 " : "");
stringBuffer.append(friday == 1 ? "周五 " : "");
stringBuffer.append(saturday == 1 ? "周六 " : "");
stringBuffer.append(sunday == 1 ? "周日 " : "");
stringBuffer.append(" 开始时间:");
stringBuffer.append(startHour);
stringBuffer.append(":");
stringBuffer.append(startMin);
stringBuffer.append(" 结束时间:");
stringBuffer.append(endHour);
stringBuffer.append(":");
stringBuffer.append(endMin);
logList.add(0,"payload收:" + BleStrUtils.byte2HexStr(payload));
logList.add(0,stringBuffer.toString());
listAdapter.notifyDataSetChanged();

}

@Override
public void onChargeCapacity(byte[] payload, int capacity) {
logList.add(0,"payload收:" + BleStrUtils.byte2HexStr(payload));
logList.add(0,"充电容量:" + capacity);
listAdapter.notifyDataSetChanged();
}

@Override
public void onCarWarmAndAutoLock(byte[] payload, int findCar, int autoLock, int autoUnlock, int moveCar, int collisionWarm) {
logList.add(0,"payload收:" + BleStrUtils.byte2HexStr(payload));
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("寻车功能");
stringBuffer.append(openOrClose(findCar));
stringBuffer.append("自动锁车");
stringBuffer.append(openOrClose(autoLock));
stringBuffer.append("自动解锁");
stringBuffer.append(openOrClose(autoUnlock));
stringBuffer.append("移位报警");
stringBuffer.append(openOrClose(moveCar));
stringBuffer.append("碰撞报警");
stringBuffer.append(openOrClose(collisionWarm));
logList.add(0,stringBuffer.toString());
listAdapter.notifyDataSetChanged();
}

private String supportOrUnSupport(int type) {
return type == 0 ? "不支持" : "支持";
}

private String openOrClose(int type) {
return type == 0 ? "关闭" : "开启";
}

private String unFaultOrFault(int type) {
return type == 0 ? "无故障" : "有故障";
}

}

+ 2
- 3
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BLDWeightScaleBleActivity.java Dosyayı Görüntüle

@@ -10,18 +10,17 @@ import android.widget.CompoundButton;
import android.widget.ListView;
import android.widget.RadioButton;

import androidx.annotation.Nullable;

import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.bean.SupportUnitBean;
import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.listener.OnCallbackBle;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;

import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.BLDBodyfatScale.BLDBodyFatBleUtilsData;
import cn.net.aicare.modulelibrary.module.BLDBodyfatScale.BLDBodyFatDataUtil;
import cn.net.aicare.modulelibrary.module.BLDBodyfatScale.BLDUser;

+ 2
- 3
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BabyBodyFatCmdActivity.java Dosyayı Görüntüle

@@ -24,13 +24,12 @@ import com.pingwang.bluetoothlib.listener.OnMcuParameterListener;
import com.pingwang.bluetoothlib.utils.BleDensityUtil;
import com.pingwang.bluetoothlib.utils.BleLog;
import com.pingwang.bluetoothlib.utils.BleStrUtils;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;

import java.util.ArrayList;
import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.babyBodyFat.BabyBodyFatBleConfig;

+ 2
- 2
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BabyCmdActivity.java Dosyayı Görüntüle

@@ -23,12 +23,12 @@ import com.pingwang.bluetoothlib.listener.OnMcuParameterListener;
import com.pingwang.bluetoothlib.utils.BleDensityUtil;
import com.pingwang.bluetoothlib.utils.BleLog;
import com.pingwang.bluetoothlib.utils.BleStrUtils;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;

import java.util.ArrayList;
import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.babyscale.BabyBleConfig;

+ 26
- 10
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BleCmdActivity.java Dosyayı Görüntüle

@@ -57,7 +57,7 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On
private final int REFRESH_DATA = 3;
private List<String> mList;
private ArrayAdapter listAdapter;
private EditText etName, etMacType, etBroadcastTime, etMcuType, etSleepTime, et_set_device;
private EditText etName, etMacType, etBroadcastTime, etMcuType, etSleepTime, et_set_device;
private Context mContext;
private String mAddress;
private BleSendCmdUtil mBleSendCmdUtil;
@@ -126,6 +126,7 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On
findViewById(R.id.btn_get_device).setOnClickListener(this);
findViewById(R.id.btnDis).setOnClickListener(this);
findViewById(R.id.btnConnect).setOnClickListener(this);
findViewById(R.id.btnSnRead).setOnClickListener(this);
etName = findViewById(R.id.etName);
etMacType = findViewById(R.id.etMacType);
etBroadcastTime = findViewById(R.id.etBroadcastTime);
@@ -139,7 +140,7 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On
SendBleBean sendBleBean;
switch (v.getId()) {
case R.id.btnDis:
if (mBleDevice!=null){
if (mBleDevice != null) {
mBleDevice.disconnect();
}
mList.add(TimeUtils.getTime() + "断开连接");
@@ -319,6 +320,16 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On
mList.add(TimeUtils.getTime() + "读取设备信息");
mHandler.sendEmptyMessage(REFRESH_DATA);
break;
case R.id.btnSnRead:
// 获取设备信息
sendBleBean = new SendBleBean();
byte[] sendData = new byte[1];
sendData[0] = (byte) 0x95;
sendBleBean.setHex(sendData);
sendData(sendBleBean);
mList.add(TimeUtils.getTime() + "读取SN号");
mHandler.sendEmptyMessage(REFRESH_DATA);
break;
}
}

@@ -350,6 +361,7 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On
BleLog.i(TAG, "mBleDevice==null");
return;
}
mBleDevice.setMtu(512);
mBleDevice.setOnBleVersionListener(this);
mBleDevice.setOnBleDeviceDataListener(this);
mBleDevice.setOnBleErrListener(this);
@@ -383,11 +395,8 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On
@Override
public void unbindServices() {
CallbackDisIm.getInstance().removeListener(this);
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress);
if (bleDevice != null) {
BleLog.i(TAG, "unbindService,断开连接");
bleDevice.disconnect();
}
mBluetoothService.disconnectAll();

}


@@ -406,7 +415,7 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On
BleLog.i(TAG, "连接断开");
if (mAddress.equals(mac)) {
Toast.makeText(mContext, "连接断开:" + code, Toast.LENGTH_SHORT).show();
mBleDevice=null;
mBleDevice = null;
}
}

@@ -459,6 +468,14 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On
mHandler.sendEmptyMessage(REFRESH_DATA);
}
break;
case (byte) 0x95: {
// 读取设备信息
byte[] dataSn = new byte[hex.length - 1];
System.arraycopy(hex, 1, dataSn, 0, dataSn.length);
mList.add(TimeUtils.getTime() + "读取SN:结果:" + BleStrUtils.byte2HexStr(dataSn));
mHandler.sendEmptyMessage(REFRESH_DATA);
}
break;
}
}
}
@@ -469,9 +486,8 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On
return;
}
String data = "";
if (hex != null) {
if (hex != null)
data = BleStrUtils.byte2HexStr(hex);
}
if (type == 100) {
mList.add(TimeUtils.getTime() + "cid=" + type + "\nsend->" + data);
} else {

+ 3
- 4
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BloodOxygenActivity.java Dosyayı Görüntüle

@@ -8,18 +8,17 @@ import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatSeekBar;

import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.listener.OnCallbackBle;
import com.pingwang.bluetoothlib.utils.BleStrUtils;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;

import java.util.ArrayList;
import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatSeekBar;
import cn.net.aicare.modulelibrary.module.BloodOxygen.BleBloodOxygenBleConfig;
import cn.net.aicare.modulelibrary.module.BloodOxygen.BleBloodOxygenDeviceData;


+ 4
- 5
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BloodSugar4GActivity.java Dosyayı Görüntüle

@@ -10,11 +10,6 @@ import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
@@ -28,6 +23,10 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

/**
* 4G血糖仪
*/

+ 2
- 2
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BroadcastBloodOxygenActivity.java Dosyayı Görüntüle

@@ -17,13 +17,13 @@ import com.pingwang.bluetoothlib.listener.OnCallbackDis;
import com.pingwang.bluetoothlib.listener.OnScanFilterListener;
import com.pingwang.bluetoothlib.utils.BleDensityUtil;
import com.pingwang.bluetoothlib.utils.BleLog;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.BloodOxygen.BroadcastBloodOxygenBleConfig;
import cn.net.aicare.modulelibrary.module.BloodOxygen.BroadcastBloodOxygenDeviceData;

+ 2
- 2
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BroadcastScaleActivity.java Dosyayı Görüntüle

@@ -21,13 +21,13 @@ import com.pingwang.bluetoothlib.listener.OnScanFilterListener;
import com.pingwang.bluetoothlib.utils.BleDensityUtil;
import com.pingwang.bluetoothlib.utils.BleLog;
import com.pingwang.bluetoothlib.utils.BleStrUtils;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.BroadcastScale.BroadcastScaleBleConfig;
import cn.net.aicare.modulelibrary.module.BroadcastScale.BroadcastScaleDeviceData;

+ 4
- 5
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ClearShakeHandsActivity.java Dosyayı Görüntüle

@@ -10,9 +10,6 @@ import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.device.BleSendCmdUtil;
import com.pingwang.bluetoothlib.device.SendBleBean;
@@ -25,12 +22,14 @@ import com.pingwang.bluetoothlib.listener.OnCallbackDis;
import com.pingwang.bluetoothlib.listener.OnMcuParameterListener;
import com.pingwang.bluetoothlib.utils.BleLog;
import com.pingwang.bluetoothlib.utils.BleStrUtils;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;

import java.util.ArrayList;
import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.sphygmomanometer.SphyBleConfig;



+ 6
- 6
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ConnectBleTestActivity.java Dosyayı Görüntüle

@@ -16,22 +16,22 @@ import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.listener.CallbackDisIm;
import com.pingwang.bluetoothlib.listener.OnCallbackBle;
import com.pingwang.bluetoothlib.server.ELinkBleServer;
import com.pingwang.bluetoothlib.utils.BleLog;
import com.pingwang.bluetoothlib.utils.BleStrUtils;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.LoadingIosDialogFragment;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;

import java.util.ArrayList;
import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.LoadingIosDialogFragment;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;


/**
* xing<br>

+ 15
- 10
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/EightBodyfatActivity.java Dosyayı Görüntüle

@@ -10,13 +10,11 @@ import android.widget.RadioButton;
import com.pingwang.bluetoothlib.bean.SupportUnitBean;
import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.listener.OnCallbackBle;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.EightBodyFatAlgorithms;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.EightBodyFatBean;

import java.util.ArrayList;
import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatBleDeviceData;
import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatUtil;
@@ -286,6 +284,8 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic

}

private float weight;

@Override
public void onWeight(int state, float weight, int unit, int decimal) {
//测量状态 1实时体重 2稳定体重
@@ -295,7 +295,7 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic
} else if (state == EightBodyFatUtil.WEIGHT_STABILIZATION_WEIGHT) {
stateStr = "稳定体重";
}
this.weight=weight;
if (unit == EightBodyFatUtil.ST) {
loglist.add(0, "测量状态:" + state + stateStr + " 体重:" + EightBodyFatUtil.lbtostlb(weight) + " 体重单位:" + unit + " 小数点位" + decimal);
} else {
@@ -306,7 +306,7 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic
@Override
public void onImpedance(int adc, int part, int arithmetic) {
loglist.add(0, "阻抗:" + adc + " 部位: " + part + " 算法" + arithmetic);
kaimeng(part,adc);
kaimeng(part,adc,arithmetic);
}

@Override
@@ -342,9 +342,11 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic

private EightBodyfatAdc mEightBodyfatAdc;

private void kaimeng(int part, int adc) {
if (mEightBodyfatAdc == null) mEightBodyfatAdc = new EightBodyfatAdc();

private void kaimeng(int part, int adc,int algorithms) {
if (mEightBodyfatAdc == null) {
mEightBodyfatAdc = new EightBodyfatAdc();
}
mEightBodyfatAdc.setAlgorithms(algorithms);
switch (part) {
case EightBodyFatUtil.IMPEDANCE_FOOT:
//双脚阻抗
@@ -406,8 +408,11 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic

private void kaimengJieMi(EightBodyfatAdc mEightBodyfatAdc) {
loglist.add(0,mEightBodyfatAdc.toString());
loglist.add(0, "默认传入用户: 性别:男,身高:170,体重 65kg 年龄25");
EightBodyFatBean algorithmsData = EightBodyFatAlgorithms.getInstance().getAlgorithmsData(1, 1, 170, 65, 25, mEightBodyfatAdc);
loglist.add(0, "默认传入用户: 性别:男,身高:180,年龄27,"+"weight "+weight+"kg");
EightBodyFatBean algorithmsData =
EightBodyFatAlgorithms.getInstance().getAlgorithmsData(mEightBodyfatAdc.getAlgorithms(), 1, 180, weight, 27, mEightBodyfatAdc);
// EightBodyFatBean algorithmsData =
// EightBodyFatAlgorithms.getInstance().getAlgorithmsData(2, 0, 165, weight, 27, mEightBodyfatAdc);
loglist.add(0, algorithmsData.toString());

}

+ 8
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/EightBodyfatAdc.java Dosyayı Görüntüle

@@ -14,6 +14,7 @@ public class EightBodyfatAdc {
private int adcRightHandLeftFoot;
private int adcLeftHandRightFoot;
private int adcBody;
private int algorithms;


public int getAdcFoot() {
@@ -104,6 +105,13 @@ public class EightBodyfatAdc {
this.adcBody = adcBody;
}

public int getAlgorithms() {
return algorithms;
}

public void setAlgorithms(int algorithms) {
this.algorithms = algorithms;
}

@Override
public String toString() {

+ 4
- 5
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/HeightCmdActivity.java Dosyayı Görüntüle

@@ -11,9 +11,6 @@ import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.device.BleSendCmdUtil;
import com.pingwang.bluetoothlib.device.SendBleBean;
@@ -26,12 +23,14 @@ import com.pingwang.bluetoothlib.listener.OnMcuParameterListener;
import com.pingwang.bluetoothlib.utils.BleDensityUtil;
import com.pingwang.bluetoothlib.utils.BleLog;
import com.pingwang.bluetoothlib.utils.BleStrUtils;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;

import java.util.ArrayList;
import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.height.HeightDeviceData;



+ 5
- 11
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/HeightWeightScaleActivity.java Dosyayı Görüntüle

@@ -60,11 +60,13 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall
if (bleDevice != null) {
HeightBodyFatBleData.init(bleDevice);
HeightBodyFatBleData.getInstance().setOnHeightBodyFatDataCallback(this);
HeightBodyFatBleData.getInstance().setOnHeightBodyFatDataCallback(this);
}
}

}


@Override
public void onServiceErr() {

@@ -115,9 +117,7 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall

@Override
public void onScanning(BleValueBean data) {
if (data.getMac().equalsIgnoreCase(mAddress)){
connectBle(data.getMac());
}


}

@@ -136,7 +136,6 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall
if (mac.equals(mAddress)) {
logList.add(0, "连接已经断开");
listAdapter.notifyDataSetChanged();
startScanBle(0);

}

@@ -149,11 +148,7 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall

@Override
public void onServicesDiscovered(String mac) {
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress);
if (bleDevice != null) {
HeightBodyFatBleData.init(bleDevice);
HeightBodyFatBleData.getInstance().setOnHeightBodyFatDataCallback(this);
}


}

@@ -307,9 +302,8 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall
+ " 阻抗: " + adc + " 算法位: " + arithmetic);
listAdapter.notifyDataSetChanged();

}


}

@Override
public void onHeart(int workMode, int status, int heart) {

+ 305
- 45
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/MainActivity.java Dosyayı Görüntüle

@@ -1,58 +1,91 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid;

import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.os.Message;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.view.View;
import android.widget.TextView;

import com.pingwang.bluetoothlib.AILinkSDK;
import com.besthealth.bhBodyComposition120.BhBodyComposition;
import com.pingwang.bluetoothlib.utils.BleLog;

import java.util.ArrayList;
import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleAppBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.config.AppConfig;
import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.HintDataDialogFragment;
import aicare.net.cn.sdk.ailinksdkdemoandroid.find.FindDeviceNewActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.body_scale_4g.BodyScale4GActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.broadcast_height.BroadcastHeightActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.broadcast_nutrition.BroadNutritionActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.broadcast_weight_sacle.BroadcastWeightScaleActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.leaone_broadcast.LeaOneBroadcastActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.AppStart;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.SP;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;


public class MainActivity extends BleAppBaseActivity {
public class MainActivity extends AppCompatActivity {


private static String TAG = MainActivity.class.getName();
private List<View> mList = new ArrayList<>();
private Context mContext;
private Handler mHandler = new Handler(Looper.getMainLooper());

@Override
protected void uiHandlerMessage(Message msg) {

protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = this;
initView();
initData();
initListener();
int bodyComposition = new BhBodyComposition().getBodyComposition();
L.i("bodyComposition:" + bodyComposition);

// Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:10086"));
// Method setDefaultSim = null;
// try {
// setDefaultSim = TelephonyManager.class.getDeclaredMethod("setDefaultSim", Context.class, int.class, int.class);
// setDefaultSim.invoke(null, this, 0, 0);
// } catch (NoSuchMethodException e) {
// e.printStackTrace();
// } catch (IllegalAccessException e) {
// e.printStackTrace();
// } catch (InvocationTargetException e) {
// e.printStackTrace();
// }
// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// startActivity(intent);
}

@Override
protected int getLayoutId() {
return R.layout.activity_main;
}


@Override
public void onServiceSuccess() {

}

@Override
public void onServiceErr() {

}

@Override
public void unbindServices() {

}

@Override
protected void initListener() {
String version = getString(R.string.version) + ":" + BuildConfig.VERSION_NAME;
((TextView) findViewById(R.id.tv_app_version)).setText(version);
ActionBar supportActionBar = getSupportActionBar();
if (supportActionBar != null)
supportActionBar.setTitle(getString(R.string.app_name) + BuildConfig.VERSION_NAME);
findViewById(R.id.btn_about).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(mContext, AboutActivity.class));
}
});

MyListener listener = new MyListener();

// Button btn_shpy = findViewById(R.id.btn_sphy);
@@ -122,7 +155,24 @@ public class MainActivity extends BleAppBaseActivity {
mList.add(findViewById(R.id.btn_rope_skip));
mList.add(findViewById(R.id.btn_broadcast_nutrition));
mList.add(findViewById(R.id.btn_ble_nutrition));
mList.add(findViewById(R.id.btn_toothbrush_ble));
mList.add(findViewById(R.id.btn_toothbrush_test));
mList.add(findViewById(R.id.btn_leaone_broadcast));
mList.add(findViewById(R.id.btn_fascia_gun));
mList.add(findViewById(R.id.btn_blood_pressure_tc));
mList.add(findViewById(R.id.btn_body_scale_4g));
mList.add(findViewById(R.id.btn_scooter_cm02));
mList.add(findViewById(R.id.btn_temp_instrument));
mList.add(findViewById(R.id.btn_leap_watch));
mList.add(findViewById(R.id.btn_public_ble_network));
mList.add(findViewById(R.id.btn_rope_skipping_set_mode));
mList.add(findViewById(R.id.btn_air_detector));
mList.add(findViewById(R.id.btn_mqtt_air_detector));
mList.add(findViewById(R.id.btn_mqtt));
mList.add(findViewById(R.id.btn_wifi_ble_noise_meter));
mList.add(findViewById(R.id.btn_ble_noise_meter));
mList.add(findViewById(R.id.btn_meat_probe_charger));
mList.add(findViewById(R.id.btn_weight_scale));
mList.add(findViewById(R.id.btn_broadcast_scale_weight));
for (View view : mList) {
view.setOnClickListener(listener);
}
@@ -135,6 +185,35 @@ public class MainActivity extends BleAppBaseActivity {
findViewById(integer).setVisibility(View.VISIBLE);
}
}
findViewById(R.id.btn_rope_skipping_set_mode).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(mContext, RopeSkippingSetActivity.class));


// Intent intent = new Intent();
// intent.setAction("android.media.action.STILL_IMAGE_CAMERA");
// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// startActivity(intent);
//
// mHandler.postDelayed(new Runnable() {
// @Override
// public void run() {
// try {
// L.i("按下音量+ start");
// String keyCommand = "input keyevent " + KeyEvent.KEYCODE_VOLUME_UP;
// Runtime runtime = Runtime.getRuntime();
// Process proc = runtime.exec(keyCommand);
// L.i("按下音量+ stop"+proc.toString());
// } catch (IOException e) {
// e.printStackTrace();
// }
//
// }
// }, 5000);

}
});

// AILinkBleManager.getInstance().init(mContext, new AILinkBleManager.onInitListener() {
// @Override
@@ -165,20 +244,37 @@ public class MainActivity extends BleAppBaseActivity {

}

@Override
protected void initData() {
initPermissions();


}

@Override
protected void initView() {
BleLog.init("", "", BuildConfig.DEBUG);
String version = getString(R.string.version) + ":" + BuildConfig.VERSION_NAME;
((TextView) findViewById(R.id.tv_app_version)).setText(version);
AILinkSDK.getInstance().init(getApplication());//sdk
// AILinkBleManager.getInstance().init(getApplication());
BleLog.init("", "", true);
//connectDevice(BleValueBean bleValueBean);连接的时候需要传广播对象,否则返回的cid,vid,pid始终都是0
// AILinkSDK.getInstance().init(getApplication(), new AILinkSDK.OnNewKeyListener() {
// @Override
// public boolean onNewKey(int cid, int vid, int pid) {
// if (vid == 1) {
// return true;
// }
// return false;
// }
// });
//每次连接之前都要设置一次,设置一次之后就一直有效
//sdk
// AILinkBleManager.getInstance().init(mContext, new AILinkBleManager.onInitListener() {
// @Override
// public void onInitSuccess() {
// AILinkBleManager.getInstance().startScan(0);
// }
//
// @Override
// public void onInitFailure() {
//
// }
// });
// BleConfig.addVendorID(0xac05);
SP.init(this);
}

@@ -193,7 +289,7 @@ public class MainActivity extends BleAppBaseActivity {
switch (v.getId()) {

case R.id.btn_clear_shake_hands:
type=BleDeviceConfig.CLEAR_SHAKE_HANDS;
type = BleDeviceConfig.CLEAR_SHAKE_HANDS;
break;

case R.id.btn_sphy:
@@ -223,9 +319,6 @@ public class MainActivity extends BleAppBaseActivity {
case R.id.btn_wifi_ble_tooth:
type = BleDeviceConfig.TOOTHBRUSH_WIFI_BLE;
break;
case R.id.btn_toothbrush_ble:
type = BleDeviceConfig.TOOTHBRUSH_BLE;
break;
case R.id.btn_ble_weight:
type = BleDeviceConfig.WEIGHT_BODY_FAT_SCALE;
break;
@@ -235,10 +328,23 @@ public class MainActivity extends BleAppBaseActivity {
case R.id.btn_baby_body_fat:
type = BleDeviceConfig.BABY_BODY_FAT;
break;
case R.id.btn_temp_instrument:
type = BleDeviceConfig.TEMP_INSTRUMENT;
break;
case R.id.btn_mqtt_air_detector:
type = BleDeviceConfig.MQTT_AIR_DETECTOR;
break;
case R.id.btn_air_detector:
type = BleDeviceConfig.AIR_DETECTOR;
break;
case R.id.btn_broadcast_scale:
Intent intentBroadcast = new Intent(MainActivity.this, BroadcastScaleActivity.class);
startActivity(intentBroadcast);
return;
case R.id.btn_broadcast_scale_weight:
Intent intentBroadcastWeight = new Intent(MainActivity.this, BroadcastWeightScaleActivity.class);
startActivity(intentBroadcastWeight);
return;
case R.id.btn_broadcast_blood_oxygen:
Intent intentBloodOxygen = new Intent(MainActivity.this, BroadcastBloodOxygenActivity.class);
startActivity(intentBloodOxygen);
@@ -266,6 +372,10 @@ public class MainActivity extends BleAppBaseActivity {
case R.id.btn_transmission:
type = -4;
break;
case R.id.btn_blood_pressure_tc:
// 血压计透传
type = -10;
break;
case R.id.eight_scale:
type = BleDeviceConfig.EIGHT_BODY_FAT_SCALE;
break;
@@ -308,8 +418,7 @@ public class MainActivity extends BleAppBaseActivity {
startActivity(intentBroadcastHeight);
return;
case R.id.btn_4g_bs:

// 广播身高仪
// 4G 血糖仪
Intent bloodSugar4GIntent = new Intent(MainActivity.this, BloodSugar4GActivity.class);
startActivity(bloodSugar4GIntent);
return;
@@ -318,13 +427,13 @@ public class MainActivity extends BleAppBaseActivity {
type = BleDeviceConfig.FOOD_TEMP;
break;
case R.id.btn_hbfs:
type=BleDeviceConfig.HEIGHT_BODY_FAT;
type = BleDeviceConfig.HEIGHT_BODY_FAT;
break;
case R.id.btn_temp_humidity:
type= BleDeviceConfig.TEMP_Humidity;
type = BleDeviceConfig.TEMP_Humidity;
break;
case R.id.btn_rope_skip:
type=BleDeviceConfig.ROPE_SKIPPING;
type = BleDeviceConfig.ROPE_SKIPPING;
break;
case R.id.btn_broadcast_nutrition:
// 广播营养秤
@@ -335,6 +444,57 @@ public class MainActivity extends BleAppBaseActivity {
// 蓝牙营养秤
type = BleDeviceConfig.BLE_NUTRITION_SCALE;
break;
case R.id.btn_toothbrush_test:
// 牙刷测试
type = BleDeviceConfig.TOOTHBRUSH_TEST;
break;
case R.id.btn_leaone_broadcast:
// LeaOne 广播秤
Intent broadcastLeaOneIntent = new Intent(MainActivity.this, LeaOneBroadcastActivity.class);
startActivity(broadcastLeaOneIntent);
return;
case R.id.btn_fascia_gun:
// 筋膜枪
type = BleDeviceConfig.FASCIA_GUN;
break;
case R.id.btn_scooter_cm02:
type = BleDeviceConfig.SMART_SCOOTER_CM02;
break;
case R.id.btn_body_scale_4g:
// 4G 体脂秤
Intent bodyScaleIntent = new Intent(MainActivity.this, BodyScale4GActivity.class);
startActivity(bodyScaleIntent);
return;
case R.id.btn_leap_watch:
// 芯一代手表
type = BleDeviceConfig.LEAP_WATCH;
break;
case R.id.btn_public_ble_network:
// BLE通用配网
type = BleDeviceConfig.PUBLIC_BLE_NETWORK;
break;

case R.id.btn_wifi_ble_noise_meter:
// wifi+ble噪音计
type = BleDeviceConfig.WIFI_BLE_NOISE_METER;
break;
case R.id.btn_ble_noise_meter:
// ble噪音计
type = BleDeviceConfig.BLE_NOISE_METER;
break;
case R.id.btn_meat_probe_charger:
//食物探针充电盒
type = BleDeviceConfig.MEAT_PROBE_CHARGER;
break;
case R.id.btn_weight_scale:
//体重秤
type = BleDeviceConfig.WEIGHT_SCALE;
break;
case R.id.btn_mqtt:

return;
default:
return;
}
startActivity(type);
}
@@ -360,4 +520,104 @@ public class MainActivity extends BleAppBaseActivity {
}


//-----------------------权限----------------------------------------
/**
* 需要申请的权限
*/
private String[] LOCATION_PERMISSION = new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.WRITE_EXTERNAL_STORAGE};

/**
* 权限请求返回
*/
private final int PERMISSION = 101;
/**
* 定位服务返回
*/
protected final int LOCATION_SERVER = 102;
private HintDataDialogFragment mHintDataDialog = null;

protected void initPermissions() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
onPermissionsOk();
return;
}
if (ContextCompat.checkSelfPermission(this, LOCATION_PERMISSION[0]) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, LOCATION_PERMISSION, PERMISSION);
} else {
boolean bleStatus = AppStart.isLocServiceEnable(mContext);
if (!bleStatus) {
//没有开启定位服务
mHintDataDialog = HintDataDialogFragment.newInstance().setTitle("提示", 0).setCancel("取消", 0).setOk("确定", 0).setContent("请求开启定位服务", true)
.setOnDialogListener(new HintDataDialogFragment.onDialogListener() {
@Override
public void onSucceedListener(View v) {
startLocationActivity();
}
});
mHintDataDialog.show(getSupportFragmentManager());


} else {
onPermissionsOk();
}
}
}


@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);

//请求权限被拒绝
if (requestCode != PERMISSION)
return;
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
initPermissions();
} else {
if (ActivityCompat.shouldShowRequestPermissionRationale(this, LOCATION_PERMISSION[0])) {
//权限请求失败,但未选中“不再提示”选项,再次请求
ActivityCompat.requestPermissions(this, LOCATION_PERMISSION, PERMISSION);
} else {
//权限请求失败,选中“不再提示”选项
mHintDataDialog = HintDataDialogFragment.newInstance().setTitle("提示", 0).setCancel("取消", 0).setOk("确定", 0).setContent("请求开启定位权限", true)
.setOnDialogListener(new HintDataDialogFragment.onDialogListener() {
@Override
public void onSucceedListener(View v) {
AppStart.startUseSetActivity(mContext);
}
});
mHintDataDialog.show(getSupportFragmentManager());

}

}
}


/**
* 启动去设置定位服务
*/
protected void startLocationActivity() {

AppStart.startLocationActivity(this, LOCATION_SERVER);

}


/**
* 权限ok
*/
protected void onPermissionsOk() {

}

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == LOCATION_SERVER) {
//定位服务页面返回
initPermissions();
}
}

}

+ 773
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/PublicBleNetworkCmdActivity.java Dosyayı Görüntüle

@@ -0,0 +1,773 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid;

import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;

import com.pingwang.bluetoothlib.config.CmdConfig;
import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.device.BleSendCmdUtil;
import com.pingwang.bluetoothlib.device.SendBleBean;
import com.pingwang.bluetoothlib.listener.CallbackDisIm;
import com.pingwang.bluetoothlib.listener.OnBleCompanyListener;
import com.pingwang.bluetoothlib.listener.OnBleConnectStatus;
import com.pingwang.bluetoothlib.listener.OnBleDeviceDataListener;
import com.pingwang.bluetoothlib.listener.OnBleVersionListener;
import com.pingwang.bluetoothlib.listener.OnCallbackDis;
import com.pingwang.bluetoothlib.listener.OnMcuParameterListener;
import com.pingwang.bluetoothlib.listener.OnWifiInfoListener;
import com.pingwang.bluetoothlib.utils.BleStrUtils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.WifiDialog;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatDataUtil;


/**
* 通用的ble配网界面
*/
public class PublicBleNetworkCmdActivity extends BleBaseActivity implements OnCallbackDis, OnBleVersionListener, OnWifiInfoListener
, OnMcuParameterListener, OnBleCompanyListener, View.OnClickListener, OnBleDeviceDataListener, OnBleConnectStatus {

private static String TAG = PublicBleNetworkCmdActivity.class.getName();
private final int REFRESH_DATA = 3;
private List<String> mList;
private ArrayAdapter listAdapter;

private Context mContext;
private BleDevice mBleDevice;
private String mAddress;
private BleSendCmdUtil mBleSendCmdUtil;
private int type;
private byte unit = 0;
private HashMap<Integer, String> wifiMap;
private HashMap<Integer, String> mMapWifiName;
private EditText select_wifi_et, et_ip, et_port, et_url;
private int no;
private ListView listView;

private Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {


case REFRESH_DATA:
if (listAdapter != null) {
listAdapter.notifyDataSetChanged();
listView.smoothScrollToPosition(mList.size() - 1);
}
break;
}
}
};

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_public_ble_network);
mContext = this;
mAddress = getIntent().getStringExtra("mac");
type = getIntent().getIntExtra("type", -1);
wifiMap = new HashMap<>();
mMapWifiName = new HashMap<>();
mBleSendCmdUtil = BleSendCmdUtil.getInstance();
init();
}

private void init() {
mList = new ArrayList<>();
listView = findViewById(R.id.listview);
select_wifi_et = findViewById(R.id.select_wifi_et);
et_ip = findViewById(R.id.et_ip);
et_port = findViewById(R.id.et_port);
et_url = findViewById(R.id.et_url);

listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList);
listView.setAdapter(listAdapter);


findViewById(R.id.clear).setOnClickListener(this);
findViewById(R.id.scan_wifi).setOnClickListener(this);
findViewById(R.id.check_wifi_state).setOnClickListener(this);
findViewById(R.id.check_device_id).setOnClickListener(this);
findViewById(R.id.connect_wifi).setOnClickListener(this);
findViewById(R.id.disconnect).setOnClickListener(this);
findViewById(R.id.get_set_name).setOnClickListener(this);
findViewById(R.id.get_set_paw).setOnClickListener(this);
findViewById(R.id.reset).setOnClickListener(this);
findViewById(R.id.check_ip).setOnClickListener(this);
findViewById(R.id.check_port).setOnClickListener(this);
findViewById(R.id.check_url).setOnClickListener(this);
findViewById(R.id.set_ip).setOnClickListener(this);
findViewById(R.id.set_port).setOnClickListener(this);
findViewById(R.id.set_url).setOnClickListener(this);


}


@Override
public void onClick(View v) {

switch (v.getId()) {

case R.id.clear:
if (mList != null)
mList.clear();

case R.id.scan_wifi:
wifiMap.clear();
mMapWifiName.clear();
mList.add("扫描热点");
if (mBleDevice != null) mBleDevice.sendData(scanWifi());
break;
case R.id.check_wifi_state:
mList.add("查看wifi当前状态");
if (mBleDevice != null) mBleDevice.sendData(checkWiFiState());
break;
case R.id.check_device_id:
mList.add("查看设备的ID");
if (mBleDevice != null) mBleDevice.sendData(getSnDeviceId());
break;
case R.id.connect_wifi:
try {
no = Integer.parseInt(select_wifi_et.getText().toString());
String wifiMac = wifiMap.get(no);
String wifiName = mMapWifiName.get(no);
WifiDialog.newInstance().setTitle(wifiName, wifiMac).setOnDialogListener(new WifiDialog.OnDialogListener() {
@Override
public void tvCancelListener(View v) {

}

@Override
public void tvSucceedListener(View v, String data) {
mBleDevice.sendData(setWifiMac(wifiMac));
if (data.equals("") || data.length() >= 8) {
setPaw(data);
} else {
mList.add("按照操作规则来,输入密码。");
mHandler.sendEmptyMessage(REFRESH_DATA);
}
}
}).show(getSupportFragmentManager());
} catch (Exception e) {
e.printStackTrace();
//不输入编号,不输入数字,瞎搞的人。呸
mList.add("按照操作规则来,输入热点编号。");
}

break;
case R.id.disconnect:
mList.add("断开连接");
if (mBleDevice != null) mBleDevice.sendData(setDisconnectWifi());
break;
case R.id.get_set_paw:
mList.add("获取到设置的密码");
if (mBleDevice != null) mBleDevice.sendData(getConnectWifiPwd());
break;

case R.id.get_set_name:
mList.add("获取到设置的热点");
if (mBleDevice != null) mBleDevice.sendData(getConnectWifiName());
break;
case R.id.reset:
mList.add("回复出厂设置");
if (mBleDevice != null) mBleDevice.sendData(reset());
break;
case R.id.check_ip:
mList.add("查看Ip");
if (mBleDevice != null) mBleDevice.sendData(checkIp());
break;
case R.id.check_port:
mList.add("查看端口号");
if (mBleDevice != null) mBleDevice.sendData(checkPort());
break;
case R.id.check_url:
mList.add("查看URL");
if (mBleDevice != null) mBleDevice.sendData(checkUrl());
break;
case R.id.set_ip:
String ipStr = et_ip.getText().toString();
if (!ipStr.isEmpty()) {
mList.add("设置Ip地址");
setIp(convertToASCII(ipStr));
} else {
mList.add("最起码把Ip地址填一下吧");
}
break;
case R.id.set_url:
String urlStr = et_url.getText().toString();
mList.add("设置路径地址");
setIpUrl(convertToASCII(urlStr));
break;
case R.id.set_port:

try {
int port = Integer.parseInt(et_port.getText().toString());
mList.add("设置Ip地址");
setPort(port);
} catch (Exception e) {
e.printStackTrace();
mList.add("输入的数字");
}
break;

}
mHandler.sendEmptyMessage(REFRESH_DATA);

}

//---------------------------------服务---------------------------------------------------


@Override
public void onServiceSuccess() {
CallbackDisIm.getInstance().addListListener(this);
mList.add("服务与界面建立连接成功");
//与服务建立连接
if (mBluetoothService != null) {
mBleDevice = mBluetoothService.getBleDevice(mAddress);
if (mBleDevice != null) {
mBleDevice.setOnBleVersionListener(PublicBleNetworkCmdActivity.this);
mBleDevice.setOnMcuParameterListener(PublicBleNetworkCmdActivity.this);
mBleDevice.setOnWifiInfoListener(PublicBleNetworkCmdActivity.this);
mBleDevice.setOnBleConnectListener(this);
mBleDevice.setOnBleDeviceDataListener(this);
}
}

mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onServiceErr() {
mList.add("服务与界面连接断开");
//与服务断开连接
mBluetoothService = null;
mHandler.sendEmptyMessage(REFRESH_DATA);
}


@Override
public void unbindServices() {
CallbackDisIm.getInstance().removeListener(this);
if (mBleDevice != null) {
mBleDevice.disconnect();
mBleDevice = null;
}
}


//-----------------状态-------------------


@Override
public void onConnecting(@NonNull String mac) {
//TODO 连接中

}

@Override
public void onDisConnected(@NonNull String mac, int code) {
//TODO 连接断开
if (mAddress.equals(mac)) {

finish();
}
}

@Override
public void onServicesDiscovered(@NonNull String mac) {
//TODO 连接成功(获取服务成功)
if (mAddress.equals(mac)) {
mList.add("连接成功(获取服务成功)");
mHandler.sendEmptyMessage(REFRESH_DATA);
}
}


@Override
public void bleOpen() {

}

@Override
public void bleClose() {


finish();
}


@Override
public void onScanWiFiStatus(int status) {
mList.add("扫描wifi状态: " + status);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onWifiListName(int no, String name) {
mList.add("编号:" + no + " 热点:" + name);
mMapWifiName.put(no, name);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onConnectedWifiName(String name) {
mList.add("当前连接的热点名称:" + name);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onWifiListInfo(int no, String mac, int db, int type, int wifiStatus) {
wifiMap.put(no, mac);

}

@Override
public void onWifiScanFinish(int wifiNum) {
mList.add("热点扫描完成,热点数:" + wifiNum);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

private boolean issetMac = false;

@Override
public void onSetWifiNameOrPawOrConnectCallback(int type, int status) {
if (type == CmdConfig.SET_WIFI_MAC) {
mList.add("设置的mac地址状态 " + status);
if (status == BodyFatDataUtil.STATUS_SUCCESS) {
issetMac = true;
} else {

}
mHandler.sendEmptyMessage(REFRESH_DATA);

}
if (type == CmdConfig.SET_WIFI_PAW) {
mList.add("设置的密码状态 " + status);
mHandler.sendEmptyMessage(REFRESH_DATA);
if (status == BodyFatDataUtil.STATUS_SUCCESS && issetMac) {
mBleDevice.sendData(setConnectWifi());
}
}
if (type == CmdConfig.DIS_OR_CON_WIFI) {
mList.add("发起连接 " + status);
mHandler.sendEmptyMessage(REFRESH_DATA);

}
}

@Override
public void getSelectWifiMac(String mac) {
mList.add("获取到设置的wifi的mac地址 " + mac);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void getSelectWifiPaw(String pwd) {
mList.add("获取到设置的wifi的密码 " + pwd);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void getSN(long sn) {
mList.add("设备Id: " + sn);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onBleConnectStatus(int bleStatus, int wifiStatus, int workStatus) {
String wifiStatusStr = "";
switch (wifiStatus) {
case 0:
wifiStatusStr = "未配置AP";
break;
case 1:
wifiStatusStr = "连接AP失败";
break;
case 2:
wifiStatusStr = "连接的AP信号不好";
break;
case 3:
wifiStatusStr = "成功连接上AP";
break;
case 4:
wifiStatusStr = "正在连接AP";
break;

}
mList.add("蓝牙状态:" + bleStatus + "\nwifi状态:" + wifiStatusStr + "\n工作状态:" + workStatus);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onNotifyDataA6(byte[] hex) {
if ((hex[0] & 0xff) == 0x8b) {
// 设置IP地址
mList.add("设置的Ip地址状态" + (hex[1] & 0xff));
mHandler.sendEmptyMessage(REFRESH_DATA);

} else if ((hex[0] & 0xff) == 0x8d) {
// 设置端口
mList.add("设置的端口号的状态" + (hex[1] & 0xff));
mHandler.sendEmptyMessage(REFRESH_DATA);

} else if ((hex[0] & 0xff) == 0x96) {
// 设置路径
mList.add("设置的Url的状态" + (hex[1] & 0xff));
mHandler.sendEmptyMessage(REFRESH_DATA);

} else if ((hex[0] & 0xff) == 0x8c) {
byte[] name = new byte[hex.length - 1];
System.arraycopy(hex, 1, name, 0, name.length);
mList.add("设置的Ip地址" + BleStrUtils.convertUTF8ToString(name));
mHandler.sendEmptyMessage(REFRESH_DATA);

} else if ((hex[0] & 0xff) == 0x8e) {
int port = (((hex[1] & 0xff) << 8) | (hex[2] & 0xff));
mList.add("设置的端口号: " + port);
mHandler.sendEmptyMessage(REFRESH_DATA);

} else if ((hex[0] & 0xff) == 0x97) {
byte[] name = new byte[hex.length - 1];
System.arraycopy(hex, 1, name, 0, name.length);
mList.add("设置的Url:" + BleStrUtils.convertUTF8ToString(name));
mHandler.sendEmptyMessage(REFRESH_DATA);

}

}


//-----------------通知-------------------

@Override
public void onBmVersion(String version) {
mList.add(TimeUtils.getTime() + "版本号:" + version);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void OnDID(int cid, int vid, int pid) {
String didStr = "cid:" + cid + "||vid:" + vid + "||pid:" + pid;
mList.add(TimeUtils.getTime() + "ID:" + didStr);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onMcuBatteryStatus(int status, int battery) {
mList.add(TimeUtils.getTime() + "电量:" + battery + "%");
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onSysTime(int status, int[] times) {
String time =
times[0] + "-" + times[1] + "-" + times[2] + " " + times[3] + ":" + times[4] +
":" + times[5];
mList.add(TimeUtils.getTime() + "系统时间:" + time);
mHandler.sendEmptyMessage(REFRESH_DATA);
}


@Override
protected void onDestroy() {
super.onDestroy();

}


public SendBleBean checkWiFiState() {
byte[] bytes = new byte[1];
bytes[0] = 0x26;
return getSendBleBeam(bytes);
}


public SendBleBean scanWifi() {
byte[] bytes = new byte[2];
bytes[0] = (byte) CmdConfig.GET_SCAN_WIFI_RESULT;
bytes[1] = 0x01;
return getSendBleBeam(bytes);
}

public SendBleBean getSnDeviceId() {
byte[] bytes = new byte[1];
bytes[0] = (byte) 0x93;
return getSendBleBeam(bytes);
}

public SendBleBean setWifiMac(String mac) {
byte[] bytes = new byte[7];
bytes[0] = (byte) CmdConfig.SET_WIFI_MAC;
String[] s = mac.split(":");
for (int i = 0; i < s.length; i++) {
bytes[i + 1] = (byte) Integer.parseInt(s[i]);
}
return getSendBleBeam(bytes);

}

public SendBleBean setWifiPwd(int subpackage, byte[] password) {
int length = 0;
byte[] bytes1;
if (password != null) {
length = password.length + 1;
bytes1 = new byte[length + 1];
bytes1[0] = (byte) CmdConfig.SET_WIFI_PAW;
bytes1[1] = (byte) subpackage;
System.arraycopy(password, 0, bytes1, 2, password.length);

} else {
bytes1 = new byte[1];
bytes1[0] = (byte) 0x86;
}
return getSendBleBeam(bytes1);
}


public SendBleBean setConnectWifi() {
byte[] bytes = new byte[2];
bytes[0] = (byte) CmdConfig.DIS_OR_CON_WIFI;
bytes[1] = 0x01;
return getSendBleBeam(bytes);
}

/**
* 断开连接
* Disconnect
*
* @return payload数据
*/
public SendBleBean setDisconnectWifi() {
byte[] bytes = new byte[2];
bytes[0] = (byte) CmdConfig.DIS_OR_CON_WIFI;
bytes[1] = 0x00;
return getSendBleBeam(bytes);
}

/**
* 获取当前连接的wifi的名字
* Get the name of the currently connected wifi
*
* @return payload数据
*/
public SendBleBean getConnectWifiName() {
byte[] bytes = new byte[1];
bytes[0] = (byte) CmdConfig.GET_WIFI_NAME;
return getSendBleBeam(bytes);
}

/**
* 获取连接的wifi密码
*
* @return payload数据
*/
public SendBleBean getConnectWifiPwd() {
byte[] bytes = new byte[1];
bytes[0] = (byte) CmdConfig.GET_WIFI_PWD;
return getSendBleBeam(bytes);
}

public SendBleBean reset() {
byte[] bytes = new byte[2];
bytes[0] = 0x22;
bytes[1] = 0x01;
return getSendBleBeam(bytes);

}


public SendBleBean checkIp() {
byte[] bytes = new byte[1];
bytes[0] = (byte) 0x8c;
return getSendBleBeam(bytes);
}

public SendBleBean checkPort() {
byte[] bytes = new byte[1];
bytes[0] = (byte) 0x8e;
return getSendBleBeam(bytes);
}

public SendBleBean checkUrl() {
byte[] bytes = new byte[1];
bytes[0] = (byte) 0x97;
return getSendBleBeam(bytes);
}


public SendBleBean environmentIp(int subpackage, byte[] bytesIp) {
byte[] bytes1;
if (bytesIp != null) {
bytes1 = new byte[bytesIp.length + 2];
bytes1[0] = (byte) 0x8b;
bytes1[1] = (byte) subpackage;
System.arraycopy(bytesIp, 0, bytes1, 2, bytesIp.length);
} else {
bytes1 = new byte[1];
bytes1[0] = (byte) 0x8b;
}

return getSendBleBeam(bytes1);

}

public SendBleBean environmentPort(int port) {
byte[] bytes1;
bytes1 = new byte[3];
bytes1[0] = (byte) 0x8d;
bytes1[1] = (byte) (port >> 8);
bytes1[2] = (byte) (port & 0xff);
return getSendBleBeam(bytes1);
}


public SendBleBean environmentUrl(int subpackage, byte[] bytesIpUrl) {
byte[] bytes1;
if (bytesIpUrl != null) {
bytes1 = new byte[bytesIpUrl.length + 2];
bytes1[0] = (byte) 0x96;
bytes1[1] = (byte) subpackage;
System.arraycopy(bytesIpUrl, 0, bytes1, 2, bytesIpUrl.length);
} else {
bytes1 = new byte[1];
bytes1[0] = (byte) 0x96;
}

return getSendBleBeam(bytes1);

}


private void setIp(byte[] ips) {
if (ips.length <= 14) {
if (mBleDevice != null) {
mBleDevice.sendData(environmentIp(0, ips));
}
} else {
boolean isend = false;
int i = 0;
byte[] byte1 = ips;
while (!isend) {
if (byte1.length > 14) {
byte[] bytes = new byte[14];
System.arraycopy(ips, i, bytes, 0, bytes.length);
if (mBleDevice != null) mBleDevice.sendData(environmentIp(1, bytes));
i = i + 14;
byte1 = Arrays.copyOf(ips, ips.length - i);
} else {
isend = true;
byte[] bytes = new byte[ips.length - i];
System.arraycopy(ips, i, bytes, 0, bytes.length);
if (mBleDevice != null) mBleDevice.sendData(environmentIp(0, bytes));
}

}
}

}

private void setPort(int port) {
if (mBleDevice != null) mBleDevice.sendData(environmentPort(port));
}

private void setIpUrl(byte[] setIpUrl) {
if (setIpUrl.length <= 14) {
if (mBleDevice != null) mBleDevice.sendData(environmentUrl(0, setIpUrl));
} else {
boolean isend = false;
int i = 0;
byte[] byte1 = setIpUrl;
while (!isend) {
if (byte1.length > 14) {
byte[] bytes = new byte[14];
System.arraycopy(setIpUrl, i, bytes, 0, bytes.length);
if (mBleDevice != null) mBleDevice.sendData(environmentUrl(1, bytes));
i = i + 14;
byte1 = Arrays.copyOf(setIpUrl, setIpUrl.length - i);
} else {
isend = true;
byte[] bytes = new byte[setIpUrl.length - i];
System.arraycopy(setIpUrl, i, bytes, 0, bytes.length);
if (mBleDevice != null) mBleDevice.sendData(environmentUrl(0, bytes));
}

}
}

}

private byte[] convertToASCII(String string) {
char[] ch = string.toCharArray();
byte[] tmp = new byte[ch.length];
for (int i = 0; i < ch.length; i++) {
tmp[i] = (byte) Integer.valueOf(ch[i]).intValue();
}
return tmp;
}

private void setPaw(String paw) {
if (paw.isEmpty()) {
byte[] bytes = new byte[0];
if (mBleDevice != null) mBleDevice.sendData(setWifiPwd(0, bytes));
} else {
byte[] password = BleStrUtils.stringToBytes(paw);
if (password != null) {
if (password.length < 14)
if (mBleDevice != null) mBleDevice.sendData(setWifiPwd(0, password));
else {
boolean isend = false;
int i = 0;
byte[] byte1 = password;
while (!isend) {
if (byte1.length > 14) {
byte[] bytes = new byte[14];
System.arraycopy(password, i, bytes, 0, bytes.length);

if (mBleDevice != null)
mBleDevice.sendData(BodyFatDataUtil.getInstance().setWifiPwd(1, bytes));
i = i + 14;
byte1 = Arrays.copyOf(password, password.length - i);
} else {
isend = true;
byte[] bytes = new byte[password.length - i];
System.arraycopy(password, i, bytes, 0, bytes.length);

if (mBleDevice != null)
mBleDevice.sendData(BodyFatDataUtil.getInstance().setWifiPwd(0, bytes));
}

}


}
}
}
}

private SendBleBean getSendBleBeam(byte[] bytes) {
SendBleBean sendBleBean = new SendBleBean();
sendBleBean.setHex(bytes);
return sendBleBean;
}


}

+ 3
- 3
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/RopeSkippingActivity.java Dosyayı Görüntüle

@@ -119,7 +119,7 @@ public class RopeSkippingActivity extends BleBaseActivity implements View.OnClic
} else if (v.getId() == R.id.btn_clear_log) {
if (!isPauseLog) {
isPauseLog = true;
} else {
}else {
isPauseLog = false;
}

@@ -179,7 +179,7 @@ public class RopeSkippingActivity extends BleBaseActivity implements View.OnClic
@Override
public void onFinish(RopeSkipRecord ropeSkipBean) {

refreshLog("跳绳结束" + "\n" + ropeSkipBean.toString() + " \n绊绳=" + new Gson().toJson(ropeSkipBean.getStopDetail()));
refreshLog("跳绳结束"+"\n"+ropeSkipBean.toString() + " \n绊绳=" + new Gson().toJson(ropeSkipBean.getStopDetail()));
}

@Override
@@ -224,7 +224,7 @@ public class RopeSkippingActivity extends BleBaseActivity implements View.OnClic
refreshLog("没有离线记录");
} else {

refreshLog("离线记录:\n" + new Gson().toJson(list));
refreshLog("离线记录:\n"+new Gson().toJson(list));
}
}


+ 243
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/RopeSkippingSetActivity.java Dosyayı Görüntüle

@@ -0,0 +1,243 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid;

import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;

import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.config.BleConfig;
import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.device.SendMcuBean;
import com.pingwang.bluetoothlib.listener.OnBleDeviceDataListener;
import com.pingwang.bluetoothlib.listener.OnCallbackBle;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.collection.ArraySet;

/**
* 跳绳设置模式
*/
public class RopeSkippingSetActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, OnBleDeviceDataListener {


private final int CID = 0x002F;
private List<String> logList;
private ArrayAdapter mArrayAdapter;
private ListView listviw;
private EditText et_rssi, et_set_mode;
private Set<String> mSet = new ArraySet<>();
private String mAddress;
private boolean isPauseLog = false;
private int mMode = 3;
private int mRssi = -60;
private boolean mSetMode = true;
private int mSetModeNumber=0;

private Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(@NonNull Message msg) {
switch (msg.what) {

case 1:
refreshLog("正在设置下一个...");
if (mBluetoothService != null) {
mBluetoothService.scanLeDevice(0, BleConfig.UUID_BROADCAST_AILINK);
}
break;

}
}
};

@Override
public void onServiceSuccess() {
mBluetoothService.setOnCallback(this);
refreshLog("绑定服务成功");
if (mBluetoothService != null) {
mBluetoothService.setOnCallback(this);

}

}

@Override
public void onServiceErr() {
if (mArrayAdapter != null && logList != null) {
refreshLog("绑定服务失败");
}
}

@Override
public void unbindServices() {
if (mArrayAdapter != null && logList != null) {
refreshLog("解除绑定服务");
}

}


@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_rope_skipping_set_mode);
listviw = findViewById(R.id.listview);
et_rssi = findViewById(R.id.et_rssi);
et_set_mode = findViewById(R.id.et_set_mode);


findViewById(R.id.tv_test_mode).setOnClickListener(this);
findViewById(R.id.btn_start_set).setOnClickListener(this);
findViewById(R.id.btn_start_read).setOnClickListener(this);
findViewById(R.id.btn_stop).setOnClickListener(this);


logList = new ArrayList<>();
mArrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, logList);
listviw.setAdapter(mArrayAdapter);
}

@Override
public void onClick(View v) {
if (v.getId() == R.id.tv_test_mode) {
// 提示模式
String show = "1=随机2~8次/S\n2=2次/S\n3=3次/S\n4=4次/S\n5=5次/S";
refreshLog(show);

} else if (v.getId() == R.id.btn_start_set) {
//开始设置
refreshLog("开始设置...");
mMode = Integer.parseInt(et_set_mode.getText().toString().trim());
mRssi = Integer.parseInt(et_rssi.getText().toString().trim());
et_set_mode.setEnabled(false);
et_rssi.setEnabled(false);
mSetMode = true;
if (mBluetoothService != null) {
mBluetoothService.scanLeDevice(0, BleConfig.UUID_BROADCAST_AILINK);
}
} else if (v.getId() == R.id.btn_start_read) {
//开始读取
mMode = Integer.parseInt(et_set_mode.getText().toString().trim());
mRssi = Integer.parseInt(et_rssi.getText().toString().trim());
mSetMode = false;

} else if (v.getId() == R.id.btn_stop) {
//停止
et_set_mode.setEnabled(true);
et_rssi.setEnabled(true);
refreshLog("停止设置");
mBluetoothService.stopScan();
mBluetoothService.disconnectAll();

}
}


private void refreshLog(String content) {
if (!isPauseLog) {
content= TimeUtils.getTime(System.currentTimeMillis())+content;
logList.add( content);
mArrayAdapter.notifyDataSetChanged();
}
}


//-------------开始----------------------------

private void setMode(BleDevice bleDevice) {
byte[] cmd = new byte[2];
cmd[0] = 0x40;
cmd[1] = (byte) mMode;
SendMcuBean sendMcuBean = new SendMcuBean();
sendMcuBean.setHex(CID, cmd);
bleDevice.sendData(sendMcuBean);
}


@Override
public void onStartScan() {

}

@Override
public void onScanning(BleValueBean data) {
if (!mSet.contains(data.getMac()) && data.getCid() == 0x002F && Math.abs(mRssi) > Math.abs(data.getRssi())) {
mBluetoothService.stopScan();
mBluetoothService.connectDevice(data.getMac());
refreshLog("正在连接:" + data.getMac());
}

}

@Override
public void onScanErr(long time) {
mHandler.sendEmptyMessageDelayed(1, time);
}

@Override
public void onDisConnected(String mac, int code) {

}

@Override
public void onServicesDiscovered(String mac) {
if (mBluetoothService != null) {
mSet.add(mac);
BleDevice bleDevice = mBluetoothService.getBleDevice(mac);
bleDevice.setOnBleDeviceDataListener(this);
if (mSetMode) {
setMode(bleDevice);
refreshLog("连接并设置:" + mac);
}
mHandler.sendEmptyMessageDelayed(1, 2000);

}
}

@Override
public void onNotifyData(byte[] hex, int type) {
if (type == 0x002F) {
if ((hex[0] & 0xFF) == 0x40) {

mHandler.removeMessages(1);
mHandler.sendEmptyMessageDelayed(1, 1000);
switch (hex[1] & 0xFF) {

case 0:
mSetModeNumber++;
refreshLog("设置成功:"+mSetModeNumber);
break;
case 1:
refreshLog("设置失败:"+mSetModeNumber);

break;
case 2:
refreshLog("不支持:"+mSetModeNumber);
break;

}
if (mBluetoothService!=null){
mBluetoothService.disconnectAll();
}
}
}
}

@Override
public void finish() {
super.finish();
if (mBluetoothService != null)
mBluetoothService.disconnectAll();
}
}

+ 384
- 111
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ShowBleActivity.java Dosyayı Görüntüle

@@ -1,16 +1,29 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid;

import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.pm.PackageManager;
import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.os.ParcelUuid;
import android.provider.Settings;
import android.text.TextUtils;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

import com.pingwang.bluetoothlib.bean.BleValueBean;
@@ -19,6 +32,7 @@ import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.listener.CallbackDisIm;
import com.pingwang.bluetoothlib.listener.OnCallbackBle;
import com.pingwang.bluetoothlib.listener.OnScanFilterListener;
import com.pingwang.bluetoothlib.server.ELinkBleServer;
import com.pingwang.bluetoothlib.utils.BleLog;
import com.pingwang.bluetoothlib.utils.BleStrUtils;

@@ -28,17 +42,34 @@ import java.util.List;
import java.util.Map;
import java.util.UUID;

import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleAppBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.adapter.StringAdapter;
import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.HintDataDialogFragment;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.LoadingIosDialogFragment;
import aicare.net.cn.sdk.ailinksdkdemoandroid.find.FindDeviceNewActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.TempInstrument.TempInstrumentActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.airdetector.AirDetectorActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_nutrition.BleNutritionActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.blood_pressure_tc.BloodPressureTcActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.coffee_scale.CoffeeScaleActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.fascia_gun.FasciaGunActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.food_temp.FoodTempActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.noise_meter.BleNoiseMeterActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.noise_meter.WifiBleNoiseMeterActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.share_charger.ShareChargerActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.share_condom.ShareCondomActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.share_socket.ShareSocketActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.toothbrush_test.ToothbrushTestActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.weight_scale.WeightScaleActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.CheckPermissionUtils;
import aicare.net.cn.sdk.ailinksdkdemoandroid.view.MyItemDecoration;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import cn.net.aicare.modulelibrary.module.RopeSkipping.RopeSkippingBleData;
import cn.net.aicare.modulelibrary.module.scooter.SkateboardBleConfig;

@@ -48,16 +79,24 @@ import cn.net.aicare.modulelibrary.module.scooter.SkateboardBleConfig;
* 2019/3/6<br>
* java类作用描述
*/
public class ShowBleActivity extends BleAppBaseActivity implements OnCallbackBle, OnScanFilterListener {
public class ShowBleActivity extends AppCompatActivity implements OnCallbackBle, OnScanFilterListener {

public static final int REQUEST_PERMISSION_CODE = 1500;

private static String TAG = ShowBleActivity.class.getName();

private final int BIND_SERVER_OK = 1;
private final int BIND_SERVER_ERR = 2;
private final int REFRESH_DATA = 3;
private List<String> mList;
private ArrayAdapter listAdapter;
private EditText et_cid;
private List<BleValueBean> mBleValueList;
private StringAdapter listAdapter;
private ELinkBleServer mBluetoothService;
/**
* 服务Intent
*/
private Intent bindIntent;
private Context mContext;
private int mType;
private String mNoEncryptionMac = "";
private String mFilterName = "";
@@ -65,59 +104,100 @@ public class ShowBleActivity extends BleAppBaseActivity implements OnCallbackBle
private int mCid;
private int mVid;
private int mPid;
private int mScanCid = 0;
private String mBleName;
private Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {

@Override
protected void uiHandlerMessage(Message msg) {
switch (msg.what) {
case BIND_SERVER_OK:

case BIND_SERVER_OK:

break;
break;

case REFRESH_DATA:
listAdapter.notifyDataSetChanged();
break;
case REFRESH_DATA:
if (listAdapter != null) {
listAdapter.notifyDataSetChanged();
}
break;
}
}
}
};

@Override
protected int getLayoutId() {
return R.layout.activity_show_ble;
}

@Override
protected void initData() {
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show_ble);
ActionBar supportActionBar = getSupportActionBar();
if (supportActionBar != null)
supportActionBar.setTitle(getString(R.string.app_name) + BuildConfig.VERSION_NAME);
Intent mUserService = new Intent(this.getApplicationContext(), ELinkBleServer.class);
//核心用户服务
startService(mUserService);
mContext = this;
mType = getIntent().getIntExtra("type", 0);
if (0 == mType) {
finish();
return;
}
mScanCid = mType;
init();
initData();

// 如果是蓝牙牙刷,就弹个框提醒
if (mType == BleDeviceConfig.TOOTHBRUSH_TEST) {
new AlertDialog.Builder(mContext).setMessage("启动牙刷,工作10秒钟,然后关闭牙刷(让牙刷处于广播状态),然后点击搜索,选中列表中的牙刷,开始测试").setPositiveButton("确认", null).show();
}
}

@Override
protected void initView() {
mList = new ArrayList<>();
ListView listView = findViewById(R.id.listview);
private void initData() {
bindService();

}


private void init() {

mBleValueList = new ArrayList<>();
RecyclerView recyclerView = findViewById(R.id.rv_data);
recyclerView.setLayoutManager(new LinearLayoutManager(mContext));
recyclerView.addItemDecoration(new MyItemDecoration(mContext, LinearLayoutManager.VERTICAL, 1, mContext.getResources().getColor(R.color.public_press_bg)));
Button btn = findViewById(R.id.btn);
Button btn1 = findViewById(R.id.btn1);
Button clear = findViewById(R.id.clear);
EditText et_filter_name = findViewById(R.id.et_filter_name);
EditText et_filter_mac = findViewById(R.id.et_filter_mac);
EditText et_cid = findViewById(R.id.et_cid);
et_cid.setText(String.valueOf(mScanCid));


btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mBluetoothService != null) {
BleLog.i(TAG, "搜索设备");
try {
String cidStr = et_cid.getText().toString().trim();
if (cidStr.startsWith("0x")) {
mScanCid = Integer.parseInt(cidStr, 16);
} else {
mScanCid = Integer.parseInt(cidStr);
}
} catch (NumberFormatException e) {
mScanCid = -1;
e.printStackTrace();
}
mFilterName = et_filter_name.getText().toString().trim();
mFilterMac = et_filter_mac.getText().toString().trim();
if (mType == BleDeviceConfig.SMART_SCOOTER) {
Map<String, String> map = new HashMap<>();
map.put(SkateboardBleConfig.UUID_BROADCAST.toString(), "37,3,1");//37=0x0025=电滑板的cid
mBluetoothService.scanLeDevice(0, map, BleConfig.UUID_SERVER_AILINK, SkateboardBleConfig.UUID_BROADCAST);
mBluetoothService.scanLeDevice(30 * 1000, map, BleConfig.UUID_SERVER_AILINK, SkateboardBleConfig.UUID_BROADCAST);
} else {
//0000FEE7=手表
mBluetoothService.scanLeDevice(0, BleConfig.UUID_SERVER_AILINK, UUID.fromString("0000FEE7-0000-1000-8000-00805F9B34FB"), SkateboardBleConfig.UUID_BROADCAST);
mBluetoothService.scanLeDevice(1000, BleConfig.UUID_SERVER_AILINK, UUID.fromString("0000FEE7-0000-1000-8000-00805F9B34FB"), SkateboardBleConfig.UUID_BROADCAST);
}
mList.clear();
mBleValueList.clear();
listAdapter.notifyDataSetChanged();
}
}
@@ -135,23 +215,21 @@ public class ShowBleActivity extends BleAppBaseActivity implements OnCallbackBle
@Override
public void onClick(View v) {
if (mBluetoothService != null) {
mList.clear();
mBleValueList.clear();
listAdapter.notifyDataSetChanged();
}
}
});

listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList);
listView.setAdapter(listAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
listAdapter = new StringAdapter(this, mBleValueList, new StringAdapter.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String itemStr = mList.get(position);
String mac = itemStr.split("=")[0];
String cidVidPid = itemStr.split("=")[2];
mCid = Integer.parseInt(cidVidPid.split(";")[0]);
mVid = Integer.parseInt(cidVidPid.split(";")[1]);
mPid = Integer.parseInt(cidVidPid.split(";")[2]);
public void onItemClick(int position) {
BleValueBean bleValueBean = mBleValueList.get(position);
String mac = bleValueBean.getMac();
mCid = bleValueBean.getCid();
mVid = bleValueBean.getVid();
mPid = bleValueBean.getPid();
mBleName = bleValueBean.getName();
if (mType == BleDeviceConfig.CLEAR_SHAKE_HANDS) {
//验证不握手,不加密的界面使用
BleConfig.setHandshakeStatus(mac, false);
@@ -161,22 +239,12 @@ public class ShowBleActivity extends BleAppBaseActivity implements OnCallbackBle
showLoading();
}
} else if (BleDeviceConfig.TOOTHBRUSH_WIFI_BLE == mType) {
mBluetoothService.stopScan();
Intent intent = new Intent();
intent.setClass(ShowBleActivity.this, ToothBrushWifiBleActivity.class);
intent.putExtra("type", mCid);
intent.putExtra("type", mType);
intent.putExtra("mac", mac);
startActivity(intent);
finish();

} else if (BleDeviceConfig.TOOTHBRUSH_BLE == mType) {
mBluetoothService.stopScan();
Intent intent = new Intent();
intent.setClass(ShowBleActivity.this, ToothBrushBleActivity.class);
intent.putExtra("type", mCid);
intent.putExtra("mac", mac);
startActivity(intent);
finish();
} else {
if (mCid == BleDeviceConfig.BLE_BOOLD_OXYGEN && mVid == 0x0012) {
//vid=12的不用握手校验,不加密
@@ -196,15 +264,42 @@ public class ShowBleActivity extends BleAppBaseActivity implements OnCallbackBle
if (mVid == 0x0027 && mPid == 0x0001) {
BleConfig.setHandshakeStatus(RopeSkippingBleData.LongXiang, mac, true);
}
} else if (mCid == BleDeviceConfig.LEAP_WATCH) {
// 手表不握手
BleConfig.setHandshakeStatus(mac, false);
}
if (mBluetoothService != null) {
mBluetoothService.stopScan();
mBluetoothService.connectDevice(mac);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
mBluetoothService.connectDevice(mac, BluetoothDevice.TRANSPORT_LE);
} else {
mBluetoothService.connectDevice(mac);
}
showLoading();
}
}
}

@Override
public void onLongClick(int position) {
BleValueBean bleValueBean = mBleValueList.get(position);
if (bleValueBean == null) {
return;
}
StringBuilder showData = new StringBuilder();
if (bleValueBean.getParcelUuids() != null) {
showData.append("UUID:");
for (ParcelUuid parcelUuid : bleValueBean.getParcelUuids()) {
showData.append(parcelUuid.toString().substring(0, 8)).append(";");
}
showData.append("\n");
}
String data2 = BleStrUtils.byte2HexStr(bleValueBean.getManufacturerData());
showData.append(data2);
HintDataDialogFragment.newInstance().setTitle("自定义厂商数据", 0).setContent(showData.toString(), false).setOk("", 0).show(getSupportFragmentManager());
}
});
recyclerView.setAdapter(listAdapter);


// 延迟后请求权限
@@ -218,33 +313,58 @@ public class ShowBleActivity extends BleAppBaseActivity implements OnCallbackBle
}


@Override
protected void initListener() {
//---------------------------------服务---------------------------------------------------

private void bindService() {
BleLog.i(TAG, "绑定服务");
if (bindIntent == null) {
bindIntent = new Intent(mContext, ELinkBleServer.class);
if (mFhrSCon != null) {
this.bindService(bindIntent, mFhrSCon, Context.BIND_AUTO_CREATE);
}
}
}


//---------------------------------服务---------------------------------------------------

@Override
public void onServiceSuccess() {
if (mBluetoothService!=null) {
mBluetoothService.setOnCallback(ShowBleActivity.this);
mBluetoothService.setOnScanFilterListener(ShowBleActivity.this);
mHandler.sendEmptyMessage(BIND_SERVER_OK);
private void unbindService() {
if (mBluetoothService != null) {
mBluetoothService.stopForeground();//停止前台服务
}
CallbackDisIm.getInstance().removeListener(this);
if (mFhrSCon != null) {
BleLog.i(TAG, "解绑服务");
this.unbindService(mFhrSCon);
}
CallbackDisIm.getInstance().addListListener(this);
bindIntent = null;
}

@Override
public void onServiceErr() {

}
/**
* 服务连接与界面的连接
*/
private ServiceConnection mFhrSCon = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
BleLog.i(TAG, "服务与界面建立连接成功");
//与服务建立连接
mBluetoothService = ((ELinkBleServer.BluetoothBinder) service).getService();
if (mBluetoothService != null) {
mBluetoothService.setOnCallback(ShowBleActivity.this);
mBluetoothService.setOnScanFilterListener(ShowBleActivity.this);
mBluetoothService.initForegroundService(1, R.mipmap.ic_launcher, "前台服务", MainActivity.class);
mBluetoothService.startForeground();//启动前台服务

mHandler.sendEmptyMessage(BIND_SERVER_OK);
}
}

@Override
public void unbindServices() {
CallbackDisIm.getInstance().removeListener(this);
}
@Override
public void onServiceDisconnected(ComponentName name) {
BleLog.i(TAG, "服务与界面连接断开");
//与服务断开连接
mBluetoothService = null;
}
};


@Override
@@ -252,18 +372,36 @@ public class ShowBleActivity extends BleAppBaseActivity implements OnCallbackBle

}

private long mOldRefreshTime = 0;

@Override
public void onScanning(@NonNull BleValueBean data) {
String mAddress = data.getMac();
BleLog.i(TAG, "MAC=" + mAddress + "||CID=" + data.getCid() + "||VID=" + data.getVid() + "||PID=" + data.getPid());
String dataStr = mAddress + "=" + data.getName() + "=" + data.getCid() + ";" + data.getVid() + ";" + data.getPid();
if (!mList.contains(dataStr)) {
String data1 = BleStrUtils.byte2HexStr(data.getScanRecord());
String data2 = BleStrUtils.byte2HexStr(data.getManufacturerData());
BleLog.i(TAG, "设备地址+广播数据:" + mAddress + "||" + data1 + "||" + data2);
mList.add(dataStr);
boolean oldData = false;
for (int i = 0; i < mBleValueList.size(); i++) {
BleValueBean bleValueBean = mBleValueList.get(i);
if (bleValueBean.equals(data)) {
bleValueBean.setRssi(data.getRssi());
if (!oldData) {
oldData = true;
}
listAdapter.notifyItemChanged(i);
}
}
if (!oldData) {
//不是旧设备,是新的,添加
mBleValueList.add(data);
listAdapter.notifyDataSetChanged();
} else {
// if (System.currentTimeMillis()-mOldRefreshTime>500){
// mOldRefreshTime=System.currentTimeMillis();
// listAdapter.notifyDataSetChanged();
// }
}
// String data1 = BleStrUtils.byte2HexStr(data.getScanRecord());
// String data2 = BleStrUtils.byte2HexStr(data.getManufacturerData());
// BleLog.i(TAG, "设备地址+广播数据:" + mAddress + "||" + data1 + "||" + data2);


}
@@ -288,6 +426,7 @@ public class ShowBleActivity extends BleAppBaseActivity implements OnCallbackBle
bleDevice.setA7Encryption(false);
mNoEncryptionMac = "";


}
dismissLoading();
Intent intent = new Intent();
@@ -300,6 +439,7 @@ public class ShowBleActivity extends BleAppBaseActivity implements OnCallbackBle
intent.setClass(ShowBleActivity.this, TempGunCmdActivity.class);
break;
case BleDeviceConfig.BLOOD_PRESSURE:
case BleDeviceConfig.SPHY_WIFI_BLE:
intent.setClass(ShowBleActivity.this, SphyCmdActivity.class);
break;
case BleDeviceConfig.THERMOMETER:
@@ -319,12 +459,8 @@ public class ShowBleActivity extends BleAppBaseActivity implements OnCallbackBle
intent.setClass(ShowBleActivity.this, WeightScaleWifiBleActivity.class);
break;
case BleDeviceConfig.TOOTHBRUSH_WIFI_BLE:

intent.setClass(ShowBleActivity.this, ToothBrushWifiBleActivity.class);
break;
case BleDeviceConfig.TOOTHBRUSH_BLE:
intent.setClass(ShowBleActivity.this, ToothBrushBleActivity.class);
break;
case BleDeviceConfig.EIGHT_BODY_FAT_SCALE:
intent.setClass(ShowBleActivity.this, EightBodyfatActivity.class);
break;
@@ -337,9 +473,11 @@ public class ShowBleActivity extends BleAppBaseActivity implements OnCallbackBle
case BleDeviceConfig.SMART_MASK:
intent.setClass(ShowBleActivity.this, SmartMaskActivity.class);
break;
case BleDeviceConfig.SMART_SCOOTER:
intent.setClass(ShowBleActivity.this, SkateboardDataActivity.class);

case BleDeviceConfig.SMART_SCOOTER_CM02:
intent.setClass(ShowBleActivity.this, AiLinkScooterActivity.class);
break;

case BleDeviceConfig.BLE_BOOLD_OXYGEN:
intent.setClass(ShowBleActivity.this, BloodOxygenActivity.class);
break;
@@ -373,19 +511,49 @@ public class ShowBleActivity extends BleAppBaseActivity implements OnCallbackBle
intent.setClass(ShowBleActivity.this, HeightWeightScaleActivity.class);
break;
case BleDeviceConfig.TEMP_Humidity:
case BleDeviceConfig.TEMP_Humidity_wifi:
intent.setClass(ShowBleActivity.this, TempHumidityActivity.class);
break;
case BleDeviceConfig.ROPE_SKIPPING:
intent.setClass(ShowBleActivity.this, RopeSkippingActivity.class);
break;
// case BleDeviceConfig.TOOTHBRUSH_TEST:
// // 牙刷测试
// intent.setClass(ShowBleActivity.this, ToothbrushTestActivity.class);
// break;

case BleDeviceConfig.BLE_NUTRITION_SCALE:
// 蓝牙营养秤
// intent.setClass(ShowBleActivity.this, BleNutritionActivity.class);
intent.setClass(ShowBleActivity.this, BleNutritionActivity.class);
break;
case BleDeviceConfig.TOOTHBRUSH_TEST:
// 牙刷测试
intent.setClass(ShowBleActivity.this, ToothbrushTestActivity.class);
break;
case BleDeviceConfig.FASCIA_GUN:
// 筋膜枪
intent.setClass(ShowBleActivity.this, FasciaGunActivity.class);
break;
case BleDeviceConfig.TEMP_INSTRUMENT:
// 测温仪
intent.setClass(ShowBleActivity.this, TempInstrumentActivity.class);
break;

case BleDeviceConfig.PUBLIC_BLE_NETWORK:
// 通用配网
intent.setClass(ShowBleActivity.this, PublicBleNetworkCmdActivity.class);
break;
case BleDeviceConfig.AIR_DETECTOR:
case BleDeviceConfig.MQTT_AIR_DETECTOR:
intent.setClass(ShowBleActivity.this, AirDetectorActivity.class);
break;
//wifi+ble噪音计
case BleDeviceConfig.WIFI_BLE_NOISE_METER:
intent.setClass(ShowBleActivity.this, WifiBleNoiseMeterActivity.class);
break;
//ble噪音计
case BleDeviceConfig.BLE_NOISE_METER:
intent.setClass(ShowBleActivity.this, BleNoiseMeterActivity.class);
break;

//体脂秤
case BleDeviceConfig.WEIGHT_SCALE:
intent.setClass(ShowBleActivity.this, WeightScaleActivity.class);
break;
// case BleDeviceConfig.BLD_WEIGHT:
// intent.setClass(ShowBleActivity.this, BLDWeightScaleBle.class);
@@ -402,19 +570,28 @@ public class ShowBleActivity extends BleAppBaseActivity implements OnCallbackBle
case -4:
intent.setClass(ShowBleActivity.this, TransmissionActivity.class);
break;
case -10:
// 血压计透传
intent.setClass(ShowBleActivity.this, BloodPressureTcActivity.class);
break;
case BleDeviceConfig.CLEAR_SHAKE_HANDS:
//验证不握手不加密的界面
intent.setClass(ShowBleActivity.this, ClearShakeHandsActivity.class);
break;

default:

break;

}


intent.putExtra("type", type);
intent.putExtra("mac", mac);
intent.putExtra("cid", mCid);
intent.putExtra("vid", mVid);
intent.putExtra("pid", mPid);
intent.putExtra("bleName", mBleName);
startActivity(intent);

}
@@ -434,33 +611,75 @@ public class ShowBleActivity extends BleAppBaseActivity implements OnCallbackBle
public boolean onFilter(BleValueBean bleValueBean) {
int cid = bleValueBean.getCid();
BleLog.i(TAG, "绑定设备广播类型:" + cid + "||添加的类型:" + mType);
if (mType < 0) {
if (TextUtils.isEmpty(mFilterName) && TextUtils.isEmpty(mFilterMac)) {
return true;
}
if (!TextUtils.isEmpty(mFilterName)) {
String name = bleValueBean.getName();
if (name != null && name.toUpperCase().contains(mFilterName.toUpperCase())) {
return true;
}
}
if (!TextUtils.isEmpty(mFilterMac)) {
String mac = bleValueBean.getMac().replace(":", "").toUpperCase().trim();
return mac.contains(mFilterMac.toUpperCase());
boolean nameAndMac = false;
if (TextUtils.isEmpty(mFilterName) && TextUtils.isEmpty(mFilterMac)) {
nameAndMac = true;
}
if (!TextUtils.isEmpty(mFilterName)) {
String name = bleValueBean.getName();
if (name != null && name.toUpperCase().contains(mFilterName.toUpperCase())) {
nameAndMac = true;
}
return false;
} else {
}
if (!TextUtils.isEmpty(mFilterMac)) {
String mac = bleValueBean.getMac().replace(":", "").toUpperCase().trim();
nameAndMac = mac.contains(mFilterMac.toUpperCase());
}

return mType == cid;
if (mScanCid == BleDeviceConfig.TOOTHBRUSH_TEST && nameAndMac) {
return cid == BleDeviceConfig.TOOTHBRUSH_TEST || cid == BleDeviceConfig.TOOTHBRUSH_WIFI_BLE;
}
if (mScanCid == BleDeviceConfig.TEMP_Humidity && nameAndMac) {
return cid == BleDeviceConfig.TEMP_Humidity || cid == BleDeviceConfig.TEMP_Humidity_wifi;
}
if (mScanCid == BleDeviceConfig.FOOD_TEMP && nameAndMac) {
return cid == BleDeviceConfig.FOOD_TEMP || cid == 63;
}
if (mScanCid < 0) {
return nameAndMac;
} else {
return isCheckDevice(mScanCid, Math.abs(cid), nameAndMac);
}

}


private boolean isCheckDevice(int scanCid, int cid, boolean nameAndMac) {
boolean okDevice = false;
if (scanCid == BleDeviceConfig.BLOOD_PRESSURE) {
//血压计包含wifi+bel
if (nameAndMac) {
okDevice = (scanCid == cid) || (cid == BleDeviceConfig.SPHY_WIFI_BLE);
}
} else {
okDevice = scanCid == cid && nameAndMac;
}
return okDevice;
}


@Override
public void onScanRecord(BleValueBean mBle) {
//TODO 过滤后的设备
}

@Override
public void onScanTimeOut() {

}

@Override
public void onScanErr(int type, long time) {

}

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_PERMISSION_CODE) {
checkPermission();
}
}

//--------------------------start Loading--------------------------
private LoadingIosDialogFragment mDialogFragment;
@@ -502,6 +721,7 @@ public class ShowBleActivity extends BleAppBaseActivity implements OnCallbackBle
if (mBluetoothService != null) {
mBluetoothService.stopScan();
}
unbindService();
}


@@ -511,18 +731,46 @@ public class ShowBleActivity extends BleAppBaseActivity implements OnCallbackBle
* 检查权限
*/
private void checkPermission() {
new CheckPermissionUtils(this).checkPermissions(new CheckPermissionUtils.OnPermissionListener() {
@Override
public void onPermissionsOk() {
ShowBleActivity.this.onPermissionsOk();
}
});
// 没有蓝牙权限就请求蓝牙权限
if (!hasBluetooth()) {
requestBluetooth();
return;
}
new CheckPermissionUtils(this).checkPermissions(() -> {
// 都有了,OK
Toast.makeText(mContext, "权限都有,可以开始搜索", Toast.LENGTH_SHORT).show();
// 没有定位权限就请求定位权限
if (!hasLocationPermission()) {
requestLocationPermission(this);
return;
}
// 没有定位服务就请求定位服务
if (!hasLocationService()) {
requestLocationService();
return;
}
// 都有了,OK
Toast.makeText(mContext, "权限都有,可以开始搜索", Toast.LENGTH_SHORT).show();
}

/**
* 权限ok
*/
protected void onPermissionsOk() {

});
}

/**
* 是否有定位权限
*
* @return boolean
*/
private boolean hasLocationPermission() {
return ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED;
}

/**
* 蓝牙是否打开
@@ -533,6 +781,25 @@ public class ShowBleActivity extends BleAppBaseActivity implements OnCallbackBle
return BluetoothAdapter.getDefaultAdapter().isEnabled();
}

/**
* 定位服务是否打开
*
* @return boolean
*/
private boolean hasLocationService() {
LocationManager locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
if (locationManager == null) {
return false;
}
return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
}

/**
* 申请定位权限
*/
private void requestLocationPermission(Activity activity) {
ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_PERMISSION_CODE);
}

/**
* 申请打开蓝牙
@@ -540,8 +807,14 @@ public class ShowBleActivity extends BleAppBaseActivity implements OnCallbackBle
@SuppressLint("MissingPermission")
private void requestBluetooth() {
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivity(intent);
startActivityForResult(intent, REQUEST_PERMISSION_CODE);
}


/**
* 申请打开定位服务
*/
private void requestLocationService() {
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivityForResult(intent, REQUEST_PERMISSION_CODE);
}
}

+ 2
- 3
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/SmartMaskActivity.java Dosyayı Görüntüle

@@ -19,15 +19,14 @@ import com.pingwang.bluetoothlib.listener.OnCallbackDis;
import com.pingwang.bluetoothlib.listener.OnScanFilterListener;
import com.pingwang.bluetoothlib.utils.BleLog;
import com.pingwang.bluetoothlib.utils.BleStrUtils;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;

import java.util.ArrayList;
import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import butterknife.BindView;
import butterknife.ButterKnife;
import cn.net.aicare.modulelibrary.module.SmartMask.SmartMaskBleConfig;

+ 83
- 22
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/SphyCmdActivity.java Dosyayı Görüntüle

@@ -15,7 +15,6 @@ import com.pingwang.bluetoothlib.config.CmdConfig;
import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.device.BleSendCmdUtil;
import com.pingwang.bluetoothlib.device.SendBleBean;
import com.pingwang.bluetoothlib.device.SendMcuBean;
import com.pingwang.bluetoothlib.listener.CallbackDisIm;
import com.pingwang.bluetoothlib.listener.OnBleCompanyListener;
import com.pingwang.bluetoothlib.listener.OnBleVersionListener;
@@ -41,8 +40,7 @@ import cn.net.aicare.modulelibrary.module.sphygmomanometer.SphyDeviceData;
* 2019/4/25<br>
* 血压计
*/
public class SphyCmdActivity extends BleBaseActivity implements OnCallbackDis, OnBleVersionListener
, OnMcuParameterListener, OnBleCompanyListener, View.OnClickListener {
public class SphyCmdActivity extends BleBaseActivity implements OnCallbackDis, OnBleVersionListener, OnMcuParameterListener, OnBleCompanyListener, View.OnClickListener {

private static String TAG = SphyCmdActivity.class.getName();
private final int REFRESH_DATA = 3;
@@ -54,7 +52,8 @@ public class SphyCmdActivity extends BleBaseActivity implements OnCallbackDis, O
private SphyDeviceData mBleDevice;
private String mAddress;
private BleSendCmdUtil mBleSendCmdUtil;
private int type;
private int mType;
private int mCid;
private byte unit = 0;
private Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override
@@ -76,7 +75,8 @@ public class SphyCmdActivity extends BleBaseActivity implements OnCallbackDis, O
setContentView(R.layout.activity_sphy);
mContext = this;
mAddress = getIntent().getStringExtra("mac");
type = getIntent().getIntExtra("type", -1);
mType = getIntent().getIntExtra("type", -1);
mCid = getIntent().getIntExtra("cid", -1);
mBleSendCmdUtil = BleSendCmdUtil.getInstance();
init();
}
@@ -98,10 +98,10 @@ public class SphyCmdActivity extends BleBaseActivity implements OnCallbackDis, O
});


findViewById(R.id.btn1).setOnClickListener(this);
findViewById(R.id.btnVersion).setOnClickListener(this);
findViewById(R.id.btnBattery).setOnClickListener(this);
findViewById(R.id.btn_get_did).setOnClickListener(this);
findViewById(R.id.btn_voice).setOnClickListener(this);
findViewById(R.id.clear).setOnClickListener(this);
et_type = findViewById(R.id.et_type);

@@ -142,6 +142,8 @@ public class SphyCmdActivity extends BleBaseActivity implements OnCallbackDis, O
}


private int mVoiceStatus = 0;

@Override
public void onClick(View v) {
SendBleBean sendBleBean = new SendBleBean();
@@ -158,12 +160,16 @@ public class SphyCmdActivity extends BleBaseActivity implements OnCallbackDis, O
sendBleBean.setHex(mBleSendCmdUtil.getDid());
mBleDevice.sendData(sendBleBean);
break;
case R.id.btn1:
String cmd = et_type.getText().toString().trim();
SendMcuBean sendDataBean = new SendMcuBean();
sendDataBean.setHex(type,cmd.getBytes());
mBleDevice.sendData(sendDataBean);
case R.id.btn_voice:
if (mVoiceStatus == 0) {
mVoiceStatus = 1;
}else {
mVoiceStatus=0;

}
mBleDevice.setSphyVoice(mVoiceStatus);
break;

case R.id.clear:
if (mList != null)
mList.clear();
@@ -184,6 +190,7 @@ public class SphyCmdActivity extends BleBaseActivity implements OnCallbackDis, O
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress);
if (bleDevice != null) {
mBleDevice = SphyDeviceData.getInstance(bleDevice);
mBleDevice.setType(mCid);
mBleDevice.setOnNotifyData(new NotifyData());
mBleDevice.setOnBleVersionListener(SphyCmdActivity.this);
mBleDevice.setOnMcuParameterListener(SphyCmdActivity.this);
@@ -224,7 +231,7 @@ public class SphyCmdActivity extends BleBaseActivity implements OnCallbackDis, O
@Override
public void onDisConnected(@NonNull String mac, int code) {
//TODO 连接断开
if (mAddress.equals(mac)){
if (mAddress.equals(mac)) {
BleLog.i(TAG, "连接断开");
finish();
}
@@ -256,9 +263,8 @@ public class SphyCmdActivity extends BleBaseActivity implements OnCallbackDis, O
@Override
public void onData(byte[] status, int type) {
String data = "";
if (status != null) {
if (status != null)
data = BleStrUtils.byte2HexStr(status);
}
if (type == 100) {
mList.add(TimeUtils.getTime() + "send->" + data);
} else {
@@ -269,20 +275,45 @@ public class SphyCmdActivity extends BleBaseActivity implements OnCallbackDis, O

@Override
public void getSphyCmd(byte cmd) {
mList.add(TimeUtils.getTime() + "指令:" + cmd);
String cmdStr = "";
switch (cmd) {
case SphyBleConfig.SHPY_CMD_START:
cmdStr += "开始测量";
break;
case SphyBleConfig.SHPY_CMD_STOP:
cmdStr += "停止测试";
break;
case SphyBleConfig.SHPY_CMD_MCU_START:
cmdStr += "mcu 开机";
break;
case SphyBleConfig.SHPY_CMD_MCU_STOP:
cmdStr += "mcu 关机";
break;
}
mList.add(TimeUtils.getTime() + "指令:" + cmdStr);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void getSphyVoice(byte cmd) {

String cmdStr = "";
switch (cmd) {
case 0x00:
cmdStr += "打开语音";
break;
case 0x01:
cmdStr += "关闭语音";
break;
}
mList.add(TimeUtils.getTime() + "指令:" + cmdStr);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void sphyDataNow(int dia, int sys, int decimal, int pul, int unit) {
String diaStr = BleDensityUtil.getInstance().holdDecimals(dia, decimal);
String sysStr = BleDensityUtil.getInstance().holdDecimals(sys, decimal);
mList.add(TimeUtils.getTime() + "实时:dia=" + diaStr + "sys=" + sysStr + "pul=" + pul + "unit" + "=" + unit);
mList.add(TimeUtils.getTime() + "实时:舒张压=" + diaStr + " 收缩压=" + sysStr + " 心率=" + pul + " 单位=" + (unit == 0 ? "mmhg" : "kPa"));
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@@ -290,7 +321,7 @@ public class SphyCmdActivity extends BleBaseActivity implements OnCallbackDis, O
public void sphyData(int dia, int sys, int decimal, int pul, int unit) {
String diaStr = BleDensityUtil.getInstance().holdDecimals(dia, decimal);
String sysStr = BleDensityUtil.getInstance().holdDecimals(sys, decimal);
mList.add(TimeUtils.getTime() + "稳定:dia=" + diaStr + "sys=" + sysStr + "pul=" + pul + "unit" + "=" + unit);
mList.add(TimeUtils.getTime() + "稳定:舒张压=" + diaStr + " 收缩压=" + sysStr + " 心率=" + pul + " 单位=" + (unit == 0 ? "mmhg" : "kPa"));
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@@ -316,7 +347,39 @@ public class SphyCmdActivity extends BleBaseActivity implements OnCallbackDis, O

@Override
public void getErr(byte status) {
mList.add(TimeUtils.getTime() + "错误:" + status);
String errStr = "";
switch ((int) status) {

case 0:
errStr += "未找到高压";
break;
case 1:
errStr += "无法正常加压,请检查是否插入袖带,或者重新插拔袖带气 管";
break;
case 2:
errStr += "电量低";
break;
case 3:
errStr += "传感器信号异常";
break;
case 4:
errStr += "测量结果异常";
break;
case 5:
errStr += "腕带过紧或气路堵塞";
break;
case 60:
errStr += "测量中压力干扰严重";
break;
case 7:
errStr += "压力超 290";
break;
case 8:
errStr += "标定数据异常或存储 IC 异常";
break;

}
mList.add(TimeUtils.getTime() + "错误:" + errStr);
mHandler.sendEmptyMessage(REFRESH_DATA);
}
}
@@ -342,9 +405,7 @@ public class SphyCmdActivity extends BleBaseActivity implements OnCallbackDis, O

@Override
public void onSysTime(int status, int[] times) {
String time =
times[0] + "-" + times[1] + "-" + times[2] + " " + times[3] + ":" + times[4] +
":" + times[5];
String time = times[0] + "-" + times[1] + "-" + times[2] + " " + times[3] + ":" + times[4] + ":" + times[5];
mList.add(TimeUtils.getTime() + "系统时间:" + time);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

+ 180
- 47
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TempCmdActivity.java Dosyayı Görüntüle

@@ -10,6 +10,8 @@ import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.Toast;

import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.device.BleSendCmdUtil;
@@ -24,8 +26,10 @@ import com.pingwang.bluetoothlib.utils.BleDensityUtil;
import com.pingwang.bluetoothlib.utils.BleLog;
import com.pingwang.bluetoothlib.utils.BleStrUtils;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
@@ -46,6 +50,19 @@ public class TempCmdActivity extends BleBaseActivity implements OnCallbackDis, O
private List<String> mList;
private ArrayAdapter listAdapter;

private Button btn_get_history;
private Button btn_del_history;
private Button btn_get_mode;
private Button btn_get_temp;
private Button btn_set_mode;
private Button btn_set_temp;
private RadioButton rb_single;
private RadioButton rb_c;
private EditText et_temp;
private EditText et_history;

private int stamp = 0;// 历史记录最新一条的时间戳

/**
* 服务Intent
*/
@@ -73,12 +90,13 @@ public class TempCmdActivity extends BleBaseActivity implements OnCallbackDis, O
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_temp_gun);
setContentView(R.layout.activity_temp);
mContext = this;
mAddress = getIntent().getStringExtra("mac");
type = getIntent().getIntExtra("type", -1);
mBleSendCmdUtil = BleSendCmdUtil.getInstance();
init();

}

private void init() {
@@ -94,6 +112,24 @@ public class TempCmdActivity extends BleBaseActivity implements OnCallbackDis, O
findViewById(R.id.clear).setOnClickListener(this);
et_type = findViewById(R.id.et_type);

btn_get_history = findViewById(R.id.btn_get_history);
btn_get_mode = findViewById(R.id.btn_get_mode);
btn_get_temp = findViewById(R.id.btn_get_temp);
btn_set_mode = findViewById(R.id.btn_set_mode);
btn_set_temp = findViewById(R.id.btn_set_temp);
rb_single = findViewById(R.id.rb_single);
rb_c = findViewById(R.id.rb_c);
et_temp = findViewById(R.id.et_temp);
et_history = findViewById(R.id.et_history);
btn_del_history = findViewById(R.id.btn_del_history);

btn_get_history.setOnClickListener(this);
btn_del_history.setOnClickListener(this);
btn_get_mode.setOnClickListener(this);
btn_get_temp.setOnClickListener(this);
btn_set_mode.setOnClickListener(this);
btn_set_temp.setOnClickListener(this);

cmdBtn();
}

@@ -104,10 +140,10 @@ public class TempCmdActivity extends BleBaseActivity implements OnCallbackDis, O
@Override
public void onClick(View v) {
if (unit == 0) {
unit=1;
unit = 1;
mBleDevice.setUnit((byte) 1);
} else {
unit=0;
unit = 0;
mBleDevice.setUnit((byte) 0);
}
}
@@ -118,7 +154,7 @@ public class TempCmdActivity extends BleBaseActivity implements OnCallbackDis, O
@Override
public void onClick(View v) {
SendBleBean sendBleBean = new SendBleBean();
switch (v.getId()){
switch (v.getId()) {
case R.id.btnVersion:
sendBleBean.setHex(mBleSendCmdUtil.getBleVersion());
mBleDevice.sendData(sendBleBean);
@@ -134,7 +170,7 @@ public class TempCmdActivity extends BleBaseActivity implements OnCallbackDis, O
case R.id.btn1:
String cmd = et_type.getText().toString().trim();
SendMcuBean sendDataBean = new SendMcuBean();
sendDataBean.setHex(type,cmd.getBytes());
sendDataBean.setHex(type, cmd.getBytes());
mBleDevice.sendData(sendDataBean);
break;
case R.id.clear:
@@ -142,6 +178,54 @@ public class TempCmdActivity extends BleBaseActivity implements OnCallbackDis, O
mList.clear();
mHandler.sendEmptyMessage(REFRESH_DATA);
break;
case R.id.btn_get_history:
// 读取历史记录
// try {
// int size = Integer.parseInt(et_history.getText().toString());
// mBleDevice.getHistory(size, stamp);
// } catch (Exception ignored) {}
try {
String time = et_history.getText().toString();
if (time.isEmpty()) {
mBleDevice.getHistoryNew(0);
} else {
mBleDevice.getHistoryNew(Long.parseLong(time));
}
} catch (Exception e) {
Toast.makeText(this, "请按规则来", Toast.LENGTH_SHORT).show();
}

break;
case R.id.btn_get_mode:
// 获取设备测温模式
mBleDevice.getMode();
break;
case R.id.btn_get_temp:
// 获取高温报警值
mBleDevice.getTemp();
break;
case R.id.btn_set_mode:
// 设置设备测温模式
if (rb_single.isChecked()) {
mBleDevice.setMode(0);
} else {
mBleDevice.setMode(1);
}
break;
case R.id.btn_set_temp:
// 设置高温报警值
String tempStr = et_temp.getText().toString();
if (!tempStr.isEmpty()) {
if (rb_c.isChecked()) {
mBleDevice.setTemp(tempStr, 0);
} else {
mBleDevice.setTemp(tempStr, 1);
}
}
break;
case R.id.btn_del_history:
mBleDevice.delHistoryNew();
break;
}
}

@@ -160,6 +244,16 @@ public class TempCmdActivity extends BleBaseActivity implements OnCallbackDis, O
mBleDevice.setOnBleVersionListener(TempCmdActivity.this);
mBleDevice.setOnMcuParameterListener(TempCmdActivity.this);
mBleDevice.setOnCompanyListener(TempCmdActivity.this);

mHandler.postDelayed(() -> {
if (isDestroyed() || isFinishing()) {
return;
}
int stamp = (int) (System.currentTimeMillis() / 1000);
mList.add("同步Unix时间戳:" + stamp);
mHandler.sendEmptyMessage(REFRESH_DATA);
mBleDevice.setUnixStampNew(stamp);
}, 200);
}
}
}
@@ -174,10 +268,10 @@ public class TempCmdActivity extends BleBaseActivity implements OnCallbackDis, O
@Override
public void unbindServices() {
CallbackDisIm.getInstance().removeListener(this);
if (mBleDevice!=null){
if (mBleDevice != null) {
mBleDevice.disconnect();
mBleDevice.clear();
mBleDevice=null;
mBleDevice = null;
}
}

@@ -219,96 +313,135 @@ public class TempCmdActivity extends BleBaseActivity implements OnCallbackDis, O

//-----------------通知-------------------

private class NotifyData implements TempDeviceData.onNotifyData {
private long lastTime;

private class NotifyData implements TempDeviceData.onNotifyData {
@Override
public void mcuHistory(int maxSize, int curSize, List<TempDeviceData.HistoryBean> list) {

public void onData(byte[] status, int type) {
String data = "";
if (status != null)
data = BleStrUtils.byte2HexStr(status);
if (type == 100) {
mList.add(TimeUtils.getTime() + "send->" + data);
} else {
mList.add(TimeUtils.getTime() + "notify->" + data);
}
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void mcuGetMode(int mode) {
public void temp(int temp, int decimal, byte tempUnit) {
String tempStr = BleDensityUtil.getInstance().holdDecimals(temp, decimal);
mList.add(TimeUtils.getTime() + "稳定:TEMP=" + tempStr + ",tempUnit=" + tempUnit);
mHandler.sendEmptyMessage(REFRESH_DATA);

}

@Override
public void mcuSetMode(int status) {
public void tempNow(int temp, int decimal, byte tempUnit) {
String tempStr = BleDensityUtil.getInstance().holdDecimals(temp, decimal);
mList.add(TimeUtils.getTime() + "实时:TEMP=" + tempStr + ",tempUnit=" + tempUnit);
mHandler.sendEmptyMessage(REFRESH_DATA);

}

@Override
public void mcuGetTemp(int temp, int unit, int decimal) {

public void getUnit(byte status) {
mList.add(TimeUtils.getTime() + "单位:" + status);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void mcuSetTemp(int status) {

public void getErr(byte status) {
mList.add(TimeUtils.getTime() + "错误:" + status);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void mcuSetUnixStamp(int status) {

public void mcuHistory(int maxSize, int curSize, List<TempDeviceData.HistoryBean> list) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);
String str = "MCU上发历史记录:\n总条数:" + maxSize + ";此次发送:" + curSize;
for (int i = 0; i < list.size(); i++) {
TempDeviceData.HistoryBean bean = list.get(i);
str += "\n";
str += i + ":" + sdf.format(bean.getStamp());
str += "\n温度值:" + bean.getTemp() + ";单位:" + bean.getUnit() + ";小数点:" + bean.getDecimal();

// 把最新的一条时间戳保存起来
if (i == list.size() - 1) {
stamp = bean.getStamp();
}
}
mList.add(str);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onHistoryNum(long allNum, long sendNum) {

public void mcuGetMode(int mode) {
String str = "MCU回复当前测温模式:" + mode;
mList.add(str);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onHistory(long time, byte[] value) {

public void mcuSetMode(int status) {
String str = "MCU回复设置当前测温模式结果:" + status;
mList.add(str);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onHistoryLast(long time) {

public void mcuGetTemp(int temp, int unit, int decimal) {
String str = "MCU回复高温报警值:";
str += "\n温度值:" + temp + ";单位:" + unit + ";小数点:" + decimal;
mList.add(str);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onDelHistory(int result) {

public void mcuSetTemp(int status) {
String str = "MCU回复设置高温报警值结果:" + status;
mList.add(str);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onData(byte[] status,int type) {
String data = "";
if (status != null)
data = BleStrUtils.byte2HexStr(status);
if (type == 100) {
mList.add(TimeUtils.getTime() + "send->" + data);
} else {
mList.add(TimeUtils.getTime() + "notify->" + data);
}
public void mcuSetUnixStamp(int status) {
String str = "MCU回复设置Unix时间戳结果:" + status;
mList.add(str);
mHandler.sendEmptyMessage(REFRESH_DATA);
}


@Override
public void temp(int temp, int decimal, byte tempUnit) {
String tempStr= BleDensityUtil.getInstance().holdDecimals(temp,decimal);
mList.add(TimeUtils.getTime() + "稳定:TEMP=" + tempStr + "tempUnit=" + tempUnit);
public void onHistoryNum(long allNum, long sendNum) {
if (allNum == sendNum) {
//这里在前那一次数据
mList.add(TimeUtils.getTime() + "历史记录获取完成");
} else {
mList.add(TimeUtils.getTime() + "历史记录获取未完成: 下次获取时间: " + lastTime);
mBleDevice.getHistoryNew(lastTime);
}
mHandler.sendEmptyMessage(REFRESH_DATA);

}

@Override
public void tempNow(int temp, int decimal, byte tempUnit) {
String tempStr= BleDensityUtil.getInstance().holdDecimals(temp,decimal);
mList.add(TimeUtils.getTime() + "实时:TEMP=" + tempStr + "tempUnit=" + tempUnit);
public void onHistory(long time, byte[] value) {
mList.add(TimeUtils.getTime() + "历史记录: " + TimeUtils.getTime(time*1000) + " 数据: " + BleStrUtils.byte2HexStr(value));
mHandler.sendEmptyMessage(REFRESH_DATA);

}

@Override
public void getUnit(byte status) {
mList.add(TimeUtils.getTime() + "单位:" + status);
public void onHistoryLast(long time) {
lastTime = time;
mList.add(TimeUtils.getTime() + "最新一条历史记录: 时间" + time);
et_history.setText(lastTime+"");
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void getErr(byte status) {
mList.add(TimeUtils.getTime() + "错误:" + status);
public void onDelHistory(int result) {
mList.add(TimeUtils.getTime() + "删除历史记录结果: " + (result == 0 ? "成功" : "失败"));
mHandler.sendEmptyMessage(REFRESH_DATA);
}
}

+ 4
- 5
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TempGunCmdActivity.java Dosyayı Görüntüle

@@ -12,9 +12,6 @@ import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.device.BleSendCmdUtil;
import com.pingwang.bluetoothlib.device.SendBleBean;
@@ -27,12 +24,14 @@ import com.pingwang.bluetoothlib.listener.OnMcuParameterListener;
import com.pingwang.bluetoothlib.utils.BleDensityUtil;
import com.pingwang.bluetoothlib.utils.BleLog;
import com.pingwang.bluetoothlib.utils.BleStrUtils;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;

import java.util.ArrayList;
import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.foreheadgun.TempGunDeviceData;



+ 27
- 4
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TempHumidityActivity.java Dosyayı Görüntüle

@@ -9,19 +9,18 @@ import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.listener.OnCallbackBle;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;

import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.TempHumidity.TempHumidityBleUtils;

/**
@@ -93,6 +92,10 @@ public class TempHumidityActivity extends BleBaseActivity implements OnCallbackB
findViewById(R.id.btn_hear).setOnClickListener(this);
findViewById(R.id.btn_show_history).setOnClickListener(this);
findViewById(R.id.btn_clear).setOnClickListener(this);
findViewById(R.id.btn_interval_one).setOnClickListener(this);
findViewById(R.id.btn_interval_three).setOnClickListener(this);
findViewById(R.id.btn_interval_five).setOnClickListener(this);
findViewById(R.id.btn_ota).setOnClickListener(this);


listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, logList);
@@ -238,6 +241,26 @@ public class TempHumidityActivity extends BleBaseActivity implements OnCallbackB
listAdapter.notifyDataSetChanged();
historyListAdapter.notifyDataSetChanged();
break;
case R.id.btn_interval_one:
logList.add(0, "上报间隔1分钟");
TempHumidityBleUtils.getInstance().setReportTime(60);
listAdapter.notifyDataSetChanged();
break;
case R.id.btn_interval_three:
logList.add(0, "上报间隔3分钟");
TempHumidityBleUtils.getInstance().setReportTime(180);
listAdapter.notifyDataSetChanged();
break;
case R.id.btn_interval_five:
logList.add(0, "上报间隔5分钟");
TempHumidityBleUtils.getInstance().setReportTime(300);
listAdapter.notifyDataSetChanged();
break;
case R.id.btn_ota:
logList.add(0, "请求ota");
TempHumidityBleUtils.getInstance().ota();
listAdapter.notifyDataSetChanged();
break;
}
}
}

+ 61
- 25
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TestCmdActivity.java Dosyayı Görüntüle

@@ -10,33 +10,39 @@ import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import android.widget.TextView;

import com.pingwang.bluetoothlib.config.BleConfig;
import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.device.SendDataBean;
import com.pingwang.bluetoothlib.listener.CallbackDisIm;
import com.pingwang.bluetoothlib.listener.OnBleDeviceDataListener;
import com.pingwang.bluetoothlib.listener.OnBleOtherDataListener;
import com.pingwang.bluetoothlib.listener.OnCallbackDis;
import com.pingwang.bluetoothlib.utils.BleLog;
import com.pingwang.bluetoothlib.utils.BleStrUtils;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import com.pingwang.bluetoothlib.utils.UuidUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.UUID;

import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;


/**
* xing<br>
* 2019/4/25<br>
* 测试指令界面
*/
public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, OnBleDeviceDataListener, View.OnClickListener {
public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, OnBleDeviceDataListener, View.OnClickListener, OnBleOtherDataListener {

private TextView tv_receive_number;
private TextView tv_send_number;

private static String TAG = TestCmdActivity.class.getName();
private final int REFRESH_DATA = 3;
@@ -52,6 +58,9 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O
private UUID sendUuidServer = null;
private String uuidEnd = "-0000-1000-8000-00805F9B34FB";
private String sendCmd;
private long mSendNumber = 0;
private long mReceiveNumber = 0;
private boolean mShowLog = true;
private Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
@@ -68,8 +77,13 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O
if (sendUuid != null && sendUuidServer != null) {
SendDataBean sendDataBean = new SendDataBean(sendCmd.getBytes(), sendUuid, BleConfig.WRITE_DATA, sendUuidServer);
bleDevice.sendData(sendDataBean);
mHandler.sendEmptyMessageDelayed(SEND_DATA, sendTime);
if (sendTime > 0) {
mHandler.sendEmptyMessageDelayed(SEND_DATA, sendTime);
}
mSendNumber += sendDataBean.getHex().length;
tv_send_number.setText(String.valueOf(mSendNumber));
}

break;
}
}
@@ -98,12 +112,15 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O
findViewById(R.id.btn_notify).setOnClickListener(this);
findViewById(R.id.btn_notify_status).setOnClickListener(this);
findViewById(R.id.btn_uuid_server).setOnClickListener(this);
findViewById(R.id.btn_log).setOnClickListener(this);

et_cmd = findViewById(R.id.et_cmd);
et_uuid = findViewById(R.id.et_uuid);
et_time = findViewById(R.id.et_time);
et_notify = findViewById(R.id.et_notify);
et_uuid_server = findViewById(R.id.et_uuid_server);
tv_receive_number = findViewById(R.id.tv_receive_number);
tv_send_number = findViewById(R.id.tv_send_number);
}


@@ -122,40 +139,38 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O
case R.id.clear:
if (mList != null)
mList.clear();
mSendNumber=0;
mReceiveNumber = 0;
tv_receive_number.setText("0");
tv_send_number.setText("0");
mHandler.sendEmptyMessage(REFRESH_DATA);
break;

case R.id.btn_uuid:
String uuid = et_uuid.getText().toString().trim().toUpperCase(Locale.ENGLISH);
if (uuid.length() == 8) {
uuid += uuidEnd;
}
sendUuid = UUID.fromString(uuid);
sendUuid = UuidUtils.getUuid(uuid);
break;
case R.id.btn_uuid_server:
String uuidServer = et_uuid_server.getText().toString().trim().toUpperCase(Locale.ENGLISH);
if (uuidServer.length() == 8) {
uuidServer += uuidEnd;
}
sendUuidServer = UUID.fromString(uuidServer);
sendUuidServer = UuidUtils.getUuid(uuidServer);
break;
case R.id.btn_time:
String time = et_time.getText().toString().trim().toUpperCase(Locale.ENGLISH);
sendTime = Integer.valueOf(time);
sendTime = Integer.parseInt(time);
break;

case R.id.btn_notify:
String notify = et_notify.getText().toString().trim().toUpperCase(Locale.ENGLISH);
if (notify.length() == 8) {
notify += uuidEnd;
}
readNotify(notify, mNotify);
break;
case R.id.btn_notify_status:
mNotify = !mNotify;
((Button) v).setText("" + mNotify);
break;

case R.id.btn_log:
mShowLog = !mShowLog;
((Button) v).setText("log:" + (mShowLog ? "Y" : "N"));
break;

}
}
@@ -166,15 +181,17 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O
* 设置通知
*/
private void readNotify(String notify, boolean notifyOpen) {
UUID UUID_NOTIFY = UUID.fromString(notify);
UUID uuidNotify = UuidUtils.getUuid(notify);
if (bleDevice != null && sendUuidServer != null) {
// bleDevice.setNotify(notifyOpen);
if (notifyOpen) {
bleDevice.setNotify(sendUuidServer, UUID_NOTIFY);
bleDevice.setNotify(sendUuidServer, uuidNotify);
} else {
bleDevice.setCloseNotify(sendUuidServer, UUID_NOTIFY);
bleDevice.setCloseNotify(sendUuidServer, uuidNotify);
}

} else {
mList.add(TimeUtils.getTime() + "请先设置特征UUID和服务UUID");
mHandler.sendEmptyMessage(REFRESH_DATA);
}
}

@@ -189,7 +206,8 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O
bleDevice = mBluetoothService.getBleDevice(mAddress);
CallbackDisIm.getInstance().addListListener(this);
if (bleDevice != null) {

bleDevice.setOnBleOtherDataListener(this);
bleDevice.setOnBleDeviceDataListener(this);

}
}
@@ -250,8 +268,12 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O
//-----------------通知-------------------



@Override
public void onNotifyData(byte[] hex, int type) {
if (!mShowLog) {
return;
}
String data = "";
if (hex != null)
data = BleStrUtils.byte2HexStr(hex);
@@ -259,10 +281,24 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O
mList.add(TimeUtils.getTime() + "send->" + data);
} else {
mList.add(TimeUtils.getTime() + "notify->" + data);
mReceiveNumber += hex.length;
tv_receive_number.setText(String.valueOf(mReceiveNumber));
}
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onNotifyOtherData(byte[] hex) {
if (mShowLog) {
String data = "";
if (hex != null)
data = BleStrUtils.byte2HexStr(hex);
mList.add(TimeUtils.getTime() + "notify->" + data);
mHandler.sendEmptyMessage(REFRESH_DATA);
}
mReceiveNumber += hex.length;
tv_receive_number.setText(String.valueOf(mReceiveNumber));
}

@Override
protected void onDestroy() {

+ 2
- 4
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ToothBrushBleActivity.java Dosyayı Görüntüle

@@ -12,13 +12,10 @@ import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

import androidx.annotation.Nullable;

import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.listener.OnCallbackBle;
import com.pingwang.bluetoothlib.utils.BleLog;
import com.pingwang.bluetoothlib.utils.BleStrUtils;

import java.lang.ref.WeakReference;
import java.util.ArrayList;
@@ -27,6 +24,7 @@ import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.ToothBrush.ToothBrushBleCmd;

/**
@@ -59,7 +57,7 @@ public class ToothBrushBleActivity extends BleBaseActivity implements View.OnCli
select_gears_et = findViewById(R.id.select_gears_et);

mAddress = getIntent().getStringExtra("mac");
type = getIntent().getIntExtra("type", BleDeviceConfig.TOOTHBRUSH_BLE);
type = getIntent().getIntExtra("type", BleDeviceConfig.TOOTHBRUSH_TEST);
mList = new ArrayList<>();
ListView listView = findViewById(R.id.log_list);
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList);

+ 21
- 15
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ToothBrushBleUtilsData.java Dosyayı Görüntüle

@@ -38,15 +38,17 @@ public class ToothBrushBleUtilsData extends BaseBleDeviceData {
@Override
public void onBmVersion(String version) {
//蓝牙版本号
if (bleToothBrushCallback != null)
if (bleToothBrushCallback != null) {
bleToothBrushCallback.onVersion(version);
}
}
});
bleDevice.setOnMcuParameterListener(new OnMcuParameterListener() {
@Override
public void onMcuBatteryStatus(int status, int battery) {
if (bleToothBrushCallback != null)
if (bleToothBrushCallback != null) {
bleToothBrushCallback.onGetBattery(status, battery);
}
}
});
mBleDevice.setOnBleOtherDataListener(new OnBleOtherDataListener() {
@@ -89,8 +91,9 @@ public class ToothBrushBleUtilsData extends BaseBleDeviceData {

@Override
public void onNotifyData(byte[] bytes, int type) {
if (bleToothBrushCallback != null)
if (bleToothBrushCallback != null) {
bleToothBrushCallback.onShowData("蓝牙返回的A7: " + BleStrUtils.byte2HexStr(bytes));
}
switch (bytes[0]) {
case ToothBrushBleCmd.GET_TOOTHBRUSH_TIME_GEARS:
if (bytes.length >= 5) {
@@ -103,14 +106,14 @@ public class ToothBrushBleUtilsData extends BaseBleDeviceData {
}
break;
case ToothBrushBleCmd.SET_TOOTHBRUSH_TIME_GEARS:
case ToothBrushBleCmd.Set_Manual_Mode:
case ToothBrushBleCmd.SET_MANUAL_MODE:
if (bytes.length >= 2) {
if (bleToothBrushCallback != null)
bleToothBrushCallback.onSetDefaultModeAndManualModeResult(bytes[0], bytes[1] & 0xff);

}
break;
case ToothBrushBleCmd.Get_Manual_Mode:
case ToothBrushBleCmd.GET_MANUAL_MODE:
if (bytes.length >= 7) {
int hzH = (bytes[2] & 0xff) << 8;
int hzl = bytes[3] & 0xff;
@@ -122,7 +125,7 @@ public class ToothBrushBleUtilsData extends BaseBleDeviceData {
}
}
break;
case (byte) ToothBrushBleCmd.Brush_Teeth_to_Complete:
case (byte) ToothBrushBleCmd.BRUSH_TEETH_TO_COMPLETE:
if (bytes.length >= 9) {
int mode = bytes[1] & 0xff;
int timeH = (bytes[2] & 0xff) << 8;
@@ -138,14 +141,14 @@ public class ToothBrushBleUtilsData extends BaseBleDeviceData {
}

break;
case ToothBrushBleCmd.The_Trial_Order:
case ToothBrushBleCmd.THE_TRIAL_ORDER:
//试用指令
if (bytes.length >= 2)
if (bleToothBrushCallback != null) {
bleToothBrushCallback.onTryOutResult(bytes[1] & 0xff);
}
break;
case ToothBrushBleCmd.Get_Second_GEARS:
case ToothBrushBleCmd.GET_SECOND_GEARS:
if (bytes.length >= 2)
if (bleToothBrushCallback != null) {
bleToothBrushCallback.onTwoLevelModeDefault(bytes[1] & 0xff);
@@ -158,8 +161,9 @@ public class ToothBrushBleUtilsData extends BaseBleDeviceData {

@Override
public void onNotifyDataA6(byte[] hex) {
if (bleToothBrushCallback != null)
if (bleToothBrushCallback != null) {
bleToothBrushCallback.onShowData("蓝牙返回的A6: " + BleStrUtils.byte2HexStr(hex));
}
switch (hex[0]) {
case (byte) ToothBrushBleCmd.GET_TOOTHBRUSH_GEARS:
disposeSupportGears(hex);
@@ -191,8 +195,9 @@ public class ToothBrushBleUtilsData extends BaseBleDeviceData {
}

}
if (bleToothBrushCallback != null)
if (bleToothBrushCallback != null) {
bleToothBrushCallback.onGetSupportGears(stairs, secondLevels);
}
}


@@ -379,7 +384,7 @@ public class ToothBrushBleUtilsData extends BaseBleDeviceData {
*/
public void setTryOut(int id, int level, int hz, int duty) {
byte[] bytes = new byte[14];
bytes[0] = ToothBrushBleCmd.The_Trial_Order;
bytes[0] = ToothBrushBleCmd.THE_TRIAL_ORDER;
bytes[1] = (byte) id;
bytes[2] = (byte) level;
bytes[3] = (byte) 0xff;
@@ -443,7 +448,7 @@ public class ToothBrushBleUtilsData extends BaseBleDeviceData {
*/
public void getTwoLevelDefault() {
byte[] bytes = new byte[1];
bytes[0] = ToothBrushBleCmd.Get_Second_GEARS;
bytes[0] = ToothBrushBleCmd.GET_SECOND_GEARS;
sendA7(bytes);
}

@@ -465,7 +470,7 @@ public class ToothBrushBleUtilsData extends BaseBleDeviceData {
*/
public void setManualParameter(int hz, int duty, int time) {
byte[] bytes = new byte[7];
bytes[0] = ToothBrushBleCmd.Set_Manual_Mode;
bytes[0] = ToothBrushBleCmd.SET_MANUAL_MODE;
bytes[1] = 0x00;
bytes[2] = (byte) (hz >> 8);
bytes[3] = (byte) hz;
@@ -482,7 +487,7 @@ public class ToothBrushBleUtilsData extends BaseBleDeviceData {
*/
public void getManualParameter() {
byte[] bytes = new byte[1];
bytes[0] = ToothBrushBleCmd.Get_Manual_Mode;
bytes[0] = ToothBrushBleCmd.GET_MANUAL_MODE;

sendA7(bytes);

@@ -526,8 +531,9 @@ public class ToothBrushBleUtilsData extends BaseBleDeviceData {
* @param bytes
*/
public void sendA6(byte[] bytes) {
if (sendBleBean == null)
if (sendBleBean == null) {
sendBleBean = new SendBleBean();
}
sendBleBean.setHex(bytes);
sendData(sendBleBean);
}

+ 3
- 3
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ToothBrushWifiBleActivity.java Dosyayı Görüntüle

@@ -17,8 +17,6 @@ import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.listener.OnCallbackBle;
import com.pingwang.bluetoothlib.utils.BleLog;
import com.pingwang.bluetoothlib.utils.BleStrUtils;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.WifiDialog;

import java.lang.ref.WeakReference;
import java.util.ArrayList;
@@ -26,6 +24,8 @@ import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.WifiDialog;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.ToothBrush.ToothBrushBleCmd;
import cn.net.aicare.modulelibrary.module.ToothBrush.ToothBrushWiFiBleUtilsData;
@@ -361,7 +361,7 @@ public class ToothBrushWifiBleActivity extends BleBaseActivity implements View.O
break;
case R.id.default_time_mode:

mToothBrushWiFiBleUtilsData.getdefaultGearAndDuration();
mToothBrushWiFiBleUtilsData.getDefaultGearAndDuration();
break;

case R.id.ota:

+ 4
- 5
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TpmsConnectCmdActivity.java Dosyayı Görüntüle

@@ -12,9 +12,6 @@ import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.device.BleSendCmdUtil;
import com.pingwang.bluetoothlib.device.SendBleBean;
@@ -26,12 +23,14 @@ import com.pingwang.bluetoothlib.listener.OnCallbackDis;
import com.pingwang.bluetoothlib.listener.OnMcuParameterListener;
import com.pingwang.bluetoothlib.utils.BleLog;
import com.pingwang.bluetoothlib.utils.BleStrUtils;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;

import java.util.ArrayList;
import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.tpms.TpmsDeviceData;



+ 52
- 10
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TransmissionActivity.java Dosyayı Görüntüle

@@ -4,23 +4,27 @@ import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;

import com.pingwang.bluetoothlib.bean.SupportUnitBean;
import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.device.BleSendCmdUtil;
import com.pingwang.bluetoothlib.listener.OnCallbackBle;
import com.pingwang.bluetoothlib.utils.BleDataUtils;
import com.pingwang.bluetoothlib.utils.BleStrUtils;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;

import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.Transmission.TransmissionDeviceData;

@@ -28,8 +32,10 @@ import cn.net.aicare.modulelibrary.module.Transmission.TransmissionDeviceData;
* 透传界面
*/
public class TransmissionActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, TransmissionDeviceData.MyBleCallback {
private EditText et, et_cid;
private Button send, bt_clear, bt_clear_log,bt_cid;

private TextView tv_device_info;
private EditText et, et_cid,et_a6,et_customize,et_name;
private Button send,send_a6, bt_clear, bt_clear_log,bt_cid,send_customize;
private ListView mListView;
private List<String> mlogList;
private final int ToRefreUi = 1;
@@ -48,7 +54,9 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic
mBluetoothService.setOnCallback(this);
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress);
if (bleDevice != null) {

if (tv_device_info!=null) {
tv_device_info.setText("MAC:"+bleDevice.getMac());
}
mTransmissionDeviceData = new TransmissionDeviceData(bleDevice);
mTransmissionDeviceData.setMyBleCallback(this);

@@ -71,18 +79,28 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//禁止横屏
//禁止横屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
setContentView(R.layout.activity_transmission);
WeakReference weakReference = new WeakReference(new MHandler());
mMHandler = (MHandler) weakReference.get();
tv_device_info = findViewById(R.id.tv_device_info);
et = findViewById(R.id.et);
et_a6 = findViewById(R.id.et_a6);
et_cid = findViewById(R.id.et_cid);
bt_cid = findViewById(R.id.bt_cid);
send = findViewById(R.id.send);
send_a6 = findViewById(R.id.send_a6);
et_customize = findViewById(R.id.et_customize);
send_customize = findViewById(R.id.send_customize);
et_name = findViewById(R.id.et_name);
bt_clear = findViewById(R.id.bt_clear);
bt_clear_log = findViewById(R.id.bt_clear_log);
mListView = findViewById(R.id.listview);
send.setOnClickListener(this);
send_a6.setOnClickListener(this);
send_customize.setOnClickListener(this);
findViewById(R.id.send_name).setOnClickListener(this);
bt_clear.setOnClickListener(this);
bt_cid.setOnClickListener(this);
bt_clear_log.setOnClickListener(this);
@@ -115,6 +133,28 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic
if (mTransmissionDeviceData != null) {
mTransmissionDeviceData.getCid();
}
}else if (id == R.id.send_a6) {
String hex = et_a6.getText().toString().toUpperCase().trim();
if (!TextUtils.isEmpty(hex)) {
byte[] hexStr = BleStrUtils.stringToByte(hex);
if (mTransmissionDeviceData != null) {
mTransmissionDeviceData.setSendDataA6( hexStr);
}
}
}else if (id == R.id.send_customize) {
String hex = et_customize.getText().toString().toUpperCase().trim();
if (!TextUtils.isEmpty(hex)) {
byte[] hexStr = BleStrUtils.stringToByte(hex);
if (mTransmissionDeviceData != null) {
mTransmissionDeviceData.setSendDataCustomize( hexStr);
}
}
}else if (id == R.id.send_name) {
String name = et_name.getText().toString().trim();
if (!TextUtils.isEmpty(name)) {
byte[] names = BleDataUtils.getInstance().getBleName(name);
mTransmissionDeviceData.setSendDataA6(BleSendCmdUtil.getInstance().setBleName(names));
}
}
}

@@ -125,13 +165,10 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic

@Override
public void showData(String data, int type) {

mlogList.add(0, "收 payload数据" + TimeUtils.getTime() +"cid=" + type + "\n" + data);
mMHandler.sendEmptyMessage(ToRefreUi);
}



@Override
public void onSupportUnit(List<SupportUnitBean> list) {

@@ -145,7 +182,6 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic

@Override
public void otherData(byte[] hex, String data) {

mlogList.add(0, "收 透传数据" + TimeUtils.getTime() + data);
mMHandler.sendEmptyMessage(ToRefreUi);
}
@@ -157,6 +193,8 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic
}




private class MHandler extends Handler {
@Override
public void handleMessage(Message msg) {
@@ -168,6 +206,10 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic
}
break;

default:

break;

}
}
}

+ 1
- 2
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/WeightScaleBleActivity.java Dosyayı Görüntüle

@@ -360,9 +360,8 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl
@Override
public void requestSynTime() {
mlogList.add(0, "同步时间");
if (bodyFatBleUtilsData != null) {
if (bodyFatBleUtilsData != null)
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().synTime());
}
}

@Override

+ 4
- 5
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/WifiConfigActivity.java Dosyayı Görüntüle

@@ -18,11 +18,6 @@ import android.widget.EditText;
import android.widget.ListView;
import android.widget.RadioButton;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
@@ -37,6 +32,10 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import cn.net.aicare.modulelibrary.module.wifi.WifiConfig;
import cn.net.aicare.modulelibrary.module.wifi.WifiUtils;


+ 127
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/adapter/StringAdapter.java Dosyayı Görüntüle

@@ -0,0 +1,127 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.adapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.pingwang.bluetoothlib.bean.BleValueBean;

import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

/**
* xing<br>
* 2019/8/24<br>
* 列表适配器<br>
*/
public class StringAdapter extends RecyclerView.Adapter<StringAdapter.KeyViewHolder> {

private List<BleValueBean> mList;
private OnItemClickListener listener;
private Context mContext;

public interface OnItemClickListener {
void onItemClick(int position);
void onLongClick(int position);
}


public StringAdapter(Context context, List<BleValueBean> list, OnItemClickListener listener) {
mList = list;
this.listener = listener;
mContext = context;
}


@NonNull
@Override
public KeyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.item_string_list, parent, false);

return new KeyViewHolder(view, listener);
}

@Override
public void onBindViewHolder(@NonNull KeyViewHolder holder, int position) {
BleValueBean data = mList.get(position);
String showData=data.getMac()+"="+data.getName()+"=" + data.getCid() + ";" + data.getVid() + ";" + data.getPid()+"="+data.getRssi();
holder.mTvTitle.setText(showData);
holder.mTvTitle.setOnClickListener(v -> {
if (listener != null)
listener.onItemClick(position);
});

holder.mTvTitle.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (listener != null)
listener.onLongClick(position);
return true;
}
});
}

@Override
public int getItemCount() {
return mList.size();
}


static class KeyViewHolder extends RecyclerView.ViewHolder {

private TextView mTvTitle;

KeyViewHolder(@NonNull View itemView, final OnItemClickListener listener) {
super(itemView);
mTvTitle = itemView.findViewById(R.id.tv_list_data);

// itemView.setOnClickListener(v -> {
// if (listener != null)
// listener.onItemClick(getLayoutPosition());
// });
//
// itemView.setOnLongClickListener(new View.OnLongClickListener() {
// @Override
// public boolean onLongClick(View v) {
// if (listener != null)
// listener.onLongClick(getLayoutPosition());
// return true;
// }
// });
}
}


public static class DialogStringImageBean{

String mName;
long mType;

public DialogStringImageBean(String name, long type) {
mName = name;
mType = type;
}

public String getName() {
return mName;
}

public void setName(String name) {
mName = name;
}

public long getType() {
return mType;
}

public void setType(long type) {
mType = type;
}
}

}

+ 363
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/base/AppBaseActivity.java Dosyayı Görüntüle

@@ -0,0 +1,363 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.base;

import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.KeyEvent;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;

import java.lang.ref.WeakReference;

import aicare.net.cn.sdk.ailinksdkdemoandroid.BuildConfig;
import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.HintDataDialogFragment;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.AppStart;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import butterknife.ButterKnife;
import butterknife.Unbinder;


/**
* xing
* 2019/4/16 11:55
* activity的基类, 共有的功能都可以写在这里
*/
public abstract class AppBaseActivity extends AppCompatActivity {
/**
* 上下文对象
*/
protected Context mContext;
protected String TAG = this.getClass().getName();
protected Handler mHandler = new MyHandler(this);
@Nullable
protected TextView mTvTopTitle;
@Nullable
protected Toolbar mToolbar;
private Unbinder bind;
//--------------ble---------------
/**
* 需要申请的权限
*/
private String[] LOCATION_PERMISSION = new String[]{Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.WRITE_EXTERNAL_STORAGE};

/**
* 权限请求返回
*/
private final int PERMISSION = 101;
/**
* 定位服务返回
*/
protected final int LOCATION_SERVER = 102;

private HintDataDialogFragment mHintDataDialog = null;


@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getLayoutId() != 0) {
initWindows();
setContentView(getLayoutId());
SaveActivityData(savedInstanceState);
mContext = this;
init();
} else if (getLayoutView() != null) {
initWindows();
setContentView(getLayoutView());
SaveActivityData(savedInstanceState);
mContext = this;
init();
}

}

protected void SaveActivityData(Bundle savedInstanceState) {

}


/**
* handler消息,使用弱引用,避免泄露问题
*/
private static class MyHandler extends Handler {
private WeakReference<AppBaseActivity> mActivity;

MyHandler(AppBaseActivity activity) {
mActivity = new WeakReference<>(activity);
}

@Override
public void handleMessage(Message msg) {
if (mActivity.get() == null) {
return;
}
mActivity.get().uiHandlerMessage(msg);
}
}

/**
* handler消息处理
*/
protected abstract void uiHandlerMessage(Message msg);

/**
* 在绑定布局前的操作(状态,任务栏等的设置)
*/
protected void initWindows() {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//禁止横屏
//设置状态栏文字为黑色
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}
}


/**
* 获取当前activity的布局
*
* @return int
*/
protected abstract int getLayoutId();

/**
* 获取当前activity的布局
*
* @return View
*/
protected View getLayoutView() {
return null;
}

/**
* 初始化
*/
protected final void init() {
bind = ButterKnife.bind(this);
addInit();
initView();
initData();
initListener();
ActionBar supportActionBar = getSupportActionBar();
if (supportActionBar != null)
supportActionBar.setTitle(getString(R.string.app_name) + BuildConfig.VERSION_NAME);
}





protected void addInit() {

}


//-----------------------权限----------------------------------------


protected void initPermissions() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
onPermissionsOk();
return;
}
if (ContextCompat.checkSelfPermission(this, LOCATION_PERMISSION[0]) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, LOCATION_PERMISSION, PERMISSION);
} else {
boolean bleStatus = AppStart.isLocServiceEnable(mContext);
if (!bleStatus) {
//没有开启定位服务
mHintDataDialog = HintDataDialogFragment.newInstance()
.setTitle("提示", 0)
.setCancel("取消",0)
.setOk("确定",0)
.setContent("请求开启定位服务", true)
.setOnDialogListener(new HintDataDialogFragment.onDialogListener() {
@Override
public void onSucceedListener(View v) {
startLocationActivity();
}
});
mHintDataDialog.show(getSupportFragmentManager());


} else {
onPermissionsOk();
}
}
}


@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);

//请求权限被拒绝
if (requestCode != PERMISSION)
return;
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
initPermissions();
} else {
if (ActivityCompat.shouldShowRequestPermissionRationale(AppBaseActivity.this,
LOCATION_PERMISSION[0])) {
//权限请求失败,但未选中“不再提示”选项,再次请求
ActivityCompat.requestPermissions(this, LOCATION_PERMISSION, PERMISSION);
} else {
//权限请求失败,选中“不再提示”选项
mHintDataDialog = HintDataDialogFragment.newInstance()
.setTitle("提示", 0)
.setCancel("取消",0)
.setOk("确定",0)
.setContent("请求开启定位权限", true)
.setOnDialogListener(new HintDataDialogFragment.onDialogListener() {
@Override
public void onSucceedListener(View v) {
AppStart.startUseSetActivity(mContext);
}
});
mHintDataDialog.show(getSupportFragmentManager());

}

}
}


/**
* 启动去设置定位服务
*/
protected void startLocationActivity() {

AppStart.startLocationActivity(AppBaseActivity.this, LOCATION_SERVER);

}


/**
* 权限ok
*/
protected void onPermissionsOk() {

}

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == LOCATION_SERVER) {
//定位服务页面返回
initPermissions();
}
}

/**
* 初始化事件
*/
protected abstract void initListener();

/**
* 初始化数据
*/
protected abstract void initData();

/**
* 初始化,绑定布局
*/
protected abstract void initView();

// @Override
// public boolean onCreateOptionsMenu(Menu menu) {
// getMenuInflater().inflate(R.menu.public_toolbar_menu, menu);
// MenuItem item = menu.findItem(R.id.img_public_right);
// if (item != null) {
// item.setIcon(R.drawable.me_manssage);
// }
// return true;
// }

@Override
public boolean onOptionsItemSelected(MenuItem item) {
int i = item.getItemId();
if (i == android.R.id.home) {
myFinish();
return true;
}
return super.onOptionsItemSelected(item);
}


/**
* 返回键
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
myFinish();
return true;
}
return super.onKeyDown(keyCode, event);
}

/**
* 返回
*/
protected void myFinish() {
finish();
}

protected void onClickRight() {

}




@Override
protected void onStart() {
super.onStart();
}

@Override
protected void onRestart() {
super.onRestart();
}

@Override
protected void onResume() {
super.onResume();
}

@Override
protected void onPause() {
super.onPause();
}


@Override
protected void onStop() {
super.onStop();
}


@Override
protected void onDestroy() {
super.onDestroy();
if (mHandler != null) {
mHandler.removeCallbacksAndMessages(null);
}
if (bind != null)
bind.unbind();
}
}

+ 18
- 2
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/base/BleAppBaseActivity.java Dosyayı Görüntüle

@@ -1,5 +1,6 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.base;

import android.Manifest;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.os.Build;
@@ -13,6 +14,7 @@ import android.widget.TextView;

import java.lang.ref.WeakReference;

import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.HintDataDialogFragment;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.CheckPermissionUtils;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.Toolbar;
@@ -37,7 +39,22 @@ public abstract class BleAppBaseActivity extends BleBaseActivity {
@Nullable
protected Toolbar mToolbar;
private Unbinder bind;
//--------------ble---------------
/**
* 需要申请的权限
*/
private String[] LOCATION_PERMISSION = new String[]{Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.WRITE_EXTERNAL_STORAGE};

/**
* 权限请求返回
*/
private final int PERMISSION = 101;
/**
* 定位服务返回
*/
protected final int LOCATION_SERVER = 102;

private HintDataDialogFragment mHintDataDialog = null;


@Override
@@ -253,8 +270,7 @@ public abstract class BleAppBaseActivity extends BleBaseActivity {
if (mHandler != null) {
mHandler.removeCallbacksAndMessages(null);
}
if (bind != null) {
if (bind != null)
bind.unbind();
}
}
}

+ 6
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/base/BleBaseActivity.java Dosyayı Görüntüle

@@ -12,7 +12,10 @@ import com.pingwang.bluetoothlib.config.BleConfig;
import com.pingwang.bluetoothlib.server.ELinkBleServer;
import com.pingwang.bluetoothlib.utils.BleLog;

import aicare.net.cn.sdk.ailinksdkdemoandroid.BuildConfig;
import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;


@@ -35,6 +38,9 @@ public abstract class BleBaseActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActionBar supportActionBar = getSupportActionBar();
if (supportActionBar != null)
supportActionBar.setTitle(getString(R.string.app_name) + BuildConfig.VERSION_NAME);
init();
}


+ 18
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/base/MyApplication.java Dosyayı Görüntüle

@@ -0,0 +1,18 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.base;

import android.app.Application;

public class MyApplication extends Application {

private static MyApplication sInstance;

@Override
public void onCreate() {
super.onCreate();
sInstance = this;
}

public static MyApplication getInstance(){
return sInstance;
}
}

+ 101
- 40
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/config/BleDeviceConfig.java Dosyayı Görüntüle

@@ -13,100 +13,99 @@ public class BleDeviceConfig {

/**
* 血压计(sphygmomanometer)
*
*/
public final static int BLOOD_PRESSURE =0x01;
public final static int BLOOD_PRESSURE = 0x01;
/**
* 额温枪(Forehead gun)
*/
public final static int INFRARED_THERMOMETER =0x02;
public final static int INFRARED_THERMOMETER = 0x02;
/**
* 体温计(thermometer)
*/
public final static int THERMOMETER =0x03;
public final static int THERMOMETER = 0x03;
/**
* 婴儿秤(Baby scale)
*/
public final static int BABY_SCALE =0x04;
public final static int BABY_SCALE = 0x04;
/**
* 身高仪(Height gauge)
*/
public final static int HEIGHT_METER =0x05;
public final static int HEIGHT_METER = 0x05;

/**
* 广播体重秤
*/
public final static int BROADCAST_SCALE_WEIGHT = 0x07;

/**
* 智能门锁(Smart door lock)
*/
public final static int SMART_LOCK =0x0B;
public final static int SMART_LOCK = 0x0B;

/**
* 定制版遥控器(Customized remote control)
*/
public final static int EL_REMOTE_CONTROL =0x0C;
public final static int EL_REMOTE_CONTROL = 0x0C;

/**
* 连接类型的TPMS(Connection type TPMS)
*/
public final static int TPMS_CONN_DEVICE =0x0D;
public final static int TPMS_CONN_DEVICE = 0x0D;

/**
* 体重体脂称(Body fat scale)
*/
public final static int WEIGHT_BODY_FAT_SCALE =0x0E;
public final static int WEIGHT_BODY_FAT_SCALE = 0x0E;

/**
* 箱包锁(Luggage lock)
*/
public final static int LUGGAGE_LOCK =0x0F;
public final static int LUGGAGE_LOCK = 0x0F;
/**
* 锁遥控器(Lock the remote control)
*/
public final static int LOCK_REMOTE_CONTROL =0x10;
public final static int LOCK_REMOTE_CONTROL = 0x10;

/**
* wifi+ble体脂秤(wifi + ble body fat scale)
*/
public final static int WEIGHT_BODY_FAT_SCALE_WIFI_BLE=0x11;
public final static int WEIGHT_BODY_FAT_SCALE_WIFI_BLE = 0x11;
/**
* wifi+ble牙刷(wifi + ble body fat scale)
*/
public final static int TOOTHBRUSH_WIFI_BLE=0x12;

/**
* 蓝牙牙刷
*/
public final static int TOOTHBRUSH_BLE = 0x2D;
public final static int TOOTHBRUSH_WIFI_BLE = 0x12;

/**
* 八电极体脂秤
*/
public final static int EIGHT_BODY_FAT_SCALE =0x13;
public final static int EIGHT_BODY_FAT_SCALE = 0x13;

/**
* 风速计
* cid 为0x14
*/
public final static int ANEMOMETER=0x14;
public final static int ANEMOMETER = 0x14;

/**
* 钳表
* cid 为0x15
*/
public final static int CLAMP_TABLE=0x15;
public final static int CLAMP_TABLE = 0x15;

/**
* 体重体脂称(Body fat scale)艾迪
*/
public final static int WEIGHT_BODY_FAT_SCALE_AD =0x100E;
public final static int WEIGHT_BODY_FAT_SCALE_AD = 0x100E;

/**
* 婴儿体脂两用秤
*/
public final static int BABY_BODY_FAT =0x1A;
public final static int BABY_BODY_FAT = 0x1A;

/**
* 血糖仪
*/
public final static int BLOOD_GLUCOSE=0x1c;
public final static int BLOOD_GLUCOSE = 0x1c;


/**
@@ -119,28 +118,38 @@ public class BleDeviceConfig {
*/
public final static int BLE_NUTRITION_SCALE = 0x0034;

/**
* 蓝牙牙刷
*/
public final static int TOOTHBRUSH_TEST = 0x2D;

/**
* 筋膜枪
*/
public static final int FASCIA_GUN = 0x3B;


/**
* 广播秤
*/
public final static int BROADCAST_SCALE =0x10001;
public final static int BROADCAST_SCALE = 0x10001;


/**
* 智能口罩
*/
public final static int SMART_MASK =0x0022;
public final static int SMART_MASK = 0x0022;


/**
* 百丽达
*/
public final static int BLD_WEIGHT =10086;
public final static int BLD_WEIGHT = 10086;

/**
* 蓝牙血氧仪
*/
public final static int BLE_BOOLD_OXYGEN =0x21;
public final static int BLE_BOOLD_OXYGEN = 0x21;

/**
* 咖啡秤
@@ -149,8 +158,9 @@ public class BleDeviceConfig {
/**
* 电滑板车
*/
public final static int SMART_SCOOTER =0x0025;
public final static int SMART_SCOOTER_CM02 =0x0033;
public final static int SMART_SCOOTER = 0x0025;
public final static int SMART_SCOOTER_CM02 = 0x33;


/**
* 共享充电器
@@ -168,12 +178,6 @@ public class BleDeviceConfig {
public final static int SHARE_CONDOM = 0x1007;


/**
* 跳绳
*/
public final static int ROPE_SKIPPING = 0x002f;


/**
* 身高体脂秤
*/
@@ -189,18 +193,75 @@ public class BleDeviceConfig {
* 食品温度计
*/
public final static int FOOD_TEMP = 0x002b;
/**
* 食品温度计-单探针
*/
public final static int FOOD_TEMP_NEW = 0x003F;
public final static int TEMP_Humidity = 0x002e;

public final static int TEMP_Humidity_wifi = 0x0036;

/**
* 验证不握手不加密的id
* 跳绳
*/
public final static int CLEAR_SHAKE_HANDS = -6;
public final static int ROPE_SKIPPING = 0x002f;

/**
* 广播营养秤
*/
public final static int BROADCAST_NUTRITION = 0x10003;

/**
* 测温仪
*/
public final static int TEMP_INSTRUMENT = 0x003D;

/**
* 芯一代手表
*/
public final static int LEAP_WATCH = 0x003E;


/**
* wifi+ble血压计
*/
public final static int SPHY_WIFI_BLE = 0x0038;

/**
* ble噪音计
*/
public final static int BLE_NOISE_METER = 0x0043;

/**
* 空气(mqtt)
*/
public final static int MQTT_AIR_DETECTOR = 0x0048;
/**
* 空气
*/
public final static int AIR_DETECTOR = 0x0053;
/**
* 噪音计
*/
public final static int WIFI_BLE_NOISE_METER = 0x0050;
/**
* 探针充电盒
*/
public final static int MEAT_PROBE_CHARGER = 0x0055;
/**
* 体重秤
*/
public final static int WEIGHT_SCALE = 0X0056;


//------------------特殊


/**
* 验证不握手不加密的id
*/
public final static int CLEAR_SHAKE_HANDS = -6;
/**
* 通用配网
*/
public final static int PUBLIC_BLE_NETWORK = -7;
}

+ 1
- 3
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/AddUserDialog.java Dosyayı Görüntüle

@@ -11,13 +11,11 @@ import android.widget.RadioGroup;
import android.widget.SeekBar;
import android.widget.TextView;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.FragmentManager;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;

import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatDataUtil;
import cn.net.aicare.modulelibrary.module.BodyFatScale.User;


+ 1
- 2
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/DialogStringImageAdapter.java Dosyayı Görüntüle

@@ -6,10 +6,9 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;

import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;


+ 18
- 18
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/HintDataDialogFragment.java Dosyayı Görüntüle

@@ -41,10 +41,10 @@ public class HintDataDialogFragment extends DialogFragment {
* 是否居中
*/
private boolean isCenter = false;
private CharSequence mCancel="";
private CharSequence mCancel;
@ColorInt
private int mCancelColor = 0;
private CharSequence mOkStr="";
private CharSequence mOkStr;
@ColorInt
private int mOkColor = 0;
@ColorInt
@@ -53,7 +53,7 @@ public class HintDataDialogFragment extends DialogFragment {
/**
* 是否显示灰色背景
*/
private boolean mBackground = true;
private boolean mBackground=true;

/**
* 点击空白区域是否关闭
@@ -96,7 +96,8 @@ public class HintDataDialogFragment extends DialogFragment {

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
L.i(TAG, "onCreateView");
return inflater.inflate(R.layout.dialog_hint_data, container);// 得到加载view

@@ -180,12 +181,10 @@ public class HintDataDialogFragment extends DialogFragment {
public HintDataDialogFragment initColor(@ColorInt int cancelColor, @ColorInt int okColor) {
this.mCancelColor = cancelColor;
this.mOkColor = okColor;
if (mTvCancel != null && mCancelColor != 0) {
if (mTvCancel != null && mCancelColor != 0)
mTvCancel.setTextColor(mCancelColor);
}
if (mTvSucceed != null && mOkColor != 0) {
if (mTvSucceed != null && mOkColor != 0)
mTvSucceed.setTextColor(mOkColor);
}
return this;
}

@@ -200,11 +199,10 @@ public class HintDataDialogFragment extends DialogFragment {
} else if (mContent == null) {
mTvContent.setVisibility(View.GONE);
}
if (isCenter) {
if (isCenter)
mTvContent.setGravity(Gravity.CENTER);
} else {
else
mTvContent.setGravity(Gravity.CENTER_VERTICAL);
}
}
return this;
}
@@ -260,9 +258,8 @@ public class HintDataDialogFragment extends DialogFragment {
} else if (mOkStr == null) {
mTvSucceed.setVisibility(View.GONE);
}
if (mOkColor != 0) {
if (mOkColor != 0)
mTvSucceed.setTextColor(mOkColor);
}
}
return this;
}
@@ -305,7 +302,8 @@ public class HintDataDialogFragment extends DialogFragment {
*
* @param isCenter 显示的内容是否居中
*/
public HintDataDialogFragment initData(CharSequence title, CharSequence content, boolean isCenter, CharSequence cancel, CharSequence ok) {
public HintDataDialogFragment initData(CharSequence title, CharSequence content,
boolean isCenter, CharSequence cancel, CharSequence ok) {
setTitle(title, mTitleColor);
setContent(content, isCenter);
setCancel(cancel, mCancelColor);
@@ -323,7 +321,8 @@ public class HintDataDialogFragment extends DialogFragment {
/**
* 初始化数据
*/
public HintDataDialogFragment initData(CharSequence title, CharSequence content, CharSequence cancel, CharSequence ok) {
public HintDataDialogFragment initData(CharSequence title, CharSequence content,
CharSequence cancel, CharSequence ok) {
return this.initData(title, content, false, cancel, ok);
}

@@ -337,10 +336,11 @@ public class HintDataDialogFragment extends DialogFragment {
DisplayMetrics dm = new DisplayMetrics();
if (getActivity() != null) {
getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm);
if (dialog.getWindow() != null) {
if (dialog.getWindow() != null)
//设置宽度为80%
dialog.getWindow().setLayout((int) (dm.widthPixels * 0.9), ViewGroup.LayoutParams.WRAP_CONTENT);
}
dialog.getWindow()
.setLayout((int) (dm.widthPixels * 0.9),
ViewGroup.LayoutParams.WRAP_CONTENT);
}
}
}

+ 0
- 1
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/LoadingIosDialogFragment.java Dosyayı Görüntüle

@@ -12,7 +12,6 @@ import android.view.View;
import android.view.ViewGroup;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.DialogFragment;

+ 4
- 5
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/ShowListDialogFragment.java Dosyayı Görüntüle

@@ -15,13 +15,12 @@ import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L;
import aicare.net.cn.sdk.ailinksdkdemoandroid.view.MyItemDecoration;

import java.util.ArrayList;
import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L;
import aicare.net.cn.sdk.ailinksdkdemoandroid.view.MyItemDecoration;
import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -135,7 +134,7 @@ public class ShowListDialogFragment extends DialogFragment implements View.OnCli
rv_dialog_list.setLayoutManager(new LinearLayoutManager(mContext));
rv_dialog_list.addItemDecoration(new MyItemDecoration(mContext,
LinearLayoutManager.VERTICAL, 1,
mContext.getResources().getColor(R.color.public_white)));
mContext.getResources().getColor(R.color.public_press_bg)));

}


+ 1
- 2
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/WifiDialog.java Dosyayı Görüntüle

@@ -12,13 +12,12 @@ import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.TextView;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.FragmentManager;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;

public class WifiDialog extends DialogFragment implements View.OnClickListener {

/**

+ 2
- 2
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/find/FindDeviceActivity.java Dosyayı Görüntüle

@@ -10,14 +10,14 @@ import android.widget.ListView;
import android.widget.Toast;

import com.pingwang.bluetoothlib.device.BleDevice;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.R;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.findDevice.FindConnectDeviceInfoBean;
import cn.net.aicare.modulelibrary.module.findDevice.FindDeviceData;

+ 1
- 2
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/find/FindDeviceAdapter.java Dosyayı Görüntüle

@@ -6,10 +6,9 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;

import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;


+ 5
- 5
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/find/FindDeviceNewActivity.java Dosyayı Görüntüle

@@ -16,15 +16,15 @@ import com.pingwang.bluetoothlib.listener.OnCallbackBle;
import com.pingwang.bluetoothlib.listener.OnScanFilterListener;
import com.pingwang.bluetoothlib.utils.BleLog;
import com.pingwang.bluetoothlib.utils.BleStrUtils;

import java.util.ArrayList;
import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.BuildConfig;
import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleAppBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.SP;
import aicare.net.cn.sdk.ailinksdkdemoandroid.view.MyItemDecoration;

import java.util.ArrayList;
import java.util.List;

import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
@@ -124,7 +124,7 @@ public class FindDeviceNewActivity extends BleAppBaseActivity implements View.On
btn_scan_ble = findViewById(R.id.btn_scan_ble);
rv_device = findViewById(R.id.rv_device);
rv_device.setLayoutManager(new GridLayoutManager(mContext, 2, LinearLayoutManager.VERTICAL, false));
rv_device.addItemDecoration(new MyItemDecoration(mContext, LinearLayoutManager.VERTICAL, 1, mContext.getResources().getColor(R.color.public_white)));
rv_device.addItemDecoration(new MyItemDecoration(mContext, LinearLayoutManager.VERTICAL, 1, mContext.getResources().getColor(R.color.public_press_bg)));
// rv_device.setVisibility(View.INVISIBLE);
}


+ 82
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/BleDemoActivity.java Dosyayı Görüntüle

@@ -0,0 +1,82 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules;

import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import androidx.annotation.Nullable;

/**
* 噪音计(ble)
*
* @author xing
*/
public class BleDemoActivity extends BleBaseActivity {

private ListView list_view;

private List<String> mList;
private ArrayAdapter mListAdapter;
private String mMac;


@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_demo);

list_view = findViewById(R.id.list_view);


// 获取Mac
mMac = getIntent().getStringExtra("mac");

// 初始化列表
mList = new ArrayList<>();
mListAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList);
list_view.setAdapter(mListAdapter);

}


@Override
public void onServiceSuccess() {

}

@Override
public void onServiceErr() {

}

@Override
public void unbindServices() {

}


/**
* 添加一条文本
*
* @param text 文本
*/
private void addText(String text) {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss", Locale.US);
mList.add(sdf.format(System.currentTimeMillis()) + ":\n" + text);
if (mListAdapter!=null) {
mListAdapter.notifyDataSetChanged();
}
if (list_view!=null) {
list_view.smoothScrollToPosition(mList.size() - 1);
}
}


}

+ 900
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/TempInstrument/TempInstrumentActivity.java Dosyayı Görüntüle

@@ -0,0 +1,900 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.TempInstrument;

import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.device.BleSendCmdUtil;
import com.pingwang.bluetoothlib.device.SendBleBean;
import com.pingwang.bluetoothlib.listener.CallbackDisIm;
import com.pingwang.bluetoothlib.listener.OnBleCompanyListener;
import com.pingwang.bluetoothlib.listener.OnBleVersionListener;
import com.pingwang.bluetoothlib.listener.OnCallbackDis;
import com.pingwang.bluetoothlib.listener.OnMcuParameterListener;
import com.pingwang.bluetoothlib.utils.BleDensityUtil;
import com.pingwang.bluetoothlib.utils.BleLog;
import com.pingwang.bluetoothlib.utils.BleStrUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.TempInstrument.TempInstrumentBleConfig;
import cn.net.aicare.modulelibrary.module.TempInstrument.TempInstrumentDeviceData;


/**
* xing<br>
* 2022/03/23<br>
* 测温仪
*/
public class TempInstrumentActivity extends BleBaseActivity implements OnCallbackDis, OnBleVersionListener, TempInstrumentDeviceData.onTempListener, TempInstrumentDeviceData.onTempConfigListener,
TempInstrumentDeviceData.onTempSetListener, OnBleCompanyListener, OnMcuParameterListener, View.OnClickListener {

private static String TAG = TempInstrumentActivity.class.getName();
private final int REFRESH_DATA = 3;
private List<String> mList;
private ArrayAdapter listAdapter;

/**
* 服务Intent
*/
private Context mContext;
private EditText etAlarmTempC, etAlarmTempF;
private TempInstrumentDeviceData mBleDevice;
private String mAddress;
private BleSendCmdUtil mBleSendCmdUtil;
private Map<Long, String> mMapLanguage = new HashMap<>();
private List<String> mListLanguage = new ArrayList<>();
private Map<Integer, String> mMapDistance = new HashMap<>();
private Map<Integer, String> mMapAutoClose = new HashMap<>();
private Map<Integer, String> mMapAlarmSound = new HashMap<>();
private boolean mConfigInfoStatus = false;

private Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {


case REFRESH_DATA:
if (listAdapter != null)
listAdapter.notifyDataSetChanged();
break;
}
}
};

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_temp_instrument);
mContext = this;
mAddress = getIntent().getStringExtra("mac");
// type = getIntent().getIntExtra("type", -1);
mBleSendCmdUtil = BleSendCmdUtil.getInstance();
init();
}

private void init() {
mList = new ArrayList<>();
ListView listView = findViewById(R.id.listview);
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList);
listView.setAdapter(listAdapter);

findViewById(R.id.btnVersion).setOnClickListener(this);
findViewById(R.id.btnBattery).setOnClickListener(this);
findViewById(R.id.btn_get_did).setOnClickListener(this);
findViewById(R.id.btnClear).setOnClickListener(this);

findViewById(R.id.btnGetConfig).setOnClickListener(this);
findViewById(R.id.btnSetUnit).setOnClickListener(this);
findViewById(R.id.btnSetVolume).setOnClickListener(this);
findViewById(R.id.btnSetLanguage).setOnClickListener(this);
findViewById(R.id.btnAutoOpen).setOnClickListener(this);
findViewById(R.id.btnTempBroadcast).setOnClickListener(this);
findViewById(R.id.btnTestTempDistance).setOnClickListener(this);
findViewById(R.id.btnBeep).setOnClickListener(this);
findViewById(R.id.btnTempBodyAdd).setOnClickListener(this);
findViewById(R.id.btnTempBodyLess).setOnClickListener(this);
findViewById(R.id.btnTempObjectAdd).setOnClickListener(this);
findViewById(R.id.btnTempObjectLess).setOnClickListener(this);
findViewById(R.id.btnTempErr).setOnClickListener(this);
findViewById(R.id.btnReset).setOnClickListener(this);
findViewById(R.id.btnAlarmSound).setOnClickListener(this);
findViewById(R.id.btnSetSensitivity).setOnClickListener(this);
findViewById(R.id.btnAutoClose).setOnClickListener(this);

etAlarmTempC = findViewById(R.id.etAlarmTempC);
etAlarmTempF = findViewById(R.id.etAlarmTempF);

mMapLanguage.put(TempInstrumentBleConfig.LanguageType.LANGUAGE_DI, "滴");
mMapLanguage.put(TempInstrumentBleConfig.LanguageType.LANGUAGE_DD, "叮咚");
mMapLanguage.put(TempInstrumentBleConfig.LanguageType.LANGUAGE_EN, "英语");
mMapLanguage.put(TempInstrumentBleConfig.LanguageType.LANGUAGE_IT, "意大利");
mMapLanguage.put(TempInstrumentBleConfig.LanguageType.LANGUAGE_KO, "韩语");
mMapLanguage.put(TempInstrumentBleConfig.LanguageType.LANGUAGE_ES, "西班牙语");
mMapLanguage.put(TempInstrumentBleConfig.LanguageType.LANGUAGE_JP, "日语");
mMapLanguage.put(TempInstrumentBleConfig.LanguageType.LANGUAGE_JP1, "日语1");
mMapLanguage.put(TempInstrumentBleConfig.LanguageType.LANGUAGE_FR, "法语");
mMapLanguage.put(TempInstrumentBleConfig.LanguageType.LANGUAGE_VI, "越南语");
mMapLanguage.put(TempInstrumentBleConfig.LanguageType.LANGUAGE_KM, "柬埔寨语");
mMapLanguage.put(TempInstrumentBleConfig.LanguageType.LANGUAGE_MS, "马来语");
mMapLanguage.put(TempInstrumentBleConfig.LanguageType.LANGUAGE_IN, "印尼语");
mMapLanguage.put(TempInstrumentBleConfig.LanguageType.LANGUAGE_AR, "阿拉伯语");
mMapLanguage.put(TempInstrumentBleConfig.LanguageType.LANGUAGE_TH, "泰语");
mMapLanguage.put(TempInstrumentBleConfig.LanguageType.LANGUAGE_PL, "波兰语");
mMapLanguage.put(TempInstrumentBleConfig.LanguageType.LANGUAGE_ZH, "中文");
mMapLanguage.put(TempInstrumentBleConfig.LanguageType.LANGUAGE_ZH0, "中文0");
mMapLanguage.put(TempInstrumentBleConfig.LanguageType.LANGUAGE_ZH1, "中文1");
mMapLanguage.put(TempInstrumentBleConfig.LanguageType.LANGUAGE_ZH2, "中文2");
mMapLanguage.put(TempInstrumentBleConfig.LanguageType.LANGUAGE_ZH3, "中文3");
mListLanguage.add("无语言");
mListLanguage.add("滴");
mListLanguage.add("叮咚");
mListLanguage.add("英语");
mListLanguage.add("意大利");
mListLanguage.add("韩语");
mListLanguage.add("西班牙语");
mListLanguage.add("日语");
mListLanguage.add("日语1");
mListLanguage.add("法语");
mListLanguage.add("越南语");
mListLanguage.add("柬埔寨语");
mListLanguage.add("马来语");
mListLanguage.add("印尼语");
mListLanguage.add("阿拉伯语");
mListLanguage.add("泰语");
mListLanguage.add("波兰语");
mListLanguage.add("中文");
mListLanguage.add("中文0");
mListLanguage.add("中文1");
mListLanguage.add("中文2");
mListLanguage.add("中文3");


mMapDistance.put(TempInstrumentBleConfig.TestTempDistanceType.DISTANCE_1, "0.6M");
mMapDistance.put(TempInstrumentBleConfig.TestTempDistanceType.DISTANCE_2, "0.8M");
mMapDistance.put(TempInstrumentBleConfig.TestTempDistanceType.DISTANCE_3, "1.0M");
mMapDistance.put(TempInstrumentBleConfig.TestTempDistanceType.DISTANCE_4, "1.2M");
mMapDistance.put(TempInstrumentBleConfig.TestTempDistanceType.DISTANCE_5, "1.4M");
mMapDistance.put(TempInstrumentBleConfig.TestTempDistanceType.DISTANCE_6, "1.6M");
mMapDistance.put(TempInstrumentBleConfig.TestTempDistanceType.DISTANCE_7, "1.8M");
mMapDistance.put(TempInstrumentBleConfig.TestTempDistanceType.DISTANCE_8, "2.0M");


mMapAutoClose.put(TempInstrumentBleConfig.AutoCloseType.AUTO_CLOSE_TYPE_8, "24H");
mMapAutoClose.put(TempInstrumentBleConfig.AutoCloseType.AUTO_CLOSE_TYPE_7, "20H");
mMapAutoClose.put(TempInstrumentBleConfig.AutoCloseType.AUTO_CLOSE_TYPE_6, "16H");
mMapAutoClose.put(TempInstrumentBleConfig.AutoCloseType.AUTO_CLOSE_TYPE_5, "12H");
mMapAutoClose.put(TempInstrumentBleConfig.AutoCloseType.AUTO_CLOSE_TYPE_4, "8H");
mMapAutoClose.put(TempInstrumentBleConfig.AutoCloseType.AUTO_CLOSE_TYPE_3, "4H");
mMapAutoClose.put(TempInstrumentBleConfig.AutoCloseType.AUTO_CLOSE_TYPE_2, "2H");
mMapAutoClose.put(TempInstrumentBleConfig.AutoCloseType.AUTO_CLOSE_TYPE_1, "OFF");


mMapAlarmSound.put(TempInstrumentBleConfig.SoundType.SOUND_8, "滴");
mMapAlarmSound.put(TempInstrumentBleConfig.SoundType.SOUND_7, "叮咚");
mMapAlarmSound.put(TempInstrumentBleConfig.SoundType.SOUND_6, "保留");
mMapAlarmSound.put(TempInstrumentBleConfig.SoundType.SOUND_5, "保留");
mMapAlarmSound.put(TempInstrumentBleConfig.SoundType.SOUND_4, "保留");
mMapAlarmSound.put(TempInstrumentBleConfig.SoundType.SOUND_3, "保留");
mMapAlarmSound.put(TempInstrumentBleConfig.SoundType.SOUND_2, "保留");
mMapAlarmSound.put(TempInstrumentBleConfig.SoundType.SOUND_1, "关闭音效");

}


@Override
public void onClick(View v) {
if (mBleDevice == null)
return;
SendBleBean sendBleBean = new SendBleBean();
switch (v.getId()) {
case R.id.btnVersion:
sendBleBean.setHex(mBleSendCmdUtil.getBleVersion());
mBleDevice.sendData(sendBleBean);
break;
case R.id.btnBattery:
sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus());
mBleDevice.sendData(sendBleBean);
break;
case R.id.btn_get_did:
sendBleBean.setHex(mBleSendCmdUtil.getDid());
mBleDevice.sendData(sendBleBean);
break;

case R.id.btnClear:
if (mList != null)
mList.clear();
mHandler.sendEmptyMessage(REFRESH_DATA);
break;

case R.id.btnGetConfig:
if (mBleDevice != null) {
mBleDevice.getDeviceConfig();
}
break;
case R.id.btnSetUnit:
if (mBleDevice != null) {
if (mTempUnit == TempInstrumentBleConfig.UnitType.TEMP_UNIT_C) {
mTempUnit = TempInstrumentBleConfig.UnitType.TEMP_UNIT_F;
} else {
mTempUnit = TempInstrumentBleConfig.UnitType.TEMP_UNIT_C;
}
mBleDevice.synUnit(mTempUnit);
}
break;
case R.id.btnSetVolume:
if (!mConfigInfoStatus)
return;
for (int i = 0; i < mVolumeList.size(); i++) {
int id = mVolumeList.get(i);
if (id == mCurrentVolumeLevel) {
if (mVolumeList.size() - 1 == i) {
mCurrentVolumeLevel = mVolumeList.get(0);
} else {
mCurrentVolumeLevel = mVolumeList.get(++i);
}
break;
}
}
mBleDevice.synVolume(mCurrentVolumeLevel);
break;
case R.id.btnSetLanguage:
if (!mConfigInfoStatus)
return;
List<Long> languageIdTypeListAll = TempInstrumentDeviceData.LANGUAGE_ID_ALL_TYPE_LIST;//协议支持的全部语言ID,按照顺序保存的
long currentLanguageId = languageIdTypeListAll.get(mCurrentLanguageIndex);//获取当前的语言ID
int languageIndex = 0;//下一个语言的下标,在支持的语言ID表中
for (int i = 0; i < mLanguageList.size(); i++) {
long id = mLanguageList.get(i);
//循环获得当前语言ID的下标
if (id == currentLanguageId) {
//获取下一个语言下标
if (i == mLanguageList.size() - 1) {
languageIndex = 0;
} else {
languageIndex = ++i;
}
break;
}
}
long languageId = mLanguageList.get(languageIndex);//下一个语言要发送的语言ID
for (int i = 0; i < languageIdTypeListAll.size(); i++) {
long aLong = languageIdTypeListAll.get(i);
if (aLong == languageId) {
mCurrentLanguageIndex = i;//当前要发送的语言下标
break;
}
}

mBleDevice.synLanguage(mCurrentLanguageIndex);
break;
case R.id.btnAutoOpen:
if (mCurrentAutoOpen == 1) {
mCurrentAutoOpen = 0;
} else {
mCurrentAutoOpen = 1;
}
mBleDevice.synAutoOpen(mCurrentAutoOpen);
break;
case R.id.btnTempBroadcast:
if (mCurrentTempBroadcast == 1) {
mCurrentTempBroadcast = 0;
} else {
mCurrentTempBroadcast = 1;
}
mBleDevice.synTempBroadcast(mCurrentTempBroadcast);
break;
case R.id.btnTestTempDistance:
if (!mConfigInfoStatus)
return;
for (int i = 0; i < mDistanceList.size(); i++) {
int id = mDistanceList.get(i);
if (id == mCurrentTestTempDistanceId) {
if (mDistanceList.size() - 1 == i) {
mCurrentTestTempDistanceId = mDistanceList.get(0);
} else {
mCurrentTestTempDistanceId = mDistanceList.get(++i);
}
break;
}
}
mBleDevice.synTestTempDistance(mCurrentTestTempDistanceId);
break;
case R.id.btnBeep:
if (!mConfigInfoStatus)
return;
for (int i = 0; i < mBeepList.size(); i++) {
int id = mBeepList.get(i);
if (id == mCurrentBeepId) {
if (mBeepList.size() - 1 == i) {
mCurrentBeepId = mBeepList.get(0);
} else {
mCurrentBeepId = mBeepList.get(++i);
}
break;
}
}
mBleDevice.synBeepType(mCurrentBeepId);
break;
case R.id.btnAlarmSound:
if (!mConfigInfoStatus)
return;
for (int i = 0; i < mAlarmSoundList.size(); i++) {
int id = mAlarmSoundList.get(i);
if (id == mCurrentAlarmSoundId) {
if (mAlarmSoundList.size() - 1 == i) {
mCurrentAlarmSoundId = mAlarmSoundList.get(0);
} else {
mCurrentAlarmSoundId = mAlarmSoundList.get(++i);
}
break;
}
}
mBleDevice.synAlarmSoundType(mCurrentAlarmSoundId);
break;
case R.id.btnTempBodyAdd:
mBleDevice.synBodyTempAdd(0x00);
break;
case R.id.btnTempBodyLess:
mBleDevice.synBodyTempAdd(0x01);
break;
case R.id.btnTempObjectAdd:
mBleDevice.synObjectTempAdd(0x00);
break;
case R.id.btnTempObjectLess:
mBleDevice.synObjectTempAdd(0x01);
break;
case R.id.btnTempErr:
if (mBleDevice != null) {
int tempC = Integer.parseInt(etAlarmTempC.getText().toString().trim());
int tempF = Integer.parseInt(etAlarmTempF.getText().toString().trim());
mBleDevice.synAlarmTemp(tempC, tempF);
}
break;
case R.id.btnSetSensitivity://设置灵敏度
if (!mConfigInfoStatus)
return;
for (int i = 0; i < mSensitivityList.size(); i++) {
int id = mSensitivityList.get(i);
if (id == mCurrentSensitivityLevel) {
if (mSensitivityList.size() - 1 == i) {
mCurrentSensitivityLevel = mSensitivityList.get(0);
} else {
mCurrentSensitivityLevel = mSensitivityList.get(++i);
}
break;
}
}
mBleDevice.synSensitivity(mCurrentSensitivityLevel);
break;

case R.id.btnAutoClose://自动关机
if (!mConfigInfoStatus)
return;
for (int i = 0; i < mAutoCloseList.size(); i++) {
int id = mAutoCloseList.get(i);
if (id == mCurrentAutoCloseId) {
if (mAutoCloseList.size() - 1 == i) {
mCurrentAutoCloseId = mAutoCloseList.get(0);
} else {
mCurrentAutoCloseId = mAutoCloseList.get(++i);
}
break;
}
}
mBleDevice.synAutoClose(mCurrentAutoCloseId);
break;

case R.id.btnReset:
if (mBleDevice != null) {
mBleDevice.reset();
}
break;

}
}

//---------------------------------服务---------------------------------------------------


@Override
public void onServiceSuccess() {
BleLog.i(TAG, "服务与界面建立连接成功");
CallbackDisIm.getInstance().addListListener(this);
if (mBluetoothService != null) {
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress);
if (bleDevice != null) {
mBleDevice = TempInstrumentDeviceData.getInstance(bleDevice);
mBleDevice.setOnBleVersionListener(TempInstrumentActivity.this);
mBleDevice.setOnMcuParameterListener(TempInstrumentActivity.this);
mBleDevice.setOnCompanyListener(TempInstrumentActivity.this);
mBleDevice.setOnTempConfigListener(this);
mBleDevice.setOnTempSetListener(this);
mBleDevice.setOnTempListener(this);
} else {
finish();
Toast.makeText(mContext, "连接获取对象失败", Toast.LENGTH_SHORT).show();
}
}
}

@Override
public void onServiceErr() {
BleLog.i(TAG, "服务与界面连接断开");
//与服务断开连接
mBluetoothService = null;
}

@Override
public void unbindServices() {
CallbackDisIm.getInstance().removeListener(this);
if (mBleDevice != null) {
mBleDevice.disconnect();
mBleDevice.clear();
mBleDevice = null;
}
}


//-----------------状态-------------------


@Override
public void onConnecting(@NonNull String mac) {
//TODO 连接中
if (mAddress.equals(mac))
BleLog.i(TAG, "连接中");
}

@Override
public void onDisConnected(@NonNull String mac, int code) {
//TODO 连接断开
BleLog.i(TAG, "连接断开");
if (mAddress.equals(mac))
finish();
}

@Override
public void onServicesDiscovered(@NonNull String mac) {
//TODO 连接成功(获取服务成功)
BleLog.i(TAG, "连接成功(获取服务成功)");
}


@Override
public void bleOpen() {

}

@Override
public void bleClose() {
BleLog.i(TAG, "蓝牙未开启,可请求开启");
finish();
}

//-----------------通知-------------------
@Override
public void onBmVersion(String version) {
mList.add(TimeUtils.getTime() + "版本号:" + version);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onData(byte[] status, int type) {
String data = "";
if (status != null)
data = BleStrUtils.byte2HexStr(status);
if (type == -2) {
mList.add(TimeUtils.getTime() + "发送的payload数据0x:" + data);
} else if (type == TempInstrumentBleConfig.DEVICE_CID) {
mList.add(TimeUtils.getTime() + "无法解析的payload数据0x:" + data);
} else {
mList.add(TimeUtils.getTime() + "透传数据:" + data);
}
mHandler.sendEmptyMessage(REFRESH_DATA);
}

private List<Integer> mVolumeList = new ArrayList<>();
private int mCurrentVolumeLevel;
private List<Long> mLanguageList = new ArrayList<>();
private int mCurrentLanguageIndex;
private List<Integer> mBeepList = new ArrayList<>();
private int mCurrentBeepId;
private List<Integer> mAlarmSoundList = new ArrayList<>();
private int mCurrentAlarmSoundId;
private List<Integer> mSensitivityList = new ArrayList<>();
private int mCurrentSensitivityLevel;
private List<Integer> mAutoCloseList = new ArrayList<>();
private int mCurrentAutoCloseId;
private List<Integer> mDistanceList = new ArrayList<>();
private int mCurrentTestTempDistanceId;
private int mCurrentAutoOpen;
private int mCurrentTempBroadcast;

/**
* @param volumeList 支持的音量档位,空集合代表不支持
* @param currentVolumeLevel 当前的音量等级
* @param languageList 支持的语言列表
* @param currentLanguageIndex 当前的语言下标
* @param beepList 支持的音效列表
* @param currentBeepId 当前的音效ID
* @param autoOpen -1=不支持,0=关闭自动开机(默认),1=打开自动开机
* @param distanceList 支持的测温距离列表
* @param currentTestTempDistanceId 当前的测温距离ID
*/
@Override
public void onDeviceConfig1(List<Integer> volumeList, int currentVolumeLevel, List<Long> languageList, int currentLanguageIndex, List<Integer> beepList, int currentBeepId, int autoOpen,
List<Integer> distanceList, int currentTestTempDistanceId) {
mConfigInfoStatus = true;
mVolumeList.clear();
mVolumeList.addAll(volumeList);

mCurrentVolumeLevel = currentVolumeLevel;
mLanguageList.clear();
mLanguageList.addAll(languageList);
mCurrentLanguageIndex = currentLanguageIndex;
mBeepList.clear();
mBeepList.addAll(beepList);
mCurrentBeepId = currentBeepId;
mDistanceList.clear();
mDistanceList.addAll(distanceList);
mCurrentTestTempDistanceId = currentTestTempDistanceId;
String autoOpenStr = "不支持";
if (autoOpen == 0) {
autoOpenStr = "关闭自动开机";
} else if (autoOpen == 1) {
autoOpenStr = "打开自动开机";
}

String showData = "";
// showData += "支持的音量数量:" + volumeList.size() + " 当前音量等级:" + currentVolumeLevel + "\n";
showData += "自动开机配置:" + autoOpenStr;

// showData += "支持的语言数量" + languageList.size() + " 当前语言ID:" + currentLanguageId + "\n";
// showData += "支持的音效数量" + soundList.size() + " 当前音效ID:" + currentSoundId + "\n";
// showData += "支持的距离数量:" + distanceList.size() + "当前距离ID:" + currentTestTempDistanceId + "\n";
mList.add(TimeUtils.getTime() + "配置信息:\n" + showData);
mHandler.sendEmptyMessage(REFRESH_DATA);

StringBuilder volumeListStr = new StringBuilder("支持的音量等级:{");
for (Integer integer : volumeList) {
volumeListStr.append("V").append(integer).append(" , ");
}
volumeListStr.append("}\n当前音量等级:").append(currentVolumeLevel);
mList.add(TimeUtils.getTime() + volumeListStr);
mHandler.sendEmptyMessage(REFRESH_DATA);

boolean supportLanguage = false;
StringBuilder languageListStr = new StringBuilder("支持的语言ID:{");
long currentLanguageId = TempInstrumentDeviceData.LANGUAGE_ID_ALL_TYPE_LIST.get(currentLanguageIndex);
for (Long integer : languageList) {
String languageName = mMapLanguage.get(integer);
languageListStr.append(languageName).append(" , ");
if (integer == currentLanguageId) {
supportLanguage = true;
}
}

languageListStr.append("}\n当前语言ID:").append(mListLanguage.get(currentLanguageIndex)).append(supportLanguage ? "" : " 不在支持的列表中");
mList.add(TimeUtils.getTime() + languageListStr);


StringBuilder soundListStr = new StringBuilder("支持的提示音ID:{");
for (Integer integer : beepList) {
soundListStr.append("0x").append(Integer.toHexString(integer)).append(" , ");
}
soundListStr.append("}\n当前提示音ID:0x").append(Integer.toHexString(currentBeepId));
mList.add(TimeUtils.getTime() + soundListStr);

StringBuilder distanceListStr = new StringBuilder("支持的距离ID:{");
for (Integer integer : distanceList) {
String nameDistance = mMapDistance.get(integer);
distanceListStr.append(nameDistance).append(" , ");
}
distanceListStr.append("}\n当前距离ID:").append(mMapDistance.get(currentTestTempDistanceId) == null ? "不在列表中" + currentTestTempDistanceId : mMapDistance.get(currentTestTempDistanceId));
mList.add(TimeUtils.getTime() + distanceListStr);
mHandler.sendEmptyMessage(REFRESH_DATA);

}


@Override
public void onDeviceConfig2(float currentAlarmTempC, int tempBodyCompensateSwitchC, float tempBodyCompensateC, int tempObjectCompensateSwitchC, float tempObjectCompensateC, int currentTempUnit,
int tempBroadcast, List<Integer> alarmSoundList, int currentAlarmSoundId, List<Integer> sensitivityList, int currentSensitivityLevel, List<Integer> autoCloseList,
int currentAutoCloseId) {


mConfigInfoStatus = true;
mTempUnit = currentTempUnit;
String showData = "";
showData += "报警温度:" + (currentAlarmTempC) + "℃ \n";
showData += "体温补偿:" + (tempBodyCompensateSwitchC == 1 ? "支持" : "不支持") + " 补偿的温度:" + (tempBodyCompensateC) + "℃\n";
showData += "物温补偿:" + (tempObjectCompensateSwitchC == 1 ? "支持" : "不支持") + " 补偿的温度:" + (tempObjectCompensateC) + "℃\n";
showData += "当前单位:" + (currentTempUnit == 0 ? "℃" : "℉") + "\n";

String tempBroadcastStr = "不支持";
if (tempBroadcast == 0) {
tempBroadcastStr = "关闭";
} else if (tempBroadcast == 1) {
tempBroadcastStr = "打开";
}

showData += "温度值播报:" + tempBroadcastStr;
mList.add(TimeUtils.getTime() + "配置信息:\n" + showData);


StringBuilder alarmSoundListStr = new StringBuilder("支持的报警音效ID:{");
for (Integer integer : alarmSoundList) {
alarmSoundListStr.append(mMapAlarmSound.get(integer)).append(" , ");
}
alarmSoundListStr.append("}\n当前报警音效:").append(mMapAlarmSound.get(currentAlarmSoundId));
mList.add(TimeUtils.getTime() + alarmSoundListStr);
mAlarmSoundList.clear();
mAlarmSoundList.addAll(alarmSoundList);
mCurrentAlarmSoundId = currentAlarmSoundId;


StringBuilder sensitivityListStr = new StringBuilder("支持的灵敏度等级:{");
for (Integer integer : sensitivityList) {
sensitivityListStr.append("H").append(integer).append(" , ");
}
sensitivityListStr.append("}\n当前灵敏度等级:H").append(currentSensitivityLevel);
mList.add(TimeUtils.getTime() + sensitivityListStr);
mSensitivityList.clear();
mSensitivityList.addAll(sensitivityList);
mCurrentSensitivityLevel = currentSensitivityLevel;

StringBuilder autoCloseListStr = new StringBuilder("支持的自动关机ID:{");
for (Integer integer : autoCloseList) {
autoCloseListStr.append(mMapAutoClose.get(integer)).append(" , ");
}
autoCloseListStr.append("}\n当前自动关机选项:").append(mMapAutoClose.get(currentAutoCloseId));
mList.add(TimeUtils.getTime() + autoCloseListStr);
mAutoCloseList.clear();
mAutoCloseList.addAll(autoCloseList);
mCurrentAutoCloseId = currentAutoCloseId;

mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onDeviceConfig3(float currentAlarmTempF, int tempBodyCompensateSwitchF, float tempBodyCompensateF, int tempObjectCompensateSwitchF, float tempObjectCompensateF, float alarmTempMinC,
float alarmTempMaxC) {


mConfigInfoStatus = true;
String showData = "";
showData += "报警温度:" + (currentAlarmTempF) + "℉ \n";
showData += "体温补偿:" + (tempBodyCompensateSwitchF == 1 ? "支持" : "不支持") + " 补偿的温度:" + (tempBodyCompensateF) + "℉\n";
showData += "物温补偿:" + (tempObjectCompensateSwitchF == 1 ? "支持" : "不支持") + " 补偿的温度:" + (tempObjectCompensateF) + "℉\n";
showData += "报警值下限:" + (alarmTempMinC) + " ℃ 报警值上限:" + (alarmTempMaxC) + " ℃\n";

mList.add(TimeUtils.getTime() + showData);
mHandler.sendEmptyMessage(REFRESH_DATA);

}

@Override
public void onTemp(int type, int temp, int decimal, int tempUnit) {
String tempStr = BleDensityUtil.getInstance().holdDecimals(temp, decimal);
String showTempType = (type == 1 ? "当前体温:" : "当前物温:");
String unitStr = (tempUnit == 0 ? "℃" : "℉");
mList.add(TimeUtils.getTime() + showTempType + tempStr + unitStr);
mHandler.sendEmptyMessage(REFRESH_DATA);
}


@Override
public void onReset(int status) {
String showStatus = (status == 0 ? "成功" : "失败");
mList.add(TimeUtils.getTime() + "恢复出厂设置:" + showStatus);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

/**
* @param status 0=成功,1=失败
* @param soundId 音效ID{@link TempInstrumentBleConfig.SoundType}
*/
@Override
public void onBeepType(int status, int soundId) {
mCurrentBeepId = soundId;
String showStatus = (status == 0 ? "成功" : "失败");
mList.add(TimeUtils.getTime() + "结果:" + showStatus + " 当前提示音ID:0x" + Integer.toHexString(soundId));
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onAlarmSoundType(int status, int soundId) {
mCurrentAlarmSoundId = soundId;
String showStatus = (status == 0 ? "成功" : "失败");
mList.add(TimeUtils.getTime() + "结果:" + showStatus + " 当前报警音效ID:0x" + Integer.toHexString(soundId) + " " + mMapAlarmSound.get(soundId));
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onAlarmTemp(int status, float tempC, float tempF) {


String showStatus = (status == 0 ? "成功" : "失败");
mList.add(TimeUtils.getTime() + "结果:" + showStatus + " 当前报警温度:" + (tempC) + "℃ ; " + (tempF) + "℉");
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onBodyTempAdd(int status, float tempC, float tempF) {

String showStatus;
if (status == 0) {
showStatus = "成功";
} else if (status == 2) {
showStatus = "已达最大值";
} else if (status == 3) {
showStatus = "已达最小值";
} else {
showStatus = "失败";
}

mList.add(TimeUtils.getTime() + "结果:" + showStatus + " 当前体温校准:" + (tempC) + "℃ ; " + (tempF) + "℉");
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onObjectTempAdd(int status, float tempC, float tempF) {

String showStatus;
if (status == 0) {
showStatus = "成功";
} else if (status == 2) {
showStatus = "已达最大值";
} else if (status == 3) {
showStatus = "已达最小值";
} else {
showStatus = "失败";
}
mList.add(TimeUtils.getTime() + "结果:" + showStatus + " 当前物温校准:" + (tempC) + "℃ ; " + (tempF) + "℉");
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onTestTempDistance(int status, int testTempDistanceId) {
mCurrentTestTempDistanceId = testTempDistanceId;
String showStatus = (status == 0 ? "成功" : "失败");
mList.add(TimeUtils.getTime() + "结果:" + showStatus + " 当前测温距离ID:0x" + Integer.toHexString(testTempDistanceId) + " " + mMapDistance.get(testTempDistanceId));
mHandler.sendEmptyMessage(REFRESH_DATA);
}

/**
* @param status 0=成功,1=失败
* @param autoOpen 0=关闭自动开机,1=打开自动开机
*/
@Override
public void onAutoOpen(int status, int autoOpen) {
mCurrentAutoOpen = autoOpen;
String showStatus = (status == 0 ? "成功" : "失败");
String showAutoOpen = (autoOpen == 0 ? "关闭自动开机" : "打开自动开机");
mList.add(TimeUtils.getTime() + "结果:" + showStatus + " 操作:" + showAutoOpen);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onTempBroadcast(int status, int autoOpen) {
mCurrentTempBroadcast = autoOpen;
String showStatus = (status == 0 ? "成功" : "失败");
String showAutoOpen = (autoOpen == 0 ? "关闭温度播报" : "打开温度播报");
mList.add(TimeUtils.getTime() + "结果:" + showStatus + " 操作:" + showAutoOpen);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onLanguage(int status, int languageId) {
mCurrentLanguageIndex = languageId;
String showStatus = (status == 0 ? "成功" : "失败");
mList.add(TimeUtils.getTime() + "结果:" + showStatus + " 当前语言:0x" + Integer.toHexString(languageId) + " " + mListLanguage.get(languageId));
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onVolume(int status, int volumeLevel) {
mCurrentVolumeLevel = volumeLevel;
String showStatus = (status == 0 ? "成功" : "失败");
mList.add(TimeUtils.getTime() + "结果:" + showStatus + " 当前音量等级:0x" + Integer.toHexString(volumeLevel));
mHandler.sendEmptyMessage(REFRESH_DATA);
}


private int mTempUnit = 0;

@Override
public void onUnit(int status, int tempUnit) {
mTempUnit = tempUnit;
String unitStr = (tempUnit == 0 ? "℃" : "℉");
String showStatus = (status == 0 ? "成功" : "失败");
mList.add(TimeUtils.getTime() + "单位结果:" + showStatus + unitStr);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onSensitivity(int status, int level) {
mCurrentSensitivityLevel = level;
String showStatus = (status == 0 ? "成功" : "失败");
mList.add(TimeUtils.getTime() + "结果:" + showStatus + " 当前灵敏度等级:0x" + Integer.toHexString(level));
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onAutoClose(int status, int autoCloseId) {
mCurrentAutoCloseId = autoCloseId;
String showStatus = (status == 0 ? "成功" : "失败");
mList.add(TimeUtils.getTime() + "结果:" + showStatus + " 当前自动关机:0x" + Integer.toHexString(autoCloseId) + " " + mMapAutoClose.get(autoCloseId));
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onErr(int status) {
String statusStr = "体温过高";
switch (status) {
case 0:
statusStr = "体温过高";
break;
case 1:
statusStr = "体温过低";
break;

}
mList.add(TimeUtils.getTime() + "结果:" + statusStr);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void synErrToConfig(int cmdType) {
mList.add(TimeUtils.getTime() + "操作失败的指令:" + Integer.toHexString(cmdType));
mHandler.sendEmptyMessage(REFRESH_DATA);
}


//------------------------

@Override
public void OnDID(int cid, int vid, int pid) {
String didStr = "cid:" + cid + "||vid:" + vid + "||pid:" + pid;
mList.add(TimeUtils.getTime() + "ID:" + didStr);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onMcuBatteryStatus(int status, int battery) {
mList.add(TimeUtils.getTime() + "电量:" + battery + "%");
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onSysTime(int status, int[] times) {
String time = times[0] + "-" + times[1] + "-" + times[2] + " " + times[3] + ":" + times[4] + ":" + times[5];
mList.add(TimeUtils.getTime() + "系统时间:" + time);
mHandler.sendEmptyMessage(REFRESH_DATA);
}


@Override
protected void onDestroy() {
super.onDestroy();
BleLog.i(TAG, "onDestroy");
}
}

+ 608
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/airdetector/AirDetectorActivity.java Dosyayı Görüntüle

@@ -0,0 +1,608 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.airdetector;

import android.app.AlertDialog;
import android.content.Intent;
import android.os.Message;
import android.util.SparseArray;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RadioGroup;
import android.widget.Toast;

import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.device.SendDataBean;
import com.pingwang.bluetoothlib.listener.OnBleOtherDataListener;
import com.pingwang.bluetoothlib.listener.OnCallbackBle;
import com.pingwang.bluetoothlib.utils.BleLog;
import com.pingwang.bluetoothlib.utils.BleStrUtils;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleAppBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.airdetector_test.AirDetectorActivityTest;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatSpinner;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.lifecycle.Lifecycle;
import cn.net.aicare.modulelibrary.module.airDetector.AirConst;
import cn.net.aicare.modulelibrary.module.airDetector.AirDetectorWifeBleData;
import cn.net.aicare.modulelibrary.module.airDetector.AirSendUtil;
import cn.net.aicare.modulelibrary.module.airDetector.StatusBean;
import cn.net.aicare.modulelibrary.module.airDetector.SupportBean;

/**
* @author yesp
*/
public class AirDetectorActivity extends BleAppBaseActivity implements AirDetectorWifeBleData.AirDataInterface, View.OnClickListener, OnCallbackBle , OnBleOtherDataListener {
private String mAddress;

private Button btn_auto_test_tools, btn_support_list, btn_device_state, btn_param, btn_set_param, btn_change_log;
private EditText ed_type, ed_max, ed_min, ed_warm_state, ed_value;
private ListView list_view;
private ListView list_view_payload;
private List<String> mList;
private List<String> mListPayload;
private ArrayAdapter listAdapter;
private ArrayAdapter listAdapterPayload;
private AirDetectorWifeBleData mAirDetectorWifeBleData;
private SparseArray<SupportBean> supportList;
private static final String TAG = "AirDetectorActivity";

private ArrayList<String> typeNames = new ArrayList<>();
LinkedHashMap<String, SetType> maps = new LinkedHashMap<>();
private int selectType = -1;
private AppCompatSpinner sp_set_type, sp_mode;
private LinearLayout layout_type, layout_switch, layout_max, layout_min, layout_value;
private RadioGroup group_cal, group_alarm;
private CheckBox cb_day1, cb_day2, cb_day3, cb_day4, cb_day5, cb_day6, cb_day7;
private EditText ed_time, ed_cid;
private ConstraintLayout layout_alarm;
private Button btn_stop;
private boolean stopFlag = false;


@Override
protected void uiHandlerMessage(Message msg) {

}

@Override
protected int getLayoutId() {
return R.layout.activity_air_detector;
}

@Override
protected void initListener() {
sp_set_type.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
if (position != 0) {
SetType setType = maps.get(typeNames.get(position));
if (setType != null) {
selectType = setType.type;
showParams(setType.showType);
}
} else {
selectType = -1;
showParams(-1);
}
}

@Override
public void onNothingSelected(AdapterView<?> parent) {

}
});
}

private void showParams(int showType) {
switch (showType) {
case SetType.TYPE_VALUE_SWITCH:
layout_switch.setVisibility(View.VISIBLE);
layout_value.setVisibility(View.VISIBLE);
layout_type.setVisibility(View.GONE);
layout_max.setVisibility(View.GONE);
layout_min.setVisibility(View.GONE);
group_cal.setVisibility(View.GONE);
layout_alarm.setVisibility(View.GONE);
break;
case SetType.TYPE_MIN_MAX_SWITCH:
layout_switch.setVisibility(View.VISIBLE);
layout_max.setVisibility(View.VISIBLE);
layout_min.setVisibility(View.VISIBLE);
layout_type.setVisibility(View.GONE);
layout_value.setVisibility(View.GONE);
group_cal.setVisibility(View.GONE);
layout_alarm.setVisibility(View.GONE);
break;
case SetType.TYPE_SWITCH:
layout_switch.setVisibility(View.VISIBLE);
layout_type.setVisibility(View.GONE);
layout_max.setVisibility(View.GONE);
layout_min.setVisibility(View.GONE);
layout_value.setVisibility(View.GONE);
group_cal.setVisibility(View.GONE);
layout_alarm.setVisibility(View.GONE);
break;
case SetType.TYPE_CAL:
group_cal.setVisibility(View.VISIBLE);
layout_type.setVisibility(View.VISIBLE);
layout_switch.setVisibility(View.GONE);
layout_max.setVisibility(View.GONE);
layout_min.setVisibility(View.GONE);
layout_value.setVisibility(View.GONE);
layout_alarm.setVisibility(View.GONE);
break;
case SetType.TYPE_VALUE:
layout_value.setVisibility(View.VISIBLE);
layout_switch.setVisibility(View.GONE);
layout_type.setVisibility(View.GONE);
layout_max.setVisibility(View.GONE);
layout_min.setVisibility(View.GONE);
group_cal.setVisibility(View.GONE);
layout_alarm.setVisibility(View.GONE);
break;
case SetType.TYPE_ALARM:
layout_alarm.setVisibility(View.VISIBLE);
layout_switch.setVisibility(View.GONE);
layout_type.setVisibility(View.GONE);
layout_max.setVisibility(View.GONE);
layout_min.setVisibility(View.GONE);
layout_value.setVisibility(View.GONE);
group_cal.setVisibility(View.GONE);
break;
default:
layout_alarm.setVisibility(View.GONE);
layout_switch.setVisibility(View.GONE);
layout_type.setVisibility(View.GONE);
layout_max.setVisibility(View.GONE);
layout_min.setVisibility(View.GONE);
layout_value.setVisibility(View.GONE);
group_cal.setVisibility(View.GONE);
break;
}
}

@Override
protected void initData() {
AirConst.DEVICE_CID = getIntent().getIntExtra("cid", AirConst.NO_MQTT_DEVICE_CID);
mList = new ArrayList<>();
mListPayload = new ArrayList<>();
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList);
listAdapterPayload = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mListPayload);
list_view.setAdapter(listAdapter);
list_view_payload.setAdapter(listAdapterPayload);
initSettingTypes();
initAlarmModeSP();
}

private void initAlarmModeSP() {
ArrayList<String> modeList = new ArrayList<>();
modeList.add("选择模式");
modeList.add("0:一次性");
modeList.add("1:每天都响");
modeList.add("2:周一至周五");
modeList.add("3:周一至周六");
modeList.add("4:自定义");
ArrayAdapter<String> modeAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, modeList);
sp_mode.setAdapter(modeAdapter);
}

private void initSettingTypes() {
maps = AirDetectorShowUtil.initSettingTypes();
typeNames.clear();
typeNames.add("请选择类型");
for (Map.Entry<String, SetType> entry : maps.entrySet()) {
typeNames.add(entry.getKey());
}
ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, typeNames);
sp_set_type.setAdapter(spinnerAdapter);
}

@Override
protected void initView() {
btn_auto_test_tools = findViewById(R.id.btn_auto_test_tools);
btn_support_list = findViewById(R.id.btn_support_list);
btn_device_state = findViewById(R.id.btn_device_state);
btn_param = findViewById(R.id.btn_param);
ed_max = findViewById(R.id.ed_max);
ed_type = findViewById(R.id.ed_type);
ed_min = findViewById(R.id.ed_min);
ed_value = findViewById(R.id.ed_value);
ed_warm_state = findViewById(R.id.ed_warm_state);
list_view = findViewById(R.id.list_view);
btn_set_param = findViewById(R.id.btn_set_param);
list_view_payload = findViewById(R.id.list_view_payload);
btn_change_log = findViewById(R.id.btn_change_log);
sp_set_type = findViewById(R.id.spinner);
layout_type = findViewById(R.id.layout_type);
layout_max = findViewById(R.id.layout_max);
layout_min = findViewById(R.id.layout_min);
layout_value = findViewById(R.id.layout_value);
layout_switch = findViewById(R.id.layout_switch);
group_cal = findViewById(R.id.group_cal);
btn_stop = findViewById(R.id.btn_stop);
// 闹钟
layout_alarm = findViewById(R.id.layout_alarm);
ed_time = findViewById(R.id.ed_time);
ed_cid = findViewById(R.id.ed_cid);
group_alarm = findViewById(R.id.group_alarm);
sp_mode = findViewById(R.id.sp_mode);
cb_day1 = findViewById(R.id.cb_day1);
cb_day2 = findViewById(R.id.cb_day2);
cb_day3 = findViewById(R.id.cb_day3);
cb_day4 = findViewById(R.id.cb_day4);
cb_day5 = findViewById(R.id.cb_day5);
cb_day6 = findViewById(R.id.cb_day6);
cb_day7 = findViewById(R.id.cb_day7);

btn_auto_test_tools.setOnClickListener(this);
btn_support_list.setOnClickListener(this);
btn_device_state.setOnClickListener(this);
btn_param.setOnClickListener(this);
btn_set_param.setOnClickListener(this);
btn_change_log.setOnClickListener(this);
btn_stop.setOnClickListener(this);
}

@Override
protected void onResume() {
super.onResume();
if (mAirDetectorWifeBleData != null) {
mAirDetectorWifeBleData.setCurKey(TAG);
}
}

@Override
public void onServiceSuccess() {
mAddress = getIntent().getStringExtra("mac");
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress);
mBluetoothService.setOnCallback(this);
if (mAirDetectorWifeBleData == null) {
AirDetectorWifeBleData.init(bleDevice);
mAirDetectorWifeBleData = AirDetectorWifeBleData.getInstance();
mAirDetectorWifeBleData.setDataInterface(TAG, this);
mAirDetectorWifeBleData.setOnBleOtherDataListener(this);
}
}

@Override
public void onServiceErr() {

}

@Override
public void unbindServices() {

}

@Override
public void onDisConnected(String mac, int code) {
if (mac.equals(mAddress) && getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) {
BleLog.i(TAG, "设备断开连接,请退出重新连接");
new AlertDialog.Builder(this)
.setTitle("ERROR:")
.setMessage("\n" + "设备断开连接,请退出重新连接")
.setPositiveButton("确认", (dialog, which) -> finish())
.show();
}
}

public void onDataPayload(String bytes) {
mListPayload.add(0, TimeUtils.getTime() + bytes);
listAdapterPayload.notifyDataSetChanged();
}


@Override
public void onClick(View v) {
if (v.getId() == R.id.btn_auto_test_tools) {
Intent intent = new Intent(this, AirDetectorActivityTest.class);
intent.putExtras(getIntent());
startActivityForResult(intent, 100);
} else if (v.getId() == R.id.btn_change_log) {
if (list_view_payload.getVisibility() == View.GONE) {
list_view_payload.setVisibility(View.VISIBLE);
list_view.setVisibility(View.GONE);
} else {
list_view_payload.setVisibility(View.GONE);
list_view.setVisibility(View.VISIBLE);
}
} else if (v.getId() == R.id.btn_support_list) {
if (isStopping()) return;
if (mAirDetectorWifeBleData != null) {
addTextWithTime("获取支持列表------------");
mAirDetectorWifeBleData.sendData(AirSendUtil.getSupportList());
}
} else if (v.getId() == R.id.btn_device_state) {
if (isStopping()) return;
if (mAirDetectorWifeBleData != null) {
if (!checkHasGetSupport()) return;
addTextWithTime("获取实时状态------------");
mAirDetectorWifeBleData.sendData(AirSendUtil.getDeviceState());
}
} else if (v.getId() == R.id.btn_param) {
if (isStopping()) return;
if (mAirDetectorWifeBleData != null) {
if (!checkHasGetSupport()) return;
addTextWithTime("获取参数设置------------");
mAirDetectorWifeBleData.sendData(AirSendUtil.getSettingState());
}
} else if (v.getId() == R.id.btn_set_param) {
if (isStopping()) return;
sendSettingParams();
} else if(v.getId() == R.id.btn_stop){
if (stopFlag) {
btn_stop.setText("暂停");
} else {
btn_stop.setText("刷新");
}
stopFlag = !stopFlag;
}
}


/**
* 添加一条文本
*
* @param text
*/
private void addTextWithTime(String text) {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss", Locale.US);
mList.add(sdf.format(System.currentTimeMillis()) + ":\n" + text);
listAdapter.notifyDataSetChanged();
list_view.smoothScrollToPosition(mList.size() - 1);
}

/**
* 添加一条文本
*
* @param text
*/
private void addText(String text) {
if (mList.size() > 1000) {
ArrayList<String> list = new ArrayList<>(mList.subList(500, mList.size()));
mList.clear();
mList.addAll(list);
}
mList.add(text);
listAdapter.notifyDataSetChanged();
list_view.smoothScrollToPosition(mList.size() - 1);
}

/**
* 发送设置指令
*/
private void sendSettingParams() {
try {
if (!checkHasGetSupport()) return;
SupportBean supportBean = supportList.get(selectType);
if (supportBean == null || selectType == -1) {
Toast.makeText(this, "当前类型不支持", Toast.LENGTH_SHORT).show();
return;
}
SendDataBean sendDataBean = null;
switch (selectType) {
case AirConst.AIR_TYPE_FORMALDEHYDE:
case AirConst.AIR_TYPE_PM_2_5:
case AirConst.AIR_TYPE_PM_1:
case AirConst.AIR_TYPE_PM_10:
case AirConst.AIR_TYPE_VOC:
case AirConst.AIR_TYPE_CO2:
case AirConst.AIR_TYPE_AQI:
case AirConst.AIR_TYPE_TVOC:
case AirConst.AIR_TYPE_CO:
int warmState = Integer.parseInt(ed_warm_state.getText().toString().trim());
String value = ed_value.getText().toString().trim();
float myValue = value.contains(".") ? Float.parseFloat(value) : Integer.parseInt(value);
sendDataBean = AirSendUtil.setWarmMaxByType(selectType, warmState, myValue, supportBean.getPoint());
break;
case AirConst.AIR_TYPE_TEMP:
String valueMax = ed_max.getText().toString().trim();
String valueMin = ed_min.getText().toString().trim();
float myValueMax = valueMax.contains("\\.") ? Float.parseFloat(valueMax) : Integer.parseInt(valueMax);
float myValueMin = valueMin.contains("\\.") ? Float.parseFloat(valueMin) : Integer.parseInt(valueMin);
sendDataBean = AirSendUtil.setWarmTemp(supportBean.getPoint(),
supportBean.getUnit(), myValueMax, myValueMin);
break;
case AirConst.AIR_TYPE_HUMIDITY:
valueMax = ed_max.getText().toString().trim();
valueMin = ed_min.getText().toString().trim();
myValueMax = valueMax.contains("\\.") ? Float.parseFloat(valueMax) : Integer.parseInt(valueMax);
myValueMin = valueMin.contains("\\.") ? Float.parseFloat(valueMin) : Integer.parseInt(valueMin);
sendDataBean = AirSendUtil.setWarmHumidity(supportBean.getPoint(),
myValueMax, myValueMin);
break;
case AirConst.AIR_SETTING_VOICE:
warmState = Integer.parseInt(ed_warm_state.getText().toString().trim());
value = ed_value.getText().toString().trim();
sendDataBean = AirSendUtil.setVoice(warmState, Integer.parseInt(value));
break;
case AirConst.AIR_SETTING_WARM_DURATION:
value = ed_value.getText().toString().trim();
sendDataBean = AirSendUtil.setWarmDuration(Integer.parseInt(value));
break;
case AirConst.AIR_SETTING_WARM_VOICE:
case AirConst.AIR_SETTING_DEVICE_SELF_TEST:
case AirConst.AIR_RESTORE_FACTORY_SETTINGS:
case AirConst.AIR_TIME_FORMAT:
case AirConst.AIR_DATA_DISPLAY_MODE:
value = ed_value.getText().toString().trim();
sendDataBean = AirSendUtil.setTypeAndLengthOne(selectType, Integer.parseInt(value));
break;
case AirConst.AIR_SETTING_SWITCH_TEMP_UNIT:
value = ed_value.getText().toString().trim();
sendDataBean = AirSendUtil.setUnit(Integer.parseInt(value));
break;
case AirConst.AIR_KEY_SOUND:
case AirConst.AIR_ALARM_SOUND_EFFECT:
case AirConst.AIR_ICON_DISPLAY:
case AirConst.AIR_MONITORING_DISPLAY_DATA:
warmState = Integer.parseInt(ed_warm_state.getText().toString().trim());
sendDataBean = AirSendUtil.setTypeAndSwitch(selectType, warmState);
break;
case AirConst.AIR_BRIGHTNESS_EQUIPMENT:
warmState = Integer.parseInt(ed_warm_state.getText().toString().trim());
value = ed_value.getText().toString().trim();
sendDataBean = AirSendUtil.setBrightnessEquipment(warmState, Integer.parseInt(value));
break;
case AirConst.AIR_CALIBRATION_PARAMETERS:
int calType = Integer.parseInt(ed_type.getText().toString().trim());
int operate = group_cal.getCheckedRadioButtonId() == R.id.rb_add ? 0 : 1;
sendDataBean = AirSendUtil.setCalibrationParam(calType, operate);
break;
case AirConst.AIR_ALARM_CLOCK:
sendDataBean = getAlarmSendDataBean();
break;
default:
break;
}
if (mAirDetectorWifeBleData != null && sendDataBean != null) {
mAirDetectorWifeBleData.sendData(sendDataBean);
}
} catch (Exception e) {
e.printStackTrace();
new AlertDialog.Builder(this)
.setTitle("ERROR:")
.setMessage("\n" + "设置参数错误")
.setPositiveButton("确认", null)
.show();
}
}

@Nullable
private SendDataBean getAlarmSendDataBean() {
int cid = Integer.parseInt(ed_cid.getText().toString().trim());
String time = ed_time.getText().toString().trim();
if (time.contains(":")) {
String[] hourMinute = time.split(":");
int hour = Integer.parseInt(hourMinute[0].trim());
int minute = Integer.parseInt(hourMinute[1].trim());
int mode = sp_mode.getSelectedItemPosition() - 1;
if (mode < 0) {
Toast.makeText(this, "请选择模式", Toast.LENGTH_SHORT).show();
return null;
}
int day1 = cb_day1.isChecked() ? 1 : 0;
int day2 = cb_day2.isChecked() ? 1 : 0;
int day3 = cb_day3.isChecked() ? 1 : 0;
int day4 = cb_day4.isChecked() ? 1 : 0;
int day5 = cb_day5.isChecked() ? 1 : 0;
int day6 = cb_day6.isChecked() ? 1 : 0;
int day7 = cb_day7.isChecked() ? 1 : 0;
int openAlarm = group_alarm.getCheckedRadioButtonId() == R.id.rb_open ? 1 : 0;
boolean isDeleted = group_alarm.getCheckedRadioButtonId() == R.id.rb_delete;
int[] days;
switch (mode) {
case 1:
days = new int[]{0, 1, 1, 1, 1, 1, 1, 1};
break;
case 2:
days = new int[]{0, 1, 1, 1, 1, 1, 0, 0};
break;
case 3:
days = new int[]{0, 1, 1, 1, 1, 1, 1, 0};
break;
case 4:
days = new int[]{0, day1, day2, day3, day4, day5, day6, day7};
break;
case 0:
default:
days = new int[]{0, 0, 0, 0, 0, 0, 0, 0};
break;
}
return AirSendUtil.setAlarm(cid, hour, minute, days, mode, openAlarm, isDeleted);
} else {
Toast.makeText(this, "时间格式错误", Toast.LENGTH_SHORT).show();
return null;
}
}

private boolean checkHasGetSupport() {
if (supportList == null || supportList.size() == 0) {
Toast.makeText(this, "请先获取支持列表", Toast.LENGTH_SHORT).show();
return false;
}
return true;
}

@Override
protected void onDestroy() {
if (mAirDetectorWifeBleData != null) {
mAirDetectorWifeBleData = null;
}
if (mBluetoothService != null) {
mBluetoothService.disconnectAll();
}
super.onDestroy();
}

@Override
public void onSupportedList(SparseArray<SupportBean> supportList) {
if (stopFlag) {
return;
}
this.supportList = supportList;
for (int i = 0; i < supportList.size(); i++) {
SupportBean supportBean = supportList.get(supportList.keyAt(i));
addText(AirDetectorShowUtil.getTextSupportShow(supportBean));
}
addTextWithTime("返回支持列表----------结束");
}

@Override
public void onStatusList(SparseArray<StatusBean> statusList) {
if (stopFlag || !checkHasGetSupport()) {
return;
}
for (int i = 0; i < statusList.size(); i++) {
StatusBean statusBean = statusList.get(statusList.keyAt(i));
addText(AirDetectorShowUtil.getTextStatusShow(statusBean, supportList));
}
}

@Override
public void onSettingList(SparseArray<StatusBean> settingList) {
if (stopFlag || !checkHasGetSupport()) {
return;
}
for (int i = 0; i < settingList.size(); i++) {
StatusBean statusBean = settingList.get(settingList.keyAt(i));
addText(AirDetectorShowUtil.getResultSettingsShow(statusBean, supportList));
}
}

private boolean isStopping() {
if (stopFlag) {
Toast.makeText(this, "请先点击刷新", Toast.LENGTH_SHORT).show();
}
return stopFlag;
}

@Override
public void onNotifyOtherData(String uuid, byte[] hex) {
String data = BleStrUtils.byte2HexStr(hex);
addTextWithTime("接收到未知指令:" + data);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == 2001) {
finish();
}
}
}

+ 284
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/airdetector/AirDetectorShowUtil.java Dosyayı Görüntüle

@@ -0,0 +1,284 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.airdetector;

import android.util.SparseArray;

import java.util.Arrays;
import java.util.LinkedHashMap;

import cn.net.aicare.modulelibrary.module.airDetector.AirConst;
import cn.net.aicare.modulelibrary.module.airDetector.AlarmClockStatement;
import cn.net.aicare.modulelibrary.module.airDetector.BrightnessStatement;
import cn.net.aicare.modulelibrary.module.airDetector.StatusBean;
import cn.net.aicare.modulelibrary.module.airDetector.SupportBean;

/**
* @author yesp
*/
public class AirDetectorShowUtil {

public static String getTextSupportShow(SupportBean bean) {
int type = bean.getType();
StringBuilder builder = new StringBuilder();
builder.append("支持的功能: ").append(AirUtil.getTypeName(type)).append(", ");
switch (bean.getType()) {
case AirConst.AIR_TYPE_FORMALDEHYDE:
case AirConst.AIR_TYPE_HUMIDITY:
case AirConst.AIR_TYPE_PM_2_5:
case AirConst.AIR_TYPE_PM_1:
case AirConst.AIR_TYPE_PM_10:
case AirConst.AIR_TYPE_VOC:
case AirConst.AIR_TYPE_CO2:
case AirConst.AIR_TYPE_AQI:
case AirConst.AIR_TYPE_TVOC:
case AirConst.AIR_TYPE_CO:
case AirConst.AIR_TYPE_TEMP:
builder.append("max : ").append(bean.getMax()).append(", min: ").append(bean.getMin()).append(", 小数点:").append(bean.getPoint());
break;
case AirConst.AIR_SETTING_WARM:
case AirConst.AIR_SETTING_DEVICE_ERROR:
case AirConst.AIR_SETTING_DEVICE_SELF_TEST:
case AirConst.AIR_RESTORE_FACTORY_SETTINGS:
builder.append("数值:").append(bean.getCurValue());
break;
case AirConst.AIR_SETTING_VOICE:
case AirConst.AIR_SETTING_WARM_VOICE:
builder.append("max:").append(bean.getMax());
break;
case AirConst.AIR_SETTING_WARM_DURATION:
builder.append("max:").append(bean.getMax()).append(" S");
break;
case AirConst.AIR_ALARM_CLOCK:
AlarmClockStatement alarmClockStatement = (AlarmClockStatement) bean.getExtentObject();
String alarmShow = "闹钟显示:" + alarmClockStatement.isShowIcon();
String alarmCount = ", 闹钟数量:" + alarmClockStatement.getAlarmCount();
String mode0 = ", 模式 0:一次性,当天有效:" + alarmClockStatement.isMode0();
String mode1 = ", 模式 1:每天都响:" + alarmClockStatement.isMode1();
String mode2 = ", 模式 2:周一至周五:" + alarmClockStatement.isMode2();
String mode3 = ", 模式 3:周一至周六:" + alarmClockStatement.isMode3();
String mode4 = ", 模式 4:自定义:" + alarmClockStatement.isMode4();
builder.append(alarmShow).append(alarmCount).append(mode0).append(mode1).append(mode2).append(mode3).append(mode4);
break;
case AirConst.AIR_KEY_SOUND:
case AirConst.AIR_ALARM_SOUND_EFFECT:
case AirConst.AIR_ICON_DISPLAY:
case AirConst.AIR_MONITORING_DISPLAY_DATA:
builder.append("开/关切换支持:").append(bean.getCurValue() == 1 ? "1 - 支持" : "0 - 不支持");
break;
case AirConst.AIR_CALIBRATION_PARAMETERS:
int[] types = (int[]) bean.getExtentObject();
builder.append(Arrays.toString(types)).append(" - ").append(AirUtil.showTypeArrayName(types));
break;
case AirConst.AIR_TIME_FORMAT:
int val = (int) bean.getCurValue();
String support12 = ((val & 0x02) == 2) ? "1 - 支持" : "0 - 不支持";
String support24 = ((val & 0x01) == 1) ? "1 - 支持" : "0 - 不支持";
builder.append("12h 格式:").append(support12).append(", 24h 格式:").append(support24);
break;
case AirConst.AIR_BRIGHTNESS_EQUIPMENT:
BrightnessStatement statement = (BrightnessStatement) bean.getExtentObject();
String supportAuto = "自动调节:" + (statement.isAutoAdjust() ? "1 - 支持" : "0 - 不支持");
String supportManual = ", 手动调节:" + (statement.isManualAdjust() ? "1 - 支持" : "0 - 不支持");
String mode = ", 模式:" + (statement.getMode() == 1 ? "1 - 档位" : "0 - 百分比模式:0-100%");
builder.append(supportAuto).append(supportManual).append(mode).append(", 档位:").append(statement.getLevelCount());
break;
case AirConst.AIR_DATA_DISPLAY_MODE:
int[] ids = (int[]) bean.getExtentObject();
builder.append("模式数量:").append(bean.getCurValue()).append("[vid, pid] - ").append(Arrays.toString(ids));
break;
case AirConst.AIR_SETTING_SWITCH_TEMP_UNIT:
builder.append("温度: ").append(bean.getCurValue() == 1 ? "1 - 支持" : "0 - 不支持");
break;
default:
break;
}
return builder.toString();
}

/**
* 实时状态返回
*
* @param statusBean
* @param supportList
* @return
*/
public static String getTextStatusShow(StatusBean statusBean, SparseArray<SupportBean> supportList) {
int type = statusBean.getType();
// 支持列表不包含,添加空字符串
SupportBean supportBean = supportList.get(type);
if (supportBean == null && AirConst.AIR_SETTING_SWITCH_TEMP_UNIT != type && AirConst.AIR_SETTING_BATTEY != type) {
return "不支持的类型:" + type;
}
StringBuilder builder = new StringBuilder();
builder.append("实时状态,").append(AirUtil.getTypeName(type)).append(" : ");
switch (type) {
case AirConst.AIR_TYPE_FORMALDEHYDE:
case AirConst.AIR_TYPE_HUMIDITY:
case AirConst.AIR_TYPE_PM_2_5:
case AirConst.AIR_TYPE_PM_1:
case AirConst.AIR_TYPE_PM_10:
case AirConst.AIR_TYPE_VOC:
case AirConst.AIR_TYPE_CO2:
case AirConst.AIR_TYPE_AQI:
case AirConst.AIR_TYPE_TVOC:
case AirConst.AIR_TYPE_CO:
double curValue = statusBean.getValue() / Math.pow(10, supportBean.getPoint());
builder.append(curValue);
break;
case AirConst.AIR_SETTING_WARM_DURATION:
builder.append(statusBean.getValue()).append(" 秒");
break;
case AirConst.AIR_TYPE_TEMP:
builder.append(statusBean.getValue()).append(AirUtil.getTempUnitName(statusBean.getUnit()));
break;
case AirConst.AIR_SETTING_WARM:
int[] warms = (int[]) statusBean.getExtentObject();
builder.append(AirUtil.getSwitchStatus(statusBean.isOpen())).append(", 状态:").append(Arrays.toString(warms));
break;
case AirConst.AIR_SETTING_VOICE:
builder.append("开关:").append(AirUtil.getSwitchStatus(statusBean.isOpen())).append(", 音量: ").append(statusBean.getValue());
break;
case AirConst.AIR_SETTING_WARM_VOICE:
case AirConst.AIR_SETTING_DEVICE_SELF_TEST:
case AirConst.AIR_RESTORE_FACTORY_SETTINGS:
case AirConst.AIR_DATA_DISPLAY_MODE:
builder.append(statusBean.getValue());
break;
case AirConst.AIR_TIME_FORMAT:
builder.append(AirUtil.getTimeFormat((int) statusBean.getValue()));
break;
case AirConst.AIR_SETTING_BATTEY:
builder.append(AirUtil.getBatteryFormat(statusBean));
break;
case AirConst.AIR_ALARM_CLOCK:
builder.append(AirUtil.dealCalResultAllAlarm(statusBean, supportBean));
break;
case AirConst.AIR_CALIBRATION_PARAMETERS:
builder.append(AirUtil.dealCalResultAllStatus(statusBean, supportList));
break;
case AirConst.AIR_BRIGHTNESS_EQUIPMENT:
builder.append("自动调节:" + AirUtil.getSwitchStatus(statusBean.isOpen()) + ", 亮度值/档位:" + statusBean.getValue());
break;
case AirConst.AIR_KEY_SOUND:
case AirConst.AIR_ALARM_SOUND_EFFECT:
case AirConst.AIR_ICON_DISPLAY:
case AirConst.AIR_MONITORING_DISPLAY_DATA:
builder.append(AirUtil.getSwitchStatus(statusBean.isOpen()));
break;
default:
break;
}
return builder.toString();
}

/**
* 设置指令返回
*
* @param settingBean
* @param supportList
* @return
*/
public static String getResultSettingsShow(StatusBean settingBean, SparseArray<SupportBean> supportList) {
StringBuilder builder = new StringBuilder();
int type = settingBean.getType();
// 支持列表不包含,添加空字符串
SupportBean supportBean = supportList.get(type);
if (supportBean == null && AirConst.AIR_SETTING_SWITCH_TEMP_UNIT != type) {
return "不支持的类型:" + type;
}
builder.append("返回参数值,").append(AirUtil.getTypeName(type)).append(" : ");
switch (type) {
case AirConst.AIR_TYPE_FORMALDEHYDE:
case AirConst.AIR_TYPE_PM_2_5:
case AirConst.AIR_TYPE_PM_1:
case AirConst.AIR_TYPE_PM_10:
case AirConst.AIR_TYPE_VOC:
case AirConst.AIR_TYPE_CO2:
case AirConst.AIR_TYPE_AQI:
case AirConst.AIR_TYPE_TVOC:
case AirConst.AIR_TYPE_CO:
builder.append(AirUtil.getWarmResultStr(supportBean, settingBean));
break;
case AirConst.AIR_TYPE_HUMIDITY:
int hPow = (int) Math.pow(10, supportBean.getPoint());
String humpStr = "下限值:" + settingBean.getWarmMin() / hPow + ", 上限值: " + settingBean.getWarmMax() / hPow;
builder.append(humpStr);
break;
case AirConst.AIR_TYPE_TEMP:
String tempStr = "下限值:" + settingBean.getWarmMin() + ", 上限值: " + settingBean.getWarmMax();
builder.append(tempStr);
break;
case AirConst.AIR_SETTING_VOICE:
builder.append("开关:").append(AirUtil.getSwitchStatus(settingBean.isOpen())).append(", Level: ").append(settingBean.getValue());
break;
case AirConst.AIR_SETTING_WARM_DURATION:
builder.append("时长:").append(settingBean.getValue()).append(" S");
break;
case AirConst.AIR_SETTING_WARM_VOICE:
builder.append("铃声:").append(settingBean.getValue());
break;
case AirConst.AIR_SETTING_DEVICE_SELF_TEST:
// todo: 自检,暂时忽略
break;
case AirConst.AIR_SETTING_BIND_DEVICE:
// todo: 设备绑定,暂时忽略
break;
case AirConst.AIR_RESTORE_FACTORY_SETTINGS:
// todo: 恢复出厂设置:暂时忽略
break;
case AirConst.AIR_TIME_FORMAT:
builder.append(AirUtil.getTimeFormat((int) settingBean.getValue()));
break;
case AirConst.AIR_DATA_DISPLAY_MODE:
builder.append(settingBean.getValue());
break;
case AirConst.AIR_SETTING_SWITCH_TEMP_UNIT:
builder.append("当前单位:").append(AirUtil.getTempUnitName(settingBean.getUnit()));
break;
case AirConst.AIR_ALARM_CLOCK:
builder.append(AirUtil.dealCalResultAllAlarm(settingBean, supportBean));
break;
case AirConst.AIR_CALIBRATION_PARAMETERS:
builder.append(AirUtil.dealCalResultAllSettings(settingBean, supportList));
break;
case AirConst.AIR_BRIGHTNESS_EQUIPMENT:
builder.append("自动调节:" + AirUtil.getSwitchStatus(settingBean.isOpen()) + ", 档位/亮度:" + settingBean.getValue());
break;
case AirConst.AIR_KEY_SOUND:
case AirConst.AIR_ALARM_SOUND_EFFECT:
case AirConst.AIR_ICON_DISPLAY:
case AirConst.AIR_MONITORING_DISPLAY_DATA:
builder.append(AirUtil.getSwitchStatus(settingBean.isOpen()));
break;
}
return builder.toString();
}

public static LinkedHashMap<String, SetType> initSettingTypes() {
LinkedHashMap<String, SetType> arrayMap = new LinkedHashMap<>();
arrayMap.put("甲醛报警", new SetType(0x01, SetType.TYPE_VALUE_SWITCH));
arrayMap.put("温度报警", new SetType(0x02, SetType.TYPE_MIN_MAX_SWITCH));
arrayMap.put("湿度报警", new SetType(0x03, SetType.TYPE_MIN_MAX_SWITCH));
arrayMap.put("PM2.5 报警", new SetType(0x04, SetType.TYPE_VALUE_SWITCH));
arrayMap.put("PM1.0 报警", new SetType(0x05, SetType.TYPE_VALUE_SWITCH));
arrayMap.put("PM10 报警", new SetType(0x06, SetType.TYPE_VALUE_SWITCH));
arrayMap.put("VOC 报警", new SetType(0x07, SetType.TYPE_VALUE_SWITCH));
arrayMap.put("C02 报警", new SetType(0x08, SetType.TYPE_VALUE_SWITCH));
arrayMap.put("AQI 报警", new SetType(0x09, SetType.TYPE_VALUE_SWITCH));
arrayMap.put("TVOC 报警", new SetType(0x10, SetType.TYPE_VALUE_SWITCH));
arrayMap.put("C0 报警", new SetType(0x15, SetType.TYPE_VALUE_SWITCH));
arrayMap.put("音量", new SetType(0x0b, SetType.TYPE_VALUE_SWITCH));
arrayMap.put("报警时长", new SetType(0x0c, SetType.TYPE_VALUE));
arrayMap.put("报警铃声值", new SetType(0x0d, SetType.TYPE_VALUE));
arrayMap.put("单位切换", new SetType(0x11, SetType.TYPE_VALUE));
arrayMap.put("时间格式切换", new SetType(0x19, SetType.TYPE_VALUE));
arrayMap.put("设备亮度", new SetType(0x1a, SetType.TYPE_VALUE_SWITCH));
arrayMap.put("按键音效", new SetType(0x1b, SetType.TYPE_SWITCH));
arrayMap.put("报警音效", new SetType(0x1c, SetType.TYPE_SWITCH));
arrayMap.put("图标显示", new SetType(0x1d, SetType.TYPE_SWITCH));
arrayMap.put("监控显示", new SetType(0x1e, SetType.TYPE_SWITCH));
arrayMap.put("显示模式", new SetType(0x1f, SetType.TYPE_VALUE));
arrayMap.put("参数校准", new SetType(0x18, SetType.TYPE_CAL));
arrayMap.put("闹钟", new SetType(0x16, SetType.TYPE_ALARM));
return arrayMap;
}
}

+ 278
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/airdetector/AirUtil.java Dosyayı Görüntüle

@@ -0,0 +1,278 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.airdetector;

import android.text.TextUtils;
import android.util.SparseArray;

import java.util.ArrayList;

import cn.net.aicare.modulelibrary.module.airDetector.AirConst;
import cn.net.aicare.modulelibrary.module.airDetector.AlarmClockInfoList;
import cn.net.aicare.modulelibrary.module.airDetector.CalibrationListBean;
import cn.net.aicare.modulelibrary.module.airDetector.StatusBean;
import cn.net.aicare.modulelibrary.module.airDetector.SupportBean;

/**
* @author yesp
*/
public class AirUtil {

public static final SparseArray<String> typeNameArray = new SparseArray<>();

static {
typeNameArray.append(AirConst.AIR_TYPE_FORMALDEHYDE, "甲醛");
typeNameArray.append(AirConst.AIR_TYPE_TEMP, "温度");
typeNameArray.append(AirConst.AIR_TYPE_HUMIDITY, "湿度");
typeNameArray.append(AirConst.AIR_TYPE_PM_2_5, "PM2.5");
typeNameArray.append(AirConst.AIR_TYPE_PM_1, "PM1.0");
typeNameArray.append(AirConst.AIR_TYPE_PM_10, "PM10");
typeNameArray.append(AirConst.AIR_TYPE_VOC, "VOC");
typeNameArray.append(AirConst.AIR_TYPE_CO2, "CO2");
typeNameArray.append(AirConst.AIR_TYPE_AQI, "AQI");
typeNameArray.append(AirConst.AIR_SETTING_WARM, "报警功能");
typeNameArray.append(AirConst.AIR_SETTING_VOICE, "音量");
typeNameArray.append(AirConst.AIR_SETTING_WARM_DURATION, "报警时长");
typeNameArray.append(AirConst.AIR_SETTING_WARM_VOICE, "报警铃声");
typeNameArray.append(AirConst.AIR_SETTING_DEVICE_ERROR, "设备故障");
typeNameArray.append(AirConst.AIR_SETTING_DEVICE_SELF_TEST, "设备自检");
typeNameArray.append(AirConst.AIR_TYPE_TVOC, "TVOC");
typeNameArray.append(AirConst.AIR_SETTING_SWITCH_TEMP_UNIT, "单位切换");
typeNameArray.append(AirConst.AIR_SETTING_BATTEY, "电池状态");
typeNameArray.append(AirConst.AIR_SETTING_BIND_DEVICE, "设备绑定");
typeNameArray.append(AirConst.AIR_SETTING_HEART, "心跳包");
typeNameArray.append(AirConst.AIR_TYPE_CO, "CO");
typeNameArray.append(AirConst.AIR_ALARM_CLOCK, "闹钟功能");
typeNameArray.append(AirConst.AIR_RESTORE_FACTORY_SETTINGS, "恢复出厂设置");
typeNameArray.append(AirConst.AIR_CALIBRATION_PARAMETERS, "参数校准");
typeNameArray.append(AirConst.AIR_TIME_FORMAT, "时间格式");
typeNameArray.append(AirConst.AIR_BRIGHTNESS_EQUIPMENT, "设备亮度");
typeNameArray.append(AirConst.AIR_KEY_SOUND, "按键音效");
typeNameArray.append(AirConst.AIR_ALARM_SOUND_EFFECT, "报警音效");
typeNameArray.append(AirConst.AIR_ICON_DISPLAY, "图标显示");
typeNameArray.append(AirConst.AIR_MONITORING_DISPLAY_DATA, "监控显示数据");
typeNameArray.append(AirConst.AIR_DATA_DISPLAY_MODE, "数据显示模式");
}


/**
* 根据 type 显示对应类型的名称
*
* @param type type
* @return 类型的名称
*/
public static String getTypeName(int type) {
String typeName = typeNameArray.get(type);
return TextUtils.isEmpty(typeName) ? "unknown type" : typeName;
}

/**
* 类型名称列表
*
* @param types
* @return
*/
public static String showTypeArrayName(int[] types) {
if (null != types) {
StringBuilder sb = new StringBuilder();
sb.append("[");
for (int i = 0; i < types.length; i++) {
sb.append(getTypeName(types[i]));
if (i != types.length - 1) {
sb.append(", ");
}
}
sb.append("]");
return sb.toString();
}
return "";
}

/**
* 温度单位
* @param unit
* @return
*/
public static String getTempUnitName(int unit) {
if (unit == AirConst.UNIT_C) {
return "℃";
} else if (unit == AirConst.UNIT_F) {
return "℉";
}
return "";
}

/**
* 开关
*
* @param status
* @return
*/
public static String getSwitchStatus(boolean status) {
return status ? "1 - 开" : "0 - 关";
}

/**
* 时间显示格式
*
* @param value
* @return
*/
public static String getTimeFormat(int value) {
if (value == 0x01) {
return "12小时";
} else if (value == 0x02) {
return "24小时";
} else {
return "未知";
}
}

/**
* 电池状态
* @param statusBean
* @return
*/
public static String getBatteryFormat(StatusBean statusBean) {
String text = statusBean.getValue() + ", 充电状态:";
int[] status = (int[]) statusBean.getExtentObject();
if (status != null && status.length == 2) {
if (status[0] == 1) {
text += "在充电";
} else {
text += "未充电";
}
if (status[0] == 1) {
text += ",电压状态:低电";
} else {
text += ",电压状态:电压正常";
}
}
return text;
}

/**
* 校准操作
* @param value
* @return
*/
public static String getOperateStr(int value) {
if (value == 0) {
return "校准值加一";
} else {
return "校准值减一";
}
}

/**
* 处理校验状态返回
*
* @param resultBean resultBean
*/
public static String dealCalResultAllStatus(StatusBean resultBean, SparseArray<SupportBean> supportList) {
if (resultBean.getExtentObject() instanceof CalibrationListBean) {
CalibrationListBean listBean = (CalibrationListBean) resultBean.getExtentObject();
ArrayList<CalibrationListBean.CalibrationBean> list = listBean.getCalibrationBeanList();
if (list == null || list.isEmpty()) {
return "";
}
StringBuilder builder = new StringBuilder();
for (CalibrationListBean.CalibrationBean bean : list) {
int type = bean.getCalType();
// 支持列表不包含,下一项
SupportBean supportBean = supportList.get(type);
if (supportBean == null) {
continue;
}
double curValue = bean.getCalValue() / Math.pow(10, supportBean.getPoint());
builder.append(AirUtil.getTypeName(bean.getCalType())).append("- 校准值: ").append(curValue);
builder.append("\n");
}
return builder.toString();
}
return "";
}

/**
* 处理校验设置返回
*
* @param resultBean resultBean
*/
public static String dealCalResultAllSettings(StatusBean resultBean, SparseArray<SupportBean> supportList) {
if (resultBean.getExtentObject() instanceof CalibrationListBean) {
CalibrationListBean listBean = (CalibrationListBean) resultBean.getExtentObject();
ArrayList<CalibrationListBean.CalibrationBean> list = listBean.getCalibrationBeanList();
if (list == null || list.isEmpty()) {
return "";
}
StringBuilder builder = new StringBuilder();
for (CalibrationListBean.CalibrationBean bean : list) {
int type = bean.getCalType();
// 支持列表不包含,下一项
SupportBean supportBean = supportList.get(type);
if (supportBean == null) {
continue;
}
builder.append(AirUtil.getTypeName(bean.getCalType())).append(getOperateStr(bean.getCalOperate()));
builder.append("\n");
}
return builder.toString();
}
return "";
}

/**
* 报警值
*
* @param supportBean
* @param resultBean
* @return
*/
public static String getWarmResultStr(SupportBean supportBean, StatusBean resultBean) {
double curValue = resultBean.getWarmMax() / Math.pow(10, supportBean.getPoint());
return "报警值:" + curValue + ", 开关:" + AirUtil.getSwitchStatus(resultBean.isOpen());
}

/**
* 闹钟显示
* @param resultBean
* @param supportBean
* @return
*/
public static String dealCalResultAllAlarm(StatusBean resultBean, SupportBean supportBean) {
if (resultBean.getExtentObject() instanceof AlarmClockInfoList) {
AlarmClockInfoList infoList = (AlarmClockInfoList) resultBean.getExtentObject();
ArrayList<AlarmClockInfoList.AlarmInfo> list = infoList.getAlarmList();
if (list == null || list.size() == 0) {
return "[]";
}
StringBuilder builder = new StringBuilder();
for (AlarmClockInfoList.AlarmInfo bean : list) {
builder.append(getSwitchStatus(bean.getSwitchStatus() == 1));
builder.append(", 删除:").append(bean.isDeleted());
builder.append(", 编号:").append(bean.getId());
builder.append(", 模式:").append(bean.getMode());
builder.append(", 闹钟时间:").append(bean.getHour()).append(":").append(bean.getMinute());
builder.append(", 闹钟周期:").append(dealAlarmDay(bean.getAlarmDays()));
builder.append("\n");
}
return builder.toString();
} else {
return "[]";
}
}

private static String dealAlarmDay(int[] days){
if (days == null) {
return "";
}
String[] dayStr = {"未知","周一","周二","周三","周四","周五","周六","周日"};
StringBuilder builder = new StringBuilder();
builder.append("[");
for (int i = 1; i < days.length; i++) {
if (days[i] == 1) {
builder.append(dayStr[i]).append(",");
}
}
builder.append("]");
return builder.toString();
}
}

+ 18
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/airdetector/SetType.java Dosyayı Görüntüle

@@ -0,0 +1,18 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.airdetector;

public class SetType {

public static final int TYPE_VALUE_SWITCH = 0;
public static final int TYPE_MIN_MAX_SWITCH = 1;
public static final int TYPE_SWITCH = 2;
public static final int TYPE_CAL = 3;
public static final int TYPE_VALUE = 4;
public static final int TYPE_ALARM = 5;
int type;
int showType;

public SetType(int type, int showType) {
this.type = type;
this.showType = showType;
}
}

+ 1070
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/airdetector_test/AirDetectorActivityTest.java
Dosya farkı çok büyük olduğundan ihmal edildi
Dosyayı Görüntüle


+ 130
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/airdetector_test/AirDetectorTestAdapter.java Dosyayı Görüntüle

@@ -0,0 +1,130 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.airdetector_test;

import android.content.Context;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.RecyclerView;

public class AirDetectorTestAdapter extends RecyclerView.Adapter<AirDetectorTestAdapter.ViewHolder> {

private Context mContext;
private List<AirDetectorTestBean> mList;

public interface OnSelectListener {
void onSelect(int pos);
}

private OnSelectListener mOnSelectListener;

public void setOnSelectListener(OnSelectListener onSelectListener) {
mOnSelectListener = onSelectListener;
}

class ViewHolder extends RecyclerView.ViewHolder {

TextView tv_title;
TextView tv_result;
TextView tv_content;

public ViewHolder(@NonNull View itemView) {
super(itemView);
tv_title = itemView.findViewById(R.id.tv_title);
tv_result = itemView.findViewById(R.id.tv_result);
tv_content = itemView.findViewById(R.id.tv_content);
}

void bind(int pos) {
AirDetectorTestBean bean = mList.get(pos);
tv_title.setText(bean.getTitle());

if (TextUtils.isEmpty(bean.getResultStr())) {
switch (bean.getResult()) {
case 0:
tv_result.setText("");
break;
case 1:
tv_result.setText("OK");
tv_result.setTextColor(ContextCompat.getColor(mContext, android.R.color.holo_blue_dark));
break;
case 2:
tv_result.setText("NG ?");
tv_result.setTextColor(ContextCompat.getColor(mContext, android.R.color.holo_red_dark));
break;
}
} else {
tv_result.setText(bean.getResultStr());
tv_result.setTextColor(ContextCompat.getColor(mContext, R.color.colorAccent));
}
if (TextUtils.isEmpty(bean.getContentStr())) {
tv_content.setVisibility(View.GONE);
} else {
tv_content.setVisibility(View.VISIBLE);
tv_content.setText(bean.getContentStr());
}
}

void bindTest(int pos) {
AirDetectorTestBean bean = mList.get(pos);
if (bean.getType() == 1) {
tv_title.setText("自动测试");
} else {
tv_title.setText("手动测试");
}
}
}

public AirDetectorTestAdapter(Context context, List<AirDetectorTestBean> list) {
mContext = context;
mList = list;
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ViewHolder viewHolder;

if (viewType == 0) {
viewHolder = new ViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_air_detector_test, parent, false));
viewHolder.itemView.setOnClickListener(v -> {
int pos = viewHolder.getAdapterPosition();
if (pos != -1 && mOnSelectListener != null) {
mOnSelectListener.onSelect(pos);
}
});
} else {
viewHolder = new ViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_air_detector_test_title, parent, false));
}


return viewHolder;
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
if (holder.getItemViewType() == 0) {
holder.bind(position);
} else {
holder.bindTest(position);
}
}

@Override
public int getItemCount() {
return mList.size();
}

@Override
public int getItemViewType(int position) {
AirDetectorTestBean bean = mList.get(position);
return bean.getType();
}
}

+ 75
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/airdetector_test/AirDetectorTestBean.java Dosyayı Görüntüle

@@ -0,0 +1,75 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.airdetector_test;

public class AirDetectorTestBean {
private int type;// 显示类型;0:正常;1:自动测试;2:手动测试
private int step;// 第几步
private String title;
private int result;// 0 不显示;1 成功;2 失败
private String resultStr;// 如果不为空,说明提示其它内容
private String contentStr; // 返回内容

public AirDetectorTestBean(int step, String title, int result) {
this.step = step;
this.title = title;
this.result = result;
}

public AirDetectorTestBean(int step, String title, int result, String contentStr) {
this.step = step;
this.title = title;
this.result = result;
this.contentStr = contentStr;
}

public AirDetectorTestBean(int type) {
this.type = type;
}

public int getStep() {
return step;
}

public void setStep(int step) {
this.step = step;
}

public String getTitle() {
return title;
}

public void setTitle(String title) {
this.title = title;
}

public int getResult() {
return result;
}

public void setResult(int result) {
this.result = result;
}

public String getResultStr() {
return resultStr;
}

public void setResultStr(String resultStr) {
this.resultStr = resultStr;
}

public int getType() {
return type;
}

public void setType(int type) {
this.type = type;
}

public String getContentStr() {
return contentStr;
}

public void setContentStr(String contentStr) {
this.contentStr = contentStr;
}
}

+ 364
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/airdetector_test/AirDetectorTestShowUtil.java Dosyayı Görüntüle

@@ -0,0 +1,364 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.airdetector_test;

import android.util.SparseArray;

import java.util.ArrayList;
import java.util.Arrays;

import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.airdetector.AirUtil;
import androidx.annotation.NonNull;
import cn.net.aicare.modulelibrary.module.airDetector.AirConst;
import cn.net.aicare.modulelibrary.module.airDetector.CalibrationListBean;
import cn.net.aicare.modulelibrary.module.airDetector.StatusBean;
import cn.net.aicare.modulelibrary.module.airDetector.SupportBean;

public class AirDetectorTestShowUtil {

/**
* 支持的功能列表
*
* @param supportList
* @return
*/
public static String showTextSupport(SparseArray<SupportBean> supportList) {
int[] supportTypes = new int[supportList.size()];
for (int i = 0; i < supportList.size(); i++) {
supportTypes[i] = supportList.keyAt(i);
}
return AirUtil.showTypeArrayName(supportTypes);
}

/**
* 实时状态返回
*
* @param statusList
* @param supportList
* @return
*/
public static String showTextStatus(SparseArray<StatusBean> statusList, SparseArray<SupportBean> supportList) {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < statusList.size(); i++) {
int type = statusList.keyAt(i);
// 支持列表不包含,添加空字符串
SupportBean supportBean = supportList.get(type);
if (supportBean == null && AirConst.AIR_SETTING_SWITCH_TEMP_UNIT != type && AirConst.AIR_SETTING_BATTEY != type) {
builder.append("");
continue;
}
StatusBean statusBean = statusList.get(type);
builder.append(AirUtil.getTypeName(type) + " : ");
switch (type) {
case AirConst.AIR_TYPE_FORMALDEHYDE:
case AirConst.AIR_TYPE_HUMIDITY:
case AirConst.AIR_TYPE_PM_2_5:
case AirConst.AIR_TYPE_PM_1:
case AirConst.AIR_TYPE_PM_10:
case AirConst.AIR_TYPE_VOC:
case AirConst.AIR_TYPE_CO2:
case AirConst.AIR_TYPE_AQI:
case AirConst.AIR_TYPE_TVOC:
case AirConst.AIR_SETTING_WARM_DURATION:
case AirConst.AIR_TYPE_CO:
double curValue = statusBean.getValue() / Math.pow(10, supportBean.getPoint());
builder.append(curValue);
break;
case AirConst.AIR_TYPE_TEMP:
builder.append(statusBean.getValue()).append(AirUtil.getTempUnitName(statusBean.getUnit()));
break;
case AirConst.AIR_SETTING_WARM:
int[] warms = (int[]) statusBean.getExtentObject();
builder.append(AirUtil.getSwitchStatus(statusBean.isOpen())).append(", 状态:").append(Arrays.toString(warms));
break;
case AirConst.AIR_SETTING_VOICE:
builder.append("开关:").append(AirUtil.getSwitchStatus(statusBean.isOpen())).append(", 音量: ").append(statusBean.getValue());
break;
case AirConst.AIR_SETTING_WARM_VOICE:
case AirConst.AIR_SETTING_DEVICE_SELF_TEST:
case AirConst.AIR_RESTORE_FACTORY_SETTINGS:
case AirConst.AIR_DATA_DISPLAY_MODE:
builder.append(statusBean.getValue());
break;
case AirConst.AIR_TIME_FORMAT:
builder.append(AirUtil.getTimeFormat((int) statusBean.getValue()));
break;
case AirConst.AIR_SETTING_BATTEY:
builder.append(AirUtil.getBatteryFormat(statusBean));
break;
case AirConst.AIR_ALARM_CLOCK:
builder.append(AirUtil.dealCalResultAllAlarm(statusBean, supportBean));
break;
case AirConst.AIR_CALIBRATION_PARAMETERS:
builder.append(AirUtil.dealCalResultAllStatus(statusBean, supportList));
break;
case AirConst.AIR_BRIGHTNESS_EQUIPMENT:
builder.append("自动调节:" + AirUtil.getSwitchStatus(statusBean.isOpen()) + ", 亮度值/档位:" + statusBean.getValue());
break;
case AirConst.AIR_KEY_SOUND:
case AirConst.AIR_ALARM_SOUND_EFFECT:
case AirConst.AIR_ICON_DISPLAY:
case AirConst.AIR_MONITORING_DISPLAY_DATA:
builder.append(AirUtil.getSwitchStatus(statusBean.isOpen()));
break;
default:
break;
}
builder.append("\n");
}
return builder.toString();
}

/**
* 设置指令返回
*
* @param settingList
* @param supportList
* @Param resultInterface
* @return
*/
public static String showGetResultSettings(SparseArray<StatusBean> settingList, SparseArray<SupportBean> supportList){
StringBuilder builder = new StringBuilder();
for (int i = 0; i < settingList.size(); i++) {
int type = settingList.keyAt(i);
// 支持列表不包含,添加空字符串
SupportBean supportBean = supportList.get(type);
if (supportBean == null && AirConst.AIR_SETTING_SWITCH_TEMP_UNIT != type) {
builder.append("");
continue;
}
StatusBean settingBean = settingList.get(type);
builder.append(AirUtil.getTypeName(type) + " : ");
switch (type) {
case AirConst.AIR_TYPE_FORMALDEHYDE:
case AirConst.AIR_TYPE_PM_2_5:
case AirConst.AIR_TYPE_PM_1:
case AirConst.AIR_TYPE_PM_10:
case AirConst.AIR_TYPE_VOC:
case AirConst.AIR_TYPE_CO2:
case AirConst.AIR_TYPE_AQI:
case AirConst.AIR_TYPE_TVOC:
case AirConst.AIR_TYPE_CO:
builder.append(AirUtil.getWarmResultStr(supportBean, settingBean));
break;
case AirConst.AIR_TYPE_HUMIDITY:
int hPow = (int) Math.pow(10, supportBean.getPoint());
String humpStr = "下限值:" + settingBean.getWarmMin() / hPow + ", 上限值: "+ settingBean.getWarmMax() / hPow;
builder.append(humpStr);
break;
case AirConst.AIR_TYPE_TEMP:
String tempStr = "下限值:" + settingBean.getWarmMin() + ", 上限值: "+ settingBean.getWarmMax();
builder.append(tempStr);
break;
case AirConst.AIR_SETTING_VOICE:
builder.append("开关:").append(AirUtil.getSwitchStatus(settingBean.isOpen())).append(", Level: ").append(settingBean.getValue());
break;
case AirConst.AIR_SETTING_WARM_DURATION:
builder.append("时长:").append(settingBean.getValue()).append(" S");
break;
case AirConst.AIR_SETTING_WARM_VOICE:
builder.append("铃声:").append(settingBean.getValue());
break;
case AirConst.AIR_SETTING_DEVICE_SELF_TEST:
// todo: 自检,暂时忽略
break;
case AirConst.AIR_SETTING_BIND_DEVICE:
// todo: 设备绑定,暂时忽略
break;
case AirConst.AIR_RESTORE_FACTORY_SETTINGS:
// todo: 恢复出厂设置:暂时忽略
break;
case AirConst.AIR_TIME_FORMAT:
builder.append(AirUtil.getTimeFormat((int) settingBean.getValue()));
break;
case AirConst.AIR_DATA_DISPLAY_MODE:
builder.append(settingBean.getValue());
break;
case AirConst.AIR_SETTING_SWITCH_TEMP_UNIT:
builder.append("当前单位:").append(AirUtil.getTempUnitName(settingBean.getUnit()));
break;
case AirConst.AIR_ALARM_CLOCK:
builder.append(AirUtil.dealCalResultAllAlarm(settingBean, supportBean));
break;
case AirConst.AIR_CALIBRATION_PARAMETERS:
builder.append(AirUtil.dealCalResultAllSettings(settingBean, supportList));
break;
case AirConst.AIR_BRIGHTNESS_EQUIPMENT:
builder.append("自动调节:" + AirUtil.getSwitchStatus(settingBean.isOpen()) + ", 档位/亮度:" + settingBean.getValue());
break;
case AirConst.AIR_KEY_SOUND:
case AirConst.AIR_ALARM_SOUND_EFFECT:
case AirConst.AIR_ICON_DISPLAY:
case AirConst.AIR_MONITORING_DISPLAY_DATA:
builder.append(AirUtil.getSwitchStatus(settingBean.isOpen()));
break;
}
builder.append("\n");
}
return builder.toString();
}

/**
* 设置指令返回
*
* @param settingList settingList
* @param supportList supportList
* @Param resultInterface
*/
public static void showResultSettings(SparseArray<StatusBean> settingList, SparseArray<SupportBean> supportList, @NonNull SettingResultInterface resultInterface) {
for (int i = 0; i < settingList.size(); i++) {
int type = settingList.keyAt(i);
// 支持列表不包含,添加空字符串
SupportBean supportBean = supportList.get(type);
// 先把切换单位的屏蔽
if (supportBean == null && AirConst.AIR_SETTING_SWITCH_TEMP_UNIT != type) {
continue;
}
StatusBean resultBean = settingList.get(type);
switch (type) {
case AirConst.AIR_TYPE_FORMALDEHYDE:
resultInterface.onWarmResultHCHO(AirUtil.getWarmResultStr(supportBean, resultBean));
break;
case AirConst.AIR_TYPE_PM_2_5:
resultInterface.onWarmResultPM2_5(AirUtil.getWarmResultStr(supportBean, resultBean));
break;
case AirConst.AIR_TYPE_PM_1:
resultInterface.onWarmResultPM1_0(AirUtil.getWarmResultStr(supportBean, resultBean));
break;
case AirConst.AIR_TYPE_PM_10:
resultInterface.onWarmResultPM10(AirUtil.getWarmResultStr(supportBean, resultBean));
break;
case AirConst.AIR_TYPE_VOC:
resultInterface.onWarmResultVOC(AirUtil.getWarmResultStr(supportBean, resultBean));
break;
case AirConst.AIR_TYPE_CO2:
resultInterface.onWarmResultCO2(AirUtil.getWarmResultStr(supportBean, resultBean));
break;
case AirConst.AIR_TYPE_AQI:
resultInterface.onWarmResultAQI(AirUtil.getWarmResultStr(supportBean, resultBean));
break;
case AirConst.AIR_TYPE_TVOC:
resultInterface.onWarmResultTVOC(AirUtil.getWarmResultStr(supportBean, resultBean));
break;
case AirConst.AIR_TYPE_CO:
resultInterface.onWarmResultCO(AirUtil.getWarmResultStr(supportBean, resultBean));
break;
case AirConst.AIR_TYPE_HUMIDITY:
String humpStr = "下限值:" + resultBean.getWarmMin() + ", 上限值: "+ resultBean.getWarmMax();
resultInterface.onWarmResultHumidity(humpStr);
break;
case AirConst.AIR_TYPE_TEMP:
String tempStr = "下限值:" + resultBean.getWarmMin() + ", 上限值: "+ resultBean.getWarmMax();
resultInterface.onWarmResultTemp(tempStr);
break;
case AirConst.AIR_SETTING_VOICE:
resultInterface.onResultVoice("开关:" + AirUtil.getSwitchStatus(resultBean.isOpen()) + ", Level: "+ resultBean.getValue());
break;
case AirConst.AIR_SETTING_WARM_DURATION:
resultInterface.onResultWarmDuration("时长:" + resultBean.getValue() + " S");
break;
case AirConst.AIR_SETTING_WARM_VOICE:
resultInterface.onResultWarmVoiceLevel("铃声:" + resultBean.getValue());
break;
case AirConst.AIR_SETTING_DEVICE_SELF_TEST:
// todo: 自检,暂时忽略
break;
case AirConst.AIR_SETTING_BIND_DEVICE:
// todo: 设备绑定,暂时忽略
break;
case AirConst.AIR_RESTORE_FACTORY_SETTINGS:
// todo: 恢复出厂设置:暂时忽略
break;
case AirConst.AIR_TIME_FORMAT:
resultInterface.onResultTimeFormat(AirUtil.getTimeFormat((int) resultBean.getValue()));
break;
case AirConst.AIR_DATA_DISPLAY_MODE:
resultInterface.onResultDataDisplayMode("显示模式:" + resultBean.getValue());
break;
case AirConst.AIR_SETTING_SWITCH_TEMP_UNIT:
resultInterface.onResultUnitChange("单位:" + AirUtil.getTempUnitName(resultBean.getUnit()));
break;
case AirConst.AIR_ALARM_CLOCK:
resultInterface.onSettingAlarmResult(AirUtil.dealCalResultAllAlarm(resultBean, supportBean));
break;
case AirConst.AIR_CALIBRATION_PARAMETERS:
dealCalResultSingleType(resultBean, resultInterface);
break;
case AirConst.AIR_BRIGHTNESS_EQUIPMENT:
resultInterface.onResultBrightnessEquipment("自动调节:" + AirUtil.getSwitchStatus(resultBean.isOpen()) + ", 档位:" + resultBean.getValue());
break;
case AirConst.AIR_KEY_SOUND:
resultInterface.onResultKeySound("按键音效开关:" + AirUtil.getSwitchStatus(resultBean.isOpen()));
break;
case AirConst.AIR_ALARM_SOUND_EFFECT:
resultInterface.onResultAlarmSoundEffect("报警音效开关:" + AirUtil.getSwitchStatus(resultBean.isOpen()));
break;
case AirConst.AIR_ICON_DISPLAY:
resultInterface.onResultIconDisplay("图标显示开关:" + AirUtil.getSwitchStatus(resultBean.isOpen()));
break;
case AirConst.AIR_MONITORING_DISPLAY_DATA:
resultInterface.onResultMonitoringDisplayData("监测显示数据开关:" + AirUtil.getSwitchStatus(resultBean.isOpen()));
break;
default:
break;
}
}
}


/**
* 处理校验信息返回
*
* @param resultBean resultBean
*/
private static void dealCalResultSingleType(StatusBean resultBean, SettingResultInterface resultInterface) {
if (resultBean.getExtentObject() instanceof CalibrationListBean) {
CalibrationListBean listBean = (CalibrationListBean) resultBean.getExtentObject();
ArrayList<CalibrationListBean.CalibrationBean> list = listBean.getCalibrationBeanList();
if (list == null || list.isEmpty()) {
return;
}
for (CalibrationListBean.CalibrationBean bean : list) {
String resultStr = AirUtil.getOperateStr(bean.getCalOperate());
switch (bean.getCalType()){
case AirConst.AIR_TYPE_FORMALDEHYDE:
resultInterface.onCalResultHCHO(resultStr);
break;
case AirConst.AIR_TYPE_HUMIDITY:
resultInterface.onCalResultHumidity(resultStr);
break;
case AirConst.AIR_TYPE_PM_2_5:
resultInterface.onCalResultPM2_5(resultStr);
break;
case AirConst.AIR_TYPE_PM_1:
resultInterface.onCalResultPM1_0(resultStr);
break;
case AirConst.AIR_TYPE_PM_10:
resultInterface.onCalResultPM10(resultStr);
break;
case AirConst.AIR_TYPE_VOC:
resultInterface.onCalResultVOC(resultStr);
break;
case AirConst.AIR_TYPE_CO2:
resultInterface.onCalResultCO2(resultStr);
break;
case AirConst.AIR_TYPE_AQI:
resultInterface.onCalResultAQI(resultStr);
break;
case AirConst.AIR_TYPE_TVOC:
resultInterface.onCalResultTVOC(resultStr);
break;
case AirConst.AIR_TYPE_CO:
resultInterface.onCalResultCO(resultStr);
break;
case AirConst.AIR_TYPE_TEMP:
resultInterface.onCalResultTemp(resultStr);
break;
default:
break;
}
}
}
}


}

+ 179
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/airdetector_test/SettingResultInterface.java Dosyayı Görüntüle

@@ -0,0 +1,179 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.airdetector_test;

public interface SettingResultInterface {

/**
* 甲醛报警
* @param content
*/
public void onWarmResultHCHO(String content);

/**
* 温度报警
* @param content
*/
public void onWarmResultTemp(String content);
/**
* 湿度报警
* @param content
*/
public void onWarmResultHumidity(String content);
/**
* PM2_5报警
* @param content
*/
public void onWarmResultPM2_5(String content);
/**
* PM1_0报警
* @param content
*/
public void onWarmResultPM1_0(String content);
/**
* PM10报警
* @param content
*/
public void onWarmResultPM10(String content);
/**
* VOC报警
* @param content
*/
public void onWarmResultVOC(String content);
/**
* CO2报警
* @param content
*/
public void onWarmResultCO2(String content);
/**
* AQI报警
* @param content
*/
public void onWarmResultAQI(String content);
/**
* TVOC报警
* @param content
*/
public void onWarmResultTVOC(String content);
/**
* CO报警
* @param content
*/
public void onWarmResultCO(String content);
/**
* 音量状态
* @param content
*/
public void onResultVoice(String content);
/**
* 报警时长
* @param content
*/
public void onResultWarmDuration(String content);
/**
* 报警铃声值
* @param content
*/
public void onResultWarmVoiceLevel(String content);
/**
* 温度单位切换
* @param content
*/
public void onResultUnitChange(String content);
/**
* 时间格式设置
* @param content
*/
public void onResultTimeFormat(String content);
/**
* 设备亮度
* @param content
*/
public void onResultBrightnessEquipment(String content);
/**
* 按键音效
* @param content
*/
public void onResultKeySound(String content);
/**
* 报警音效
* @param content
*/
public void onResultAlarmSoundEffect(String content);
/**
* 图标显示
* @param content
*/
public void onResultIconDisplay(String content);
/**
* 监控显示开关
* @param content
*/
public void onResultMonitoringDisplayData(String content);
/**
* 数据显示模式设置
* @param content
*/
public void onResultDataDisplayMode(String content);
/**
* 甲醛校准
* @param content
*/
public void onCalResultHCHO(String content);

/**
* 温度校准
* @param content
*/
public void onCalResultTemp(String content);
/**
* 湿度校准
* @param content
*/
public void onCalResultHumidity(String content);
/**
* PM2_5校准
* @param content
*/
public void onCalResultPM2_5(String content);
/**
* PM1_0校准
* @param content
*/
public void onCalResultPM1_0(String content);
/**
* PM10校准
* @param content
*/
public void onCalResultPM10(String content);
/**
* VOC校准
* @param content
*/
public void onCalResultVOC(String content);
/**
* CO2校准
* @param content
*/
public void onCalResultCO2(String content);
/**
* AQI校准
* @param content
*/
public void onCalResultAQI(String content);
/**
* TVOC校准
* @param content
*/
public void onCalResultTVOC(String content);
/**
* CO校准
* @param content
*/
public void onCalResultCO(String content);
/**
* 闹钟设置
* @param content
*/
public void onSettingAlarmResult(String content);


}

+ 328
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/ble_nutrition/BleNutritionActivity.java Dosyayı Görüntüle

@@ -0,0 +1,328 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_nutrition;

import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.RadioButton;

import com.pingwang.bluetoothlib.bean.SupportUnitBean;
import com.pingwang.bluetoothlib.device.BleDevice;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.BleNutrition.BleNutritionData;

public class BleNutritionActivity extends BleBaseActivity implements View.OnClickListener, BleNutritionData.BleNutritionCallback {

private static final String TAG = "Tag1";

private Button btn_clear;
private ListView list_view;
private Button btn_set_unit;
private Button btn_set_zero;
private List<RadioButton> rb_list;

private List<String> mList;
private ArrayAdapter mListAdapter;

private String mMac;
private BleDevice mBleDevice;

private BleNutritionData mBleNutritionData;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ble_nutrition);

btn_clear = findViewById(R.id.btn_clear);
list_view = findViewById(R.id.list_view);
btn_set_unit = findViewById(R.id.btn_set_unit);
btn_set_zero = findViewById(R.id.btn_set_zero);

btn_clear.setOnClickListener(this);
btn_set_unit.setOnClickListener(this);
btn_set_zero.setOnClickListener(this);

rb_list = new ArrayList<>();
rb_list.add(findViewById(R.id.rb_g));
rb_list.add(findViewById(R.id.rb_ml));
rb_list.add(findViewById(R.id.rb_lb_oz));
rb_list.add(findViewById(R.id.rb_oz));
rb_list.add(findViewById(R.id.rb_kg));
rb_list.add(findViewById(R.id.rb_jin));
rb_list.add(findViewById(R.id.rb_milk_ml));
rb_list.add(findViewById(R.id.rb_water_ml));
rb_list.add(findViewById(R.id.rb_milk_fl_oz));
rb_list.add(findViewById(R.id.rb_water_fl_oz));
rb_list.add(findViewById(R.id.rb_lb));

// 单位只能单选
for (RadioButton radioButton : rb_list) {
radioButton.setOnClickListener(v -> {
for (RadioButton rb : rb_list) {
rb.setChecked(rb == v);
}
});
}

// 获取Mac
mMac = getIntent().getStringExtra("mac");

// 初始化列表
mList = new ArrayList<>();
mListAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList);
list_view.setAdapter(mListAdapter);
}

@Override
public void onClick(View v) {
int id = v.getId();
if (id == R.id.btn_clear) {
// 清空文本框
clearText();
} else if (id == R.id.btn_set_unit) {
// 设置单位
setUnit();
} else if (id == R.id.btn_set_zero) {
// 去皮指令
setZero();
}
}

@Override
protected void onDestroy() {
if (mBluetoothService != null) {
mBluetoothService.disconnectAll();
}
super.onDestroy();
}

@Override
public void onServiceSuccess() {
mBleDevice = mBluetoothService.getBleDevice(mMac);
if (mBleDevice != null) {
mBleNutritionData = new BleNutritionData(mBleDevice);
mBleNutritionData.setBleNutritionCallback(this);
addText("连接成功:" + mMac);
}
}

@Override
public void onServiceErr() {

}

@Override
public void unbindServices() {

}

@Override
public void mcuBmVersion(String version) {
addText("MCU上发BM版本:" + version);
}

@Override
public void mcuSupportUnit(List<SupportUnitBean> list) {
String str = "";
for (SupportUnitBean supportUnitBean : list) {
str += supportUnitBean.toString() + ";";
if (supportUnitBean.getType() != null && supportUnitBean.getType().equals("8")) {
// 遍历所有单位,有这个支持单位就显示
for (int i = 0; i < rb_list.size(); i++) {
boolean hasUnit = false;
for (Integer integer : supportUnitBean.getSupportUnit()) {
if (integer != null && integer == i) {
hasUnit = true;
break;
}
}
rb_list.get(i).setEnabled(hasUnit);
}
// 再次遍历,如果选中了不支持的单位,就重新选择
boolean unitDisable = false;
for (int i = 0; i < rb_list.size(); i++) {
if (!rb_list.get(i).isEnabled() && rb_list.get(i).isChecked()) {
unitDisable = true;
rb_list.get(i).setChecked(false);
}
if (rb_list.get(i).isEnabled() && unitDisable) {
unitDisable = false;
rb_list.get(i).setChecked(true);
}
}
}
}
addText("MCU上发支持单位列表:\n" + str);
}

@Override
public void mcuWeight(int no, int weight, int unit, int decimal, int symbol, int type) {

float w = weight;
// 正负
if (symbol == 1) {
w *= -1;
}
// 小数点
w = (float) (w / Math.pow(10, decimal));
// 保留小数位
String weightStr = getPreFloatStr(w, decimal);

String str = "MCU上发重量:" + weightStr + getUnitStr(unit) + "\n流水号:" + no + ",原始重量:" + weight + ",单位:" + unit + ",小数点:" + decimal + ",符号:" + symbol + ",重量类型:" + type;
addText(str);
}

@Override
public void mcuUnitResult(int status) {
String statusStr = "";
switch (status) {
case 0:
statusStr = "成功";
break;
case 1:
statusStr = "失败";
break;
case 2:
statusStr = "不支持";
break;
}
String str = "MCU上发设置单位结果:" + statusStr;
addText(str);
}

@Override
public void mcuErr(int weightErr, int batteryErr) {
String weightErrStr = "";
switch (weightErr) {
case 0:
weightErrStr = "正常";
break;
case 1:
weightErrStr = "超重";
break;
}
String batteryErrStr = "";
switch (batteryErr) {
case 0:
batteryErrStr = "正常";
break;
case 1:
batteryErrStr = "低电";
break;
}
String str = "MCU上发异常报警:\n重量状态:" + weightErrStr + "\n电池状态:" + batteryErrStr;
addText(str);
}

private SimpleDateFormat sdf;

// 添加一条文本
private void addText(String text) {
if (sdf == null) {
sdf = new SimpleDateFormat("HH:mm:ss", Locale.US);
}
mList.add(sdf.format(System.currentTimeMillis()) + ":\n" + text);
mListAdapter.notifyDataSetChanged();
list_view.smoothScrollToPosition(mList.size() - 1);
}

// 清空文本
private void clearText() {
mList.clear();
mListAdapter.notifyDataSetChanged();
}

// 保留小数位
private String getPreFloatStr(float f, int decimal) {
BigDecimal bigDecimal = new BigDecimal(f);
return bigDecimal.setScale(decimal, BigDecimal.ROUND_HALF_UP).toString();
}

/**
* APP 发送归零指令
*/
private void setZero() {
if (mBleNutritionData != null) {
mBleNutritionData.setZero();
addText("APP下发去皮指令");
}
}

/**
* APP 下发单位
*/
private void setUnit() {
if (mBleNutritionData != null) {
int unit = -1;
for (int i = 0; i < rb_list.size(); i++) {
if (rb_list.get(i).isChecked()) {
unit = i;
break;
}
}
if (unit == -1) {
addText("APP下发单位:失败:未选择单位");
return;
}
mBleNutritionData.setUnit(unit);
addText("APP下发单位:" + unit + ":" + getUnitStr(unit));
}
}

/**
* 获取单位字符串
*
* @param unit 0
* @return g
*/
private String getUnitStr(int unit) {
String unitStr = "";
switch (unit) {
case 0x00:
unitStr = "g";
break;
case 0x01:
unitStr = "ml";
break;
case 0x02:
unitStr = "lb:oz";
break;
case 0x03:
unitStr = "oz";
break;
case 0x04:
unitStr = "kg";
break;
case 0x05:
unitStr = "斤";
break;
case 0x06:
unitStr = "牛奶ml";
break;
case 0x07:
unitStr = "水ml";
break;
case 0x08:
unitStr = "牛奶floz";
break;
case 0x09:
unitStr = "水floz";
break;
case 0x0A:
unitStr = "lb";
break;
}
return unitStr;
}
}

+ 5
- 2
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/blood_glucose/BloodGlucoseActivity.java Dosyayı Görüntüle

@@ -12,16 +12,19 @@ import android.widget.RadioButton;
import com.pingwang.bluetoothlib.bean.SupportUnitBean;
import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.listener.OnCallbackBle;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.R;

import java.util.ArrayList;
import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.BloodGlucose.BloodGlucoseBleDeviceData;
import cn.net.aicare.modulelibrary.module.BloodGlucose.BloodGlucoseUtil;

/**
* 血糖仪
*/
public class BloodGlucoseActivity extends BleBaseActivity implements OnCallbackBle, BloodGlucoseBleDeviceData.BloodGlucoseCallback {

private Button support_unit, quest_status, showdata, test;

+ 2
- 2
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/blood_glucose/BloodGlucoseTestActivity.java Dosyayı Görüntüle

@@ -9,12 +9,12 @@ import com.pingwang.bluetoothlib.bean.SupportUnitBean;
import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.listener.OnBleCompanyListener;
import com.pingwang.bluetoothlib.listener.OnCallbackBle;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.R;

import java.util.ArrayList;
import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.BloodGlucose.BloodGlucoseBleDeviceData;
import cn.net.aicare.modulelibrary.module.BloodGlucose.BloodGlucoseUtil;

+ 150
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/blood_pressure_tc/BloodPressureTcActivity.java Dosyayı Görüntüle

@@ -0,0 +1,150 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.blood_pressure_tc;

import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import com.pingwang.bluetoothlib.bean.SupportUnitBean;
import com.pingwang.bluetoothlib.device.BleDevice;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.Transmission.TransmissionDeviceData;

/**
* 血压计透传测试
*/
public class BloodPressureTcActivity extends BleBaseActivity implements TransmissionDeviceData.MyBleCallback {

private ListView list_view;

private List<String> mList;
private ArrayAdapter mListAdapter;

private String mMac;
private BleDevice mBleDevice;
private TransmissionDeviceData mTransmissionDeviceData;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_blood_pressure_tc);

list_view = findViewById(R.id.list_view);

mList = new ArrayList<>();
mListAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList);
list_view.setAdapter(mListAdapter);

// 获取Mac
mMac = getIntent().getStringExtra("mac");
}

@Override
public void onServiceSuccess() {
mBleDevice = mBluetoothService.getBleDevice(mMac);
if (mBleDevice != null) {
mTransmissionDeviceData = new TransmissionDeviceData(mBleDevice);
mTransmissionDeviceData.setMyBleCallback(this);
addText("设备连接成功:" + mMac);
}
}

@Override
public void onServiceErr() {

}

@Override
public void unbindServices() {

}

@Override
public void onVersion(String version) {

}

@Override
public void showData(String data, int type) {
addText("收到Payload数据:\nCID:" + type + "\n数据:" + data);
}

@Override
public void onSupportUnit(List<SupportUnitBean> list) {

}

@Override
public void onCid(int cid, int vid, int pid) {

}

@Override
public void otherData(byte[] hex, String data) {
addText("收到透传数据:\n" + data);

if (hex != null && hex.length == 10 && (hex[0] & 0xFF) == 0xD6 && (hex[9] & 0xFF) == 0xEC) {
int highPressure = ((hex[2] & 0xFF) << 8) + (hex[3] & 0xFF);
int lowPressure = (hex[4] & 0xFF);
int bp = (hex[5] & 0xFF);
int status = (hex[6] & 0xFF);
int batteryStatus = (hex[7] & 0xFF);

String str = "高压:" + highPressure + "\n低压:" + lowPressure + "\n心率:" + bp + "\n状态:";
switch (status) {
case 1:
str += "正常";
break;
case 2:
str += "偏高";
break;
case 3:
str += "严重偏高";
break;
case 4:
str += "严重错误";
break;
default:
str += "未知:" + status;
break;
}
str += "\n电量状态:";
switch (batteryStatus) {
case 0:
str += "正常";
break;
case 1:
str += "偏低";
break;
default:
str += "未知:" + status;
break;
}
addText(str);
}
}

@Override
public void sendData(String data) {

}

private SimpleDateFormat mSdf;

// 添加一条文本
private void addText(String text) {
if (mSdf == null) {
mSdf = new SimpleDateFormat("HH:mm:ss", Locale.US);
}
mList.add(mSdf.format(System.currentTimeMillis()) + ":\n" + text);
mListAdapter.notifyDataSetChanged();
list_view.smoothScrollToPosition(mList.size() - 1);
}
}

+ 639
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/body_scale_4g/BodyScale4GActivity.java Dosyayı Görüntüle

@@ -0,0 +1,639 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.body_scale_4g;

import android.os.Bundle;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.SeekBar;
import android.widget.TextView;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import cn.net.aicare.algorithmutil.AlgorithmUtil;
import cn.net.aicare.algorithmutil.BodyFatData;

/**
* 4G体脂秤
*/
public class BodyScale4GActivity extends AppCompatActivity implements View.OnClickListener {
private String TAG = BodyScale4GActivity.class.getName();
private String token;
private long appid;
private String imei;
private List<String> loglist;
private String myDeviceId;
private ArrayAdapter logAdapter;
private ListView listviw;
private EditText mEditText;
private Button btn_deviceId;
private Button btn_data;
private Button btn_clear;
private Button btn_login;
private List<Long> bodyIds;
private long maxId = 0l;
private Button btn_test;
private Button btn_produce;
private Button btn_bind;
private EditText et_cid;
private EditText et_vid;
private EditText et_pid;
private String url = "https://ailink.aicare.net.cn";

private SeekBar seek_height;
private SeekBar seek_age;
private TextView tv_height;
private TextView tv_age;
private RadioButton rb_female;
private RadioButton rb_male;

private int mHeight;
private int mAge;
private int mGender;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_body_scale_4g);

listviw = findViewById(R.id.listviw);
mEditText = findViewById(R.id.ed_imei);
btn_deviceId = findViewById(R.id.btn_deviceId);
btn_data = findViewById(R.id.btn_data);
btn_clear = findViewById(R.id.btn_clear);
btn_login = findViewById(R.id.btn_login);
btn_test = findViewById(R.id.btn_test);
btn_produce = findViewById(R.id.btn_produce);
btn_bind = findViewById(R.id.btn_bind);
btn_deviceId.setOnClickListener(this);
btn_data.setOnClickListener(this);
btn_clear.setOnClickListener(this);
btn_login.setOnClickListener(this);
btn_test.setOnClickListener(this);
btn_produce.setOnClickListener(this);
btn_bind.setOnClickListener(this);
seek_height = findViewById(R.id.seek_height);
seek_age = findViewById(R.id.seek_age);
tv_height = findViewById(R.id.tv_height);
tv_age = findViewById(R.id.tv_age);
rb_female = findViewById(R.id.rb_female);
rb_male = findViewById(R.id.rb_male);
et_cid = findViewById(R.id.et_cid);
et_vid = findViewById(R.id.et_vid);
et_pid = findViewById(R.id.et_pid);

// 读取默认用户信息
mHeight = seek_height.getProgress();
mAge = seek_age.getProgress();
mGender = rb_female.isChecked() ? 0 : 1;

// seekBar 联动
seek_height.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
mHeight = progress;
tv_height.setText(mHeight + "cm");
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {

}
});
seek_age.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
mAge = progress;
tv_age.setText(mAge + "岁");
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {

}
});
rb_female.setOnClickListener(v -> {
mGender = 0;
});
rb_male.setOnClickListener(v -> {
mGender = 1;
});

loglist = new ArrayList<>();
bodyIds = new ArrayList<>();
logAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, loglist);
listviw.setAdapter(logAdapter);
new Thread(new Runnable() {
@Override
public void run() {
try {
login();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
}).start();

mEditText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {

}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {

}

@Override
public void afterTextChanged(Editable s) {
myDeviceId = "";
maxId = 0;

}
});
}

public void login() throws Throwable {
String mUrl=url + "/api/user/login?key=inet_elink&username=10037&password=5abd06d6f6ef0e022e11b8a41f57ebda";
URL uri = new URL(mUrl);
HttpURLConnection httpURLConnection = (HttpURLConnection) uri.openConnection();
// Post请求必须设置允许输出
httpURLConnection.setDoOutput(true);
// Post请求不能使用缓存
httpURLConnection.setUseCaches(false);
// 设置为Post请求
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setInstanceFollowRedirects(true);
// 配置请求Content-Type
httpURLConnection.setRequestProperty("Content-Type",
"application/x-www-form-urlencode");
// 设置连接超时时间
httpURLConnection.setConnectTimeout(6 * 1000);
// 开始连接
httpURLConnection.connect();
// DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream());
// dos.write(map.toString().getBytes());
// dos.flush();
// dos.close();
// 判断请求是否成功
if (httpURLConnection.getResponseCode() == 200) {
// 获取返回的数据
byte[] data = readInputStream(httpURLConnection.getInputStream());
String result = new String(data, "UTF-8");
Log.i(TAG, result);
JSONObject jsonObject = new JSONObject(result);
JSONObject datajson = jsonObject.getJSONObject("data");
runOnUiThread(new Runnable() {
@Override
public void run() {
try {
token = jsonObject.getString("token");
appid = datajson.getLong("appUserId");
loglist.add(0, "登录成功");
logAdapter.notifyDataSetChanged();
} catch (JSONException e) {
e.printStackTrace();
}

}
});
} else {
Log.i(TAG, "Post方式请求失败");
runOnUiThread(new Runnable() {
@Override
public void run() {
loglist.add(0, "登录失败");
}
});
}

}


public void getDeviceId() throws Throwable {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(url);
stringBuilder.append("/api/device/getDeviceBySN?key=inet_elink&appUserId=");
stringBuilder.append(appid);
stringBuilder.append("&token=");
stringBuilder.append(token);
stringBuilder.append("&deviceSN=");
stringBuilder.append(imei);
Log.e(TAG, stringBuilder.toString());
URL uri = new URL(stringBuilder.toString());
HttpURLConnection httpURLConnection = (HttpURLConnection) uri.openConnection();
// Post请求必须设置允许输出
httpURLConnection.setDoOutput(true);
// Post请求不能使用缓存
httpURLConnection.setUseCaches(false);
// 设置为Post请求
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setInstanceFollowRedirects(true);
// 配置请求Content-Type
httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencode");
// 设置连接超时时间
httpURLConnection.setConnectTimeout(6 * 1000);
// 开始连接
httpURLConnection.connect();
// DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream());
// dos.write(map.toString().getBytes());
// dos.flush();
// dos.close();
// 判断请求是否成功
if (httpURLConnection.getResponseCode() == 200) {
// 获取返回的数据
byte[] data = readInputStream(httpURLConnection.getInputStream());
String result = new String(data, "UTF-8");
Log.i(TAG, result);
JSONObject jsonObject = new JSONObject(result);
JSONArray datajson = jsonObject.getJSONArray("data");

runOnUiThread(new Runnable() {
@Override
public void run() {
try {
if (datajson.length() > 0) {
myDeviceId = datajson.getJSONObject(0).getString("deviceId");
}
loglist.add(0, "设备信息" + result);
logAdapter.notifyDataSetChanged();
} catch (JSONException e) {
e.printStackTrace();
}
}
});


} else {
Log.i(TAG, "Post方式请求失败");
}
}

public void unbindDevice() throws Throwable {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(url);
stringBuilder.append("/api/device/delete?key=inet_elink&appUserId=" + appid);
stringBuilder.append("&token=" + token);
stringBuilder.append("&deviceId=" + myDeviceId);
// stringBuilder.append("&version=" + "1.0");
Log.e(TAG, stringBuilder.toString());
URL uri = new URL(stringBuilder.toString());
HttpURLConnection httpURLConnection = (HttpURLConnection) uri.openConnection();
// Post请求必须设置允许输出
httpURLConnection.setDoOutput(true);
// Post请求不能使用缓存
httpURLConnection.setUseCaches(false);
// 设置为Post请求
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setInstanceFollowRedirects(true);
// 配置请求Content-Type
httpURLConnection.setRequestProperty("Content-Type",
"application/x-www-form-urlencode");
// 设置连接超时时间
httpURLConnection.setConnectTimeout(6 * 1000);
// 开始连接
httpURLConnection.connect();
// 判断请求是否成功
if (httpURLConnection.getResponseCode() == 200) {
// 获取返回的数据
byte[] data = readInputStream(httpURLConnection.getInputStream());
String result = new String(data, "UTF-8");
Log.i(TAG, result);

runOnUiThread(new Runnable() {
@Override
public void run() {
try {
loglist.add(0, "解绑设备成功:" + result);
logAdapter.notifyDataSetChanged();

} catch (Throwable e) {
e.printStackTrace();
}
}
});

// 解绑设备成功后重新绑定
bindDevice();

} else {
Log.i(TAG, "Post方式请求失败");
}
}

private boolean isFirstBind = true;

public void bindDevice() throws Throwable {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(url);
stringBuilder.append("/api/device/add?key=inet_elink&appUserId=" + appid);
stringBuilder.append("&token=" + token);
stringBuilder.append("&deviceSN=" + imei);
stringBuilder.append("&mac=" + imei);
stringBuilder.append("&roomId=" + 86360);
stringBuilder.append("&deviceName=" + "4G体脂秤");
stringBuilder.append("&cid=" + et_cid.getText().toString());
stringBuilder.append("&vid=" + et_vid.getText().toString());
stringBuilder.append("&pid=" + et_pid.getText().toString());
stringBuilder.append("&supportUnit=" + "");
// stringBuilder.append("&version=" + "1.0");
Log.e(TAG, stringBuilder.toString());
URL uri = new URL(stringBuilder.toString());
HttpURLConnection httpURLConnection = (HttpURLConnection) uri.openConnection();
// Post请求必须设置允许输出
httpURLConnection.setDoOutput(true);
// Post请求不能使用缓存
httpURLConnection.setUseCaches(false);
// 设置为Post请求
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setInstanceFollowRedirects(true);
// 配置请求Content-Type
httpURLConnection.setRequestProperty("Content-Type",
"application/x-www-form-urlencode");
// 设置连接超时时间
httpURLConnection.setConnectTimeout(6 * 1000);
// 开始连接
httpURLConnection.connect();
// DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream());
// dos.write(map.toString().getBytes());
// dos.flush();
// dos.close();
// 判断请求是否成功
if (httpURLConnection.getResponseCode() == 200) {
// 获取返回的数据
byte[] data = readInputStream(httpURLConnection.getInputStream());
String result = new String(data, "UTF-8");
Log.i(TAG, result);
JSONObject jsonObject = new JSONObject(result);
// JSONArray datajson = jsonObject.getJSONArray("data");
runOnUiThread(new Runnable() {
@Override
public void run() {
try {
// if (datajson.length() > 0)
// myDeviceId = datajson.getJSONObject(0).getString("deviceId");
loglist.add(0, "获取到已绑定的设备ID:" + result);
logAdapter.notifyDataSetChanged();

} catch (Throwable e) {
e.printStackTrace();
}
}
});

myDeviceId = jsonObject.getJSONObject("data").getString("deviceId");
if (isFirstBind) {
// 第一次获取到的可能是错误的,解绑,重新绑定
isFirstBind = false;
unbindDevice();
} else {
isFirstBind = true;
}

} else {
Log.i(TAG, "Post方式请求失败");
}
}


public void getData() throws Throwable {
if (TextUtils.isEmpty(myDeviceId)) {
runOnUiThread(new Runnable() {
@Override
public void run() {
loglist.add(0, "请获取设备Id");
logAdapter.notifyDataSetChanged();
}
});

return;
}
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(url);
stringBuilder.append("/api/BFScale/list?key=inet_elink&appUserId=");
stringBuilder.append(appid);
stringBuilder.append("&token=");
stringBuilder.append(token);
stringBuilder.append("&deviceId=");
stringBuilder.append(myDeviceId);
stringBuilder.append("&maxId=");
stringBuilder.append(maxId);
stringBuilder.append("&subUserId=0");
Log.e(TAG, stringBuilder.toString());
URL uri = new URL(stringBuilder.toString());
HttpURLConnection httpURLConnection = (HttpURLConnection) uri.openConnection();
// // Post请求必须设置允许输出
// httpURLConnection.setDoOutput(true);
// // Post请求不能使用缓存
// httpURLConnection.setUseCaches(false);
// 设置为Post请求
// httpURLConnection.setRequestMethod("GET");
// httpURLConnection.setInstanceFollowRedirects(true);
// // 配置请求Content-Type
// httpURLConnection.setRequestProperty("Content-Type",
// "application/x-www-form-urlencode");
// 设置连接超时时间
httpURLConnection.setConnectTimeout(6 * 1000);
// 开始连接
httpURLConnection.connect();
// DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream());
// dos.write(map.toString().getBytes());
// dos.flush();
// dos.close();
// 判断请求是否成功
if (httpURLConnection.getResponseCode() == 200) {
// 获取返回的数据
byte[] data = readInputStream(httpURLConnection.getInputStream());
String result = new String(data, "UTF-8");
JSONObject jsonObject = new JSONObject(result);
// JSONObject dataObject = jsonObject.getJSONObject("data");
JSONArray datajson = jsonObject.getJSONArray("data");
bodyIds.clear();
// loglist.add(0, "jsonObject:" + jsonObject.toString());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);
for (int i = 0; i < datajson.length(); i++) {
JSONObject json = datajson.getJSONObject(i);
long id = json.getLong("bodyFatId");
bodyIds.add(id);

int weightSource = json.getInt("weight");
int weightDecimal = json.getInt("weightPoint");
int weightUnit = json.getInt("weightUnit");
int adc = json.getInt("adc");
int algorithm = json.getInt("deviceAlgorithm");

BigDecimal bigDecimal = BigDecimal.valueOf(weightSource / Math.pow(10, weightDecimal));
String weightStr = bigDecimal.setScale(weightDecimal, BigDecimal.ROUND_HALF_UP).toString();

BodyFatData bodyFatData = AlgorithmUtil.getBodyFatData(algorithm, (mGender == 0 ? 2 : 1), mAge, bigDecimal.floatValue(), mHeight, adc);

switch (weightUnit) {
case 0:
weightStr += "kg";
break;
case 1:
weightStr += "斤";
break;
case 4:
weightStr += "st:lb";
break;
case 6:
weightStr += "lb";
break;
default:
weightStr += "未知单位";
break;
}

StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("id:" + id + "\n");
stringBuffer.append("创建时间:" + sdf.format(json.getLong("createTime")) + "\n");
stringBuffer.append("体重原始值:" + weightSource + "\n");
stringBuffer.append("体重小数点:" + weightDecimal + "\n");
stringBuffer.append("体重单位:" + weightUnit + "\n");
stringBuffer.append("最终体重:" + weightStr + "\n");
stringBuffer.append("阻抗:" + adc + "\n");
stringBuffer.append("心率:" + json.getInt("heartRate") + "\n");
stringBuffer.append("算法id:" + algorithm + "\n");
stringBuffer.append("体脂率:" + bodyFatData.getBfr() + "");
loglist.add(0, stringBuffer.toString());
}
loglist.add(0, "总共有:" + bodyIds.size() + " 条");
// if (maxId == 0) {
// loglist.add(0, "总共有:" + bodyIds.size() + " 条");
// } else {
// loglist.add(0, "新增了:" + bodyIds.size() + " 条");
// }
// if (bodyIds.size() > 0) {
// maxId = bodyIds.get(bodyIds.size() - 1);
// }
Log.i(TAG, result);
runOnUiThread(new Runnable() {
@Override
public void run() {
logAdapter.notifyDataSetChanged();
}

});

} else {
runOnUiThread(new Runnable() {
@Override
public void run() {
loglist.add(0, "请求失败");
logAdapter.notifyDataSetChanged();
}
});
}
}

public byte[] readInputStream(InputStream inputStream) throws IOException {
byte[] buffer = new byte[1024];
int len = 0;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while ((len = inputStream.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
bos.close();
return bos.toByteArray();
}

@Override
public void onClick(View v) {
if (v.getId() == R.id.btn_deviceId) {
imei = mEditText.getText().toString().trim();
if (imei == null || imei.isEmpty()) {
loglist.add("请输入IMEI号");
} else {

new Thread(new Runnable() {
@Override
public void run() {
try {
getDeviceId();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
}).start();

}
} else if (v.getId() == R.id.btn_bind) {
imei = mEditText.getText().toString().trim();
new Thread(new Runnable() {
@Override
public void run() {
try {
bindDevice();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
}).start();
} else if (v.getId() == R.id.btn_data) {
new Thread(new Runnable() {
@Override
public void run() {
try {
getData();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
}).start();
} else if (v.getId() == R.id.btn_clear) {
loglist.clear();
logAdapter.notifyDataSetChanged();
} else if (v.getId() == R.id.btn_login) {
new Thread(new Runnable() {
@Override
public void run() {
try {
login();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
}).start();
} else if (v.getId() == R.id.btn_produce) {
url = "https://ailink.aicare.net.cn";

} else if (v.getId() == R.id.btn_test) {
url = "http://test.ailink.app.aicare.net.cn";

}
}
}

+ 2
- 2
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/broadcast_height/BroadcastHeightActivity.java Dosyayı Görüntüle

@@ -19,8 +19,6 @@ import com.pingwang.bluetoothlib.listener.OnCallbackDis;
import com.pingwang.bluetoothlib.listener.OnScanFilterListener;
import com.pingwang.bluetoothlib.utils.BleStrUtils;
import com.pinwang.ailinkble.AiLinkPwdUtil;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.R;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
@@ -28,6 +26,8 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;

+ 4
- 4
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/broadcast_nutrition/BroadNutritionActivity.java Dosyayı Görüntüle

@@ -7,16 +7,12 @@ import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;

import androidx.annotation.Nullable;

import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.config.BleConfig;
import com.pingwang.bluetoothlib.listener.OnScanFilterListener;
import com.pingwang.bluetoothlib.utils.BleLog;
import com.pingwang.bluetoothlib.utils.BleStrUtils;
import com.pinwang.ailinkble.AiLinkPwdUtil;
import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
@@ -24,6 +20,10 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import androidx.annotation.Nullable;

public class BroadNutritionActivity extends BleBaseActivity implements View.OnClickListener, OnScanFilterListener {

private ListView list_view;

+ 368
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/broadcast_weight_sacle/BroadcastWeightScaleActivity.java Dosyayı Görüntüle

@@ -0,0 +1,368 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.broadcast_weight_sacle;

import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.text.TextUtils;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;

import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.config.BleConfig;
import com.pingwang.bluetoothlib.device.BleSendCmdUtil;
import com.pingwang.bluetoothlib.listener.OnCallbackDis;
import com.pingwang.bluetoothlib.listener.OnScanFilterListener;
import com.pingwang.bluetoothlib.utils.BleDensityUtil;
import com.pingwang.bluetoothlib.utils.BleLog;
import com.pingwang.bluetoothlib.utils.BleStrUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

import aicare.net.cn.sdk.ailinksdkdemoandroid.BroadcastScaleActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.broadcastweightscale.BroadcastWeightScaleBleConfig;
import cn.net.aicare.modulelibrary.module.broadcastweightscale.BroadcastWeightScaleDeviceData;

/**
* @auther ljl
* on 2023/3/10
*/
public class BroadcastWeightScaleActivity extends BleBaseActivity implements OnCallbackDis, BroadcastWeightScaleDeviceData.OnNotifyData, OnScanFilterListener, View.OnClickListener,
RadioGroup.OnCheckedChangeListener {

private static String TAG = BroadcastScaleActivity.class.getName();
private final int REFRESH_DATA = 3;

private RadioButton mRadioButtonKg, mRadioButtonLbLb, mRadioButtonStLb, mRadioButtonJin;
private TextView tv_broadcast_temp, tv_broadcast_mac, tv_broadcast_did;

private List<String> mList;
private ArrayAdapter listAdapter;
private Context mContext;
private BroadcastWeightScaleDeviceData mDevice;
private String mAddress = "";
private BleSendCmdUtil mBleSendCmdUtil;
private int type = BroadcastWeightScaleBleConfig.BROADCAST_WEIGHT_SCALE;
private int mWeightUnit = 0;
private int mTemp;

private Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {

case REFRESH_DATA:
if (listAdapter != null) {
listAdapter.notifyDataSetChanged();
}
break;
}
}
};

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_broadcast_weight_scale);
mContext = this;
// mAddress = getIntent().getStringExtra("mac");
mBleSendCmdUtil = BleSendCmdUtil.getInstance();
init();

}

private void init() {
mList = new ArrayList<>();
ListView listView = findViewById(R.id.listview_weight);
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList);
listView.setAdapter(listAdapter);

findViewById(R.id.clear_weight).setOnClickListener(this);
findViewById(R.id.open_weight).setOnClickListener(this);
findViewById(R.id.stop_weight).setOnClickListener(this);
((RadioGroup) findViewById(R.id.radio_weight_weight)).setOnCheckedChangeListener(this);

tv_broadcast_temp = findViewById(R.id.tv_broadcast_temp_weight);

mRadioButtonKg = findViewById(R.id.radio_weight_kg_weight);
mRadioButtonJin = findViewById(R.id.radio_weight_jin_weight);
mRadioButtonStLb = findViewById(R.id.radio_weight_st_lb_weight);
mRadioButtonLbLb = findViewById(R.id.radio_weight_lb_lb_weight);

tv_broadcast_mac = findViewById(R.id.tv_broadcast_mac_weight);
tv_broadcast_did = findViewById(R.id.tv_broadcast_did_weight);

}


@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
if (checkedId == -1) {
return;//不是人为点击不触发
}
switch (group.getCheckedRadioButtonId()) {
case R.id.radio_weight_kg_weight:
mWeightUnit = BroadcastWeightScaleBleConfig.UNIT_KG;
break;
case R.id.radio_weight_jin_weight:
mWeightUnit = BroadcastWeightScaleBleConfig.UNIT_F;
break;
case R.id.radio_weight_st_lb_weight:
mWeightUnit = BroadcastWeightScaleBleConfig.UNIT_ST;
break;
case R.id.radio_weight_lb_lb_weight:
mWeightUnit = BroadcastWeightScaleBleConfig.UNIT_LB_LB;
break;

}
BleLog.i("ljl", "weightUnit:" + mWeightUnit);
}


private void showWeightUnit(int unit) {
switch (unit) {
case BroadcastWeightScaleBleConfig.UNIT_KG:
mRadioButtonKg.setChecked(true);
break;
case BroadcastWeightScaleBleConfig.UNIT_F:
mRadioButtonJin.setChecked(true);
break;
case BroadcastWeightScaleBleConfig.UNIT_ST:
mRadioButtonStLb.setChecked(true);
break;
case BroadcastWeightScaleBleConfig.UNIT_LB_LB:
mRadioButtonLbLb.setChecked(true);
break;
default:
break;
}
}


@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.clear_weight:
if (mList != null) {
mList.clear();
}
mHandler.sendEmptyMessage(REFRESH_DATA);
break;
case R.id.open_weight:
if (mBluetoothService != null) {
mBluetoothService.scanLeDevice(0, UUID.fromString("0000F0A0-0000-1000-8000-00805F9B34FB"));
}
break;
case R.id.stop_weight:
if (mBluetoothService != null) {
mBluetoothService.stopScan();
}
break;
default:
break;
}
}


//---------------------------------服务---------------------------------------------------


@Override
public void onServiceSuccess() {
BleLog.i("ljl", "服务与界面建立连接成功");
//与服务建立连接
if (mBluetoothService != null) {
mDevice = BroadcastWeightScaleDeviceData.getInstance();
mDevice.setOnNotifyData(this);
mBluetoothService.setOnScanFilterListener(this);
mBluetoothService.scanLeDevice(0, BleConfig.UUID_SERVER_BROADCAST_AILINK);
}
}

@Override
public void onServiceErr() {
BleLog.i("ljl", "服务与界面连接断开");
//与服务断开连接
mBluetoothService = null;
}

@Override
public void unbindServices() {
if (mDevice != null) {
mDevice.clear();
mDevice = null;
}

}

//-----------------状态-------------------


@Override
public void bleOpen() {
mList.add(TimeUtils.getTime() + "蓝牙打开");
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void bleClose() {
BleLog.i(TAG, "蓝牙未开启,可请求开启");
mList.add(TimeUtils.getTime() + "蓝牙关闭");
mHandler.sendEmptyMessage(REFRESH_DATA);
}

//-----------------通知-------------------

private String mOldData = "";

@Override
public void onData(byte[] dataOriginal, byte[] hex, int type) {
String data = "";
if (hex != null) {
data = BleStrUtils.byte2HexStr(hex);
}
if (mOldData.equals(data)) {
return;
}
mOldData = data;
mList.add(TimeUtils.getTime() + "数据ID" + type + " ,||解密数据:" + data + " ,||原始数据:" + BleStrUtils.byte2HexStr(dataOriginal));
mHandler.sendEmptyMessage(REFRESH_DATA);
}


@Override
public void getWeightData(int status, int tempUnit, int weightUnit, int weightDecimal, int weightStatus, int weightNegative, int weight, int tempNegative, int temp) {
String weightUnitStr = "kg";
switch (weightUnit) {
case BroadcastWeightScaleBleConfig.UNIT_KG:
weightUnitStr = "kg";
break;
case BroadcastWeightScaleBleConfig.UNIT_FG:
weightUnitStr = "斤";
break;
case BroadcastWeightScaleBleConfig.UNIT_ST:
weightUnitStr = "st:lb";
break;
case BroadcastWeightScaleBleConfig.UNIT_LB_LB:
weightUnitStr = "LB";
break;
default:
break;
}
String tempUnitStr = "℃";//℉
switch (tempUnit) {
case BroadcastWeightScaleBleConfig.UNIT_C:
tempUnitStr = "℃";
break;
case BroadcastWeightScaleBleConfig.UNIT_F:
tempUnitStr = "℉";
break;
default:
break;
}
String statusStr = "状态=";
switch (status) {

case BroadcastWeightScaleBleConfig.GET_WEIGHT_TESTING:
statusStr += "正在测量体重";
break;
case BroadcastWeightScaleBleConfig.GET_TEST_FINISH:
statusStr += "测量完成";
break;
default:
statusStr += Integer.toHexString(status);
break;

}
String weightStr = BleDensityUtil.getInstance().holdDecimals(weight, weightDecimal);
if (weightNegative == 1) {
weightStr = "-" + weightStr;
}
String showData = TimeUtils.getTime();
showData += statusStr;
if (weightStatus == 1) {
showData += "\n稳定体重=" + weightStr + ";小数位=" + weightDecimal + ";单位=" + weightUnit + ";" + weightUnitStr;
} else {
showData += "\n实时体重=" + weightStr + ";小数位=" + weightDecimal + ";单位=" + weightUnit + ";" + weightUnitStr;
}
// showData += "\n阻抗=" + adc;
if (temp == 65535) {
//不支持温度
showData += "\n温度=暂不支持";
} else {
if (tempNegative == 1) {
showData += "\n温度=" + (-temp / 10F) + tempUnitStr;
} else {
showData += "\n温度=" + (temp / 10F) + tempUnitStr;
}
if (mTemp != temp) {
mTemp = temp;
tv_broadcast_temp.setText((mTemp / 10F) + tempUnitStr);
}
}

// showData += "\n算法ID=" + algorithmId;

if (mWeightUnit != weightUnit) {
mWeightUnit = weightUnit;
showWeightUnit(mWeightUnit);
}


mList.add(showData);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onDID(int cid, int vid, int pid) {
String didStr = "cid:" + cid + "||vid:" + vid + "||pid:" + pid;
if (tv_broadcast_did != null) {
tv_broadcast_did.setText(didStr);
}
}


@Override
protected void onDestroy() {
super.onDestroy();
BleLog.i(TAG, "onDestroy");
}


@Override
public boolean onFilter(BleValueBean bleValueBean) {
return true;
}

@Override
public void onScanRecord(BleValueBean bleValueBean) {
if (TextUtils.isEmpty(mAddress) && bleValueBean.isBroadcastModule()) {
mAddress = bleValueBean.getMac();
if (tv_broadcast_mac != null) {
tv_broadcast_mac.setText(mAddress);
}
}

//地址相同,并且是广播秤
if (mAddress.equalsIgnoreCase(bleValueBean.getMac()) && bleValueBean.isBroadcastModule()) {
byte[] manufacturerData = bleValueBean.getManufacturerData();
int cid = bleValueBean.getCid();
int vid = bleValueBean.getVid();
int pid = bleValueBean.getPid();
if (mDevice != null) {
mDevice.onNotifyData(manufacturerData, cid, vid, pid);
}
}
}
}

+ 2
- 2
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/coffee_scale/CoffeeScaleActivity.java Dosyayı Görüntüle

@@ -12,14 +12,14 @@ import android.widget.RadioButton;

import com.pingwang.bluetoothlib.bean.SupportUnitBean;
import com.pingwang.bluetoothlib.device.BleDevice;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.R;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.CoffeeScale.CoffeeScaleData;


+ 260
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/fascia_gun/FasciaGunActivity.java Dosyayı Görüntüle

@@ -0,0 +1,260 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.fascia_gun;

import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.Spinner;

import com.pingwang.bluetoothlib.device.BleDevice;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.FasciaGun.FasciaGunData;

/**
* 筋膜枪
*/
public class FasciaGunActivity extends BleBaseActivity implements View.OnClickListener, FasciaGunData.FasciaGunCallback {

private Button btn_device;
private Spinner sp_device_gear;
private RadioButton rb_device_start;
private RadioButton rb_device_stop;
private Button btn_set_gear;
private Spinner sp_set_gear;
private Button btn_set_time;
private EditText et_time;
private RadioButton rb_time_stop;
private RadioButton rb_time_start;
private ListView list_view;

private List<String> mList;
private ArrayAdapter mListAdapter;

private String mMac;
private BleDevice mBleDevice;
private FasciaGunData mFasciaGunData;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fascia_gun);

btn_device = findViewById(R.id.btn_device);
sp_device_gear = findViewById(R.id.sp_device_gear);
rb_device_start = findViewById(R.id.rb_device_start);
rb_device_stop = findViewById(R.id.rb_device_stop);
btn_set_gear = findViewById(R.id.btn_set_gear);
sp_set_gear = findViewById(R.id.sp_set_gear);
btn_set_time = findViewById(R.id.btn_set_time);
et_time = findViewById(R.id.et_time);
rb_time_stop = findViewById(R.id.rb_time_stop);
rb_time_start = findViewById(R.id.rb_time_start);
list_view = findViewById(R.id.list_view);

btn_device.setOnClickListener(this);
btn_set_gear.setOnClickListener(this);
btn_set_time.setOnClickListener(this);

// 获取Mac
mMac = getIntent().getStringExtra("mac");

// 初始化列表
mList = new ArrayList<>();
mListAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList);
list_view.setAdapter(mListAdapter);
}

@Override
public void onClick(View v) {
int id = v.getId();
if (id == R.id.btn_device) {
appDevice();
} else if (id == R.id.btn_set_gear) {
appSetGear();
} else if (id == R.id.btn_set_time) {
appSetTime();
}
}

@Override
protected void onDestroy() {
if (mFasciaGunData != null) {
mFasciaGunData.setFasciaGunCallback(null);
mFasciaGunData = null;
}
if (mBluetoothService != null) {
mBluetoothService.disconnectAll();
}
super.onDestroy();
}

@Override
public void onServiceSuccess() {
mBleDevice = mBluetoothService.getBleDevice(mMac);
if (mBleDevice != null) {
mFasciaGunData = new FasciaGunData(mBleDevice);
mFasciaGunData.setFasciaGunCallback(this);

addText("设备连接成功:" + mMac);
}
}

@Override
public void onServiceErr() {

}

@Override
public void unbindServices() {

}

@Override
public void mcuDevice(int mode, int gear) {
if (mode == 1) {
addText("MCU回复启动/停止设备结果:启动;挡位:" + gear);
} else {
addText("MCU回复启动/停止设备结果:停止;挡位:" + gear);
}
}

@Override
public void mcuSetGear(int gear) {
addText("MCU回复设置挡位结果:当前挡位:" + gear);
}

@Override
public void mcuSetTime(int mode, int second) {
if (mode == 1) {
addText("MCU回复设置倒计时结果:启动;时间:" + second + "秒");
} else {
addText("MCU回复设置倒计时结果:停止;时间:" + second + "秒");
}
}

@Override
public void mcuStatus(int workStatus, int useTime, int curGear, int timeStatus, int timeSecond, int pressure, int batteryStatus, int batteryNum, int supportGear) {
String workStatusStr;
if (workStatus == 1) {
workStatusStr = "启动";
} else {
workStatusStr = "停止";
}
String timeStatusStr;
if (timeStatus == 1) {
timeStatusStr = "启动";
} else {
timeStatusStr = "关闭";
}
String pressureStr;
if (pressure != 0xFF) {
pressureStr = String.valueOf(pressure);
} else {
pressureStr = "不支持";
}
String batteryStatusStr;
switch (batteryStatus) {
default:
case 0:
batteryStatusStr = "未充电";
break;
case 1:
batteryStatusStr = "在充电";
break;
case 2:
batteryStatusStr = "充满电";
break;
case 0xFF:
batteryStatusStr = "不支持";
break;
}

List<String> list = new ArrayList<>();
for (int i = 0; i <= supportGear; i++) {
list.add("挡位" + i);
}
ArrayAdapter<String> arrayAdapter1 = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, list);
ArrayAdapter<String> arrayAdapter2 = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, list);
arrayAdapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
arrayAdapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

sp_device_gear.setAdapter(arrayAdapter1);
sp_set_gear.setAdapter(arrayAdapter2);

addText("MCU上报实时状态:工作状态:" + workStatusStr + ";使用时长:" + useTime + "秒;当前挡位:" + curGear + ";是否倒计时:" + timeStatusStr + ";倒计时时长:" + timeSecond + ";压力值:" + pressureStr + ";电池状态:" + batteryStatusStr + ";电量:" + batteryNum + ";支持挡位:" + supportGear);
}

/**
* APP 启动/停止设备
*/
private void appDevice() {
int mode = rb_device_start.isChecked() ? 1 : 2;
int gear = sp_device_gear.getSelectedItemPosition();

if (gear == -1) {
addText("请先用设备回复支持的挡位数量");
return;
}

if (mode == 1) {
addText("APP启动设备;挡位:" + gear);
} else {
addText("APP停止设备;挡位:" + gear);
}
mFasciaGunData.appDevice(mode, gear);
}

/**
* APP 设置挡位
*/
private void appSetGear() {
int gear = sp_set_gear.getSelectedItemPosition();

if (gear == -1) {
addText("请先用设备回复支持的挡位数量");
return;
}

addText("APP设置挡位:" + gear);
mFasciaGunData.appSetGear(gear);
}

/**
* APP 设置倒计时
*/
private void appSetTime() {
int mode = rb_time_start.isChecked() ? 1 : 0;
int second = 0;
try {
second = Integer.parseInt(et_time.getText().toString());
} catch (Exception e) {
second = 0;
}

if (mode == 1) {
addText("APP设置倒计时:启动;时间:" + second + "秒");
} else {
addText("APP设置倒计时:停止;时间:" + second + "秒");
}
mFasciaGunData.appSetTime(mode, second);
}

// 添加一条文本
private void addText(String text) {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss", Locale.US);
mList.add(sdf.format(System.currentTimeMillis()) + ":\n" + text);
mListAdapter.notifyDataSetChanged();
list_view.smoothScrollToPosition(mList.size() - 1);
}
}

+ 40
- 5
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/food_temp/FoodTempActivity.java Dosyayı Görüntüle

@@ -8,10 +8,12 @@ import android.widget.EditText;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.Spinner;
import android.widget.TextView;

import com.pingwang.bluetoothlib.device.BleDevice;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import com.pingwang.bluetoothlib.device.BleSendCmdUtil;
import com.pingwang.bluetoothlib.device.SendBleBean;
import com.pingwang.bluetoothlib.listener.OnMcuParameterListener;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
@@ -19,6 +21,8 @@ import java.util.Calendar;
import java.util.List;
import java.util.Locale;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.FoodTemp.FoodTempData;

@@ -30,6 +34,7 @@ public class FoodTempActivity extends BleBaseActivity implements View.OnClickLis
private static final String TAG = "Tag1";

private Button btn_clear;
private TextView tv_device_battery;
private Button btn_get_device;
private Button btn_set_temp_unit;
private RadioButton rb_set_c;
@@ -105,6 +110,7 @@ public class FoodTempActivity extends BleBaseActivity implements View.OnClickLis
rb_open_probe = findViewById(R.id.rb_open_probe);
rb_close_probe = findViewById(R.id.rb_close_probe);
list_view = findViewById(R.id.list_view);
tv_device_battery = findViewById(R.id.tv_device_battery);

btn_clear.setOnClickListener(this);
btn_get_device.setOnClickListener(this);
@@ -164,6 +170,20 @@ public class FoodTempActivity extends BleBaseActivity implements View.OnClickLis
}
}


public void getBattery(View view) {
if (mBleDevice != null) {
byte[] blePower = BleSendCmdUtil.getInstance().getMcuBatteryStatus();
SendBleBean sendBleBean = new SendBleBean();
sendBleBean.setHex(blePower);
mBleDevice.sendData(sendBleBean);
}
}

public void onStopLog(View view) {
mRefreshLog = !mRefreshLog;
}

@Override
protected void onDestroy() {
if (mBluetoothService != null) {
@@ -178,6 +198,14 @@ public class FoodTempActivity extends BleBaseActivity implements View.OnClickLis
if (mBleDevice != null) {
mFoodTempData = new FoodTempData(mBleDevice);
mFoodTempData.setFoodTempCallback(this);
mBleDevice.setOnMcuParameterListener(new OnMcuParameterListener() {
@Override
public void onMcuBatteryStatus(int status, int battery) {
if (tv_device_battery != null) {
tv_device_battery.setText("电量:" + battery + "%");
}
}
});
}
}

@@ -193,12 +221,14 @@ public class FoodTempActivity extends BleBaseActivity implements View.OnClickLis

@Override
public void mcuDevice(int probeNum, int chargerState, int battery, int tempUnit, int alertType) {
addText("MCU上发设备信息:探针数量:" + probeNum + ",充电状态:" + chargerState + ",电量:" + battery + ",温度单位:" + tempUnit + ",警报类型:" + alertType);
addText("MCU上发设备信息:探针数量:" + probeNum + ",充电状态:" + chargerState + ",电量:" + battery + ",温度单位:" + (tempUnit == 0 ? "C" : "F") + ",警报类型:" + alertType);
}

@Override
public void mcuResult(int id, int inDevice, int curTemp, int curTempUnit, int ambienceTemp, int ambienceTempUnit, int targetTemp, int targetTempUnit, int inMeat, int enableAlert, int mode, int timing, int alertType) {
addText("MCU上发数据:探针编号:" + id + ",探针插入设备状态:" + inDevice + ",当前温度:" + curTemp + ",当前温度单位:" + curTempUnit + ",环境温度:" + ambienceTemp + ",环境温度单位:" + ambienceTempUnit + ",目标温度:" + targetTemp + ",目标温度单位:" + targetTempUnit + ",探针插入肉状态:" + inMeat + ",警报启动状态:" + enableAlert + ",模式:" + mode + ",定时:" + timing + ",警报类型:" + alertType);
public void mcuResult(int id, int inDevice, int curTemp, int curTempUnit, int ambienceTemp, int ambienceTempUnit, int targetTemp, int targetTempUnit, int inMeat, int enableAlert, int mode,
int timing, int alertType) {
addText("MCU上发数据:探针编号:" + id + ",探针插入设备状态:" + inDevice + ",当前温度:" + curTemp + ",当前温度单位:" + (curTempUnit == 0 ? "C" : "F") + ",环境温度:" + ambienceTemp + ",环境温度单位:" + (ambienceTempUnit == 0 ?
"C" : "F") + ",目标温度:" + targetTemp + ",目标温度单位:" + (targetTempUnit == 0 ? "C" : "F") + ",探针插入肉状态:" + inMeat + ",警报启动状态:" + enableAlert + ",模式:" + mode + ",定时:" + timing + ",警报类型:" + alertType);
}

@Override
@@ -341,10 +371,15 @@ public class FoodTempActivity extends BleBaseActivity implements View.OnClickLis
addText("APP开关探针:编号:" + id + "," + isOpen);
}

private boolean mRefreshLog = true;

SimpleDateFormat sdf;

// 添加一条文本
private void addText(String text) {
if (!mRefreshLog) {
return;
}
if (sdf == null) {
sdf = new SimpleDateFormat("HH:mm:ss", Locale.US);
}

+ 143
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/leaone_broadcast/LeaOneBroadcastActivity.java Dosyayı Görüntüle

@@ -0,0 +1,143 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.leaone_broadcast;

import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;

import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.listener.OnScanFilterListener;
import com.pingwang.bluetoothlib.utils.BleStrUtils;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import androidx.annotation.Nullable;

public class LeaOneBroadcastActivity extends BleBaseActivity implements View.OnClickListener, OnScanFilterListener {

private ListView list_view;
private Button btn_start;
private Button btn_stop;
private Button btn_clear;
private TextView tv_mac_system;
private TextView tv_mac_broadcast;

private List<String> mList;
private ArrayAdapter mListAdapter;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_leaone_broadcast);

list_view = findViewById(R.id.list_view);
btn_start = findViewById(R.id.btn_start);
btn_stop = findViewById(R.id.btn_stop);
btn_clear = findViewById(R.id.btn_clear);
tv_mac_system = findViewById(R.id.tv_mac_system);
tv_mac_broadcast = findViewById(R.id.tv_mac_broadcast);

btn_start.setOnClickListener(this);
btn_stop.setOnClickListener(this);
btn_clear.setOnClickListener(this);

mList = new ArrayList<>();
mListAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList);
list_view.setAdapter(mListAdapter);
}

@Override
public void onClick(View v) {
int id = v.getId();
if (id == R.id.btn_start) {
mBluetoothService.scanLeDevice(0);
} else if (id == R.id.btn_stop) {
mBluetoothService.stopScan();
} else if (id == R.id.btn_clear) {
clearText();
}
}

@Override
protected void onDestroy() {
if (mBluetoothService != null) {
mBluetoothService.stopScan();
}
super.onDestroy();
}

@Override
public void onServiceSuccess() {
mBluetoothService.setOnScanFilterListener(this);
}

@Override
public void onServiceErr() {

}

@Override
public void unbindServices() {

}

@Override
public boolean onFilter(BleValueBean bleValueBean) {
return true;
}

private String mMac;

@Override
public void onScanRecord(BleValueBean bleValueBean) {
mMac = bleValueBean.getMac();
byte[] manufacturerData = bleValueBean.getManufacturerData();
onNotifyData(manufacturerData);
}

private SimpleDateFormat mSdf;

// 添加一条文本
private void addText(String text) {
if (mSdf == null) {
mSdf = new SimpleDateFormat("HH:mm:ss:SSS", Locale.US);
}
mList.add(mSdf.format(System.currentTimeMillis()) + ":\n" + text);
mListAdapter.notifyDataSetChanged();
list_view.smoothScrollToPosition(mList.size() - 1);
}

// 清空文本
private void clearText() {
mList.clear();
mListAdapter.notifyDataSetChanged();
}

/**
* 解析数据
*
* @param hex hex
*/
private void onNotifyData(byte[] hex) {
// 长度为 15 个 byte,C0 开头
if (hex == null || hex.length != 15 || (hex[0] & 0xFF) != 0xC0) {
return;
}
byte[] macByte = new byte[6];
System.arraycopy(hex, 9, macByte, 0, macByte.length);
String macStr = BleStrUtils.byte2HexStr(macByte).trim().replace(" ", ":").toUpperCase();

addText(macStr + "\n" + BleStrUtils.byte2HexStr(hex));

tv_mac_system.setText("系统解析Mac:" + mMac.toUpperCase());
tv_mac_broadcast.setText("广播解析Mac:" + macStr);
}

}

+ 201
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/noise_meter/BleNoiseMeterActivity.java Dosyayı Görüntüle

@@ -0,0 +1,201 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.noise_meter;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;

import com.pingwang.bluetoothlib.device.BleDevice;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.NoiseMeter.NoiseMeterBleDevice;

/**
* 噪音计(ble)
*
* @author xing
*/
public class BleNoiseMeterActivity extends BleBaseActivity implements View.OnClickListener, NoiseMeterBleDevice.OnNoiseDataListener {

private ListView list_view;

private List<String> mList;
private ArrayAdapter mListAdapter;
private String mMac;
private BleDevice mBleDevice;
private NoiseMeterBleDevice mNoiseMeterBle;
private Button btn_ac, btn_light, btn_fs, btn_max, btn_up, btn_down;


@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ble_noise_meter);

list_view = findViewById(R.id.list_view);
btn_ac = findViewById(R.id.btn_noise_ble_ac);
btn_light = findViewById(R.id.btn_noise_ble_light);
btn_fs = findViewById(R.id.btn_noise_ble_fs);
btn_max = findViewById(R.id.btn_noise_ble_max);
btn_up = findViewById(R.id.btn_noise_ble_up);
btn_down = findViewById(R.id.btn_noise_ble_down);
btn_ac.setOnClickListener(this);
btn_light.setOnClickListener(this);
btn_fs.setOnClickListener(this);
btn_max.setOnClickListener(this);
btn_up.setOnClickListener(this);
btn_down.setOnClickListener(this);


// 获取Mac
mMac = getIntent().getStringExtra("mac");

// 初始化列表
mList = new ArrayList<>();
mListAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList);
list_view.setAdapter(mListAdapter);

}

@Override
protected void onDestroy() {
if (mNoiseMeterBle != null) {
mNoiseMeterBle = null;
}
if (mBleDevice != null) {
mBleDevice.disconnect();
// mBluetoothService.disconnectAll();
}
super.onDestroy();
}

@Override
public void onServiceSuccess() {
Log.e("ljl", "onServiceSuccess: 服务打开成功");
mBleDevice = mBluetoothService.getBleDevice(mMac);
if (mBleDevice != null) {
if (mNoiseMeterBle == null) {
Log.e("ljl", "NoiseMeterBleDevice绑定设备");
NoiseMeterBleDevice.init(mBleDevice);
mNoiseMeterBle = NoiseMeterBleDevice.getInstance();
mNoiseMeterBle.setOnNoiseDataListener(this);
//
}
}
addText("设备连接成功" + mMac);
}

@Override
public void onServiceErr() {
}

@Override
public void unbindServices() {
}


/**
* 添加一条文本
*
* @param text 文本
*/
private void addText(String text) {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss", Locale.US);
mList.add(sdf.format(System.currentTimeMillis()) + ":\n" + text);
if (mListAdapter != null) {
mListAdapter.notifyDataSetChanged();
}
if (list_view != null) {
list_view.smoothScrollToPosition(mList.size() - 1);
}
}


@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_noise_ble_ac:
//A/C键功能
if (mNoiseMeterBle != null) {
mNoiseMeterBle.sendAC();
}
break;
case R.id.btn_noise_ble_light:
//LIGHT键
if (mNoiseMeterBle != null) {
mNoiseMeterBle.sendLight();
}
break;
case R.id.btn_noise_ble_fs:
//F/S键
if (mNoiseMeterBle != null) {
mNoiseMeterBle.sendFS();
}
break;
case R.id.btn_noise_ble_max:
//MAX键
if (mNoiseMeterBle != null) {
mNoiseMeterBle.sendMax();
}
break;
case R.id.btn_noise_ble_up:
//UP键
if (mNoiseMeterBle != null) {
mNoiseMeterBle.sendUp();
}
break;
case R.id.btn_noise_ble_down:
//DOWN键
if (mNoiseMeterBle != null) {
mNoiseMeterBle.sendDown();
}
break;
default:
break;

}
}

@Override
public void onBleData(int noiseData, int over, int under, int fs, int ac, int backlight, int max, int lowBat, int range) {
addText("噪音数据:" + noiseData + " OVER指示:" + over + "--" + (+over == 0 ? "非OVER状态" : "OVER状态")
+ " UNDER指示:" + under + "--" + (under == 0 ? "非UNDER状态" : "UNDER状态")
+ " F/S模式:" + fs + "--" + (fs == 0 ? "Fast模式" : "Slow模式")
+ " A/C加权:" + ac + "--" + (ac == 0 ? "A加权" : "C加权")
+ " 背光:" + backlight + "--" + (backlight == 0 ? "背光disable" : "背光enable")
+ " 最大值标志:" + max + "--" + (max == 0 ? "最大值disable" : "最大值enable")
+ " 低电指示:" + lowBat + "--" + (lowBat == 0 ? "非低电状态" : "低电状态")
+ " 量程状态:" + range + "--" + select(range));

}

private String select(int range) {
String str = "";
if (range == 0) {
str = "30~130";
return str;
} else if (range == 1) {
str = "30~80";
return str;
} else if (range == 2) {
str = "50~100";
return str;
} else if (range == 3) {
str = "60~110";
return str;
} else if (range == 4) {
str = "80~130";
return str;
}
return str;
}
}

+ 435
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/noise_meter/WifiBleNoiseMeterActivity.java Dosyayı Görüntüle

@@ -0,0 +1,435 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.noise_meter;

import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.listener.OnBleOtherDataListener;
import com.pingwang.bluetoothlib.utils.BleStrUtils;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.NoiseMeter.BleNoiseTLVBean;
import cn.net.aicare.modulelibrary.module.NoiseMeter.NoiseMeterHistoryBean;
import cn.net.aicare.modulelibrary.module.NoiseMeter.NoiseMeterWifiBleDevice;
import cn.net.aicare.modulelibrary.module.NoiseMeter.NoiseParseUtils;
import cn.net.aicare.modulelibrary.module.NoiseMeter.NoiseSendUtils;

/**
* 噪音计(wifi+ble)
*
* @author xing
*/
public class WifiBleNoiseMeterActivity extends BleBaseActivity implements View.OnClickListener, NoiseParseUtils.OnDeviceSupportList, NoiseParseUtils.OnSetDeviceInfo, NoiseParseUtils.OnSynDeviceState, OnBleOtherDataListener {

private ListView list_view;

private List<String> mList;
private ArrayAdapter mListAdapter;

private String mMac;
private BleDevice mBleDevice;
private NoiseMeterWifiBleDevice mNoiseMeterBle;
private NoiseSendUtils mNoiseSendUtils;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wifi_ble_noise_meter);

findViewById(R.id.btn_get_device_state).setOnClickListener(this);
findViewById(R.id.btn_get_support_list).setOnClickListener(this);
findViewById(R.id.btn_noise_ac).setOnClickListener(this);
findViewById(R.id.btn_noise_min_max).setOnClickListener(this);
findViewById(R.id.btn_noise_hold).setOnClickListener(this);
findViewById(R.id.btn_noise_log).setOnClickListener(this);

list_view = findViewById(R.id.list_view);


// 获取Mac
mMac = getIntent().getStringExtra("mac");

// 初始化列表
mList = new ArrayList<>();
mListAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList);
list_view.setAdapter(mListAdapter);
}

int deviceAc = 1;
int deviceMinMax = 1;
int deviceHold = 1;
long mTime=0;

@Override
public void onClick(View v) {
int id = v.getId();
switch (id) {

case R.id.btn_get_device_state:
sendData(mNoiseSendUtils.sendSetDeviceState());
addText("获取设备状态");
break;

case R.id.btn_get_support_list:
sendData(mNoiseSendUtils.sendSetSupportList());
addText("获取设备支持的功能列表");
break;
case R.id.btn_noise_ac:
if (deviceAc == 1) {
deviceAc++;
} else {
deviceAc--;
}
sendData(mNoiseSendUtils.sendAc(deviceAc));
break;
case R.id.btn_noise_min_max:
deviceMinMax++;
sendData(mNoiseSendUtils.sendMinMaxMode(deviceMinMax%3));
break;
case R.id.btn_noise_hold:
if (deviceHold == 0) {
deviceHold++;
} else {
deviceHold--;
}
sendData(mNoiseSendUtils.sendHoldMode(deviceHold,100));
break;

case R.id.btn_noise_log:
sendData(mNoiseSendUtils.sendGetHistory(mTime));
addText("获取历史记录:时间="+mTime);
break;

default:

break;

}


}


private void sendData(BleNoiseTLVBean bleNoiseTLVBean) {
if (mNoiseMeterBle != null) {
mNoiseMeterBle.sendTLVData(bleNoiseTLVBean);
}
}

@Override
protected void onDestroy() {
if (mNoiseMeterBle != null) {
mNoiseMeterBle = null;
}
if (mBluetoothService != null) {
mBluetoothService.disconnectAll();
}
super.onDestroy();
}

@Override
public void onServiceSuccess() {
mBleDevice = mBluetoothService.getBleDevice(mMac);
if (mBleDevice != null) {
if (mNoiseMeterBle == null) {
NoiseMeterWifiBleDevice.init(mBleDevice);
mNoiseMeterBle = NoiseMeterWifiBleDevice.getInstance();
mNoiseSendUtils = new NoiseSendUtils();
mNoiseMeterBle.setOnDeviceSupportList(this);
mNoiseMeterBle.setOnSetDeviceInfo(this);
mNoiseMeterBle.setOnSynDeviceState(this);
mNoiseMeterBle.setOnBleOtherDataListener(this);
}

addText("设备连接成功:" + mMac);
}
}

@Override
public void onServiceErr() {

}

@Override
public void unbindServices() {

}


// 添加一条文本
private void addText(String text) {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss", Locale.US);
mList.add(sdf.format(System.currentTimeMillis()) + ":\n" + text);
mListAdapter.notifyDataSetChanged();
list_view.smoothScrollToPosition(mList.size() - 1);
}

private String getSupportStr(boolean state) {
return (state ? "支持" : "不支持");
}

//-----------------BLE-------------------


@Override
public void onProtocolVersion(String version) {
addText("设备版本:" + version);
}

@Override
public void onSupportFrequencyAc(boolean supportA, boolean supportC) {
addText("设备频率计权A:" + getSupportStr(supportA) + "\n" + "设备频率计权C:" + getSupportStr(supportC));
}

@Override
public void onSupportTestRange(int point, int min, int max) {
addText("测量总范围:小数点位数=" + point + " \n最大值:" + max + " \n最小值:" + min);
}

@Override
public void onSupportTestLevel(boolean supportMode) {
addText("测量等级切换:" + getSupportStr(supportMode));
}

@Override
public void onSupportMaxMinMode(boolean supportMode) {
addText("Max/Min 模式:" + getSupportStr(supportMode));
}

@Override
public void onSupportFatSlow(boolean fastType, boolean slowType) {
addText("时间加权(Fast/Slow):Fast=" + getSupportStr(fastType) + " \nSlow=" + getSupportStr(slowType));
}

@Override
public void onSupportHold(boolean supportMode) {
addText("数值保持(hold):" + getSupportStr(supportMode));
}

@Override
public void onSupportAlarm(boolean supportMode, int min, int max) {
addText("报警功能:" + getSupportStr(supportMode) + " \n最小值:" + min + " \n最大值:" + max);
}

@Override
public void onSupportBackLight(boolean supportMode) {
addText("背光:" + getSupportStr(supportMode));
}

@Override
public void onSupportNoiseValuePoint(int valuePoint) {
addText("噪音支持的小数点位数:" + valuePoint);
}

@Override
public void onSupportHistory(boolean supportMode) {
addText("设备是否支持保存历史数据:" + getSupportStr(supportMode));
}

@Override
public void onSupportPowered(int type) {
String showData;
switch (type) {

case 1:
showData = "锂电池供电";
break;
case 2:
showData = "干电池供电";
break;
case 3:
showData = "市电供电";
break;

default:
showData = "未知";
break;

}
addText("供电:" + showData);
}

//------------------


@Override
public void onSetFrequencyAc(int value) {
addText("设备:" + (value == 1 ? "使用 A 权" : "使用 C 权"));
}

@Override
public void onSetTestLevel(int state, int level, int minLevel, int maxLevel) {
addText("设备等级及范围:" + (state == 1 ? "等级+" : "等级-"));
addText("设备:当前的等级=" + level + " \n量程最小值=" + minLevel + " \n量程最大值=" + maxLevel);
}

@Override
public void onSetMaxMinMode(int mode) {
onSynMaxMinMode(mode);
}

@Override
public void onSetFatSlow(int mode) {
onSynFatSlow(mode);
}

@Override
public void onSetHold(boolean holdState, int holdValue) {
onSynHold(holdState, holdValue);
}

@Override
public void onSetAlarm(boolean allSwitch, boolean currentSwitch, int alarmValue) {
addText("报警:"+(allSwitch?"打开报警":"关闭报警")+"\n当前:"+(currentSwitch?"关闭当前报警":"none")+"\n报警值:"+alarmValue);
}

@Override
public void onSetBackLight(int switchStatus) {
onSynBackLight(switchStatus);
}

@Override
public void onSetNoiseHistory(List<NoiseMeterHistoryBean> list) {
addText("设备返回的历史记录:"+list.size()+"条");
if (list.size() > 0) {
NoiseMeterHistoryBean bean = list.get(list.size() - 1);
String show="时间:"+ TimeUtils.getTime(bean.getTime()*1000);
show+="噪音值:"+bean.getValue();
show+="\n状态:"+(bean.getAc()==1?"A权":"C权");
show+="\n状态:"+(bean.isAlarmState()?"已报警":"未报警");
show+="\n状态:"+(bean.getState()==1?"噪音值低于量程":"噪音值高于量程");
addText("设备返回的最近一条历史记录:"+show);
mTime=bean.getTime();
}
}

@Override
public void onSetBindDevice(int state) {
String show = "";
switch (state) {
case 1:
show = "APP 首次连接设备绑定时,会通过指令请求用户确认";
break;
case 2:
show = "MCU 返回,MCU 等待用户按键";
break;
case 3:
show = "MCU 返回,用户已按按键";
break;
case 4:
show = "MCU 返回,用户超时(30s)没按按键";
break;
case 5:
show = "APP 发起,APP 取消绑定";
break;
default:
}


addText("设备绑定:" + show);
}

//-------------

@Override
public void onSynFrequencyAc(int value) {
addText("设备:" + (value == 1 ? "使用 A 权" : "使用 C 权"));
}

@Override
public void onSynTestLevel(int level, int minLevel, int maxLevel) {
addText("设备:当前的等级=" + level + " \n量程最小值=" + minLevel + " \n量程最大值=" + maxLevel);
}

@Override
public void onSynMaxMinMode(int mode) {
String show = "正常模式";
if (mode == 1) {
show = "最小值测量模式 Min";
} else if (mode == 2) {
show = "最大值测量模式 Max";
}
addText("Max/Min 模式:当前为" + show);
}

@Override
public void onSynFatSlow(int mode) {
String show = "正常模式";
if (mode == 1) {
show = "Fast 模式";
} else if (mode == 2) {
show = "Slow 模式";
}
addText("时间加权:当前为" + show);
}

@Override
public void onSynHold(boolean holdMode, int holdValue) {
String show = "正常模式";
if (holdMode) {
show = "hold 模式";
}
addText("数值保持:当前为" + show + " 内容=" + holdValue);
}

@Override
public void onSynAlarm(boolean alarmStatus, boolean noiseAlarm) {
String show = "未打开";
if (alarmStatus) {
show = "已打开";
}
addText("报警功能:当前为" + show + " 内容=" + (noiseAlarm ? "报警" : "未报警"));
}

@Override
public void onSynBackLight(int switchStatus) {
String show = "未打开";
if (switchStatus==1) {
show = "已打开";
}
addText("背光:当前为" + show);
}

@Override
public void onSynNoiseValuePoint(int noiseState, int noiseValue) {
String show = "数值有效";
if (noiseState == 1) {
show = "数值低于量程,显示 under";
} else if (noiseValue == 2) {
show = "数值高于量程,显示 over";
}
addText("噪音值:当前为" + show + " 内容=" + noiseValue);
}

@Override
public void onSynPowered(boolean chargeState, boolean lowerState, int batter) {
String show = "充电状态:";
if (chargeState) {
show += "在充电";
} else {
show += "未充电";
}
if (lowerState) {
show += "低电";
} else {
show += "电压正常";
}
addText("供电:当前为" + show + " 电量百分比=" + batter);
}

@Override
public void onNotifyOtherData(String uuid, byte[] hex) {
String data = BleStrUtils.byte2HexStr(hex);
addText("接收到未知指令:" + data);
}
}

+ 2
- 2
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/share_charger/ShareChargerActivity.java Dosyayı Görüntüle

@@ -10,14 +10,14 @@ import android.widget.SeekBar;
import android.widget.TextView;

import com.pingwang.bluetoothlib.device.BleDevice;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.R;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.ShareCharger.ShareChargerData;


+ 2
- 2
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/share_condom/ShareCondomActivity.java Dosyayı Görüntüle

@@ -13,14 +13,14 @@ import android.widget.SeekBar;
import android.widget.TextView;

import com.pingwang.bluetoothlib.device.BleDevice;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.R;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.ShareCondom.ShareCondomData;

+ 2
- 2
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/share_socket/ShareSocketActivity.java Dosyayı Görüntüle

@@ -17,8 +17,6 @@ import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.listener.OnCallbackBle;
import com.pingwang.bluetoothlib.listener.OnScanFilterListener;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.R;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
@@ -27,6 +25,8 @@ import java.util.List;
import java.util.Locale;
import java.util.Map;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.ShareSocket.ShareSocketData;

+ 662
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/toothbrush/ToothBrushWifiBleActivity.java Dosyayı Görüntüle

@@ -0,0 +1,662 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.toothbrush;

import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

import com.elinkthings.bleotalibrary.listener.OnBleOTAListener;
import com.elinkthings.bleotalibrary.netstrap.OPLOtaManager;
import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.config.CmdConfig;
import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.listener.OnCallbackBle;
import com.pingwang.bluetoothlib.utils.BleLog;
import com.pingwang.bluetoothlib.utils.BleStrUtils;

import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.WifiDialog;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.ToothBrushUtils;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.ToothBrush.ToothBrushBleCmd;
import cn.net.aicare.modulelibrary.module.ToothBrush.ToothBrushWiFiBleUtilsData;

/**
* Wifi+ble 牙刷
*/
public class ToothBrushWifiBleActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, ToothBrushWiFiBleUtilsData.BleToothBrushWiFiCallback,
ToothBrushWiFiBleUtilsData.BleToothBrushCallback {
private String TAG = ToothBrushWifiBleActivity.class.getName();
private String mAddress;
private List<String> mList;
private ArrayAdapter listAdapter;

private ToothBrushWiFiBleUtilsData mToothBrushWiFiBleUtilsData;
private MHandler mMHandler;
private EditText mEditText, select_gears_et, ed_score;
private String dataPaw;


@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//禁止横屏
setContentView(R.layout.activity_tooth_brush_wifi_ble);
findViewById(R.id.wifistatus).setOnClickListener(this);
findViewById(R.id.sn).setOnClickListener(this);
findViewById(R.id.scan_wifi).setOnClickListener(this);
findViewById(R.id.connect_wifi).setOnClickListener(this);
findViewById(R.id.disconnect).setOnClickListener(this);
findViewById(R.id.setedname).setOnClickListener(this);
findViewById(R.id.support_unit).setOnClickListener(this);
findViewById(R.id.default_try_out).setOnClickListener(this);
findViewById(R.id.default_time_mode).setOnClickListener(this);
findViewById(R.id.default_mode).setOnClickListener(this);
findViewById(R.id.ota).setOnClickListener(this);
findViewById(R.id.btn_score).setOnClickListener(this);

mEditText = findViewById(R.id.select_wifi_et);
select_gears_et = findViewById(R.id.select_gears_et);
ed_score = findViewById(R.id.ed_score);

mAddress = getIntent().getStringExtra("mac");
mList = new ArrayList<>();
ListView listView = findViewById(R.id.log_list);
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList);
listView.setAdapter(listAdapter);
WeakReference weakReference = new WeakReference(new MHandler());
mMHandler = (MHandler) weakReference.get();


}


@Override
public void onServiceSuccess() {

//与服务建立连接
mList.add(0, "服务与界面建立连接成功");
// mList.add(0, "搜索设备");
mMHandler.sendEmptyMessage(ToRefreUi);
mBluetoothService.setOnCallback(this);
mBluetoothService.scanLeDevice(30 * 1000);


}


@Override
public void onServiceErr() {

}

@Override
public void unbindServices() {
if (mBluetoothService!=null) {
mBluetoothService.disconnectAll();
}
}

@Override
public void onStartScan() {

}

@Override
public void onScanning(BleValueBean data) {
BleLog.i(TAG, "MAC=" + mAddress + "||CID=" + data.getCid() + "||VID=" + data.getVid() + "||PID=" + data.getPid());
if (data.getMac().equalsIgnoreCase(mAddress)) {
if (mBluetoothService!=null) {
mBluetoothService.stopScan();
mBluetoothService.connectDevice(data.getMac());
}
}
}

@Override
public void onScanTimeOut() {

}

@Override
public void onConnecting(String mac) {

}

@Override
public void onDisConnected(String mac, int code) {
mList.add(0, "蓝牙已断开");
mMHandler.sendEmptyMessage(ToRefreUi);
}

@Override
public void onServicesDiscovered(String mac) {
mList.add(0, "蓝牙已连接");
mMHandler.sendEmptyMessage(ToRefreUi);
mBluetoothService.setOnCallback(this);
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress);
if (bleDevice != null) {
ToothBrushWiFiBleUtilsData.init(bleDevice, this, this);
mToothBrushWiFiBleUtilsData = ToothBrushWiFiBleUtilsData.getInstance();
mMHandler.sendEmptyMessageDelayed(ToRequestToken, 600);
mMHandler.sendEmptyMessageDelayed(GETBATTERY, 800);
}
}

@Override
public void bleOpen() {

}

@Override
public void bleClose() {

}


@Override
public void OnBleAndWifiStatus(int blestatus, int wifistatus, int workstatus) {
BleLog.e(TAG, "蓝牙状态:" + blestatus + " wifi状态:" + " 工作状态:" + workstatus);
mList.add(0, "蓝牙状态:" + blestatus + " wifi状态:" + wifistatus + " 工作状态:" + workstatus);
mMHandler.sendEmptyMessage(ToRefreUi);

}

@Override
public void OnWifiScanStatus(int Status) {
mList.add(0, "扫描wifi状态: " + Status);
mMHandler.sendEmptyMessage(ToRefreUi);
}

private HashMap<Integer, String> mHashMap = new HashMap();

@Override
public void OnWifiListName(int no, String name) {

mHashMap.put(no, name);
mMHandler.sendEmptyMessage(ToRefreUi);
}

private HashMap<Integer, String> wifimacMap = new HashMap();

@Override
public void OnWifiListInfo(int no, String mac, int db, int type, int wifistatus) {

wifimacMap.put(no, mac);
mList.add(0, "WIFI序号: " + no + " WIFI名称:" + mHashMap.get(no) + " WIFImac: " + mac + " db: " + db + " type: " + type + " wifistata" + wifistatus);
mMHandler.sendEmptyMessage(ToRefreUi);
}

@Override
public void OnWifiCurrentConnect(String name) {
mList.add(0, "当前连接wifi名称: " + name);
mMHandler.sendEmptyMessage(ToRefreUi);
}

@Override
public void OnWifiScanFinish(int wifiNum) {
mList.add(0, "扫描结束 扫描的wifi个数 " + wifiNum);
mMHandler.sendEmptyMessage(ToRefreUi);
}

private boolean issetMac = false;

/**
* @param type {@link CmdConfig#SET_WIFI_MAC}
* @param status {@link ToothBrushBleCmd#STATUS_SUCCESS}
*/
@Override
public void OnSetWifiNameOrPwdOrConnectCallback(int type, int status) {
if (type == CmdConfig.SET_WIFI_MAC) {
mList.add(0, "获取到设置的mac地址状态 " + status);
if (status == ToothBrushBleCmd.STATUS_SUCCESS) {
issetMac = true;
setPaw(dataPaw);
}

}
if (type == CmdConfig.SET_WIFI_PWD) {
mList.add(0, "获取到设置的密码状态 " + status);

if (status == ToothBrushBleCmd.STATUS_SUCCESS && issetMac) {
mMHandler.sendEmptyMessage(ConnectWifi);
}
}
if (type == CmdConfig.DISCONNECT_WIFI) {
mList.add(0, "发起连接 " + status);
mMHandler.sendEmptyMessage(ToRefreUi);
}

}

@Override
public void getSelectWifiMac(String mac) {
mList.add(0, "获取到设置的wifi的mac地址 " + mac);
mMHandler.sendEmptyMessage(ToRefreUi);
}

@Override
public void getSelectWifiPaw(String paw) {
mList.add(0, "获取到设置的wifi的密码 " + paw);
mMHandler.sendEmptyMessage(ToRefreUi);
}


@Override
public void getDid(long sn) {
mList.add(0, "sn: " + sn);
mMHandler.sendEmptyMessage(ToRefreUi);
}

@Override
public void onClick(View v) {
int id = v.getId();
if (mToothBrushWiFiBleUtilsData != null) {
switch (id) {
case R.id.wifistatus:

mToothBrushWiFiBleUtilsData.queryBleStatus();
break;
case R.id.sn:
mToothBrushWiFiBleUtilsData.getDevicedid();
break;
case R.id.scan_wifi:
mToothBrushWiFiBleUtilsData.scanWifi();
break;
case R.id.connect_wifi:
try {
int selectWifi = Integer.valueOf(mEditText.getText().toString().trim());
if (mHashMap.get(selectWifi) != null && wifimacMap.get(selectWifi) != null) {
WifiDialog.newInstance().setTitle(mHashMap.get(selectWifi), wifimacMap.get(selectWifi)).setOnDialogListener(new WifiDialog.OnDialogListener() {
@Override
public void tvCancelListener(View v) {

}

@Override
public void tvSucceedListener(View v, String data) {

if (data.equals("") || data.length() > 8) {
dataPaw = data.trim();
mToothBrushWiFiBleUtilsData.setWifimac(wifimacMap.get(selectWifi));
} else {
Toast.makeText(ToothBrushWifiBleActivity.this, "密码格式不对", Toast.LENGTH_SHORT).show();
}
}

@Override
public void etModifyName(EditText v) {

}
}).show(getSupportFragmentManager());
}
} catch (NumberFormatException e) {
e.printStackTrace();
mMHandler.sendEmptyMessage(ConnectWifi);
}

break;

case R.id.setedname:
mToothBrushWiFiBleUtilsData.getConnectWifiName();
break;
case R.id.disconnect:
mToothBrushWiFiBleUtilsData.disconnectWifi();
break;
case R.id.support_unit:
mToothBrushWiFiBleUtilsData.getSupportGears();
break;
case R.id.default_mode:
String gear = select_gears_et.getText().toString().trim();
if (!gear.isEmpty()) {
String[] gears = null;
if (gear.contains(",")) {
gears = gear.split(",");
} else if (gear.contains(",")) {
gears = gear.split(",");
} else {
Toast.makeText(this, "请输入时长,档位,档位级别(数字加符号)", Toast.LENGTH_SHORT).show();
}
if (gears != null) {
try {
mToothBrushWiFiBleUtilsData.setDefault(Integer.parseInt(gears[0]), Integer.parseInt(gears[1]), Integer.parseInt(gears[2]));
} catch (NumberFormatException e) {
e.printStackTrace();
Toast.makeText(this, "请输入时长,档位,档位级别(数字加符号)", Toast.LENGTH_SHORT).show();
}

}
}
break;
case R.id.default_try_out:
String gear1 = select_gears_et.getText().toString().trim();
if (!gear1.isEmpty()) {
String[] gears = null;
if (gear1.contains(",")) {
gears = gear1.split(",");
} else if (gear1.contains(",")) {
gears = gear1.split(",");
} else {
Toast.makeText(this, "请输入时长,档位,档位级别(数字加符号)", Toast.LENGTH_SHORT).show();
}
if (gears != null) {
try {
mToothBrushWiFiBleUtilsData.setTryOut(Integer.parseInt(gears[1]), Integer.parseInt(gears[2]), 0, 0);
} catch (NumberFormatException e) {
e.printStackTrace();
Toast.makeText(this, "请输入时长,档位,档位级别(数字加符号)", Toast.LENGTH_SHORT).show();
}

}
}

break;
case R.id.default_time_mode:

mToothBrushWiFiBleUtilsData.getDefaultGearAndDuration();
break;

case R.id.ota:
showFileChooser();
// mToothBrushWiFiBleUtilsData.setOta();

break;

default:

break;
}
}
if (v.getId() == R.id.btn_score) {
try {
String[] time = ed_score.getText().toString().trim().split(",");
int defaultTime = Integer.parseInt(time[0]);
int useTime = Integer.parseInt(time[1]);
int lTime = Integer.parseInt(time[2]);
int rTime = Integer.parseInt(time[3]);
ToothBrushUtils toothBrushUtils = new ToothBrushUtils();
int grade = toothBrushUtils.getGrade(defaultTime, useTime, lTime, rTime);
int avg = toothBrushUtils.getAvgGrade(defaultTime, lTime, rTime);
int rang = toothBrushUtils.getRangeGrade(defaultTime, lTime, rTime);
int duration = toothBrushUtils.getDurationGrade(defaultTime, useTime);
mList.add(0, grade + " 均匀度: " + avg + " 范围:" + rang + " 刷牙时长:" + duration);

mMHandler.sendEmptyMessage(ToRefreUi);
} catch (Exception e) {

mList.add(0, "出错了 请按 默认时长,刷牙时长,左时长,右时长.输入单位是秒");
mMHandler.sendEmptyMessage(ToRefreUi);
e.printStackTrace();
}
}
}

private final int ToRefreUi = 300;
private final int ConnectWifi = 400;
private final int ToRequestToken = 500;
private final int GETBATTERY = 600;


@Override
public void onVersion(String version) {
mList.add(0, "版本号:" + version);
mMHandler.sendEmptyMessage(ToRefreUi);
}

@Override
public void onGetSupportGears(List<Integer> staif, List<Integer> secondLevel) {
mList.add(0, "牙刷支持的一级档位:" + Arrays.toString(staif.toArray()) + " 二级档位:" + Arrays.toString(secondLevel.toArray()));
mMHandler.sendEmptyMessage(ToRefreUi);
}

@Override
public void onGetBattery(int batteryStatus, int batteryQuantity) {
mList.add(0, "电池状态:" + batteryStatus + " 电量:" + batteryQuantity);
mMHandler.sendEmptyMessage(ToRefreUi);
}

@Override
public void onGetDefaultGearAndDuration(int time, int gear, int gearFrom) {
mList.add(0, "获得到默认的刷牙档位和时长:" + time + " 档位:" + gear + " 档位级别" + gearFrom);
mMHandler.sendEmptyMessage(ToRefreUi);
}

@Override
public void onGetTokenResult(int result) {
String s = "";
if (result == ToothBrushBleCmd.NO_TOKEN) {
s = "没有";
} else if (result == ToothBrushBleCmd.HAS_TOKEN) {
s = "已经授权";
} else if (result == ToothBrushBleCmd.WITHOUT_TOKEN) {
s = "不需要授权";
} else if (result == ToothBrushBleCmd.SUCCESSTOKEN) {
s = "授权成功";
}
mList.add(0, "请求授权结果" + result + " " + s);
mMHandler.sendEmptyMessage(ToRefreUi);
}

@Override
public void onGetManualParameter(int time, int hz, int duty) {
mList.add(0, " 获取手动档位的参数: 时长" + time + " 频率" + hz + " 占空比" + duty);
mMHandler.sendEmptyMessage(ToRefreUi);
}

@Override
public void onSetDefaultModeAndManualModeResult(byte type, int result) {
String s = "";
if (result == 0) {
s = "设置成功";
} else if (result == 1) {
s = "设置失败";
} else if (result == 2) {
s = "不支持设置";
}
if (type == ToothBrushBleCmd.SET_TOOTHBRUSH_TIME_GEARS) {
mList.add(0, " 设置默认刷牙时长和工作档位: 结果" + result + " " + s);
mMHandler.sendEmptyMessage(ToRefreUi);
} else {
mList.add(0, " 设置手动设置(自定义)档位: 结果" + result + " " + s);
mMHandler.sendEmptyMessage(ToRefreUi);
}
}

@Override
public void onTestFinish(int totalTime, int leftTime, int rightTime, int mode, int battery) {
mList.add(0, "刷牙完成: 总时长:" + totalTime + " 左时长:" + leftTime + " 右时长:" + rightTime + " 模式:" + mode + " 电量:" + battery);
mMHandler.sendEmptyMessage(ToRefreUi);
}

@Override
public void onTryOutResult(int result) {
mList.add(0, "设置使用结果:" + result + " ( 0:设置成功 1:设置失败,原因未知 2:不支持设置)");
mMHandler.sendEmptyMessage(ToRefreUi);
}

@Override
public void onTwoLevelModeDefault(int mode) {
mList.add(0, "获取二级档位默认值:" + mode);
mMHandler.sendEmptyMessage(ToRefreUi);
}


@Override
public void onOTA(int status) {
String s = " ";
switch (status) {
case 0x00:
s = "wifiOTA 成功";
break;
case 0x01:
s = "wifiOTA 失败";
break;
case 0x02:
s = "不支持 wifiOTA";
break;
case 0x03:
s = "模块主动开始 wifiOTA(MCU 收到该指 令后不能断电,需要等待 OTA 成功或者失败)";
break;
}
mList.add(0, s);
mMHandler.sendEmptyMessage(ToRefreUi);
}

@Override
public void onShowData(String data) {
L.i(data);
}

private class MHandler extends Handler {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case ToRefreUi:
if (listAdapter != null) {
listAdapter.notifyDataSetChanged();
}
break;
case ConnectWifi:
mToothBrushWiFiBleUtilsData.connectWifi();
break;
case ToRequestToken:
mList.add(0, "请求授权");
mToothBrushWiFiBleUtilsData.requestToken(System.currentTimeMillis());
if (listAdapter != null) {
listAdapter.notifyDataSetChanged();
}
mToothBrushWiFiBleUtilsData.getDefaultGearAndDuration();
break;
case GETBATTERY:
mToothBrushWiFiBleUtilsData.getBattery();
break;
}
}
}


/**
* wifi密码一次只能传14个byte
* 如果密码长度超过14个byte 就需要分包传送
* subpackage 为0 时,表示后面还有数据
* subpackage 为1 时,表示数据小于或等于14个byte,后面没有数据
*
* @param paw
*/
private void setPaw(String paw) {
if (paw.isEmpty()) {
byte[] bytes = new byte[0];
mToothBrushWiFiBleUtilsData.setWifiPwd(0, bytes);
} else {
byte[] password = BleStrUtils.stringToBytes(paw);
if (password != null) {
if (password.length < 14) {
mToothBrushWiFiBleUtilsData.setWifiPwd(0, password);
} else {
boolean isend = false;
int i = 0;
byte[] byte1 = password;
while (!isend) {
if (byte1.length > 14) {
byte[] bytes = new byte[14];
System.arraycopy(password, i, bytes, 0, bytes.length);

mToothBrushWiFiBleUtilsData.setWifiPwd(1, bytes);
i = i + 14;
byte1 = Arrays.copyOf(password, password.length - i);
} else {
isend = true;
byte[] bytes = new byte[password.length - i];
System.arraycopy(password, i, bytes, 0, bytes.length);
mToothBrushWiFiBleUtilsData.setWifiPwd(1, bytes);

}

}


}
}
}
}

private static final int FILE_SELECT_CODE = 0x1002;

private void showFileChooser() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("*/*");
intent.addCategory(Intent.CATEGORY_OPENABLE);

try {
startActivityForResult(Intent.createChooser(intent, "Select a File to Upload"), FILE_SELECT_CODE);
} catch (android.content.ActivityNotFoundException ex) {
Toast.makeText(this, "Please install a File Manager.", Toast.LENGTH_SHORT).show();
}
}


@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
Uri uri = data.getData();
String path = uri.getPath();
mList.add(0, "ota准备就绪,请勿操作");
listAdapter.notifyDataSetChanged();
initOtaUtil(this, uri, new OnBleOTAListener() {
@Override
public void onOtaSuccess() {
mList.add(0, "ota成功");
listAdapter.notifyDataSetChanged();

}

@Override
public void onOtaFailure(int cmd, String err) {
mList.add(0, "失败");
listAdapter.notifyDataSetChanged();
}

private int mOldProgress = -1;

@Override
public void onOtaProgress(float progress, int currentCount, int maxCount) {
if (mOldProgress != progress) {
mOldProgress = (int) progress;
mList.add(0, "otaProgress:" + progress);
listAdapter.notifyDataSetChanged();
}
}
}, mToothBrushWiFiBleUtilsData.getBleDevice());
} else {

}
}


private OPLOtaManager mOPLOtaManager;

public void initOtaUtil(Context context, Uri url, OnBleOTAListener listener, BleDevice bleDevice) {
mOPLOtaManager = null;
mOPLOtaManager = OPLOtaManager.newBuilder(context).setFilePath(url).setOnBleOTAListener(listener).build(bleDevice);
mOPLOtaManager.startOta();
}

}

+ 497
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/toothbrush_test/ToothbrushTestActivity.java Dosyayı Görüntüle

@@ -0,0 +1,497 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.toothbrush_test;

import android.app.AlertDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.text.TextUtils;

import com.pingwang.bluetoothlib.device.BleDevice;

import java.util.ArrayList;
import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import cn.net.aicare.modulelibrary.module.BleToothbrush.ToothbrushTestData;

public class ToothbrushTestActivity extends BleBaseActivity implements ToothbrushTestData.BleToothbrushCallback, ToothbrushTestAdapter.OnSelectListener {

private static final int STEP_SUPPORT_MODE = 0;// 牙刷支持模式列表
private static final int STEP_REQUEST_TOKEN = 1;// 请求绑定
private static final int STEP_SET_DEFAULT_TIME_MODE = 2;// 设置默认的刷牙时长和刷牙模式
private static final int STEP_GET_DEFAULT_TIME_MODE = 3;// 获取默认的刷牙时长和刷牙模式
private static final int STEP_TRY = 4;// 试用
private static final int STEP_QUERY_WORK_STATUS = 5;// 查询工作状态
private static final int STEP_SET_CUSTOM = 6;// 手动挡位设置
private static final int STEP_GET_CUSTOM = 7;// 手动挡位获取
private static final int STEP_SET_GEAR_TWO = 8;// 设置二级挡位
private static final int STEP_GET_GEAR_TWO = 9;// 获取二级挡位
private static final int STEP_WORK = 10;// 让牙刷进行工作
private static final int STEP_WORK_TRY = 11;// 工作中进行试用
private static final int STEP_WORK_SET_MODE = 12;// 工作中切换模式
private static final int STEP_DONE = 13;// 结束

private static final int RESULT_NULL = 0;
private static final int RESULT_SUCCESS = 1;
private static final int RESULT_FAIL = 2;

private static final long DELAY_FAIL = 2000;// 每个测试项等待多久
private static final long DELAY_NEXT = 500;// 进入下一个测试需要等多久

private static final int MSG_FAIL = 100;// 超时
private static final int MSG_NEXT = 101;// 下一步

private RecyclerView recycler_view;

private List<ToothbrushTestBean> mList;
private ToothbrushTestAdapter mAdapter;

private String mMac;
private BleDevice mBleDevice;
private ToothbrushTestData mToothbrushTestData;

private int mStep;// 当前正在进行哪个步骤
private int mSupportMode;// 支持的模式
private int mWorkTryResult = -1;
private int mWorkSetModeResult = -1;

private Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(@NonNull Message msg) {
switch (msg.what) {
case MSG_FAIL:
// 超时就是失败
setTestResultStr(null);
setTestResult(RESULT_FAIL);
// 然后开启下一组测试
mStep = getNextStep();
mHandler.sendEmptyMessageDelayed(MSG_NEXT, DELAY_NEXT);
break;
case MSG_NEXT:
// 开始下一组测试
test();
break;
}
}
};

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_toothbrush_test);

recycler_view = findViewById(R.id.recycler_view);

// 获取Mac
mMac = getIntent().getStringExtra("mac");
setTitle(mMac);

// 初始化列表
mList = new ArrayList<>();
mAdapter = new ToothbrushTestAdapter(this, mList);
recycler_view.setLayoutManager(new LinearLayoutManager(this));
recycler_view.setAdapter(mAdapter);
mAdapter.setOnSelectListener(this);
}

@Override
protected void onDestroy() {
if (mHandler != null) {
mHandler.removeCallbacksAndMessages(null);
mHandler = null;
}
if (mBluetoothService != null) {
mBluetoothService.disconnectAll();
}
super.onDestroy();
}

@Override
public void onServiceSuccess() {
mBleDevice = mBluetoothService.getBleDevice(mMac);
if (mBleDevice != null) {
mToothbrushTestData = new ToothbrushTestData(mBleDevice);
mToothbrushTestData.setBleToothbrushCallback(this);

// 开始进行第一步测试
addTestTitle(1);
mStep = STEP_SUPPORT_MODE;
test();
}
}

@Override
public void onServiceErr() {

}

@Override
public void unbindServices() {

}

@Override
public void mcuSupportMode(List<Integer> firstList, List<Integer> secondList) {
// MCU 回复支持挡位列表
if (mStep == STEP_SUPPORT_MODE) {
stepSuccess();
if (firstList.size() > 0) {
mSupportMode = firstList.get(0);
} else {
mSupportMode = 1;
}
}
}

@Override
public void mcuToken(int result) {
// MCU 回复授权结果
if (mStep == STEP_REQUEST_TOKEN) {
stepSuccess();
}
}

@Override
public void mcuSetDefaultMode(String hexStr, int result) {
// MCU 回复设置默认模式和时长
if (mStep == STEP_SET_DEFAULT_TIME_MODE) {
stepSuccess();
} else if (mStep == STEP_WORK_SET_MODE) {
mWorkSetModeResult = result;
setTestTitleStr("测试项3:测试4.3.8.1牙刷在工作状态下,APP发送设置默认刷牙模式和刷牙时长命令,MCU应该回复设置失败(请启动牙刷后点击右侧\"模式\"按钮))\n\n" + hexStr);
if (result == 1) {
stepSuccess();
}
}
}

@Override
public void mcuGetDefaultMode(int time, int gear, int gearLevel) {
// MCU 回复获取默认模式和时长
if (mStep == STEP_GET_DEFAULT_TIME_MODE) {
stepSuccess();
}
}

@Override
public void mcuTry(String hexStr, int result) {
// MCU 回复试用
if (mStep == STEP_TRY) {
stepSuccess();
} else if (mStep == STEP_WORK_TRY) {
mWorkTryResult = result;
setTestTitleStr("测试项2:测试4.3.9牙刷在工作状态下,APP发送试用命令,MCU应该回复 0x05:设置失败,正在工作(请启动牙刷后点击右侧\"试用\"按钮))\n\n" + hexStr);
if (result == 5) {
stepSuccess();
}
}
}

private boolean mHasStop = false;// 是否有关闭电机
private boolean mHasChange = false;// 是否有切换阶段

@Override
public void mcuQueryWorkStatus(int gear, int gearLevel, int stage) {
// MCU 回复查询工作状态
if (mStep == STEP_QUERY_WORK_STATUS) {
stepSuccess();
} else if (mStep == STEP_WORK) {
// 测试工作阶段
if (gear == 0x00) {
mHasStop = true;
}
if (stage == 0xFF) {
// 如果不支持阶段就当作成功
mHasChange = true;
} else {
// 其他的也算成功
mHasChange = true;
}
}
}

@Override
public void mcuSetCustom(int status) {
// MCU 回复设置自定义挡位参数
if (mStep == STEP_SET_CUSTOM) {
stepSuccess();
}
}

@Override
public void mcuGetCustom(int frequency, int duty, int time) {
// MCU 回复获取自定义挡位参数
if (mStep == STEP_GET_CUSTOM) {
stepSuccess();
}
}

@Override
public void mcuSetGearTwo(int status) {
// MCU 回复设置二级挡位
if (mStep == STEP_SET_GEAR_TWO) {
stepSuccess();
}
}

@Override
public void mcuGetGearTwo(int status) {
// MCU 回复获取二级挡位
if (mStep == STEP_GET_GEAR_TWO) {
stepSuccess();
}
}

@Override
public void onSelect(int pos) {
ToothbrushTestBean bean = mList.get(pos);
if (TextUtils.isEmpty(bean.getResultStr())) {
if (bean.getResult() == RESULT_FAIL) {
// 如果是失败,显示失败原因
switch (bean.getStep()) {
case STEP_SUPPORT_MODE:
showNgDialog("4.3.2 MCU/APP 获取牙刷支持的模式列表( Type = 0x36)");
break;
case STEP_REQUEST_TOKEN:
showNgDialog("4.3.3.3 APP 请求绑定");
break;
case STEP_SET_DEFAULT_TIME_MODE:
showNgDialog("4.3.8.1 APP 设置默认的工作模式。");
break;
case STEP_GET_DEFAULT_TIME_MODE:
showNgDialog("4.3.8.2 APP 获取默认的工作模式。");
break;
case STEP_TRY:
showNgDialog("4.3.9 APP 试用指令 (0x7A -- 0x06)");
break;
case STEP_QUERY_WORK_STATUS:
showNgDialog("4.3.10 APP 查询 / MCU 上报 牙刷工作状态 (0x7A -- 0x07)");
break;
case STEP_SET_CUSTOM:
showNgDialog("4.3.11.1 APP 设置自定义档位参数");
break;
case STEP_GET_CUSTOM:
showNgDialog("4.3.11.2 APP 获取自定义档位参数");
break;
case STEP_SET_GEAR_TWO:
showNgDialog("4.3.13.1 APP 设置二级档位默认模式");
break;
case STEP_GET_GEAR_TWO:
showNgDialog("4.3.13.2 APP 获取二级档位默认模式");
break;
case STEP_WORK:
showNgDialog("4.3.10 APP 查询 / MCU 上报 牙刷工作状态 (0x7A -- 0x07)。需要回复关闭电机和模式切换。");
break;
case STEP_WORK_TRY:
showNgDialog("4.3.9 APP 试用指令 (0x7A -- 0x06)。回复5: 设置失败, 正在工作");
break;
case STEP_WORK_SET_MODE:
showNgDialog("4.3.8.1 APP 设置默认的工作模式。回复失败");
break;
}
}
} else {
switch (bean.getStep()) {
case STEP_WORK:
if (mHasStop && mHasChange) {
stepSuccess();
} else {
mHandler.sendEmptyMessage(MSG_FAIL);
}
break;
case STEP_WORK_TRY:
setTestResultStr(null);
mHandler.sendEmptyMessageDelayed(MSG_FAIL, DELAY_FAIL);
mToothbrushTestData.appTry(mSupportMode, 1, 1, 1);
mHandler.postDelayed(() -> {
mToothbrushTestData.appTry(0, 1, 1, 1);
}, 3000);
break;
case STEP_WORK_SET_MODE:
setTestResultStr(null);
mHandler.sendEmptyMessageDelayed(MSG_FAIL, DELAY_FAIL);
mToothbrushTestData.appSetDefaultMode(1, mSupportMode, 1);
break;
}
}
}

/**
* 进行测试
*/
private void test() {
switch (mStep) {
case STEP_SUPPORT_MODE:
addTest("获取牙刷支持的模式列表");
mToothbrushTestData.appGetSupportMode();
break;
case STEP_REQUEST_TOKEN:
addTest("请求绑定");
mToothbrushTestData.appRequestToken();
break;
case STEP_SET_DEFAULT_TIME_MODE:
addTest("设置默认的刷牙时长和刷牙模式");
mToothbrushTestData.appSetDefaultMode(120, mSupportMode, 1);
break;
case STEP_GET_DEFAULT_TIME_MODE:
addTest("获取默认的刷牙时长和刷牙模式");
mToothbrushTestData.appGetDefaultMode();
break;
case STEP_TRY:
addTest("试用");
mToothbrushTestData.appTry(mSupportMode, 1, 1, 1);
mHandler.postDelayed(() -> {
mToothbrushTestData.appTry(0, 1, 1, 1);
}, 3000);
break;
case STEP_QUERY_WORK_STATUS:
addTest("查询工作状态");
mToothbrushTestData.appQueryWorkStatus();
break;
case STEP_SET_CUSTOM:
addTest("设置自定义挡位参数(牙刷不支持请忽略)");
mToothbrushTestData.appSetCustom(1, 1, 120);
break;
case STEP_GET_CUSTOM:
addTest("获取自定义挡位参数(牙刷不支持请忽略)");
mToothbrushTestData.appGetCustom();
break;
case STEP_SET_GEAR_TWO:
addTest("设置二级挡位(牙刷不支持请忽略)");
mToothbrushTestData.appSetGearTwo(1);
break;
case STEP_GET_GEAR_TWO:
addTest("获取二级挡位(牙刷不支持请忽略)");
mToothbrushTestData.appGetGearTwo();
break;
case STEP_WORK:
addTestTitle(2);
// addTest("4.3.10 APP 查询 / MCU 上报 牙刷工作状态。请开启牙刷,刷牙30秒以上,停止后点击结束");
addTest("测试项1:测试4.3.10刷牙过程中,MCU应该上报牙刷工作状态(请启动牙刷,刷牙30秒以上,停止后点击右侧\"结束\"按钮)");
setTestResultStr("结束");
mHandler.removeMessages(MSG_FAIL);
break;
case STEP_WORK_TRY:
addTest("测试项2:测试4.3.9牙刷在工作状态下,APP发送试用命令,MCU应该回复 0x05:设置失败,正在工作(请启动牙刷后点击右侧\"试用\"按钮))");
setTestResultStr("试用");
mHandler.removeMessages(MSG_FAIL);
break;
case STEP_WORK_SET_MODE:
// addTest("牙刷在工作时,是否会响应设置模式指令:请开启牙刷后点击模式");
addTest("测试项3:测试4.3.8.1牙刷在工作状态下,APP发送设置默认刷牙模式和刷牙时长命令,MCU应该回复设置失败(请启动牙刷后点击右侧\"模式\"按钮))");
setTestResultStr("模式");
mHandler.removeMessages(MSG_FAIL);
break;
case STEP_DONE:
addTest("测试结束。以上出现NG的项说明没有回复应该回的指令。如果设备不支持,请忽略");
mHandler.removeMessages(MSG_FAIL);
break;
}
}

/**
* 添加测试项
*
* @param title 测试项标题
*/
private void addTest(String title) {
mList.add(new ToothbrushTestBean(mStep, title, RESULT_NULL));
mAdapter.notifyItemInserted(mList.size() - 1);
recycler_view.smoothScrollToPosition(mList.size() - 1);
addTimeout();
}

/**
* 添加测试项标题
* @param type 1:自动测试;2:手动测试
*/
private void addTestTitle(int type) {
mList.add(new ToothbrushTestBean(type));
mAdapter.notifyItemInserted(mList.size() - 1);
recycler_view.smoothScrollToPosition(mList.size() - 1);
}

/**
* 设置测试结果
*
* @param result 0 无,1 成功,2 失败
*/
private void setTestResult(int result) {
mList.get(mList.size() - 1).setResult(result);
mAdapter.notifyItemChanged(mList.size() - 1);
}

/**
* 设置测试结果字符串
*
* @param resultStr 字符串
*/
private void setTestResultStr(String resultStr) {
mList.get(mList.size() - 1).setResultStr(resultStr);
mAdapter.notifyItemChanged(mList.size() - 1);
}

/**
* 设置测试标题字符串
*
* @param titleStr 字符串
*/
private void setTestTitleStr(String titleStr) {
mList.get(mList.size() - 1).setTitle(titleStr);
mAdapter.notifyItemChanged(mList.size() - 1);
}

/**
* 增加超时检测
*/
private void addTimeout() {
mHandler.removeMessages(MSG_FAIL);
mHandler.sendEmptyMessageDelayed(MSG_FAIL, DELAY_FAIL);
}

/**
* 这一步测试成功
*/
private void stepSuccess() {
setTestResultStr(null);
setTestResult(RESULT_SUCCESS);
mHandler.removeMessages(MSG_FAIL);
mHandler.removeMessages(MSG_NEXT);

if (mStep == STEP_TRY || mStep == STEP_WORK_TRY) {
mHandler.sendEmptyMessageDelayed(MSG_NEXT, 5000);
} else {
mHandler.sendEmptyMessageDelayed(MSG_NEXT, DELAY_NEXT);
}

mStep = getNextStep();
}

/**
* 获取下一步
*
* @return nextStep
*/
private int getNextStep() {
return mStep + 1;
}

/**
* 弹框提示
*
* @param str str
*/
private void showNgDialog(String str) {
new AlertDialog.Builder(this)
.setTitle("请按照协议回复:")
.setMessage("\n" + str)
.setPositiveButton("确认", null)
.show();
}
}

+ 122
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/toothbrush_test/ToothbrushTestAdapter.java Dosyayı Görüntüle

@@ -0,0 +1,122 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.toothbrush_test;

import android.content.Context;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.RecyclerView;

public class ToothbrushTestAdapter extends RecyclerView.Adapter<ToothbrushTestAdapter.ViewHolder> {

private Context mContext;
private List<ToothbrushTestBean> mList;

public interface OnSelectListener {
void onSelect(int pos);
}

private OnSelectListener mOnSelectListener;

public void setOnSelectListener(OnSelectListener onSelectListener) {
mOnSelectListener = onSelectListener;
}

class ViewHolder extends RecyclerView.ViewHolder {

TextView tv_title;
TextView tv_result;

public ViewHolder(@NonNull View itemView) {
super(itemView);
tv_title = itemView.findViewById(R.id.tv_title);
tv_result = itemView.findViewById(R.id.tv_result);
}

void bind(int pos) {
ToothbrushTestBean bean = mList.get(pos);
tv_title.setText(bean.getTitle());

if (TextUtils.isEmpty(bean.getResultStr())) {
switch (bean.getResult()) {
case 0:
tv_result.setText("");
break;
case 1:
tv_result.setText("OK");
tv_result.setTextColor(ContextCompat.getColor(mContext, android.R.color.holo_blue_dark));
break;
case 2:
tv_result.setText("NG ?");
tv_result.setTextColor(ContextCompat.getColor(mContext, android.R.color.holo_red_dark));
break;
}
} else {
tv_result.setText(bean.getResultStr());
tv_result.setTextColor(ContextCompat.getColor(mContext, R.color.colorAccent));
}
}

void bindTest(int pos) {
ToothbrushTestBean bean = mList.get(pos);
if (bean.getType() == 1) {
tv_title.setText("自动测试(过程中,不要手动启动牙刷)");
} else {
tv_title.setText("手动测试");
}
}
}

public ToothbrushTestAdapter(Context context, List<ToothbrushTestBean> list) {
mContext = context;
mList = list;
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ViewHolder viewHolder;

if (viewType == 0) {
viewHolder = new ViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_toothbrush_test, parent, false));
viewHolder.itemView.setOnClickListener(v -> {
int pos = viewHolder.getAdapterPosition();
if (pos != -1 && mOnSelectListener != null) {
mOnSelectListener.onSelect(pos);
}
});
} else {
viewHolder = new ViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_toothbrush_test_title, parent, false));
}


return viewHolder;
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
if (holder.getItemViewType() == 0) {
holder.bind(position);
} else {
holder.bindTest(position);
}
}

@Override
public int getItemCount() {
return mList.size();
}

@Override
public int getItemViewType(int position) {
ToothbrushTestBean bean = mList.get(position);
return bean.getType();
}
}

+ 59
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/toothbrush_test/ToothbrushTestBean.java Dosyayı Görüntüle

@@ -0,0 +1,59 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.toothbrush_test;

public class ToothbrushTestBean {
private int type;// 显示类型;0:正常;1:自动测试;2:手动测试
private int step;// 第几步
private String title;
private int result;// 0 不显示;1 成功;2 失败
private String resultStr;// 如果不为空,说明提示其它内容

public ToothbrushTestBean(int step, String title, int result) {
this.step = step;
this.title = title;
this.result = result;
}

public ToothbrushTestBean(int type) {
this.type = type;
}

public int getStep() {
return step;
}

public void setStep(int step) {
this.step = step;
}

public String getTitle() {
return title;
}

public void setTitle(String title) {
this.title = title;
}

public int getResult() {
return result;
}

public void setResult(int result) {
this.result = result;
}

public String getResultStr() {
return resultStr;
}

public void setResultStr(String resultStr) {
this.resultStr = resultStr;
}

public int getType() {
return type;
}

public void setType(int type) {
this.type = type;
}
}

+ 327
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/weight_scale/WeightScaleActivity.java Dosyayı Görüntüle

@@ -0,0 +1,327 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.weight_scale;

import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.ListView;
import android.widget.RadioButton;

import com.pingwang.bluetoothlib.device.BleDevice;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.weightscale.WeightScaleDevice;

/**
* @auther ljl
* on 2023/3/3
*/
public class WeightScaleActivity extends BleBaseActivity implements WeightScaleDevice.OnWeightScaleDataListener, View.OnClickListener {
private String mMac;
private BleDevice mBleDevice;

private ListView list_view;

private List<String> mList;
private ArrayAdapter mListAdapter;

private WeightScaleDevice mWeightScaleDevice;

private Button btn_weight_battery, btn_weight_sync_time,btn_weight_query_unit;

private RadioButton kg, jing, stlb, lb;


@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_weight_scale);
initView();
mMac = getIntent().getStringExtra("mac");
mList = new ArrayList<>();
mListAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList);
list_view.setAdapter(mListAdapter);
}

private void initView() {
list_view = findViewById(R.id.list_view);
btn_weight_battery = findViewById(R.id.btn_weight_battery);
btn_weight_battery.setOnClickListener(this);
btn_weight_sync_time = findViewById(R.id.btn_weight_sync_time);
btn_weight_sync_time.setOnClickListener(this);
btn_weight_query_unit = findViewById(R.id.btn_weight_query_unit);
btn_weight_query_unit.setOnClickListener(this);

kg = findViewById(R.id.kg);
jing = findViewById(R.id.jin);
stlb = findViewById(R.id.st_lb);
lb = findViewById(R.id.lb);
kg.setChecked(true);
setUnitinit();
}

private void setUnitinit() {
kg.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
if (mWeightScaleDevice != null) {
mWeightScaleDevice.setScaleUnit(0);
}
}
}
});
jing.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
if (mWeightScaleDevice != null) {
mWeightScaleDevice.setScaleUnit(1);
}
}
}
});
stlb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
if (mWeightScaleDevice != null) {
mWeightScaleDevice.setScaleUnit(4);
}
}
}
});
lb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
if (mWeightScaleDevice != null) {
mWeightScaleDevice.setScaleUnit(6);
}
}
}
});
}


@Override
public void onServiceSuccess() {
mBleDevice = mBluetoothService.getBleDevice(mMac);
if (mBleDevice != null) {
if (mWeightScaleDevice == null) {
WeightScaleDevice.init(mBleDevice);
mWeightScaleDevice = WeightScaleDevice.getInstance();
mWeightScaleDevice.setOnWeightScaleDataListener(this);
mWeightScaleDevice.getBattery();
mWeightScaleDevice.setScaleUnit(0);
}

}
}

@Override
public void onServiceErr() {

}

@Override
public void unbindServices() {

}

/**
* 添加一条文本
*
* @param text 文本
*/
private void addText(String text) {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss", Locale.US);
mList.add(sdf.format(System.currentTimeMillis()) + ":\n" + text);
if (mListAdapter != null) {
mListAdapter.notifyDataSetChanged();
}
if (list_view != null) {
list_view.smoothScrollToPosition(mList.size() - 1);
}
}


/**
* 实时重量
*
* @param realStatus
* @param realWeight
* @param realPoint
* @param realUnit
*/
@Override
public void onRealWeightData(int realStatus, int realWeight, int realPoint, int realUnit) {
if (realUnit == 4) {
addText("实时重量:" + (int) LbToSt(getWeight(realWeight, realPoint))[0] + ":" + LbToSt(getWeight(realWeight, realPoint))[1] + " 单位:" + getUnit(realUnit));
} else {
addText("实时重量:" + getWeight(realWeight, realPoint) + " 单位:" + getUnit(realUnit));
}
}

private String getUnit(int unit) {
switch (unit) {
default:
case 0:
return "kg";
case 1:
return "斤";
case 4:
return "st:lb";
case 6:
return "lb";
}
}

private float getWeight(int weight, int point) {
return (float) (weight / Math.pow(10, point));
}

/**
* lb转st:lb
*/
public static float[] LbToSt(float lbSize) {
float[] lbFloatS = new float[2];
int st = (int) lbSize / 14;
float lb = lbSize % 14f;
lbFloatS[0] = st;
lbFloatS[1] = lb;
return lbFloatS;
}

/**
* 稳定重量
*
* @param stableStatus
* @param stableWeight
* @param stablePoint
* @param stableUnit
*/
@Override
public void onStableWeightData(int stableStatus, int stableWeight, int stablePoint, int stableUnit) {
if (stableUnit == 4) {
addText("稳定重量:" + (int) LbToSt(getWeight(stableWeight, stablePoint))[0] + ":" + LbToSt(getWeight(stableWeight, stablePoint))[1] + " 单位:" + getUnit(stableUnit));
} else {
addText("稳定重量:" + getWeight(stableWeight, stablePoint) + " 单位:" + getUnit(stableUnit));
}
}

@Override
public void onDataA6(String A6DataStr) {
addText("收到的A6 PayLoad:[" + A6DataStr + "]");
}

@Override
public void onDataA7(String A7DataStr) {
addText("收到的A7 PayLoad:[" + A7DataStr + "]");
}

@Override
public void onMeasureOk() {
addText("测量完成");
}

/**
* bmi值,需要除以10
*
* @param bmi
*/
@Override
public void onBmi(float bmi) {
addText("BMI值为:" + bmi);
}

/**
* 设置单位结果 0-成功 1-失败 2-不支持
*
* @param unitResult
*/
@Override
public void onUnitResult(int unitResult) {
switch (unitResult) {
case 0:
addText("单位设置成功:" + unitResult);
break;
case 1:
addText("单位设置失败:" + unitResult);
break;
case 2:
addText("不支持单位设置:" + unitResult);
break;
}
}

/**
* 设备上发的错误码
*
* @param errorCode
*/
@Override
public void onErrorCode(int errorCode) {
addText("错误码:" + errorCode);
}

@Override
public void onVersion(String version) {
addText("版本号:" + version);
}

/**
* 请求同步时间
*
* @param quest 1-请求同步时间
*/
@Override
public void onSyncTime(int quest) {
if (quest == 1) {
if (mWeightScaleDevice != null) {
mWeightScaleDevice.appSyncTime();
}
}
}

@Override
public void onBattery(int status, int battery) {
addText("电量:" + battery + "% " + "状态码:" + status);
}

@Override
public void onClick(View view) {
if (view.getId() == R.id.btn_weight_battery) {
if (mWeightScaleDevice != null) {
mWeightScaleDevice.getBattery();
}
} else if (view.getId() == R.id.btn_weight_sync_time) {
if (mWeightScaleDevice != null) {
mWeightScaleDevice.appSyncTime();
}
}else if (view.getId()==R.id.btn_weight_query_unit){
if (mWeightScaleDevice != null) {
mWeightScaleDevice.queryUnit();
}
}
}

@Override
protected void onDestroy() {
if (mWeightScaleDevice != null) {
mWeightScaleDevice = null;
}
if (mBluetoothService != null) {
mBluetoothService.disconnectAll();
}
super.onDestroy();
}
}

+ 13
- 5
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/EightBodyFatAlgorithms.java Dosyayı Görüntüle

@@ -2,7 +2,6 @@ package aicare.net.cn.sdk.ailinksdkdemoandroid.utils;

import com.besthealth.bhBodyComposition120.BhBodyComposition;
import com.besthealth.bhBodyComposition120.BhErrorType;
import com.besthealth.bhBodyComposition120.BhPeopleType;
import com.besthealth.bhBodyComposition120.BhSex;
import com.holtek.libHTBodyfat.HTBodyBasicInfo;
import com.holtek.libHTBodyfat.HTBodyResultAllBody;
@@ -29,24 +28,33 @@ public class EightBodyFatAlgorithms {
}



public EightBodyFatBean getAlgorithmsData(int algorithms, int sex, int height, float weight_kg, int age, EightBodyfatAdc eightBodyfatAdc) {
EightBodyFatBean eightBodyFatBean = new EightBodyFatBean();
switch (algorithms) {

case 2:
case 0x20:
//实例化对象
BhBodyComposition bhBodyComposition = new BhBodyComposition();
//传入性别
bhBodyComposition.bhSex = sex == 1 ? BhSex.MALE.ordinal() : BhSex.FEMALE.ordinal();
bhBodyComposition.bhPeopleType= BhPeopleType.NORMAL.ordinal();
//传入体重。单位是千克。其他单位需要自己转换
bhBodyComposition.bhWeightKg = weight_kg;
//传入年龄
bhBodyComposition.bhAge = age;
//传入身高
bhBodyComposition.bhHeightCm = height;
//传入阻抗。阻抗值通过设备获取。加密数据
//全身阻抗
bhBodyComposition.bhZLeftBodyEnCode = eightBodyfatAdc.getAdcRightBody();
//左手阻抗
bhBodyComposition.bhZLeftArmEnCode = eightBodyfatAdc.getAdcLeftHand();
//右手阻抗
bhBodyComposition.bhZRightArmEnCode = eightBodyfatAdc.getAdcRightHand();
//左脚阻抗
bhBodyComposition.bhZLeftLegEnCode = eightBodyfatAdc.getAdcLeftFoot();
//右脚阻抗
bhBodyComposition.bhZRightLegEnCode = eightBodyfatAdc.getAdcRightFoot();
//校验传入的值
BhErrorType bhErrorType = BhErrorType.values()[bhBodyComposition.getBodyComposition()];

if (bhErrorType == BhErrorType.NONE) {

+ 68
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/FileProvider7.java Dosyayı Görüntüle

@@ -0,0 +1,68 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.utils;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;

import java.io.File;

import androidx.core.content.FileProvider;

/**
* 兼容android 7.0以上获取uri异常的工具类
*/
public class FileProvider7 {

/**
* 获取uri
* @return Uri
*/
public static Uri getUriForFile(Context context, File file) {
Uri fileUri;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
fileUri = getUriForFile24(context, file);
} else {
fileUri = Uri.fromFile(file);
}
return fileUri;
}

/**
* android 7.0以上获取uri的方法
*/
private static Uri getUriForFile24(Context context, File file) {

return FileProvider.getUriForFile(context, context.getPackageName() + ".fileProvider",
file);
}






/**
* 安装app的操作,兼容7.0
* @param context 上下文
* @param intent intent
* @param type 执行的意图(application/vnd.android.package-archive-->安装app)
* @param file 文件
* @param writeAble 是否需要写操作
*/
public static void setIntentDataAndType(Context context,
Intent intent,
String type,
File file,
boolean writeAble) {
if (Build.VERSION.SDK_INT >= 24) {
intent.setDataAndType(getUriForFile(context, file), type);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
if (writeAble) {
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
}
} else {
intent.setDataAndType(Uri.fromFile(file), type);
}
}
}

+ 297
- 13
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/FileUtils.java Dosyayı Görüntüle

@@ -1,33 +1,53 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.utils;

import android.annotation.SuppressLint;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.provider.OpenableColumns;
import android.util.Log;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;

import aicare.net.cn.sdk.ailinksdkdemoandroid.base.MyApplication;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;


public class FileUtils {
private static String TAG = FileUtils.class.getName();
private static String filesDir = Environment.getExternalStorageDirectory().getAbsolutePath();
public static String FILE_DIR="AiLinkBleDemo";
public static String FILE_NAME="updateName.img";

private static String filesDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS).getAbsolutePath();
public static String FILE_DIR = "AiLinkBleDemo";
public static String FILE_NAME = "updateName.img";


public static void init(){
filesDir = Environment.getExternalStorageDirectory().getAbsolutePath();
public static void init() {
filesDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS).getAbsolutePath();
createFileDirectories(FILE_DIR);
// android 11 以上要在包名下也创建对应的文件夹,后续拷贝文件到存放到文件夹下
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
filesDir = MyApplication.getInstance().getExternalCacheDir().getAbsolutePath();
createFileDirectories(FILE_DIR);
}
}


public static String getByFileName(){
return filesDir + File.separator ;
public static String getByFileName() {
return filesDir + File.separator;
}



/**
* 创建文件夹
*/
@@ -36,15 +56,14 @@ public class FileUtils {
File directory = new File(filesDir);
if (!directory.exists()) {
boolean mkdirs = directory.mkdirs();
L.i(TAG,"创建OTA文件:"+mkdirs);
L.i(TAG, "创建OTA文件:" + mkdirs);
}
}


public static ArrayList<String> list() {
File f = new File(filesDir);
File file[] = f.listFiles();
if (file==null)
if (file == null)
return new ArrayList<>();
Arrays.sort(file, new Comparator<File>() {
@Override
@@ -61,6 +80,271 @@ public class FileUtils {
return names;
}

public static final String DOCUMENTS_DIR = "documents";

@SuppressLint("NewApi")
public static String getPath(final Context context, final Uri uri) {

final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;

// DocumentProvider
if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
// ExternalStorageProvider
if (isExternalStorageDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];

if ("primary".equalsIgnoreCase(type)) {
return Environment.getExternalStorageDirectory() + "/" + split[1];
}
}
// DownloadsProvider
else if (isDownloadsDocument(uri)) {
final String id = DocumentsContract.getDocumentId(uri);

if (id != null && id.startsWith("raw:")) {
return id.substring(4);
}
String[] contentUriPrefixesToTry = new String[]{
"content://downloads/public_downloads",
"content://downloads/my_downloads"
};
for (String contentUriPrefix : contentUriPrefixesToTry) {
try {
// note: id 可能为字符串,如在华为10.0系统上,选择文件后id为:"msf:254",导致转Long异常
Uri contentUri = ContentUris.withAppendedId(Uri.parse(contentUriPrefix), Long.parseLong(id));
String path = getDataColumn(context, contentUri, null, null);
if (path != null && !path.equals("")) {
return path;
}
} catch (Exception e) {
}
}
// path could not be retrieved using ContentResolver, therefore copy file to accessible cache using streams
String fileName = getFileName(context, uri);
File cacheDir = getDocumentCacheDir(context);
File file = generateFileName(fileName, cacheDir);
String destinationPath = null;
if (file != null) {
destinationPath = file.getAbsolutePath();
saveFileFromUri(context, uri, destinationPath);
}
return destinationPath;
}
// MediaProvider
else if (isMediaDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];

Uri contentUri = null;
if ("image".equals(type)) {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else if ("video".equals(type)) {
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else if ("audio".equals(type)) {
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}

final String selection = "_id=?";
final String[] selectionArgs = new String[]{split[1]};
return getDataColumn(context, contentUri, selection, selectionArgs);
}
}
// MediaStore (and general)
else if ("content".equalsIgnoreCase(uri.getScheme())) {
String path = getDataColumn(context, uri, null, null);
if (path != null && !path.equals("")) return path;
// path could not be retrieved using ContentResolver, therefore copy file to accessible cache using streams
String fileName = getFileName(context, uri);
File cacheDir = getDocumentCacheDir(context);
File file = generateFileName(fileName, cacheDir);
String destinationPath = null;
if (file != null) {
destinationPath = file.getAbsolutePath();
saveFileFromUri(context, uri, destinationPath);
}
return destinationPath;
}
// File
else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}
return null;
}

/**
* @param uri The Uri to check.
* @return Whether the Uri authority is ExternalStorageProvider.
*/
public static boolean isExternalStorageDocument(Uri uri) {
return "com.android.externalstorage.documents".equals(uri.getAuthority());
}

/**
* @param uri The Uri to check.
* @return Whether the Uri authority is DownloadsProvider.
*/
public static boolean isDownloadsDocument(Uri uri) {
return "com.android.providers.downloads.documents".equals(uri.getAuthority());
}

/**
* @param uri The Uri to check.
* @return Whether the Uri authority is MediaProvider.
*/
public static boolean isMediaDocument(Uri uri) {
return "com.android.providers.media.documents".equals(uri.getAuthority());
}

public static String getDataColumn(Context context, Uri uri, String selection,
String[] selectionArgs) {

Cursor cursor = null;
final String column = "_data";
final String[] projection = {column};
String path = "";
try {
cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
null);
if (cursor != null && cursor.moveToFirst()) {
final int column_index = cursor.getColumnIndexOrThrow(column);
path = cursor.getString(column_index);
return path;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cursor != null)
cursor.close();
}
return path;
}

public static String getFileName(@NonNull Context context, Uri uri) {
String filename = getFileNameWithType(context, uri);
String[] filename_s = filename.split("\\.", 2);
return filename_s[0];
}

public static String getFileNameWithType(@NonNull Context context, Uri uri) {
String mimeType = context.getContentResolver().getType(uri);
String filename = null;
if (mimeType == null && context != null) {
String path = getPath(context, uri);
if (path == null) {
filename = getName(uri.toString());
} else {
File file = new File(path);
filename = file.getName();
}
} else {
Cursor returnCursor = context.getContentResolver().query(uri, null,
null, null, null);
if (returnCursor != null) {
int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
returnCursor.moveToFirst();
filename = returnCursor.getString(nameIndex);
returnCursor.close();
}
}
return filename;
}

public static String getName(String filename) {
if (filename == null) {
return null;
}
int index = filename.lastIndexOf('/');
return filename.substring(index + 1);
}

public static File getDocumentCacheDir(@NonNull Context context) {
Log.d("PickUtils", "getDocumentCacheDir");
File dir = new File(context.getCacheDir(), DOCUMENTS_DIR);
if (!dir.exists()) {
dir.mkdirs();
}
return dir;
}

@Nullable
public static File generateFileName(@Nullable String name, File directory) {
if (name == null) {
return null;
}

File file = new File(directory, name);

if (file.exists()) {
String fileName = name;
String extension = "";
int dotIndex = name.lastIndexOf('.');
if (dotIndex > 0) {
fileName = name.substring(0, dotIndex);
extension = name.substring(dotIndex);
}

int index = 0;

while (file.exists()) {
index++;
name = fileName + '(' + index + ')' + extension;
file = new File(directory, name);
}
}
try {
if (!file.createNewFile()) {
return null;
}
} catch (IOException e) {
return null;
}
return file;
}

/**
* 保存文件到内部目录
*
* @param context context
* @param uri uri
* @param destinationPath destinationPath
*/
public static void saveFileFromUri(Context context, Uri uri, String destinationPath) {
try {
InputStream is = context.getContentResolver().openInputStream(uri);
if (is == null) {
return;
}
File file = new File(destinationPath);
file.createNewFile();
FileOutputStream fos = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
fos = new FileOutputStream(file);
android.os.FileUtils.copy(is, fos);
} else {
ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024 * 10];
while (true) {
int len = is.read(buffer);
if (len == -1) {
break;
}
arrayOutputStream.write(buffer, 0, len);
}
arrayOutputStream.close();
byte[] dataByte = arrayOutputStream.toByteArray();
if (dataByte.length > 0) {
fos = new FileOutputStream(file);
fos.write(dataByte);
}
}
if (fos != null)
fos.close();
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

+ 39
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/ResultContact.java Dosyayı Görüntüle

@@ -0,0 +1,39 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.utils;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;

import androidx.activity.result.contract.ActivityResultContract;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

public class ResultContact extends ActivityResultContract<Boolean, String> {

private Context mContext;

@NonNull
@Override
public Intent createIntent(@NonNull Context context, Boolean input) {
mContext = context;
Intent intent = new Intent();
intent.setType("*/*");
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
intent.setAction(Intent.ACTION_GET_CONTENT);
return intent;
}

@Override
public String parseResult(int resultCode, @Nullable Intent intent) {
if (intent == null || intent.getData() == null || mContext == null) {
return null;
}
Uri uri = intent.getData();
String fileName = FileUtils.getFileNameWithType(mContext, uri);
String finalPath = FileUtils.getByFileName() + fileName;
FileUtils.saveFileFromUri(mContext, uri, finalPath);
//文件名
return fileName;
}
}

+ 0
- 1
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/SP.java Dosyayı Görüntüle

@@ -118,7 +118,6 @@ public class SP {
} else {
editor.putString(key, object.toString());
}

apply(editor);
return 0;
}

+ 13
- 13
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/ToothBrushUtils.java Dosyayı Görüntüle

@@ -14,61 +14,61 @@ public class ToothBrushUtils {
/**
* 刷牙时长得分
*
* @param defalutTime 默认时长
* @param totaltime 刷牙时长
* @param defaultTime 默认时长
* @param totalTime 刷牙时长
* @return int
*/
public int getDurationGrade(int defalutTime, int totaltime){
public int getDurationGrade(int defaultTime, int totalTime){
if (mToothScoreUtil==null){
mToothScoreUtil=new ToothScoreUtil();
}
return mToothScoreUtil.getDurationGrade(defalutTime,totaltime);
return mToothScoreUtil.getDurationGrade(defaultTime,totalTime);
}

/**
* 范围得分
*
* @param defalutTime 默认时长
* @param defaultTime 默认时长
* @param lTime 左边刷牙时长
* @param rTime 右边刷牙时长
* @return int
*/
public int getRangeGrade(int defalutTime, int lTime, int rTime){
public int getRangeGrade(int defaultTime, int lTime, int rTime){
if (mToothScoreUtil==null){
mToothScoreUtil=new ToothScoreUtil();
}
return mToothScoreUtil.getRangeGrade(defalutTime,lTime,rTime);
return mToothScoreUtil.getRangeGrade(defaultTime,lTime,rTime);
}

/**
* 均匀度得分
*
* @param defalutTime 默认时长
* @param defaultTime 默认时长
* @param lTime 左边刷牙时长
* @param rTime 右边刷牙时长
* @return int
*/
public int getAvgGrade(int defalutTime, int lTime, int rTime){
public int getAvgGrade(int defaultTime, int lTime, int rTime){
if (mToothScoreUtil==null){
mToothScoreUtil=new ToothScoreUtil();
}
return mToothScoreUtil.getAvgGrade(defalutTime,lTime,rTime);
return mToothScoreUtil.getAvgGrade(defaultTime,lTime,rTime);
}

/**
* 获取总分
*
* @param defalutTime 默认时长
* @param defaultTime 默认时长
* @param totalTime 刷牙时长
* @param lTime 左边刷牙时长
* @param rTime 右边刷牙时长
* @return int
*/
public int getGrade(int defalutTime, int totalTime, int lTime, int rTime){
public int getGrade(int defaultTime, int totalTime, int lTime, int rTime){
if (mToothScoreUtil==null){
mToothScoreUtil=new ToothScoreUtil();
}
return mToothScoreUtil.getGrade(defalutTime,totalTime,lTime,rTime);
return mToothScoreUtil.getGrade(defaultTime,totalTime,lTime,rTime);
}

}

+ 20
- 0
app/src/main/res/drawable/bg_public_white_gray.xml Dosyayı Görüntüle

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape android:shape="rectangle">
<solid android:color="@color/public_press_bg"/>
</shape>
</item>

<item android:state_enabled="false">
<shape android:shape="rectangle">
<solid android:color="@color/public_white"/>
</shape>
</item>

<item>
<shape android:shape="rectangle">
<solid android:color="@color/public_white"/>
</shape>
</item>
</selector>

+ 10
- 0
app/src/main/res/drawable/ic_round.xml Dosyayı Görüntüle

@@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="80dp"
android:height="80dp"
android:tint="#0E62BB"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="M12,12m-10,0a10,10 0,1 1,20 0a10,10 0,1 1,-20 0" />
</vector>

+ 72
- 0
app/src/main/res/layout/activity_about.xml Dosyayı Görüntüle

@@ -0,0 +1,72 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">


<ImageView
android:id="@+id/img_finish"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:src="@mipmap/back" />

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="10dp">

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="联系我们:app@elinkthings.com"
android:autoLink="email"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="应用手册:http://www.elinkthings.com/cn/help-list-ncid-638-page-1.html"
android:autoLink="web"
android:layout_marginTop="10dp"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="SDK文档:http://doc.elinkthings.com/web/#/12?page_id=46"
android:autoLink="web"
android:layout_marginTop="10dp"
/>

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="常见问题:http://doc.elinkthings.com/web/#/40?page_id=144"
android:autoLink="web"
android:layout_marginTop="10dp"
/>

</LinearLayout>


<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">

<ImageView
android:layout_width="200dp"
android:layout_height="200dp"
android:src="@mipmap/download_qr_code" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="扫码下载最新版" />
</LinearLayout>


</LinearLayout>

+ 519
- 0
app/src/main/res/layout/activity_ailink_scooter.xml Dosyayı Görüntüle

@@ -0,0 +1,519 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">



<ScrollView
android:layout_width="match_parent"
android:layout_height="300dp">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/btn_support_function"
android:textSize="10dp"
android:text="支持的功能"
android:layout_width="60dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_hear"
android:textSize="10dp"
android:text="心跳"
android:layout_width="60dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_unit_kg"
android:textSize="10dp"
android:text="公制"
android:layout_width="60dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_unit_mi"
android:textSize="10dp"
android:text="英制"
android:layout_width="60dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_add_gear"
android:textSize="10dp"
android:text="加档"
android:layout_width="60dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_cut_gear"
android:textSize="10dp"
android:text="减档"
android:layout_width="60dp"
android:layout_height="wrap_content"/>
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/btn_zero_start"
android:textSize="10dp"
android:text="零启动"
android:layout_width="60dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_un_zero_start"
android:textSize="10dp"
android:text="非零启动"
android:layout_width="70dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_cruise_open"
android:textSize="10dp"
android:text="开启巡航"
android:layout_width="70dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_cruise_close"
android:textSize="10dp"
android:text="关闭巡航"
android:layout_width="70dp"
android:layout_height="wrap_content"/>

</LinearLayout>
<LinearLayout

android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/btn_clear_total_mileage"
android:textSize="10dp"
android:text="清除总里程"
android:layout_width="80dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_clear_single_mileage_time"
android:textSize="10dp"
android:text="清除单次里程时间"
android:layout_width="110dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_reset"
android:textSize="10dp"
android:text="恢复出厂设置"
android:layout_width="85dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_clear_other"
android:textSize="10dp"
android:text="清除其他"
android:layout_width="80dp"
android:layout_height="wrap_content"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/btn_left_light"
android:textSize="10dp"
android:text="左转灯"
android:layout_width="60dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_right_light"
android:textSize="10dp"
android:text="右转灯"
android:layout_width="60dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_atmosphere_light"
android:textSize="10dp"
android:text="氛围灯"
android:layout_width="60dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_day_light"
android:textSize="10dp"
android:text="日行灯"
android:layout_width="60dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_brake_light"
android:textSize="10dp"
android:text="刹车灯"
android:layout_width="60dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_head_light"
android:textSize="10dp"
android:text="前车灯"
android:layout_width="60dp"
android:layout_height="wrap_content"/>
</LinearLayout>
<LinearLayout
android:gravity="center_vertical"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="40dp">
<EditText
android:id="@+id/et_password"
android:textColorHint="#787878"
android:hint="请输密码"
android:layout_width="110dp"
android:layout_height="40dp"/>
<Button
android:id="@+id/btn_set_password"
android:textSize="10dp"
android:text="设置密码 123456"
android:layout_width="110dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_unlock"
android:textSize="10dp"
android:text="解锁"
android:layout_width="50dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_lock"
android:textSize="10dp"
android:text="上锁"
android:layout_width="50dp"
android:layout_height="wrap_content"/>

<Button
android:id="@+id/btn_check_password"
android:textSize="10dp"
android:text="验证密码"
android:layout_width="70dp"
android:layout_height="wrap_content"/>
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btn_boot"
android:textSize="10dp"
android:text="开机"
android:layout_width="50dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_shutdown"
android:textSize="10dp"
android:text="关机"
android:layout_width="50dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_after_password"
android:textSize="10dp"
android:text="查询售后密码"
android:layout_width="85dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_auto_bg_light"
android:textSize="10dp"
android:text="自动背光"
android:layout_width="65dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_bg_light_100"
android:textSize="10dp"
android:text="背光:100"
android:layout_width="65dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_bg_light_0"
android:textSize="10dp"
android:text="背光:0"
android:layout_width="65dp"
android:layout_height="wrap_content"/>
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="50dp">

<Button
android:id="@+id/btn_shutdown_unlock"
android:textSize="10dp"
android:text="开锁状态下5分钟后关机,上锁状态下3分钟后关机"
android:layout_width="160dp"
android:layout_height="wrap_content"/>

<Button
android:id="@+id/btn_check_shutdown_time"
android:textSize="10dp"
android:text="查询自动关机时间"
android:layout_width="80dp"
android:layout_height="wrap_content"/>

<Button
android:id="@+id/btn_check_single_use_time"
android:textSize="10dp"
android:text="查询单次行驶里程时间"
android:layout_width="80dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_check_battery_info"
android:textSize="10dp"
android:text="查询电池信息"
android:layout_width="70dp"
android:layout_height="wrap_content"/>


</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="50dp">

<Button
android:id="@+id/btn_check_total_mileage"
android:textSize="10dp"
android:text="查询总里程"
android:layout_width="60dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_check_battery_no"
android:textSize="10dp"
android:text="查询电池厂商代码及编号"
android:layout_width="100dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_check_controller_no"
android:textSize="10dp"
android:text="查询控制器厂商代码及编号"
android:layout_width="100dp"
android:layout_height="wrap_content"/>

<Button
android:id="@+id/btn_check_meter_version"
android:textSize="10dp"
android:text="查询仪表固件版本"
android:layout_width="80dp"
android:layout_height="wrap_content"/>
</LinearLayout>
<LinearLayout
android:gravity="center|left"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="50dp">

<TextView
android:textSize="8dp"
android:gravity="center"
android:text="重复充电时间"
android:layout_width="40dp"
android:layout_height="match_parent"/>
<CheckBox
android:id="@+id/cb_monday"
android:textSize="10dp"
android:text="周一"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<CheckBox
android:id="@+id/cb_tuesday"
android:textSize="10dp"
android:text="周二"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<CheckBox
android:id="@+id/cb_wednesday"
android:textSize="10dp"
android:text="周三"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<CheckBox
android:id="@+id/cb_thursday"
android:textSize="10dp"
android:text="周四"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<CheckBox
android:id="@+id/cb_friday"
android:textSize="10dp"
android:text="周五"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<CheckBox
android:id="@+id/cb_saturday"
android:textSize="10dp"
android:text="周六"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<CheckBox
android:id="@+id/cb_sunday"
android:textSize="10dp"
android:text="周日"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>

<LinearLayout
android:gravity="center|left"
android:layout_width="match_parent"
android:layout_height="50dp">
<EditText
android:id="@+id/et_charge_start_time"
android:hint="开始时间8:30"
android:layout_width="120dp"
android:layout_height="match_parent"/>
<EditText
android:id="@+id/et_charge_end_time"
android:hint="结束时间20:30"
android:layout_width="120dp"
android:layout_height="match_parent"/>

<Button
android:id="@+id/btn_set_charge_time"
android:textSize="10dp"
android:text="设置充电时间"
android:layout_width="80dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_check_charge_time"
android:textSize="10dp"
android:text="查询充电时间"
android:layout_width="80dp"
android:layout_height="wrap_content"/>
</LinearLayout>
<LinearLayout
android:gravity="center|left"
android:layout_width="match_parent"
android:layout_height="50dp">

<EditText
android:id="@+id/et_charge_capacity"
android:hint="充电容量:30"
android:layout_width="120dp"
android:layout_height="match_parent"/>
<Button
android:id="@+id/btn_set_charge_capacity"
android:textSize="10dp"
android:text="设置充电容量"
android:layout_width="80dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_read_charge_capacity"
android:textSize="10dp"
android:text="读取充电容量"
android:layout_width="80dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_find_car_open"
android:textSize="10dp"
android:text="寻车功能:开"
android:layout_width="80dp"
android:layout_height="wrap_content"/>
</LinearLayout>
<LinearLayout
android:gravity="center|left"
android:layout_width="match_parent"
android:layout_height="50dp">
<Button
android:id="@+id/btn_find_car_close"
android:textSize="10dp"
android:text="寻车功能:关"
android:layout_width="80dp"
android:layout_height="wrap_content"/>

<Button
android:id="@+id/btn_auto_lock_open"
android:textSize="10dp"
android:text="自动锁车:开"
android:layout_width="80dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_auto_lock_close"
android:textSize="10dp"
android:text="自动锁车:关"
android:layout_width="80dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_auto_unlock_open"
android:textSize="10dp"
android:text="自动解锁:开"
android:layout_width="80dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_auto_unlock_close"
android:textSize="10dp"
android:text="自动解锁:关"
android:layout_width="80dp"
android:layout_height="wrap_content"/>
</LinearLayout>
<LinearLayout
android:gravity="center|left"
android:layout_width="match_parent"
android:layout_height="50dp">
<Button
android:id="@+id/btn_move_warm_open"
android:textSize="10dp"
android:text="移位报警:开"
android:layout_width="80dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_move_warm_close"
android:textSize="10dp"
android:text="移位报警:关"
android:layout_width="80dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_collision_warm_open"
android:textSize="10dp"
android:text="碰撞报警:开"
android:layout_width="80dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_collision_warm_close"
android:textSize="10dp"
android:text="碰撞报警:关"
android:layout_width="80dp"
android:layout_height="wrap_content"/>

<Button
android:id="@+id/btn_read_warm_auto_lock"
android:textSize="10dp"
android:text="车辆报警,自动锁"
android:layout_width="80dp"
android:layout_height="wrap_content"/>
</LinearLayout>
<LinearLayout
android:gravity="center|left"
android:layout_width="match_parent"
android:layout_height="50dp">
<Button
android:id="@+id/btn_find_car"
android:textSize="10dp"
android:text="寻车"
android:layout_width="80dp"
android:layout_height="wrap_content"/>

<Button
android:id="@+id/btn_navigation_open"
android:textSize="10dp"
android:text="导航:向左转弯,当前方向剩余500米,总剩余路程1000米"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

<Button
android:id="@+id/btn_navigation_close"
android:textSize="10dp"
android:text="关闭导航"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

</LinearLayout>

</LinearLayout>
</ScrollView>
<ListView
android:id="@+id/lv_log"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</androidx.appcompat.widget.LinearLayoutCompat>

+ 403
- 0
app/src/main/res/layout/activity_air_detector.xml Dosyayı Görüntüle

@@ -0,0 +1,403 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout

xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">

<Button
android:id="@+id/btn_auto_test_tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="指令自动校验"
android:textColor="@android:color/holo_red_dark" />

<Button
android:id="@+id/btn_stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/holo_red_dark"
android:text="暂停" />

</LinearLayout>


<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">


<Button
android:id="@+id/btn_support_list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="获取支持列表" />

<Button
android:id="@+id/btn_device_state"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="获取设备状态" />

<Button
android:id="@+id/btn_param"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="获取设备参数" />

</LinearLayout>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="输入内容请参照协议。有小数的请按照支持列表申明的小数位输入。类型是int,仅可输入支持列表获取到的类型"
android:textColor="@color/colorAccent" />

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="left|center"
android:orientation="horizontal">

<androidx.appcompat.widget.AppCompatSpinner
android:id="@+id/spinner"
android:layout_width="180dp"
android:layout_height="wrap_content" />

<Button
android:id="@+id/btn_set_param"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发送设置指令" />

<Button
android:id="@+id/btn_change_log"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="查看原始数据"
android:visibility="gone" />
</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="left|center"
android:paddingStart="16dp">

<LinearLayout
android:id="@+id/layout_type"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:visibility="gone">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="类型:" />

<EditText
android:id="@+id/ed_type"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:digits="1234567890"
android:inputType="numberDecimal" />
</LinearLayout>

<LinearLayout
android:id="@+id/layout_max"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:visibility="gone">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="最大值:" />

<EditText
android:id="@+id/ed_max"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:digits="1234567890."
android:inputType="numberDecimal" />
</LinearLayout>

<LinearLayout
android:id="@+id/layout_min"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:visibility="gone">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="最小值:" />

<EditText
android:id="@+id/ed_min"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:digits="1234567890."
android:inputType="numberDecimal" />
</LinearLayout>

<LinearLayout
android:id="@+id/layout_value"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:visibility="gone">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="(报警)值:" />

<EditText
android:id="@+id/ed_value"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:digits="1234567890."
android:inputType="numberDecimal" />
</LinearLayout>

<LinearLayout
android:id="@+id/layout_switch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:visibility="gone">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开关:" />

<EditText
android:id="@+id/ed_warm_state"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:digits="10"
android:hint="0-关,1-开"
android:inputType="numberDecimal" />
</LinearLayout>

<RadioGroup
android:id="@+id/group_cal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:visibility="gone">

<RadioButton
android:id="@+id/rb_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="加1" />

<RadioButton
android:id="@+id/rb_minus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="减1" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="(精度值)"
android:textColor="@color/colorAccent" />
</RadioGroup>

<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/layout_alarm"
android:layout_width="wrap_content"
android:layout_height="wrap_content">

<TextView
android:id="@+id/tv_time_flag"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="时分:"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<EditText
android:id="@+id/ed_time"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:digits="1234567890:"
android:hint="eg: 12:30"
app:layout_constraintBottom_toBottomOf="@id/tv_time_flag"
app:layout_constraintStart_toEndOf="@id/tv_time_flag"
app:layout_constraintTop_toTopOf="@id/tv_time_flag" />


<TextView
android:id="@+id/tv_cid_flag"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="编号:"
app:layout_constraintBottom_toBottomOf="@id/tv_time_flag"
app:layout_constraintStart_toEndOf="@id/ed_time"
app:layout_constraintTop_toTopOf="@id/tv_time_flag" />

<EditText
android:id="@+id/ed_cid"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:hint="1~15"
android:inputType="number"
app:layout_constraintBottom_toBottomOf="@id/tv_time_flag"
app:layout_constraintStart_toEndOf="@id/tv_cid_flag"
app:layout_constraintTop_toTopOf="@id/tv_time_flag" />

<androidx.appcompat.widget.AppCompatSpinner
android:id="@+id/sp_mode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="@id/tv_time_flag"
app:layout_constraintStart_toEndOf="@id/ed_cid"
app:layout_constraintTop_toTopOf="@id/tv_time_flag" />

<CheckBox
android:id="@+id/cb_day1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:text="周一"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_time_flag" />

<CheckBox
android:id="@+id/cb_day2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:text="周二"
app:layout_constraintStart_toEndOf="@id/cb_day1"
app:layout_constraintTop_toBottomOf="@id/tv_time_flag" />

<CheckBox
android:id="@+id/cb_day3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:text="周三"
app:layout_constraintStart_toEndOf="@id/cb_day2"
app:layout_constraintTop_toBottomOf="@id/tv_time_flag" />

<CheckBox
android:id="@+id/cb_day4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:text="周四"
app:layout_constraintStart_toEndOf="@id/cb_day3"
app:layout_constraintTop_toBottomOf="@id/tv_time_flag" />

<CheckBox
android:id="@+id/cb_day5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:text="周五"
app:layout_constraintStart_toEndOf="@id/cb_day4"
app:layout_constraintTop_toBottomOf="@id/tv_time_flag" />

<CheckBox
android:id="@+id/cb_day6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:text="周六"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/cb_day5" />

<CheckBox
android:id="@+id/cb_day7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:text="周日"
app:layout_constraintStart_toEndOf="@id/cb_day6"
app:layout_constraintTop_toBottomOf="@id/cb_day5" />

<RadioGroup
android:id="@+id/group_alarm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:orientation="horizontal"
app:layout_constraintStart_toEndOf="@id/cb_day7"
app:layout_constraintTop_toBottomOf="@id/cb_day1">

<RadioButton
android:id="@+id/rb_open"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="开启"
android:textColor="@color/colorAccent" />

<RadioButton
android:id="@+id/rb_close"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="关闭"
android:textColor="@color/colorAccent" />

<RadioButton
android:id="@+id/rb_delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="删除"
android:textColor="@color/colorAccent" />
</RadioGroup>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:text="模式4-自定义才需选择周期"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/cb_day6" />
</androidx.constraintlayout.widget.ConstraintLayout>

</LinearLayout>

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lines="1"
android:maxLines="1"
android:text="--------------------------------------------------------------------------------------------------" />

<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">


<ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />

<ListView
android:id="@+id/list_view_payload"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone" />

</FrameLayout>

</LinearLayout>

+ 26
- 0
app/src/main/res/layout/activity_air_detector_test.xml Dosyayı Görüntüle

@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />

<Button
android:id="@+id/btn_floating"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_margin="16dp"
android:text="开始\n测试"
android:textSize="18dp"
android:textColor="@color/public_white"
android:background="@drawable/ic_round"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

+ 5
- 4
app/src/main/res/layout/activity_ble.xml Dosyayı Görüntüle

@@ -154,15 +154,16 @@
android:orientation="horizontal"
android:padding="5dp">



<Button
android:id="@+id/btnDidRead"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读DID" />


<Button
android:id="@+id/btnSnRead"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读SN" />

</LinearLayout>


+ 79
- 0
app/src/main/res/layout/activity_ble_noise_meter.xml Dosyayı Görüntüle

@@ -0,0 +1,79 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">


<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">

<Button
android:id="@+id/btn_noise_ble_ac"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="A/C键" />
<Button
android:id="@+id/btn_noise_ble_light"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="LIGHT键" />

<Button
android:id="@+id/btn_noise_ble_fs"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="F/S键" />


</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/btn_noise_ble_max"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="MAX键" />
<Button
android:id="@+id/btn_noise_ble_up"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="UP键" />
<Button
android:id="@+id/btn_noise_ble_down"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="DOWN键" />
</LinearLayout>

</LinearLayout>

</ScrollView>

<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="?android:attr/listDivider" />

<ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />


</LinearLayout>

+ 0
- 0
app/src/main/res/layout/activity_ble_toothbrush_bak.xml Dosyayı Görüntüle


Bu fark içinde çok fazla dosya değişikliği olduğu için bazı dosyalar gösterilmiyor

Loading…
İptal
Kaydet