Browse Source

1,更新依赖库版本和代码

master
陈福行 3 days ago
parent
commit
61ff196080
100 changed files with 8388 additions and 6837 deletions
  1. 26
    18
      app/build.gradle
  2. 195
    67
      app/src/main/AndroidManifest.xml
  3. 50
    72
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ADWeightScaleCmdActivity.java
  4. 27
    35
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ADWeightScaleUserActivity.java
  5. 342
    412
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/AiLinkScooterActivity.java
  6. 43
    66
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BabyBodyFatCmdActivity.java
  7. 38
    64
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BabyCmdActivity.java
  8. 178
    188
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BleCmdActivity.java
  9. 16
    23
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BroadcastBloodOxygenActivity.java
  10. 27
    42
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BroadcastScaleActivity.java
  11. 0
    276
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ClearShakeHandsActivity.java
  12. 1
    6
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ConnectBleTestActivity.java
  13. 22
    32
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/HeightCmdActivity.java
  14. 135
    144
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/HeightWeightScaleActivity.java
  15. 11
    18
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ShowBleActivity.java
  16. 0
    406
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/SmartMaskActivity.java
  17. 24
    34
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/SphyCmdActivity.java
  18. 45
    67
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TempCmdActivity.java
  19. 22
    32
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TempGunCmdActivity.java
  20. 86
    87
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TempHumidityActivity.java
  21. 58
    63
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TestCmdActivity.java
  22. 0
    715
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TestOtaActivity.java
  23. 22
    32
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TpmsConnectCmdActivity.java
  24. 93
    33
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TransmissionActivity.java
  25. 83
    65
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/WeightScaleBleActivity.java
  26. 0
    872
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/WifiConfigActivity.java
  27. 0
    6
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/base/AppBaseActivity.java
  28. 0
    6
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/base/BleAppBaseActivity.java
  29. 29
    25
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/base/BleBaseActivity.java
  30. 18
    14
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/base/BleNewBaseActivity.java
  31. 147
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/base/KBleBaseNewActivity.kt
  32. 37
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/config/BleDeviceConfig.java
  33. 12
    12
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/AddUserDialog.java
  34. 5
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/LoadingIosDialogFragment.java
  35. 5
    11
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/ShowListDialogFragment.java
  36. 131
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/bean/UserBean.java
  37. 28
    40
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/find/FindDeviceActivity.java
  38. 14
    19
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/find/FindDeviceNewActivity.java
  39. 26
    20
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/home/HomeDataManager.java
  40. 6
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/home/HomeListAdapter.java
  41. 6
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/home/JumpBean.java
  42. 67
    11
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/home/MainActivity.java
  43. 1
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/BleDemoActivity.java
  44. 143
    113
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/PublicBleNetworkCmdActivity.java
  45. 0
    246
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/PublicMqttActivity.java
  46. 30
    41
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/PublicWifiBleOtaActivity.java
  47. 160
    186
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/TempInstrument/TempInstrumentActivity.java
  48. 1
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/barometric_temp_humidity/EditParamsDialog.java
  49. 246
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/ble_0020_hu_infrared_temp/Ble0020HpInfraredTempActivity.kt
  50. 361
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/ble_0020_hu_infrared_temp/viewmodel/Ble0020HpTempViewModel.kt
  51. 10
    8
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/ble_nutrition/BleNutritionActivity.java
  52. 14
    6
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/ble_nutrition/BleNutritionNutrientActivity.java
  53. 455
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/ble_speed_test/BleSpeedTestActivity.kt
  54. 1
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/blood_glucose/BloodGlucoseActivity.java
  55. 71
    51
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/broadcast_weight_sacle/BroadcastWeightScaleActivity.java
  56. 111
    70
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/bw05watch/Bw05WatchActivity.java
  57. 280
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/caseTreasure/BleCaseTreasureActivity.kt
  58. 29
    55
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/coffee_scale/CoffeeScaleActivity.java
  59. 6
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/eight_bodyfat/EightBodyFatAdc.java
  60. 86
    23
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/eight_bodyfat/EightBodyFatMcuActivity.java
  61. 55
    227
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/eight_bodyfat/EightBodyfatActivity.java
  62. 64
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/eight_bodyfat/UserInfoBean.java
  63. 62
    82
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/eight_bodyfat/dual_band/EightDoubleBodyfatActivity.java
  64. 112
    147
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/gasDetector/GasDetectorActivity.java
  65. 440
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/gasDetectorPlus/GasDetectorPlusActivity.java
  66. 580
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/hmiBodyFat/HmiBodyFatScaleBleActivity.java
  67. 39
    49
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/meat_probe/MeatProbeActivity.java
  68. 61
    83
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/meat_probe_charger/MeatProbeChargerActivity.java
  69. 25
    40
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/noise_meter/BleNoiseMeterActivity.java
  70. 26
    41
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/noise_meter/WifiBleNoiseMeterActivity.java
  71. 20
    23
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/share_charger/ShareChargerActivity.java
  72. 57
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/smart_cycling_table/SatelliteAllBean.kt
  73. 42
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/smart_cycling_table/SatelliteBean.kt
  74. 157
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/smart_cycling_table/SmartCyclingTableActivity.java
  75. 220
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/smart_cycling_table/SmartCyclingTableViewModel.kt
  76. 718
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/toothbrush/ToothBrushWifiNewBleActivity.java
  77. 294
    310
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/toothbrush/ToothBrushWifiOnOnBleActivity.java
  78. 5
    5
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/weight_scale/WeightScaleActivity.java
  79. 115
    136
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/wifi_ble_scale/WeightScaleWifiBleActivity.java
  80. 46
    65
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/wifible_sphy/WifiBleSphyActivity.java
  81. 0
    114
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/BleScanUtil.java
  82. 46
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/CoroutineUtils.kt
  83. 0
    175
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/EightBodyFatAlgorithms.java
  84. 102
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/ElinkCmdExtension.kt
  85. 90
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/UnitUtils.java
  86. 4
    4
      app/src/main/res/layout/activity_ad_weight_scale_cmd.xml
  87. 5
    0
      app/src/main/res/layout/activity_ble.xml
  88. 172
    0
      app/src/main/res/layout/activity_ble_0020_hp_infrared_temp.xml
  89. 197
    0
      app/src/main/res/layout/activity_ble_case_treasure.xml
  90. 195
    0
      app/src/main/res/layout/activity_ble_speed_test.xml
  91. 1
    1
      app/src/main/res/layout/activity_blood_glucose.xml
  92. 10
    15
      app/src/main/res/layout/activity_broadcast_weight_scale.xml
  93. 89
    7
      app/src/main/res/layout/activity_bw05_watch.xml
  94. 1
    1
      app/src/main/res/layout/activity_connect_ble_test.xml
  95. 20
    5
      app/src/main/res/layout/activity_eight_body_fata.xml
  96. 20
    10
      app/src/main/res/layout/activity_eight_double_body_fata.xml
  97. 15
    2
      app/src/main/res/layout/activity_gas_detector.xml
  98. 203
    0
      app/src/main/res/layout/activity_gas_detector_plus.xml
  99. 0
    459
      app/src/main/res/layout/activity_health_bracelet.xml
  100. 0
    0
      app/src/main/res/layout/activity_hmi_body_fat_scale_ble.xml

+ 26
- 18
app/build.gradle View File

@@ -1,12 +1,15 @@
apply plugin: 'com.android.application'
apply plugin: 'com.jakewharton.butterknife'
apply plugin: 'org.jetbrains.kotlin.android'

android {
compileSdkVersion 34
namespace 'aicare.net.cn.sdk.ailinksdkdemoandroid'
buildFeatures { buildConfig true }
compileSdkVersion app_compileSdk
defaultConfig {
applicationId "aicare.net.cn.sdk.ailinksdkdemoandroid"
minSdkVersion 24
targetSdkVersion 34
versionName "1.15.06"
minSdkVersion app_minSdk
targetSdkVersion app_targetSdk
versionName "1.16.21"
versionCode getVersionCodeNumber(versionName)
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
@@ -18,8 +21,8 @@ android {
}

compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}

repositories {
@@ -34,6 +37,13 @@ android {
}
}

kotlinOptions {
jvmTarget = '11'
}
buildFeatures {
viewBinding true
}

}
static def getVersionCodeNumber(String versionName) {
//1.49.13_beta05
@@ -63,22 +73,20 @@ static def getVersionCodeNumber(String versionName) {

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.4.2'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'androidx.cardview:cardview:1.0.0'
implementation "androidx.appcompat:appcompat:$appcompat_version"
implementation "androidx.core:core-ktx:$core_ktx_version"
implementation "androidx.activity:activity:1.8.0"
testImplementation 'junit:junit:4.12'
implementation 'androidx.cardview:cardview:1.0.0'
//https://jitpack.io/#elinkthings/AILinkSDKRepositoryAndroid
implementation 'com.github.elinkthings:AILinkSDKRepositoryAndroid:1.14.21'//蓝牙核心库
implementation 'com.github.elinkthings:AILinkSDKRepositoryAndroid:1.15.04'//蓝牙核心库

//https://jitpack.io/#elinkthings/AILinkSDKParsingLibraryAndroid
implementation 'com.github.elinkthings:AILinkSDKParsingLibraryAndroid:1.9.7'//蓝牙解析库,需要依赖核心库

//https://jitpack.io/#elinkthings/AILinkMqttRepositoryAndroid
implementation 'com.github.elinkthings:AILinkMqttRepositoryAndroid:1.3.2'//MQTT库,不需要的可以不用依赖
implementation project(path: ':otalibrary')
implementation 'com.github.elinkthings:AILinkSDKParsingLibraryAndroid:1.9.13'//蓝牙解析库,需要依赖核心库
implementation 'androidx.recyclerview:recyclerview:1.3.2'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
// implementation project(path: ':otalibrary')
implementation 'androidx.recyclerview:recyclerview:1.3.2'
implementation 'com.jakewharton:butterknife:10.2.3'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.3'
api 'com.squareup.retrofit2:converter-gson:2.7.2'
// implementation (name: 'modulelibrary-release', ext: 'aar')
}

+ 195
- 67
app/src/main/AndroidManifest.xml View File

@@ -58,64 +58,173 @@
</activity>


<activity android:name=".ClearShakeHandsActivity" />
<activity
android:name=".ClearShakeHandsActivity"
android:screenOrientation="portrait" />

<activity android:name=".ShowBleActivity" />
<activity android:name=".BabyCmdActivity" />
<activity android:name=".TempGunCmdActivity" />
<activity android:name=".SphyCmdActivity" />
<activity android:name=".TempCmdActivity" />
<activity android:name=".HeightCmdActivity" />
<activity android:name=".BleCmdActivity" />
<activity android:name=".TestCmdActivity" />
<activity android:name=".TpmsConnectCmdActivity" />
<activity android:name=".ConnectBleTestActivity" />
<activity android:name=".ADWeightScaleCmdActivity" />
<activity android:name=".ADWeightScaleUserActivity" />
<activity android:name=".modules.wifi_ble_scale.WeightScaleWifiBleActivity" />
<activity android:name=".WeightScaleBleActivity" />
<activity android:name=".WifiConfigActivity" />
<activity android:name=".modules.eight_bodyfat.EightBodyfatActivity" />
<activity android:name=".modules.blood_glucose.BloodGlucoseActivity" />
<activity android:name=".BabyBodyFatCmdActivity" />
<activity android:name=".BroadcastScaleActivity" />
<activity android:name=".TransmissionActivity" />
<activity android:name=".BroadcastBloodOxygenActivity" />
<activity android:name=".SmartMaskActivity" />
<activity android:name=".modules.toothbrush.ToothBrushWifiBleActivity" />
<activity android:name=".BLDWeightScaleBleActivity" />
<activity android:name=".BloodOxygenActivity" />
<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=".find.FindDeviceActivity" />
<activity android:name=".TempHumidityActivity" />
<activity android:name=".modules.ropeskipping.RopeSkippingActivity" />
<activity android:name=".modules.airdetector.AirDetectorActivity" />
<activity android:name=".modules.airdetector_test.AirDetectorActivityTest" />
<activity
android:name=".ShowBleActivity"
android:screenOrientation="portrait" />
<activity
android:name=".BabyCmdActivity"
android:screenOrientation="portrait" />
<activity
android:name=".TempGunCmdActivity"
android:screenOrientation="portrait" />
<activity
android:name=".SphyCmdActivity"
android:screenOrientation="portrait" />
<activity
android:name=".TempCmdActivity"
android:screenOrientation="portrait" />
<activity
android:name=".HeightCmdActivity"
android:screenOrientation="portrait" />
<activity
android:name=".BleCmdActivity"
android:screenOrientation="portrait" />
<activity
android:name=".TestCmdActivity"
android:screenOrientation="portrait" />
<activity
android:name=".TpmsConnectCmdActivity"
android:screenOrientation="portrait" />
<activity
android:name=".ConnectBleTestActivity"
android:screenOrientation="portrait" />
<activity
android:name=".ADWeightScaleCmdActivity"
android:screenOrientation="portrait" />
<activity
android:name=".ADWeightScaleUserActivity"
android:screenOrientation="portrait" />
<activity
android:name=".modules.wifi_ble_scale.WeightScaleWifiBleActivity"
android:screenOrientation="portrait" />
<activity
android:name=".WeightScaleBleActivity"
android:screenOrientation="portrait" />
<activity
android:name=".WifiConfigActivity"
android:screenOrientation="portrait" />
<activity
android:name=".modules.eight_bodyfat.EightBodyfatActivity"
android:screenOrientation="portrait" />
<activity
android:name=".TestOtaActivity"
android:screenOrientation="portrait" />
<activity
android:name=".modules.blood_glucose.BloodGlucoseActivity"
android:screenOrientation="portrait" />
<activity
android:name=".BabyBodyFatCmdActivity"
android:screenOrientation="portrait" />
<activity
android:name=".BroadcastScaleActivity"
android:screenOrientation="portrait" />
<activity
android:name=".TransmissionActivity"
android:screenOrientation="portrait" />
<activity
android:name=".BroadcastBloodOxygenActivity"
android:screenOrientation="portrait" />
<activity
android:name=".modules.toothbrush.ToothBrushWifiOnOnBleActivity"
android:screenOrientation="portrait" />
<activity
android:name=".BLDWeightScaleBleActivity"
android:screenOrientation="portrait" />
<activity
android:name=".BloodOxygenActivity"
android:screenOrientation="portrait" />
<activity
android:name=".modules.blood_glucose.BloodGlucoseTestActivity"
android:screenOrientation="portrait" />
<activity
android:name=".modules.share_charger.ShareChargerActivity"
android:screenOrientation="portrait" />
<activity
android:name=".modules.broadcast_height.BroadcastHeightActivity"
android:screenOrientation="portrait" />
<activity
android:name=".modules.coffee_scale.CoffeeScaleActivity"
android:screenOrientation="portrait" />
<activity
android:name=".HeightWeightScaleActivity"
android:screenOrientation="portrait" />
<activity
android:name=".find.FindDeviceActivity"
android:screenOrientation="portrait" />
<activity
android:name=".TempHumidityActivity"
android:screenOrientation="portrait" />
<activity
android:name=".modules.ropeskipping.RopeSkippingActivity"
android:screenOrientation="portrait" />
<activity
android:name=".modules.airdetector.AirDetectorActivity"
android:screenOrientation="portrait" />
<activity
android:name=".modules.airdetector_test.AirDetectorActivityTest"
android:screenOrientation="portrait" />
<activity
android:name=".modules.food_temp.FoodTempActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustPan|stateHidden" />
<activity android:name=".find.FindDeviceNewActivity" />
<activity android:name=".BloodSugar4GActivity" />
<activity android:name=".modules.share_socket.ShareSocketActivity" />
<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=".modules.ropeskipping.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=".modules.PublicBleNetworkCmdActivity" />
<activity android:name=".modules.noise_meter.WifiBleNoiseMeterActivity" />
<activity android:name=".modules.noise_meter.BleNoiseMeterActivity" />
<activity
android:name=".find.FindDeviceNewActivity"
android:screenOrientation="portrait" />
<activity
android:name=".BloodSugar4GActivity"
android:screenOrientation="portrait" />
<activity
android:name=".modules.share_socket.ShareSocketActivity"
android:screenOrientation="portrait" />
<activity
android:name=".modules.share_condom.ShareCondomActivity"
android:screenOrientation="portrait" />
<activity
android:name=".modules.broadcast_nutrition.BroadNutritionActivity"
android:screenOrientation="portrait" />
<activity
android:name=".modules.ble_nutrition.BleNutritionActivity"
android:screenOrientation="portrait" />
<activity
android:name=".modules.toothbrush_test.ToothbrushTestActivity"
android:screenOrientation="portrait" />
<activity
android:name=".modules.leaone_broadcast.LeaOneBroadcastActivity"
android:screenOrientation="portrait" />
<activity
android:name=".modules.fascia_gun.FasciaGunActivity"
android:screenOrientation="portrait" />
<activity
android:name=".modules.blood_pressure_tc.BloodPressureTcActivity"
android:screenOrientation="portrait" />
<activity
android:name=".modules.ropeskipping.RopeSkippingSetActivity"
android:screenOrientation="portrait" />
<activity
android:name=".modules.body_scale_4g.BodyScale4GActivity"
android:screenOrientation="portrait" />
<activity
android:name=".AiLinkScooterActivity"
android:screenOrientation="portrait" />
<activity
android:name=".modules.TempInstrument.TempInstrumentActivity"
android:screenOrientation="portrait" />
<activity
android:name=".AboutActivity"
android:screenOrientation="portrait" />
<activity
android:name=".modules.PublicBleNetworkCmdActivity"
android:screenOrientation="portrait" />
<activity
android:name=".modules.noise_meter.WifiBleNoiseMeterActivity"
android:screenOrientation="portrait" />
<activity
android:name=".modules.noise_meter.BleNoiseMeterActivity"
android:screenOrientation="portrait" />
<activity
android:name=".modules.meat_probe_charger.MeatProbeChargerActivity"
android:screenOrientation="portrait" />
@@ -132,17 +241,42 @@
<activity
android:name=".modules.barometric_temp_humidity.BarometricTempHygrometerActivity"
android:screenOrientation="portrait" />
<activity android:name=".modules.wifible_sphy.WifiBleSphyActivity" />
<activity android:name=".modules.PublicWifiBleOtaActivity" />
<activity android:name=".modules.eight_bodyfat.dual_band.EightDoubleBodyfatActivity" />
<activity android:name=".modules.PublicMqttActivity" />
<activity
android:name=".modules.wifible_sphy.WifiBleSphyActivity"
android:screenOrientation="portrait" />
<activity
android:name=".modules.PublicWifiBleOtaActivity"
android:screenOrientation="portrait" />
<activity
android:name=".modules.eight_bodyfat.dual_band.EightDoubleBodyfatActivity"
android:screenOrientation="portrait" />


<activity
android:name=".modules.bw05watch.Bw05WatchActivity"
android:screenOrientation="portrait" />
<activity android:name=".modules.ble_nutrition.BleNutritionNutrientActivity" />
<activity android:name=".modules.eight_bodyfat.EightBodyFatMcuActivity" />
<activity android:name=".modules.gasDetector.GasDetectorActivity" />
<activity
android:name=".modules.ble_nutrition.BleNutritionNutrientActivity"
android:screenOrientation="portrait" />
<activity
android:name=".modules.eight_bodyfat.EightBodyFatMcuActivity"
android:screenOrientation="portrait" />
<activity
android:name=".modules.gasDetector.GasDetectorActivity"
android:screenOrientation="portrait" />
<activity
android:name=".modules.gasDetectorPlus.GasDetectorPlusActivity"
android:screenOrientation="portrait" />
<activity
android:name=".modules.hmiBodyFat.HmiBodyFatScaleBleActivity"
android:screenOrientation="portrait" />
<activity
android:name=".modules.ble_0020_hu_infrared_temp.Ble0020HpInfraredTempActivity"
android:screenOrientation="portrait" />

<activity
android:name=".modules.toothbrush.ToothBrushWifiNewBleActivity"
android:screenOrientation="portrait" />

<provider
android:name="androidx.core.content.FileProvider"
@@ -158,12 +292,6 @@
android:name="org.eclipse.paho.android.service.MqttService"
android:enabled="true"
android:exported="true"></service>

<service android:name="com.pingwang.bluetoothlib.server.ELinkBleServer"
android:foregroundServiceType="connectedDevice"
>

</service>
</application>

</manifest>

+ 50
- 72
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ADWeightScaleCmdActivity.java View File

@@ -81,13 +81,9 @@ public class ADWeightScaleCmdActivity extends BleBaseActivity implements OnCallb
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;
if (msg.what == REFRESH_DATA) {
if (listAdapter != null)
listAdapter.notifyDataSetChanged();
}
}
};
@@ -109,7 +105,7 @@ public class ADWeightScaleCmdActivity extends BleBaseActivity implements OnCallb
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList);
listView.setAdapter(listAdapter);

findViewById(R.id.user).setOnClickListener(this);
findViewById(R.id.btnUser).setOnClickListener(this);
findViewById(R.id.btnVersion).setOnClickListener(this);
findViewById(R.id.Undressing).setOnClickListener(this);
findViewById(R.id.clear).setOnClickListener(this);
@@ -173,19 +169,15 @@ public class ADWeightScaleCmdActivity extends BleBaseActivity implements OnCallb
public void onCheckedChanged(RadioGroup group, int checkedId) {
if (checkedId == -1)
return;//不是人为点击不触发
switch (group.getCheckedRadioButtonId()) {
case R.id.radio_weight_kg:
weightUnit = ADWeightScaleBleConfig.WEIGHT_KG;
break;
case R.id.radio_weight_lb_lb:
weightUnit = ADWeightScaleBleConfig.WEIGHT_LB_LB;
break;
case R.id.radio_weight_st_lb:
weightUnit = ADWeightScaleBleConfig.WEIGHT_ST;
break;
case R.id.radio_weight_jin:
weightUnit = ADWeightScaleBleConfig.WEIGHT_JIN;
break;
int checkedRadioButtonId = group.getCheckedRadioButtonId();
if (checkedRadioButtonId == R.id.radio_weight_kg) {
weightUnit = ADWeightScaleBleConfig.WEIGHT_KG;
} else if (checkedRadioButtonId == R.id.radio_weight_lb_lb) {
weightUnit = ADWeightScaleBleConfig.WEIGHT_LB_LB;
} else if (checkedRadioButtonId == R.id.radio_weight_st_lb) {
weightUnit = ADWeightScaleBleConfig.WEIGHT_ST;
} else if (checkedRadioButtonId == R.id.radio_weight_jin) {
weightUnit = ADWeightScaleBleConfig.WEIGHT_JIN;
}
BleLog.i(TAG, "weightUnit:" + weightUnit);
mDevice.setUnit(weightUnit);
@@ -214,58 +206,44 @@ public class ADWeightScaleCmdActivity extends BleBaseActivity implements OnCallb
@Override
public void onClick(View v) {
SendBleBean sendBleBean = new SendBleBean();
switch (v.getId()) {
case R.id.btnVersion:
sendBleBean.setHex(mBleSendCmdUtil.getBleVersion());
mDevice.sendData(sendBleBean);
break;
case R.id.Undressing:
mUndressing = !mUndressing;
mDevice.setUndressing(mUndressing);
break;
case R.id.Impedance:
mImpedance = !mImpedance;
mDevice.setBleImpedanceDiscern(mImpedance, 50);
break;

case R.id.clear:
if (mList != null)
mList.clear();
int id = v.getId();
if (id == R.id.btnVersion) {
sendBleBean.setHex(mBleSendCmdUtil.getBleVersion());
mDevice.sendData(sendBleBean);
} else if (id == R.id.Undressing) {
mUndressing = !mUndressing;
mDevice.setUndressing(mUndressing);
} else if (id == R.id.Impedance) {
mImpedance = !mImpedance;
mDevice.setBleImpedanceDiscern(mImpedance, 50);
} else if (id == R.id.clear) {
if (mList != null)
mList.clear();
mHandler.sendEmptyMessage(REFRESH_DATA);
} else if (id == R.id.getRecord) {
List<Integer> list = new ArrayList<>();
for (ADWeightScaleUserData adWeightScaleUserData : sADWeightScaleUserDataList) {
list.add(adWeightScaleUserData.getUserId());
}
mDevice.setBleSynUserHistoryRecord(list);
} else if (id == R.id.synUserAll) {
synUserAll();
} else if (id == R.id.synUser) {
mDevice.setBleUpdateUser(mADWeightScaleUserData);
} else if (id == R.id.btnUser) {
startActivityForResult(new Intent(mContext, ADWeightScaleUserActivity.class), 1);
} else if (id == R.id.synTime) {
if (mDevice != null) {
mDevice.setSynTime();
mList.add(TimeUtils.getTime() + "同步时间");
mHandler.sendEmptyMessage(REFRESH_DATA);
break;
case R.id.getRecord:
List<Integer> list = new ArrayList<>();
for (ADWeightScaleUserData adWeightScaleUserData : sADWeightScaleUserDataList) {
list.add(adWeightScaleUserData.getUserId());
}
mDevice.setBleSynUserHistoryRecord(list);
break;
case R.id.synUserAll:
synUserAll();
break;
case R.id.synUser:
mDevice.setBleUpdateUser(mADWeightScaleUserData);
break;
case R.id.user:
startActivityForResult(new Intent(mContext, ADWeightScaleUserActivity.class), 1);
break;
case R.id.synTime:
if (mDevice != null) {
mDevice.setSynTime();
mList.add(TimeUtils.getTime() + "同步时间");
mHandler.sendEmptyMessage(REFRESH_DATA);
}
break;
case R.id.btnDis:
if (mDevice != null) {
mDevice.disconnect();
}
break;
case R.id.btnConnect:
startScanBle(0);
break;


}
} else if (id == R.id.btnDis) {
if (mDevice != null) {
mDevice.disconnect();
}
} else if (id == R.id.btnConnect) {
startScanBle(0);
}
}


+ 27
- 35
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ADWeightScaleUserActivity.java View File

@@ -52,28 +52,24 @@ public class ADWeightScaleUserActivity extends AppCompatActivity implements View
@Override
public void onClick(View v) {

switch (v.getId()) {

case R.id.back_btn:
finish();
break;
case R.id.add_user_btn:
if (ADWeightScaleCmdActivity.sADWeightScaleUserDataList.size() < 8) {
ADWeightScaleCmdActivity.mUserId++;
ADWeightScaleUserData adWeightScaleUserData = new ADWeightScaleUserData();
adWeightScaleUserData.setUserId(ADWeightScaleCmdActivity.mUserId);
adWeightScaleUserData.setSex(ADWeightScaleBleConfig.SEX.MALE);
adWeightScaleUserData.setAge(20);
adWeightScaleUserData.setHeight(170);
adWeightScaleUserData.setWeight(50);
adWeightScaleUserData.setAdc(500);
ADWeightScaleCmdActivity.sADWeightScaleUserDataList.add(adWeightScaleUserData);
mAdapter.notifyDataSetChanged();
} else {
Toast.makeText(mContext, "最多只允许添加8个用户", Toast.LENGTH_SHORT).show();
}
break;

int id = v.getId();
if (id == R.id.back_btn) {
finish();
} else if (id == R.id.add_user_btn) {
if (ADWeightScaleCmdActivity.sADWeightScaleUserDataList.size() < 8) {
ADWeightScaleCmdActivity.mUserId++;
ADWeightScaleUserData adWeightScaleUserData = new ADWeightScaleUserData();
adWeightScaleUserData.setUserId(ADWeightScaleCmdActivity.mUserId);
adWeightScaleUserData.setSex(ADWeightScaleBleConfig.SEX.MALE);
adWeightScaleUserData.setAge(20);
adWeightScaleUserData.setHeight(170);
adWeightScaleUserData.setWeight(50);
adWeightScaleUserData.setAdc(500);
ADWeightScaleCmdActivity.sADWeightScaleUserDataList.add(adWeightScaleUserData);
mAdapter.notifyDataSetChanged();
} else {
Toast.makeText(mContext, "最多只允许添加8个用户", Toast.LENGTH_SHORT).show();
}
}

}
@@ -268,19 +264,15 @@ public class ADWeightScaleUserActivity extends AppCompatActivity implements View
ADWeightScaleUserData adWeightScaleUserData =
ADWeightScaleCmdActivity.sADWeightScaleUserDataList
.get(po);
switch (seekBar.getId()) {
case R.id.sb_item_age:
adWeightScaleUserData.setAge(progress);
break;
case R.id.sb_item_height:
adWeightScaleUserData.setHeight(progress);
break;
case R.id.sb_item_weight:
adWeightScaleUserData.setWeight(progress);
break;
case R.id.sb_item_adc:
adWeightScaleUserData.setAdc(progress);
break;
int id = seekBar.getId();
if (id == R.id.sb_item_age) {
adWeightScaleUserData.setAge(progress);
} else if (id == R.id.sb_item_height) {
adWeightScaleUserData.setHeight(progress);
} else if (id == R.id.sb_item_weight) {
adWeightScaleUserData.setWeight(progress);
} else if (id == R.id.sb_item_adc) {
adWeightScaleUserData.setAdc(progress);
}
textView.setText(progress + "");
ADWeightScaleCmdActivity.sADWeightScaleUserDataList.set(po, adWeightScaleUserData);

+ 342
- 412
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/AiLinkScooterActivity.java View File

@@ -228,418 +228,348 @@ public class AiLinkScooterActivity extends BleBaseActivity implements View.OnCli
@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;
int id = v.getId();
if (id == R.id.btn_support_function) {
logList.add(0, "查询支持的功能");
listAdapter.notifyDataSetChanged();
AilinkScooterBleData.getInstance().getSupportedFunction();
} else if (id == R.id.btn_hear) {
logList.add(0, "心跳数据交互");
listAdapter.notifyDataSetChanged();
AilinkScooterBleData.getInstance().sendHearData();
} else if (id == R.id.btn_unit_kg) {
logList.add(0, "设置公制单位(结果在心跳包中看)");
listAdapter.notifyDataSetChanged();
AilinkScooterBleData.getInstance().sendUnitData(0);
} else if (id == R.id.btn_unit_mi) {
logList.add(0, "设置英制单位(结果在心跳包中看)");
listAdapter.notifyDataSetChanged();
AilinkScooterBleData.getInstance().sendUnitData(1);
} else if (id == R.id.btn_add_gear) {
currentGear++;
if (currentGear > 7) currentGear = 7;
logList.add(0, "设置档位(结果在心跳包中看):" + currentGear);
listAdapter.notifyDataSetChanged();
AilinkScooterBleData.getInstance().sendGearData(currentGear);
} else if (id == R.id.btn_cut_gear) {
currentGear--;
if (currentGear < 0) currentGear = 0;
logList.add(0, "设置档位(结果在心跳包中看):" + currentGear);
listAdapter.notifyDataSetChanged();
AilinkScooterBleData.getInstance().sendGearData(currentGear);
} else if (id == R.id.btn_zero_start) {
logList.add(0, "零启动(结果在心跳包中看)");
listAdapter.notifyDataSetChanged();
AilinkScooterBleData.getInstance().sendStartModeData(0);
} else if (id == R.id.btn_un_zero_start) {
logList.add(0, "非零启动(结果在心跳包中看)");
listAdapter.notifyDataSetChanged();
AilinkScooterBleData.getInstance().sendStartModeData(1);
} else if (id == R.id.btn_cruise_open) {
logList.add(0, "开启巡航(结果在心跳包中看)");
listAdapter.notifyDataSetChanged();
AilinkScooterBleData.getInstance().sendCruiseControlFunctionData(1);
} else if (id == R.id.btn_cruise_close) {
logList.add(0, "关闭巡航(结果在心跳包中看)");
listAdapter.notifyDataSetChanged();
AilinkScooterBleData.getInstance().sendCruiseControlFunctionData(0);
} else if (id == R.id.btn_clear_total_mileage) {
logList.add(0, "清除总里程(结果在心跳包中看)");
listAdapter.notifyDataSetChanged();
AilinkScooterBleData.getInstance().sendClearData(0x02);
} else if (id == R.id.btn_clear_single_mileage_time) {
logList.add(0, "清除单次里程时间(结果在心跳包中看)");
listAdapter.notifyDataSetChanged();
AilinkScooterBleData.getInstance().sendClearData(0x01);
} else if (id == R.id.btn_reset) {
logList.add(0, "清除单次里程时间(结果在心跳包中看)");
listAdapter.notifyDataSetChanged();
AilinkScooterBleData.getInstance().sendClearData(0x80);
} else if (id == R.id.btn_clear_other) {
logList.add(0, "清除除里程和时间外的其它控制器及仪表参数");
listAdapter.notifyDataSetChanged();
AilinkScooterBleData.getInstance().sendClearData(0x04);
} else if (id == 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();
} else if (id == 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();
} else if (id == 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();
} else if (id == 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();
} else if (id == 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();
} else if (id == 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();
} else if (id == 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();
} else if (id == 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();
} else if (id == R.id.btn_lock) {
logList.add(0, "锁车");
AilinkScooterBleData.getInstance().setLockCarPassword(1, "000000");
listAdapter.notifyDataSetChanged();
} else if (id == 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();
} else if (id == 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();
} else if (id == R.id.btn_shutdown) {
logList.add(0, "锁车");
AilinkScooterBleData.getInstance().setLockCarPassword(4, "000000");
listAdapter.notifyDataSetChanged();
} else if (id == R.id.btn_after_password) {
logList.add(0, "获取售后密码");
AilinkScooterBleData.getInstance().readServicePassword();
listAdapter.notifyDataSetChanged();
} else if (id == R.id.btn_auto_bg_light) {
logList.add(0, "开启自动背光");
AilinkScooterBleData.getInstance().sendBgAuto();
listAdapter.notifyDataSetChanged();
} else if (id == R.id.btn_bg_light_100) {
logList.add(0, "开启手动背光:100");
AilinkScooterBleData.getInstance().sendBgUnAuto(100);
listAdapter.notifyDataSetChanged();
} else if (id == R.id.btn_bg_light_0) {
logList.add(0, "开启手动背光:0");
AilinkScooterBleData.getInstance().sendBgUnAuto(0);
listAdapter.notifyDataSetChanged();
} else if (id == R.id.btn_shutdown_unlock) {
logList.add(0, "设置自动关机");
AilinkScooterBleData.getInstance().sendAutoShutDownTime(unlockShutTime, lockShutTime);
listAdapter.notifyDataSetChanged();
} else if (id == R.id.btn_check_shutdown_time) {
logList.add(0, "查询自动关机时间");
AilinkScooterBleData.getInstance().sendGetShutDownTime();
listAdapter.notifyDataSetChanged();
} else if (id == R.id.btn_check_single_use_time) {
logList.add(0, "查询单次行驶里程时间");
AilinkScooterBleData.getInstance().sendSingleMileageTime();
listAdapter.notifyDataSetChanged();
} else if (id == R.id.btn_check_battery_info) {
logList.add(0, "查询总里程");
AilinkScooterBleData.getInstance().sendTotalMileage();
listAdapter.notifyDataSetChanged();
} else if (id == R.id.btn_check_total_mileage) {
logList.add(0, "查询电池信息");
AilinkScooterBleData.getInstance().sendBatteryInfo();
listAdapter.notifyDataSetChanged();
} else if (id == R.id.btn_check_battery_no) {
logList.add(0, "查询电池厂商代码及编号");
AilinkScooterBleData.getInstance().sendBatteryNo();
listAdapter.notifyDataSetChanged();
} else if (id == R.id.btn_check_controller_no) {
logList.add(0, "查询控制器厂商代码及编号");
AilinkScooterBleData.getInstance().sendControllerNo();
listAdapter.notifyDataSetChanged();
} else if (id == R.id.btn_check_meter_version) {
logList.add(0, "查询仪表固件版本");
AilinkScooterBleData.getInstance().sendMeterVersion();
listAdapter.notifyDataSetChanged();
} else if (id == R.id.btn_check_charge_time) {
logList.add(0, "读取充电时间");
AilinkScooterBleData.getInstance().sendCheckChargeTime();
listAdapter.notifyDataSetChanged();
} else if (id == 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();
} else if (id == 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();
} else if (id == R.id.btn_read_charge_capacity) {
logList.add(0, "读取充电容量");
AilinkScooterBleData.getInstance().sendGetChargeCapacity();
listAdapter.notifyDataSetChanged();
} else if (id == R.id.btn_find_car_open) {
logList.add(0, "打开寻车功能");
AilinkScooterBleData.getInstance().sendFindCarFunction(1);
listAdapter.notifyDataSetChanged();
} else if (id == R.id.btn_find_car_close) {
logList.add(0, "关闭寻车功能");
AilinkScooterBleData.getInstance().sendFindCarFunction(0);
listAdapter.notifyDataSetChanged();
} else if (id == R.id.btn_auto_lock_open) {
logList.add(0, "打开自动锁车");
AilinkScooterBleData.getInstance().sendAutoLockCar(1);
listAdapter.notifyDataSetChanged();
} else if (id == R.id.btn_auto_lock_close) {
logList.add(0, "关闭自动锁车");
AilinkScooterBleData.getInstance().sendAutoLockCar(0);
listAdapter.notifyDataSetChanged();
} else if (id == R.id.btn_auto_unlock_open) {
logList.add(0, "打开自动解锁");
AilinkScooterBleData.getInstance().sendAutoUnLockCar(1);
listAdapter.notifyDataSetChanged();
} else if (id == R.id.btn_auto_unlock_close) {
logList.add(0, "关闭自动解锁");
AilinkScooterBleData.getInstance().sendAutoUnLockCar(0);
listAdapter.notifyDataSetChanged();
} else if (id == R.id.btn_move_warm_open) {
logList.add(0, "打开移位报警");
AilinkScooterBleData.getInstance().sendMoveWarm(1);
listAdapter.notifyDataSetChanged();
} else if (id == R.id.btn_move_warm_close) {
logList.add(0, "关闭移位报警");
AilinkScooterBleData.getInstance().sendMoveWarm(0);
listAdapter.notifyDataSetChanged();
} else if (id == R.id.btn_collision_warm_open) {
logList.add(0, "打开碰撞报警");
AilinkScooterBleData.getInstance().sendCollisionWarm(1);
listAdapter.notifyDataSetChanged();
} else if (id == R.id.btn_collision_warm_close) {
logList.add(0, "关闭碰撞报警");
AilinkScooterBleData.getInstance().sendCollisionWarm(0);
listAdapter.notifyDataSetChanged();
} else if (id == R.id.btn_read_warm_auto_lock) {
logList.add(0, "读取车辆报警、自动锁");
AilinkScooterBleData.getInstance().sendCarWarmAndLock();
listAdapter.notifyDataSetChanged();
} else if (id == R.id.btn_find_car) {
logList.add(0, "寻车");
AilinkScooterBleData.getInstance().sendFindCar();
listAdapter.notifyDataSetChanged();
} else if (id == R.id.btn_navigation_open) {
logList.add(0, "导航:向左转弯,当前方向剩余500米,总剩余路程1000米");
AilinkScooterBleData.getInstance().sendNavigation(1, 2, 500, 1000);
listAdapter.notifyDataSetChanged();
} else if (id == R.id.btn_navigation_close) {
logList.add(0, "关闭导航");
AilinkScooterBleData.getInstance().sendNavigation(0, 0, 0, 0);
listAdapter.notifyDataSetChanged();
}
}


+ 43
- 66
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BabyBodyFatCmdActivity.java View File

@@ -127,38 +127,27 @@ public class BabyBodyFatCmdActivity extends BleBaseActivity implements OnCallbac
public void onCheckedChanged(RadioGroup group, int checkedId) {
if (checkedId == -1)
return;//不是人为点击不触发
switch (group.getCheckedRadioButtonId()) {
case R.id.radio_weight_kg:
weightUnit = BabyBleConfig.BABY_KG;
break;
case R.id.radio_weight_jin:
weightUnit = BabyBleConfig.BABY_FG;
break;
case R.id.radio_weight_lb:
weightUnit = BabyBleConfig.BABY_LB;
break;
case R.id.radio_weight_oz:
weightUnit = BabyBleConfig.BABY_OZ;
break;
case R.id.radio_weight_st_lb:
weightUnit = BabyBleConfig.BABY_ST;
break;
case R.id.radio_weight_g:
weightUnit = BabyBleConfig.BABY_G;
break;
case R.id.radio_weight_lb_lb:
weightUnit = BabyBleConfig.BABY_LB_LB;
break;

case R.id.radio_height_cm:
heightUnit = BabyBleConfig.BABY_CM;
break;
case R.id.radio_height_inch:
heightUnit = BabyBleConfig.BABY_INCH;
break;
case R.id.radio_height_foot:
heightUnit = BabyBleConfig.BABY_FEET;
break;
int checkedRadioButtonId = group.getCheckedRadioButtonId();
if (checkedRadioButtonId == R.id.radio_weight_kg) {
weightUnit = BabyBleConfig.BABY_KG;
} else if (checkedRadioButtonId == R.id.radio_weight_jin) {
weightUnit = BabyBleConfig.BABY_FG;
} else if (checkedRadioButtonId == R.id.radio_weight_lb) {
weightUnit = BabyBleConfig.BABY_LB;
} else if (checkedRadioButtonId == R.id.radio_weight_oz) {
weightUnit = BabyBleConfig.BABY_OZ;
} else if (checkedRadioButtonId == R.id.radio_weight_st_lb) {
weightUnit = BabyBleConfig.BABY_ST;
} else if (checkedRadioButtonId == R.id.radio_weight_g) {
weightUnit = BabyBleConfig.BABY_G;
} else if (checkedRadioButtonId == R.id.radio_weight_lb_lb) {
weightUnit = BabyBleConfig.BABY_LB_LB;
} else if (checkedRadioButtonId == R.id.radio_height_cm) {
heightUnit = BabyBleConfig.BABY_CM;
} else if (checkedRadioButtonId == R.id.radio_height_inch) {
heightUnit = BabyBleConfig.BABY_INCH;
} else if (checkedRadioButtonId == R.id.radio_height_foot) {
heightUnit = BabyBleConfig.BABY_FEET;
}
BleLog.i(TAG, "weightUnit:" + weightUnit + " ,||heightUnit:" + heightUnit);
mDevice.setUnit(weightUnit, heightUnit);
@@ -211,40 +200,28 @@ public class BabyBodyFatCmdActivity extends BleBaseActivity implements OnCallbac
@Override
public void onClick(View v) {
SendBleBean sendBleBean = new SendBleBean();
switch (v.getId()) {
case R.id.btnVersion:
sendBleBean.setHex(mBleSendCmdUtil.getBleVersion());
mDevice.sendData(sendBleBean);
break;


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


case R.id.btnDis:
if (mDevice != null) {
mDevice.disconnect();
}
break;
case R.id.btnConnect:
startScanBle(0);
break;
case R.id.btn_set_tare:
if (mDevice != null) {
mDevice.setTare();
}
break;
case R.id.btn_set_hold:
if (mDevice != null) {
mDevice.setHold();
}
break;


int id = v.getId();
if (id == R.id.btnVersion) {
sendBleBean.setHex(mBleSendCmdUtil.getBleVersion());
mDevice.sendData(sendBleBean);
} else if (id == R.id.clear) {
if (mList != null)
mList.clear();
mHandler.sendEmptyMessage(REFRESH_DATA);
} else if (id == R.id.btnDis) {
if (mDevice != null) {
mDevice.disconnect();
}
} else if (id == R.id.btnConnect) {
startScanBle(0);
} else if (id == R.id.btn_set_tare) {
if (mDevice != null) {
mDevice.setTare();
}
} else if (id == R.id.btn_set_hold) {
if (mDevice != null) {
mDevice.setHold();
}
}
}


+ 38
- 64
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BabyCmdActivity.java View File

@@ -36,7 +36,6 @@ import cn.net.aicare.modulelibrary.module.babyscale.BabyBleConfig;
import cn.net.aicare.modulelibrary.module.babyscale.BabyDeviceData;



/**
* xing<br>
* 2019/4/25<br>
@@ -62,13 +61,9 @@ public class BabyCmdActivity extends BleBaseActivity implements OnCallbackDis, O
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;
if (msg.what == REFRESH_DATA) {
if (listAdapter != null)
listAdapter.notifyDataSetChanged();
}
}
};
@@ -126,30 +121,21 @@ public class BabyCmdActivity extends BleBaseActivity implements OnCallbackDis, O

@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (group.getCheckedRadioButtonId()) {
case R.id.radio_weight_kg:
weightUnit = BabyBleConfig.BABY_KG;
break;
case R.id.radio_weight_lb:
weightUnit = BabyBleConfig.BABY_LB;
break;
case R.id.radio_weight_lb_lb:
weightUnit = BabyBleConfig.BABY_LB_LB;
break;
case R.id.radio_weight_oz:
weightUnit = BabyBleConfig.BABY_OZ;
break;
case R.id.radio_weight_g:
weightUnit = BabyBleConfig.BABY_G;
break;
case R.id.radio_height_cm:
heightUnit = BabyBleConfig.BABY_CM;
break;
case R.id.radio_height_foot:
heightUnit = BabyBleConfig.BABY_FEET;
break;


int checkedRadioButtonId = group.getCheckedRadioButtonId();
if (checkedRadioButtonId == R.id.radio_weight_kg) {
weightUnit = BabyBleConfig.BABY_KG;
} else if (checkedRadioButtonId == R.id.radio_weight_lb) {
weightUnit = BabyBleConfig.BABY_LB;
} else if (checkedRadioButtonId == R.id.radio_weight_lb_lb) {
weightUnit = BabyBleConfig.BABY_LB_LB;
} else if (checkedRadioButtonId == R.id.radio_weight_oz) {
weightUnit = BabyBleConfig.BABY_OZ;
} else if (checkedRadioButtonId == R.id.radio_weight_g) {
weightUnit = BabyBleConfig.BABY_G;
} else if (checkedRadioButtonId == R.id.radio_height_cm) {
heightUnit = BabyBleConfig.BABY_CM;
} else if (checkedRadioButtonId == R.id.radio_height_foot) {
heightUnit = BabyBleConfig.BABY_FEET;
}
}

@@ -194,38 +180,26 @@ public class BabyCmdActivity extends BleBaseActivity implements OnCallbackDis, O

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnVersion:
babyDevice.sendData(new SendBleBean(BleSendCmdUtil.getInstance().getBleVersion()));
break;
case R.id.btnBattery:
babyDevice.sendData(new SendBleBean(BleSendCmdUtil.getInstance().getMcuBatteryStatus()));
break;
case R.id.btn_get_did:
babyDevice.sendData(new SendBleBean(BleSendCmdUtil.getInstance().getDid()));
break;

case R.id.clear:
if (mList != null)
mList.clear();
mHandler.sendEmptyMessage(REFRESH_DATA);
break;
case R.id.btn_set_unit:
//cm=0,inch=1
//kg=0,斤=1,lb=2,oz=3,st=4,g=5
babyDevice.setUnit(weightUnit, weightUnit);
break;
case R.id.btn_set_tare:
babyDevice.setTare();
break;
case R.id.btn_set_hold:
babyDevice.setHold();
break;
case R.id.getUnit:
babyDevice.sendData(new SendBleBean(BleSendCmdUtil.getInstance().getSupportUnit()));
break;


int id = v.getId();
if (id == R.id.btnVersion) {
babyDevice.sendData(new SendBleBean(BleSendCmdUtil.getInstance().getBleVersion()));
} else if (id == R.id.btnBattery) {
babyDevice.sendData(new SendBleBean(BleSendCmdUtil.getInstance().getMcuBatteryStatus()));
} else if (id == R.id.btn_get_did) {
babyDevice.sendData(new SendBleBean(BleSendCmdUtil.getInstance().getDid()));
} else if (id == R.id.clear) {
if (mList != null)
mList.clear();
mHandler.sendEmptyMessage(REFRESH_DATA);
} else if (id == R.id.btn_set_unit) {//cm=0,inch=1
//kg=0,斤=1,lb=2,oz=3,st=4,g=5
babyDevice.setUnit(weightUnit, weightUnit);
} else if (id == R.id.btn_set_tare) {
babyDevice.setTare();
} else if (id == R.id.btn_set_hold) {
babyDevice.setHold();
} else if (id == R.id.getUnit) {
babyDevice.sendData(new SendBleBean(BleSendCmdUtil.getInstance().getSupportUnit()));
}
}


+ 178
- 188
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BleCmdActivity.java View File

@@ -19,7 +19,12 @@ import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.view.MenuProvider;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleOwner;

import com.pingwang.bluetoothlib.AILinkSDK;
import com.pingwang.bluetoothlib.bean.BleHandshakeBean;
import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.bean.SupportUnitBean;
import com.pingwang.bluetoothlib.config.BleConfig;
@@ -60,7 +65,9 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
* 2019/4/25<br>
* 基础指令信息数据显示
*/
public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, OnBleDeviceDataListener, OnBleVersionListener, OnMcuParameterListener, OnBleErrListener, OnBleInfoListener, OnBleParameterListener, OnBleCompanyListener, OnBleSettingListener, OnBleHandshakeListener, View.OnClickListener, OnBleOtherDataListener, OnBleRssiListener {
public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, OnBleDeviceDataListener, OnBleVersionListener, OnMcuParameterListener,
OnBleErrListener, OnBleInfoListener, OnBleParameterListener, OnBleCompanyListener, OnBleSettingListener, OnBleHandshakeListener,
View.OnClickListener, OnBleOtherDataListener, OnBleRssiListener {

private static String TAG = BleCmdActivity.class.getName();
private final int REFRESH_DATA = 3;
@@ -76,6 +83,7 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On
private int mVid;
private int mPid;
private String mDeviceVersion;
private String mDeviceVersion46;
/**
* 是否暂停显示数据
*/
@@ -83,12 +91,9 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On
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;
if (msg.what == REFRESH_DATA) {
if (listAdapter != null)
listAdapter.notifyDataSetChanged();
}
}
};
@@ -113,6 +118,10 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On
mBleSendCmdUtil = BleSendCmdUtil.getInstance();
init();
BleConfig.setHandshakeStatus((int[]) null, mAddress, true);
BleHandshakeBean licenseDevice = AILinkSDK.getInstance().isLicenseDevice(mCid, mVid, mPid);
String msg = "license:" + licenseDevice + "\n cid:" + mCid + "\n vid:" + mVid + "\n pid:" + mPid;
addShowData(msg);
BleLog.iw(msg);
}

private void init() {
@@ -149,6 +158,7 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On
findViewById(R.id.btnDis).setOnClickListener(this);
findViewById(R.id.btnConnect).setOnClickListener(this);
findViewById(R.id.btnSnRead).setOnClickListener(this);
findViewById(R.id.btnGetVersion46).setOnClickListener(this);
etName = findViewById(R.id.etName);
etMacType = findViewById(R.id.etMacType);
etBroadcastTime = findViewById(R.id.etBroadcastTime);
@@ -160,196 +170,166 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On
@Override
public void onClick(View v) {
SendBleBean sendBleBean;
switch (v.getId()) {
case R.id.btnDis:
if (mBleDevice != null) {
mBleDevice.disconnect();
}
addShowData("断开连接");
break;
case R.id.btnConnect:
mAILinkBleManager.connectDevice(new BleValueBean(mAddress, mCid, mVid, mPid));
addShowData("连接设备");
break;
case R.id.btnClearShakeHands:
if (mList != null)
mList.clear();
mHandler.sendEmptyMessage(REFRESH_DATA);
break;
case R.id.btnPause:
mPauseShowCmd = !mPauseShowCmd;
break;
case R.id.btnHandshake:
if (mBleDevice != null) {
mBleDevice.setHandshake(true);
// mBleDevice.sendHandshake();
addShowData("发送握手");

}
break;
case R.id.btnVersion:

if (mBleDevice != null) {
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.getBleVersion());
sendData(sendBleBean);
addShowData("正在获取版本号.");

}
break;
case R.id.btnBattery:
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus());
sendData(sendBleBean);
addShowData("读取电量");
break;
case R.id.btnTimeRead:
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.getSysTime());
sendData(sendBleBean);
break;
case R.id.btnTimeWrite:
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.setSysTime(bleDataUtils.getCurrentTime(), true));
sendData(sendBleBean);
break;
case R.id.btnNameRead:
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.getBleName());
sendData(sendBleBean);
break;
case R.id.btnMacRead:
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.getBleMac());
sendData(sendBleBean);
break;
case R.id.btnMacTypeRead:
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.getBroadcastDataType());
sendData(sendBleBean);
break;
case R.id.btnMacTypeWrite:
byte macType = Byte.valueOf(etMacType.getText().toString().trim());
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.setBroadcastDataType(macType));
sendData(sendBleBean);
break;
case R.id.btnNameWrite:
byte[] names = bleDataUtils.getBleName(etName.getText().toString().trim());
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.setBleName(names));
sendData(sendBleBean);
break;
case R.id.btnBroadcastTimeRead:
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.getBleBroadcastTime());
sendData(sendBleBean);
break;
case R.id.btnBroadcastTimeWrite:
try {
int time = Integer.parseInt(etBroadcastTime.getText().toString().trim());
byte[] broadcastTime = bleDataUtils.getBroadcastTime(time);
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.setBleBroadcastTime(broadcastTime));
sendData(sendBleBean);
} catch (NumberFormatException e) {
e.printStackTrace();
Toast.makeText(this, "请输入正确的广播时间", Toast.LENGTH_SHORT).show();
}
break;
int id = v.getId();
if (id == R.id.btnDis) {
if (mBleDevice != null) {
mBleDevice.disconnect();
}
addShowData("断开连接");
} else if (id == R.id.btnConnect) {
mAILinkBleManager.connectDevice(new BleValueBean(mAddress, mCid, mVid, mPid));
addShowData("连接设备");
} else if (id == R.id.btnClearShakeHands) {
if (mList != null)
mList.clear();
mHandler.sendEmptyMessage(REFRESH_DATA);
} else if (id == R.id.btnPause) {
mPauseShowCmd = !mPauseShowCmd;
} else if (id == R.id.btnHandshake) {
if (mBleDevice != null) {
mBleDevice.setHandshake(true);
// mBleDevice.sendHandshake();
addShowData("发送握手");

case R.id.btnDidRead:
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.getDid());
sendData(sendBleBean);
break;
case R.id.btnBmRestart:
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.setBleRestart());
sendData(sendBleBean);
break;
case R.id.btnBmReset:
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.setBleReset());
sendData(sendBleBean);
break;
case R.id.btnMcuType:
byte mode = (byte) Integer.parseInt(etMcuType.getText().toString().trim());
}
} else if (id == R.id.btnVersion) {
if (mBleDevice != null) {
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.setPortI2cSpiMode(mode));
sendBleBean.setHex(mBleSendCmdUtil.getBleVersion());
sendData(sendBleBean);
break;
addShowData("正在获取版本号.");

case R.id.btnUnits:
}
} else if (id == R.id.btnBattery) {
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus());
sendData(sendBleBean);
addShowData("读取电量");
} else if (id == R.id.btnTimeRead) {
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.getSysTime());
sendData(sendBleBean);
} else if (id == R.id.btnTimeWrite) {
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.setSysTime(bleDataUtils.getCurrentTime(), true));
sendData(sendBleBean);
} else if (id == R.id.btnNameRead) {
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.getBleName());
sendData(sendBleBean);
} else if (id == R.id.btnMacRead) {
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.getBleMac());
sendData(sendBleBean);
} else if (id == R.id.btnMacTypeRead) {
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.getBroadcastDataType());
sendData(sendBleBean);
} else if (id == R.id.btnMacTypeWrite) {
byte macType = Byte.valueOf(etMacType.getText().toString().trim());
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.setBroadcastDataType(macType));
sendData(sendBleBean);
} else if (id == R.id.btnNameWrite) {
byte[] names = bleDataUtils.getBleName(etName.getText().toString().trim());
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.setBleName(names));
sendData(sendBleBean);
} else if (id == R.id.btnBroadcastTimeRead) {
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.getBleBroadcastTime());
sendData(sendBleBean);
} else if (id == R.id.btnBroadcastTimeWrite) {
try {
int time = Integer.parseInt(etBroadcastTime.getText().toString().trim());
byte[] broadcastTime = bleDataUtils.getBroadcastTime(time);
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.getSupportUnit());
sendBleBean.setHex(mBleSendCmdUtil.setBleBroadcastTime(broadcastTime));
sendData(sendBleBean);
break;
} catch (NumberFormatException e) {
e.printStackTrace();
Toast.makeText(this, "请输入正确的广播时间", Toast.LENGTH_SHORT).show();
}
} else if (id == R.id.btnDidRead) {
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.getDid());
sendData(sendBleBean);
} else if (id == R.id.btnBmRestart) {
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.setBleRestart());
sendData(sendBleBean);
} else if (id == R.id.btnBmReset) {
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.setBleReset());
sendData(sendBleBean);
} else if (id == R.id.btnMcuType) {
byte mode = (byte) Integer.parseInt(etMcuType.getText().toString().trim());
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.setPortI2cSpiMode(mode));
sendData(sendBleBean);
} else if (id == R.id.btnUnits) {
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.getSupportUnit());
sendData(sendBleBean);
//写自动休眠
case R.id.btnSleepTimeWrite:
String sleepStr = etSleepTime.getText().toString().trim().toLowerCase(Locale.US);
if (sleepStr.contains(",")) {
String[] didStrS = sleepStr.split(",");
if (didStrS.length > 3) {
int switchStatus = Integer.parseInt(didStrS[0]);
int toSleepTimeS = Integer.parseInt(didStrS[1]);
int sleepSwitchCmd = Integer.parseInt(didStrS[2]);
int broadcastTimeMS = Integer.parseInt(didStrS[3]);
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.setNoConnectSleep(switchStatus, toSleepTimeS, sleepSwitchCmd, broadcastTimeMS));
sendData(sendBleBean);
}
}
break;
case R.id.btnSleepTimeRead:
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.getNoConnectSleep());
sendData(sendBleBean);
break;

case R.id.btn_start_ble:
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.setToWake());
sendData(sendBleBean);
break;
case R.id.btnNameRssi:
if (mBleDevice != null) {
mBleDevice.readRssi();
}
break;
case R.id.btn_set_device:
// 设置设备信息
String setDevice = et_set_device.getText().toString();
setDevice = setDevice.replace(" ", "");
setDevice = setDevice.replace(",", "");
if (TextUtils.isEmpty(setDevice)) {
return;
} else if (id == R.id.btnSleepTimeWrite) {
String sleepStr = etSleepTime.getText().toString().trim().toLowerCase(Locale.US);
if (sleepStr.contains(",")) {
String[] didStrS = sleepStr.split(",");
if (didStrS.length > 3) {
int switchStatus = Integer.parseInt(didStrS[0]);
int toSleepTimeS = Integer.parseInt(didStrS[1]);
int sleepSwitchCmd = Integer.parseInt(didStrS[2]);
int broadcastTimeMS = Integer.parseInt(didStrS[3]);
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.setNoConnectSleep(switchStatus, toSleepTimeS, sleepSwitchCmd, broadcastTimeMS));
sendData(sendBleBean);
}
byte[] data = BleStrUtils.stringToByte(setDevice);
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.setDeviceInfo(data));
sendData(sendBleBean);
addShowData("设置设备信息:" + BleStrUtils.byte2HexStr(data));

break;
case R.id.btn_get_device:
// 获取设备信息
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.getDeviceInfo());
sendData(sendBleBean);
addShowData("读取设备信息");

break;
case R.id.btnSnRead:
// 获取设备信息
}
} else if (id == R.id.btnSleepTimeRead) {
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.getNoConnectSleep());
sendData(sendBleBean);
} else if (id == R.id.btn_start_ble) {
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.setToWake());
sendData(sendBleBean);
} else if (id == R.id.btnNameRssi) {
if (mBleDevice != null) {
mBleDevice.readRssi();
}
} else if (id == R.id.btn_set_device) {// 设置设备信息
String setDevice = et_set_device.getText().toString();
setDevice = setDevice.replace(" ", "");
setDevice = setDevice.replace(",", "");
if (TextUtils.isEmpty(setDevice)) {
return;
}
byte[] data = BleStrUtils.stringToByte(setDevice);
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.setDeviceInfo(data));
sendData(sendBleBean);
addShowData("设置设备信息:" + BleStrUtils.byte2HexStr(data));
} else if (id == R.id.btn_get_device) {// 获取设备信息
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.getDeviceInfo());
sendData(sendBleBean);
addShowData("读取设备信息");
} else if (id == R.id.btnSnRead) {// 获取设备信息
sendBleBean = new SendBleBean();
byte[] sendData = new byte[1];
sendData[0] = (byte) 0x95;
sendBleBean.setHex(sendData);
sendData(sendBleBean);
addShowData("读取SN号");
} else if (id == R.id.btnGetVersion46) {// 获取设备版本号(0x46)
if (mBleDevice != null) {
sendBleBean = new SendBleBean();
byte[] sendData = new byte[1];
sendData[0] = (byte) 0x95;
sendBleBean.setHex(sendData);
sendBleBean.setHex(mBleSendCmdUtil.getBleVersion46());
sendData(sendBleBean);
addShowData("读取SN号");
addShowData("正在获取版本号(0x46).");

break;
}
}
}

@@ -438,7 +418,7 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On
@Override
public void onDisConnected(@NonNull String mac, int code) {
//TODO 连接断开
L.i( "连接断开");
L.i("连接断开");
if (mAddress.equals(mac)) {
Toast.makeText(mContext, "连接断开:" + code, Toast.LENGTH_SHORT).show();
mBleDevice = null;
@@ -541,6 +521,12 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On

}

@Override
public void onBmVersion46(String version) {
mDeviceVersion46 = version;
addShowData("版本号(0x46):" + version);
}

@Override
public void onSupportUnit(List<SupportUnitBean> list) {
StringBuilder unitStr = new StringBuilder();
@@ -702,7 +688,7 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On
int systemBattery = AppPhoneInfoUtils.getSystemBattery(mContext);
String appData = "包名:" + BuildConfig.APPLICATION_ID +
"\nApp版本:" + AppPhoneInfoUtils.getVersionName(mContext) +
"\n设备版本:" + mDeviceVersion +
"\n设备版本:" + mDeviceVersion + " 0x46=" + mDeviceVersion46 +
"\n设备:CID=0x" + Integer.toHexString(mCid) + " VID=0x" + Integer.toHexString(mVid) + " PID=0x" + Integer.toHexString(mPid) +
"\n手机型号:" + AppPhoneInfoUtils.getPhoneInfo() + " " + AppPhoneInfoUtils.getBrand() +
"\n手机系统:" + AppPhoneInfoUtils.getSystemVersionString() +
@@ -721,4 +707,8 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On
startActivity(sendIntent);
}

@Override
public void addMenuProvider(@NonNull MenuProvider provider, @NonNull LifecycleOwner owner, @NonNull Lifecycle.State state) {

}
}

+ 16
- 23
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BroadcastBloodOxygenActivity.java View File

@@ -51,13 +51,9 @@ public class BroadcastBloodOxygenActivity extends BleBaseActivity implements OnC
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;
if (msg.what == REFRESH_DATA) {
if (listAdapter != null)
listAdapter.notifyDataSetChanged();
}
}
};
@@ -90,22 +86,19 @@ public class BroadcastBloodOxygenActivity extends BleBaseActivity implements OnC

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.clear:
if (mList != null)
mList.clear();
mHandler.sendEmptyMessage(REFRESH_DATA);
break;
case R.id.open:
if (mAILinkBleManager != null) {
mAILinkBleManager.startScan(0, UUID.fromString("0000F0A0-0000-1000-8000-00805F9B34FB"));
}
break;
case R.id.stop:
if (mAILinkBleManager != null) {
mAILinkBleManager.stopScan();
}
break;
int id = v.getId();
if (id == R.id.clear) {
if (mList != null)
mList.clear();
mHandler.sendEmptyMessage(REFRESH_DATA);
} else if (id == R.id.open) {
if (mAILinkBleManager != null) {
mAILinkBleManager.startScan(0, UUID.fromString("0000F0A0-0000-1000-8000-00805F9B34FB"));
}
} else if (id == R.id.stop) {
if (mAILinkBleManager != null) {
mAILinkBleManager.stopScan();
}
}
}


+ 27
- 42
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BroadcastScaleActivity.java View File

@@ -61,13 +61,9 @@ public class BroadcastScaleActivity extends BleNewBaseActivity implements OnCall
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;
if (msg.what == REFRESH_DATA) {
if (listAdapter != null)
listAdapter.notifyDataSetChanged();
}
}
};
@@ -113,29 +109,21 @@ public class BroadcastScaleActivity extends BleNewBaseActivity implements OnCall
public void onCheckedChanged(RadioGroup group, int checkedId) {
if (checkedId == -1)
return;//不是人为点击不触发
switch (group.getCheckedRadioButtonId()) {
case R.id.radio_weight_kg:
mWeightUnit = BabyBleConfig.BABY_KG;
break;
case R.id.radio_weight_jin:
mWeightUnit = BabyBleConfig.BABY_FG;
break;
case R.id.radio_weight_lb:
mWeightUnit = BabyBleConfig.BABY_LB;
break;
case R.id.radio_weight_oz:
mWeightUnit = BabyBleConfig.BABY_OZ;
break;
case R.id.radio_weight_st_lb:
mWeightUnit = BabyBleConfig.BABY_ST;
break;
case R.id.radio_weight_g:
mWeightUnit = BabyBleConfig.BABY_G;
break;
case R.id.radio_weight_lb_lb:
mWeightUnit = BabyBleConfig.BABY_LB_LB;
break;

int checkedRadioButtonId = group.getCheckedRadioButtonId();
if (checkedRadioButtonId == R.id.radio_weight_kg) {
mWeightUnit = BabyBleConfig.BABY_KG;
} else if (checkedRadioButtonId == R.id.radio_weight_jin) {
mWeightUnit = BabyBleConfig.BABY_FG;
} else if (checkedRadioButtonId == R.id.radio_weight_lb) {
mWeightUnit = BabyBleConfig.BABY_LB;
} else if (checkedRadioButtonId == R.id.radio_weight_oz) {
mWeightUnit = BabyBleConfig.BABY_OZ;
} else if (checkedRadioButtonId == R.id.radio_weight_st_lb) {
mWeightUnit = BabyBleConfig.BABY_ST;
} else if (checkedRadioButtonId == R.id.radio_weight_g) {
mWeightUnit = BabyBleConfig.BABY_G;
} else if (checkedRadioButtonId == R.id.radio_weight_lb_lb) {
mWeightUnit = BabyBleConfig.BABY_LB_LB;
}
BleLog.i(TAG, "weightUnit:" + mWeightUnit);
}
@@ -170,18 +158,15 @@ public class BroadcastScaleActivity extends BleNewBaseActivity implements OnCall

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.clear:
if (mList != null)
mList.clear();
mHandler.sendEmptyMessage(REFRESH_DATA);
break;
case R.id.open:
AILinkBleManager.getInstance().startScan(0, BleConfig.UUID_SERVER_BROADCAST_AILINK);
break;
case R.id.stop:
AILinkBleManager.getInstance().stopScan();
break;
int id = v.getId();
if (id == R.id.clear) {
if (mList != null)
mList.clear();
mHandler.sendEmptyMessage(REFRESH_DATA);
} else if (id == R.id.open) {
AILinkBleManager.getInstance().startScan(0, BleConfig.UUID_SERVER_BROADCAST_AILINK);
} else if (id == R.id.stop) {
AILinkBleManager.getInstance().stopScan();
}
}


+ 0
- 276
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ClearShakeHandsActivity.java View File

@@ -1,276 +0,0 @@
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 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;
import com.pingwang.bluetoothlib.device.SendMcuBean;
import com.pingwang.bluetoothlib.listener.CallbackDisIm;
import com.pingwang.bluetoothlib.listener.OnBleDeviceDataListener;
import com.pingwang.bluetoothlib.listener.OnBleOtherDataListener;
import com.pingwang.bluetoothlib.listener.OnBleVersionListener;
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 java.util.ArrayList;
import java.util.List;

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


/**
* xing<br>
* 2019/4/25<br>
* 验证不握手不加密模块
*/
public class ClearShakeHandsActivity extends BleBaseActivity implements OnCallbackDis, OnBleVersionListener, OnMcuParameterListener,
View.OnClickListener, OnBleOtherDataListener, OnBleDeviceDataListener {

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

private Context mContext;
private EditText et_type;
private BleDevice mBleDevice;
private String mAddress;
private BleSendCmdUtil mBleSendCmdUtil;
private int mCid = 0x01;
private byte unit = 0;
private boolean mPauseRefresh = 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_clear_shake_hands);
mContext = this;
mAddress = getIntent().getStringExtra("mac");
mCid = getIntent().getIntExtra("cid", -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.btnPause).setOnClickListener(this);
findViewById(R.id.btn_set_unit).setOnClickListener(this);
findViewById(R.id.btn1).setOnClickListener(this);
findViewById(R.id.clear).setOnClickListener(this);
findViewById(R.id.btnClearShakeHands).setOnClickListener(this);
et_type = findViewById(R.id.et_type);
}


@Override
public void onClick(View v) {
switch (v.getId()) {

case R.id.btn_set_unit:
if (unit == SphyBleConfig.SPHY_UNIT_MMHG) {
unit = SphyBleConfig.SPHY_UNIT_KPA;
setUnit(unit);
} else {
unit = SphyBleConfig.SPHY_UNIT_MMHG;
setUnit(unit);
}
break;

case R.id.btnPause:
mPauseRefresh = !mPauseRefresh;
break;

case R.id.btn1:
String cmd = et_type.getText().toString().trim();
byte[] bytes = new byte[cmd.length() / 2];
for (int i = 0; i <= cmd.length() - 2; i += 2) {
int i1 = Integer.parseInt(cmd.substring(i, i + 2), 16);
bytes[i >> 1] = (byte) i1;
}
SendMcuBean sendDataBean = new SendMcuBean();
sendDataBean.setHex(mCid, bytes);
mBleDevice.sendData(sendDataBean);
mList.add(TimeUtils.getTime() + "发送(A7)->" + BleStrUtils.byte2HexStr(bytes));
mHandler.sendEmptyMessage(REFRESH_DATA);
break;
case R.id.clear:
if (mList != null)
mList.clear();
mHandler.sendEmptyMessage(REFRESH_DATA);
break;
case R.id.btnClearShakeHands:
byte[] send = mBleSendCmdUtil.setClearShakeHands();
SendBleBean sendBleBean = new SendBleBean();
sendBleBean.setHex(send);
mBleDevice.sendData(sendBleBean);
mList.add(TimeUtils.getTime() + "发送(A6)->" + BleStrUtils.byte2HexStr(send));
mHandler.sendEmptyMessage(REFRESH_DATA);
break;
}
}


/**
* 设置单位(Set unit)
*
* @param unit
*/
public void setUnit(byte unit) {
SendMcuBean sendMcuBean = new SendMcuBean();
byte[] data = new byte[2];
data[0] = SphyBleConfig.SET_UNIT;
data[1] = unit;
sendMcuBean.setHex(0x01, data);
mBleDevice.sendData(sendMcuBean);
mList.add(TimeUtils.getTime() + "发送(A7)->" + BleStrUtils.byte2HexStr(data));
mHandler.sendEmptyMessage(REFRESH_DATA);
}

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


@Override
public void onServiceSuccess() {
CallbackDisIm.getInstance().addListListener(this);
BleLog.i(TAG, "服务与界面建立连接成功");
//与服务建立连接
if (mAILinkBleManager != null) {
mBleDevice = mAILinkBleManager.getBleDevice(mAddress);
//设置不加密
mBleDevice.setA7Encryption(false);
mBleDevice.setOnBleDeviceDataListener(ClearShakeHandsActivity.this);
mBleDevice.setOnBleVersionListener(ClearShakeHandsActivity.this);
mBleDevice.setOnBleOtherDataListener(ClearShakeHandsActivity.this);
mBleDevice.sendData(new SendBleBean(mBleSendCmdUtil.getBleVersion()));

}
}

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


@Override
public void unbindServices() {
CallbackDisIm.getInstance().removeListener(this);
if (mBleDevice != null) {
mBleDevice.disconnect();
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 连接断开
if (mAddress.equals(mac)) {
BleLog.i(TAG, "连接断开");
finish();
}
}

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


@Override
public void bleOpen() {

}

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


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


@Override
public void onNotifyData(String uuid, byte[] hex, int type) {
addData("notify(A7)->" + BleStrUtils.byte2HexStr(hex));
}

@Override
public void onNotifyDataA6(String uuid, byte[] hex) {
addData("notify(A6)->" + BleStrUtils.byte2HexStr(hex));
}

@Override
public void onNotifyOtherData(String uuid, byte[] data) {
addData("notify(透传)->" + BleStrUtils.byte2HexStr(data));
}

@Override
public void onBmVersion(String version) {
addData("版本号:" + version);
}

private void addData(String data) {
if (mPauseRefresh)
return;
mList.add(TimeUtils.getTime() + "->" + data);
mHandler.sendEmptyMessage(REFRESH_DATA);
}


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

+ 1
- 6
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ConnectBleTestActivity.java View File

@@ -169,12 +169,7 @@ public class ConnectBleTestActivity extends AppCompatActivity implements OnCallb
}
}
});
findViewById(R.id.跳过).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mContext, "跳过", Toast.LENGTH_SHORT).show();
}
});


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

+ 22
- 32
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/HeightCmdActivity.java View File

@@ -35,7 +35,6 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import cn.net.aicare.modulelibrary.module.height.HeightDeviceData;



/**
* xing<br>
* 2019/4/25<br>
@@ -61,13 +60,9 @@ public class HeightCmdActivity extends BleBaseActivity implements OnCallbackDis,
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;
if (msg.what == REFRESH_DATA) {
if (listAdapter != null)
listAdapter.notifyDataSetChanged();
}
}
};
@@ -123,30 +118,25 @@ public class HeightCmdActivity extends BleBaseActivity implements OnCallbackDis,
@Override
public void onClick(View v) {
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.btn1:
String cmd = et_type.getText().toString().trim();
SendMcuBean sendDataBean = new SendMcuBean();
sendDataBean.setHex(type,cmd.getBytes());
mBleDevice.sendData(sendDataBean);
break;
case R.id.clear:
if (mList != null)
mList.clear();
mHandler.sendEmptyMessage(REFRESH_DATA);
break;
int id = v.getId();
if (id == R.id.btnVersion) {
sendBleBean.setHex(mBleSendCmdUtil.getBleVersion());
mBleDevice.sendData(sendBleBean);
} else if (id == R.id.btnBattery) {
sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus());
mBleDevice.sendData(sendBleBean);
} else if (id == R.id.btn_get_did) {
sendBleBean.setHex(mBleSendCmdUtil.getDid());
mBleDevice.sendData(sendBleBean);
} else if (id == R.id.btn1) {
String cmd = et_type.getText().toString().trim();
SendMcuBean sendDataBean = new SendMcuBean();
sendDataBean.setHex(type, cmd.getBytes());
mBleDevice.sendData(sendDataBean);
} else if (id == R.id.clear) {
if (mList != null)
mList.clear();
mHandler.sendEmptyMessage(REFRESH_DATA);
}
}


+ 135
- 144
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/HeightWeightScaleActivity.java View File

@@ -15,6 +15,7 @@ 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 com.pingwang.bluetoothlib.utils.BleDensityUtil;

import java.lang.ref.WeakReference;
import java.util.ArrayList;
@@ -265,9 +266,8 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall

@Override
public void onWeightBodyFat(int workMode, int weightMode, int weight, int decimals, int unit) {

addText(0, "体重体脂 模式:" + workMode + " 测量状态: " + weightMode + "\n 体重: " + weight
+ " 小数位: " + decimals + " 单位: " + getWeightUnitStr(unit));
String dataStr = BleDensityUtil.getInstance().holdDecimals(weight, decimals);
addText(0, "体重体脂 模式:" + workMode + " 测量状态: " + weightMode + "\n 体重: " + dataStr + getWeightUnitStr(unit));
if (weightMode == 2) {
mMHandler.removeMessages(ADC);
mMHandler.removeMessages(FINISH);
@@ -293,10 +293,8 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall

@Override
public void onWeight(int workMode, int weightMode, int weight, int decimals, int unit) {


addText(0, "体重 模式:" + workMode + " 测量状态: " + weightMode + "\n 体重: " + weight
+ " 小数位: " + decimals + " 单位: " + getWeightUnitStr(unit));
String dataStr = BleDensityUtil.getInstance().holdDecimals(weight, decimals);
addText(0, "体重 模式:" + workMode + " 测量状态: " + weightMode + "\n 体重: " + dataStr + getWeightUnitStr(unit));
if (weightMode == 2) {
mMHandler.removeMessages(FINISH);
mMHandler.sendEmptyMessageDelayed(FINISH, 40000);
@@ -347,13 +345,20 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall

@Override
public void onTEMP(int workMode, int sign, int temp, int decimals, int unit) {
addText(0, "温度数据 模式:" + workMode + " 温度: " + temp + " 正负: " + sign + "小数 : " + decimals + " 单位 : " + unit);
String dataStr = BleDensityUtil.getInstance().holdDecimals(temp, decimals);
if (sign==1) {
dataStr = "-" + dataStr;
}
addText(0, "温度数据 模式:" + workMode + " 温度: " + dataStr + getTempUnitStr(unit));

}

@Override
public void onHeight(int workMode, int height, int decimals, int unit) {
addText(0, "身高数据 模式:" + workMode + " 身高: " + height + " 小数位: " + decimals + "单位 : " + getHeightUnitStr(unit));
String dataStr = BleDensityUtil.getInstance().holdDecimals(height, decimals);
addText(0, "身高数据 模式:" + workMode + " 身高: " + dataStr + getHeightUnitStr(unit));
// addText(0, "身高数据 模式:" + workMode + " 身高: " + height + " 小数位: " + decimals + "单位 : " + getHeightUnitStr(unit));


}

@@ -394,141 +399,117 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall
public void onClick(View v) {
if (HeightBodyFatBleData.getInstance() != null) {

switch (v.getId()) {
case R.id.kg:
selectWUnit = 0;
addText(0, "下发体重单位 :" + getHeightUnitStr(currentHUnit)+","+getWeightUnitStr(selectWUnit));
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(currentHUnit, selectWUnit));
mMHandler.removeMessages(SETUNIT);
mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000);
break;
case R.id.jin:
selectWUnit = 1;
addText(0, "下发体重单位 :" + getHeightUnitStr(currentHUnit)+","+getWeightUnitStr(selectWUnit));
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(currentHUnit, selectWUnit));
mMHandler.removeMessages(SETUNIT);
mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000);
break;
case R.id.st_lb:
selectWUnit = 4;
addText(0, "下发体重单位 :" + getHeightUnitStr(currentHUnit)+","+getWeightUnitStr(selectWUnit));
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(currentHUnit, selectWUnit));
mMHandler.removeMessages(SETUNIT);
mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000);
break;
case R.id.lb:
selectWUnit = 6;
addText(0, "下发体重单位 :" + getHeightUnitStr(currentHUnit)+","+getWeightUnitStr(selectWUnit));
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(currentHUnit, currentHUnit));
mMHandler.removeMessages(SETUNIT);
mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000);
break;
case R.id.girl:
addText(0, "下用户 女 18岁 165cm :" + selectWUnit);
mHeightBodyFatUser = new HeightBodyFatUser(0, 18, 165, 0, 0);
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUser(mHeightBodyFatUser.getSex(), mHeightBodyFatUser.getAge(), mHeightBodyFatUser.getHeight()));
mMHandler.removeMessages(SETUSER);
mMHandler.sendEmptyMessageDelayed(SETUSER, 3000);
break;
case R.id.man:
addText(0, "下用户 男 28岁 170cm :" + selectWUnit);
mHeightBodyFatUser = new HeightBodyFatUser(1, 28, 170, 0, 0);
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUser(mHeightBodyFatUser.getSex(), mHeightBodyFatUser.getAge(), mHeightBodyFatUser.getHeight()));
mMHandler.removeMessages(SETUSER);
mMHandler.sendEmptyMessageDelayed(SETUSER, 3000);

break;
case R.id.cm:
selectHUnit = 0;
addText(0, "下发身高单位 :" + getHeightUnitStr(selectHUnit)+","+getWeightUnitStr(currentWUnit));
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(selectHUnit, currentWUnit));
mMHandler.removeMessages(SETUNIT);
mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000);
break;
case R.id.inch:
selectHUnit = 1;
addText(0, "下发身高单位 :" + getHeightUnitStr(selectHUnit)+","+getWeightUnitStr(currentWUnit));
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(selectHUnit, currentWUnit));
mMHandler.removeMessages(SETUNIT);
mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000);
break;
case R.id.ft_in:
selectHUnit = 2;
addText(0, "下发身高单位 :" + getHeightUnitStr(selectHUnit)+","+getWeightUnitStr(currentWUnit));
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(selectHUnit, currentWUnit));
mMHandler.removeMessages(SETUNIT);
mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000);
break;
case R.id.baby:
selectMode = 2;
addText(0, "下发工作模式 :" + selectMode);
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setWorkMode(selectMode));
mMHandler.removeMessages(SETMODE);
mMHandler.sendEmptyMessageDelayed(SETMODE, 3000);
break;
case R.id.bodyfat:
selectMode = 1;
addText(0, "下发工作模式 :" + selectMode);
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setWorkMode(selectMode));
mMHandler.removeMessages(SETMODE);
mMHandler.sendEmptyMessageDelayed(SETMODE, 3000);
break;
case R.id.weight:
selectMode = 3;
addText(0, "下发工作模式 :" + selectMode);
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setWorkMode(selectMode));
mMHandler.removeMessages(SETMODE);
mMHandler.sendEmptyMessageDelayed(SETMODE, 3000);
break;
case R.id.height_weight:
selectMode = 4;
addText(0, "下发工作模式 :" + selectMode);
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setWorkMode(selectMode));
mMHandler.removeMessages(SETMODE);
mMHandler.sendEmptyMessageDelayed(SETMODE, 3000);
break;
case R.id.deviceStatus:

addText(0, "请求设备状态 :");
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.getDeviceStatus());
mMHandler.removeMessages(DEVICESTATUS);
mMHandler.sendEmptyMessageDelayed(DEVICESTATUS, 3000);
break;
case R.id.voice_open:
selectVoice = 1;
addText(0, "设置声音 :" + selectMode);
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setVoiceStatus(selectVoice));
mMHandler.removeMessages(VOICE);
mMHandler.sendEmptyMessageDelayed(VOICE, 3000);
break;
case R.id.voice_close:
selectVoice = 2;
addText(0, "设置声音 :" + selectMode);
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setVoiceStatus(selectVoice));
mMHandler.removeMessages(VOICE);
mMHandler.sendEmptyMessageDelayed(VOICE, 3000);
break;
case R.id.voice_status:

addText(0, "获取声音状态");
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.getVoiceStatus());
mMHandler.removeMessages(VOICESTATUS);
mMHandler.sendEmptyMessageDelayed(VOICESTATUS, 3000);
break;
case R.id.finish:
addText(0, "回复测量完成");
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.replyTestFinish());
break;
case R.id.btnPause:
pauseRefresh = !pauseRefresh;
if (pauseRefresh) {
addText(0, "暂停刷新");
} else {
addText(0, "继续刷新");
}
break;


int id = v.getId();
if (id == R.id.kg) {
selectWUnit = 0;
addText(0, "下发体重单位 :" + getHeightUnitStr(currentHUnit) + "," + getWeightUnitStr(selectWUnit));
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(currentHUnit, selectWUnit));
mMHandler.removeMessages(SETUNIT);
mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000);
} else if (id == R.id.jin) {
selectWUnit = 1;
addText(0, "下发体重单位 :" + getHeightUnitStr(currentHUnit) + "," + getWeightUnitStr(selectWUnit));
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(currentHUnit, selectWUnit));
mMHandler.removeMessages(SETUNIT);
mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000);
} else if (id == R.id.st_lb) {
selectWUnit = 4;
addText(0, "下发体重单位 :" + getHeightUnitStr(currentHUnit) + "," + getWeightUnitStr(selectWUnit));
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(currentHUnit, selectWUnit));
mMHandler.removeMessages(SETUNIT);
mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000);
} else if (id == R.id.lb) {
selectWUnit = 6;
addText(0, "下发体重单位 :" + getHeightUnitStr(currentHUnit) + "," + getWeightUnitStr(selectWUnit));
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(currentHUnit, currentHUnit));
mMHandler.removeMessages(SETUNIT);
mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000);
} else if (id == R.id.girl) {
addText(0, "下用户 女 18岁 165cm :" + selectWUnit);
mHeightBodyFatUser = new HeightBodyFatUser(0, 18, 165, 0, 0);
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUser(mHeightBodyFatUser.getSex(), mHeightBodyFatUser.getAge(), mHeightBodyFatUser.getHeight()));
mMHandler.removeMessages(SETUSER);
mMHandler.sendEmptyMessageDelayed(SETUSER, 3000);
} else if (id == R.id.man) {
addText(0, "下用户 男 28岁 170cm :" + selectWUnit);
mHeightBodyFatUser = new HeightBodyFatUser(1, 28, 170, 0, 0);
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUser(mHeightBodyFatUser.getSex(), mHeightBodyFatUser.getAge(), mHeightBodyFatUser.getHeight()));
mMHandler.removeMessages(SETUSER);
mMHandler.sendEmptyMessageDelayed(SETUSER, 3000);
} else if (id == R.id.cm) {
selectHUnit = 0;
addText(0, "下发身高单位 :" + getHeightUnitStr(selectHUnit) + "," + getWeightUnitStr(currentWUnit));
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(selectHUnit, currentWUnit));
mMHandler.removeMessages(SETUNIT);
mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000);
} else if (id == R.id.inch) {
selectHUnit = 1;
addText(0, "下发身高单位 :" + getHeightUnitStr(selectHUnit) + "," + getWeightUnitStr(currentWUnit));
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(selectHUnit, currentWUnit));
mMHandler.removeMessages(SETUNIT);
mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000);
} else if (id == R.id.ft_in) {
selectHUnit = 2;
addText(0, "下发身高单位 :" + getHeightUnitStr(selectHUnit) + "," + getWeightUnitStr(currentWUnit));
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(selectHUnit, currentWUnit));
mMHandler.removeMessages(SETUNIT);
mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000);
} else if (id == R.id.baby) {
selectMode = 2;
addText(0, "下发工作模式 :" + selectMode);
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setWorkMode(selectMode));
mMHandler.removeMessages(SETMODE);
mMHandler.sendEmptyMessageDelayed(SETMODE, 3000);
} else if (id == R.id.bodyfat) {
selectMode = 1;
addText(0, "下发工作模式 :" + selectMode);
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setWorkMode(selectMode));
mMHandler.removeMessages(SETMODE);
mMHandler.sendEmptyMessageDelayed(SETMODE, 3000);
} else if (id == R.id.weight) {
selectMode = 3;
addText(0, "下发工作模式 :" + selectMode);
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setWorkMode(selectMode));
mMHandler.removeMessages(SETMODE);
mMHandler.sendEmptyMessageDelayed(SETMODE, 3000);
} else if (id == R.id.height_weight) {
selectMode = 4;
addText(0, "下发工作模式 :" + selectMode);
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setWorkMode(selectMode));
mMHandler.removeMessages(SETMODE);
mMHandler.sendEmptyMessageDelayed(SETMODE, 3000);
} else if (id == R.id.deviceStatus) {
addText(0, "请求设备状态 :");
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.getDeviceStatus());
mMHandler.removeMessages(DEVICESTATUS);
mMHandler.sendEmptyMessageDelayed(DEVICESTATUS, 3000);
} else if (id == R.id.voice_open) {
selectVoice = 1;
addText(0, "设置声音 :" + selectMode);
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setVoiceStatus(selectVoice));
mMHandler.removeMessages(VOICE);
mMHandler.sendEmptyMessageDelayed(VOICE, 3000);
} else if (id == R.id.voice_close) {
selectVoice = 2;
addText(0, "设置声音 :" + selectMode);
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setVoiceStatus(selectVoice));
mMHandler.removeMessages(VOICE);
mMHandler.sendEmptyMessageDelayed(VOICE, 3000);
} else if (id == R.id.voice_status) {
addText(0, "获取声音状态");
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.getVoiceStatus());
mMHandler.removeMessages(VOICESTATUS);
mMHandler.sendEmptyMessageDelayed(VOICESTATUS, 3000);
} else if (id == R.id.finish) {
addText(0, "回复测量完成");
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.replyTestFinish());
} else if (id == R.id.btnPause) {
pauseRefresh = !pauseRefresh;
if (pauseRefresh) {
addText(0, "暂停刷新");
} else {
addText(0, "继续刷新");
}
}
}
}
@@ -600,6 +581,16 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall
}
return "";
}
private String getTempUnitStr(int unit) {
switch (unit) {
case 0:
return "℃";
case 1:
return "℉";

}
return "";
}


private boolean pauseRefresh = false;

+ 11
- 18
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ShowBleActivity.java View File

@@ -49,8 +49,6 @@ 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.home.HomeDataManager;
import aicare.net.cn.sdk.ailinksdkdemoandroid.home.MainActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.toothbrush.ToothBrushWifiBleActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.CheckPermissionUtils;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.MyBleStrUtils;
import aicare.net.cn.sdk.ailinksdkdemoandroid.view.MyItemDecoration;
@@ -73,6 +71,7 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O
private final int BIND_SERVER_ERR = 2;
private final int REFRESH_DATA = 3;
private EditText et_cid;
private EditText et_filter_name;
private List<BleValueBean> mBleValueList;
private StringAdapter listAdapter;

@@ -127,9 +126,8 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O
}
init();
initData();

// 如果是蓝牙牙刷,就弹个框提醒
if (mCid == BleDeviceConfig.TOOTHBRUSH_TEST) {
// 如果是蓝牙牙刷,就弹个框提醒
new AlertDialog.Builder(mContext).setMessage("启动牙刷,工作10秒钟,然后关闭牙刷(让牙刷处于广播状态),然后点击搜索,选中列表中的牙刷,开始测试")
.setPositiveButton("确认", null)
.show();
@@ -152,9 +150,9 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O
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);
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 = findViewById(R.id.et_cid);
if (mScanCid > 0) {
et_cid.setText(MyBleStrUtils.getHexString(mScanCid));
} else {
@@ -181,10 +179,12 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O
List<BleScanAddAilinkBean> list = new ArrayList<>();
list.add(new BleScanAddAilinkBean(0x37, 0x03, 0x01, SkateboardBleConfig.UUID_BROADCAST));
mAILinkBleManager.startScan(scanOut, list, BleConfig.UUID_SERVER_AILINK, SkateboardBleConfig.UUID_BROADCAST);
} else if (mType == BleDeviceConfig.BLE_SMART_CYCLING_TABLE) {
mAILinkBleManager.startScan(scanOut);
} else {
//0000FEE7=手表
// 0000FEE7=手表
mAILinkBleManager.startScan(scanOut, BleConfig.UUID_BROADCAST_AILINK, BleConfig.UUID_SERVER_BROADCAST_AILINK, UUID.fromString("0000FEE7-0000-1000-8000-00805F9B34FB"), SkateboardBleConfig.UUID_BROADCAST);
// BleScanUtil.scanLeDevice(AILinkBleManager.getInstance(), scanOut);
// BleScanUtil.scanLeDevice(AILinkBleManager.getInstance(), scanOut,BleConfig.UUID_BROADCAST_AILINK, BleConfig.UUID_SERVER_BROADCAST_AILINK);
}
mBleValueList.clear();
listAdapter.notifyDataSetChanged();
@@ -220,6 +220,7 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O
mPid = bleValueBean.getPid();
mBleName = bleValueBean.getName();

// if (mType == BleDeviceConfig.CLEAR_SHAKE_HANDS || mType == BleDeviceConfig.BLE_SEND_SPEED_TEST) {
if (mType == BleDeviceConfig.CLEAR_SHAKE_HANDS) {
//验证不握手,不加密的界面使用
//设置不握手
@@ -229,14 +230,6 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O
mAILinkBleManager.connectDevice(new BleValueBean(mac, mCid, mVid, mPid));
showLoading();
}
} else if (BleDeviceConfig.TOOTHBRUSH_WIFI_BLE == mType) {
Intent intent = new Intent();
intent.setClass(ShowBleActivity.this, ToothBrushWifiBleActivity.class);
intent.putExtra("type", mType);
intent.putExtra("cid", mCid);
intent.putExtra("mac", mac);
startActivity(intent);

} else {
if (mCid == BleDeviceConfig.BLE_BOOLD_OXYGEN && mVid == 0x0012) {
//vid=12的不用握手校验,不加密
@@ -470,8 +463,8 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O
if (mAILinkBleManager != null) {
mAILinkBleManager.setOnCallbackBle(ShowBleActivity.this);
mAILinkBleManager.setOnScanFilterListener(ShowBleActivity.this);
mAILinkBleManager.initForegroundService(1, R.mipmap.ic_launcher, "前台服务", MainActivity.class);
mAILinkBleManager.startForegroundService();//启动前台服务
// mAILinkBleManager.initForegroundService(1, R.mipmap.ic_launcher, "前台服务", MainActivity.class);
// mAILinkBleManager.startForegroundService();//启动前台服务
mHandler.sendEmptyMessage(BIND_SERVER_OK);
}
}

+ 0
- 406
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/SmartMaskActivity.java View File

@@ -1,406 +0,0 @@
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.Button;
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;
import com.pingwang.bluetoothlib.listener.OnBleVersionListener;
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 java.util.ArrayList;
import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import butterknife.BindView;
import butterknife.ButterKnife;
import cn.net.aicare.modulelibrary.module.SmartMask.SmartMaskBleConfig;
import cn.net.aicare.modulelibrary.module.SmartMask.SmartMaskDeviceData;


/**
* xing<br>
* 2020/09/15<br>
* 智能口罩
*/
public class SmartMaskActivity extends BleBaseActivity implements OnCallbackDis, SmartMaskDeviceData.onNotifyData, OnBleVersionListener, OnScanFilterListener, View.OnClickListener {

private static String TAG = SmartMaskActivity.class.getName();
private final int REFRESH_DATA = 3;
@BindView(R.id.clear)
Button mClear;
@BindView(R.id.set_status)
Button mSetStatus;
@BindView(R.id.set_filter)
Button mSetFilter;
@BindView(R.id.set_fan)
Button mSetFan;
@BindView(R.id.listview)
ListView mListview;
@BindView(R.id.get_version)
Button mGetVersion;
@BindView(R.id.get_AIQ)
Button mGetAIQ;
@BindView(R.id.close_power)
Button closePower;
@BindView(R.id.set_mode)
Button setMode;
@BindView(R.id.set_payload)
Button setPayload;
private List<String> mList;
private ArrayAdapter listAdapter;
private Context mContext;
private SmartMaskDeviceData mDevice;
private String mAddress = "";
private BleSendCmdUtil mBleSendCmdUtil;
private int type = SmartMaskBleConfig.SMART_MASK;
private int mFanStatus = 0;
private boolean showPayload;


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_smart_mask);
ButterKnife.bind(this);
mContext = this;
mAddress = getIntent().getStringExtra("mac");
type = getIntent().getIntExtra("type", -1);
mBleSendCmdUtil = BleSendCmdUtil.getInstance();
init();

}

private void init() {
mList = new ArrayList<>();
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList);
mListview.setAdapter(listAdapter);

mClear.setOnClickListener(this);
mSetStatus.setOnClickListener(this);
mSetFilter.setOnClickListener(this);
mSetFan.setOnClickListener(this);
mGetVersion.setOnClickListener(this);

setPayload.setOnClickListener(this);
setMode.setOnClickListener(this);
closePower.setOnClickListener(this);
mGetAIQ.setOnClickListener(this);


}


@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.clear:
if (mList != null)
mList.clear();
mHandler.sendEmptyMessage(REFRESH_DATA);
break;
case R.id.get_version:
if (mDevice != null) {
SendBleBean sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.getBleVersion());
mDevice.sendData(sendBleBean);
}
break;
case R.id.set_status:
if (mDevice != null) {
mDevice.setStatus();
}
break;
case R.id.set_filter:
if (mDevice != null) {
mDevice.setReplaceFilter();
}
break;
case R.id.set_fan:
if (mDevice != null) {
if (mFanStatus < 2) {
mFanStatus++;
} else if (mFanStatus == 2) {
mFanStatus = 0;
}
mDevice.setFanStatus(mFanStatus);
}
break;
case R.id.get_AIQ:
if (mDevice != null) mDevice.getIAQData();
break;
case R.id.set_mode:
if (mDevice != null) mDevice.setTestMode();
break;
case R.id.close_power:
if (mDevice != null) mDevice.closePower();
break;
case R.id.set_payload:
showPayload = true;
break;
}
}


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


@Override
public void onServiceSuccess() {
BleLog.i(TAG, "服务与界面建立连接成功");
//与服务建立连接
if (mAILinkBleManager != null) {
BleDevice bleDevice = mAILinkBleManager.getBleDevice(mAddress);
if (bleDevice != null) {
mDevice = SmartMaskDeviceData.getInstance(bleDevice);
mDevice.setOnNotifyData(this);
mDevice.setOnBleVersionListener(this);
}
}
}

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

@Override
public void unbindServices() {
if (mDevice != null) {
mDevice.disconnect();
mDevice.clear();
mDevice = null;
}

}


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


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


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

@Override
public void onDisConnected(@NonNull String mac, int code) {
//TODO 连接断开
BleLog.i(TAG, "连接断开");
finish();
Toast.makeText(mContext, "连接断开", Toast.LENGTH_SHORT).show();
}

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


@Override
public void bleOpen() {

}

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

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


@Override
public void onPayloadData(byte[] data) {

if (showPayload) {
mList.add(BleStrUtils.byte2HexStr(data));
mHandler.sendEmptyMessage(REFRESH_DATA);

}
}

@Override
public void onSetStatus(int type,int status) {
String data = "";
if (type==SmartMaskBleConfig.GET_TEST_MODE){
data="进入测试模式:";
}else if (type==SmartMaskBleConfig.GET_POWER){
data="关机:";
}
switch (status) {
case 0:
data += "成功";
break;
case 1:
data += "失败";
break;


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

@Override
public void onStatus(int airIndex, int fanStatus, int power, int powerStatus, int batteryRemaining, int breathRate, int breathState, int filterDuration) {

String data = "口罩状态:";
String fanStatusStr = "风扇状态:";
switch (fanStatus) {
case 0:
fanStatusStr += "关闭";
break;
case 1:
fanStatusStr += "1 档";
break;
case 2:
fanStatusStr += "2 档";
break;
}

String powerStatusStr = "电池状态:";
switch (powerStatus) {
case 0:
powerStatusStr += "充电";
break;
case 1:
powerStatusStr += "非充电";
break;
}

String breathStateStr = "呼吸状态:";
switch (breathState) {
case 1:
breathStateStr += "呼气";
break;
case 2:
breathStateStr += "吸气";
break;
}


data += "空气指数:" + airIndex + ";" + fanStatusStr + "\n";
data += "电量:" + power + "%;" + powerStatusStr + "\n";
data += "呼吸频率:" + breathRate + "次/min;" + breathStateStr + "\n";
data += "电池续航:" + batteryRemaining + "min;滤网的总工作时长:" + filterDuration;
mList.add(TimeUtils.getTime() + data);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onFilter(int status) {
String data = "更换滤网:";
switch (status) {
case 0:
data += "成功";
break;
case 1:
data += "失败";
break;
}
mList.add(TimeUtils.getTime() + data);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onFan(int status) {
String data = "";
switch (status) {

case 0:
data = "关闭风扇";
break;
case 1:
data = "1 档风扇";
break;
case 2:
data = "2 档风扇";
break;
}
mList.add(TimeUtils.getTime() + data);
mHandler.sendEmptyMessage(REFRESH_DATA);

}


@Override
public void onIAQData(int status, int eCo2, int TvOc, int hcho) {
String data = "";
switch (status) {
case 0:
data = "OK";
break;
case 1:
data = "Heating";
break;
case 2:
data = "Error";
break;
}
mList.add(TimeUtils.getTime() + data + "\n ECO2:" + eCo2 + "\n TVOC:" + TvOc + "\n HCHO:" + hcho);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

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


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

}

+ 24
- 34
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/SphyCmdActivity.java View File

@@ -59,13 +59,9 @@ public class SphyCmdActivity extends BleBaseActivity implements OnCallbackDis, O
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;
if (msg.what == REFRESH_DATA) {
if (listAdapter != null)
listAdapter.notifyDataSetChanged();
}
}
};
@@ -148,34 +144,28 @@ public class SphyCmdActivity extends BleBaseActivity implements OnCallbackDis, O
@Override
public void onClick(View v) {
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.btn_voice:
if (mVoiceStatus == 0) {
mVoiceStatus = 1;
}else {
mVoiceStatus=0;

}
mBleDevice.setSphyVoice(mVoiceStatus);
break;
int id = v.getId();
if (id == R.id.btnVersion) {
sendBleBean.setHex(mBleSendCmdUtil.getBleVersion());
mBleDevice.sendData(sendBleBean);
} else if (id == R.id.btnBattery) {
sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus());
mBleDevice.sendData(sendBleBean);
} else if (id == R.id.btn_get_did) {
sendBleBean.setHex(mBleSendCmdUtil.getDid());
mBleDevice.sendData(sendBleBean);
} else if (id == R.id.btn_voice) {
if (mVoiceStatus == 0) {
mVoiceStatus = 1;
} else {
mVoiceStatus = 0;

case R.id.clear:
if (mList != null)
mList.clear();
mHandler.sendEmptyMessage(REFRESH_DATA);
break;
}
mBleDevice.setSphyVoice(mVoiceStatus);
} else if (id == R.id.clear) {
if (mList != null)
mList.clear();
mHandler.sendEmptyMessage(REFRESH_DATA);
}
}


+ 45
- 67
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TempCmdActivity.java View File

@@ -75,13 +75,9 @@ public class TempCmdActivity extends BleBaseActivity implements OnCallbackDis, O
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;
if (msg.what == REFRESH_DATA) {
if (listAdapter != null)
listAdapter.notifyDataSetChanged();
}
}
};
@@ -153,68 +149,50 @@ public class TempCmdActivity extends BleBaseActivity implements OnCallbackDis, O
@Override
public void onClick(View v) {
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.btn1:
String cmd = et_type.getText().toString().trim();
SendMcuBean sendDataBean = new SendMcuBean();
sendDataBean.setHex(type, cmd.getBytes());
mBleDevice.sendData(sendDataBean);
break;
case R.id.clear:
if (mList != null)
mList.clear();
mHandler.sendEmptyMessage(REFRESH_DATA);
break;
case R.id.btn_get_history:
// 读取历史记录
mBleDevice.getHistoryNew(0);
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);
int id = v.getId();
if (id == R.id.btnVersion) {
sendBleBean.setHex(mBleSendCmdUtil.getBleVersion());
mBleDevice.sendData(sendBleBean);
} else if (id == R.id.btnBattery) {
sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus());
mBleDevice.sendData(sendBleBean);
} else if (id == R.id.btn_get_did) {
sendBleBean.setHex(mBleSendCmdUtil.getDid());
mBleDevice.sendData(sendBleBean);
} else if (id == R.id.btn1) {
String cmd = et_type.getText().toString().trim();
SendMcuBean sendDataBean = new SendMcuBean();
sendDataBean.setHex(type, cmd.getBytes());
mBleDevice.sendData(sendDataBean);
} else if (id == R.id.clear) {
if (mList != null)
mList.clear();
mHandler.sendEmptyMessage(REFRESH_DATA);
} else if (id == R.id.btn_get_history) {// 读取历史记录
mBleDevice.getHistoryNew(0);
} else if (id == R.id.btn_get_mode) {// 获取设备测温模式
mBleDevice.getMode();
} else if (id == R.id.btn_get_temp) {// 获取高温报警值
mBleDevice.getTemp();
} else if (id == R.id.btn_set_mode) {// 设置设备测温模式
if (rb_single.isChecked()) {
mBleDevice.setMode(0);
} else {
mBleDevice.setMode(1);
}
} else if (id == R.id.btn_set_temp) {// 设置高温报警值
String tempStr = et_temp.getText().toString();
if (!tempStr.isEmpty()) {
if (rb_c.isChecked()) {
mBleDevice.setTemp(tempStr, 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);
}
mBleDevice.setTemp(tempStr, 1);
}
break;
case R.id.btn_del_history:
mBleDevice.getHistoryNew(3);
break;

case R.id.btnSetTime:
mBleDevice.setUnixStampNew(System.currentTimeMillis());
break;
}
} else if (id == R.id.btn_del_history) {
mBleDevice.getHistoryNew(3);
} else if (id == R.id.btnSetTime) {
mBleDevice.setUnixStampNew(System.currentTimeMillis());
}
}


+ 22
- 32
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TempGunCmdActivity.java View File

@@ -36,7 +36,6 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import cn.net.aicare.modulelibrary.module.foreheadgun.TempGunDeviceData;



/**
* xing<br>
* 2019/4/25<br>
@@ -63,13 +62,9 @@ public class TempGunCmdActivity extends BleBaseActivity implements OnCallbackDis
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;
if (msg.what == REFRESH_DATA) {
if (listAdapter != null)
listAdapter.notifyDataSetChanged();
}
}
};
@@ -125,30 +120,25 @@ public class TempGunCmdActivity extends BleBaseActivity implements OnCallbackDis
@Override
public void onClick(View v) {
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.btn1:
String cmd = et_type.getText().toString().trim();
SendMcuBean sendDataBean = new SendMcuBean();
sendDataBean.setHex(type,cmd.getBytes());
mBleDevice.sendData(sendDataBean);
break;
case R.id.clear:
if (mList != null)
mList.clear();
mHandler.sendEmptyMessage(REFRESH_DATA);
break;
int id = v.getId();
if (id == R.id.btnVersion) {
sendBleBean.setHex(mBleSendCmdUtil.getBleVersion());
mBleDevice.sendData(sendBleBean);
} else if (id == R.id.btnBattery) {
sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus());
mBleDevice.sendData(sendBleBean);
} else if (id == R.id.btn_get_did) {
sendBleBean.setHex(mBleSendCmdUtil.getDid());
mBleDevice.sendData(sendBleBean);
} else if (id == R.id.btn1) {
String cmd = et_type.getText().toString().trim();
SendMcuBean sendDataBean = new SendMcuBean();
sendDataBean.setHex(type, cmd.getBytes());
mBleDevice.sendData(sendDataBean);
} else if (id == R.id.clear) {
if (mList != null)
mList.clear();
mHandler.sendEmptyMessage(REFRESH_DATA);
}
}


+ 86
- 87
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TempHumidityActivity.java View File

@@ -178,91 +178,94 @@ public class TempHumidityActivity extends BleBaseActivity implements OnCallbackB
public void onClick(View v) {
if (TempHumidityBleUtils.getInstance() != null) {

switch (v.getId()) {
case R.id.btn_slow:
if (TempHumidityBleUtils.getInstance() != null) {
TempHumidityBleUtils.getInstance().sendSlowData();
logList.add(0, "慢速保存数据");
listAdapter.notifyDataSetChanged();
}
break;
case R.id.btn_fat:
if (TempHumidityBleUtils.getInstance() != null) {
TempHumidityBleUtils.getInstance().sendFatData();
logList.add(0, "快速速保存数据");
listAdapter.notifyDataSetChanged();

}
break;
case R.id.btn_history:
if (TempHumidityBleUtils.getInstance() != null) {
String s = et_history.getText().toString().trim();
long maxId = 0;
if (!s.isEmpty()) {
maxId = Long.parseLong(s);
}
TempHumidityBleUtils.getInstance().getOffLineRecord(maxId);
logList.add(0, "获取历史记录 时间Id" + maxId);
tv_result.setText("");
historyLogListId.clear();
historyLogList.clear();
listAdapter.notifyDataSetChanged();

}
break;
case R.id.btn_show_history:
if (listView.getVisibility() == View.VISIBLE) {
historyListAdapter.notifyDataSetChanged();
listView.setVisibility(View.GONE);
list_view_history.setVisibility(View.VISIBLE);
} else {
listView.setVisibility(View.VISIBLE);
list_view_history.setVisibility(View.GONE);
listAdapter.notifyDataSetChanged();

}
case R.id.btn_hear:
if (!isHeart) {
isHeart = true;
mMHandler.sendEmptyMessage(HEART);
logList.add(0, "开启心跳");


} else {
isHeart = false;
mMHandler.removeMessages(HEART);
logList.add(0, "关闭心跳");
}
int id = v.getId();
if (id == R.id.btn_slow) {
if (TempHumidityBleUtils.getInstance() != null) {
TempHumidityBleUtils.getInstance().sendSlowData();
logList.add(0, "慢速保存数据");
listAdapter.notifyDataSetChanged();
}
} else if (id == R.id.btn_fat) {
if (TempHumidityBleUtils.getInstance() != null) {
TempHumidityBleUtils.getInstance().sendFatData();
logList.add(0, "快速速保存数据");
listAdapter.notifyDataSetChanged();

break;
case R.id.btn_clear:
logList.clear();
}
} else if (id == R.id.btn_history) {
if (TempHumidityBleUtils.getInstance() != null) {
String s = et_history.getText().toString().trim();
long maxId = 0;
if (!s.isEmpty()) {
maxId = Long.parseLong(s);
}
TempHumidityBleUtils.getInstance().getOffLineRecord(maxId);
logList.add(0, "获取历史记录 时间Id" + maxId);
tv_result.setText("");
historyLogListId.clear();
historyLogList.clear();
listAdapter.notifyDataSetChanged();

}
} else if (id == R.id.btn_show_history) {
if (listView.getVisibility() == View.VISIBLE) {
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);
listView.setVisibility(View.GONE);
list_view_history.setVisibility(View.VISIBLE);
} else {
listView.setVisibility(View.VISIBLE);
list_view_history.setVisibility(View.GONE);
listAdapter.notifyDataSetChanged();
break;
case R.id.btn_ota:
logList.add(0, "请求ota");
TempHumidityBleUtils.getInstance().ota();
listAdapter.notifyDataSetChanged();
break;

}

if (!isHeart) {
isHeart = true;
mMHandler.sendEmptyMessage(HEART);
logList.add(0, "开启心跳");


} else {
isHeart = false;
mMHandler.removeMessages(HEART);
logList.add(0, "关闭心跳");
}
listAdapter.notifyDataSetChanged();
} else if (id == R.id.btn_hear) {
if (!isHeart) {
isHeart = true;
mMHandler.sendEmptyMessage(HEART);
logList.add(0, "开启心跳");


} else {
isHeart = false;
mMHandler.removeMessages(HEART);
logList.add(0, "关闭心跳");
}
listAdapter.notifyDataSetChanged();
} else if (id == R.id.btn_clear) {
logList.clear();
historyLogListId.clear();
historyLogList.clear();
listAdapter.notifyDataSetChanged();
historyListAdapter.notifyDataSetChanged();
} else if (id == R.id.btn_interval_one) {
logList.add(0, "上报间隔1分钟");
TempHumidityBleUtils.getInstance().setReportTime(60);
listAdapter.notifyDataSetChanged();
} else if (id == R.id.btn_interval_three) {
logList.add(0, "上报间隔3分钟");
TempHumidityBleUtils.getInstance().setReportTime(180);
listAdapter.notifyDataSetChanged();
} else if (id == R.id.btn_interval_five) {
logList.add(0, "上报间隔5分钟");
TempHumidityBleUtils.getInstance().setReportTime(300);
listAdapter.notifyDataSetChanged();
} else if (id == R.id.btn_ota) {
logList.add(0, "请求ota");
TempHumidityBleUtils.getInstance().ota();
listAdapter.notifyDataSetChanged();
}
}
}
@@ -302,15 +305,11 @@ public class TempHumidityActivity extends BleBaseActivity implements OnCallbackB
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case HEART:
if (TempHumidityBleUtils.getInstance() != null) {
TempHumidityBleUtils.getInstance().getDeviceStatus();
mMHandler.sendEmptyMessageDelayed(HEART, 5000);
}

break;

if (msg.what == HEART) {
if (TempHumidityBleUtils.getInstance() != null) {
TempHumidityBleUtils.getInstance().getDeviceStatus();
mMHandler.sendEmptyMessageDelayed(HEART, 5000);
}
}
}
}

+ 58
- 63
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TestCmdActivity.java View File

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

import android.bluetooth.BluetoothGatt;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
@@ -100,7 +101,7 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O
addLog("发送数据量:" + mNum);
}
SendDataBean sendDataBean = new SendDataBean(sendData, sendUuid, BleConfig.WRITE_DATA, sendUuidServer);
mBleDevice.sendDataNow(sendDataBean);
mBleDevice.sendData(sendDataBean);
if (intervalTime > 0) {
mHandler.sendEmptyMessageDelayed(SEND_DATA, intervalTime);
}
@@ -140,6 +141,7 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O
findViewById(R.id.btn_uuid_server).setOnClickListener(this);
findViewById(R.id.btn_log).setOnClickListener(this);
findViewById(R.id.btnIncrementSend).setOnClickListener(this);
findViewById(R.id.btnSendNow).setOnClickListener(this);

etIncrementNumber = findViewById(R.id.etIncrementNumber);
et_cmd = findViewById(R.id.et_cmd);
@@ -154,69 +156,61 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn1:
try {
mNumMax = Integer.parseInt(etIncrementNumber.getText().toString().trim());
} catch (NumberFormatException e) {
e.printStackTrace();
mNumMax = 514;
}
sendCmd = et_cmd.getText().toString().trim();
sendCmdB = BleDensityUtil.getInstance().toBytes(sendCmd);
mHandler.removeMessages(SEND_DATA);
mHandler.sendEmptyMessage(SEND_DATA);
break;

case R.id.btn_stop:
mHandler.removeMessages(SEND_DATA);
break;
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);
sendUuid = UuidUtils.getUuid(uuid);
addLog("设置特征UUID");
break;
case R.id.btn_uuid_server:
String uuidServer = et_uuid_server.getText().toString().trim().toUpperCase(Locale.ENGLISH);
sendUuidServer = UuidUtils.getUuid(uuidServer);
addLog("设置服务UUID");
break;
case R.id.btn_time:
String time = et_time.getText().toString().trim().toUpperCase(Locale.ENGLISH);
sendTime = Integer.parseInt(time);
addLog("设置时间间隔(ms):" + sendTime);
break;

case R.id.btn_notify:
String notify = et_notify.getText().toString().trim().toUpperCase(Locale.ENGLISH);
readNotify(notify, mNotify);
addLog("设置Notify UUID");
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;

case R.id.btnIncrementSend:
mIncrementSend = !mIncrementSend;
int id = v.getId();
if (id == R.id.btn1) {
try {
mNumMax = Integer.parseInt(etIncrementNumber.getText().toString().trim());
} catch (NumberFormatException e) {
e.printStackTrace();
mNumMax = 514;
}
sendCmd = et_cmd.getText().toString().trim();
sendCmdB = BleDensityUtil.getInstance().toBytes(sendCmd);
mHandler.removeMessages(SEND_DATA);
mHandler.sendEmptyMessage(SEND_DATA);
} else if (id == R.id.btn_stop) {
mHandler.removeMessages(SEND_DATA);
} else if (id == 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);
} else if (id == R.id.btn_uuid) {
String uuid = et_uuid.getText().toString().trim().toUpperCase(Locale.ENGLISH);
sendUuid = UuidUtils.getUuid(uuid);
addLog("设置特征UUID");
} else if (id == R.id.btn_uuid_server) {
String uuidServer = et_uuid_server.getText().toString().trim().toUpperCase(Locale.ENGLISH);
sendUuidServer = UuidUtils.getUuid(uuidServer);
addLog("设置服务UUID");
} else if (id == R.id.btn_time) {
String time = et_time.getText().toString().trim().toUpperCase(Locale.ENGLISH);
sendTime = Integer.parseInt(time);
addLog("设置时间间隔(ms):" + sendTime);
if (mBleDevice != null) {
mBleDevice.setSendDataInterval(sendTime);
}
} else if (id == R.id.btn_notify) {
String notify = et_notify.getText().toString().trim().toUpperCase(Locale.ENGLISH);
readNotify(notify, mNotify);
addLog("设置Notify UUID");
} else if (id == R.id.btn_notify_status) {
mNotify = !mNotify;
((Button) v).setText("" + mNotify);
} else if (id == R.id.btn_log) {
mShowLog = !mShowLog;
((Button) v).setText("log:" + (mShowLog ? "Y" : "N"));
} else if (id == R.id.btnIncrementSend) {
mIncrementSend = !mIncrementSend;
// mBleDevice.setMtu(mNumMax);
((Button) v).setText("递增发送:" + (mIncrementSend ? "Y" : "N"));
break;

((Button) v).setText("递增发送:" + (mIncrementSend ? "Y" : "N"));
} else if (id == R.id.btnSendNow) {
byte[] bytes = BleDensityUtil.getInstance().toBytes(et_cmd.getText().toString().trim());
SendDataBean sendDataBean = new SendDataBean(bytes, sendUuid, BleConfig.WRITE_DATA, sendUuidServer);
mBleDevice.sendDataNow(sendDataBean);
}
}

@@ -258,6 +252,7 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O
mBleDevice = mAILinkBleManager.getBleDevice(mAddress);
CallbackDisIm.getInstance().addListListener(this);
if (mBleDevice != null) {
mBleDevice.setConnectPriority(BluetoothGatt.CONNECTION_PRIORITY_HIGH);
mBleDevice.setOnBleOtherDataListener(this);
mBleDevice.setOnBleDeviceDataListener(this);
mBleDevice.setOnBleMtuListener(new OnBleMtuListener() {

+ 0
- 715
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TestOtaActivity.java View File

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

import android.Manifest;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
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.ListView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.activity.result.ActivityResultLauncher;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;

import com.elinkthings.bleotalibrary.bk.BKOtaManager;
import com.elinkthings.bleotalibrary.dialog.DialogOtaManager;
import com.elinkthings.bleotalibrary.jl.FileBean;
import com.elinkthings.bleotalibrary.jl.JLManager;
import com.elinkthings.bleotalibrary.listener.OnBleFlashListener;
import com.elinkthings.bleotalibrary.listener.OnBleOTAListener;
import com.elinkthings.bleotalibrary.netstrap.OPLOtaManager;
import com.pingwang.bluetoothlib.config.BleConfig;
import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.listener.OnBleDeviceDataListener;
import com.pingwang.bluetoothlib.listener.OnCallbackBle;
import com.pingwang.bluetoothlib.utils.BleLog;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.DialogStringImageBean;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.ShowListDialogFragment;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.FileUtils;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.ResultContact;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.SP;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;


/**
* xing<br>
* 2019/4/25<br>
* OTA测试界面
*/
public class TestOtaActivity extends BleBaseActivity implements OnCallbackBle, OnBleDeviceDataListener, View.OnClickListener, OnBleOTAListener, OnBleFlashListener,
ShowListDialogFragment.onDialogListener {

private static String TAG = TestOtaActivity.class.getName();
private final int REFRESH_DATA = 3;
private final int SEND_DATA = 4;

private TextView mTvVersion;
private TextView tvPath;
private Button btn_shake_hands;

private List<String> mList;
private ArrayAdapter listAdapter;
private Context mContext;
private BleDevice mBleDevice;
private String mAddress;

private ArrayList<DialogStringImageBean> mDialogList;
private String mOTAFileName;
private DialogOtaManager mDialogOtaManager;
private BKOtaManager mBKOtaManager;
private OPLOtaManager mOPLOtaManager;
private JLManager mJLManager;

private String mPath="";

private ActivityResultLauncher<Boolean> launcher;

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;
case SEND_DATA:
break;
}
}
};

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_ota);
mContext = this;
mAddress = getIntent().getStringExtra("mac");
initPermissions();
init();
FileUtils.init();
initLauncher();
}

private void initLauncher() {
launcher = registerForActivityResult(new ResultContact(), result -> {
if (!TextUtils.isEmpty(mOTAFileName)) {
mOTAFileName = result;
L.d("fileName : " + mOTAFileName);
SP.getInstance().putOtaFileName(mOTAFileName);
mTvVersion.setText(mOTAFileName);
}
});
}

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);
mTvVersion = findViewById(R.id.tv_version);
tvPath = findViewById(R.id.tv_path);
btn_shake_hands = findViewById(R.id.btn_shake_hands);
btn_shake_hands.setTag(false);
findViewById(R.id.btn_ota_connect).setOnClickListener(this);
findViewById(R.id.btn_ota_dis).setOnClickListener(this);
findViewById(R.id.btn_ota_file).setOnClickListener(this);
findViewById(R.id.btn_ota_start_585).setOnClickListener(this);
findViewById(R.id.btn_ota_start_531).setOnClickListener(this);
findViewById(R.id.btn_ota_start_580).setOnClickListener(this);
findViewById(R.id.btn_ota_bk).setOnClickListener(this);
findViewById(R.id.btn_start_ota).setOnClickListener(this);
findViewById(R.id.btn_ota_opl).setOnClickListener(this);
findViewById(R.id.btn_ota_jl).setOnClickListener(this);
findViewById(R.id.btn_watch_jl).setOnClickListener(this);
findViewById(R.id.btn_file_list).setOnClickListener(this);
findViewById(R.id.btn_file_watch_name).setOnClickListener(this);
findViewById(R.id.btn_file_watch_delete).setOnClickListener(this);
btn_shake_hands.setOnClickListener(this);

tvPath.setText("文件路径:手机" + File.separator + Environment.DIRECTORY_DOCUMENTS + File.separator + FileUtils.FILE_DIR + "\n");

mOTAFileName = SP.getInstance().getOtaFileName();
if (mOTAFileName.isEmpty())
mTvVersion.setText("xxxxxxxx");
else
mTvVersion.setText(mOTAFileName);
mDialogList = new ArrayList<>();
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String s = mList.get(position);
if (s.contains("path")){
mPath=s.substring(s.indexOf("/"),s.lastIndexOf('}')-1);
L.i("选择的path:"+mPath);
}
}
});

}


@Override
public void onItemListener(int position) {
if (mDialogList.size() > position) {
DialogStringImageBean dialogStringImageBean = mDialogList.get(position);
String name = dialogStringImageBean.getName();
mOTAFileName = name;
SP.getInstance().putOtaFileName(name);
mTvVersion.setText(mOTAFileName);
}
}


@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_ota_connect:
if (mBleDevice == null && !TextUtils.isEmpty(mAddress)) {
BleConfig.setHandshakeStatus(mAddress, ((Boolean) btn_shake_hands.getTag()));
connectBle(mAddress);
}
break;

case R.id.btn_ota_dis:
if (mBleDevice != null) {
mBleDevice.disconnect();
mBleDevice = null;
}
break;
case R.id.btn_ota_file:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
launcher.launch(true);
} else {
mDialogList.clear();
ArrayList<String> list = FileUtils.list();
for (String s : list) {
mDialogList.add(new DialogStringImageBean(s, 0));
}

ShowListDialogFragment.newInstance().setTitle("").setCancel("", 0).setCancelBlank(true).setBackground(true).setBottom(false).setList(mDialogList).setOnDialogListener(this)
.show(getSupportFragmentManager());
}
break;

case R.id.btn_ota_start_585:
startOta(DialogOtaManager.IC_TYPE_585);
break;
case R.id.btn_ota_start_531:
startOta(DialogOtaManager.IC_TYPE_531);
break;
case R.id.btn_ota_start_580:
startOta(DialogOtaManager.IC_TYPE_580);
break;
case R.id.btn_ota_bk:
startOtaBK();
break;
case R.id.btn_ota_opl:
startOtaOPL();
break;
case R.id.btn_ota_jl:
startOtaJL();
break;
case R.id.btn_watch_jl:
startWatchJL();
break;
case R.id.btn_file_list:
if (mJLManager != null) {
mJLManager.getWatchList(new JLManager.OnWatchFileListener<ArrayList<FileBean>>() {
@Override
public void onSuccess(ArrayList<FileBean> list) {
for (FileBean fileBean : list) {
mList.add(TimeUtils.getTime() + "文件信息:" + fileBean.toString());
}
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onFailed(int code, String message) {
mList.add(TimeUtils.getTime() + "读取文件列表失败:" + message);
mHandler.sendEmptyMessage(REFRESH_DATA);
}
});
}else {
mList.add(TimeUtils.getTime() + "请先初始化加载WATCH" );
mHandler.sendEmptyMessage(REFRESH_DATA);
}
break;

case R.id.btn_file_watch_name:
if (mJLManager != null) {
if (TextUtils.isEmpty(mPath)) {
mList.add(TimeUtils.getTime() + "请先选择表盘:" + mPath);
mHandler.sendEmptyMessage(REFRESH_DATA);
return;
}
mJLManager.setCurrentWatch(mPath, new JLManager.OnWatchFileListener<FileBean>() {
@Override
public void onSuccess(FileBean fileBean) {
mList.add(TimeUtils.getTime() + "当前表盘:" + (fileBean==null?"":fileBean.toString()));
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onFailed(int code, String message) {
mList.add(TimeUtils.getTime() + "读取文件列表失败:" + message);
mHandler.sendEmptyMessage(REFRESH_DATA);
}
});
}else {
mList.add(TimeUtils.getTime() + "请先初始化加载WATCH" );
mHandler.sendEmptyMessage(REFRESH_DATA);
}
break;

case R.id.btn_file_watch_delete:
if (mJLManager != null) {
if (TextUtils.isEmpty(mPath)) {
mList.add(TimeUtils.getTime() + "请先选择表盘:" + mPath);
mHandler.sendEmptyMessage(REFRESH_DATA);
return;
}
mJLManager.deleteWatchFile(mPath, new JLManager.OnWatchFileListener<Boolean>() {
@Override
public void onSuccess(Boolean list) {
mList.add(TimeUtils.getTime() + "删除表盘成功:" + mPath);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onFailed(int code, String message) {
mList.add(TimeUtils.getTime() + "删除表盘失败:" + mPath);
mHandler.sendEmptyMessage(REFRESH_DATA);
}
});
}else {
mList.add(TimeUtils.getTime() + "请先初始化加载WATCH" );
mHandler.sendEmptyMessage(REFRESH_DATA);
}
break;


case R.id.btn_start_ota:
startOta();
break;
case R.id.btn_shake_hands:
boolean status = (boolean) btn_shake_hands.getTag();
btn_shake_hands.setTag(!status);
btn_shake_hands.setText("握手:" + !status);
break;
default:
break;

}
}


private void startOta(int icType) {
if (mOTAFileName.isEmpty()) {
Toast.makeText(mContext, "请先选择文件", Toast.LENGTH_SHORT).show();
return;
}
String byFileName = FileUtils.getByFileName() + mOTAFileName;
mDialogOtaManager = DialogOtaManager.newBuilder().setOnBleOTAListener(this).setFilePath(byFileName).setIcType(icType).build(mBleDevice);
if (mDialogOtaManager != null) {
mList.add(TimeUtils.getTime() + "加载OTA包成功,点击开始OTA即可开始");
} else {
mList.add(TimeUtils.getTime() + "连接断开");
}
mHandler.sendEmptyMessage(REFRESH_DATA);
// mBleDevice.setOnDialogOTAListener(this);
// mBleDevice.startDialogOta(byFileName, icType,((Boolean) btn_shake_hands.getTag()));
}

private String mOTAVersionAll = "";

private void startOtaBK() {
if (mOTAFileName.isEmpty()) {
Toast.makeText(mContext, "请先选择文件", Toast.LENGTH_SHORT).show();
return;
}
String byFileName = FileUtils.getByFileName() + mOTAFileName;
mBKOtaManager = BKOtaManager.newBuilder().setOnBleOTAListener(this).setFilePath(byFileName).build(mBleDevice);
mOTAVersionAll = "";
mDeviceVersionAll = "";
if (mBKOtaManager != null) {
long deviceVersion = mBKOtaManager.getDeviceVersion();
long romVersion = mBKOtaManager.getRomVersion();
mOTAVersionAll = deviceVersion + "_" + romVersion;
mList.add(TimeUtils.getTime() + "加载OTA包成功,点击开始OTA即可开始");
mList.add(TimeUtils.getTime() + "OTA包版本:" + mOTAVersionAll);
} else {
mList.add(TimeUtils.getTime() + "连接断开");
}
mHandler.sendEmptyMessage(REFRESH_DATA);
}


private void startOtaOPL() {
if (mOTAFileName.isEmpty()) {
Toast.makeText(mContext, "请先选择文件", Toast.LENGTH_SHORT).show();
return;
}
String byFileName = FileUtils.getByFileName() + mOTAFileName;
mOPLOtaManager = OPLOtaManager.newBuilder(mContext).setFilePath(byFileName).setOnBleOTAListener(this).build(mBleDevice);

mList.add(TimeUtils.getTime() + "加载OTA包成功,点击开始OTA即可开始");
mHandler.sendEmptyMessage(REFRESH_DATA);
}


private void startOtaJL() {
if (mOTAFileName.isEmpty()) {
Toast.makeText(mContext, "请先选择文件", Toast.LENGTH_SHORT).show();
return;
}
String byFileName = FileUtils.getByFileName() + mOTAFileName;
mJLManager = JLManager.newBuilder(mContext).setType(JLManager.TYPE_OTA).setFilePath(byFileName).setOnBleOTAListener(this).build(mBleDevice);
mList.add(TimeUtils.getTime() + "加载OTA包成功,点击开始OTA即可开始");
mHandler.sendEmptyMessage(REFRESH_DATA);
}


private void startWatchJL() {
if (mOTAFileName.isEmpty()) {
Toast.makeText(mContext, "请先选择文件", Toast.LENGTH_SHORT).show();
return;
}
String byFileName = FileUtils.getByFileName() + mOTAFileName;



mJLManager = JLManager.newBuilder(mContext).setType(JLManager.TYPE_WATCH).setFilePath(byFileName).setOnBleFlashListener(this).build(mBleDevice);
mList.add(TimeUtils.getTime() + "加载WATCH包成功,可以进行相关操作了");
mHandler.sendEmptyMessage(REFRESH_DATA);
}




private void startOta() {
if (mDialogOtaManager != null) {
mDialogOtaManager.startOta();

} else if (mBKOtaManager != null) {
if (!TextUtils.isEmpty(mOTAVersionAll)) {
if (mOTAVersionAll.equals(mDeviceVersionAll)) {
mList.add(TimeUtils.getTime() + "OTA版本与设备版本相同");
mHandler.sendEmptyMessage(REFRESH_DATA);
return;
}
}
mBKOtaManager.startOta();
mBKOtaManager = null;
} else if (mOPLOtaManager != null) {
mOPLOtaManager.startOta();
} else if (mJLManager != null) {
if (mJLManager.getType() == JLManager.TYPE_OTA) {
mJLManager.startOta();
mList.add(TimeUtils.getTime() + "开始OTA:");
} else {
mJLManager.startFlash();
mList.add(TimeUtils.getTime() + "开始表盘:");
}
mHandler.sendEmptyMessage(REFRESH_DATA);
return;
} else {
mList.add(TimeUtils.getTime() + "请先选择OTA类型");
mHandler.sendEmptyMessage(REFRESH_DATA);
return;
}
mList.add(TimeUtils.getTime() + "OTA已开始,请耐心等待");
mHandler.sendEmptyMessage(REFRESH_DATA);
}


/**
* 初始化请求权限
*/
private void initPermissions() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
}
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode != 1) {
return;
}
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
} else {
if (ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[0])) {
//权限请求失败,但未选中“不再提示”选项
new AlertDialog.Builder(this).setTitle("提示").setMessage("请求使用定位权限搜索蓝牙设备").setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//引导用户至设置页手动授权
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getApplicationContext().getPackageName(), null);
intent.setData(uri);
startActivity(intent);
}
}).setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (dialog != null) {
dialog.cancel();
}

}
}).show();
} else {
//权限请求失败,选中“不再提示”选项
// T.showShort(MainActivity.this, "获取权限失败");
new AlertDialog.Builder(this).setTitle("提示").setMessage("请求使用定位权限搜索蓝牙设备").setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//引导用户至设置页手动授权
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getApplicationContext().getPackageName(), null);
intent.setData(uri);
startActivity(intent);
}
}).setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (dialog != null) {
dialog.cancel();
}

}
}).show();
}

}

}

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


@Override
public void onServiceSuccess() {
BleLog.i(TAG, "服务与界面建立连接成功");
//与服务建立连接
if (mAILinkBleManager != null) {
mBleDevice = mAILinkBleManager.getBleDevice(mAddress);
mAILinkBleManager.setOnCallbackBle(this);
if (mDialogOtaManager != null) {
mDialogOtaManager.setOnBleOTAListener(this);
}

if (mJLManager != null) {
//在OTA状态
mJLManager.setOnBleOTAListener(this);
mJLManager.onBtDeviceConnection(mBleDevice);

}
}
}

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

@Override
public void unbindServices() {
if (mBleDevice != null) {
if (mJLManager != null)
mJLManager.release();
mBleDevice.disconnect();
mBleDevice = null;
}
if (mAILinkBleManager !=null) {
mAILinkBleManager.removeOnCallbackBle(this);
}
}

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


@Override
public void onConnecting(@NonNull String mac) {
//TODO 连接中
if (!mac.equalsIgnoreCase(mAddress)) {
return;
}
BleLog.i(TAG, "连接中");
mList.add(TimeUtils.getTime() + "连接中");
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onDisConnected(@NonNull String mac, int code) {
// 连接断开
if (!mac.equalsIgnoreCase(mAddress)) {
return;
}

BleLog.i(TAG, "连接断开:" + code);
mBleDevice = null;
mList.add(TimeUtils.getTime() + "连接断开:" + code);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onServicesDiscovered(@NonNull String mac) {
// 连接成功(获取服务成功)
if (!mac.equalsIgnoreCase(mAddress)) {
return;
}


BleLog.i(TAG, "连接成功(获取服务成功)");
mList.add(TimeUtils.getTime() + "连接成功");
mHandler.sendEmptyMessage(REFRESH_DATA);
onServiceSuccess();
}


@Override
public void bleOpen() {

}

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

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


@Override
protected void onDestroy() {
super.onDestroy();
if (mHandler != null) {
mHandler.removeCallbacksAndMessages(null);
}
BleLog.i(TAG, "onDestroy");
}



@Override
public void onOtaSuccess() {
mList.add(TimeUtils.getTime() + "OTA成功");
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onOtaFailure(int cmd, String err) {
mList.add(TimeUtils.getTime() + "OTA失败:" + err);
mHandler.sendEmptyMessage(REFRESH_DATA);
// if (mBleDevice != null) {
// mBleDevice.disconnect();
// }
}

private int progressOld;

@Override
public void onOtaProgress(float progress, int currentCount, int maxCount) {
int progressInt = (int) progress;
if (progressInt == -1) {
mList.add(TimeUtils.getTime() + "OTA进度:正在校验升级文件");
mHandler.sendEmptyMessage(REFRESH_DATA);
return;
}
String showProgress = "OTA进度:" + progressInt + "%";
if (maxCount > 1) {
showProgress = "OTA进度:" + progressInt + "%" + " 总共:" + maxCount + " 当前进行:" + currentCount;
}
if (progressOld != progressInt) {
progressOld = progressInt;
mList.add(TimeUtils.getTime() + showProgress);
mHandler.sendEmptyMessage(REFRESH_DATA);
}
}

@Override
public void onReconnect(String mac) {
mList.add(TimeUtils.getTime() + "OTA回连:" + mac);
mHandler.sendEmptyMessage(REFRESH_DATA);
mHandler.postDelayed(() -> {
BleConfig.setHandshakeStatus(mAddress, ((Boolean) btn_shake_hands.getTag()));
connectBle(mAddress);
}, 2000);
}

private String mDeviceVersionAll = "";



// @Override
// public void onDeviceVersion(String deviceVersion, String romVersion) {
// mDeviceVersionAll = deviceVersion + "_" + romVersion;
// mList.add(TimeUtils.getTime() + "设备版本:" + mDeviceVersionAll);
// mHandler.sendEmptyMessage(REFRESH_DATA);
// }


@Override
public void onFlashSuccess() {
mList.add(TimeUtils.getTime() + "表盘成功");
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onFlashFailure(int cmd, String err) {
mList.add(TimeUtils.getTime() + "表盘失败:" + err);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onFlashProgress(float progress, int currentCount, int maxCount) {
int progressInt = (int) progress;
if (progressInt == -1) {
mList.add(TimeUtils.getTime() + "表盘进度:正在校验升级文件");
mHandler.sendEmptyMessage(REFRESH_DATA);
return;
}
String showProgress = "表盘进度:" + progressInt + "%";
if (maxCount > 1) {
showProgress = "表盘进度:" + progressInt + "%" + " 总共:" + maxCount + " 当前进行:" + currentCount;
}
if (progressOld != progressInt) {
progressOld = progressInt;
mList.add(TimeUtils.getTime() + showProgress);
mHandler.sendEmptyMessage(REFRESH_DATA);
}
}

@Override
public void onFlashStatus(int status) {

}
}

+ 22
- 32
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TpmsConnectCmdActivity.java View File

@@ -35,7 +35,6 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import cn.net.aicare.modulelibrary.module.tpms.TpmsDeviceData;



/**
* xing<br>
* 2019/9/2<br>
@@ -62,13 +61,9 @@ public class TpmsConnectCmdActivity extends BleBaseActivity implements OnCallbac
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;
if (msg.what == REFRESH_DATA) {
if (listAdapter != null)
listAdapter.notifyDataSetChanged();
}
}
};
@@ -124,30 +119,25 @@ public class TpmsConnectCmdActivity extends BleBaseActivity implements OnCallbac
@Override
public void onClick(View v) {
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.btn1:
String cmd = et_type.getText().toString().trim();
SendMcuBean sendDataBean = new SendMcuBean();
sendDataBean.setHex(type,cmd.getBytes());
mBleDevice.sendData(sendDataBean);
break;
case R.id.clear:
if (mList != null)
mList.clear();
mHandler.sendEmptyMessage(REFRESH_DATA);
break;
int id = v.getId();
if (id == R.id.btnVersion) {
sendBleBean.setHex(mBleSendCmdUtil.getBleVersion());
mBleDevice.sendData(sendBleBean);
} else if (id == R.id.btnBattery) {
sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus());
mBleDevice.sendData(sendBleBean);
} else if (id == R.id.btn_get_did) {
sendBleBean.setHex(mBleSendCmdUtil.getDid());
mBleDevice.sendData(sendBleBean);
} else if (id == R.id.btn1) {
String cmd = et_type.getText().toString().trim();
SendMcuBean sendDataBean = new SendMcuBean();
sendDataBean.setHex(type, cmd.getBytes());
mBleDevice.sendData(sendDataBean);
} else if (id == R.id.clear) {
if (mList != null)
mList.clear();
mHandler.sendEmptyMessage(REFRESH_DATA);
}
}


+ 93
- 33
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TransmissionActivity.java View File

@@ -14,11 +14,11 @@ import android.widget.TextView;

import androidx.annotation.Nullable;

import com.google.gson.Gson;
import com.pingwang.bluetoothlib.AILinkBleManager;
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 java.lang.ref.WeakReference;
@@ -26,6 +26,7 @@ import java.util.ArrayList;
import java.util.List;

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

@@ -34,9 +35,11 @@ import cn.net.aicare.modulelibrary.module.Transmission.TransmissionDeviceData;
*/
public class TransmissionActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, TransmissionDeviceData.MyBleCallback {

private final String TRANSMISSION_DATA_KEY = "TRANSMISSION_DATA_KEY";
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 EditText et, et_cid, et_a6, et_customize, etReceive, etSend;
private Button send, send_a6, bt_clear, bt_clear_log, btnSetAutoSend, send_customize;
private Button btDis, btConnect;
private ListView mListView;
private List<String> mlogList;
private final int ToRefreUi = 1;
@@ -45,6 +48,8 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic
private String mAddress;
private TransmissionDeviceData mTransmissionDeviceData;
private boolean isPause = false;
private Gson mGson = new Gson();
private SaveDataBean mSaveDataBean;

@Override
public void onServiceSuccess() {
@@ -92,27 +97,42 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic
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);
btnSetAutoSend = findViewById(R.id.btnSetAutoSend);
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);
etReceive = findViewById(R.id.etReceive);
etSend = findViewById(R.id.etSend);
bt_clear = findViewById(R.id.bt_clear);
bt_clear_log = findViewById(R.id.bt_clear_log);
mListView = findViewById(R.id.listview);
btDis = findViewById(R.id.btDis);
btConnect = findViewById(R.id.btConnect);
send.setOnClickListener(this);
send_a6.setOnClickListener(this);
send_customize.setOnClickListener(this);
findViewById(R.id.send_name).setOnClickListener(this);
findViewById(R.id.btPause).setOnClickListener(this);
bt_clear.setOnClickListener(this);
bt_cid.setOnClickListener(this);
bt_clear_log.setOnClickListener(this);
btDis.setOnClickListener(this);
btConnect.setOnClickListener(this);
btnSetAutoSend.setOnClickListener(this);
mAddress = getIntent().getStringExtra("mac");
mlogList = new ArrayList<>();
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mlogList);
mListView.setAdapter(listAdapter);
mGson = new Gson();
String json = (String) SP.getInstance().get(TRANSMISSION_DATA_KEY, "");
if (!TextUtils.isEmpty(json)) {
mSaveDataBean = mGson.fromJson(json, SaveDataBean.class);
et_cid.setText(mSaveDataBean.cid);
et.setText(mSaveDataBean.a7Data);
et_a6.setText(mSaveDataBean.a6Data);
et_customize.setText(mSaveDataBean.customizeData);
}


}

@Override
@@ -135,11 +155,6 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic
} else if (id == R.id.bt_clear_log) {
mlogList.clear();
mMHandler.sendEmptyMessage(ToRefreUi);
} else if (id == R.id.bt_cid) {

if (mTransmissionDeviceData != null) {
mTransmissionDeviceData.getCid();
}
} else if (id == R.id.send_a6) {
String hex = et_a6.getText().toString().toUpperCase().trim();
if (!TextUtils.isEmpty(hex)) {
@@ -156,17 +171,43 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic
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));
}
}else if (id == R.id.btPause){
} else if (id == R.id.btnSetAutoSend) {
mReceiveStr = etReceive.getText().toString().trim();
mSendStr = etSend.getText().toString().trim();
addLog("设置成功:发送的数据通过A7通道发送");
} else if (id == R.id.btPause) {
isPause = !isPause;
} else if (id == R.id.btDis) {
AILinkBleManager.getInstance().disconnectAll();
} else if (id == R.id.btConnect) {
AILinkBleManager.getInstance().connectDevice(mAddress);
}
}

private String mReceiveStr = "";
private String mSendStr = "";

/**
* 检查数据自动发送
*
* @param data 数据
*/
public void checkDataAutoSend(String data) {
data = data.replace(" ","");
if (TextUtils.isEmpty(mReceiveStr) || TextUtils.isEmpty(mSendStr) || TextUtils.isEmpty(data)) {
return;
}
if (data.startsWith(mReceiveStr)) {
byte[] hexStr = BleStrUtils.stringToByte(mSendStr);
String cid = et_cid.getText().toString().toUpperCase().trim();
int hexStrCid = Integer.parseInt(cid, 16);
if (mTransmissionDeviceData != null) {
mTransmissionDeviceData.setSendData(hexStrCid, hexStr);
}
}
}


@Override
public void onVersion(String version) {

@@ -174,7 +215,8 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic

@Override
public void showData(String data, int type) {
addLog( "收A7 payload数据" + TimeUtils.getTimeSSS() + "cid=" + type + "\n" + data);
addLog("收A7 payload数据" + TimeUtils.getTimeSSS() + "cid=" + type + "\n" + data);
checkDataAutoSend(data);
}

@Override
@@ -190,11 +232,13 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic
@Override
public void otherData(byte[] hex, String data) {
addLog("收 透传数据" + TimeUtils.getTime() + data);
checkDataAutoSend(data);
}

@Override
public void a6Data(byte[] hex, String data) {
addLog("收A6 payload数据" + TimeUtils.getTime() + data);
checkDataAutoSend(data);
}

@Override
@@ -202,6 +246,12 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic
addLog("发 " + TimeUtils.getTimeSSS() + data);
}

@Override
public void onServicesDiscovered(String mac) {
onServiceSuccess();
mlogList.add(0, "连接成功: " + mac);
mMHandler.sendEmptyMessage(ToRefreUi);
}

@Override
public void onDisConnected(String mac, int code) {
@@ -213,17 +263,10 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case ToRefreUi:
if (listAdapter != null) {
listAdapter.notifyDataSetChanged();
}
break;

default:

break;

if (msg.what == ToRefreUi) {
if (listAdapter != null) {
listAdapter.notifyDataSetChanged();
}
}
}
}
@@ -234,15 +277,32 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic
if (mAILinkBleManager != null) {
mAILinkBleManager.disconnectAll();
}
if (mSaveDataBean == null) {
mSaveDataBean = new SaveDataBean();
}
mSaveDataBean.cid = et_cid.getText().toString().trim();
mSaveDataBean.a7Data = et.getText().toString().trim();
mSaveDataBean.a6Data = et_a6.getText().toString().trim();
mSaveDataBean.customizeData = et_customize.getText().toString().trim();
String json = mGson.toJson(mSaveDataBean);
SP.getInstance().put(TRANSMISSION_DATA_KEY, json);
}


private void addLog(String log) {
if (isPause){
if (isPause) {
return;
}
mlogList.add(0, log);
mMHandler.sendEmptyMessage(ToRefreUi);
}


class SaveDataBean {
String cid = "";
String a7Data = "";
String a6Data = "";
String customizeData = "";
}

}

+ 83
- 65
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/WeightScaleBleActivity.java View File

@@ -29,12 +29,13 @@ import java.util.List;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.AddUserDialog;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.bean.UserBean;
import cn.net.aicare.modulelibrary.module.BodyFatScale.AppHistoryRecordBean;
import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatBleUtilsData;
import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatDataUtil;
import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatRecord;
import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatUserBean;
import cn.net.aicare.modulelibrary.module.BodyFatScale.McuHistoryRecordBean;
import cn.net.aicare.modulelibrary.module.BodyFatScale.User;

/**
* Ble体脂秤
@@ -50,8 +51,8 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl
private MHandler mMHandler;
private EditText mEditText;
private RadioButton kg, jing, stlb, lb;
private List<User> mUsers;
private User selectUser;
private List<BodyFatUserBean> mBodyFatUserBeans;
private BodyFatUserBean mSelectBodyFatUserBean;
private int weighunit = BodyFatDataUtil.KG;
private ListView loglistView;
private ListView userlistView;
@@ -71,7 +72,7 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl
private void initView() {
findViewById(R.id.history).setOnClickListener(this);
findViewById(R.id.userlist).setOnClickListener(this);
findViewById(R.id.user).setOnClickListener(this);
findViewById(R.id.btnUser).setOnClickListener(this);
findViewById(R.id.adduser).setOnClickListener(this);
findViewById(R.id.syntime).setOnClickListener(this);
kg = findViewById(R.id.kg);
@@ -96,29 +97,29 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mlogList);
loglistView.setAdapter(listAdapter);

User defaultUser = getdefault();
selectUser = defaultUser;
BodyFatUserBean defaultBodyFatUserBean = getdefault();
mSelectBodyFatUserBean = defaultBodyFatUserBean;

mUsers = new ArrayList<>();
mUsers.add(defaultUser);
mBodyFatUserBeans = new ArrayList<>();
mBodyFatUserBeans.add(defaultBodyFatUserBean);

mUserlogList = new ArrayList<>();
mUserlogList.add(defaultUser.toString());
mUserlogList.add(defaultBodyFatUserBean.toString());

userAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mUserlogList);
userlistView.setAdapter(userAdapter);
}

private User getdefault() {
User user = new User();
user.setModeType(BodyFatDataUtil.MODE_ORDINARY);
user.setSex(BodyFatDataUtil.SEX_MAN);
user.setAge(18);
user.setHeight(170);
user.setAdc(560);
user.setWeight(50);
user.setId(1);
return user;
private BodyFatUserBean getdefault() {
BodyFatUserBean bodyFatUserBean = new BodyFatUserBean();
bodyFatUserBean.setModeType(BodyFatDataUtil.MODE_ORDINARY);
bodyFatUserBean.setSex(BodyFatDataUtil.SEX_MAN);
bodyFatUserBean.setAge(18);
bodyFatUserBean.setHeight(170);
bodyFatUserBean.setAdc(560);
bodyFatUserBean.setWeight(50);
bodyFatUserBean.setId(1);
return bodyFatUserBean;
}

private void setUnitinit() {
@@ -262,7 +263,7 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl

if (status == BodyFatDataUtil.WEIGHT_RESULT) {
//稳定体重
selectUser.setWeight(weight);
mSelectBodyFatUserBean.setWeight(weight);
mMHandler.sendEmptyMessage(TO_REFRE_USER);
}

@@ -309,13 +310,13 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl
case BodyFatDataUtil.TEST_FINISH:
mlogList.add(0, "测量状态:" + status + " 测量完成");
if (bodyFatBleUtilsData != null) {
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().updataPresentUser(selectUser));
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().updataPresentUser(mSelectBodyFatUserBean));
}
break;
case BodyFatDataUtil.MUC_REQUEST_USER_INFO:
mlogList.add(0, "测量状态:" + status + "请求用户信息");
if (bodyFatBleUtilsData != null) {
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().setUserInfo(selectUser, BleDeviceConfig.WEIGHT_BODY_FAT_SCALE));
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().setUserInfo(mSelectBodyFatUserBean, BleDeviceConfig.WEIGHT_BODY_FAT_SCALE));
}
break;
default:
@@ -328,7 +329,7 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl
@Override
public void onAdc(int adc, int algorithmic) {
mlogList.add(0, "阻抗:" + adc + " 算法位:" + algorithmic);
selectUser.setAdc(adc);
mSelectBodyFatUserBean.setAdc(adc);
mMHandler.sendEmptyMessage(TO_REFRE_USER);
mMHandler.sendEmptyMessage(ToRefreUi);
}
@@ -488,53 +489,70 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl
@Override
public void onClick(View v) {
int id = v.getId();
switch (id) {
case R.id.history:
if (bodyFatBleUtilsData != null)
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().requestSynHistory());
break;
case R.id.user:
if (!mEditText.getText().toString().trim().isEmpty()) {
int userid = Integer.parseInt(mEditText.getText().toString().trim());
if (mUsers.size() >= userid) {
selectUser = mUsers.get(userid - 1);
if (bodyFatBleUtilsData != null) {
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().updataPresentUser(selectUser));
}
if (id == R.id.history) {
if (bodyFatBleUtilsData != null)
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().requestSynHistory());
} else if (id == R.id.btnUser) {
if (!mEditText.getText().toString().trim().isEmpty()) {
int userid = Integer.parseInt(mEditText.getText().toString().trim());
if (mBodyFatUserBeans.size() >= userid) {
mSelectBodyFatUserBean = mBodyFatUserBeans.get(userid - 1);
if (bodyFatBleUtilsData != null) {
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().updataPresentUser(mSelectBodyFatUserBean));
}
}
break;
case R.id.userlist:
for (User mUser : mUsers) {
if (bodyFatBleUtilsData != null)
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().setUserInfoList(mUser));
}
}
} else if (id == R.id.userlist) {
for (BodyFatUserBean mBodyFatUserBean : mBodyFatUserBeans) {
if (bodyFatBleUtilsData != null)
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().updateUsersComplete());
break;
case R.id.adduser:
AddUserDialog addUserDialog = new AddUserDialog(new AddUserDialog.OnDialogListener() {
@Override
public void tvSucceedListener(User user) {
user.setId(mUsers.size() + 1);
mUsers.add(user);
mUserlogList.add(user.toString());
userAdapter.notifyDataSetChanged();
}
});
addUserDialog.show(getSupportFragmentManager());
break;
case R.id.syntime:
if (bodyFatBleUtilsData != null) {
SendBleBean sendBleBean = BodyFatDataUtil.getInstance().synSysTime();
Log.e("time", BleStrUtils.byte2HexStr(sendBleBean.getHex()));
bodyFatBleUtilsData.sendData(sendBleBean);
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().setUserInfoList(mBodyFatUserBean));
}
if (bodyFatBleUtilsData != null)
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().updateUsersComplete());
} else if (id == R.id.adduser) {
AddUserDialog addUserDialog = new AddUserDialog(new AddUserDialog.OnDialogListener() {
@Override
public void tvSucceedListener(UserBean user) {
user.setId(mBodyFatUserBeans.size() + 1);
mBodyFatUserBeans.add(getBodyFatUserBean(user));
mUserlogList.add(user.toString());
userAdapter.notifyDataSetChanged();
}
break;
});
addUserDialog.show(getSupportFragmentManager());
} else if (id == R.id.syntime) {
if (bodyFatBleUtilsData != null) {
SendBleBean sendBleBean = BodyFatDataUtil.getInstance().synSysTime();
Log.e("time", BleStrUtils.byte2HexStr(sendBleBean.getHex()));
bodyFatBleUtilsData.sendData(sendBleBean);
}
}

}

private BodyFatUserBean getBodyFatUserBean(UserBean userBean) {
BodyFatUserBean bean = new BodyFatUserBean();
if (userBean.getSex() == UserBean.SEX_MAN) {
bean.setSex(BodyFatDataUtil.SEX_MAN);
} else {
bean.setSex(BodyFatDataUtil.SEX_FEMAN);
}
if (userBean.getModeType() == UserBean.MODE_ATHLETE) {
bean.setModeType(BodyFatDataUtil.MODE_ATHLETE);
} else if (userBean.getModeType() == UserBean.MODE_PREGNANT) {
bean.setModeType(BodyFatDataUtil.MODE_PREGNANT);
} else {
bean.setModeType(BodyFatDataUtil.MODE_ORDINARY);
}
bean.setId(userBean.getId());
bean.setAge(userBean.getAge());
bean.setHeight(userBean.getHeight());
bean.setWeight(userBean.getWeight());
bean.setAdc(userBean.getAdc());
return bean;
}


private final int ToRefreUi = 300;
private final int TO_REFRE_USER = 301;

@@ -552,9 +570,9 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl
case TO_REFRE_USER:
if (userAdapter != null) {
mUserlogList.clear();
if (mUsers!=null) {
for (User user : mUsers) {
mUserlogList.add(user.toString());
if (mBodyFatUserBeans !=null) {
for (BodyFatUserBean bodyFatUserBean : mBodyFatUserBeans) {
mUserlogList.add(bodyFatUserBean.toString());
}
}
userAdapter.notifyDataSetChanged();

+ 0
- 872
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/WifiConfigActivity.java View File

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

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CompoundButton;
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;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
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 cn.net.aicare.modulelibrary.module.wifi.WifiConfig;
import cn.net.aicare.modulelibrary.module.wifi.WifiUtils;

/**
* wifi配置界面
*/
public class WifiConfigActivity extends AppCompatActivity implements View.OnClickListener, WifiUtils.OnWifiEventListener {
private String TAG = WifiConfigActivity.class.getName();
private EditText ssid, paw, key, sn, devicename;
private ListView mListView;
private ArrayAdapter logadapter;
private List<String> loglist;
private Button btn_connect;
private Button btn_weight_result;
private WifiUtils mWifiUtils;
private Button btn_getdeviceid;
private Button btn_login;
private Button get_record;
private String SN;
private String myDeviceId;
private String token;
private long appid;
private List<Long> bodyId;
private RadioButton kg, jing, stlb, lb;
private String mDeviceName;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//禁止横屏
setContentView(R.layout.activity_wifi_config);
ssid = findViewById(R.id.ssid);
paw = findViewById(R.id.password);
key = findViewById(R.id.key);
btn_getdeviceid = findViewById(R.id.deviceid);
btn_weight_result = findViewById(R.id.weight_result);
get_record = findViewById(R.id.get_record);
mListView = findViewById(R.id.log_list);
btn_connect = findViewById(R.id.btn_connect);
btn_login = findViewById(R.id.btn_login);
sn = findViewById(R.id.sn);
devicename = findViewById(R.id.device_name);
btn_login.setOnClickListener(this);
btn_weight_result.setOnClickListener(this);
btn_connect.setOnClickListener(this);
btn_getdeviceid.setOnClickListener(this);
get_record.setOnClickListener(this);
findViewById(R.id.clear_log).setOnClickListener(this);
findViewById(R.id.clear_record).setOnClickListener(this);
loglist = new ArrayList<>();
logadapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, loglist);
mListView.setAdapter(logadapter);
mWifiUtils = new WifiUtils(this, this);
mWifiUtils.setLoopSendEnable(false);
mWifiUtils.setInterval(5);
ssid.setText(mWifiUtils.getSsidstring() == null ? "Elink-wif" : mWifiUtils.getSsidstring().replace("\"", ""));
paw.setText("elink1234567890");
key.setText("1234567812345678");
sn.setText("574d0868174f882078a5784b1f8d48");
devicename.setText("wifi秤");
bodyId = new ArrayList<>();
kg = findViewById(R.id.kg);
jing = findViewById(R.id.jin);
stlb = findViewById(R.id.st_lb);
lb = findViewById(R.id.lb);
kg.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
new Thread(new Runnable() {
@Override
public void run() {
try {
setUnit(WifiConfig.KG);
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
}).start();

}
}
});
jing.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
new Thread(new Runnable() {
@Override
public void run() {
try {
setUnit(WifiConfig.JIN);
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
}).start();
}
}
});
stlb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
new Thread(new Runnable() {
@Override
public void run() {
try {
setUnit(WifiConfig.ST);
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
}).start();
}
}
});
lb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
new Thread(new Runnable() {
@Override
public void run() {
try {
setUnit(WifiConfig.LB);
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
}).start();
}
}
});

}

@Override
public void onClick(View v) {
if (v.getId() == R.id.btn_connect) {
if (mWifiUtils.getRunning() == 0) {
btn_connect.setText("停止");

mWifiUtils.startSendData(ssid.getText().toString().trim(), paw.getText().toString().trim(), key.getText().toString().trim());
} else {
mWifiUtils.end();
btn_connect.setText("开始配网");
}
} else if (v.getId() == R.id.deviceid) {
SN = sn.getText().toString().trim();
mDeviceName = devicename.getText().toString().trim();
if (appid != 0 && token != null && !SN.isEmpty() && !mDeviceName.isEmpty()) {
new Thread(new Runnable() {
@Override
public void run() {
try {
getDeviceid();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
}).start();

} else {
if (appid == 0 || token == null) {
loglist.add(0, "未登录");
}
if (SN.isEmpty()) {
loglist.add(0, "没有SN号");
}
if (mDeviceName.isEmpty()) {
loglist.add(0, "没有设备名称");
}
}
logadapter.notifyDataSetChanged();

} else if (v.getId() == R.id.weight_result) {
if (appid != 0 && token != null && myDeviceId != null) {

new Thread(new Runnable() {
@Override
public void run() {
try {
getWeight(appid, token, myDeviceId);
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
}).start();

} else {
if (appid == 0 || token == null) {
loglist.add(0, "未登录");
}
if (myDeviceId == null) {
loglist.add(0, "没有得到设备Id");
}
}
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.clear_log) {
loglist.clear();
logadapter.notifyDataSetChanged();
} else if (v.getId() == R.id.clear_record) {
if (bodyId.size() != 0) {
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < bodyId.size(); i++) {
try {
delRecord(bodyId.get(i));
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
}
}).start();
} else {
loglist.add(0, "没有BodyFatId");
logadapter.notifyDataSetChanged();
}
} else if (v.getId() == R.id.get_record) {
new Thread(new Runnable() {
@Override
public void run() {
try {
getTestRecord();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
}).start();
}
}

@Override
public void onEvent(int code) {
runOnUiThread(new Runnable() {
@Override
public void run() {
switch (code) {
case WifiConfig.KEY_ILLEGAL:
loglist.add(0, "加密key非法");
break;
case WifiConfig.ERROR_EXCEPTIONAL:
loglist.add(0, "异常");
break;
case WifiConfig.INFORMATION_SUCCESSFUL:
loglist.add(0, "生成数据类info 成功");
break;
case WifiConfig.DEVICE_CONNECTION_SUCCESSFUL:
mWifiUtils.end();
loglist.add(0, "设备联网成功成功");
btn_connect.setText("开始配网");


//调取登录 通过SN号去获取deviceId
break;
case WifiConfig.START_SEND_DATA:
loglist.add(0, "开始发送加密包");
break;
case WifiConfig.ERROR_START_SEND_DATA:
loglist.add(0, "开始发送加密包,出错");
break;
case WifiConfig.START_RECEIVE_DATA:
loglist.add(0, "开始接收设备数据");
break;
case WifiConfig.ERROR_START_RECEIVE_DATA:
loglist.add(0, "开始接收设备数据,出错");
break;
case WifiConfig.SSID_KEY_NULL:
loglist.add(0, "ssid为空或key为空");
break;

}

logadapter.notifyDataSetChanged();
}
});
}


@Override
protected void onDestroy() {
super.onDestroy();
mWifiUtils.onDestory();
}


public void login() throws Throwable {

URL uri = new URL("http://test.ailink.app.aicare.net.cn/api/user/login?key=inet_elink&username=dhls@qq.com&password=dc483e80a7a0bd9ef71d8cf973673924");
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 getWeight(long appid, String token, String deviceId) throws Throwable {

StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("http://test.ailink.app.aicare.net.cn/api/BFScale/list?key=inet_elink&appUserId=");
stringBuilder.append(appid);
stringBuilder.append("&token=");
stringBuilder.append(token);
stringBuilder.append("&deviceId=");
stringBuilder.append(deviceId);
stringBuilder.append("&subUserId=1&maxId=0");
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);
JSONArray datajson = jsonObject.getJSONArray("data");
bodyId.clear();
for (int i = 0; i < datajson.length(); i++) {
bodyId.add(datajson.getJSONObject(i).getLong("bodyFatId"));
}
Log.i(TAG, result);
runOnUiThread(new Runnable() {
@Override
public void run() {
loglist.add(0, result);
logadapter.notifyDataSetChanged();
loglist.add(0, "总共有:" + bodyId.size());
logadapter.notifyDataSetChanged();
}
});

} else {
runOnUiThread(new Runnable() {
@Override
public void run() {
loglist.add(0, "请求失败");
logadapter.notifyDataSetChanged();
}
});
}
}


public void getDeviceid() throws Throwable {

StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("http://test.ailink.app.aicare.net.cn/api/device/getDeviceBySN?key=inet_elink&appUserId=");
stringBuilder.append(appid);
stringBuilder.append("&token=");
stringBuilder.append(token);
stringBuilder.append("&deviceSN=");
stringBuilder.append(SN);
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();
}
}
});
bindDevice();


} else {
Log.i(TAG, "Post方式请求失败");
}
}

public void bindDevice() throws Throwable {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("http://test.ailink.app.aicare.net.cn/api/device/update?key=inet_elink&appUserId=");
stringBuilder.append(appid);
stringBuilder.append("&token=");
stringBuilder.append(token);
stringBuilder.append("&deviceId=");
stringBuilder.append(myDeviceId);
stringBuilder.append("&roomId=4326&deviceName=");
stringBuilder.append(mDeviceName);
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);
runOnUiThread(new Runnable() {
@Override
public void run() {
loglist.add(0, "绑定设备" + result);
logadapter.notifyDataSetChanged();
}
});


} else {
runOnUiThread(new Runnable() {
@Override
public void run() {
loglist.add(0, "绑定设备失败");
logadapter.notifyDataSetChanged();
}
});
}

}


public void delRecord(Long bodyid) throws Throwable {

StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("http://test.ailink.app.aicare.net.cn/api/BFScale/delete?key=inet_elink&appUserId=");
stringBuilder.append(appid);
stringBuilder.append("&token=");
stringBuilder.append(token);
stringBuilder.append("&bodyFatId=");
stringBuilder.append(bodyid);
stringBuilder.append("");
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);

runOnUiThread(new Runnable() {
@Override
public void run() {

loglist.add(0, result);

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();
}

public void setUnit(int unit) throws Throwable {
if (appid == 0 || token == null || SN == null || SN.isEmpty() || mDeviceName == null || mDeviceName.isEmpty()) {
runOnUiThread(new Runnable() {
@Override
public void run() {

loglist.add(0, "请先登录,然后获取设备id");

logadapter.notifyDataSetChanged();
}
});
return;
}
StringBuilder stringBuilder = new StringBuilder();
// http://test.ailink.app.aicare.net.cn/api/device/update?key=inet_elink&appUserId=10429&token=57dce920-8521-42e9-9040-157d08c7d922&deviceId=3001&roomId=4326&deviceName=WIFI秤测试&deviceUnit=1
stringBuilder.append("http://test.ailink.app.aicare.net.cn/api/device/update?key=inet_elink&appUserId=");
stringBuilder.append(appid);
stringBuilder.append("&token=");
stringBuilder.append(token);
stringBuilder.append("&deviceId=");
stringBuilder.append(myDeviceId);
stringBuilder.append("&roomId=4326&deviceName=");
stringBuilder.append(mDeviceName);
stringBuilder.append("&deviceUnit=");
stringBuilder.append(unit);
Log.e("设置单位", 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);

runOnUiThread(new Runnable() {
@Override
public void run() {

loglist.add(0, result);

logadapter.notifyDataSetChanged();
}
});


} else {
runOnUiThread(new Runnable() {
@Override
public void run() {

loglist.add(0, "请求失败");

logadapter.notifyDataSetChanged();
}
});

}

}

public void getTestRecord() throws Throwable {

StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("http://test.ailink.app.aicare.net.cn/api/deDataTest/getDeDataTestPage?key=inet_elink&appUserId=");
stringBuilder.append(appid);
stringBuilder.append("&token=");
stringBuilder.append(token);
stringBuilder.append("&maxId=0");
stringBuilder.append("&sortColumns=");
stringBuilder.append("id desc");

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);
JSONObject datajson = jsonObject.getJSONObject("data");
JSONArray listjson = datajson.getJSONArray("list");
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < listjson.length(); i++) {
long id = listjson.getJSONObject(i).getLong("id");
// String createTime="数据时间 "+getDateDefault(listjson.getJSONObject(i).getLong("createTime"));
String encryptData = "请求的加密值: " + listjson.getJSONObject(i).getString("encryptData");
// String decryptData = "解密结果: " + listjson.getJSONObject(i).getString("decryptData");
stringBuffer.append("id: ");
stringBuffer.append(id);
stringBuffer.append("\n");
stringBuffer.append(encryptData);

stringBuffer.append("\n=================\n");
}
runOnUiThread(new Runnable() {
@Override
public void run() {

loglist.add(0, "测试数据\n" + stringBuffer.toString());
logadapter.notifyDataSetChanged();


}
});


} else {

}
}

public static String getDateDefault(Long time) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);
return simpleDateFormat.format(time);
}

public void getPermission() {
String[] permissions = {android.Manifest.permission.ACCESS_COARSE_LOCATION,};

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
//当前系统大于等于6.0
for (String perssion : permissions) {
int isGranted = ContextCompat.checkSelfPermission(this, perssion);
if (isGranted != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{perssion}, 1);
}
}
LocationManager lm = (LocationManager) this.getSystemService(this.LOCATION_SERVICE);
if (!lm.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
/*Toast.makeText(this, "检测到未开启GPS定位服务,需要开启才能扫描到附件WiFi信息,请开启", Toast.LENGTH_SHORT).show();
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(3 * 1000); //sleep s
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();*/
AlertDialog dialog = new AlertDialog.Builder(this)
.setTitle("警告!")
.setMessage("检测到未开启GPS定位服务,需要开启才能扫描到附件WiFi信息,请开启")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivityForResult(intent, 1);
}
}).show();
}
}
}

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case 1: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.d("Mainactivity", "onRequestPermissionsResult granted");
} else {
Log.d("Mainactivity", "onRequestPermissionsResult denied");
AlertDialog dialog = new AlertDialog.Builder(this)
.setTitle("警告!")
.setMessage("需要授予定位权限才能扫描到附件WiFi信息")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//一般情况下如果用户不授权的话,功能是无法运行的,做退出处理
finish();
}
}).show();
}
break;
}
default:
break;
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}

+ 0
- 6
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/base/AppBaseActivity.java View File

@@ -28,8 +28,6 @@ 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 butterknife.ButterKnife;
import butterknife.Unbinder;


/**
@@ -48,7 +46,6 @@ public abstract class AppBaseActivity extends AppCompatActivity {
protected TextView mTvTopTitle;
@Nullable
protected Toolbar mToolbar;
private Unbinder bind;
//--------------ble---------------
/**
* 需要申请的权限
@@ -147,7 +144,6 @@ public abstract class AppBaseActivity extends AppCompatActivity {
* 初始化
*/
protected final void init() {
bind = ButterKnife.bind(this);
addInit();
initView();
initData();
@@ -358,7 +354,5 @@ public abstract class AppBaseActivity extends AppCompatActivity {
if (mHandler != null) {
mHandler.removeCallbacksAndMessages(null);
}
if (bind != null)
bind.unbind();
}
}

+ 0
- 6
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/base/BleAppBaseActivity.java View File

@@ -19,8 +19,6 @@ import java.lang.ref.WeakReference;

import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.HintDataDialogFragment;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.CheckPermissionUtils;
import butterknife.ButterKnife;
import butterknife.Unbinder;


/**
@@ -39,7 +37,6 @@ public abstract class BleAppBaseActivity extends BleBaseActivity {
protected TextView mTvTopTitle;
@Nullable
protected Toolbar mToolbar;
private Unbinder bind;
//--------------ble---------------
/**
* 需要申请的权限
@@ -138,7 +135,6 @@ public abstract class BleAppBaseActivity extends BleBaseActivity {
* 初始化
*/
protected final void init() {
bind = ButterKnife.bind(this);
addInit();
initView();
initData();
@@ -271,7 +267,5 @@ public abstract class BleAppBaseActivity extends BleBaseActivity {
if (mHandler != null) {
mHandler.removeCallbacksAndMessages(null);
}
if (bind != null)
bind.unbind();
}
}

+ 29
- 25
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/base/BleBaseActivity.java View File

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

@@ -44,43 +45,45 @@ public abstract class BleBaseActivity extends AppCompatActivity {
}

/**
* 搜索蓝牙(默认通过uuid过滤)
* @param timeOut 超时,小于等于0代表永不超时
* 设置标题
*
* @param title 标题
*/
protected void startScanBle(long timeOut){
if (AILinkBleManager.getInstance().isInitOk()){
AILinkBleManager.getInstance().startScan(timeOut,BleConfig.UUID_SERVER_AILINK);
public void setTitleData(String title) {
ActionBar supportActionBar = getSupportActionBar();
if (supportActionBar != null) {
supportActionBar.setTitle(title);
}
}

/**
* 主动停止搜索
* 搜索蓝牙(默认通过uuid过滤)
*
* @param timeOut 超时,小于等于0代表永不超时
*/
protected void stopScanBle(){
if (AILinkBleManager.getInstance().isInitOk()){
AILinkBleManager.getInstance().stopScan();
protected void startScanBle(long timeOut) {
if (AILinkBleManager.getInstance().isInitOk()) {
AILinkBleManager.getInstance().startScan(timeOut, BleConfig.UUID_SERVER_AILINK);
}
}


/**
* 设置标题
*
* @param title 标题
* 主动停止搜索
*/
public void setTitleData(String title) {
ActionBar supportActionBar = getSupportActionBar();
if (supportActionBar != null) {
supportActionBar.setTitle(title);
protected void stopScanBle() {
if (AILinkBleManager.getInstance().isInitOk()) {
AILinkBleManager.getInstance().stopScan();
}
}


/**
* 连接设备
*
* @param bleValueBean 搜索到的地址
*/
protected void connectBle(BleValueBean bleValueBean){
if (AILinkBleManager.getInstance().isInitOk()){
protected void connectBle(BleValueBean bleValueBean) {
if (AILinkBleManager.getInstance().isInitOk()) {
AILinkBleManager.getInstance().stopScan();
AILinkBleManager.getInstance().connectDevice(bleValueBean);
}
@@ -88,10 +91,11 @@ public abstract class BleBaseActivity extends AppCompatActivity {

/**
* 连接设备
*
* @param mac 设备的地址
*/
protected void connectBle(String mac){
if (AILinkBleManager.getInstance().isInitOk()){
protected void connectBle(String mac) {
if (AILinkBleManager.getInstance().isInitOk()) {
AILinkBleManager.getInstance().stopScan();
AILinkBleManager.getInstance().connectDevice(mac);
}
@@ -117,11 +121,11 @@ public abstract class BleBaseActivity extends AppCompatActivity {
onServiceErr();
}
});
}else {
mHandler.postDelayed(()->{
} else {
mHandler.postDelayed(() -> {
mAILinkBleManager = AILinkBleManager.getInstance();
onServiceSuccess();
},500);
}, 500);
}

}

+ 18
- 14
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/base/BleNewBaseActivity.java View File

@@ -23,14 +23,15 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
public abstract class BleNewBaseActivity extends AppCompatActivity {

private static String TAG = BleNewBaseActivity.class.getName();
protected AILinkBleManager mBleManager;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActionBar supportActionBar = getSupportActionBar();
if (supportActionBar != null)
if (supportActionBar != null) {
supportActionBar.setTitle(getString(R.string.app_name) + BuildConfig.VERSION_NAME);
}
init();
}

@@ -41,32 +42,32 @@ public abstract class BleNewBaseActivity extends AppCompatActivity {

/**
* 搜索蓝牙(默认通过uuid过滤)
*
* @param timeOut 超时,小于等于0代表永不超时
*/
protected void startScanBle(long timeOut){
if (AILinkBleManager.getInstance()!=null){
AILinkBleManager.getInstance().startScan(timeOut,BleConfig.UUID_SERVER_AILINK);
protected void startScanBle(long timeOut) {
if (AILinkBleManager.getInstance() != null) {
AILinkBleManager.getInstance().startScan(timeOut, BleConfig.UUID_SERVER_AILINK);
}
}

/**
* 主动停止搜索
*/
protected void stopScanBle(){
if (AILinkBleManager.getInstance()!=null){
protected void stopScanBle() {
if (AILinkBleManager.getInstance() != null) {
AILinkBleManager.getInstance().stopScan();
}
}




/**
* 连接设备
*
* @param bleValueBean 搜索到的地址
*/
protected void connectBle(BleValueBean bleValueBean){
if (AILinkBleManager.getInstance()!=null){
protected void connectBle(BleValueBean bleValueBean) {
if (AILinkBleManager.getInstance() != null) {
AILinkBleManager.getInstance().stopScan();
AILinkBleManager.getInstance().connectDevice(bleValueBean.getMac());
}
@@ -74,10 +75,11 @@ public abstract class BleNewBaseActivity extends AppCompatActivity {

/**
* 连接设备
*
* @param mac 设备的地址
*/
protected void connectBle(String mac){
if (AILinkBleManager.getInstance()!=null){
protected void connectBle(String mac) {
if (AILinkBleManager.getInstance() != null) {
AILinkBleManager.getInstance().stopScan();
AILinkBleManager.getInstance().connectDevice(mac);
}
@@ -90,6 +92,7 @@ public abstract class BleNewBaseActivity extends AppCompatActivity {
AILinkBleManager.getInstance().init(this, new AILinkBleManager.onInitListener() {
@Override
public void onInitSuccess() {
mBleManager = AILinkBleManager.getInstance();
onServiceSuccess();
}

@@ -98,7 +101,8 @@ public abstract class BleNewBaseActivity extends AppCompatActivity {
onServiceErr();
}
});
}else {
} else {
mBleManager = AILinkBleManager.getInstance();
onServiceSuccess();
}


+ 147
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/base/KBleBaseNewActivity.kt View File

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

import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.LoadingIosDialogFragment
import android.R
import android.app.Activity
import android.content.Context
import android.content.pm.ActivityInfo
import android.os.Build
import android.os.Bundle
import android.view.KeyEvent
import android.view.MenuItem
import android.view.MotionEvent
import android.view.View
import android.view.WindowManager
import android.view.inputmethod.InputMethodManager
import androidx.annotation.ColorRes
import androidx.appcompat.widget.Toolbar
import androidx.core.content.ContextCompat
import androidx.viewbinding.ViewBinding

abstract class KBleBaseNewActivity<T : ViewBinding> : BleNewBaseActivity() {

val TAG = this.javaClass.name
lateinit var mContext: Context
@ColorRes
var mStatusBarColor: Int = 0
lateinit var binding: T

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = getLayoutView()
// initWindow()
setContentView(binding.root)
mContext = this
init()

}

/**
* 初始化
*/
private fun init() {
findTopView()
initData()
initListener()
}


private fun findTopView() {
binding.root.findViewWithTag<View>("tbPublicTitle")?.let {
if (it is Toolbar) {
it.title = ""
setSupportActionBar(it)
}
}
}

/**
* 获取当前activity的布局
*
* @return int
*/
protected abstract fun getLayoutView(): T


open fun initWindow() {
//禁止横屏
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
//设置状态栏文字为黑色
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
}
setStatusBarColor(mStatusBarColor)
}

fun setStatusBarColor(color: Int) {
if (color != 0) {
this.window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
this.window.statusBarColor = ContextCompat.getColor(this, color)
}
}

/**
* 返回键
*/
override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
if (keyCode == KeyEvent.KEYCODE_BACK && event.repeatCount == 0) {
myFinish()
return true
}
return super.onKeyDown(keyCode, event)
}

/**
* 返回
*/
protected open fun myFinish() {
finish()
}


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

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


override fun onOptionsItemSelected(item: MenuItem): Boolean {
val id = item.itemId
if (id == R.id.home) {
myFinish()
return true
}
return super.onOptionsItemSelected(item)
}

//--------------------------start Loading--------------------------
private var mDialogFragment: LoadingIosDialogFragment? = null

/**
* 显示加载
*/
fun showLoading() {
if (mDialogFragment == null) {
mDialogFragment = LoadingIosDialogFragment()
}
mDialogFragment!!.show(supportFragmentManager)
}

/**
* 关闭加载
*/
fun dismissLoading() {
if (mDialogFragment != null) {
mDialogFragment!!.dismiss()
}
}

//--------------------------end Loading--------------------------


}

+ 37
- 1
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/config/BleDeviceConfig.java View File

@@ -234,7 +234,6 @@ public class BleDeviceConfig {
public final static int TEMP_INSTRUMENT = 0x003D;



/**
* wifi+ble血压计
*/
@@ -280,7 +279,38 @@ public class BleDeviceConfig {
*/
public static final int BLE_GAS_DETECTOR = 0x006F;

/**
* 恶魔之眼(BLE)
*/
public static final int BLE_DEMON_EYES = 0x0071;

/**
* 气体检测仪(Ailink )
*/
public static final int WIFI_BLE_GAS_DETECTOR = 0x0074;
/**
* BLE HMI体脂秤
*/
public static final int BLE_HMI_BODY_FAT_SCALE = 0x0076;

/**
* 智能码表
*/
public final static int BLE_SMART_CYCLING_TABLE = 0x0077;
/**
* 华普红外测温枪
*/
public final static int BLE_HP_INFRARED_TEMPERATURE = 0x0020;

/**
* 热线式风速计
*/
public static final int CID_0072_HOTLINE_ANE = 0x0072;

/**
* 病例宝
*/
public final static int BLE_CASE_TREASURE = 0x0080;

//------------------特殊
/**
@@ -316,4 +346,10 @@ public class BleDeviceConfig {
* wifi_ble_OTA
*/
public final static int WIFI_BLE_OTA = -11;

/**
* Ble发送速度测试
*/
public static final int BLE_SEND_SPEED_TEST = -12;

}

+ 12
- 12
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/AddUserDialog.java View File

@@ -17,23 +17,23 @@ 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;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.bean.UserBean;

public class AddUserDialog extends DialogFragment implements View.OnClickListener , SeekBar.OnSeekBarChangeListener, RadioGroup.OnCheckedChangeListener {
private boolean mCancelBlank;
private TextView id;
private SeekBar agesb, heightsb, weightsb, adcsb;
private RadioGroup sexRG, modeRG;
private User user;
private UserBean user;
private TextView tv_move_data_ok, tv_move_data_cancel;
private OnDialogListener mOnDialogListener;


public AddUserDialog( OnDialogListener onDialogListener) {
user=new User();
user.setModeType(BodyFatDataUtil.MODE_ORDINARY);
user.setSex(BodyFatDataUtil.SEX_MAN);
user=new UserBean();
user.setModeType(UserBean.MODE_ORDINARY);
user.setSex(UserBean.SEX_MAN);
user.setAge(0);
user.setHeight(0);
user.setAdc(0);
@@ -136,15 +136,15 @@ public class AddUserDialog extends DialogFragment implements View.OnClickListene
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
if (checkedId == R.id.man) {
user.setSex(BodyFatDataUtil.SEX_MAN);
user.setSex(UserBean.SEX_MAN);
} else if (checkedId == R.id.female) {
user.setSex(BodyFatDataUtil.SEX_FEMAN);
user.setSex(UserBean.SEX_FEMAN);
} else if (checkedId == R.id.ordinary) {
user.setModeType(BodyFatDataUtil.MODE_ORDINARY);
user.setModeType(UserBean.MODE_ORDINARY);
} else if (checkedId == R.id.athlete) {
user.setModeType(BodyFatDataUtil.MODE_ATHLETE);
user.setModeType(UserBean.MODE_ATHLETE);
} else if (checkedId == R.id.pregnant) {
user.setModeType(BodyFatDataUtil.MODE_PREGNANT);
user.setModeType(UserBean.MODE_PREGNANT);
}
settext();
}
@@ -165,7 +165,7 @@ public class AddUserDialog extends DialogFragment implements View.OnClickListene
/**
* 成功的点击事件
*/
default void tvSucceedListener(User user) {
default void tvSucceedListener(UserBean user) {
}

}

+ 5
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/LoadingIosDialogFragment.java View File

@@ -40,6 +40,11 @@ public class LoadingIosDialogFragment extends DialogFragment {
return show;
}

public static LoadingIosDialogFragment newInstance() {
return new LoadingIosDialogFragment();
}


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

+ 5
- 11
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/ShowListDialogFragment.java View File

@@ -46,7 +46,7 @@ public class ShowListDialogFragment extends DialogFragment implements View.OnCli
private int mCancelColor;
private CharSequence mCancel = "";
private CharSequence mTitle = "";
private ArrayList<DialogStringImageBean> mList;
private ArrayList<DialogStringImageBean> mList = new ArrayList<>();
private boolean mBottom;
/**
* 是否显示灰色背景
@@ -135,7 +135,7 @@ public class ShowListDialogFragment extends DialogFragment implements View.OnCli
tv_dialog_list_data_hint = view.findViewById(R.id.tv_dialog_list_data_hint);
rv_dialog_list.setLayoutManager(new LinearLayoutManager(mContext));
rv_dialog_list.addItemDecoration(new MyItemDecoration(mContext, LinearLayoutManager.VERTICAL, 1, mContext.getResources()
.getColor(R.color.public_press_bg)));
.getColor(R.color.public_press_bg)));

}

@@ -145,10 +145,7 @@ public class ShowListDialogFragment extends DialogFragment implements View.OnCli
*/
private void initData(ArrayList<DialogStringImageBean> list, CharSequence title, CharSequence cancel, int cancelColor) {

if (mList == null) {
mList = new ArrayList<>();
}
mAdapter = new DialogStringImageAdapter(mContext, mList, position -> {
mAdapter = new DialogStringImageAdapter(mContext, list, position -> {
if (mOnDialogListener != null) {
//item点击事件
mOnDialogListener.onItemListener(position);
@@ -157,7 +154,7 @@ public class ShowListDialogFragment extends DialogFragment implements View.OnCli
});
rv_dialog_list.setAdapter(mAdapter);

setList(list);
setList(new ArrayList<DialogStringImageBean>(list));
setTitle(title);
setCancel(cancel, cancelColor);
mTvCancel.setOnClickListener(this);
@@ -199,13 +196,10 @@ public class ShowListDialogFragment extends DialogFragment implements View.OnCli
* 修改列表中的内容
*/
public ShowListDialogFragment setList(List<DialogStringImageBean> list) {
if (mList == null) {
mList = new ArrayList<>();
}
mList.clear();
mList.addAll(list);
if (tv_dialog_list_data_hint != null) {
if (mList.size() == 0) {
if (mList.isEmpty()) {
tv_dialog_list_data_hint.setVisibility(View.VISIBLE);
} else {
tv_dialog_list_data_hint.setVisibility(View.GONE);

+ 131
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/bean/UserBean.java View File

@@ -0,0 +1,131 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.bean;

public class UserBean {
/**
* 普通模式 Normal mode
*/
public final static int MODE_ORDINARY = 0;
/**
* 运动员模式 Athlete mode
*/
public final static int MODE_ATHLETE = 1;
/**
* 孕妇模式 Maternity mode
*/
public final static int MODE_PREGNANT = 2;

/**
* 男 Male
*/
public final static int SEX_MAN = 1;

/**
* 女 Female
*/
public final static int SEX_FEMAN = 0;

/**
* 性别,0女,1男
* Gender, 0 female, 1 male
*/
private int sex;
/**
* 年龄 0~120
* Age 0 ~ 120
*/
private int age;
/**
* 身高cm 0~269
* Height cm 0 ~ 269
*/
private int height;
/**
* 体重kg 1位小数 0~250
* Weight kg 1 decimal place 0 ~ 250
*/
private float weight;
/**
* 模式,0普通,1运动员
* Mode, 0 Normal, 1 Athlete
*/
private int modeType;
/**
* 1到8
*/
private int id;
/**
* 阻抗值,正常0~1000
* Impedance value, normal 0 ~ 1000
*/
private int adc;


public int getAdc() {
return adc;
}

public void setAdc(int adc) {
this.adc = adc;
}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public int getSex() {
return sex;
}

public void setSex(int sex) {
this.sex = sex;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public int getHeight() {
return height;
}

public void setHeight(int height) {
this.height = height;
}

public float getWeight() {
return weight;
}

public void setWeight(float weight) {
this.weight = weight;
}

public int getModeType() {
return modeType;
}

public void setModeType(int modeType) {
this.modeType = modeType;
}

@Override
public String toString() {
return "BodyFatUserBean{" +
"sex=" + sex +
", age=" + age +
", height=" + height +
", weight=" + weight +
", modeType=" + modeType +
", id=" + id +
", adc=" + adc +
'}';
}
}

+ 28
- 40
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/find/FindDeviceActivity.java View File

@@ -80,46 +80,34 @@ public class FindDeviceActivity extends BleBaseActivity implements View.OnClickL

@Override
public void onClick(View v) {
switch (v.getId()) {

case R.id.btn_connect_info_list:
if (mFindDeviceData!=null) {
mFindDeviceData.getConnectInfoList();
}
break;
case R.id.btn_get_connect_number:
if (mFindDeviceData!=null) {
mFindDeviceData.getConnectDeviceNumber();
}
break;
case R.id.btn_device_id_0:
sendCmd(0);
break;
case R.id.btn_device_id_1:
sendCmd(1);
break;
case R.id.btn_device_id_2:
sendCmd(2);
break;
case R.id.btn_device_id_3:
sendCmd(3);
break;
case R.id.btn_device_id_4:
sendCmd(4);
break;
case R.id.btn_device_id_5:
sendCmd(5);
break;
case R.id.btn_device_id_6:
sendCmd(6);
break;
case R.id.btn_clear:
mList.clear();
if (mListAdapter != null) {
mListAdapter.notifyDataSetChanged();
}
break;

int id = v.getId();
if (id == R.id.btn_connect_info_list) {
if (mFindDeviceData != null) {
mFindDeviceData.getConnectInfoList();
}
} else if (id == R.id.btn_get_connect_number) {
if (mFindDeviceData != null) {
mFindDeviceData.getConnectDeviceNumber();
}
} else if (id == R.id.btn_device_id_0) {
sendCmd(0);
} else if (id == R.id.btn_device_id_1) {
sendCmd(1);
} else if (id == R.id.btn_device_id_2) {
sendCmd(2);
} else if (id == R.id.btn_device_id_3) {
sendCmd(3);
} else if (id == R.id.btn_device_id_4) {
sendCmd(4);
} else if (id == R.id.btn_device_id_5) {
sendCmd(5);
} else if (id == R.id.btn_device_id_6) {
sendCmd(6);
} else if (id == R.id.btn_clear) {
mList.clear();
if (mListAdapter != null) {
mListAdapter.notifyDataSetChanged();
}
}
}


+ 14
- 19
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/find/FindDeviceNewActivity.java View File

@@ -147,30 +147,25 @@ public class FindDeviceNewActivity extends BleAppBaseActivity implements View.On

@Override
public void onClick(View v) {
switch (v.getId()) {

case R.id.btn_scan_ble:
if (mFindDeviceData != null) {
int id = v.getId();
if (id == R.id.btn_scan_ble) {
if (mFindDeviceData != null) {
// mFindDeviceData.setNearbyDevice(1, 10, new byte[]{});
// if (rv_device.getVisibility() != View.VISIBLE) {
// rv_device.setVisibility(View.VISIBLE);
// }
mFindDeviceBeanList.clear();
if (mFindDeviceAdapter != null) {
mFindDeviceAdapter.notifyDataSetChanged();
}
mFindDeviceData.getConnectInfoList();
mAILinkBleManager.startScan(30 * 1000);
mFindDeviceBeanList.clear();
if (mFindDeviceAdapter != null) {
mFindDeviceAdapter.notifyDataSetChanged();
}
break;

case R.id.btn_clear:
mList.clear();
if (mListAdapter != null) {
mListAdapter.notifyDataSetChanged();
}
break;

mFindDeviceData.getConnectInfoList();
mAILinkBleManager.startScan(30 * 1000);
}
} else if (id == R.id.btn_clear) {
mList.clear();
if (mListAdapter != null) {
mListAdapter.notifyDataSetChanged();
}
}
}


+ 26
- 20
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/home/HomeDataManager.java View File

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


import java.util.ArrayList;

import aicare.net.cn.sdk.ailinksdkdemoandroid.ADWeightScaleCmdActivity;
@@ -11,13 +12,11 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.BloodOxygenActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.BloodSugar4GActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.BroadcastBloodOxygenActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.BroadcastScaleActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.ClearShakeHandsActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.ConnectBleTestActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.HeightCmdActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.HeightWeightScaleActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.ShowBleActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.SmartMaskActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.SphyCmdActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.TempCmdActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.TempGunCmdActivity;
@@ -25,17 +24,17 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.TempHumidityActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.TestCmdActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.TransmissionActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.WeightScaleBleActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.WifiConfigActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig;
import aicare.net.cn.sdk.ailinksdkdemoandroid.find.FindDeviceNewActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.PublicBleNetworkCmdActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.PublicMqttActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.PublicWifiBleOtaActivity;
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.barometric_temp_humidity.BarometricTempHygrometerActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_0020_hu_infrared_temp.Ble0020HpInfraredTempActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_nutrition.BleNutritionActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_nutrition.BleNutritionNutrientActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_speed_test.BleSpeedTestActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.blood_glucose.BloodGlucoseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.blood_pressure_tc.BloodPressureTcActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.body_scale_4g.BodyScale4GActivity;
@@ -43,6 +42,7 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.broadcast_height.Broadcast
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.bw05watch.Bw05WatchActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.caseTreasure.BleCaseTreasureActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.coffee_scale.CoffeeScaleActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.eight_bodyfat.EightBodyFatMcuActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.eight_bodyfat.EightBodyfatActivity;
@@ -50,6 +50,8 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.eight_bodyfat.dual_band.Ei
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.gasDetector.GasDetectorActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.gasDetectorPlus.GasDetectorPlusActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.hmiBodyFat.HmiBodyFatScaleBleActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.leaone_broadcast.LeaOneBroadcastActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.meat_probe.MeatProbeActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.meat_probe_charger.MeatProbeChargerActivity;
@@ -60,7 +62,8 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ropeskipping.RopeSkippingS
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.ToothBrushWifiBleActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.smart_cycling_table.SmartCyclingTableActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.toothbrush.ToothBrushWifiNewBleActivity;
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.modules.wifi_ble_scale.WeightScaleWifiBleActivity;
@@ -90,14 +93,18 @@ public class HomeDataManager {
beanList.add(new JumpBean(BleDeviceConfig.PUBLIC_BLE_NETWORK, R.string.item_ble_universal_distribution_network, publicJumpActivity, PublicBleNetworkCmdActivity.class));
// Ble test
beanList.add(new JumpBean(BleDeviceConfig.BLE_TEST, R.string.item_ble_test, publicJumpActivity, TestCmdActivity.class));
// Ble send speed test
beanList.add(new JumpBean(BleDeviceConfig.BLE_SEND_SPEED_TEST, R.string.ble_send_speed_test, publicJumpActivity, BleSpeedTestActivity.class));
// Ble connect test
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_ble_connect_test, null, ConnectBleTestActivity.class));
// OTA通用
// OTA通用
// beanList.add(new JumpBean(BleDeviceConfig.OTA, R.string.item_ota, publicJumpActivity, TestOtaActivity.class));
//MQTT通用
beanList.add(new JumpBean(BleDeviceConfig.OTA, R.string.item_mqtt, null, PublicMqttActivity.class));
// 透传
beanList.add(new JumpBean(BleDeviceConfig.PENETRATE, R.string.item_penetrate, publicJumpActivity, TransmissionActivity.class));
//HMI四电极体脂秤
beanList.add(new JumpBean(BleDeviceConfig.BLE_HMI_BODY_FAT_SCALE, R.string.item_hmi_body_fat_scale, publicJumpActivity, HmiBodyFatScaleBleActivity.class));
//气体检测仪(Ailink )
beanList.add(new JumpBean(BleDeviceConfig.WIFI_BLE_GAS_DETECTOR, R.string.gas_detector_puls, publicJumpActivity, GasDetectorPlusActivity.class));
//气体检测仪
beanList.add(new JumpBean(BleDeviceConfig.BLE_GAS_DETECTOR, R.string.gas_detector, publicJumpActivity, GasDetectorActivity.class));
// 广播秤
@@ -165,11 +172,10 @@ public class HomeDataManager {
// 探针充电盒
beanList.add(new JumpBean(BleDeviceConfig.MEAT_PROBE_CHARGER, R.string.item_probe_charging_box, publicJumpActivity, MeatProbeChargerActivity.class));
// 牙刷(wifi+ble)
beanList.add(new JumpBean(BleDeviceConfig.TOOTHBRUSH_WIFI_BLE, R.string.item_toothbrush_wifi_ble, publicJumpActivity, ToothBrushWifiBleActivity.class));
// beanList.add(new JumpBean(BleDeviceConfig.TOOTHBRUSH_WIFI_BLE, R.string.item_toothbrush_wifi_ble, publicJumpActivity, ToothBrushWifiOnOnBleActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.TOOTHBRUSH_WIFI_BLE, R.string.item_toothbrush_wifi_ble, publicJumpActivity, ToothBrushWifiNewBleActivity.class));
// 牙刷测试
beanList.add(new JumpBean(BleDeviceConfig.TOOTHBRUSH_TEST, R.string.item_toothbrush_test, publicJumpActivity, ToothbrushTestActivity.class));
// 口罩
beanList.add(new JumpBean(BleDeviceConfig.SMART_MASK, R.string.item_smart_mask, publicJumpActivity, SmartMaskActivity.class));
// 筋膜枪
beanList.add(new JumpBean(BleDeviceConfig.FASCIA_GUN, R.string.item_fascia_gun, publicJumpActivity, FasciaGunActivity.class));
// 跳绳
@@ -203,18 +209,18 @@ public class HomeDataManager {
beanList.add(new JumpBean(BleDeviceConfig.WIFI_BLE_OTA, BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_WIFI_BLE, R.string.wifi_ble_ota_tool, publicJumpActivity, PublicWifiBleOtaActivity.class));
//bw05暨芯手表
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_bw05_watch, null, Bw05WatchActivity.class));

// 智能码表
beanList.add(new JumpBean(BleDeviceConfig.BLE_SMART_CYCLING_TABLE, R.string.ble_smart_cycling_table, publicJumpActivity, SmartCyclingTableActivity.class));
// 华普红外测温枪
beanList.add(new JumpBean(BleDeviceConfig.BLE_HP_INFRARED_TEMPERATURE, R.string.ble_0020_hu_temp, publicJumpActivity, Ble0020HpInfraredTempActivity.class));
//病例宝
beanList.add(new JumpBean(BleDeviceConfig.BLE_CASE_TREASURE, R.string.ble_case_treasure, publicJumpActivity, BleCaseTreasureActivity.class));

return beanList;
}

public static ArrayList<JumpBean> getHideDataList() {
ArrayList<JumpBean> hideList = new ArrayList<>();
Class<?> publicJumpActivity = ShowBleActivity.class;
// 不握手不加密
hideList.add(new JumpBean(BleDeviceConfig.CLEAR_SHAKE_HANDS, R.string.item_no_handshake_encryption, publicJumpActivity, ClearShakeHandsActivity.class));
// wifi 配置
hideList.add(new JumpBean(IGNORE_TYPE, R.string.item_wifi_config, null, WifiConfigActivity.class));
return hideList;
}


/**
* 要跳转的目标Activity

+ 6
- 1
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/home/HomeListAdapter.java View File

@@ -57,7 +57,12 @@ public class HomeListAdapter extends RecyclerView.Adapter<HomeListAdapter.MyHold

@Override
public void onBindViewHolder(@NonNull MyHolder holder, int position) {
holder.tvContent.setText(context.getString(list.get(position).getItemNameResId()));
JumpBean jumpBean = list.get(position);
String cidStr = "";
if (jumpBean.getCid() > 0) {
cidStr = "(" + jumpBean.getCidStr() + ")";
}
holder.tvContent.setText(context.getString(jumpBean.getItemNameResId()) + cidStr);
}

@Override

+ 6
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/home/JumpBean.java View File

@@ -1,6 +1,7 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.home;

import java.util.List;
import java.util.Locale;

/**
* 说明:
@@ -82,6 +83,11 @@ public class JumpBean {
return cid;
}

public String getCidStr() {
String format = String.format(Locale.US, "0x%02X", cid);
return format;
}

public void setCid(int cid) {
this.cid = cid;
}

+ 67
- 11
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/home/MainActivity.java View File

@@ -18,6 +18,7 @@ import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -28,15 +29,19 @@ import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.besthealth.bhBodyComposition120.BhBodyComposition;
import com.elinkthings.httplibrary.OnHttpListener;
import com.elinkthings.httplibrary.license.LicenseHttpBean;
import com.elinkthings.httplibrary.license.LicenseHttpUtils;
import com.pingwang.bluetoothlib.AILinkBleManager;
import com.pingwang.bluetoothlib.AILinkSDK;
import com.pingwang.bluetoothlib.bean.AilinkLicenseBean;
import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.device.AiLinkBleCheckUtil;
import com.pingwang.bluetoothlib.listener.OnCallbackBle;
import com.pingwang.bluetoothlib.utils.BleLog;

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

import aicare.net.cn.sdk.ailinksdkdemoandroid.AboutActivity;
@@ -54,6 +59,7 @@ public class MainActivity extends AppCompatActivity {

private Context mContext;
private RecyclerView rvList;
private TextView tvLog;
private ArrayList<JumpBean> mList = new ArrayList<>();
private ArrayList<JumpBean> homeDataList = HomeDataManager.getHomeDataList();
private CharSequence inputData = "";
@@ -76,8 +82,6 @@ public class MainActivity extends AppCompatActivity {
initView();
initData();
initListener();
int bodyComposition = new BhBodyComposition().getBodyComposition();
L.i("bodyComposition:" + bodyComposition);
EditText etSearch = findViewById(R.id.etSearch);

etSearch.addTextChangedListener(new TextWatcher() {
@@ -131,6 +135,7 @@ public class MainActivity extends AppCompatActivity {
}
});


}


@@ -157,15 +162,65 @@ public class MainActivity extends AppCompatActivity {

protected void initData() {
initPermissions();
List<AilinkLicenseBean> list = new ArrayList<>();
list.add(new AilinkLicenseBean(0x2F, 0x03, 0x09));
list.add(new AilinkLicenseBean(0x2F, 0x03, 0x01));
list.add(new AilinkLicenseBean(65544, 103, 0));
list.add(new AilinkLicenseBean(65544, 21, 0));
list.add(new AilinkLicenseBean(0x02, 0x99, 0x01));
AILinkSDK.getInstance().initLicense(list);
refreshLicenseData();
byte[] data = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
int crc16 = AiLinkBleCheckUtil.getCrc16(data);
L.i("crc16:" + crc16);
// AiLinkPwdUtil

// List<AilinkLicenseBean> list = new ArrayList<>();
// list.add(new AilinkLicenseBean(0x2F, 0x03, 0x09));
// list.add(new AilinkLicenseBean(0x2F, 0x03, 0x01));
// list.add(new AilinkLicenseBean(65544, 103, 0));
// list.add(new AilinkLicenseBean(65544, 21, 0));
// list.add(new AilinkLicenseBean(0x02, 0x99, 0x01));
//
// AILinkSDK.getInstance().initLicense(list);
}


private List<AilinkLicenseBean> mLicenseBeans;

/**
* 刷新许可数据
*/
private void refreshLicenseData() {
if (mLicenseBeans == null) {
mLicenseBeans = new ArrayList<>();
}
new LicenseHttpUtils().getLicenseList(new OnHttpListener<List<LicenseHttpBean>>() {
@Override
public void onSuccess(List<LicenseHttpBean> data) {
if (data != null) {
L.iw("License:" + Arrays.toString(data.toArray()));
// tvLog.setText("License成功:" + data.size());
for (LicenseHttpBean datum : data) {
//最好做一下判断,免得后端抽风改了就寄了
if (datum != null) {
AilinkLicenseBean ailinkLicenseBean = new AilinkLicenseBean();
ailinkLicenseBean.setCid(datum.getCid());
ailinkLicenseBean.setVid(datum.getVid());
ailinkLicenseBean.setPid(datum.getPid());
mLicenseBeans.add(ailinkLicenseBean);
}
}
//还是判断一下初始化有没有完成吧
if (AILinkSDK.getInstance().isInitOk() && mLicenseBeans != null && !mLicenseBeans.isEmpty()) {
AILinkSDK.getInstance().initLicense(mLicenseBeans);
}
} else {
tvLog.setText("License失败:null");
}
}

@Override
public void onFailed(List<LicenseHttpBean> data) {
tvLog.setText("License失败:网络问题");
}
});
}


private int count = 0;
private OnCallbackBle mOnCallbackBle = new OnCallbackBle() {
@Override
@@ -181,13 +236,13 @@ public class MainActivity extends AppCompatActivity {


protected void initView() {
BleLog.init(true);
//connectDevice(BleValueBean bleValueBean);连接的时候需要传广播对象,否则返回的cid,vid,pid始终都是0
//sdk
AILinkSDK.getInstance().init(mContext);
AILinkBleManager.getInstance().init(mContext, new AILinkBleManager.onInitListener() {
@Override
public void onInitSuccess() {
L.i("初始化成功");
// AILinkBleManager.getInstance().setOnCallbackBle(mOnCallbackBle);
}

@@ -200,6 +255,7 @@ public class MainActivity extends AppCompatActivity {
SP.init(this);

rvList = findViewById(R.id.rv_list);
tvLog = findViewById(R.id.tvLog);
rvList.setLayoutManager(new LinearLayoutManager(this));
mList.clear();
mList.addAll(homeDataList);

+ 1
- 1
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/BleDemoActivity.java View File

@@ -15,7 +15,7 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;

/**
* 噪音计(ble)
* demo参考界面
*
* @author xing
*/

+ 143
- 113
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/PublicBleNetworkCmdActivity.java View File

@@ -35,6 +35,7 @@ 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.SP;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatDataUtil;

@@ -46,6 +47,11 @@ public class PublicBleNetworkCmdActivity extends BleBaseActivity implements OnCa
, OnMcuParameterListener, OnBleCompanyListener, View.OnClickListener, OnBleDeviceDataListener, OnBleConnectStatus {

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

private final static String WIFI_IP_KEY = "WIFI_IP_KEY";
private final static String WIFI_PORT_KEY = "WIFI_PORT_KEY";
private final static String WIFI_URL_KEY = "WIFI_URL_KEY";

private final int REFRESH_DATA = 3;
private List<String> mList;
private ArrayAdapter listAdapter;
@@ -95,20 +101,28 @@ public class PublicBleNetworkCmdActivity extends BleBaseActivity implements OnCa
mList = new ArrayList<>();
listView = findViewById(R.id.listview);
select_wifi_et = findViewById(R.id.select_wifi_et);
String ip = (String) SP.getInstance().get(WIFI_IP_KEY, "");
et_ip = findViewById(R.id.et_ip);
et_ip.setText(ip);

String port = (String) SP.getInstance().get(WIFI_PORT_KEY, "");
et_port = findViewById(R.id.et_port);
et_port.setText(port);

String url = (String) SP.getInstance().get(WIFI_URL_KEY, "");
et_url = findViewById(R.id.et_url);
et_url.setText(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.scanWifi).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.connectWifi).setOnClickListener(this);
findViewById(R.id.disconnectWifi).setOnClickListener(this);
findViewById(R.id.get_set_name).setOnClickListener(this);
findViewById(R.id.get_set_paw).setOnClickListener(this);
findViewById(R.id.reset).setOnClickListener(this);
@@ -126,110 +140,105 @@ public class PublicBleNetworkCmdActivity extends BleBaseActivity implements OnCa
@Override
public void onClick(View v) {

switch (v.getId()) {
int id = v.getId();
if (id == R.id.clear) {
if (mList != null)
mList.clear();


wifiMap.clear();
mMapWifiName.clear();
mList.add("扫描热点");
if (mBleDevice != null) mBleDevice.sendData(scanWifi());
} else if (id == R.id.scanWifi) {
wifiMap.clear();
mMapWifiName.clear();
mList.add("扫描热点");
if (mBleDevice != null) mBleDevice.sendData(scanWifi());
} else if (id == R.id.check_wifi_state) {
mList.add("查看wifi当前状态");
if (mBleDevice != null) mBleDevice.sendData(checkWiFiState());
} else if (id == R.id.check_device_id) {
mList.add("查看设备的ID");
if (mBleDevice != null) mBleDevice.sendData(getSnDeviceId());
} else if (id == R.id.connectWifi) {
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) {

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);
}
@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;

}
}).show(getSupportFragmentManager());
} catch (Exception e) {
e.printStackTrace();
//不输入编号,不输入数字,瞎搞的人。呸
mList.add("按照操作规则来,输入热点编号。");
}
} else if (id == R.id.disconnectWifi) {
mList.add("断开连接");
if (mBleDevice != null) mBleDevice.sendData(setDisconnectWifi());
} else if (id == R.id.get_set_paw) {
mList.add("获取到设置的密码");
if (mBleDevice != null) mBleDevice.sendData(getConnectWifiPwd());
} else if (id == R.id.get_set_name) {
mList.add("获取到设置的热点");
if (mBleDevice != null) mBleDevice.sendData(getConnectWifiName());
} else if (id == R.id.reset) {
mList.add("回复出厂设置");
if (mBleDevice != null) mBleDevice.sendData(reset());
} else if (id == R.id.check_ip) {
mList.add("查看Ip");
if (mBleDevice != null) {
mBleDevice.sendData(checkIp());
}
} else if (id == R.id.check_port) {
mList.add("查看端口号");
if (mBleDevice != null) {
mBleDevice.sendData(checkPort());
}
} else if (id == R.id.check_url) {
mList.add("查看URL");
if (mBleDevice != null) {
mBleDevice.sendData(checkUrl());
}
} else if (id == R.id.set_ip) {
String ipStr = et_ip.getText().toString();
if (!ipStr.isEmpty()) {
mList.add("设置Ip地址");
setIp(convertToASCII(ipStr));
SP.getInstance().put(WIFI_IP_KEY, ipStr);
} else {
mList.add("请输入Ip地址");
}
} else if (id == R.id.set_url) {
String urlStr = et_url.getText().toString();
mList.add("设置路径地址");
setIpUrl(convertToASCII(urlStr));
SP.getInstance().put(WIFI_URL_KEY, urlStr);
} else if (id == R.id.set_port) {
try {
int port = Integer.parseInt(et_port.getText().toString());
mList.add("设置Ip地址");
setPort(port);
SP.getInstance().put(WIFI_PORT_KEY, String.valueOf(port));
} catch (Exception e) {
e.printStackTrace();
mList.add("输入的数字");
}
}
mHandler.sendEmptyMessage(REFRESH_DATA);

@@ -289,7 +298,6 @@ public class PublicBleNetworkCmdActivity extends BleBaseActivity implements OnCa
public void onDisConnected(@NonNull String mac, int code) {
//TODO 连接断开
if (mAddress.equals(mac)) {

finish();
}
}
@@ -396,26 +404,48 @@ public class PublicBleNetworkCmdActivity extends BleBaseActivity implements OnCa

@Override
public void onBleConnectStatus(int bleStatus, int wifiStatus, int workStatus) {
String wifiStatusStr = "";
String bleStatusStr = bleStatus + "_";
//蓝牙状态 0:无连接 1:已连接
if (bleStatus == 0) {
bleStatusStr += "无连接";
} else if (bleStatus == 1) {
bleStatusStr += "已连接";
}
String wifiStatusStr = wifiStatus + "_";
//wifi状态 0:未配置 AP; 1:连接 AP 失败,连接时密码错误、AP 信号不好、主动断开都会是这个状态; 2:连接的 AP 信号不好; 3:成功连接上 AP; 4:正在连接 AP;
switch (wifiStatus) {
case 0:
wifiStatusStr = "未配置AP";
wifiStatusStr += "未配置AP";
break;
case 1:
wifiStatusStr = "连接AP失败";
wifiStatusStr += "连接AP失败";
break;
case 2:
wifiStatusStr = "连接的AP信号不好";
wifiStatusStr += "连接的AP信号不好";
break;
case 3:
wifiStatusStr = "成功连接上AP";
wifiStatusStr += "成功连接上AP";
break;
case 4:
wifiStatusStr = "正在连接AP";
wifiStatusStr += "正在连接AP";
break;

}
mList.add("蓝牙状态:" + bleStatus + "\nwifi状态:" + wifiStatusStr + "\n工作状态:" + workStatus);
String workStatusStr = workStatus + "_";
//工作状态 0:唤醒 1:进入休眠 2:模块准备就绪
switch (workStatus) {
case 0:
workStatusStr += "唤醒";
break;
case 1:
workStatusStr += "进入休眠";
break;
case 2:
workStatusStr += "模块准备就绪";
break;
}

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

@@ -521,7 +551,7 @@ public class PublicBleNetworkCmdActivity extends BleBaseActivity implements OnCa
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[s.length -1 - i], 16);
bytes[i + 1] = (byte) Integer.parseInt(s[s.length - 1 - i], 16);
}
return getSendBleBean(bytes);


+ 0
- 246
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/PublicMqttActivity.java View File

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

import android.os.Message;
import android.text.TextUtils;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;

import com.elinkthings.elinkmqttlib.listener.OnMqttConnectListener;
import com.elinkthings.elinkmqttlib.listener.OnMqttMessageListener;
import com.elinkthings.elinkmqttlib.listener.OnMqttOtherMessageListener;
import com.elinkthings.elinkmqttlib.mqtt.MqttDevice;
import com.elinkthings.elinkmqttlib.mqtt.MqttManager;
import com.pingwang.bluetoothlib.utils.BleStrUtils;

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

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.AppBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;

/**
* 公共mqtt界面
*
* @author xing
* @date 2024/04/19
*/
public class PublicMqttActivity extends AppBaseActivity implements View.OnClickListener, OnMqttMessageListener, OnMqttOtherMessageListener {

private final int REFRESH_DATA = 1;
private EditText etAppUserId;
private EditText etDeviceId;
private EditText etSendData;
private EditText etSendDataDeviceId;
private TextView tvDeviceList;
private List<String> mList;
private ArrayAdapter listAdapter;
private ListView lv_log;

/**
* _mac地址用于加解密,这里随便写一个,实际使用时需要替换
*/
private String mMac = "00:00:00:00:00:00";

@Override
protected void uiHandlerMessage(Message msg) {
if (msg.what == REFRESH_DATA) {
listAdapter.notifyDataSetChanged();
}
}

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

@Override
protected void initListener() {
MqttManager.getInstance().addOnMqttConnectListener(new OnMqttConnectListener() {
@Override
public void onConnected() {
addLog("Mqtt连接成功");
}

@Override
public void onConnecting() {
addLog("Mqtt正在连接中");
}

@Override
public void onDisconnect(int errCode) {
addLog("Mqtt断开连接,错误码:" + errCode);
}

@Override
public void onSubscribeSuccess(String... topics) {
addLog("订阅成功:\n" + Arrays.toString(topics));
for (String topic : topics) {
MqttDevice device = MqttManager.getInstance().getDeviceForTopic(topic);
device.setOnMqttMessageListener(PublicMqttActivity.this);
device.setOnMqttOtherMessageListener(PublicMqttActivity.this);
device.setOnA7EncryptionListener(new MqttDevice.OnA7EncryptionListener() {
@Override
public byte[] onA7Encryption(int cid, byte[] cidBytes, byte[] payload) {
// return AiLinkPwdUtil.mcuEncrypt(cidBytes, getMacByte(mMac), payload);
return payload;
}
});
}
}

@Override
public void onSubscribeFail(String... topics) {
addLog("订阅失败:\n" + Arrays.toString(topics));

}
});
}

@Override
public void onMessage(String topic, String deviceId, int cid, byte[] payload) {
addLog("设备ID:" + deviceId + " 接收到消息:" + BleStrUtils.byte2HexStr(payload));
}

@Override
public void onSendSuccess(String topic, String deviceId, byte[] payload) {
addLog("设备ID:" + deviceId + " 发送消息成功:" + BleStrUtils.byte2HexStr(payload));
}

@Override
public void onSendFailure(String topic, String deviceId, byte[] payload, int errCode, int retryCount) {
addLog("设备ID:" + deviceId + " 发送消息失败:" + BleStrUtils.byte2HexStr(payload));
}

@Override
public void onOtherMessage(String topic, String deviceId, byte[] hex) {
addLog("设备ID:" + deviceId + " 接收到透传消息:" + BleStrUtils.byte2HexStr(hex));
}

@Override
public void onClick(View v) {
int id = v.getId();
if (id == R.id.btnClearShakeHands) {
mList.clear();
mHandler.sendEmptyMessage(REFRESH_DATA);
} else if (id == R.id.btnConnectMqtt) {
String appId = etAppUserId.getText().toString();
if (TextUtils.isEmpty(appId)) {
addLog("App Id不能为空");
return;
}
//禁止etAppUserId编辑
etAppUserId.setEnabled(false);
MqttManager.getInstance().init(this, appId);
addLog("正在连接Mqtt:" + appId);
MqttManager.getInstance().connectMqtt();
} else if (id == R.id.btnDisconnectMqtt) {
etAppUserId.setEnabled(true);
addLog("正在断开Mqtt连接");
MqttManager.getInstance().disconnect();
} else if (id == R.id.btnAddDevice) {
String deviceId = etDeviceId.getText().toString();
MqttManager.getInstance().addDevice(deviceId);
addLog("添加设备:" + deviceId);
etDeviceId.setText("");
refreshDeviceList();
} else if (id == R.id.btnRemoveDevice) {
String deviceId = etDeviceId.getText().toString();
MqttManager.getInstance().removeDevice(deviceId);
addLog("移除设备:" + deviceId);
etDeviceId.setText("");
refreshDeviceList();
} else if (id == R.id.btnSendData) {
String data = etSendData.getText().toString().trim();
data = data.replaceAll(" ", "");
if (TextUtils.isEmpty(data)) {
addLog("发送数据不能为空");
return;
}
String deviceId = etSendDataDeviceId.getText().toString();
if (TextUtils.isEmpty(deviceId)) {
addLog("设备Id不能为空");
return;
}
byte[] bytes = new byte[0];
try {
bytes = BleStrUtils.stringToByte(data);
} catch (Exception e) {
e.printStackTrace();
}
MqttDevice device = MqttManager.getInstance().getDevice(deviceId);
if (device != null) {
if (bytes.length == 0) {
addLog("发送数据不能为空");
return;
}
device.sendData(bytes);
addLog("发送数据:" + data + " 设备:" + deviceId);
} else {
addLog("设备不存在或者未连接:" + deviceId);
}
}
}

@Override
protected void initData() {
mList = new ArrayList<>();
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList);
lv_log.setAdapter(listAdapter);
}

@Override
protected void initView() {
findViewById(R.id.btnClearShakeHands).setOnClickListener(this);
findViewById(R.id.btnConnectMqtt).setOnClickListener(this);
findViewById(R.id.btnDisconnectMqtt).setOnClickListener(this);
etAppUserId = (EditText) findViewById(R.id.etAppUserId);
etDeviceId = (EditText) findViewById(R.id.etDeviceId);
findViewById(R.id.btnAddDevice).setOnClickListener(this);
findViewById(R.id.btnRemoveDevice).setOnClickListener(this);
tvDeviceList = (TextView) findViewById(R.id.tvDeviceList);
lv_log = findViewById(R.id.lv_log);
etSendData = (EditText) findViewById(R.id.etSendData);
etSendDataDeviceId = (EditText) findViewById(R.id.etSendDataDeviceId);
findViewById(R.id.btnSendData).setOnClickListener(this);

}

private void refreshDeviceList() {
List<String> deviceList = MqttManager.getInstance().getDeviceList();
String deviceListStr = TextUtils.join(",", deviceList);
tvDeviceList.setText(deviceListStr);
}

/**
* 添加日志
*
* @param log 日志
*/
private void addLog(String log) {
log = TimeUtils.getTimeSSS() + log;
mList.add(0, log);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

/**
* 获取mac字节
*
* @param mac mac
* @return {@link byte[]}
*/
private byte[] getMacByte(String mac) {
byte[] macByte = new byte[6];
if (mac.contains(":")) {
String[] macArr = mac.split(":");
for (int i = 0; i < macArr.length; i++) {
macByte[macArr.length - i - 1] = (byte) Integer.parseInt(macArr[i], 16);
}
}
return macByte;
}
}

+ 30
- 41
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/PublicWifiBleOtaActivity.java View File

@@ -18,6 +18,8 @@ import androidx.annotation.Nullable;
import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.device.BleSendCmdUtil;
import com.pingwang.bluetoothlib.device.SendBleBean;
import com.pingwang.bluetoothlib.device.wifibleDevice.WifiBleDeviceData;
import com.pingwang.bluetoothlib.device.wifibleDevice.WifiBleInfoBean;
import com.pingwang.bluetoothlib.listener.CallbackDisIm;
import com.pingwang.bluetoothlib.listener.OnBleCompanyListener;
import com.pingwang.bluetoothlib.listener.OnBleDeviceDataListener;
@@ -37,8 +39,6 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.ShowListDialogFragment;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.SP;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import cn.net.aicare.modulelibrary.module.wifibleDevice.WifiBleDeviceData;
import cn.net.aicare.modulelibrary.module.wifibleDevice.WifiBleInfoBean;


/**
@@ -130,46 +130,35 @@ public class PublicWifiBleOtaActivity extends BleBaseActivity implements OnCallb

@Override
public void onClick(View v) {
switch (v.getId()) {

case R.id.clear:
if (mList != null)
mList.clear();
int id = v.getId();
if (id == R.id.clear) {
if (mList != null)
mList.clear();
mHandler.sendEmptyMessage(REFRESH_DATA);
SP.getInstance().put(WIFI_BLE_SSID, "");
SP.getInstance().put(WIFI_BLE_SSID_MAC, "");
SP.getInstance().put(WIFI_BLE_PWD, "");
mSsid = "";
mMac = "";
mPwd = "";
if (tv_wifi_info != null) {
tv_wifi_info.setText("");
}
} else if (id == R.id.btn_read_wifi_status) {
if (mWifiBleDeviceData != null) {
mWifiBleDeviceData.getWifiCurrentState();
}
} else if (id == R.id.btn_start_ota) {
if (mWifiBleDeviceData != null) {
setConnectWifi(mMac, mPwd);
}
} else if (id == R.id.btn_wifi) {
if (mWifiBleDeviceData != null) {
mWifiBleDeviceData.getWifiList();
mList.add(TimeUtils.getTime() + "正在扫描附近可用的wifi...");
mHandler.sendEmptyMessage(REFRESH_DATA);
SP.getInstance().put(WIFI_BLE_SSID, "");
SP.getInstance().put(WIFI_BLE_SSID_MAC, "");
SP.getInstance().put(WIFI_BLE_PWD, "");
mSsid = "";
mMac = "";
mPwd = "";
if (tv_wifi_info != null) {
tv_wifi_info.setText("");
}
break;


case R.id.btn_read_wifi_status:
if (mWifiBleDeviceData != null) {
mWifiBleDeviceData.getWifiCurrentState();
}
break;
case R.id.btn_start_ota:
if (mWifiBleDeviceData != null) {
setConnectWifi(mMac, mPwd);
}
break;
case R.id.btn_wifi:
if (mWifiBleDeviceData != null) {
mWifiBleDeviceData.getWifiList();
mList.add(TimeUtils.getTime() + "正在扫描附近可用的wifi...");
mHandler.sendEmptyMessage(REFRESH_DATA);
}
showWifiList();
break;


default:
break;
}
showWifiList();
}
}


+ 160
- 186
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/TempInstrument/TempInstrumentActivity.java View File

@@ -205,210 +205,184 @@ public class TempInstrumentActivity extends BleBaseActivity implements OnCallbac
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.btnClearShakeHands:
if (mList != null)
mList.clear();
mHandler.sendEmptyMessage(REFRESH_DATA);
break;

case R.id.btnGetConfig:
if (mBleDevice != null) {
mBleDevice.getDeviceConfig();
int vId = v.getId();
if (vId == R.id.btnVersion) {
sendBleBean.setHex(mBleSendCmdUtil.getBleVersion());
mBleDevice.sendData(sendBleBean);
} else if (vId == R.id.btnBattery) {
sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus());
mBleDevice.sendData(sendBleBean);
} else if (vId == R.id.btn_get_did) {
sendBleBean.setHex(mBleSendCmdUtil.getDid());
mBleDevice.sendData(sendBleBean);
} else if (vId == R.id.btnClearShakeHands) {
if (mList != null)
mList.clear();
mHandler.sendEmptyMessage(REFRESH_DATA);
} else if (vId == R.id.btnGetConfig) {
if (mBleDevice != null) {
mBleDevice.getDeviceConfig();
}
} else if (vId == 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;
}
break;
case R.id.btnSetUnit:
if (mBleDevice != null) {
if (mTempUnit == TempInstrumentBleConfig.UnitType.TEMP_UNIT_C) {
mTempUnit = TempInstrumentBleConfig.UnitType.TEMP_UNIT_F;
mBleDevice.synUnit(mTempUnit);
}
} else if (vId == 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 {
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;
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;
}
mBleDevice.synVolume(mCurrentVolumeLevel);
} else if (vId == 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;
}
}
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.synLanguage(mCurrentLanguageIndex);
} else if (vId == R.id.btnAutoOpen) {
if (mCurrentAutoOpen == 1) {
mCurrentAutoOpen = 0;
} else {
mCurrentAutoOpen = 1;
}
mBleDevice.synAutoOpen(mCurrentAutoOpen);
} else if (vId == R.id.btnTempBroadcast) {
if (mCurrentTempBroadcast == 1) {
mCurrentTempBroadcast = 0;
} else {
mCurrentTempBroadcast = 1;
}
mBleDevice.synTempBroadcast(mCurrentTempBroadcast);
} else if (vId == 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.synTestTempDistance(mCurrentTestTempDistanceId);
} else if (vId == 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.synBeepType(mCurrentBeepId);
} else if (vId == 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.synAlarmSoundType(mCurrentAlarmSoundId);
} else if (vId == R.id.btnTempBodyAdd) {
mBleDevice.synBodyTempAdd(0x00);
} else if (vId == R.id.btnTempBodyLess) {
mBleDevice.synBodyTempAdd(0x01);
} else if (vId == R.id.btnTempObjectAdd) {
mBleDevice.synObjectTempAdd(0x00);
} else if (vId == R.id.btnTempObjectLess) {
mBleDevice.synObjectTempAdd(0x01);
} else if (vId == 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);
}
} else if (vId == 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.synSensitivity(mCurrentSensitivityLevel);
} else if (vId == 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;

}
mBleDevice.synAutoClose(mCurrentAutoCloseId);
} else if (vId == R.id.btnReset) {
if (mBleDevice != null) {
mBleDevice.reset();
}
}
}


+ 1
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/barometric_temp_humidity/EditParamsDialog.java View File

@@ -20,6 +20,7 @@ import androidx.fragment.app.FragmentManager;

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


public class EditParamsDialog extends DialogFragment implements View.OnClickListener {

/**

+ 246
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/ble_0020_hu_infrared_temp/Ble0020HpInfraredTempActivity.kt View File

@@ -0,0 +1,246 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_0020_hu_infrared_temp

import aicare.net.cn.sdk.ailinksdkdemoandroid.R
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleAppNewBaseActivity
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_0020_hu_infrared_temp.viewmodel.Ble0020HpTempViewModel
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils
import android.os.Message
import android.view.View
import android.widget.ArrayAdapter
import android.widget.Button
import android.widget.EditText
import android.widget.ListView
import androidx.lifecycle.ViewModelProvider
import cn.net.aicare.modulelibrary.module.ble_0020_hu_infrared_temp.HpInfraredTempBleConfig

/**
* 华普红外测温枪
* @author xing
* @date 2025/03/27
* @constructor 创建[Ble0020HpInfraredTempActivity]
*/
class Ble0020HpInfraredTempActivity : BleAppNewBaseActivity(), View.OnClickListener {

private lateinit var btnPause: Button
private lateinit var btnContinue: Button
private lateinit var btnClear: Button
private lateinit var btnWakeup: Button
private lateinit var btnTest: Button
private lateinit var btnStopTest: Button
private lateinit var btnReset: Button
private lateinit var btnEmissivity: Button
private lateinit var btnAutoShutdown: Button
private lateinit var btnHighOrLowTemp: Button
private lateinit var btnGetDeviceStatus: Button
private lateinit var btnGetDeviceParameter: Button
private lateinit var etEmissivity: EditText
private lateinit var etAutoShutdown: EditText
private lateinit var etHighTemp: EditText
private lateinit var etLowTemp: EditText
private var mViewModel: Ble0020HpTempViewModel? = null
private var mAddress: String = ""
private val mList: ArrayList<String> = arrayListOf()
private var listAdapter: ArrayAdapter<String>? = null
private var mRefresh = true

override fun uiHandlerMessage(msg: Message?) {

}

override fun getLayoutId(): Int {
return R.layout.activity_ble_0020_hp_infrared_temp
}

override fun initView() {
btnPause=findViewById(R.id.btnPause)
btnContinue=findViewById(R.id.btnContinue)
btnClear=findViewById(R.id.btnClear)
btnWakeup=findViewById(R.id.btnWakeup)
btnTest=findViewById(R.id.btnTest)
btnStopTest=findViewById(R.id.btnStopTest)
btnReset=findViewById(R.id.btnReset)
btnEmissivity=findViewById(R.id.btnEmissivity)
btnAutoShutdown=findViewById(R.id.btnAutoShutdown)
btnHighOrLowTemp=findViewById(R.id.btnHighOrLowTemp)
btnGetDeviceStatus=findViewById(R.id.btnGetDeviceStatus)
btnGetDeviceParameter=findViewById(R.id.btnGetDeviceParameter)
etEmissivity=findViewById(R.id.etEmissivity)
etAutoShutdown=findViewById(R.id.etAutoShutdown)
etHighTemp=findViewById(R.id.etHighTemp)
etLowTemp=findViewById(R.id.etLowTemp)
}



override fun initListener() {
btnPause.setOnClickListener(this)
btnContinue.setOnClickListener(this)
btnClear.setOnClickListener(this)
btnWakeup.setOnClickListener(this)
btnTest.setOnClickListener(this)
btnStopTest.setOnClickListener(this)
btnReset.setOnClickListener(this)
btnEmissivity.setOnClickListener(this)
btnAutoShutdown.setOnClickListener(this)
btnHighOrLowTemp.setOnClickListener(this)
btnGetDeviceStatus.setOnClickListener(this)
btnGetDeviceParameter.setOnClickListener(this)

mViewModel?.let {
it.showLogLiveData.observe(this) {
addLog(it)
}
}

}

override fun onClick(v: View?) {
when (v?.id) {
R.id.btnPause -> {
mRefresh = false
}

R.id.btnContinue -> {
mRefresh = true

}

R.id.btnClear -> {
clear()
}

R.id.btnWakeup -> {
mViewModel?.sendButtonCmd(HpInfraredTempBleConfig.CMD_WAKEUP)
addLog("发送唤醒")
}

R.id.btnTest -> {
mViewModel?.sendButtonCmd(HpInfraredTempBleConfig.CMD_TEST)
addLog("发送测量")
}

R.id.btnStopTest -> {
mViewModel?.sendButtonCmd(HpInfraredTempBleConfig.CMD_STOP_TEST)
addLog("发送停止测量")
}

R.id.btnReset -> {
mViewModel?.sendButtonCmd(HpInfraredTempBleConfig.CMD_RESET)
addLog("发送重置")
}

R.id.btnEmissivity -> {
val emissivity = etEmissivity.text.toString()
if (emissivity.isNotBlank()) {
val data = (emissivity.toFloat() * 100).toInt()
mViewModel?.sendEmissivity(data)
addLog("发送发射率:$data")
}

}

R.id.btnAutoShutdown -> {
val autoShutdown = etAutoShutdown.text.toString()
if (autoShutdown.isNotBlank()) {
mViewModel?.sendAutoShutdown(autoShutdown.toInt())
addLog("发送自动关机:$autoShutdown")
}
}

R.id.btnHighOrLowTemp -> {
val tempHStr = etHighTemp.text.toString()
val tempLStr = etLowTemp.text.toString()
if (tempHStr.isNotBlank() && tempLStr.isNotBlank()) {
val tempH = tempHStr.toInt()
val tempL = tempLStr.toInt()
val signH = if (tempH > 0) {
HpInfraredTempBleConfig.PLUS
} else {
HpInfraredTempBleConfig.MINUS
}
val signL = if (tempL > 0) {
HpInfraredTempBleConfig.PLUS
} else {
HpInfraredTempBleConfig.MINUS
}
mViewModel?.sendWarmInfo(HpInfraredTempBleConfig.TEMP_C, signH, signL, tempH, tempL)
addLog("发送高低温报警:高温=${tempHStr}℃,低温=${tempLStr}℉")
}


}

R.id.btnGetDeviceStatus -> {
mViewModel?.sendGetDeviceStatus()
addLog("发送获取设备状态")
}

R.id.btnGetDeviceParameter -> {
mViewModel?.sendGetDeviceParameter()
addLog("发送获取设备参数")
}

else -> {}
}

}

override fun initData() {
mContext = this
val mac = intent.getStringExtra("mac")
if (mac.isNullOrBlank()) {
finish()
return
}
mAddress = mac
mViewModel = ViewModelProvider(this)[Ble0020HpTempViewModel::class.java]
if (isServiceBind) {
onServiceSuccess()
}
val listView = findViewById<ListView>(R.id.listview)
listAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, mList)
listView.adapter = listAdapter
}



private fun addLog(msg: String) {
if (!mRefresh) {
return
}
mList.add(TimeUtils.getTimeSSS() + msg)
listAdapter!!.notifyDataSetChanged()
}

private fun clear() {
mList.clear()
listAdapter!!.notifyDataSetChanged()
}

private var isServiceBind = false
override fun onServiceSuccess() {
isServiceBind = true
if (mAddress.isNotBlank()) {
val bleDevice = mBleManager?.getBleDevice(mAddress)
bleDevice?.let {
mViewModel?.initDevice(it)
}
}
}

override fun onServiceErr() {

}

override fun unbindServices() {

}








}

+ 361
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/ble_0020_hu_infrared_temp/viewmodel/Ble0020HpTempViewModel.kt View File

@@ -0,0 +1,361 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_0020_hu_infrared_temp.viewmodel

import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import cn.net.aicare.modulelibrary.module.ble_0020_hu_infrared_temp.HpInfraredTempBleDataCmdUtils
import cn.net.aicare.modulelibrary.module.ble_0020_hu_infrared_temp.HpInfraredTempBleDeviceData
import com.pingwang.bluetoothlib.device.BleDevice

/**
* 华普红外测温枪视图模型
* @author xing
* @date 2025/03/27
* @constructor 创建[Ble0020HpTempViewModel]
*/
class Ble0020HpTempViewModel : ViewModel(), HpInfraredTempBleDeviceData.OnBleDeviceInfoListener, HpInfraredTempBleDeviceData.OnBleSetStatusListener,
HpInfraredTempBleDeviceData.OnBleAlarmResultListener {

val showLogLiveData by lazy { MutableLiveData<String>() }

var mHpInfraredTempBleDeviceData: HpInfraredTempBleDeviceData? = null

fun initDevice(bleDevice: BleDevice) {
HpInfraredTempBleDeviceData.init(bleDevice)
mHpInfraredTempBleDeviceData = HpInfraredTempBleDeviceData.getInstance()

}

/**
* 发送获取设备状态
*/
fun sendGetDeviceStatus() {
val checkDeviceStatus = HpInfraredTempBleDataCmdUtils.checkDeviceStatus()
mHpInfraredTempBleDeviceData?.sendData(checkDeviceStatus)
}

/**
* 发送按钮CMD
* @param [type] 类型 {@link HpInfraredTempBleConfig#CMD_WAKEUP ...}
*/
fun sendButtonCmd(type: Int) {
val setCmd = HpInfraredTempBleDataCmdUtils.setCmd(type)
mHpInfraredTempBleDeviceData?.sendData(setCmd)
}

/**
* 发送发射率
* @param [emissivity] 发射率
*/
fun sendEmissivity(emissivity: Int) {
val setEmissivity = HpInfraredTempBleDataCmdUtils.setEmissivity(emissivity)
mHpInfraredTempBleDeviceData?.sendData(setEmissivity)
}


/**
* 发送自动关机
* @param [time] 时间s
*/
fun sendAutoShutdown(time: Int) {
val setAutoShutdown = HpInfraredTempBleDataCmdUtils.setAutoShutdown(time)
mHpInfraredTempBleDeviceData?.sendData(setAutoShutdown)


}


/**
* 发送报警信息
*/
fun sendWarmInfo(unit: Int, signH: Int, signL: Int, tempH: Int, tempL: Int) {
val setWarmInfo = HpInfraredTempBleDataCmdUtils.setWarm(unit, signH, signL, tempH, tempL)
mHpInfraredTempBleDeviceData?.sendData(setWarmInfo)
}

/**
* 发送获取设备参数
*/
fun sendGetDeviceParameter() {
val getDeviceParameter = HpInfraredTempBleDataCmdUtils.getDeviceParameter()
mHpInfraredTempBleDeviceData?.sendData(getDeviceParameter)
}


/**
* 设备状态1
*
* @param scanOrHold 状态 0:SCAN。1:HOLD
* @param tempUnit 单位 0:℃ 。 1:℉
* @param laser 激光灯 0:关闭 。1:打开
* @param backLamp 背光灯 0:关闭 。1:打开
* @param lowBattery 低电 0:不低电 。1:低电
* @param alarmH 高位报警 0:不报警 。 1:正在报警
* @param alarmL 低温报警 0:不报警 。 1:正在报警
* @param flashlight 手电筒灯 0:关闭 。1:打开
* @param mode 模式 0x00:REC(设备端查看历史记录时发送该模式,APP 不保存该模式的数据)
* 0x01:MAX;0x02:AVG;0x03:MIN;0x04:DIF;0x05:LAL;0x06:HAL;0x07:EMS(设备端查看发射率);0x08:HAL—Warming—T;0x09:LAL—Warming—T
* 0x0A:EMS(设备端设置发射率)
* @param mainTag 主区数据标识:显示标识:0:不显示。1:显示
* @param mainSign 主区数据标识:数据正负:0:正值。 1:负值
* @param mainDecimal 主区数据标识:数据小数点:0:无小数点。1:带 1 位小数
* @param subTag 附区数据标识:显示标识:0:不显示。1:显示
* @param subSign 附区数据标识:数据正负:0:正值。 1:负值
* @param subDecimal 附区数据标识:数据小数点:0:无小数点。1:带 1 位小数
* @param mainValue 主区数值
* @param subValue 附区数值
* @param ems EMS 数值 10~100(显示0.10 ~1.00)
* @param autoShutdown 自动睡眠时间
*/
override fun onDeviceStatus1(
scanOrHold: Int, tempUnit: Int, laser: Int, backLamp: Int, lowBattery: Int, alarmH: Int, alarmL: Int,
flashlight: Int, mode: Int, mainTag: Int, mainSign: Int, mainDecimal: Int, subTag: Int, subSign: Int, subDecimal: Int, mainValue: Int,
subValue: Int, ems: Int, autoShutdown: Int
) {

var msg = ""
msg += "状态:" + if (scanOrHold == 0) {
"SCAN"
} else {
"HOLD"
} + "\n"
msg += " 单位:" + if (tempUnit == 0) {
"℃"
} else {
"℉"
}
msg += " 激光灯:" + if (laser == 0) {
"关闭"
} else {
"打开"
}
msg += "背光灯:" + if (backLamp == 0) {
"关闭"
} else {
"打开"
} + "\n"
msg += " 低电:" + if (lowBattery == 0) {
"不低电"
} else {
"低电"
}
msg += " 高温报警:" + if (alarmH == 0) {
"不报警"
} else {
"正在报警"
} + "\n"
msg += " 低温报警:" + if (alarmL == 0) {
"不报警"
} else {
"正在报警"
}
msg += " 手电筒灯:" + if (flashlight == 0) {
"关闭"
} else {
"打开"
} + "\n"
msg += "模式:" + when (mode) {
0x00 -> {
"REC"
}

0x01 -> {
"MAX"
}

0x02 -> {
"AVG"
}

0x03 -> {
"MIN"
}

0x04 -> {
"DIF"
}

0x05 -> {
"LAL"
}

0x06 -> {
"HAL"
}

0x07 -> {
"EMS"
}

0x08 -> {
"HAL—Warming—T"
}

0x09 -> {
"LAL—Warming—T"
}

0x0A -> {
"EMS"
}

else -> {
"未知"
}
} + "\n"
if (mainTag == 1) {
var showMainValue = mainValue.toFloat()
if (mainDecimal == 1) {
showMainValue /= 10F
}
if (mainSign == 1) {
showMainValue = -showMainValue
}
msg += "主区数值:${showMainValue}"
}
if (subTag == 1) {
var showSubValue = subValue.toFloat()
if (subDecimal == 1) {
showSubValue /= 10F
}
if (subSign == 1) {
showSubValue = -showSubValue
}
msg += "附区数值:${showSubValue}"
}
msg += "附区数值:${subValue}"
msg += "EMS 数值:${ems / 100F}"
msg += "自动睡眠时间:$autoShutdown"
showLogLiveData.postValue(msg)
}

/**
* 设备状态2
*
* @param scanOrHold 状态 0:SCAN。1:HOLD
* @param dewTempSign 露点温度标志:0:正数 , 1:负数
* @param dewTempDecimal 露点温度小数点: 0:无小数, 1: 1 个小数
* @param dewTemp 露点温度
* @param humidity 环境湿度:单位%
* @param envTempSign 环境温度正负:0:正数 , 1:负数
* @param envTempDecimal 环境温度小数点: 0:无小数, 1: 1 个小数
* @param envTemp 环境温度
*/
override fun onDeviceStatus2(
scanOrHold: Int, dewTempSign: Int, dewTempDecimal: Int, dewTemp: Int, humidity: Int, envTempSign: Int,
envTempDecimal: Int, envTemp: Int
) {
var msg = ""
msg += "状态:" + if (scanOrHold == 0) {
"SCAN"
} else {
"HOLD"
} + "\n"
msg += "环境湿度:${humidity}%"
var showDewTemp = dewTemp.toFloat()
if (dewTempDecimal == 1) {
showDewTemp /= 10F
}
if (dewTempSign == 1) {
showDewTemp = -showDewTemp
}
msg += "露点温度:${showDewTemp}"
var showEnvTemp = envTemp.toFloat()
if (envTempDecimal == 1) {
showEnvTemp /= 10F
}
if (envTempSign == 1) {
showEnvTemp = -showEnvTemp
}
msg += "环境温度:${showEnvTemp}"
showLogLiveData.postValue(msg)
}

/**
* 设备参数
*
* @param emissivity 发射率:2 个小数;范围 0.10 ~ 1.00 (对应的是 10-100)
* @param autoShutdown 自动关机时间
* @param alarmHSign 数据标识:高温报警数据(正负值:0:正值 。1:负值)
* @param alarmHUnit 数据标识:高温报警数据(单位:0:℃ 。1:℉)
* @param alarmLSign 数据标识:低温报警数据(正负值:0:正值 。1:负值)
* @param alarmLUnit 数据标识:低温报警数据(单位:0:℃ 。1:℉)
* @param alarmH 高温报警数据
* @param alarmL 低温报警数据
*/
override fun onDeviceParameter(
emissivity: Int, autoShutdown: Int, alarmHSign: Int, alarmHUnit: Int, alarmLSign: Int, alarmLUnit: Int, alarmH: Int, alarmL: Int
) {
var msg = "发射率:${emissivity / 100F} 自动关机时间:${autoShutdown}\n"
var showAlarmHValue = alarmH.toFloat()
if (alarmHSign == 1) {
showAlarmHValue = -showAlarmHValue
}
msg += "高温报警数据:${showAlarmHValue}${
if (alarmHUnit == 0) {
"℃"
} else {
"℉"
}
}\n"
var showAlarmLValue = alarmH.toFloat()
if (alarmLSign == 1) {
showAlarmLValue = -showAlarmLValue
}
msg += "低温报警数据:${showAlarmLValue}${
if (alarmLUnit == 0) {
"℃"
} else {
"℉"
}
}"
showLogLiveData.postValue(msg)
}

/**
* 关于发射率结果
* @param [status] 状态
*/
override fun onEmissivityResult(status: Int) {
showLogLiveData.postValue(
"发射率设置:${
if (status == 0) {
"成功"
} else {
"失败"
}
}"
)
}

/**
* 自动关机结果
* @param [status] 状态
*/
override fun onAutoShutDownResult(status: Int) {
showLogLiveData.postValue(
"自动关机时间设置:${
if (status == 0) {
"成功"
} else {
"失败"
}
}"
)
}

/**
* 报警结果
* @param [status] 状态
*/
override fun onAlarmResult(status: Int) {
showLogLiveData.postValue(
"高低温报警值设置:${
if (status == 0) {
"成功"
} else {
"失败"
}
}"
)
}
}

+ 10
- 8
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/ble_nutrition/BleNutritionActivity.java View File

@@ -26,12 +26,6 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import cn.net.aicare.modulelibrary.module.BleNutrition.BleNutritionData;
import cn.net.aicare.modulelibrary.module.BleNutrition.BleNutritionHistoryBean;

/**
* ble营养界面
*
* @author xing
* @date 2024/10/28
*/
public class BleNutritionActivity extends BleBaseActivity implements View.OnClickListener, BleNutritionData.BleNutritionCallback, OnBleSettingListener {

private static final String TAG = "Tag1";
@@ -206,9 +200,17 @@ public class BleNutritionActivity extends BleBaseActivity implements View.OnClic
// 小数点
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;
String weightStr = "";
if (unit == 2) {
int lb = (int) (w / 16);
float oz = w - (lb * 16);
weightStr = lb + ":" + getPreFloatStr(oz, decimal);
} else {
weightStr = getPreFloatStr(w, decimal);
}

String str = "MCU上发重量:" + weightStr +" "+ getUnitStr(unit) + "\n流水号:" + no + ",原始重量:" + weight + ",单位:" + unit + ",小数点:" + decimal + ",符号:" + symbol + ",重量类型:" + type;
addText(str);
}


+ 14
- 6
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/ble_nutrition/BleNutritionNutrientActivity.java View File

@@ -198,22 +198,30 @@ public class BleNutritionNutrientActivity extends BleBaseActivity implements Vie
// 小数点
w = (float) (w / Math.pow(10, decimal));
// 保留小数位
String weightStr = getPreFloatStr(w, decimal);

String weightStr = "";
if (unit == 2) {
int lb = (int) (w / 16);
float oz = w - (lb * 16);
weightStr = lb + ":" + getPreFloatStr(oz, decimal);
} else {
weightStr = getPreFloatStr(w, decimal);
}

String str = "MCU上发重量:" + weightStr + getUnitStr(unit) + "\n流水号:" + no + ",原始重量:" + weight + ",单位:" + unit + ",小数点:" + decimal + ",符号:" + symbol + ",重量类型:" + type;
String str = "MCU上发重量:" + weightStr +" "+ getUnitStr(unit) + "\n流水号:" + no + ",原始重量:" + weight + ",单位:" + unit + ",小数点:" + decimal + ",符号:" + symbol + ",重量类型:" + type;
addText(str);


if (type == 2) {
if (foodNutrientBean != null ) {
//稳定重量
if (unit == 0x04) {
if (unit == 0x04) {//kg
foodNutrientBean.setWeightToG(Double.parseDouble(weightStr)*1000);
}else if (unit == 0x05){
}else if (unit == 0x05){//斤
foodNutrientBean.setWeightToG(Double.parseDouble(weightStr)*500);
}else if (unit == 0x00){
}else if (unit == 0x00){//G
foodNutrientBean.setWeightToG(Double.parseDouble(weightStr));
}else if (unit == 0x03){
}else if (unit == 0x03){//oz
foodNutrientBean.setWeightToG(UnitUtils.ozToG(Float.parseFloat(weightStr)));
}else {
addText("不支持的重量单位,当前只支持g,oz,kg,斤:" + unit);

+ 455
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/ble_speed_test/BleSpeedTestActivity.kt View File

@@ -0,0 +1,455 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_speed_test

import aicare.net.cn.sdk.ailinksdkdemoandroid.R
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.KBleBaseNewActivity
import aicare.net.cn.sdk.ailinksdkdemoandroid.databinding.ActivityBleSpeedTestBinding
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.CoroutineUtils
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.toUnsignedInt
import android.bluetooth.BluetoothDevice
import android.bluetooth.BluetoothGattCharacteristic
import android.net.Uri
import android.os.Build
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 androidx.activity.result.contract.ActivityResultContracts
import androidx.annotation.RequiresApi
import com.pingwang.bluetoothlib.config.BleConfig
import com.pingwang.bluetoothlib.device.AiLinkBleCheckUtil
import com.pingwang.bluetoothlib.device.BleDevice
import com.pingwang.bluetoothlib.device.SendDataBean
import com.pingwang.bluetoothlib.listener.OnBleMtuListener
import com.pingwang.bluetoothlib.listener.OnBleOtherDataListener
import com.pingwang.bluetoothlib.listener.OnCallbackBle
import com.pingwang.bluetoothlib.listener.OnCharacteristicListener
import com.pingwang.bluetoothlib.utils.BleLog
import com.pingwang.bluetoothlib.utils.UuidUtils
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import java.nio.charset.Charset
import java.nio.charset.StandardCharsets
import java.util.UUID

/**
* ble速度测试界面
* @author xing
* @date 2025/09/12
* @constructor 创建[BleSpeedTestActivity]
*/
class BleSpeedTestActivity : KBleBaseNewActivity<ActivityBleSpeedTestBinding>(), View.OnClickListener, OnCallbackBle, OnBleOtherDataListener {
private val REFRESH_DATA = 3
private var mList: MutableList<String> = mutableListOf()
private var listAdapter: ArrayAdapter<String>? = null
private var mBleDevice: BleDevice? = null
private var sendUuid: UUID? = null
private var sendUuidServer: UUID? = null
private var sendUuidNotify: UUID? = null
private var mCount = 0L

// 指定每个分组的字节大小
private val headMax = 12 // 1KB
private var mMtu = 514 // 1KB
private var mSendDataMax = 514 - headMax // 1KB
private val filePickerLauncher = registerForActivityResult(ActivityResultContracts.GetContent()) { uri ->
uri?.let { readFileChunks(it) }
}
private var mSelectFilePath = ""
private var mAddress: String? = ""
private var mSendList: MutableList<ByteArray> = mutableListOf()
private var mReadList: MutableList<ByteArray> = mutableListOf()
private var mWriteBytes: Long = 0
private var mReadBytes: Long = 0
private var mStartTime: Long = 0
private var mStartWriteTime: Long = 0
private var mStartReadTime: Long = 0

private val mHandler = object : Handler(Looper.getMainLooper()) {
override fun handleMessage(msg: Message) {
super.handleMessage(msg)
when (msg.what) {
REFRESH_DATA -> {
listAdapter?.notifyDataSetChanged()
}
}
}
}

override fun getLayoutView(): ActivityBleSpeedTestBinding {
return ActivityBleSpeedTestBinding.inflate(layoutInflater)
}

override fun initListener() {
binding.btnUuid.setOnClickListener(this)
binding.btnUuidServer.setOnClickListener(this)
binding.btnNotify.setOnClickListener(this)
binding.btnSelectFile.setOnClickListener(this)
binding.btnWriteTest.setOnClickListener(this)
binding.btnReadTest.setOnClickListener(this)

}

override fun onClick(v: View) {
when (v.id) {
R.id.btn_uuid -> {
val uuid = binding.etUuid.getText().toString().trim { it <= ' ' }.uppercase()
sendUuid = UuidUtils.getUuid(uuid)
addLog("设置特征UUID")
}

R.id.btn_uuid_server -> {
val uuid = binding.etUuidServer.getText().toString().trim { it <= ' ' }.uppercase()
sendUuidServer = UuidUtils.getUuid(uuid)
addLog("设置服务UUID")
}

R.id.btn_notify -> {
// val notifyStr = binding.etUuid.getText().toString().trim { it <= ' ' }.uppercase()
sendUuidNotify = UuidUtils.getUuid("FFE2")
readNotify(sendUuidNotify)
readNotify(UuidUtils.getUuid("FFE3"))
addLog("打开notify")
}

R.id.btnSelectFile -> {
filePickerLauncher.launch("application/octet-stream")
}

R.id.btnWriteTest -> {
if (TextUtils.isEmpty(mSelectFilePath)) {
addLog("请选择文件")
return
}
if (mBleDevice == null) {
addLog("请先连接设备")
return
}
if (sendUuid == null) {
addLog("请先设置特征UUID")
return
}
if (sendUuidServer == null) {
addLog("请先设置服务UUID")
return
}

// sendStartWriteFile()
sendA5DataStart(mWriteBytes.toInt())

}

R.id.btnReadTest -> {
sendStartReadFile()
}


}
}


override fun initData() {
mAddress = intent.getStringExtra("mac")
if (mAddress.isNullOrEmpty()) {
finish()
return
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
onServiceSuccess()
}
listAdapter = ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mList)
binding.listview.setAdapter(listAdapter)

}


@RequiresApi(Build.VERSION_CODES.O)
override fun onServiceSuccess() {
if (mBleManager != null && !TextUtils.isEmpty(mAddress)) {
mBleDevice = mBleManager.getBleDevice(mAddress)
mBleManager.setOnCallbackBle(this)
mBleDevice?.let {
it.setPreferredPhy(BluetoothDevice.PHY_LE_2M, BluetoothDevice.PHY_LE_2M)
it.setMtu(517)
it.setOnBleMtuListener(object : OnBleMtuListener {
override fun onMtuAvailable(mtu: Int) {
mMtu = mtu
mSendDataMax = mtu - headMax
}
})
it.setOnBleOtherDataListener(this)
it.setOnCharacteristicListener(object : OnCharacteristicListener {

override fun onCharacteristicWriteOK(characteristic: BluetoothGattCharacteristic) {
BleLog.i("写入成功回调时间戳:${System.currentTimeMillis()}")
if (characteristic.uuid.toString() == sendUuid.toString()) {
val str = characteristic.value.toString(Charset.forName("UTF-8"))
if (str.startsWith("rate")) {
return
}
mCount += characteristic.value.size
runOnUiThread {
binding.tvSendNumber.text = (mCount).toString()
//发送完成
val currentTimeMillis = System.currentTimeMillis()
val caT = (currentTimeMillis - mStartTime) / 1000F
val noCaT = (currentTimeMillis - mStartWriteTime) / 1000F
val kb = mCount / 1024
binding.tvSpeedWrite.text =
"写速度:${kb / (caT)}KB/s(擦) ${kb / (noCaT)}KB/s 时间差(擦):${currentTimeMillis - mStartTime}"
}
}
}


})
}
}
}

override fun onNotifyOtherData(uuid: String, data: ByteArray) {
val cmdStr = String(data, Charset.forName("UTF-8"))
if (cmdStr.startsWith("rateTx_ready") || checkA5StartData(data)) {
//写开始
binding.tvSendNumber.text = "0"
mStartWriteTime = System.currentTimeMillis()
addLog("开始发送:${mStartWriteTime - mStartTime}")
val total = mSendList.size
for ((index, bytes) in mSendList.withIndex()) {
val a5Data = getA5Data(index, total, bytes)
sendData(a5Data)
}


sendA5DataEnd()
} else if (cmdStr.startsWith("rateRx_ready")) {
//读开始
mStartReadTime = System.currentTimeMillis()
mReadBytes = 0
binding.tvReceiveNumber.text = "0"
} else {
mReadBytes += data.size
mReadList.add(data)
CoroutineUtils.coroutineScopeIo {

withContext(Dispatchers.Main) {
if (mReadBytes >= mWriteBytes) {
val equal = areByteArrayListsEqual(mReadList, mSendList)
addLog("内容是否相等:$equal")
}
val currentTimeMillis = System.currentTimeMillis()
val lng = currentTimeMillis - mStartReadTime
val kb = mReadBytes / 1024
binding.tvSpeedRead.text = "读速度:${kb / ((lng / 1000).toFloat())}KB/s 时间差:${lng}"
binding.tvReceiveNumber.text = (mReadBytes).toString()
}
}

}
}

fun areByteArrayListsEqual(list1: MutableList<ByteArray>, list2: MutableList<ByteArray>): Boolean {
// 先比较列表大小
if (list1.size != list2.size) return false

// 使用索引逐个比较字节数组
return list1.indices.all { index ->
list1[index].contentEquals(list2[index])
}
}

override fun onServiceErr() {
addLog("服务绑定失败")
}

override fun unbindServices() {
addLog("服务解绑")
}


override fun onDisConnected(mac: String?, code: Int) {
super.onDisConnected(mac, code)
addLog("断开连接:$mac 错误码:$code")
}

private fun readFileChunks(uri: Uri) {

CoroutineScope(Dispatchers.Main).launch {
val path = uri.toString()
addLog("正在读取文件:$path")
mSelectFilePath = path
// binding.tvFileName.text = path.substring(path.lastIndexOf("test"))
val result = withContext(Dispatchers.IO) {
try {
contentResolver.openInputStream(uri)?.use { inputStream ->
// 创建 MutableList<ByteArray> 来存储分块数据
mSendList.clear()
// 使用缓冲区读取文件,避免一次性加载大文件到内存
val buffer = ByteArray(mSendDataMax)
var bytesRead: Int
mWriteBytes = 0
while (inputStream.read(buffer).also { bytesRead = it } != -1) {
// 创建正确大小的字节数组副本
val chunk = if (bytesRead < mSendDataMax) {
buffer.copyOf(bytesRead)
} else {
buffer.copyOf() // 创建副本,避免重用缓冲区
}
mSendList.add(chunk)
mWriteBytes += bytesRead
}
// 构建结果字符串
val stringBuilder = StringBuilder()
stringBuilder.append("文件读取成功!共 $mWriteBytes 字节,分成 ${mSendList.size} 个组\n\n")
stringBuilder.toString()
} ?: "无法打开文件流"
} catch (e: Exception) {
"读取文件时出错: ${e.message}"
}
}
addLog(result)
}
}

private fun sendStartWriteFile() {
binding.tvSendNumber.text = ""
binding.tvReceiveNumber.text = ""
mCount = 0
mStartTime = System.currentTimeMillis()
val cmdStr = "rateTx_start:$mWriteBytes"
sendData(cmdStr.toByteArray(StandardCharsets.US_ASCII))
mHandler.postDelayed({
//0x7261746554785F7265616479
val byteArray = byteArrayOf(0x72, 0x61, 0x74, 0x65, 0x54, 0x78, 0x5F, 0x72, 0x65, 0x61, 0x64, 0x79)
onNotifyOtherData("FFE2", byteArray)

}, 1000)
}

private fun sendStartReadFile() {
binding.tvSendNumber.text = ""
binding.tvReceiveNumber.text = ""
mReadList.clear()
val cmdStr = "rateRx_start:$mWriteBytes"
sendData(cmdStr.toByteArray(StandardCharsets.US_ASCII))
}

private fun sendData(hex: ByteArray) {
val sendDataBean = SendDataBean(hex, sendUuid, BleConfig.WRITE_DATA, sendUuidServer)
mBleDevice?.sendDataNow(sendDataBean)
}

private fun sendA5DataStart(fileSize: Int) {
binding.tvSendNumber.text = ""
binding.tvReceiveNumber.text = ""
mCount = 0
mStartTime = System.currentTimeMillis()
//包头+cid+长度+sum+包尾=7
val a5Data = ByteArray(12)
val len = 0x07
a5Data[0] = 0xA5.toByte()
a5Data[1] = 0x00
a5Data[2] = len.toByte()
a5Data[3] = 0x01
a5Data[4] = 0x02
a5Data[5] = 0x00
a5Data[6] = (fileSize shr 24).toByte()
a5Data[7] = (fileSize shr 16).toByte()
a5Data[8] = (fileSize shr 8).toByte()
a5Data[9] = fileSize.toByte()
val crcData = ByteArray(9)
System.arraycopy(a5Data, 1, crcData, 0, crcData.size)
val crc16 = AiLinkBleCheckUtil.getCrc16(crcData)
a5Data[a5Data.size - 2] = (crc16 shr 8).toByte()
a5Data[a5Data.size - 1] = crc16.toByte()
sendData(a5Data)
}

private fun checkA5StartData(data: ByteArray): Boolean {
return data[0].toUnsignedInt() == 0xA5 && data[3].toUnsignedInt() == 0x01
}

/**
* 获取a5数据
*
* @param cid cid
* @param data 数据
* @return [byte[]]
*/
private fun getA5Data(count: Int, total: Int, data: ByteArray): ByteArray {
//包头+cid+长度+sum+包尾=7
val a5Data = ByteArray(data.size + headMax)
val len = data.size + (headMax - 5)
a5Data[0] = 0xA5.toByte()
a5Data[1] = (len shr 8).toByte()
a5Data[2] = len.toByte()
a5Data[3] = 0x02
a5Data[4] = 0x02
a5Data[5] = (count shr 8).toByte()
a5Data[6] = count.toByte()
a5Data[7] = (total shr 8).toByte()
a5Data[8] = total.toByte()
val crcData = ByteArray(a5Data.size -3)
System.arraycopy(data, 0, a5Data, 9, data.size)
System.arraycopy(a5Data, 1, crcData, 0, crcData.size)
val crc16 = AiLinkBleCheckUtil.getCrc16(crcData)
a5Data[a5Data.size - 2] = (crc16 shr 8).toByte()
a5Data[a5Data.size - 1] = crc16.toByte()
return a5Data
}

private fun sendA5DataEnd() {
//包头+cid+长度+sum+包尾=7
val a5Data = ByteArray(8)
val len = 0x03
a5Data[0] = 0xA5.toByte()
a5Data[1] = 0x00
a5Data[2] = len.toByte()
a5Data[3] = 0x03
a5Data[4] = 0x02
a5Data[5] = 0x00
val crcData = ByteArray(5)
System.arraycopy(a5Data, 1, crcData, 0, crcData.size)
val crc16 = AiLinkBleCheckUtil.getCrc16(crcData)
a5Data[a5Data.size - 2] = (crc16 shr 8).toByte()
a5Data[a5Data.size - 1] = crc16.toByte()
sendData(a5Data)
}

/**
* 设置通知
*/
private fun readNotify(uuidNotify: UUID?, notifyOpen: Boolean = true) {
if (uuidNotify == null) {
return
}
if (mBleDevice != null && sendUuidServer != null) {
if (notifyOpen) {
mBleDevice!!.setNotify(sendUuidServer, uuidNotify)
} else {
mBleDevice!!.setCloseNotify(sendUuidServer, uuidNotify)
}
} else {
mList.add(TimeUtils.getTime() + "请先设置特征UUID和服务UUID")
mHandler.sendEmptyMessage(REFRESH_DATA)
}
}

private var mShowLog = true
private fun addLog(log: String?) {
if (mShowLog) {
BleLog.i(log)
mList.add(TimeUtils.getTimeSSS() + log)
mHandler.sendEmptyMessage(REFRESH_DATA)
}
}

override fun onDestroy() {
super.onDestroy()
mBleDevice?.disconnect()
}
}

+ 1
- 1
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/blood_glucose/BloodGlucoseActivity.java View File

@@ -43,7 +43,7 @@ public class BloodGlucoseActivity extends BleBaseActivity implements OnCallbackB
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_blood_glucose);
mAddress = getIntent().getStringExtra("mac");
support_unit = findViewById(R.id.support_unit);
support_unit = findViewById(R.id.getSupportUnit);
quest_status = findViewById(R.id.quest_status);
showdata=findViewById(R.id.showdata);
test = findViewById(R.id.test);

+ 71
- 51
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/broadcast_weight_sacle/BroadcastWeightScaleActivity.java View File

@@ -25,9 +25,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.UUID;
import java.util.Locale;

import aicare.net.cn.sdk.ailinksdkdemoandroid.BroadcastScaleActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
@@ -38,6 +39,7 @@ import cn.net.aicare.modulelibrary.module.broadcastweightscale.BroadcastWeightSc

/**
* 广播体重秤
*
* @auther ljl
* on 2023/3/10
*/
@@ -81,21 +83,23 @@ public class BroadcastWeightScaleActivity extends BleNewBaseActivity implements
mContext = this;
// mAddress = getIntent().getStringExtra("mac");
mBleSendCmdUtil = BleSendCmdUtil.getInstance();
init();
initView();
initData();
initListener();

}

private void init() {

private void initData() {
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);
}


private void initView() {
tv_broadcast_temp = findViewById(R.id.tv_broadcast_temp_weight);

mRadioButtonKg = findViewById(R.id.radio_weight_kg_weight);
@@ -105,6 +109,16 @@ public class BroadcastWeightScaleActivity extends BleNewBaseActivity implements

tv_broadcast_mac = findViewById(R.id.tv_broadcast_mac_weight);
tv_broadcast_did = findViewById(R.id.tv_broadcast_did_weight);
}

private void initListener() {


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);


}

@@ -114,20 +128,15 @@ public class BroadcastWeightScaleActivity extends BleNewBaseActivity implements
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;

int checkedRadioButtonId = group.getCheckedRadioButtonId();
if (checkedRadioButtonId == R.id.radio_weight_kg_weight) {
mWeightUnit = BroadcastWeightScaleBleConfig.UNIT_KG;
} else if (checkedRadioButtonId == R.id.radio_weight_jin_weight) {
mWeightUnit = BroadcastWeightScaleBleConfig.UNIT_F;
} else if (checkedRadioButtonId == R.id.radio_weight_st_lb_weight) {
mWeightUnit = BroadcastWeightScaleBleConfig.UNIT_ST;
} else if (checkedRadioButtonId == R.id.radio_weight_lb_lb_weight) {
mWeightUnit = BroadcastWeightScaleBleConfig.UNIT_LB_LB;
}
BleLog.i("ljl", "weightUnit:" + mWeightUnit);
}
@@ -155,25 +164,20 @@ public class BroadcastWeightScaleActivity extends BleNewBaseActivity implements

@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 (AILinkBleManager.getInstance() != null) {
AILinkBleManager.getInstance().startScan(0, UUID.fromString("0000F0A0-0000-1000-8000-00805F9B34FB"));
}
break;
case R.id.stop_weight:
if (AILinkBleManager.getInstance() != null) {
AILinkBleManager.getInstance().stopScan();
}
break;
default:
break;
int id = v.getId();
if (id == R.id.clear_weight) {
if (mList != null) {
mList.clear();
}
mHandler.sendEmptyMessage(REFRESH_DATA);
} else if (id == R.id.open_weight) {
if (AILinkBleManager.getInstance() != null) {
AILinkBleManager.getInstance().startScan(0, BleConfig.UUID_SERVER_BROADCAST_AILINK);
}
} else if (id == R.id.stop_weight) {
if (AILinkBleManager.getInstance() != null) {
AILinkBleManager.getInstance().stopScan();
}
}
}

@@ -183,7 +187,6 @@ public class BroadcastWeightScaleActivity extends BleNewBaseActivity implements

@Override
public void onServiceSuccess() {
BleLog.i("ljl", "服务与界面建立连接成功");
//与服务建立连接
if (AILinkBleManager.getInstance() != null) {
mDevice = BroadcastWeightScaleDeviceData.getInstance();
@@ -195,7 +198,6 @@ public class BroadcastWeightScaleActivity extends BleNewBaseActivity implements

@Override
public void onServiceErr() {
BleLog.i("ljl", "服务与界面连接断开");
//与服务断开连接
AILinkBleManager.getInstance().removeOnBleBroadcastDataListener(this);
}
@@ -213,15 +215,13 @@ public class BroadcastWeightScaleActivity extends BleNewBaseActivity implements

@Override
public void bleOpen() {
mList.add(TimeUtils.getTime() + "蓝牙打开");
mHandler.sendEmptyMessage(REFRESH_DATA);
addLog("蓝牙打开");
}

@Override
public void bleClose() {
BleLog.i(TAG, "蓝牙未开启,可请求开启");
mList.add(TimeUtils.getTime() + "蓝牙关闭");
mHandler.sendEmptyMessage(REFRESH_DATA);
addLog("蓝牙关闭");
}

//-----------------通知-------------------
@@ -238,8 +238,7 @@ public class BroadcastWeightScaleActivity extends BleNewBaseActivity implements
return;
}
mOldData = data;
mList.add(TimeUtils.getTime() + "数据ID" + type + " ,||解密payload数据:" + data + " ,||原始厂商数据:" + BleStrUtils.byte2HexStr(dataOriginal));
mHandler.sendEmptyMessage(REFRESH_DATA);
addLog( "数据ID" + type + " ,||解密payload数据:" + data + " ,||原始厂商数据:" + BleStrUtils.byte2HexStr(dataOriginal));
}


@@ -322,8 +321,8 @@ public class BroadcastWeightScaleActivity extends BleNewBaseActivity implements
}


mList.add(showData);
mHandler.sendEmptyMessage(REFRESH_DATA);
addLog(showData);
}

@Override
@@ -357,8 +356,29 @@ public class BroadcastWeightScaleActivity extends BleNewBaseActivity implements
int vid = bleValueBean.getVid();
int pid = bleValueBean.getPid();
if (mDevice != null) {
mDevice.onNotifyData(bleValueBean.getManufacturerData(),payload, cid, vid, pid);
mDevice.onNotifyData(bleValueBean.getManufacturerData(), payload, cid, vid, pid);
}
}
}


private String mOldLog = "";
private SimpleDateFormat sdf;

/**
* 添加日志
*
* @param log 日志
*/
private void addLog(String log) {
if (mOldLog.equalsIgnoreCase(log)) {
return;
}
if (sdf == null) {
sdf = new SimpleDateFormat("HH:mm:ss", Locale.US);
}
mOldLog = log;
mList.add(0, sdf.format(System.currentTimeMillis()) + ":\n" + log);
mHandler.sendEmptyMessage(REFRESH_DATA);
}
}

+ 111
- 70
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/bw05watch/Bw05WatchActivity.java View File

@@ -52,7 +52,10 @@ public class Bw05WatchActivity extends BleBaseActivity implements OnBw05WatchDat

private Button btnSetTime, btnQueryInfo, btnQueryThreshold;
private Button btnSetCheckTime, btnSetBleName, btnSetThreshold;
private Button btnConnect, btnClearLog;
private Button btnConnect, btnClearLog, btnHisTime;
private Button btnQueryTheme, btnSetThemeNum;

private Button btnQueryVersion, btnSetBind, btnQueryHardware;

private EditText etCheckTime, etBleName;
private EditText etHrMin, etHrMax;
@@ -60,16 +63,16 @@ public class Bw05WatchActivity extends BleBaseActivity implements OnBw05WatchDat
private EditText etTempMin, etTempMax;
private EditText etSbpMin, etSbpMax;
private EditText etDbpMin, etDbpMax;
private EditText etMac;
private EditText etMac, etThemeNum, etHisTime;

private CheckBox cbCheckTime;
private CheckBox cbCheckTime, cbHisTime;

private ListView log_list;

private List<String> mList;
private ArrayAdapter mListAdapter;

private String checkTimeOp;
private String checkTimeOp, hisTimeOp;

private Bw05WatchBleDevice mBw05WatchBleDevice;

@@ -98,6 +101,18 @@ public class Bw05WatchActivity extends BleBaseActivity implements OnBw05WatchDat
btnConnect.setOnClickListener(this);
btnClearLog = findViewById(R.id.btnClearLog);
btnClearLog.setOnClickListener(this);
btnQueryTheme = findViewById(R.id.btnQueryTheme);
btnQueryTheme.setOnClickListener(this);
btnSetThemeNum = findViewById(R.id.btnSetThemeNum);
btnSetThemeNum.setOnClickListener(this);
btnQueryVersion = findViewById(R.id.btnQueryVersion);
btnQueryVersion.setOnClickListener(this);
btnSetBind = findViewById(R.id.btnSetBind);
btnSetBind.setOnClickListener(this);
btnQueryHardware = findViewById(R.id.btnQueryHardware);
btnQueryHardware.setOnClickListener(this);
btnHisTime = findViewById(R.id.btnHisTime);
btnHisTime.setOnClickListener(this);

etCheckTime = findViewById(R.id.etCheckTime);
etBleName = findViewById(R.id.etBleName);
@@ -112,10 +127,14 @@ public class Bw05WatchActivity extends BleBaseActivity implements OnBw05WatchDat
etDbpMin = findViewById(R.id.etDbpMin);
etDbpMax = findViewById(R.id.etDbpMax);
etMac = findViewById(R.id.etMac);
etThemeNum = findViewById(R.id.etThemeNum);
etHisTime = findViewById(R.id.etHisTime);

cbCheckTime = findViewById(R.id.cbCheckTime);
cbHisTime = findViewById(R.id.cbHisTime);

checkTimeOp = cbCheckTime.isChecked() ? "1" : "0";
hisTimeOp = cbHisTime.isChecked() ? "1" : "0";

cbCheckTime.setOnCheckedChangeListener((buttonView, isChecked) -> {
if (isChecked) {
@@ -125,6 +144,14 @@ public class Bw05WatchActivity extends BleBaseActivity implements OnBw05WatchDat
}
});

cbHisTime.setOnCheckedChangeListener((buttonView, isChecked) -> {
if (isChecked) {
hisTimeOp = "1";
} else {
hisTimeOp = "0";
}
});

etTempMin.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
@@ -199,84 +226,98 @@ public class Bw05WatchActivity extends BleBaseActivity implements OnBw05WatchDat
if (v == null) {
return;
}
switch (v.getId()) {
case R.id.btnSetTime:
//设置时间
if (mBw05WatchBleDevice != null) {
mBw05WatchBleDevice.setTime();
int id = v.getId();
if (id == R.id.btnSetTime) {//设置时间
if (mBw05WatchBleDevice != null) {
mBw05WatchBleDevice.setTime();
}
} else if (id == R.id.btnQueryInfo) {//查询信息
if (mBw05WatchBleDevice != null) {
mBw05WatchBleDevice.queryInfo();
}
} else if (id == R.id.btnQueryThreshold) {//查询阈值
if (mBw05WatchBleDevice != null) {
mBw05WatchBleDevice.queryThreshold();
}
} else if (id == R.id.btnSetCheckTime) {//设置检测间隔时间
if (!TextUtils.isEmpty(etCheckTime.getText().toString())) {
if (etCheckTime.getText().toString().length() < 4 && mBw05WatchBleDevice != null) {
mBw05WatchBleDevice.setCheckTime(checkTimeOp + formatDataStr(etCheckTime.getText().toString(), 3));
}
break;
case R.id.btnQueryInfo:
//查询信息
}
} else if (id == R.id.btnSetBleName) {//设置蓝牙名称
if (!TextUtils.isEmpty(etBleName.getText().toString())) {
if (mBw05WatchBleDevice != null) {
mBw05WatchBleDevice.queryInfo();
mBw05WatchBleDevice.setBleName(etBleName.getText().toString());
}
break;
case R.id.btnQueryThreshold:
//查询阈值
}
} else if (id == R.id.btnSetThreshold) {//设置阈值
if (!TextUtils.isEmpty(getFloatThresholdValue(etTempMin.getText().toString(), etTempMin.getHint().toString()))
&& !TextUtils.isEmpty(getFloatThresholdValue(etTempMax.getText().toString(), etTempMax.getHint().toString()))) {
if (mBw05WatchBleDevice != null) {
mBw05WatchBleDevice.queryThreshold();
}
break;
case R.id.btnSetCheckTime:
//设置检测间隔时间
if (!TextUtils.isEmpty(etCheckTime.getText().toString())) {
if (etCheckTime.getText().toString().length() < 4 && mBw05WatchBleDevice != null) {
mBw05WatchBleDevice.setCheckTime(checkTimeOp + formatDataStr(etCheckTime.getText().toString(), 3));
}
}
break;
case R.id.btnSetBleName:
//设置蓝牙名称
if (!TextUtils.isEmpty(etBleName.getText().toString())) {
if (mBw05WatchBleDevice != null) {
mBw05WatchBleDevice.setBleName(etBleName.getText().toString());
}
}
break;
case R.id.btnSetThreshold:
//设置阈值
if (!TextUtils.isEmpty(getFloatThresholdValue(etTempMin.getText().toString(), etTempMin.getHint().toString()))
&& !TextUtils.isEmpty(getFloatThresholdValue(etTempMax.getText().toString(), etTempMax.getHint().toString()))) {
if (mBw05WatchBleDevice != null) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(getIntThresholdValue(etHrMin.getText().toString(), etHrMin.getHint().toString()));
stringBuilder.append(getIntThresholdValue(etHrMax.getText().toString(), etHrMax.getHint().toString()));
stringBuilder.append(getIntThresholdValue(etSpo2Min.getText().toString(), etSpo2Min.getHint().toString()));
stringBuilder.append(getIntThresholdValue(etSpo2Max.getText().toString(), etSpo2Max.getHint().toString()));
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(getIntThresholdValue(etHrMin.getText().toString(), etHrMin.getHint().toString()));
stringBuilder.append(getIntThresholdValue(etHrMax.getText().toString(), etHrMax.getHint().toString()));
stringBuilder.append(getIntThresholdValue(etSpo2Min.getText().toString(), etSpo2Min.getHint().toString()));
stringBuilder.append(getIntThresholdValue(etSpo2Max.getText().toString(), etSpo2Max.getHint().toString()));
// stringBuilder.append(getIntThresholdValue(etSbpMin.getText().toString(), etSbpMin.getHint().toString()));
// stringBuilder.append(getIntThresholdValue(etSbpMax.getText().toString(), etSbpMax.getHint().toString()));
// stringBuilder.append(getIntThresholdValue(etDbpMin.getText().toString(), etDbpMin.getHint().toString()));
// stringBuilder.append(getIntThresholdValue(etDbpMax.getText().toString(), etDbpMax.getHint().toString()));
stringBuilder.append(getFloatThresholdValue(etTempMin.getText().toString(), etTempMin.getHint().toString()));
stringBuilder.append(getFloatThresholdValue(etTempMax.getText().toString(), etTempMax.getHint().toString()));
stringBuilder.append(getFloatThresholdValue(etTempMin.getText().toString(), etTempMin.getHint().toString()));
stringBuilder.append(getFloatThresholdValue(etTempMax.getText().toString(), etTempMax.getHint().toString()));

String payLoadStr = stringBuilder.toString();
mBw05WatchBleDevice.setRangeValue(payLoadStr);
}
String payLoadStr = stringBuilder.toString();
mBw05WatchBleDevice.setRangeValue(payLoadStr);
}
break;
case R.id.btnConnect:
//连接设备
if (btnConnect.getText().toString().equals("连接")) {
if (!TextUtils.isEmpty(etMac.getText().toString()) && isValidMacAddress(etMac.getText().toString()) && mAILinkBleManager != null) {
connectMac = etMac.getText().toString();
connectBle(connectMac.toUpperCase());
} else {
Toast.makeText(this, "地址出错", Toast.LENGTH_SHORT).show();
}
}
} else if (id == R.id.btnConnect) {//连接设备
if (btnConnect.getText().toString().equals("连接")) {
if (!TextUtils.isEmpty(etMac.getText().toString()) && isValidMacAddress(etMac.getText().toString()) && mAILinkBleManager != null) {
connectMac = etMac.getText().toString();
connectBle(connectMac.toUpperCase());
} else {
if (mAILinkBleManager != null && !TextUtils.isEmpty(connectMac)) {
mAILinkBleManager.disconnect(connectMac.toUpperCase());
}
Toast.makeText(this, "MAC地址出错", Toast.LENGTH_SHORT).show();
}
break;

case R.id.btnClearLog:
clearText();
break;
default:
break;
} else {
if (mAILinkBleManager != null && !TextUtils.isEmpty(connectMac)) {
mAILinkBleManager.disconnect(connectMac.toUpperCase());
}
}
} else if (id == R.id.btnQueryTheme) {//查询主题
if (mBw05WatchBleDevice != null) {
mBw05WatchBleDevice.queryTheme();
}
} else if (id == R.id.btnSetThemeNum) {//设置主题
if (!TextUtils.isEmpty(etThemeNum.getText().toString()) && ("1".equals(etThemeNum.getText().toString())
|| "2".equals(etThemeNum.getText().toString()) || "3".equals(etThemeNum.getText().toString()))) {
if (mBw05WatchBleDevice != null) {
mBw05WatchBleDevice.setTheme(etThemeNum.getText().toString());
}
} else {
Toast.makeText(this, "只支持输入1,2,3", Toast.LENGTH_SHORT).show();
}
} else if (id == R.id.btnQueryVersion) {//查询手环版本号
if (mBw05WatchBleDevice != null) {
mBw05WatchBleDevice.queryVersion();
}
} else if (id == R.id.btnSetBind) {//设置手环进入绑定模式
if (mBw05WatchBleDevice != null) {
mBw05WatchBleDevice.setBindMode();
}
} else if (id == R.id.btnQueryHardware) {//查询硬件状态
if (mBw05WatchBleDevice != null) {
mBw05WatchBleDevice.queryHardware();
}
} else if (id == R.id.btnHisTime) {//设置历史上传间隔
if (!TextUtils.isEmpty(etHisTime.getText().toString())) {
if (etHisTime.getText().toString().length() < 5 && mBw05WatchBleDevice != null) {
int time = Integer.parseInt(etHisTime.getText().toString());
mBw05WatchBleDevice.setHisTime(hisTimeOp + String.format(Locale.US, "%04d", time));
}
}
} else if (id == R.id.btnClearLog) {
clearText();
}
}


+ 280
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/caseTreasure/BleCaseTreasureActivity.kt View File

@@ -0,0 +1,280 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.caseTreasure

import aicare.net.cn.sdk.ailinksdkdemoandroid.R
import android.os.Handler
import android.os.Looper
import android.os.Message
import android.view.View
import android.view.WindowManager
import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.Toast
import cn.net.aicare.modulelibrary.module.bleCaseTreasure.BleCaseTreasureDevice
import com.pingwang.bluetoothlib.listener.OnCallbackBle
import com.pingwang.bluetoothlib.utils.BleStrUtils
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.KBleBaseNewActivity
import aicare.net.cn.sdk.ailinksdkdemoandroid.databinding.ActivityBleCaseTreasureBinding
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L
import java.text.SimpleDateFormat
import java.util.Locale


/**
* 病例宝界面
* @author xing
* @date 2025/06/03
* @constructor 创建[BleCaseTreasureActivity]
*/
class BleCaseTreasureActivity : KBleBaseNewActivity<ActivityBleCaseTreasureBinding>(), BleCaseTreasureDevice.OnBleCaseTreasureListener,
View.OnClickListener, OnCallbackBle {
private val REFRESH_DATA = 3
private val LOOPSEND_KEY = 4
private val mList: ArrayList<String> = arrayListOf()
private var listAdapter: ArrayAdapter<*>? = null
private var mMac = ""
private var mBleCaseTreasureDevice: BleCaseTreasureDevice? = null
private var spList = arrayOf("ASCII")
private var mSelectPosition = 0
private var mSendIntervalMs = 1000L
private var mSendCountAll = 0
private var mSendCount = 0
private var mSendData = ""

private val mHandler: Handler = object : Handler(Looper.getMainLooper()) {
override fun handleMessage(msg: Message) {
when (msg.what) {
REFRESH_DATA -> listAdapter?.notifyDataSetChanged()
LOOPSEND_KEY -> {
if (mSendCount >= mSendCountAll) {
addLog("已循环发送完成:$mSendCount")
removeMessages(LOOPSEND_KEY)
return
}
val charsetName = spList[mSelectPosition]
mBleCaseTreasureDevice?.sendString(charsetName, "$mSendCount:$mSendData")
mSendCount++
binding.tvSendCount.text = "$mSendCount"
sendEmptyMessageDelayed(LOOPSEND_KEY, mSendIntervalMs)
}
}
}
}

override fun getLayoutView(): ActivityBleCaseTreasureBinding {
return ActivityBleCaseTreasureBinding.inflate(layoutInflater)
}

override fun initListener() {
binding.btnConnect.setOnClickListener(this)
binding.btnDisconnect.setOnClickListener(this)
binding.btnClear.setOnClickListener(this)
binding.btnGetVersion.setOnClickListener(this)
binding.btnGetDeviceStatus.setOnClickListener(this)
binding.btnSendData.setOnClickListener(this)
binding.btnSendSpeed.setOnClickListener(this)
binding.btnLoopSend.setOnClickListener(this)
binding.btnStopSend.setOnClickListener(this)
binding.btnResetCount.setOnClickListener(this)
binding.spEncoding.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
mSelectPosition = position
addLog("选择的项:${spList[position]}")

}

override fun onNothingSelected(parent: AdapterView<*>?) {
L.i("没有选择")
}
}

}

override fun onClick(v: View?) {
when (v?.id) {
R.id.btnConnect -> {
mBleManager.connectDevice(mMac)
}

R.id.btnDisconnect -> {
mBleManager.disconnect(mMac)
}

R.id.btnClear -> {
mList.clear()
mHandler.sendEmptyMessage(REFRESH_DATA)
}

R.id.btnGetVersion -> {
mBleCaseTreasureDevice?.getVersion()

}

R.id.btnGetDeviceStatus -> {
mBleCaseTreasureDevice?.getDeviceStatus()
}

R.id.btnSendData -> {
val data = binding.etData.text.toString()
if (data.isEmpty()) {
addLog("发送的内容不能为空")
return
}
val charsetName = spList[mSelectPosition]
mBleCaseTreasureDevice?.sendString(charsetName, data)
}

R.id.btnSendSpeed -> {
val data = binding.etSpeedUs.text.toString()
mBleCaseTreasureDevice?.setSpeed(data.toInt())
}

R.id.btnLoopSend -> {
mSendCountAll = binding.etCount.text.toString().toInt()
mSendIntervalMs = binding.etIntervalMs.text.toString().toLong()
mSendData = binding.etData.text.toString()
if (mSendData.isEmpty()) {
addLog("发送的内容不能为空")
return
}
if (mSendIntervalMs<1000){
addLog("发送间隔不能小于1000")
Toast.makeText(this,"发送间隔不能小于1000", Toast.LENGTH_LONG).show()
return
}
mHandler.removeMessages(LOOPSEND_KEY)
mHandler.sendEmptyMessage(LOOPSEND_KEY)
}

R.id.btnStopSend -> {
mHandler.removeMessages(LOOPSEND_KEY)
}
R.id.btnResetCount -> {
mSendCount = 0
binding.tvSendCount.text = "$mSendCount"
mHandler.removeMessages(LOOPSEND_KEY)
}

else -> {}
}
}

override fun initData() {
//设置常亮
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
mMac = intent.getStringExtra("mac") ?: ""
if (mMac.isEmpty()) {
finish()
return
}
binding.tvMac.text = mMac
listAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, mList)
binding.listview.adapter = listAdapter
spList = resources.getStringArray(R.array.spinner_encoding_format)
val adapter = ArrayAdapter.createFromResource(this, R.array.spinner_encoding_format, android.R.layout.simple_spinner_item)
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
binding.spEncoding.adapter = adapter
binding.spEncoding.setSelection(mSelectPosition)
onServiceSuccess()
}

override fun onServiceSuccess() {
if (mMac.isEmpty() || mBleManager == null) {
return
}
val bleDevice = mBleManager.getBleDevice(mMac)
bleDevice?.let {
addLog("连接成功:${mMac}")
mBleManager.setOnCallbackBle(this)
mBleCaseTreasureDevice = BleCaseTreasureDevice(bleDevice)
mBleCaseTreasureDevice?.addListener(this@BleCaseTreasureActivity)
}

}

override fun onServiceErr() {

}

override fun unbindServices() {

}

override fun bleOpen() {
addLog("蓝牙已打开")
}

override fun bleClose() {
addLog("蓝牙已关闭")
}

override fun onServicesDiscovered(mac: String?) {
onServiceSuccess()
}

override fun onDisConnected(mac: String?, code: Int) {
addLog("断开连接:$mac 错误码:$code")
mHandler.removeMessages(LOOPSEND_KEY)
}

override fun onVersion(version: String?) {
addLog("版本号:$version")
}

override fun onDeviceStatus(status: Int, dataId: Int, sendId: Int) {
addLog("设备状态:$status,病例ID:$dataId,已传帧ID:$sendId")
}

override fun onSendDataSchedule(cur: Int, size: Int) {
addLog("已发送帧数:$cur,总帧数:${size}, 发送完成")
}

override fun onSendFail() {
addLog("发送失败")
}

override fun onSendDataId(dataId: Int) {
addLog("发送的数据ID:$dataId")
}

override fun onSendHex(hex: ByteArray?) {
L.i("发送的数据:${BleStrUtils.byte2HexStr(hex)}")
// addLog("发送的数据:${BleStrUtils.byte2HexStr(hex)}")
}

override fun onSetSpeed(status: Int) {
addLog("设置打字速度:${if (status == 0) "成功" else "失败"}")
}

override fun onDestroy() {
super.onDestroy()
mHandler.removeMessages(LOOPSEND_KEY)
}

//-----------log---------------


private var mOldLog = ""
private var sdf: SimpleDateFormat? = null

/**
* 添加日志
*
* @param log 日志
*/
private fun addLog(log: String) {
if (mOldLog.equals(log, ignoreCase = true)) {
return
}
if (sdf == null) {
sdf = SimpleDateFormat("HH:mm:ss:SSS", Locale.US)
}
mOldLog = log
mList.add(
0, """
${sdf!!.format(System.currentTimeMillis())}:
$log
""".trimIndent()
)
mHandler.sendEmptyMessage(REFRESH_DATA)
}
}

+ 29
- 55
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/coffee_scale/CoffeeScaleActivity.java View File

@@ -166,60 +166,34 @@ public class CoffeeScaleActivity extends BleBaseActivity implements View.OnClick

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_clear:
// 清空文本框
clearText();
break;
case R.id.btnPause:
// 清空文本框
mPauseRefresh = !mPauseRefresh;
break;
case R.id.btn_zero:
// APP下发去皮功能(归零功能)
//某些秤可能需要进入冲煮模式才能使用,并且设备上面的定时和归零可用
appSetZero();
break;
case R.id.btn_set_weight_unit:
// APP下发重量单位
appSetWeightUnit();
break;
case R.id.btn_set_temp_unit:
// APP下发温度单位
appSetTempUnit();
break;
case R.id.btn_set_auto_shutdown:
// APP下发自动关机
appSetAutoShutdown();
break;
case R.id.btn_set_timing:
// APP下发计时功能控制
appSetTiming();
break;
case R.id.btn_callback_timing:
// APP回复计时功能
appCallbackTiming();
break;
case R.id.btn_set_alert:
// APP下发报警设置
appSetAlert();
break;
case R.id.btn_stop_alert:
// APP停止报警指令
appStopAlert();
break;
case R.id.btn_callback_alert:
// APP回复报警设置
appCallbackAlert();
break;
case R.id.btn_callback_stop_alert:
// APP回复停止报警
appCallbackStopAlert();
break;
case R.id.btn_brew_mode:
// APP设置冲煮模式
appBrewMode();
break;
int id = v.getId();
if (id == R.id.btn_clear) {// 清空文本框
clearText();
} else if (id == R.id.btnPause) {// 清空文本框
mPauseRefresh = !mPauseRefresh;
} else if (id == R.id.btn_zero) {// APP下发去皮功能(归零功能)
//某些秤可能需要进入冲煮模式才能使用,并且设备上面的定时和归零可用
appSetZero();
} else if (id == R.id.btn_set_weight_unit) {// APP下发重量单位
appSetWeightUnit();
} else if (id == R.id.btn_set_temp_unit) {// APP下发温度单位
appSetTempUnit();
} else if (id == R.id.btn_set_auto_shutdown) {// APP下发自动关机
appSetAutoShutdown();
} else if (id == R.id.btn_set_timing) {// APP下发计时功能控制
appSetTiming();
} else if (id == R.id.btn_callback_timing) {// APP回复计时功能
appCallbackTiming();
} else if (id == R.id.btn_set_alert) {// APP下发报警设置
appSetAlert();
} else if (id == R.id.btn_stop_alert) {// APP停止报警指令
appStopAlert();
} else if (id == R.id.btn_callback_alert) {// APP回复报警设置
appCallbackAlert();
} else if (id == R.id.btn_callback_stop_alert) {// APP回复停止报警
appCallbackStopAlert();
} else if (id == R.id.btn_brew_mode) {// APP设置冲煮模式
appBrewMode();
}
}

@@ -537,7 +511,7 @@ public class CoffeeScaleActivity extends BleBaseActivity implements View.OnClick
}
}

SimpleDateFormat sdf;
private SimpleDateFormat sdf;
// 添加一条文本
private void addText(String text) {
if (mPauseRefresh) {

+ 6
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/eight_bodyfat/EightBodyFatAdc.java View File

@@ -1,5 +1,11 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.eight_bodyfat;

/**
* 八电极阻抗信息
*
* @author xing
* @date 2024/11/29
*/
public class EightBodyFatAdc {



+ 86
- 23
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/eight_bodyfat/EightBodyFatMcuActivity.java View File

@@ -4,6 +4,7 @@ import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.RadioButton;

@@ -14,11 +15,14 @@ import com.pingwang.bluetoothlib.bean.SupportUnitBean;
import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.listener.OnCallbackBle;

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.UnitUtils;
import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatMcuDeviceData;
import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatUtil;

@@ -33,21 +37,25 @@ public class EightBodyFatMcuActivity extends BleBaseActivity implements View.OnC
private String mAddress;
private EightBodyFatMcuDeviceData mEightBodyFatDeviceData;
private RadioButton kg, jing, stlb, lb, C, F;
private UserInfoBean mUserInfoBean;
private EditText et_weight, et_height, et_age, et_sex;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_eight_body_fata);
mAddress = getIntent().getStringExtra("mac");
init();
loglist = new ArrayList<>();
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, loglist);
log_list.setAdapter(listAdapter);

initView();
initData();
initListener();
setTitleData("八电极秤 MCU算法:0x" + Integer.toHexString(EightBodyFatUtil.EIGHT_BODY_FAT_SCALE_MCU));
}


private void init() {
private void initView() {
et_weight = findViewById(R.id.et_weight);
et_height = findViewById(R.id.et_height);
et_age = findViewById(R.id.et_age);
et_sex = findViewById(R.id.et_sex);
log_list = findViewById(R.id.log_list);
kg = findViewById(R.id.kg);
jing = findViewById(R.id.jin);
@@ -55,7 +63,38 @@ public class EightBodyFatMcuActivity extends BleBaseActivity implements View.OnC
lb = findViewById(R.id.lb);
C = findViewById(R.id.c);
F = findViewById(R.id.f);
findViewById(R.id.support_unit).setOnClickListener(this);
}

private void initData() {
initUserInfo();
loglist = new ArrayList<>();
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, loglist);
log_list.setAdapter(listAdapter);
}

/**
* 初始化用户信息
*/
private void initUserInfo() {
String weightKg = et_weight.getText().toString().trim();
String height = et_height.getText().toString().trim();
String age = et_age.getText().toString().trim();
String sex = et_sex.getText().toString().trim();
if (mUserInfoBean == null) {
mUserInfoBean = new UserInfoBean();
mUserInfoBean.setUserId(1);
mUserInfoBean.setUserType(0);
}
mUserInfoBean.setAge(Integer.parseInt(age));
mUserInfoBean.setSex(Integer.parseInt(sex));
mUserInfoBean.setHeightCm(Integer.parseInt(height));
mUserInfoBean.setWeightKg(Float.parseFloat(weightKg));
}


private void initListener() {
findViewById(R.id.getSupportUnit).setOnClickListener(this);
findViewById(R.id.btn_update).setOnClickListener(this);
kg.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
@@ -150,9 +189,12 @@ public class EightBodyFatMcuActivity extends BleBaseActivity implements View.OnC

@Override
public void onClick(View v) {
if (v.getId() == R.id.support_unit) {
if (v.getId() == R.id.getSupportUnit) {
if (mEightBodyFatDeviceData != null)
mEightBodyFatDeviceData.getUnitList();
}else if (v.getId() == R.id.btn_update) {
initUserInfo();
addLog("更新用户信息");
}
}

@@ -179,7 +221,6 @@ public class EightBodyFatMcuActivity extends BleBaseActivity implements View.OnC
addLog("设备返回操作指令:" + opCodeStr + " 结果:" + resultStr);
}

private double weightValue;

@Override
public void onWeight(int status, int weight, int unit, int decimal) {
@@ -188,24 +229,25 @@ public class EightBodyFatMcuActivity extends BleBaseActivity implements View.OnC
statusStr = "实时体重";
} else if (status == 0x02) {
statusStr = "稳定体重";
mUserInfoBean.setWeightKg(Float.parseFloat(UnitUtils.getWeightToKg(unit,String.valueOf(weight),decimal)));
}
if (decimal == 0) {
weightValue = weight;
} else {
weightValue = weight / (decimal * 10.0);
}
float weightF = Float.parseFloat(UnitUtils.getHoldDecimal(decimal, weight));
String unitStr = "";
if (unit == EightBodyFatUtil.KG) {
unitStr = "kg";
mUserInfoBean.setWeightKg(weightF);
} else if (unit == EightBodyFatUtil.JIN) {
unitStr = "斤";
mUserInfoBean.setWeightKg(weightF / 2);
} else if (unit == EightBodyFatUtil.ST) {
unitStr = "lb(未转换为st:lb)";
} else if (unit == EightBodyFatUtil.LB) {
unitStr = "lb";
}

addLog("体重:" + statusStr + " " + weightValue + unitStr);
if (et_weight != null) {
et_weight.setText(String.valueOf(weightF));
}
addLog("体重:" + statusStr + " " + weightF + unitStr);
}

@Override
@@ -229,41 +271,57 @@ public class EightBodyFatMcuActivity extends BleBaseActivity implements View.OnC
addLog("身高:" + statusStr + " " + height + unitStr);
}

private EightBodyFatAdc mEightBodyFatAdc;

@Override
public void onImpedance(int status, EightBodyFatMcuDeviceData.EightBodyFatAdc eightBodyFatAdc, int arithmetic) {
String statusStr = "";
if (status == EightBodyFatUtil.IMPEDANCE_MEASUREMENT) {
statusStr = "测量中";
mEightBodyFatAdc = new EightBodyFatAdc();
mEightBodyFatAdc.setAlgorithms(0x20);
} else if (status == EightBodyFatUtil.IMPEDANCE_FAILED) {
statusStr = "测量失败";
} else if (status == EightBodyFatUtil.IMPEDANCE_SUCCESS_MCU) {
statusStr = "测量完成";

}
String partStr = "";
int part = eightBodyFatAdc.getPart();
int adc = eightBodyFatAdc.getAdc();
if (part == 0x00) {
partStr = "双脚阻抗";
mEightBodyFatAdc.setAdcFoot(adc);
} else if (part == 0x01) {
partStr = "双手阻抗";
mEightBodyFatAdc.setAdcHand(adc);
} else if (part == 0x02) {
partStr = "左手阻抗";
mEightBodyFatAdc.setAdcLeftHand(adc);
} else if (part == 0x03) {
partStr = "右手阻抗";
mEightBodyFatAdc.setAdcRightHand(adc);
} else if (part == 0x04) {
partStr = "左脚阻抗";
mEightBodyFatAdc.setAdcLeftFoot(adc);
} else if (part == 0x05) {
partStr = "右脚阻抗";
mEightBodyFatAdc.setAdcRightFoot(adc);
} else if (part == 0x06) {
partStr = "左全身阻抗";
mEightBodyFatAdc.setAdcLeftBody(adc);
} else if (part == 0x07) {
partStr = "右全身阻抗";
mEightBodyFatAdc.setAdcRightBody(adc);
} else if (part == 0x08) {
partStr = "右手左脚阻抗";
mEightBodyFatAdc.setAdcRightHandLeftFoot(adc);
} else if (part == 0x09) {
partStr = "左手右脚阻抗";
mEightBodyFatAdc.setAdcLeftHandRightFoot(adc);
} else if (part == 0x0A) {
partStr = "躯干阻抗";
mEightBodyFatAdc.setAdcBody(adc);
}

addLog("阻抗:" + statusStr + " " + partStr + " : " + adc);
@@ -302,15 +360,18 @@ public class EightBodyFatMcuActivity extends BleBaseActivity implements View.OnC

@Override
public void onSyncUserInfo() {
addLog("请求同步用户信息:" + "默认传入用户:用户ID:1, 普通人:0, 性别:男,身高:180,年龄27");
addLog("请求同步用户信息:" + "默认传入用户:" + mUserInfoBean.toString());
if (mEightBodyFatDeviceData != null) {
mEightBodyFatDeviceData.setUserInfo(1, 0, 1, 27, 180);
mEightBodyFatDeviceData.setUserInfo(mUserInfoBean.getUserId(), mUserInfoBean.getUserType(), mUserInfoBean.getSex(), mUserInfoBean.getAge(), mUserInfoBean.getHeightCm());
}
}

@Override
public void onCompletionData() {
addLog("请求补充体脂数据");
if (mEightBodyFatAdc != null) {
mEightBodyFatAdc.setAlgorithms(0xFFFF);
}
}

@Override
@@ -320,6 +381,7 @@ public class EightBodyFatMcuActivity extends BleBaseActivity implements View.OnC

@Override
public void onTestSuccess(EightBodyFatMcuDeviceData.EightBodyFatInfo bodyFat) {
//测量完成
addLog("体脂数据:" + bodyFat.toString());
}

@@ -355,7 +417,7 @@ public class EightBodyFatMcuActivity extends BleBaseActivity implements View.OnC
}

private String mOldLog = "";
private SimpleDateFormat sdf;
/**
* 添加日志
*
@@ -365,14 +427,15 @@ public class EightBodyFatMcuActivity extends BleBaseActivity implements View.OnC
if (mOldLog.equalsIgnoreCase(log)) {
return;
}
if (sdf == null) {
sdf = new SimpleDateFormat("HH:mm:ss", Locale.US);
}
mOldLog = log;
loglist.add(0, log);
loglist.add(0,sdf.format(System.currentTimeMillis()) + ":\n" + log);
if (listAdapter != null) {
listAdapter.notifyDataSetChanged();
}
}




}

+ 55
- 227
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/eight_bodyfat/EightBodyfatActivity.java View File

@@ -10,7 +10,8 @@ import android.widget.RadioButton;

import androidx.annotation.Nullable;

import com.holtek.libHTBodyfat.HTBodyBasicInfo;
import com.pingwang.bluetoothlib.AILinkBleManager;
import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.bean.SupportUnitBean;
import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.listener.OnCallbackBle;
@@ -22,13 +23,11 @@ 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.modules.eight_bodyfat.dual_band.UserInfoBean;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.EightBodyFatAlgorithms;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.EightBodyFatBean;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.UnitUtils;
import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatBleDeviceData;
import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatMcuDeviceData;
import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatUtil;
import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightOneBodyFatAdcBean;
import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightOneDataBodyFatBean;

/**
* 八电极秤 (单频APP算法)
@@ -43,6 +42,7 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic
private RadioButton kg, jing, stlb, lb, C, F;
private UserInfoBean mUserInfoBean;
private EditText et_weight, et_height, et_age, et_sex;
private EightOneBodyFatAdcBean mEightOneBodyFatAdcBean;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -60,19 +60,22 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic

private void test() {
weight = 60;
if (mEightBodyFatAdc == null) {
mEightBodyFatAdc = new EightBodyFatAdc();
mEightBodyFatAdc.setAlgorithms(0x20);
if (mEightOneBodyFatAdcBean == null) {
mEightOneBodyFatAdcBean = new EightOneBodyFatAdcBean();
}
mEightOneBodyFatAdcBean.setAlgorithmsId(0x20);
mEightOneBodyFatAdcBean.setAdcFoot(5784349);
mEightOneBodyFatAdcBean.setAdcHand(5121114);
mEightOneBodyFatAdcBean.setAdcLeftHand(12854746);
mEightOneBodyFatAdcBean.setAdcRightHand(15738341);
mEightOneBodyFatAdcBean.setAdcLeftFoot(1074604);
mEightOneBodyFatAdcBean.setAdcRightFoot(13046299);
mEightOneBodyFatAdcBean.setAdcLeftBody(7480094);
mEightOneBodyFatAdcBean.setAdcRightBody(7480094);
if (mEightBodyFatBleDeviceData != null) {
mEightBodyFatBleDeviceData.getOneEightBodyData(mUserInfoBean.getSex(), mUserInfoBean.getAge(), mUserInfoBean.getWeightKg(),
mUserInfoBean.getHeightCm(), mEightOneBodyFatAdcBean);
}
mEightBodyFatAdc.setAdcFoot(5784349);
mEightBodyFatAdc.setAdcHand(5121114);
mEightBodyFatAdc.setAdcLeftHand(12854746);
mEightBodyFatAdc.setAdcRightHand(15738341);
mEightBodyFatAdc.setAdcLeftFoot(1074604);
mEightBodyFatAdc.setAdcRightFoot(13046299);
mEightBodyFatAdc.setAdcLeftBody(7480094);
mEightBodyFatAdc.setAdcRightBody(7480094);
kaimengJieMi(mEightBodyFatAdc, mUserInfoBean);
}


@@ -118,8 +121,9 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic


private void initListener() {
findViewById(R.id.support_unit).setOnClickListener(this);
findViewById(R.id.getSupportUnit).setOnClickListener(this);
findViewById(R.id.btn_update).setOnClickListener(this);
findViewById(R.id.btnConnect).setOnClickListener(this);
kg.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
@@ -198,6 +202,11 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic

}

@Override
public void onServicesDiscovered(String mac) {
onServiceSuccess();
}

@Override
public void unbindServices() {
if (mAILinkBleManager != null) {
@@ -207,12 +216,21 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic

@Override
public void onClick(View v) {
if (v.getId() == R.id.support_unit) {
if (v.getId() == R.id.getSupportUnit) {
if (mEightBodyFatBleDeviceData != null)
mEightBodyFatBleDeviceData.getUnitList();
} else if (v.getId() == R.id.btn_update) {
initUserInfo();
addLog("更新用户信息");
} else if (v.getId() == R.id.btnConnect) {
if (mEightBodyFatBleDeviceData != null) {
BleValueBean bleValueBean = mEightBodyFatBleDeviceData.getBleValueBean();
if (bleValueBean != null) {
AILinkBleManager.getInstance().connectDevice(bleValueBean);
}else {
AILinkBleManager.getInstance().connectDevice(mAddress);
}
}
}
}

@@ -248,45 +266,6 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic
adc = "阻抗测量完成";
break;
}
switch (result) {
case EightBodyFatUtil.IMPEDANCE_FOOT:
adc = adc + "双脚阻抗";
break;
case EightBodyFatUtil.IMPEDANCE_HAND:
adc = adc + "双手阻抗";
break;
case EightBodyFatUtil.IMPEDANCE_BODY:
adc = adc + "躯干阻抗";
break;
case EightBodyFatUtil.IMPEDANCE_L_HAND:
adc = adc + "左手阻抗";
break;
case EightBodyFatUtil.IMPEDANCE_R_HAND:
adc = adc + "右手阻抗";
break;
case EightBodyFatUtil.IMPEDANCE_L_FOOT:
adc = adc + "左脚阻抗";
break;
case EightBodyFatUtil.IMPEDANCE_R_FOOT:
adc = adc + "右脚阻抗";
break;
case EightBodyFatUtil.IMPEDANCE_L_BODY:
adc = adc + "左驱干";
break;
case EightBodyFatUtil.IMPEDANCE_R_BODY:
adc = adc + "右躯干";
break;
case EightBodyFatUtil.IMPEDANCE_R_HAND_L_FOOT:
adc = adc + "右手左脚";
break;
case EightBodyFatUtil.IMPEDANCE_L_HAND_R_FOOT:
adc = adc + "左手右脚";
break;
default:


}

addLog(adc);
break;
case EightBodyFatUtil.HEART_RATE:
@@ -311,8 +290,9 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic
case EightBodyFatUtil.MEASUREMENT_END:
addLog("测量完成");
//测量完成
if (mEightBodyFatAdc != null) {
kaimengJieMi(mEightBodyFatAdc, mUserInfoBean);
if (mEightBodyFatBleDeviceData != null && mEightOneBodyFatAdcBean != null) {
mEightBodyFatBleDeviceData.getOneEightBodyData(mUserInfoBean.getSex(), mUserInfoBean.getAge(), mUserInfoBean.getWeightKg(),
mUserInfoBean.getHeightCm(), mEightOneBodyFatAdcBean);
}

break;
@@ -368,6 +348,7 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic
stateStr = "实时体重";
} else if (state == EightBodyFatUtil.WEIGHT_STABILIZATION_WEIGHT) {
stateStr = "稳定体重";
mUserInfoBean.setWeightKg(Float.parseFloat(UnitUtils.getWeightToKg(unit, String.valueOf(weight), decimal)));
}
this.weight = weight;
if (unit == EightBodyFatUtil.ST) {
@@ -378,12 +359,14 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic
if (et_weight != null) {
et_weight.setText(String.valueOf(weight));
}

}


@Override
public void onImpedance(int adc, int part, int arithmetic) {
addLog("阻抗:" + adc + " 部位: " + part + " 算法" + arithmetic);
kaimeng(part, adc, arithmetic);
public void onImpedance(EightOneBodyFatAdcBean adcBean) {
mEightOneBodyFatAdcBean = adcBean;
addLog("阻抗测量完成:阻抗信息:" + adcBean);
}

@Override
@@ -411,173 +394,18 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic
}

@Override
public void showData(String data) {
// loglist.add(0, data);
public void onBodyFatData(@Nullable EightOneDataBodyFatBean bodyFatBean) {
addLog("获取体脂数据成功:\n" + bodyFatBean.toString());
}


private EightBodyFatAdc mEightBodyFatAdc;

private void kaimeng(int part, int adc, int algorithms) {
if (mEightBodyFatAdc == null) {
mEightBodyFatAdc = new EightBodyFatAdc();
}
mEightBodyFatAdc.setAlgorithms(algorithms);
switch (part) {
case EightBodyFatUtil.IMPEDANCE_FOOT:
//双脚阻抗
mEightBodyFatAdc.setAdcFoot(adc);
break;
case EightBodyFatUtil.IMPEDANCE_HAND:
//双手阻抗
mEightBodyFatAdc.setAdcHand(adc);

break;
case EightBodyFatUtil.IMPEDANCE_BODY:
//躯干阻抗
mEightBodyFatAdc.setAdcBody(adc);

break;
case EightBodyFatUtil.IMPEDANCE_L_HAND:
//"左手阻抗";
mEightBodyFatAdc.setAdcLeftHand(adc);
break;
case EightBodyFatUtil.IMPEDANCE_R_HAND:
// adc = adc + "右手阻抗";
mEightBodyFatAdc.setAdcRightHand(adc);
break;
case EightBodyFatUtil.IMPEDANCE_L_FOOT:
// adc = adc + "左脚阻抗";
mEightBodyFatAdc.setAdcLeftFoot(adc);

break;
case EightBodyFatUtil.IMPEDANCE_R_FOOT:
// adc = adc + "右脚阻抗";
mEightBodyFatAdc.setAdcRightFoot(adc);

break;
case EightBodyFatUtil.IMPEDANCE_L_BODY:
// adc = adc + "左驱干";
mEightBodyFatAdc.setAdcLeftBody(adc);

break;
case EightBodyFatUtil.IMPEDANCE_R_BODY:
// adc = adc + "右躯干";
mEightBodyFatAdc.setAdcRightBody(adc);

break;
case EightBodyFatUtil.IMPEDANCE_R_HAND_L_FOOT:
// adc = adc + "右手左脚";
mEightBodyFatAdc.setAdcRightHandLeftFoot(adc);
break;
case EightBodyFatUtil.IMPEDANCE_L_HAND_R_FOOT:
// adc = adc + "左手右脚";
mEightBodyFatAdc.setAdcLeftHandRightFoot(adc);

break;
default:


}

@Override
public void onBodyFatDataError(int type, String msg) {
addLog("获取体脂数据失败:" + type + " " + msg);
}

private void kaimengJieMi(EightBodyFatAdc eightBodyFatAdc, UserInfoBean userInfoBean) {
loglist.add(0, "默认传入用户: " + userInfoBean.toString());
EightBodyFatBean algorithmsData = EightBodyFatAlgorithms.getInstance()
.getAlgorithmsData(eightBodyFatAdc.getAlgorithms(), userInfoBean.getSex(),
userInfoBean.getHeightCm(), userInfoBean.getWeightKg(),
userInfoBean.getAge(), eightBodyFatAdc);
if (algorithmsData.getBhErrorType() != null) {
String type = algorithmsData.getBhErrorType();
int typeInt = -1;
try {
typeInt = Integer.parseInt(algorithmsData.getBhErrorType());
} catch (NumberFormatException e) {
typeInt = -1;
e.printStackTrace();
}

if (typeInt != -1) {
//新算法
switch (typeInt) {
case HTBodyBasicInfo.ErrorAge:
loglist.add(0, "年龄不符合要求:6~99");
break;
case HTBodyBasicInfo.ErrorHeight:
loglist.add(0, "身高不符合要求:90~220");
break;
case HTBodyBasicInfo.ErrorWeight:
loglist.add(0, "体重不符合要求:10.0~200.0");
break;
case HTBodyBasicInfo.ErrorImpedance:
loglist.add(0, "阻抗不符合要求100~600");
break;
case HTBodyBasicInfo.ErrorImpedanceLeftLeg:
loglist.add(0, "左手左脚阻抗不符合要求:100~600");
break;
case HTBodyBasicInfo.ErrorImpedanceRightLeg:
loglist.add(0, "右手左脚阻抗不符合要求:100~600");
break;
case HTBodyBasicInfo.ErrorImpedanceLeftArm:
loglist.add(0, "左手阻抗不符合要求:100~600");
break;
case HTBodyBasicInfo.ErrorImpedanceRightArm:
loglist.add(0, "右手阻抗不符合要求:100~600");
break;
case HTBodyBasicInfo.ErrorNone:
//正常
loglist.add(0, "算法计算结果:" + algorithmsData.toString());
break;
default:
loglist.add(0, "其他错误:" + algorithmsData.getBhErrorType());
break;
}
} else {
switch (type) {
case "AGE":
loglist.add(0, "年龄不符合要求:6~99");
break;
case "HEIGHT":
loglist.add(0, "身高不符合要求:90~220");
break;
case "WEIGHT":
loglist.add(0, "体重不符合要求:10.0~200.0");
break;
case "IMPEDANCE_LEFT_BODY":
loglist.add(0, "左侧全身阻抗不符合要求:200~1200");
break;
case "IMPEDANCE_LEFT_ARM":
loglist.add(0, "左手阻抗不符合要求:100~600");
break;
case "IMPEDANCE_RIGHT_ARM":
loglist.add(0, "右手阻抗不符合要求:100~600");
break;
case "IMPEDANCE_LEFT_LEG":
loglist.add(0, "左脚阻抗不符合要求:100~600");
break;
case "IMPEDANCE_RIGHT_LEG":
loglist.add(0, "右脚阻抗不符合要求:100~600");
break;
case "NONE":
//正常
loglist.add(0, "算法计算结果:" + algorithmsData.toString());
break;
default:
loglist.add(0, "其他错误:" + algorithmsData.getBhErrorType());
break;
}
}

} else {
loglist.add(0, "其他错误:" + algorithmsData.getBhErrorType());
}
if (listAdapter != null) {
listAdapter.notifyDataSetChanged();
}
// EightBodyFatBean algorithmsData =
// EightBodyFatAlgorithms.getInstance().getAlgorithmsData(2, 0, 165, weight, 27, mEightBodyFatAdc);
L.i("算法结果" + algorithmsData.toString());
@Override
public void showData(String data) {
// loglist.add(0, data);
}



+ 64
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/eight_bodyfat/UserInfoBean.java View File

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

public class UserInfoBean {

private int userId;
private int age;
private int heightCm;
private float weightKg;
private int userType;
private int sex;

public int getUserId() {
return userId;
}

public void setUserId(int userId) {
this.userId = userId;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public int getHeightCm() {
return heightCm;
}

public void setHeightCm(int heightCm) {
this.heightCm = heightCm;
}

public float getWeightKg() {
return weightKg;
}

public void setWeightKg(float weightKg) {
this.weightKg = weightKg;
}

public int getSex() {
return sex;
}

public void setSex(int sex) {
this.sex = sex;
}

public int getUserType() {
return userType;
}

public void setUserType(int userType) {
this.userType = userType;
}

@Override
public String toString() {
return "UserInfoBean{" + "年龄=" + age + "用户类型=" + userType + ", 身高=" + heightCm + ", 体重=" + weightKg + ", 性别=" + (sex == 1 ? "男" : "女") + '}';
}
}

+ 62
- 82
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/eight_bodyfat/dual_band/EightDoubleBodyfatActivity.java View File

@@ -19,8 +19,10 @@ import com.pingwang.bluetoothlib.bean.SupportUnitBean;
import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.listener.OnCallbackBle;

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

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
@@ -31,14 +33,15 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.UnitUtils;
import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatUtil;
import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.BaseEightDoubleBodyFatData;
import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.EightDoubleBodyFatAdcBean;
import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.EightDoubleBodyFatBean;
import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.EightDoubleBodyFatBleConfig;
import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.EightDoubleBodyFatBleDeviceData;
import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.EightDoubleBodyFatBleMcuDeviceData;
import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.EightDoubleDataBodyFatBean;
import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.EightDoubleMcuBodyFatBean;
import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.OnEightDoubleBodyFatCallback;

/**
* 双频八电极秤(mcu算法)
* 双频八电极秤(app/mcu算法)
*
* @author xing
* @date 2024/03/14
@@ -85,7 +88,7 @@ public class EightDoubleBodyfatActivity extends BleBaseActivity implements View.
initView();
initListener();
initData();
setTitleData("双频八电极秤:0x" + Integer.toHexString(mCid));
}

private void initData() {
@@ -100,24 +103,25 @@ public class EightDoubleBodyfatActivity extends BleBaseActivity implements View.
public void onClick(View v) {
List<EightDoubleBodyFatAdcBean> list = new ArrayList<>();
EightDoubleBodyFatAdcBean adcBean = new EightDoubleBodyFatAdcBean();
adcBean.setAdcRightHand(2433844368L);
adcBean.setAdcLeftHand(3781622117L);
adcBean.setAdcBody(1349958013L);
adcBean.setAdcRightFoot(1365295937L);
adcBean.setAdcLeftFoot(1903359127L);
adcBean.setAdcRightHand(0x70CE5D91L);
adcBean.setAdcLeftHand(0x61A2D714L);
adcBean.setAdcBody(0x3013EEE0L);
adcBean.setAdcRightFoot(0x50A93C9FL);
adcBean.setAdcLeftFoot(0x10071D0CL);
adcBean.setFrequencyId(0x01);
adcBean.setAlgorithmsId(0x01);
list.add(adcBean);

EightDoubleBodyFatAdcBean adcBean100 = new EightDoubleBodyFatAdcBean();
adcBean100.setAdcRightHand(2447381468L);
adcBean100.setAdcLeftHand(1909750593L);
adcBean100.setAdcBody(2954962439L);
adcBean100.setAdcRightFoot(4036701847L);
adcBean100.setAdcLeftFoot(2421978775L);
adcBean100.setAdcRightHand(0x509A9A5FL);
adcBean100.setAdcLeftHand(0x7037B559L);
adcBean100.setAdcBody(0x3022CEC6L);
adcBean100.setAdcRightFoot(0x60AA8F98L);
adcBean100.setAdcLeftFoot(0x40F72698L);
adcBean100.setFrequencyId(0x02);
adcBean100.setAlgorithmsId(0x01);
list.add(adcBean100);
mCid = EightDoubleBodyFatBleConfig.CID_APP;
onTestCompleted(list);
}
});
@@ -130,6 +134,8 @@ public class EightDoubleBodyfatActivity extends BleBaseActivity implements View.
String sex = et_sex.getText().toString().trim();
if (mUserInfoBean == null) {
mUserInfoBean = new UserInfoBean();
mUserInfoBean.setUserId(1);
mUserInfoBean.setUserType(0);
}
mUserInfoBean.setAge(Integer.parseInt(age));
mUserInfoBean.setSex(Integer.parseInt(sex));
@@ -152,7 +158,8 @@ public class EightDoubleBodyfatActivity extends BleBaseActivity implements View.

private void initListener() {

findViewById(R.id.support_unit).setOnClickListener(this);
findViewById(R.id.getSupportUnit).setOnClickListener(this);
findViewById(R.id.btn_update).setOnClickListener(this);
findViewById(R.id.btn_clear_log).setOnClickListener(this);
kg.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
@@ -238,13 +245,16 @@ public class EightDoubleBodyfatActivity extends BleBaseActivity implements View.

@Override
public void onClick(View v) {
if (v.getId() == R.id.support_unit) {
if (v.getId() == R.id.getSupportUnit) {
if (mEightDoubleBodyFatData != null) {
mEightDoubleBodyFatData.getUnitList();
}
} else if (v.getId() == R.id.btn_clear_log) {
mLoglist.clear();
mHandler.sendEmptyMessage(REFRESH_KEY);
} else if (v.getId() == R.id.btn_update) {
initUserInfo();
showData("更新用户信息");
}
}

@@ -262,7 +272,7 @@ public class EightDoubleBodyfatActivity extends BleBaseActivity implements View.
@Override
public void onTestCompleted(List<EightDoubleBodyFatAdcBean> adcBeanList) {
initUserInfo();
mLoglist.add(0, "测试完成:" + adcBeanList.size());
mLoglist.add(0, "测试完成");
for (EightDoubleBodyFatAdcBean adcBean : adcBeanList) {
String data = "";
data += (adcBean.getFrequencyId() == 0x01) ? "频率:20kHz" : "频率:100kHz";
@@ -275,71 +285,17 @@ public class EightDoubleBodyfatActivity extends BleBaseActivity implements View.
mLoglist.add(0, data);
}
mLoglist.add(0, "用户信息:" + mUserInfoBean.toString());
mHandler.sendEmptyMessage(REFRESH_KEY);
getBodyFatData(adcBeanList);
mHandler.sendEmptyMessage(REFRESH_KEY);
}

// private HetaiHttpUtils mHetaiHttpUtils;

private void getBodyFatData(List<EightDoubleBodyFatAdcBean> adcBeanList) {
if (mCid != EightDoubleBodyFatBleConfig.CID_APP) {
if (mCid != EightDoubleBodyFatBleConfig.CID_APP || adcBeanList == null || adcBeanList.isEmpty()) {
return;
}


// ParamsHetaiBean paramsHetaiBean = new ParamsHetaiBean();
// paramsHetaiBean.setAge(String.valueOf(mUserInfoBean.getAge()));
// paramsHetaiBean.setSex(String.valueOf(mUserInfoBean.getSex()));
// paramsHetaiBean.setHeightCm(String.valueOf(mUserInfoBean.getHeightCm()));
// paramsHetaiBean.setWeightKg(String.valueOf(mUserInfoBean.getWeightKg()));
// for (EightDoubleBodyFatAdcBean adcBean : adcBeanList) {
// if (adcBean.getFrequencyId() == 0x01) {
// //20khz
// paramsHetaiBean.setZ20KhzLeftArmEnCode(String.valueOf(adcBean.getAdcLeftHand()));
// paramsHetaiBean.setZ20KhzRightArmEnCode(String.valueOf(adcBean.getAdcRightHand()));
// paramsHetaiBean.setZ20KhzLeftLegEnCode(String.valueOf(adcBean.getAdcLeftFoot()));
// paramsHetaiBean.setZ20KhzRightLegEnCode(String.valueOf(adcBean.getAdcRightFoot()));
// paramsHetaiBean.setZ20KhzTrunkEnCode(String.valueOf(adcBean.getAdcBody()));
//
// } else if (adcBean.getFrequencyId() == 0x02) {
// //100khz
// paramsHetaiBean.setZ100KhzLeftArmEnCode(String.valueOf(adcBean.getAdcLeftHand()));
// paramsHetaiBean.setZ100KhzRightArmEnCode(String.valueOf(adcBean.getAdcRightHand()));
// paramsHetaiBean.setZ100KhzLeftLegEnCode(String.valueOf(adcBean.getAdcLeftFoot()));
// paramsHetaiBean.setZ100KhzRightLegEnCode(String.valueOf(adcBean.getAdcRightFoot()));
// paramsHetaiBean.setZ100KhzTrunkEnCode(String.valueOf(adcBean.getAdcBody()));
// }
// }
// //获取数据
// if (mHetaiHttpUtils == null) {
// mHetaiHttpUtils = new HetaiHttpUtils();
// }
// mHetaiHttpUtils.postGetBody270(paramsHetaiBean, new OnHttpListener<HttpHetaiListBean>() {
// @Override
// public void onSuccess(HttpHetaiListBean data) {
// List<HttpHetaiBean> httpHetaiBeans = data.getData();
// if (httpHetaiBeans != null) {
// mLoglist.add(0, "获取数据成功:" + httpHetaiBeans.size());
// for (HttpHetaiBean httpHetaiBean : httpHetaiBeans) {
// String show = mMap.get(httpHetaiBean.getName()) + ":" + httpHetaiBean.getValue() + " " +
// (httpHetaiBean.getUnit() == null ? "" : httpHetaiBean.getUnit()) +
// (httpHetaiBean.getLevel() == null ? "" : "\n" + httpHetaiBean.getLevel().toString());
// mLoglist.add(0, show);
// L.i(httpHetaiBean.toString());
// }
// mHandler.sendEmptyMessage(REFRESH_KEY);
// } else {
// showData("体脂数据为空:" + data.toString());
// }
//
// }
//
// @Override
// public void onFailed(HttpHetaiListBean data) {
// showData("获取数据失败");
// }
// });

mEightDoubleBodyFatData.getDualEightBodyData(mUserInfoBean.getSex(), mUserInfoBean.getAge(), mUserInfoBean.getWeightKg(),
mUserInfoBean.getHeightCm(), adcBeanList);
}

@Override
@@ -351,6 +307,7 @@ public class EightDoubleBodyfatActivity extends BleBaseActivity implements View.
stateStr = "实时体重";
} else if (state == EightDoubleBodyFatBleConfig.STATUS_WEIGHT_STABILIZATION_WEIGHT) {
stateStr = "稳定体重";
mUserInfoBean.setWeightKg(Float.parseFloat(UnitUtils.getWeightToKg(unit, String.valueOf(weightF), decimal)));
mWeightKg = String.valueOf(weightF);
if (et_weight != null) {
et_weight.setText(mWeightKg);
@@ -407,12 +364,12 @@ public class EightDoubleBodyfatActivity extends BleBaseActivity implements View.
}

@Override
public void onBodyFat(EightDoubleBodyFatBean bodyFatBean) {
public void onBodyFatMcu(EightDoubleMcuBodyFatBean bodyFatBean) {
if (bodyFatBean == null) {
showData("体脂数据为空");
return;
}
showData("体脂数据:" + bodyFatBean);
showData("体脂数据(MCU):" + bodyFatBean);
}

@Override
@@ -441,15 +398,38 @@ public class EightDoubleBodyfatActivity extends BleBaseActivity implements View.
showData("设备请求同步用户信息");
}

private String mOldData = "";
@Override
public void onBodyFatDataError(int type, String msg) {
L.i("体脂数据计算错误:type=" + type + " msg=" + msg);
showData("体脂数据计算错误:type=" + type + " msg=" + msg);
}

@Override
public void showData(String data) {
if (mOldData.equals(data)) {
public void onBodyFatData(@Nullable EightDoubleDataBodyFatBean bodyFatBean) {
if (bodyFatBean != null) {
L.i("体脂数据计算成功:" + bodyFatBean.toString());
showData("体脂数据(服务器):\n" + bodyFatBean);
}
}

private String mOldLog = "";
private SimpleDateFormat sdf;

/**
* 添加日志
*
* @param log 日志
*/
@Override
public void showData(String log) {
if (mOldLog.equalsIgnoreCase(log)) {
return;
}
mOldData = data;
mLoglist.add(0, data);
if (sdf == null) {
sdf = new SimpleDateFormat("HH:mm:ss", Locale.US);
}
mOldLog = log;
mLoglist.add(0, sdf.format(System.currentTimeMillis()) + ":\n" + log);
mHandler.sendEmptyMessage(REFRESH_KEY);
}

@@ -457,7 +437,7 @@ public class EightDoubleBodyfatActivity extends BleBaseActivity implements View.
@Override
protected void onDestroy() {
super.onDestroy();
if (mAILinkBleManager!=null) {
if (mAILinkBleManager != null) {
mAILinkBleManager.disconnectAll();
}
}

+ 112
- 147
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/gasDetector/GasDetectorActivity.java View File

@@ -7,6 +7,8 @@ import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;

import androidx.appcompat.app.ActionBar;

import com.pingwang.bluetoothlib.AILinkBleManager;
import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.listener.OnCallbackBle;
@@ -50,157 +52,116 @@ public class GasDetectorActivity extends BleAppNewBaseActivity implements View.O

@Override
protected void initListener() {

ActionBar supportActionBar = getSupportActionBar();
if (supportActionBar != null) {
supportActionBar.setTitle("气体检测仪");
}
}

@Override
public void onClick(View v) {
switch (v.getId()) {

case R.id.btnGetCurInfo:
//实时信息
mGasDetectorDevice.getCurrentInfo();
addText("获取实时信息");
break;
case R.id.btnSyncTime:
//同步时间
mGasDetectorDevice.setSyncTime();
addText("同步时间");
break;
case R.id.btnGetCO2Density:
//CO2报警浓度
mGasDetectorDevice.getCo2Alarm();
addText("获取CO2报警浓度");
break;
case R.id.btnGetCODensity:
//CO报警浓度
mGasDetectorDevice.getCoAlarm();
addText("获取CO报警浓度");
break;
case R.id.btnGetO2Density:
//O2报警浓度
mGasDetectorDevice.getO2Alarm();
addText("获取O2报警浓度");
break;
case R.id.btnGetCO2Interval:
//CO2间隔
mGasDetectorDevice.getCo2Interval();
addText("获取CO2间隔");
break;
case R.id.btnGetCOInterval:
//CO间隔
mGasDetectorDevice.getCoInterval();
addText("获取CO间隔");
break;
case R.id.btnGetHistoryInterval:
//历史记录间隔
mGasDetectorDevice.getOfflineHistoryInterval();
addText("获取历史记录间隔");
break;
case R.id.btnGetCO2Switch:
//CO2开关
mGasDetectorDevice.getCo2Switch();
addText("获取CO2开关");
break;
case R.id.btnGetCOSwitch:
//CO开关
mGasDetectorDevice.getCoSwitch();
addText("获取CO开关");
break;
case R.id.btnGetSoundSwitch:
//声音开关
mGasDetectorDevice.getSoundSwitch();
addText("获取声音开关");
break;
case R.id.btnGetShakeSwitch:
//震动开关
mGasDetectorDevice.getShockSwitch();
addText("获取震动开关");
break;
case R.id.btnGetTempUnit:
//温度单位
mGasDetectorDevice.getTempUnit();
addText("获取温度单位");
break;
case R.id.btnGetPressureUnit:
//气压单位
mGasDetectorDevice.getAirPressureUnit();
addText("获取气压单位");
break;
case R.id.btnGetScreenOffTime:
//息屏时间
mGasDetectorDevice.getScreenOffTime();
addText("获取息屏时间");
break;
case R.id.btnGetShutdownTime:
//关机时间
mGasDetectorDevice.getShutdownTime();
addText("获取关机时间");
break;
case R.id.btnGetHistory:
//历史记录
mGasDetectorDevice.getOfflineHistory(0);
addText("获取历史记录");
break;
case R.id.btnClearHistory:
//清空历史记录
mGasDetectorDevice.setClearOfflineHistory();
addText("清空历史记录");
break;
case R.id.btnSetCo2Density:
//设置Co2浓度
try {
int densityCo2 = Integer.parseInt(etDensity.getText().toString());
mGasDetectorDevice.setCo2Alarm(densityCo2);
addText("设置CO2报警浓度:" + densityCo2);
} catch (NumberFormatException e) {
addText("请输入正确的数字");
}
break;
case R.id.btnSetO2Density:
//设置O2浓度
try {
int densityO2 = Integer.parseInt(etDensity.getText().toString());
mGasDetectorDevice.setO2Alarm(densityO2);
addText("设置O2报警浓度:" + densityO2);
} catch (NumberFormatException e) {
addText("请输入正确的数字");
}
break;
case R.id.btnSetCo2Interval:
//设置CO2间隔
try {
int intervalCo2 = Integer.parseInt(etInterval.getText().toString());
mGasDetectorDevice.setCo2Interval(intervalCo2);
addText("设置CO2间隔:" + intervalCo2);
} catch (NumberFormatException e) {
addText("请输入正确的数字");
}
break;
case R.id.btnSetCoInterval:
//设置CO间隔
try {
int intervalCo = Integer.parseInt(etInterval.getText().toString());
mGasDetectorDevice.setCoInterval(intervalCo);
addText("设置CO间隔:" + intervalCo);
} catch (NumberFormatException e) {
addText("请输入正确的数字");
}
break;

case R.id.btnSetPressureCali:
//气压校准
try {
int hpa = Integer.parseInt(etHpa.getText().toString());
int inHg = Integer.parseInt(etInHg.getText().toString());
mGasDetectorDevice.setAirPressureCalibration(hpa, inHg);
addText("设置气压校准:hpa=" + hpa + " inHg=" + inHg);
} catch (NumberFormatException e) {
addText("请输入正确的数字");
}

break;

int id = v.getId();
if (id == R.id.btnClearLog) {//清除日志
mList.clear();
addText("清除日志");
} else if (id == R.id.btnPauseLog) {//暂停日志
isPause = !isPause;
addText("暂停日志:" + isPause);
} else if (id == R.id.btnGetCurInfo) {//实时信息
mGasDetectorDevice.getCurrentInfo();
addText("获取实时信息");
} else if (id == R.id.btnSyncTime) {//同步时间
mGasDetectorDevice.setSyncTime();
addText("同步时间");
} else if (id == R.id.btnGetCO2Density) {//CO2报警浓度
mGasDetectorDevice.getCo2Alarm();
addText("获取CO2报警浓度");
} else if (id == R.id.btnGetCODensity) {//CO报警浓度
mGasDetectorDevice.getCoAlarm();
addText("获取CO报警浓度");
} else if (id == R.id.btnGetO2Density) {//O2报警浓度
mGasDetectorDevice.getO2Alarm();
addText("获取O2报警浓度");
} else if (id == R.id.btnGetCO2Interval) {//CO2间隔
mGasDetectorDevice.getCo2Interval();
addText("获取CO2间隔");
} else if (id == R.id.btnGetCOInterval) {//CO间隔
mGasDetectorDevice.getCoInterval();
addText("获取CO间隔");
} else if (id == R.id.btnGetHistoryInterval) {//历史记录间隔
mGasDetectorDevice.getOfflineHistoryInterval();
addText("获取历史记录间隔");
} else if (id == R.id.btnGetCO2Switch) {//CO2开关
mGasDetectorDevice.getCo2Switch();
addText("获取CO2开关");
} else if (id == R.id.btnGetCOSwitch) {//CO开关
mGasDetectorDevice.getCoSwitch();
addText("获取CO开关");
} else if (id == R.id.btnGetSoundSwitch) {//声音开关
mGasDetectorDevice.getSoundSwitch();
addText("获取声音开关");
} else if (id == R.id.btnGetShakeSwitch) {//震动开关
mGasDetectorDevice.getShockSwitch();
addText("获取震动开关");
} else if (id == R.id.btnGetTempUnit) {//温度单位
mGasDetectorDevice.getTempUnit();
addText("获取温度单位");
} else if (id == R.id.btnGetPressureUnit) {//气压单位
mGasDetectorDevice.getAirPressureUnit();
addText("获取气压单位");
} else if (id == R.id.btnGetScreenOffTime) {//息屏时间
mGasDetectorDevice.getScreenOffTime();
addText("获取息屏时间");
} else if (id == R.id.btnGetShutdownTime) {//关机时间
mGasDetectorDevice.getShutdownTime();
addText("获取关机时间");
} else if (id == R.id.btnGetHistory) {//历史记录
mGasDetectorDevice.getOfflineHistory(0);
addText("获取历史记录");
} else if (id == R.id.btnClearHistory) {//清空历史记录
mGasDetectorDevice.setClearOfflineHistory();
addText("清空历史记录");
} else if (id == R.id.btnSetCo2Density) {//设置Co2浓度
try {
int densityCo2 = Integer.parseInt(etDensity.getText().toString());
mGasDetectorDevice.setCo2Alarm(densityCo2);
addText("设置CO2报警浓度:" + densityCo2);
} catch (NumberFormatException e) {
addText("请输入正确的数字");
}
} else if (id == R.id.btnSetO2Density) {//设置O2浓度
try {
int densityO2 = Integer.parseInt(etDensity.getText().toString());
mGasDetectorDevice.setO2Alarm(densityO2);
addText("设置O2报警浓度:" + densityO2);
} catch (NumberFormatException e) {
addText("请输入正确的数字");
}
} else if (id == R.id.btnSetCo2Interval) {//设置CO2间隔
try {
int intervalCo2 = Integer.parseInt(etInterval.getText().toString());
mGasDetectorDevice.setCo2Interval(intervalCo2);
addText("设置CO2间隔:" + intervalCo2);
} catch (NumberFormatException e) {
addText("请输入正确的数字");
}
} else if (id == R.id.btnSetCoInterval) {//设置CO间隔
try {
int intervalCo = Integer.parseInt(etInterval.getText().toString());
mGasDetectorDevice.setCoInterval(intervalCo);
addText("设置CO间隔:" + intervalCo);
} catch (NumberFormatException e) {
addText("请输入正确的数字");
}
} else if (id == R.id.btnSetPressureCali) {//气压校准
try {
int hpa = Integer.parseInt(etHpa.getText().toString());
int inHg = Integer.parseInt(etInHg.getText().toString());
mGasDetectorDevice.setAirPressureCalibration(hpa, inHg);
addText("设置气压校准:hpa=" + hpa + " inHg=" + inHg);
} catch (NumberFormatException e) {
addText("请输入正确的数字");
}
}
}

@@ -371,8 +332,12 @@ public class GasDetectorActivity extends BleAppNewBaseActivity implements View.O

private SimpleDateFormat sdf;
private String mOldText = "";
private boolean isPause = false;

private void addText(String text) {
if (isPause && !mList.isEmpty()) {
return;
}
if (mOldText.equals(text)) {
return;
}

+ 440
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/gasDetectorPlus/GasDetectorPlusActivity.java View File

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

import android.os.Message;
import android.text.TextUtils;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;

import androidx.appcompat.app.ActionBar;

import com.pingwang.bluetoothlib.AILinkBleManager;
import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.listener.OnCallbackBle;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
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.BleAppNewBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.UnitUtils;
import cn.net.aicare.modulelibrary.module.gasDetectorPlus.GasDetectorPlusBleDevice;
import cn.net.aicare.modulelibrary.module.gasDetectorPlus.OnGasDetectorPlusInfoListener;
import cn.net.aicare.modulelibrary.module.gasDetectorPlus.bean.GasAlarmInfoBean;
import cn.net.aicare.modulelibrary.module.gasDetectorPlus.bean.GasDetectorPlusCurrentInfoBean;

/**
* 气体检测仪界面(华普)
*
* @author xing
* @date 2024/09/05
*/
public class GasDetectorPlusActivity extends BleAppNewBaseActivity implements View.OnClickListener, OnCallbackBle, OnGasDetectorPlusInfoListener {

private String mMac = "";
private EditText et1, et2;
private GasDetectorPlusBleDevice mGasDetectorPlusBleDevice;
private ListView list_view;
private List<String> mList;
private ArrayAdapter mListAdapter;
private List<String> mGasList = new ArrayList<>(Arrays.asList(
"O2", "CO2", "TVOC(PID)", "TVOC", "CO", "H2S", "NO", "NO2", "SO2", "H2", "O3", "NH3", "HCN", "HCI", "H2O2", "CH2O",
"C2H4", "Cl2", "ClO2", "C2H4O", "PH3", "HF", "F2", "C4H8S", "ASH3", "SIH4", "CH3SH", "CH4O", "C2H6O", "C4H", "C3H8O", "COF2",
"BF3", "CH4", "C3H6O", "C2H2", "C6H6", "C6H14", "C3H8", "温度", "湿度"
));

@Override
protected void uiHandlerMessage(Message msg) {

}

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

@Override
protected void initListener() {
ActionBar supportActionBar = getSupportActionBar();
if (supportActionBar != null) {
supportActionBar.setTitle("气体检测仪(BLE+WIFI)");
}
}

@Override
public void onClick(View v) {
int id = v.getId();
if (id == R.id.btnClearLog) {//清除日志
mList.clear();
addText("清除日志");
} else if (id == R.id.btnPauseLog) {//暂停日志
isPause = !isPause;
addText("暂停日志:" + isPause);
} else if (id == R.id.btnGetSupportGas) {//支持的气体类型(0x01)
mGasDetectorPlusBleDevice.getSupportedGas();
addText("获取支持的气体类型(0x01)");
} else if (id == R.id.btnGetSupportFun) {//获取支持的功能列表
mGasDetectorPlusBleDevice.getSupportedFun();
addText("获取支持的功能列表(0x02)");
} else if (id == R.id.btnGetAlarmSwitch) {//警报推送开关(0x03)
mGasDetectorPlusBleDevice.getAlarmSwitch();
addText("获取警报推送开关(0x03)");
} else if (id == R.id.btnSetAlarmSwitch) {//警报推送开关(0x03)
alarmSwitch = alarmSwitch == 1 ? 0 : 1;
mGasDetectorPlusBleDevice.setAlarmSwitch(alarmSwitch);
addText("设置警报推送开关(0x03):" + alarmSwitch);
} else if (id == R.id.btnGetAlarmTime) {//报警时长设置(0x04)
mGasDetectorPlusBleDevice.getAlarmTime();
addText("获取报警时长设置(0x04)");
} else if (id == R.id.btnGetAlarmFrequency) {//报警频率(0x0A)
mGasDetectorPlusBleDevice.getAlarmFrequency();
addText("获取报警频率(0x0A)");
} else if (id == R.id.btnGetGasInfo) {//气体信息(0x09)
mGasDetectorPlusBleDevice.getGasInfo();
addText("获取气体信息(0x09)");
} else if (id == R.id.btnSaveFrequency) {//离线数据存储频率(0x07)
int frequency = 0;
try {
frequency = Integer.parseInt(et1.getText().toString().trim());
} catch (NumberFormatException e) {
e.printStackTrace();
}
mGasDetectorPlusBleDevice.setHistorySaveFrequency(frequency);
addText("设置离线数据存储频率(0x07):" + frequency);
} else if (id == R.id.btnReportInterval) {//数据上报间隔(0x08)
int interval = 0;
try {
interval = Integer.parseInt(et1.getText().toString().trim());
} catch (NumberFormatException e) {
e.printStackTrace();
}
mGasDetectorPlusBleDevice.setDataReportInterval(interval);
addText("设置数据上报间隔(0x08):" + interval);
} else if (id == R.id.btnGetAlarmRing) {
int ring = 0;
try {
ring = Integer.parseInt(et2.getText().toString().trim());
} catch (NumberFormatException e) {
e.printStackTrace();
}
mGasDetectorPlusBleDevice.setAlarmRing(ring);
addText("报警铃声设置(0x05):" + ring);
} else if (id == R.id.btnAlarmRingTest) {
int ringTest = 0;
try {
ringTest = Integer.parseInt(et2.getText().toString().trim());
} catch (NumberFormatException e) {
e.printStackTrace();
}
mGasDetectorPlusBleDevice.setAlarmRingTest(ringTest);
addText("报警铃声试听(0x06):" + ringTest);
} else if (id == R.id.btnGetPowerInfo) {//请求获取设备电量信息(0x0C)
mGasDetectorPlusBleDevice.getPowerInfo();
addText("请求获取设备电量信息(0x0C)");
} else if (id == R.id.btnSetTime) {
long second = System.currentTimeMillis() / 1000;
mGasDetectorPlusBleDevice.setSyncTime(second);
addText("下发同步时间(0x0E):\n" + second + "秒");
}
}

@Override
protected void initData() {
mMac = getIntent().getStringExtra("mac");
mList = new ArrayList<>();
mListAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList);
list_view.setAdapter(mListAdapter);
addText("连接成功:" + mMac);
onServiceSuccess();
}

@Override
protected void initView() {
et1 = (EditText) findViewById(R.id.et1);
et2 = (EditText) findViewById(R.id.et2);
list_view = findViewById(R.id.list_view);
}

@Override
public void onServiceSuccess() {
if (TextUtils.isEmpty(mMac)) {
return;
}
if (mGasDetectorPlusBleDevice != null) {
return;
}
AILinkBleManager.getInstance().setOnCallbackBle(this);
BleDevice bleDevice = AILinkBleManager.getInstance().getBleDevice(mMac);
mGasDetectorPlusBleDevice = GasDetectorPlusBleDevice.init(bleDevice);
mGasDetectorPlusBleDevice.addOnGasDetectorInfoListener(this);
mGasDetectorPlusBleDevice.setOnShowData(new GasDetectorPlusBleDevice.OnShowData() {
@Override
public void showData(String data) {
addText("收到的vlaue数据:" + data);
}
});
}

@Override
public void onServiceErr() {

}

@Override
public void unbindServices() {

}


@Override
public void onDisConnected(String mac, int code) {
if (mac.equals(this.mMac)) {
if (mGasDetectorPlusBleDevice != null) {
mGasDetectorPlusBleDevice.removeOnGasDetectorInfoListener(this);
mGasDetectorPlusBleDevice = null;
}
addText("断开连接:" + mac + " code:" + code);
}
}


@Override
public void onSupportedGas(Map<Integer, Boolean> map) {
StringBuilder showData = new StringBuilder();
for (Integer key : map.keySet()) {
if (map.get(key)) {
if (key >= mGasList.size()) {
break;
}
String name = mGasList.get(key);
showData.append(name).append("\n");
}
}
addText("支持的气体类型(0x01):\n" + showData);
}

@Override
public void onSupportedFun(Map<Integer, Boolean> map) {
StringBuilder data = new StringBuilder();

for (Integer key : map.keySet()) {
String str = map.get(key) ? "支持" : "不支持";
switch (key) {
case 0:
data.append("报警推送:").append(str).append("\n");
break;
case 1:
data.append("报警时长:").append(str).append("\n");
break;
case 2:
data.append("报警铃声:").append(str).append("\n");
break;
case 3:
data.append("报警推送频率:").append(str).append("\n");
break;
}
}


addText("支持的功能列表(0x02):" + data);
}

int alarmSwitch = 0;

@Override
public void onAlarmSwitch(int switchStatus) {
alarmSwitch = switchStatus;
addText("警报推送开关(0x03):" + (switchStatus == 1 ? "打开" : "关闭"));
}

@Override
public void onAlarmTime(int current, int[] supportTimes) {
String min;
switch (current) {
case 0:
min = "一直报警";
break;
case 1:
min = "15S报警";
break;
case 2:
min = "30S报警";
break;
case 3:
min = "45S报警";
break;
case 4:
min = "1分钟报警";
break;
case 5:
min = "2分钟报警";
break;
case 6:
min = "3分钟报警";
break;
default:
min = "未知";
break;
}

addText("报警时长设置(0x04):选中" + current + "项," + min + "分钟" + " 支持的时长选项:" + Arrays.toString(supportTimes));
}

@Override
public void onAlarmRing(int current, int[] supportedRing) {
String str;
switch (current) {

case 1:
str = "铃声1";
break;
case 2:
str = "铃声2";
break;
case 3:
str = "铃声3";
break;
case 4:
str = "铃声4";
break;
case 5:
str = "铃声5";
break;
case 6:
str = "铃声6";
break;
default:
str = "未知";
break;
}
addText("报警铃声设置(0x05):选中" + current + "项," + str + " 支持的时长:" + Arrays.toString(supportedRing));
}

@Override
public void onAlarmRingTest(int position) {
addText("报警铃声试听(0x06):选中" + position + "项");
}

@Override
public void onHistorySaveFrequency(int frequency) {
addText("离线数据存储频率(0x07):频率" + frequency + "分钟");
}

@Override
public void onDataReportInterval(int interval) {
addText("数据上报间隔(0x08):间隔" + interval + "分钟");
}

@Override
public void onAlarmFrequency(int frequency) {
addText("报警频率(0x0A):频率" + frequency + "秒");
}

@Override
public void onAlarmGasInfo(List<GasAlarmInfoBean> list) {
StringBuilder showData = new StringBuilder();
for (GasAlarmInfoBean gasAlarmInfoBean : list) {
showData.append(mGasList.get(gasAlarmInfoBean.getType())).append(" ").append(gasAlarmInfoBean.getStatus() == 1 ? "报警" : "正常").append("\n");
}
addText("报警的气体信息(0x0B):\n" + showData);
}

@Override
public void onPowerInfo(int status, int power) {
addText("设备电量信息(0x0C):\n" + power + "%");
}

@Override
public void onUnitInfo(int type, int unit) {
String unitStr = "ppm";
switch (unit) {
case 0:
unitStr = "ppm";
break;
case 1:
unitStr = "%";
break;
case 2:
unitStr = "mg/m³";
break;
case 3:
unitStr = "℃";
break;
case 4:
unitStr = "℉";
break;
}
addText("单位设置(0x0D):\n类型:" + mGasList.get(type) + " 单位:" + unitStr);
}

@Override
public void onSyncTime() {
long second = System.currentTimeMillis() / 1000;
mGasDetectorPlusBleDevice.setSyncTime(second);
addText("同步时间(0x0E):\n" + second + "秒");
}

@Override
public void onGasInfo(GasDetectorPlusCurrentInfoBean bean) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);
String time = simpleDateFormat.format(bean.getTimeSeconds() * 1000);
StringBuilder showData = new StringBuilder(time + ":\n");
for (GasDetectorPlusCurrentInfoBean.GasInfo gasInfo : bean.getGasInfoList()) {
String unitStr = "ppm";
switch (gasInfo.getUnit()) {
case 0:
unitStr = "ppm";
break;
case 1:
unitStr = "%";
break;
case 2:
unitStr = "mg/m³";
break;
case 3:
unitStr = "℃";
break;
case 4:
unitStr = "℉";
break;
}
String valueStr = UnitUtils.getHoldDecimal(gasInfo.getDecimal(), gasInfo.getValue());
showData.append(mGasList.get(gasInfo.getType())).append(" ").append(valueStr).append(unitStr).append("\n");
}

addText("气体信息(0x09):\n" + showData);
}

private SimpleDateFormat sdf;
private String mOldText = "";
private boolean isPause = false;

private void addText(String text) {
if (isPause && !mList.isEmpty()) {
return;
}
if (mOldText.equals(text)) {
return;
}
if (sdf == null) {
sdf = new SimpleDateFormat("HH:mm:ss", Locale.US);
}
mList.add(0, sdf.format(System.currentTimeMillis()) + ":\n" + text);
mListAdapter.notifyDataSetChanged();
}


@Override
protected void onDestroy() {
super.onDestroy();
AILinkBleManager.getInstance().removeOnCallbackBle(this);
if (mGasDetectorPlusBleDevice != null) {
mGasDetectorPlusBleDevice.clear();
}
}
}

+ 580
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/hmiBodyFat/HmiBodyFatScaleBleActivity.java View File

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


import android.content.pm.ActivityInfo;
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.RadioButton;

import androidx.annotation.Nullable;

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 java.lang.ref.WeakReference;
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.dialog.AddUserDialog;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.bean.UserBean;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import cn.net.aicare.modulelibrary.module.BodyFatScale.HmiAppHistoryRecordBean;
import cn.net.aicare.modulelibrary.module.BodyFatScale.HmiBodyFatBleUtilsData;
import cn.net.aicare.modulelibrary.module.BodyFatScale.HmiBodyFatDataUtil;
import cn.net.aicare.modulelibrary.module.BodyFatScale.HmiBodyFatRecordBean;
import cn.net.aicare.modulelibrary.module.BodyFatScale.HmiBodyFatUserBean;
import cn.net.aicare.modulelibrary.module.BodyFatScale.HmiMcuHistoryRecordBean;

/**
* HMI蓝牙体脂秤
*/
public class HmiBodyFatScaleBleActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, HmiBodyFatBleUtilsData.BleBodyFatCallback {
private String TAG = HmiBodyFatScaleBleActivity.class.getName();
private String mAddress;
private List<String> mlogList;
private List<String> mUserlogList;
private ArrayAdapter listAdapter;
private ArrayAdapter userAdapter;
private HmiBodyFatBleUtilsData bodyFatBleUtilsData;
private MHandler mMHandler;
private EditText mEditText;
private RadioButton kg, jing, stlb, lb;
private List<HmiBodyFatUserBean> mUsers;
private HmiBodyFatUserBean selectUser;
private int weighunit = HmiBodyFatDataUtil.KG;
private ListView loglistView;
private ListView userlistView;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//禁止横屏
setContentView(R.layout.activity_hmi_body_fat_scale_ble);
initView();
setUnitInit();
initdata();


}

private void initView() {
findViewById(R.id.history).setOnClickListener(this);
findViewById(R.id.userlist).setOnClickListener(this);
findViewById(R.id.btnUser).setOnClickListener(this);
findViewById(R.id.adduser).setOnClickListener(this);
findViewById(R.id.syntime).setOnClickListener(this);
kg = findViewById(R.id.kg);
jing = findViewById(R.id.jin);
stlb = findViewById(R.id.st_lb);
lb = findViewById(R.id.lb);
mEditText = findViewById(R.id.edit_Userid);
kg.setChecked(true);
loglistView = findViewById(R.id.log_list);
userlistView = findViewById(R.id.user_list);


}

private void initdata() {
mAddress = getIntent().getStringExtra("mac");

WeakReference weakReference = new WeakReference(new MHandler());
mMHandler = (MHandler) weakReference.get();

mlogList = new ArrayList<>();
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mlogList);
loglistView.setAdapter(listAdapter);

HmiBodyFatUserBean defaultUser = getdefault();
selectUser = defaultUser;

mUsers = new ArrayList<>();
mUsers.add(defaultUser);

mUserlogList = new ArrayList<>();
mUserlogList.add(defaultUser.toString());

userAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mUserlogList);
userlistView.setAdapter(userAdapter);
}

private HmiBodyFatUserBean getdefault() {
HmiBodyFatUserBean user = new HmiBodyFatUserBean();
user.setModeType(HmiBodyFatDataUtil.MODE_ORDINARY);
user.setSex(HmiBodyFatDataUtil.SEX_MAN);
user.setAge(18);
user.setHeight(170);
user.setAdc(560);
user.setWeight(50);
user.setId(1);
return user;
}

private void setUnitInit() {
kg.setOnCheckedChangeListener((buttonView, isChecked) -> {
if (isChecked) {
weighunit = HmiBodyFatDataUtil.KG;
if (bodyFatBleUtilsData != null) {
bodyFatBleUtilsData.setWeightUnit(weighunit);
}
}
});
jing.setOnCheckedChangeListener((buttonView, isChecked) -> {
if (isChecked) {
weighunit = HmiBodyFatDataUtil.JIN;
if (bodyFatBleUtilsData != null) {
bodyFatBleUtilsData.setWeightUnit(weighunit);
}
}
});
stlb.setOnCheckedChangeListener((buttonView, isChecked) -> {
if (isChecked) {
weighunit = HmiBodyFatDataUtil.ST;
if (bodyFatBleUtilsData != null) {
bodyFatBleUtilsData.setWeightUnit(weighunit);
}
}
});
lb.setOnCheckedChangeListener((buttonView, isChecked) -> {
if (isChecked) {
weighunit = HmiBodyFatDataUtil.LB;
if (bodyFatBleUtilsData != null) {
bodyFatBleUtilsData.setWeightUnit(weighunit);
}
}
});
}

@Override
public void onServiceSuccess() {
mlogList.add(0, "服务与界面建立连接成功");
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
// BleLog.i(TAG, "服务与界面建立连接成功");
//与服务建立连接
if (mAILinkBleManager != null) {
mAILinkBleManager.setOnCallbackBle(this);
BleDevice bleDevice = mAILinkBleManager.getBleDevice(mAddress);
if (bleDevice != null) {
HmiBodyFatBleUtilsData.init(bleDevice, this);
bodyFatBleUtilsData = HmiBodyFatBleUtilsData.getInstance();
if (bodyFatBleUtilsData != null) {
bodyFatBleUtilsData.setWeightUnit(weighunit);
bodyFatBleUtilsData.synSysTime();
}


}
}
}


@Override
public void onServiceErr() {
mlogList.add(0, "服务与界面建立连接出错");
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void unbindServices() {
mlogList.add(0, "服务与界面建立断开连接成功");
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
if (mAILinkBleManager != null) {
mAILinkBleManager.removeOnCallbackBle(this);
}
}

@Override
public void onStartScan() {
mlogList.add(0, "开始扫描");
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void onScanning(BleValueBean data) {
mlogList.add(0, "扫描中");
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void onScanTimeOut() {
mlogList.add(0, "扫描超时");
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}


@Override
public void onConnecting(String mac) {
mlogList.add(0, "正在连接" + mac);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void onDisConnected(String mac, int code) {
mlogList.add(0, "断开连接" + mac);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void onServicesDiscovered(String mac) {
mlogList.add(0, "发现蓝牙服务" + mac);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void bleOpen() {
mlogList.add(0, "蓝牙打开");
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void bleClose() {
mlogList.add(0, "蓝牙关闭");
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

private String mOldData = "";

@Override
public void onWeightData(int status, float weight, int weightUnit, int decimals) {
String data = "体重数据类型:" + (status == HmiBodyFatDataUtil.WEIGHT_TESTING ? "实时" : "稳定") + "\n体重: " + weight + " 单位:" + weightUnit + " 小数点位: " + decimals;
if (mOldData.equals(data)) {
return;
}

if (status == HmiBodyFatDataUtil.WEIGHT_RESULT) {
//稳定体重
selectUser.setWeight(weight);
mMHandler.sendEmptyMessage(TO_REFRESH_USER);
}

mOldData = data;
mlogList.add(0, data);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

private int mOldStatus = -1;

@Override
public void onStatus(int status) {
if (mOldStatus == status) {
return;
}
mOldStatus = status;

switch (status) {
case HmiBodyFatDataUtil.WEIGHT_TESTING:
mlogList.add(0, "测量状态:" + status + " 测量实时体重");
break;
case HmiBodyFatDataUtil.WEIGHT_RESULT:
mlogList.add(0, "测量状态:" + status + " 稳定体重");
break;
case HmiBodyFatDataUtil.IMPEDANCE_TESTING:
mlogList.add(0, "测量状态:" + status + " 阻抗测量中");
break;
case HmiBodyFatDataUtil.IMPEDANCE_SUCCESS:
case HmiBodyFatDataUtil.IMPEDANCE_SUCCESS_DATA:
mlogList.add(0, "测量状态:" + status + " 阻抗测量成功");
break;
case HmiBodyFatDataUtil.IMPEDANCE_FAIL:
mlogList.add(0, "测量状态:" + status + " 阻抗测量失败");
break;
case HmiBodyFatDataUtil.HEART_TESTING:
mlogList.add(0, "测量状态:" + status + " 心率测量中");
break;
case HmiBodyFatDataUtil.HEART_SUCCESS:
mlogList.add(0, "测量状态:" + status + " 心率测量成功");
break;
case HmiBodyFatDataUtil.HEART_FAIL:
mlogList.add(0, "测量状态:" + status + " 心率测量失败");
break;
case HmiBodyFatDataUtil.TEST_FINISH:
mlogList.add(0, "测量状态:" + status + " 测量完成");
if (bodyFatBleUtilsData != null) {
bodyFatBleUtilsData.updateUserInfo(selectUser);
}
break;
case HmiBodyFatDataUtil.MUC_REQUEST_USER_INFO:
mlogList.add(0, "测量状态:" + status + "请求用户信息");
if (bodyFatBleUtilsData != null) {
bodyFatBleUtilsData.setUserInfo(selectUser);
}
break;
default:
mlogList.add(0, "测量状态:" + status);

}
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void onAdc(int adc, int algorithmic) {
mlogList.add(0, "阻抗:" + adc + " 算法位:" + algorithmic);
selectUser.setAdc(adc);
mMHandler.sendEmptyMessage(TO_REFRESH_USER);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void onHeartRate(int heartrate) {
mlogList.add(0, "心率:" + heartrate);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void onBodyFat(HmiBodyFatRecordBean bodyFatRecord) {
mlogList.add(0, "体脂数:" + bodyFatRecord.toString());
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}


@Override
public void onError(int code) {
mlogList.add(0, "错误码:" + code);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void onHistoryMcu(HmiMcuHistoryRecordBean mcuHistoryRecordBean) {
mlogList.add(0, "历史记录Mcu:" + mcuHistoryRecordBean.toString());
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void onHistoryApp(HmiAppHistoryRecordBean appHistoryRecordBean) {
mlogList.add(0, "历史记录app:" + appHistoryRecordBean.toString());
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void onVersion(String version) {
mlogList.add(0, "版本号:" + version);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);

}

@Override
public void onMcuBatteryStatus(int status, int battery) {
mlogList.add(0, "电量状态" + status + " 电量:" + battery);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void onSysTime(int status, int[] times) {
mlogList.add(0, "时间状态" + status);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void requestSynTime() {
mlogList.add(0, "同步时间");
if (bodyFatBleUtilsData != null)
bodyFatBleUtilsData.synMcuTime();
}

@Override
public void setTimeCallback(int type, int status) {
String msg = "";
if (type == CmdConfig.SET_SYS_TIME) {
msg = "设置系统当前时间:";
} else if (type == CmdConfig.SET_DEVICE_TIME) {
msg = "同步时间";
}
if (status == HmiBodyFatDataUtil.STATUS_SUCCESS) {
msg = msg + status + " 成功";
} else if (status == HmiBodyFatDataUtil.STATUS_FAIL) {
msg = msg + status + " 失败";
} else if (status == HmiBodyFatDataUtil.STATUS_NOT_SUPPORT) {
msg = msg + status + " 不支持";
}
mlogList.add(0, msg);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);

}

@Override
public void requestSynHistoryCallback(int status) {
if (status == 0) {
mlogList.add(0, "请求历史记录:" + status + " 无历史记录");
} else if (status == 1) {
mlogList.add(0, "请求历史记录:" + status + " 开始发送历史记录");
} else {
mlogList.add(0, "请求历史记录:" + status + " 发送历史记录结束");
}
}

@Override
public void updateUserCallback(int status) {
if (status == 0) {
mlogList.add(0, "更新用户或列表回调" + status + " 更新列表成功");
} else if (status == 1) {
mlogList.add(0, "更新用户或列表回调" + status + " 更新个人用户成功");
} else if (status == 2) {
mlogList.add(0, "更新用户或列表回调" + status + " 更新列表失败");
} else {
mlogList.add(0, "更新用户或列表回调" + status + " 更新个人用户失败");
}
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

/**
* @param status {@link#Bod}
*/
@Override
public void setUnitCallback(int status) {
if (status == 0) {
mlogList.add(0, "下发单位回调" + status + " 成功");
} else if (status == 1) {
mlogList.add(0, "下发单位回调" + status + " 失败");
} else {
mlogList.add(0, "下发单位回调" + status + " 不支持");
}
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void requestUserData(int status) {
if (status == 0x01) {
mlogList.add(0, "下发用户信息 " + status);
} else if (status == 0x03) {
mlogList.add(0, "下发用户信息成功 " + status);
} else {
mlogList.add(0, "下发用户信息失败 " + status);
}
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void onOtaCallback(int status) {

}

@Override
public void onIpData(String ip) {

}

@Override
public void onPortData(int port) {

}

@Override
public void onUrlData(String url) {

}


@Override
public void onClick(View v) {
int id = v.getId();
if (id == R.id.history) {
if (bodyFatBleUtilsData != null)
bodyFatBleUtilsData.requestSynHistory();
} else if (id == R.id.btnUser) {
if (!mEditText.getText().toString().trim().isEmpty()) {
int userid = Integer.parseInt(mEditText.getText().toString().trim());
if (mUsers.size() >= userid) {
selectUser = mUsers.get(userid - 1);
if (bodyFatBleUtilsData != null) {
bodyFatBleUtilsData.updateUserInfo(selectUser);
}
}
} else {
addLog("请输入正确的用户ID");
}
} else if (id == R.id.userlist) {
bodyFatBleUtilsData.setUserInfoList(mUsers);
if (bodyFatBleUtilsData != null)
bodyFatBleUtilsData.updateUsersComplete();
} else if (id == R.id.adduser) {
AddUserDialog addUserDialog = new AddUserDialog(new AddUserDialog.OnDialogListener() {
@Override
public void tvSucceedListener(UserBean user) {
user.setId(mUsers.size() + 1);
mUsers.add(getHmiBodyFatUserBean(user));
mUserlogList.add(user.toString());
userAdapter.notifyDataSetChanged();
}
});
addUserDialog.show(getSupportFragmentManager());
} else if (id == R.id.syntime) {
if (bodyFatBleUtilsData != null) {
bodyFatBleUtilsData.synSysTime();
}
}

}


private HmiBodyFatUserBean getHmiBodyFatUserBean(UserBean userBean) {
HmiBodyFatUserBean hmiBodyFatUserBean = new HmiBodyFatUserBean();
if (userBean.getSex() == UserBean.SEX_MAN) {
hmiBodyFatUserBean.setSex(HmiBodyFatDataUtil.SEX_MAN);
} else {
hmiBodyFatUserBean.setSex(HmiBodyFatDataUtil.SEX_FEMAN);
}
if (userBean.getModeType() == UserBean.MODE_ATHLETE) {
hmiBodyFatUserBean.setModeType(HmiBodyFatDataUtil.MODE_ATHLETE);
} else if (userBean.getModeType() == UserBean.MODE_PREGNANT) {
hmiBodyFatUserBean.setModeType(HmiBodyFatDataUtil.MODE_PREGNANT);
} else {
hmiBodyFatUserBean.setModeType(HmiBodyFatDataUtil.MODE_ORDINARY);
}
hmiBodyFatUserBean.setId(userBean.getId());
hmiBodyFatUserBean.setAge(userBean.getAge());
hmiBodyFatUserBean.setHeight(userBean.getHeight());
hmiBodyFatUserBean.setWeight(userBean.getWeight());
hmiBodyFatUserBean.setAdc(userBean.getAdc());
return hmiBodyFatUserBean;
}


private void addLog(String log) {
mlogList.add(0, TimeUtils.getTimeSSS() + log);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}


private final int TO_REFRESH_UI = 300;
private final int TO_REFRESH_USER = 301;


private class MHandler extends Handler {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case TO_REFRESH_UI:
if (listAdapter != null) {
listAdapter.notifyDataSetChanged();
}
break;
case TO_REFRESH_USER:
if (userAdapter != null) {
mUserlogList.clear();
if (mUsers != null) {
for (HmiBodyFatUserBean user : mUsers) {
mUserlogList.add(user.toString());
}
}
userAdapter.notifyDataSetChanged();
}
break;

}
}
}


}

+ 39
- 49
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/meat_probe/MeatProbeActivity.java View File

@@ -196,57 +196,47 @@ public class MeatProbeActivity extends BleBaseActivity implements OnCallbackBle,

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_meat_probe_connect:
if (mAILinkBleManager != null) {
mAILinkBleManager.connectDevice(mMac);
int id = v.getId();
if (id == R.id.btn_meat_probe_connect) {
if (mAILinkBleManager != null) {
mAILinkBleManager.connectDevice(mMac);
}
} else if (id == R.id.btn_meat_probe_disconnect) {
if (mAILinkBleManager != null) {
mAILinkBleManager.disconnect(mMac);
}
} else if (id == R.id.btn_meat_probe_version) {
if (mMeatProbeBleData != null) {
mMeatProbeBleData.getVersionInfo();
}
} else if (id == R.id.btn_meat_probe_battery) {
if (mMeatProbeBleData != null) {
mMeatProbeBleData.getBattery();
}
} else if (id == R.id.btn_meat_probe_switch_unit) {
if (mMeatProbeBleData != null) {
//0-摄氏度 1-华氏度
if (unit == 0) {
mMeatProbeBleData.sendSwitchUnit(1);
} else {
mMeatProbeBleData.sendSwitchUnit(0);
}
break;
case R.id.btn_meat_probe_disconnect:
if (mAILinkBleManager != null) {
mAILinkBleManager.disconnect(mMac);
}
break;
case R.id.btn_meat_probe_version:
if (mMeatProbeBleData != null) {
mMeatProbeBleData.getVersionInfo();
}
break;
case R.id.btn_meat_probe_battery:
if (mMeatProbeBleData != null) {
mMeatProbeBleData.getBattery();
}
break;
case R.id.btn_meat_probe_switch_unit:
if (mMeatProbeBleData != null) {
//0-摄氏度 1-华氏度
if (unit == 0) {
mMeatProbeBleData.sendSwitchUnit(1);
} else {
mMeatProbeBleData.sendSwitchUnit(0);
}

}
break;
case R.id.btn_meat_probe_get_info:
if (mMeatProbeBleData != null) {
mMeatProbeBleData.appGetDeviceInfo();
}
break;
case R.id.btn_meat_probe_start:
if (mMeatProbeBleData != null) {
mProbeBean.setCookingId(System.currentTimeMillis());
mProbeBean.setCurrentUnit(unit);
mMeatProbeBleData.appSetDeviceInfo(mProbeBean);
}
break;
case R.id.btn_meat_probe_end:
if (mMeatProbeBleData != null) {
mMeatProbeBleData.endWork();
}
break;
default:
break;
}
} else if (id == R.id.btn_meat_probe_get_info) {
if (mMeatProbeBleData != null) {
mMeatProbeBleData.appGetDeviceInfo();
}
} else if (id == R.id.btn_meat_probe_start) {
if (mMeatProbeBleData != null) {
mProbeBean.setCookingId(System.currentTimeMillis());
mProbeBean.setCurrentUnit(unit);
mMeatProbeBleData.appSetDeviceInfo(mProbeBean);
}
} else if (id == R.id.btn_meat_probe_end) {
if (mMeatProbeBleData != null) {
mMeatProbeBleData.endWork();
}
}
}


+ 61
- 83
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/meat_probe_charger/MeatProbeChargerActivity.java View File

@@ -112,91 +112,69 @@ public class MeatProbeChargerActivity extends BleBaseActivity implements View.On

@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_probe_version:
//获取版本号
mMeatProbeChargerBleDevice.getVersion();
break;
case R.id.btn_probe_sync_time:
//同步时间
mMeatProbeChargerBleDevice.appSyncTime();
break;
case R.id.btn_probe_info:
//获取设备状态
mMeatProbeChargerBleDevice.getDeviceInfo();
break;
case R.id.btn_probe_set:
//设置探针参数,需要选择探针
if (mDialogMacList.size() > 0) {
setProbeDataDialog();
} else {
Toast.makeText(MeatProbeChargerActivity.this, "请确认充电盒当前是否有连接的探针,点击获取设备状态按钮试试", Toast.LENGTH_SHORT).show();
}
break;
case R.id.btn_probe_get:
//获取探针参数,先判断是否有探针再选择探针获取数据,需要选择探针
if (mDialogMacList.size() > 0) {
getProbeDataDialog();
} else {
Toast.makeText(MeatProbeChargerActivity.this, "请确认充电盒当前是否有连接的探针,点击获取设备状态按钮试试", Toast.LENGTH_SHORT).show();
}
break;
case R.id.btn_probe_clear:
//清除探针数据,需要选择探针
if (mDialogMacList.size() > 0) {
clearProbeDataDialog();
} else {
Toast.makeText(MeatProbeChargerActivity.this, "请确认充电盒当前是否有连接的探针,点击获取设备状态按钮试试", Toast.LENGTH_SHORT).show();
}
break;
case R.id.btn_probe_unit:
//切换盒子单位
if (("切换成℃").equals(btn_probe_unit.getText().toString())) {
btn_probe_unit.setText("切换成℉");
mMeatProbeChargerBleDevice.switchUnit(true);
} else {
btn_probe_unit.setText("切换成℃");
mMeatProbeChargerBleDevice.switchUnit(false);
}
break;
case R.id.btn_probe_set_alarm:
//发送报警设置,需要选择探针
if (mDialogMacList.size() > 0) {
setAlarmDialog();
} else {
Toast.makeText(MeatProbeChargerActivity.this, "请确认充电盒当前是否有连接的探针,点击获取设备状态按钮试试", Toast.LENGTH_SHORT).show();
}
break;
case R.id.btn_probe_clear_alarm:
//清除报警设置,需要选择探针
if (mDialogMacList.size() > 0) {
cancelDialog();
} else {
Toast.makeText(MeatProbeChargerActivity.this, "请确认充电盒当前是否有连接的探针,点击获取设备状态按钮试试", Toast.LENGTH_SHORT).show();
}
break;
case R.id.btn_probe_set_hand:
//发送握手命令进行握手
if (!TextUtils.isEmpty(et_probe_set_hand.getText().toString())) {
String cidvidpid = et_probe_set_hand.getText().toString().replaceAll(",", ",");
if (cidvidpid.contains(",")) {
String[] split = cidvidpid.split(",");
int cid = 0, vid = 0, pid = 0;
cid = Integer.parseInt(split[0], 16);
if (split.length > 1) {
vid = Integer.parseInt(split[1], 16);
}
if (split.length > 2) {
pid = Integer.parseInt(split[2], 16);
}
BleConfig.setHandshakeStatus(mMac, true, cid, vid, pid);
int id = view.getId();
if (id == R.id.btn_probe_version) {//获取版本号
mMeatProbeChargerBleDevice.getVersion();
} else if (id == R.id.btn_probe_sync_time) {//同步时间
mMeatProbeChargerBleDevice.appSyncTime();
} else if (id == R.id.btn_probe_info) {//获取设备状态
mMeatProbeChargerBleDevice.getDeviceInfo();
} else if (id == R.id.btn_probe_set) {//设置探针参数,需要选择探针
if (mDialogMacList.size() > 0) {
setProbeDataDialog();
} else {
Toast.makeText(MeatProbeChargerActivity.this, "请确认充电盒当前是否有连接的探针,点击获取设备状态按钮试试", Toast.LENGTH_SHORT).show();
}
} else if (id == R.id.btn_probe_get) {//获取探针参数,先判断是否有探针再选择探针获取数据,需要选择探针
if (mDialogMacList.size() > 0) {
getProbeDataDialog();
} else {
Toast.makeText(MeatProbeChargerActivity.this, "请确认充电盒当前是否有连接的探针,点击获取设备状态按钮试试", Toast.LENGTH_SHORT).show();
}
} else if (id == R.id.btn_probe_clear) {//清除探针数据,需要选择探针
if (mDialogMacList.size() > 0) {
clearProbeDataDialog();
} else {
Toast.makeText(MeatProbeChargerActivity.this, "请确认充电盒当前是否有连接的探针,点击获取设备状态按钮试试", Toast.LENGTH_SHORT).show();
}
} else if (id == R.id.btn_probe_unit) {//切换盒子单位
if (("切换成℃").equals(btn_probe_unit.getText().toString())) {
btn_probe_unit.setText("切换成℉");
mMeatProbeChargerBleDevice.switchUnit(true);
} else {
btn_probe_unit.setText("切换成℃");
mMeatProbeChargerBleDevice.switchUnit(false);
}
} else if (id == R.id.btn_probe_set_alarm) {//发送报警设置,需要选择探针
if (mDialogMacList.size() > 0) {
setAlarmDialog();
} else {
Toast.makeText(MeatProbeChargerActivity.this, "请确认充电盒当前是否有连接的探针,点击获取设备状态按钮试试", Toast.LENGTH_SHORT).show();
}
} else if (id == R.id.btn_probe_clear_alarm) {//清除报警设置,需要选择探针
if (mDialogMacList.size() > 0) {
cancelDialog();
} else {
Toast.makeText(MeatProbeChargerActivity.this, "请确认充电盒当前是否有连接的探针,点击获取设备状态按钮试试", Toast.LENGTH_SHORT).show();
}
} else if (id == R.id.btn_probe_set_hand) {//发送握手命令进行握手
if (!TextUtils.isEmpty(et_probe_set_hand.getText().toString())) {
String cidvidpid = et_probe_set_hand.getText().toString().replaceAll(",", ",");
if (cidvidpid.contains(",")) {
String[] split = cidvidpid.split(",");
int cid = 0, vid = 0, pid = 0;
cid = Integer.parseInt(split[0], 16);
if (split.length > 1) {
vid = Integer.parseInt(split[1], 16);
}
} else {
Toast.makeText(MeatProbeChargerActivity.this, "请先输入CID,VID,PID", Toast.LENGTH_SHORT).show();
if (split.length > 2) {
pid = Integer.parseInt(split[2], 16);
}
BleConfig.setHandshakeStatus(mMac, true, cid, vid, pid);
}
break;
default:
break;
} else {
Toast.makeText(MeatProbeChargerActivity.this, "请先输入CID,VID,PID", Toast.LENGTH_SHORT).show();
}
}
}


+ 25
- 40
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/noise_meter/BleNoiseMeterActivity.java View File

@@ -123,46 +123,31 @@ public class BleNoiseMeterActivity extends BleBaseActivity implements View.OnCli

@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;

int id = v.getId();
if (id == R.id.btn_noise_ble_ac) {//A/C键功能
if (mNoiseMeterBle != null) {
mNoiseMeterBle.sendAC();
}
} else if (id == R.id.btn_noise_ble_light) {//LIGHT键
if (mNoiseMeterBle != null) {
mNoiseMeterBle.sendLight();
}
} else if (id == R.id.btn_noise_ble_fs) {//F/S键
if (mNoiseMeterBle != null) {
mNoiseMeterBle.sendFS();
}
} else if (id == R.id.btn_noise_ble_max) {//MAX键
if (mNoiseMeterBle != null) {
mNoiseMeterBle.sendMax();
}
} else if (id == R.id.btn_noise_ble_up) {//UP键
if (mNoiseMeterBle != null) {
mNoiseMeterBle.sendUp();
}
} else if (id == R.id.btn_noise_ble_down) {//DOWN键
if (mNoiseMeterBle != null) {
mNoiseMeterBle.sendDown();
}
}
}


+ 26
- 41
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/noise_meter/WifiBleNoiseMeterActivity.java View File

@@ -74,47 +74,32 @@ public class WifiBleNoiseMeterActivity extends BleBaseActivity implements View.O
@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;

if (id == R.id.btn_get_device_state) {
sendData(mNoiseSendUtils.sendSetDeviceState());
addText("获取设备状态");
} else if (id == R.id.btn_get_support_list) {
sendData(mNoiseSendUtils.sendSetSupportList());
addText("获取设备支持的功能列表");
} else if (id == R.id.btn_noise_ac) {
if (deviceAc == 1) {
deviceAc++;
} else {
deviceAc--;
}
sendData(mNoiseSendUtils.sendAc(deviceAc));
} else if (id == R.id.btn_noise_min_max) {
deviceMinMax++;
sendData(mNoiseSendUtils.sendMinMaxMode(deviceMinMax % 3));
} else if (id == R.id.btn_noise_hold) {
if (deviceHold == 0) {
deviceHold++;
} else {
deviceHold--;
}
sendData(mNoiseSendUtils.sendHoldMode(deviceHold, 100));
} else if (id == R.id.btn_noise_log) {
sendData(mNoiseSendUtils.sendGetHistory(mTime));
addText("获取历史记录:时间=" + mTime);
}



+ 20
- 23
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/share_charger/ShareChargerActivity.java View File

@@ -127,29 +127,26 @@ public class ShareChargerActivity extends BleBaseActivity implements View.OnClic

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_set:
int hour = seek_hour.getProgress();
int minute = seek_minute.getProgress();
int second = seek_second.getProgress() + 1;
if (mShareChargerData != null) {
addText("APP设置充电时间:" + getTimeStr(hour, minute, second));
mShareChargerData.appSetChargerTime(hour, minute, second);
}
break;
case R.id.btn_get:
if (mShareChargerData != null) {
addText("APP获取剩余充电时间");
mShareChargerData.appGetChargerTime();
}
break;
case R.id.btn_switch:
boolean isOpen = rb_open.isChecked();
if (mShareChargerData != null) {
addText("APP切换开关:" + isOpen);
mShareChargerData.appSwitch(isOpen);
}
break;
int id = v.getId();
if (id == R.id.btn_set) {
int hour = seek_hour.getProgress();
int minute = seek_minute.getProgress();
int second = seek_second.getProgress() + 1;
if (mShareChargerData != null) {
addText("APP设置充电时间:" + getTimeStr(hour, minute, second));
mShareChargerData.appSetChargerTime(hour, minute, second);
}
} else if (id == R.id.btn_get) {
if (mShareChargerData != null) {
addText("APP获取剩余充电时间");
mShareChargerData.appGetChargerTime();
}
} else if (id == R.id.btn_switch) {
boolean isOpen = rb_open.isChecked();
if (mShareChargerData != null) {
addText("APP切换开关:" + isOpen);
mShareChargerData.appSwitch(isOpen);
}
}
}


+ 57
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/smart_cycling_table/SatelliteAllBean.kt View File

@@ -0,0 +1,57 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.smart_cycling_table

import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L
import com.pinwang.ailinkblesdk.modules.smart_cycling_table.SatelliteBean

/**
* 卫星豆(合计)
* @author xing
* @date 2025/03/08
* @constructor 创建[SatelliteAllBean]
*/
class SatelliteAllBean {

var type = ""
var size = 0
var list: MutableList<SatelliteBean> = mutableListOf()

fun parseStr(msgs: Array<String>) {
type = msgs[0].substring(1)
size = msgs[3].toInt()
val group = msgs.size - 5
val start = 4

//group从4开始,步进是4
for (i in 0 until group step 4) {
val index = i + start
val newArray = if (index + 4 < msgs.size) {
msgs.sliceArray(index until index + 4)
} else {
emptyArray() // 如果 startIndex 超出范围,返回空数组
}
if (newArray.isEmpty()) {
continue
}
val bean = SatelliteBean().also {
it.init(newArray)
}
L.i("卫星信息:$bean")
list.add(bean)
}
}


fun checkData(): Boolean {
return list.size >= size
}

//复制对象
fun copy(): SatelliteAllBean {
return SatelliteAllBean().also {
it.type = this.type
it.size = this.size
it.list = this.list.map { it.copy() }.toMutableList()
}
}

}

+ 42
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/smart_cycling_table/SatelliteBean.kt View File

@@ -0,0 +1,42 @@
package com.pinwang.ailinkblesdk.modules.smart_cycling_table

/**
* 卫星豆
* @author xing
* @date 2025/03/08
* @constructor 创建[SatelliteBean]
*/
class SatelliteBean {

var id = ""

/** 仰角 */
var llevation = ""
var azimuth = ""
var rssi = ""

fun init(msg: Array<String>) {
id = msg[0]
llevation = msg[1]
azimuth = msg[2]
rssi = msg[3]
}


//复制对象
fun copy(): SatelliteBean {
val bean = SatelliteBean().also {
it.id = id
it.llevation = llevation
it.azimuth = azimuth
it.rssi = rssi
}
return bean
}

override fun toString(): String {
return "SatelliteBean(id='$id', llevation='$llevation', azimuth='$azimuth', rssi='$rssi')"
}


}

+ 157
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/smart_cycling_table/SmartCyclingTableActivity.java View File

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

import android.content.Context;
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 androidx.annotation.Nullable;
import androidx.lifecycle.ViewModelProvider;

import com.pinwang.ailinkblesdk.modules.smart_cycling_table.SmartCyclingTableViewModel;

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

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleNewBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;

/**
* 智能码表界面
*
* @author xing
* @date 2025/12/11
*/
public class SmartCyclingTableActivity extends BleNewBaseActivity implements View.OnClickListener {

private Button btnGetGps, btnPause, btnContinue, btnClear;
private TextView tvLastData;
private List<String> mList;
private ArrayAdapter listAdapter;
private Context mContext;
private String mAddress;
private int mCid;
private int mVid;
private int mPid;
private SmartCyclingTableViewModel mViewModel;


@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_smart_cycling_table);
initView();
initData();
initListener();
}

private void initListener() {
btnGetGps.setOnClickListener(this);
btnPause.setOnClickListener(this);
btnContinue.setOnClickListener(this);
btnClear.setOnClickListener(this);
if (mViewModel != null) {
mViewModel.getMGpsLogLiveData().observe(this, s -> {
addLog(s);
});

// mViewModel.getMGpsNumberLiveData().observe(this, map -> {
// String msg = "";
// msg += map.get("GPGSV") + "\n";
// msg += map.get("GBGSV") + "\n";
// msg += map.get("GAGSV") + "\n";
// msg += map.get("GLGSV") + "\n";
// tvLastData.setText(msg);
// });
mViewModel.getConnectStatusData().observe(this, status -> {
switch (status) {

case 1:
addLog("扫描中");
break;
case 2:
addLog("连接断开");
break;
case 3:
addLog("连接成功");
break;

}
});
}
}

@Override
public void onClick(View v) {
int id = v.getId();
if (id == R.id.btnGetGps) {
mViewModel.getGpsInfo();
} else if (id == R.id.btnPause) {
mViewModel.refreshDataPause();
} else if (id == R.id.btnContinue) {
mViewModel.refreshDataContinue();
} else if (id == R.id.btnClear) {
clear();
}

}

private void initData() {
mViewModel = new ViewModelProvider(this).get(SmartCyclingTableViewModel.class);

mContext = this;
mAddress = getIntent().getStringExtra("mac");
mCid = getIntent().getIntExtra("cid", -1);
mVid = getIntent().getIntExtra("vid", -1);
mPid = getIntent().getIntExtra("pid", -1);
if (isServiceBinded) {
onServiceSuccess();
}
}

private void initView() {
tvLastData = findViewById(R.id.tvLastData);
btnGetGps = findViewById(R.id.btnGetGps);
btnPause = findViewById(R.id.btnPause);
btnContinue = findViewById(R.id.btnContinue);
btnClear = findViewById(R.id.btnClear);
mList = new ArrayList<>();
ListView listView = findViewById(R.id.listview);
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList);
listView.setAdapter(listAdapter);
}

private boolean isServiceBinded = false;

@Override
public void onServiceSuccess() {
isServiceBinded = true;
if (mViewModel != null) {
mViewModel.init(mAddress, mCid, mVid, mPid);
}
}

@Override
public void onServiceErr() {

}

@Override
public void unbindServices() {

}

private void addLog(String msg) {
mList.add(TimeUtils.getTimeSSS() + msg);
listAdapter.notifyDataSetChanged();
}

private void clear() {
mList.clear();
listAdapter.notifyDataSetChanged();
}
}

+ 220
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/smart_cycling_table/SmartCyclingTableViewModel.kt View File

@@ -0,0 +1,220 @@
package com.pinwang.ailinkblesdk.modules.smart_cycling_table

import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.smart_cycling_table.SatelliteAllBean
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.pingwang.bluetoothlib.AILinkBleManager
import com.pingwang.bluetoothlib.bean.BleValueBean
import com.pingwang.bluetoothlib.device.BleDevice
import com.pingwang.bluetoothlib.listener.OnBleOtherDataListener
import com.pingwang.bluetoothlib.listener.OnCallbackBle
import com.pingwang.bluetoothlib.utils.UuidUtils

/**
* 智能码表视图模型
* @author xing
* @date 2025/03/07
* @constructor 创建[SmartCyclingTableViewModel]
*/
class SmartCyclingTableViewModel : ViewModel(), OnCallbackBle, OnBleOtherDataListener {

/** ble状态数据
* true-打开
* false-关闭
* */
val bleStatusData by lazy { MutableLiveData<Boolean>() }

/** 连接状态数据
* 1-扫描中
* 2-连接断开
* 3-连接成功
*
* */
val connectStatusData by lazy { MutableLiveData<Int>() }

val mGpsLogLiveData by lazy { MutableLiveData<String>() }
val mGpsInfoLiveData by lazy { MutableLiveData<MutableMap<String, SatelliteAllBean>>() }


/** 缓存Map */
var cacheMap: MutableMap<String, SatelliteAllBean> = mutableMapOf()
var mRefreshData: Boolean = true
var mMac: String = ""
var mBleDevice: BleDevice? = null

fun init(mac: String, cid: Int, vid: Int, pid: Int) {
mMac = mac
AILinkBleManager.getInstance().setOnCallbackBle(this)
mBleDevice = AILinkBleManager.getInstance().getBleDevice(mac)
mBleDevice?.let {
connectStatusData.postValue(3)
it.setA7Encryption(false)
it.setOnBleOtherDataListener(this)
} ?: run {
connectDevice(mac, cid, vid, pid)
}
}


fun getGpsInfo() {
mBleDevice?.setNotify(UuidUtils.getUuid("FFE0"), UuidUtils.getUuid("FFE3"))
refreshDataContinue()
}

fun refreshDataPause() {
mRefreshData = false
mGpsLogLiveData.value = "暂停刷新"
}

fun refreshDataContinue() {
mRefreshData = true
mGpsLogLiveData.value = "继续刷新"
}


override fun onNotifyOtherData(uuid: String?, data: ByteArray?) {
super.onNotifyOtherData(uuid, data)
data?.let {
if (mRefreshData) {
parseData(String(data))
}
}

}


/**
* 解析数据
* @param [msg] 味精
*/
fun parseData(msg: String) {
if (msg.contains(",")) {
val split = msg.split(",")
if (split[0].isEmpty()) {
return
}
val type = split[0].substring(1)
var message: String
when (type) {
"GPGSV" -> {
message = "GPS卫星数:"
}

"GBGSV" -> {
message = "北斗卫星数:"
}

"GAGSV" -> {
message = "伽利略卫星数:"
}

"GLGSV" -> {
message = "俄罗斯卫星数:"
}

"GIGSV" -> {
message = "印度卫星数:"
}

"GQGSV" -> {
message = "日本卫星数:"
}

else -> {
return
}
}
L.i("msg:$msg")
var bean = cacheMap[type]
if (bean == null) {
bean = SatelliteAllBean()
}
bean.parseStr(split.toTypedArray())
cacheMap[type] = bean
if (bean.checkData()) {
message += "${bean.size}\n"
val newBean = bean.copy()
cacheMap.remove(bean.type)
if (newBean.size > 0) {
mGpsLogLiveData.value = message + getSatelliteAllBeanString(newBean)
}
// mGpsInfoLiveData.value = mutableMapOf<String, SatelliteAllBean>().also { it.putAll(cacheMap) }
}
}
}


/**
* 获取卫星所有豆字符串
* @param [bean] 豆
* @return [String]
*/
private fun getSatelliteAllBeanString(bean: SatelliteAllBean): String {
var message = ""
for ((index, satelliteBean) in bean.list.withIndex()) {
message += "编号:${satelliteBean.id};信号:${satelliteBean.rssi}dB"
message += if (index % 2 == 1) {
"\n"
} else {
"; "
}
}

return message
}


/**
* 连接设备
* @param [mac] mac
* @param [cid] cid
* @param [vid] vid
* @param [pid] pid
*/
private fun connectDevice(mac: String, cid: Int, vid: Int, pid: Int) {
AILinkBleManager.getInstance().connectDevice(BleValueBean(mac, cid, vid, pid))
}

override fun bleOpen() {
bleStatusData.postValue(true)
}

override fun bleClose() {
bleStatusData.postValue(false)
}

override fun onDisConnected(mac: String?, code: Int) {
super.onDisConnected(mac, code)
if (mac == mMac) {
connectStatusData.postValue(2)
}
}

override fun onServicesDiscovered(mac: String?) {
super.onServicesDiscovered(mac)
if (mac == mMac) {
connectStatusData.postValue(3)
}
}

override fun onStartScan() {
super.onStartScan()
connectStatusData.postValue(1)
}

override fun onScanning(data: BleValueBean?) {
super.onScanning(data)
data?.let {
if (it.mac == mMac) {
AILinkBleManager.getInstance().connectDevice(data)
}
}
}

override fun onCleared() {
super.onCleared()
mBleDevice?.disconnect()
AILinkBleManager.getInstance().disconnectAll()
}
}

+ 718
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/toothbrush/ToothBrushWifiNewBleActivity.java View File

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

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.text.TextUtils;
import android.view.View;
import android.widget.ArrayAdapter;
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.config.CmdConfig;
import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.device.wifibleDevice.WifiBleDeviceData;
import com.pingwang.bluetoothlib.device.wifibleDevice.WifiBleInfoBean;
import com.pingwang.bluetoothlib.listener.OnCallbackBle;
import com.pingwang.bluetoothlib.utils.BleLog;

import java.lang.ref.WeakReference;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
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.dialog.DialogStringImageBean;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.MoveDataDialogFragment;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.ShowListDialogFragment;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.ToothBrushUtils;
import cn.net.aicare.modulelibrary.module.ToothBrush.ToothBrushBleCmd;
import cn.net.aicare.modulelibrary.module.ToothBrush.ToothBrushWiFiBleUtilsData;

/**
* Wifi+ble 牙刷(new), 客户定制版本,增加api key读取和设置
*/
public class ToothBrushWifiNewBleActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, WifiBleDeviceData.OnWiFiBleCallback, ToothBrushWiFiBleUtilsData.OnBleToothBrushCallback {

private final int TO_REFRESH_UI = 300;
private final int TO_REQUEST_TOKEN = 500;
private final int GET_BATTERY = 600;

private String TAG = ToothBrushWifiNewBleActivity.class.getName();
private String mAddress;
private List<String> mList;
private ArrayAdapter listAdapter;

private ToothBrushWiFiBleUtilsData mToothBrushWiFiBleUtilsData;
private MHandler mMHandler;
private EditText etApiKey, select_gears_et, ed_score, etIp, etPort, etPath;
private List<DialogStringImageBean> mWifiList = new ArrayList<>();
private List<WifiBleInfoBean> mWifiBleInfoBeanList = new ArrayList<>();

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//禁止横屏
setContentView(R.layout.activity_tooth_brush_wifi_ble_new);
findViewById(R.id.getWifiStatus).setOnClickListener(this);
findViewById(R.id.getSn).setOnClickListener(this);
findViewById(R.id.scanWifi).setOnClickListener(this);
findViewById(R.id.disconnectWifi).setOnClickListener(this);
findViewById(R.id.getWifiName).setOnClickListener(this);
findViewById(R.id.getSupportUnit).setOnClickListener(this);
findViewById(R.id.defaultTryOut).setOnClickListener(this);
findViewById(R.id.getTimeMode).setOnClickListener(this);
findViewById(R.id.defaultMode).setOnClickListener(this);
findViewById(R.id.ota).setOnClickListener(this);
findViewById(R.id.btnScore).setOnClickListener(this);
findViewById(R.id.btnGetApiKey).setOnClickListener(this);
findViewById(R.id.btnSetApiKey).setOnClickListener(this);
findViewById(R.id.btnSetUrl).setOnClickListener(this);
findViewById(R.id.btnGetUrl).setOnClickListener(this);

etApiKey = findViewById(R.id.etApiKey);
select_gears_et = findViewById(R.id.etSelectGears);
ed_score = findViewById(R.id.etScore);
etIp = findViewById(R.id.etIp);
etPort = findViewById(R.id.etPort);
etPath = findViewById(R.id.etPath);

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 onClick(View v) {
int id = v.getId();
if (mToothBrushWiFiBleUtilsData != null) {
if (id == R.id.getWifiStatus) {
mToothBrushWiFiBleUtilsData.getWifiCurrentState();
} else if (id == R.id.getSn) {
mToothBrushWiFiBleUtilsData.getDeviceId();
} else if (id == R.id.scanWifi) {
mToothBrushWiFiBleUtilsData.scanWifi();
mList.add(TimeUtils.getTime() + "正在扫描附近可用的wifi...");
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
showWifiList();
} else if (id == R.id.getWifiName) {
mToothBrushWiFiBleUtilsData.getConnectWifiName();
} else if (id == R.id.disconnectWifi) {
mToothBrushWiFiBleUtilsData.disconnectWifi();
} else if (id == R.id.getSupportUnit) {
mToothBrushWiFiBleUtilsData.getSupportGears();
} else if (id == R.id.defaultMode) {
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();
}

}
}
} else if (id == R.id.defaultTryOut) {
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();
}

}
}
} else if (id == R.id.getTimeMode) {
mToothBrushWiFiBleUtilsData.getDefaultGearAndDuration();
} else if (id == R.id.ota) {
showFileChooser();
// mToothBrushWiFiBleUtilsData.setOta();
} else if (id == R.id.btnGetApiKey) {
mToothBrushWiFiBleUtilsData.getApiKey();
} else if (id == R.id.btnSetApiKey) {
String apiKey = etApiKey.getText().toString().trim();
if (!apiKey.isEmpty()) {
mToothBrushWiFiBleUtilsData.setApiKey(apiKey);
}
} else if (id == R.id.btnSetUrl) {
String ip = etIp.getText().toString().trim();
String port = etPort.getText().toString().trim();
String path = etPath.getText().toString().trim();
mToothBrushWiFiBleUtilsData.setServiceInfo(ip, Integer.parseInt(port), path);
} else if (id == R.id.btnGetUrl) {
mToothBrushWiFiBleUtilsData.getServiceInfo();
}

}
if (v.getId() == R.id.btnScore) {
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(TO_REFRESH_UI);
} catch (Exception e) {

mList.add(0, "出错了 请按 默认时长,刷牙时长,左时长,右时长.输入单位是秒");
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
e.printStackTrace();
}
}
}


private ShowListDialogFragment mShowListDialogFragment;

private void showWifiList() {
if (mShowListDialogFragment == null) {
mShowListDialogFragment = ShowListDialogFragment.newInstance();
mShowListDialogFragment.setList(mWifiList);
mShowListDialogFragment.setTitle("选择WIFI");
mShowListDialogFragment.setCancel("取消", 0);
mShowListDialogFragment.setOnDialogListener(new ShowListDialogFragment.onDialogListener() {
@Override
public void onItemListener(int position) {
WifiBleInfoBean wifiBleInfoBean = mWifiBleInfoBeanList.get(position);
String ssid = wifiBleInfoBean.getSsid();
MoveDataDialogFragment.newInstance()
.setTitle(ssid, "")
.setContent("", "请输入密码", MoveDataDialogFragment.NAME)
.setOk("OK", 0)
.setCancel("取消", 0)
.setOnDialogListener(new MoveDataDialogFragment.OnDialogListener() {
@Override
public void onSucceedListener(View v, String data) {
String pwd = data.trim();
setConnectWifi(wifiBleInfoBean.getMac(), pwd);

}
})
.show(getSupportFragmentManager());
}

@Override
public void onCancelListener(View v) {

}
});
}
mShowListDialogFragment.show(getSupportFragmentManager());
}

/**
* 设置连接wifi
*
* @param mac mac
* @param pwd 密码
*/
private void setConnectWifi(String mac, String pwd) {
if (mToothBrushWiFiBleUtilsData != null) {
mToothBrushWiFiBleUtilsData.setConnectWifiMac(mac, pwd);
mList.add(TimeUtils.getTime() + "正在连接wifi...");
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}
}


@Override
public void onServiceSuccess() {

//与服务建立连接
mList.add(0, "服务与界面建立连接成功");
// mList.add(0, "搜索设备");
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
mAILinkBleManager.setOnCallbackBle(this);
onServicesDiscovered(mAddress);
}


@Override
public void onServiceErr() {

}

@Override
public void unbindServices() {
if (mAILinkBleManager != null) {
mAILinkBleManager.removeOnCallbackBle(this);
mAILinkBleManager.disconnectAll();
}
}


@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 (mAILinkBleManager != null) {
mAILinkBleManager.stopScan();
mAILinkBleManager.connectDevice(data);
}
}
}

@Override
public void onDisConnected(String mac, int code) {
if (mAddress.equalsIgnoreCase(mac)) {
mList.add(0, "蓝牙已断开:" + mac);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}
}


@Override
public void onServicesDiscovered(String mac) {
if (mAILinkBleManager == null) {
return;
}
if (mAddress.equalsIgnoreCase(mac)) {
mList.add(0, "蓝牙已连接");
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
mAILinkBleManager.setOnCallbackBle(this);
BleDevice bleDevice = mAILinkBleManager.getBleDevice(mAddress);
if (bleDevice != null) {
ToothBrushWiFiBleUtilsData.init(bleDevice, this, this);
mToothBrushWiFiBleUtilsData = ToothBrushWiFiBleUtilsData.getInstance();
mMHandler.sendEmptyMessageDelayed(TO_REQUEST_TOKEN, 600);
mMHandler.sendEmptyMessageDelayed(GET_BATTERY, 800);
}
}
}

@Override
public void bleOpen() {
if (mAILinkBleManager != null) {
mAILinkBleManager.startScan(30000L);
}
mList.add(0, "蓝牙已开启,开始搜索连接");
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void bleClose() {
mList.add(0, "蓝牙已关闭");
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}


@Override
public void onBleAndWifiStatus(int bleStatus, int wifiStatus, int workStatus) {

String show = "蓝牙状态:";
switch (wifiStatus) {
case 0:
show += "无连接";
break;
case 1:
show += "已连接";
break;
case 2:
show += "配对完成";
break;
}
show += " wifi状态:";
switch (wifiStatus) {
case 0:
show += "没连接热点";
break;
case 1:
show += "尝试连接热点,但是失败了";
break;
case 2:
show += "连接的热点无网络或者信号不好";
break;
case 3:
show += "成功连接上热点";
break;
case 4:
show += "有热点信息,还没连接";
break;
}
show += " 工作状态:";
switch (workStatus) {
case 0:
show += "唤醒";
break;
case 1:
show += "进入休眠";
break;
case 2:
show += "模块准备就绪";
break;
}
mList.add(0, show);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void onWifiScanStatus(int status) {
mList.add(0, "扫描wifi状态: " + status);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void onConnectWifiName(String name) {
mList.add(0, "当前连接wifi名称: " + name);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}


@Override
public void onWifiScanBean(WifiBleInfoBean wifiBleInfoBean) {
mList.add(0, "扫描到wifi: " + wifiBleInfoBean.toString());
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void onWifiScanFinish(List<WifiBleInfoBean> list) {
mList.add(0, "扫描结束 扫描的wifi个数 " + list.size());
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
if (mWifiBleInfoBeanList == null) {
mWifiBleInfoBeanList = new ArrayList<>();
}
mWifiBleInfoBeanList.clear();
mWifiList.clear();
for (WifiBleInfoBean wifiBleInfoBean : list) {
String ssid = wifiBleInfoBean.getSsid();
if (TextUtils.isEmpty(ssid)) {
continue;
}
mWifiList.add(new DialogStringImageBean(ssid, wifiBleInfoBean.getType()));
mWifiBleInfoBeanList.add(wifiBleInfoBean);
}
if (mShowListDialogFragment != null) {
mShowListDialogFragment.setList(mWifiList);
}
}


@Override
public void onSetWifiNameOrPwdOrConnectCallback(int type, int status) {
if (type == CmdConfig.SET_WIFI_MAC) {
mList.add(0, "获取到设置的mac地址状态 " + status);
}
if (type == CmdConfig.SET_WIFI_PWD) {
mList.add(0, "获取到设置的密码状态 " + status);
}
if (type == CmdConfig.DIS_OR_CON_WIFI) {
mList.add(0, "发起连接 " + status);
}
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void onWifiConnecting(int status) {
WifiBleDeviceData.OnWiFiBleCallback.super.onWifiConnecting(status);
}

@Override
public void onConnectWifiMac(String mac) {
mList.add(0, "获取到设置的wifi的mac地址 " + mac);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void onConnectWifiPwd(String pwd) {
mList.add(0, "获取到设置的wifi的密码 " + pwd);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void onDeviceSn(long sn) {
mList.add(0, "sn: " + sn);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void onServerIp(String ip) {
mList.add(0, "ip: " + ip);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void onServerPort(int port) {
mList.add(0, "port: " + port);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void onServerPath(String path) {
mList.add(0, "path: " + path);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

/**
* 关于服务器设置信息
*
* @param status 状态 true 配置完成, false 配置失败
*/
@Override
public void onServerSettingInfo(boolean status) {
mList.add(0, "服务器设置信息: " + (status ? "配置完成" : "配置失败"));
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}


@Override
public void onVersion(String version) {
mList.add(0, "版本号:" + version);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void onGetSupportGears(List<Integer> staif, List<Integer> secondLevel) {
mList.add(0, "牙刷支持的一级档位:" + Arrays.toString(staif.toArray()) + " 二级档位:" + Arrays.toString(secondLevel.toArray()));
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void onGetBattery(int batteryStatus, int batteryQuantity) {
mList.add(0, "电池状态:" + batteryStatus + " 电量:" + batteryQuantity);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void onGetDefaultGearAndDuration(int time, int gear, int gearFrom) {
mList.add(0, "获得到默认的刷牙档位和时长:" + time + " 档位:" + gear + " 档位级别" + gearFrom);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@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(TO_REFRESH_UI);
}

@Override
public void onGetManualParameter(int time, int hz, int duty) {
mList.add(0, " 获取手动档位的参数: 时长" + time + " 频率" + hz + " 占空比" + duty);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@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(TO_REFRESH_UI);
} else {
mList.add(0, " 设置手动设置(自定义)档位: 结果" + result + " " + s);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}
}

@Override
public void onTestFinish(int totalTime, int leftTime, int rightTime, int mode, int battery) {
mList.add(0, "刷牙完成: 总时长:" + totalTime + " 左时长:" + leftTime + " 右时长:" + rightTime + " 模式:" + mode + " 电量:" + battery);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void onTryOutResult(int result) {
mList.add(0, "设置使用结果:" + result + " ( 0:设置成功 1:设置失败,原因未知 2:不支持设置)");
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void onTwoLevelModeDefault(int mode) {
mList.add(0, "获取二级档位默认值:" + mode);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}


@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(TO_REFRESH_UI);
}


@Override
public void onSetApiKey(boolean result) {
addText("设置apikey结果:" + result);
}

@Override
public void onGetApiKey(String apiKey) {
addText("读取到API KEY:" + apiKey);
}

@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 TO_REFRESH_UI:
if (listAdapter != null) {
listAdapter.notifyDataSetChanged();
}
break;
case TO_REQUEST_TOKEN:
mList.add(0, "请求授权");
mToothBrushWiFiBleUtilsData.requestToken(System.currentTimeMillis());
if (listAdapter != null) {
listAdapter.notifyDataSetChanged();
}
mToothBrushWiFiBleUtilsData.getDefaultGearAndDuration();
break;
case GET_BATTERY:
mToothBrushWiFiBleUtilsData.getBattery();
break;
}
}
}

// 添加一条文本
private void addText(String text) {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss:SSS", Locale.US);
mList.add(0, sdf.format(System.currentTimeMillis()) + ":\n" + text);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}


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).setFileUri(url).setOnBleOTAListener(listener).build(bleDevice);
// mOPLOtaManager.startOta();
// }

}

app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/toothbrush/ToothBrushWifiBleActivity.java → app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/toothbrush/ToothBrushWifiOnOnBleActivity.java View File

@@ -6,6 +6,7 @@ import android.net.Uri;
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.EditText;
@@ -17,20 +18,23 @@ import androidx.annotation.Nullable;
import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.config.CmdConfig;
import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.device.wifibleDevice.WifiBleDeviceData;
import com.pingwang.bluetoothlib.device.wifibleDevice.WifiBleInfoBean;
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.dialog.DialogStringImageBean;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.MoveDataDialogFragment;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.ShowListDialogFragment;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.ToothBrushUtils;
import cn.net.aicare.modulelibrary.module.ToothBrush.ToothBrushBleCmd;
import cn.net.aicare.modulelibrary.module.ToothBrush.ToothBrushWiFiBleUtilsData;
@@ -38,39 +42,37 @@ 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();
public class ToothBrushWifiOnOnBleActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, WifiBleDeviceData.OnWiFiBleCallback, ToothBrushWiFiBleUtilsData.OnBleToothBrushCallback {
private String TAG = ToothBrushWifiOnOnBleActivity.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;
private EditText select_gears_et, ed_score;
private List<DialogStringImageBean> mWifiList = new ArrayList<>();
private List<WifiBleInfoBean> mWifiBleInfoBeanList = new ArrayList<>();

@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.getWifiStatus).setOnClickListener(this);
findViewById(R.id.getSn).setOnClickListener(this);
findViewById(R.id.scanWifi).setOnClickListener(this);
findViewById(R.id.disconnectWifi).setOnClickListener(this);
findViewById(R.id.getWifiName).setOnClickListener(this);
findViewById(R.id.getSupportUnit).setOnClickListener(this);
findViewById(R.id.defaultTryOut).setOnClickListener(this);
findViewById(R.id.getTimeMode).setOnClickListener(this);
findViewById(R.id.defaultMode).setOnClickListener(this);
findViewById(R.id.ota).setOnClickListener(this);
findViewById(R.id.btn_score).setOnClickListener(this);
findViewById(R.id.btnScore).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);
select_gears_et = findViewById(R.id.etSelectGears);
ed_score = findViewById(R.id.etScore);

mAddress = getIntent().getStringExtra("mac");
mList = new ArrayList<>();
@@ -84,16 +86,159 @@ public class ToothBrushWifiBleActivity extends BleBaseActivity implements View.O
}


@Override
public void onClick(View v) {
int id = v.getId();
if (mToothBrushWiFiBleUtilsData != null) {
if (id == R.id.getWifiStatus) {
mToothBrushWiFiBleUtilsData.getWifiCurrentState();
} else if (id == R.id.getSn) {
mToothBrushWiFiBleUtilsData.getDeviceId();
} else if (id == R.id.scanWifi) {
mToothBrushWiFiBleUtilsData.scanWifi();
mList.add(TimeUtils.getTime() + "正在扫描附近可用的wifi...");
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
showWifiList();
} else if (id == R.id.getWifiName) {
mToothBrushWiFiBleUtilsData.getConnectWifiName();
} else if (id == R.id.disconnectWifi) {
mToothBrushWiFiBleUtilsData.disconnectWifi();
} else if (id == R.id.getSupportUnit) {
mToothBrushWiFiBleUtilsData.getSupportGears();
} else if (id == R.id.defaultMode) {
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();
}

}
}
} else if (id == R.id.defaultTryOut) {
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();
}

}
}
} else if (id == R.id.getTimeMode) {
mToothBrushWiFiBleUtilsData.getDefaultGearAndDuration();
} else if (id == R.id.ota) {
showFileChooser();
// mToothBrushWiFiBleUtilsData.setOta();
}
}
if (v.getId() == R.id.btnScore) {
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(TO_REFRESH_UI);
} catch (Exception e) {

mList.add(0, "出错了 请按 默认时长,刷牙时长,左时长,右时长.输入单位是秒");
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
e.printStackTrace();
}
}
}


private ShowListDialogFragment mShowListDialogFragment;

private void showWifiList() {
if (mShowListDialogFragment == null) {
mShowListDialogFragment = ShowListDialogFragment.newInstance();
mShowListDialogFragment.setList(mWifiList);
mShowListDialogFragment.setTitle("选择WIFI");
mShowListDialogFragment.setCancel("取消", 0);
mShowListDialogFragment.setOnDialogListener(new ShowListDialogFragment.onDialogListener() {
@Override
public void onItemListener(int position) {
WifiBleInfoBean wifiBleInfoBean = mWifiBleInfoBeanList.get(position);
String ssid = wifiBleInfoBean.getSsid();
MoveDataDialogFragment.newInstance()
.setTitle(ssid, "")
.setContent("", "请输入密码", MoveDataDialogFragment.NAME)
.setOk("OK", 0)
.setCancel("取消", 0)
.setOnDialogListener(new MoveDataDialogFragment.OnDialogListener() {
@Override
public void onSucceedListener(View v, String data) {
String pwd = data.trim();
setConnectWifi(wifiBleInfoBean.getMac(), pwd);

}
})
.show(getSupportFragmentManager());
}

@Override
public void onCancelListener(View v) {

}
});
}
mShowListDialogFragment.show(getSupportFragmentManager());
}

/**
* 设置连接wifi
*
* @param mac mac
* @param pwd 密码
*/
private void setConnectWifi(String mac, String pwd) {
if (mToothBrushWiFiBleUtilsData != null) {
mToothBrushWiFiBleUtilsData.setConnectWifiMac(mac, pwd);
mList.add(TimeUtils.getTime() + "正在连接wifi...");
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}
}


@Override
public void onServiceSuccess() {

//与服务建立连接
mList.add(0, "服务与界面建立连接成功");
// mList.add(0, "搜索设备");
mMHandler.sendEmptyMessage(ToRefreUi);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
mAILinkBleManager.setOnCallbackBle(this);
mAILinkBleManager.startScan(30 * 1000);


}

@@ -111,10 +256,6 @@ public class ToothBrushWifiBleActivity extends BleBaseActivity implements View.O
}
}

@Override
public void onStartScan() {

}

@Override
public void onScanning(BleValueBean data) {
@@ -122,317 +263,194 @@ public class ToothBrushWifiBleActivity extends BleBaseActivity implements View.O
if (data.getMac().equalsIgnoreCase(mAddress)) {
if (mAILinkBleManager != null) {
mAILinkBleManager.stopScan();
mAILinkBleManager.connectDevice(data.getMac());
mAILinkBleManager.connectDevice(data);
}
}
}

@Override
public void onScanTimeOut() {

}

@Override
public void onConnecting(String mac) {

}

@Override
public void onDisConnected(String mac, int code) {
mList.add(0, "蓝牙已断开");
mMHandler.sendEmptyMessage(ToRefreUi);
if (mAddress.equalsIgnoreCase(mac)) {
mList.add(0, "蓝牙已断开:" + mac);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}
}

@Override
public void onServicesDiscovered(String mac) {
mList.add(0, "蓝牙已连接");
mMHandler.sendEmptyMessage(ToRefreUi);
mAILinkBleManager.setOnCallbackBle(this);
BleDevice bleDevice = mAILinkBleManager.getBleDevice(mAddress);
if (bleDevice != null) {
ToothBrushWiFiBleUtilsData.init(bleDevice, this, this);
mToothBrushWiFiBleUtilsData = ToothBrushWiFiBleUtilsData.getInstance();
mMHandler.sendEmptyMessageDelayed(ToRequestToken, 600);
mMHandler.sendEmptyMessageDelayed(GETBATTERY, 800);
if (mAddress.equalsIgnoreCase(mac)) {
mList.add(0, "蓝牙已连接");
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
BleDevice bleDevice = mAILinkBleManager.getBleDevice(mAddress);
if (bleDevice != null) {
ToothBrushWiFiBleUtilsData.init(bleDevice, this, this);
mToothBrushWiFiBleUtilsData = ToothBrushWiFiBleUtilsData.getInstance();
mMHandler.sendEmptyMessageDelayed(TO_REQUEST_TOKEN, 600);
mMHandler.sendEmptyMessageDelayed(GET_BATTERY, 800);
}
}
}

@Override
public void bleOpen() {

if (mAILinkBleManager != null) {
mAILinkBleManager.startScan(30000L);
}
mList.add(0, "蓝牙已开启,开始搜索连接");
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void bleClose() {

mList.add(0, "蓝牙已关闭");
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}


@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);

public void onBleAndWifiStatus(int bleStatus, int wifiStatus, int workStatus) {
BleLog.e(TAG, "蓝牙状态:" + bleStatus + " wifi状态:" + wifiStatus + " 工作状态:" + workStatus);
mList.add(0, "蓝牙状态:" + bleStatus + " wifi状态:" + wifiStatus + " 工作状态:" + workStatus);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void OnWifiScanStatus(int Status) {
mList.add(0, "扫描wifi状态: " + Status);
mMHandler.sendEmptyMessage(ToRefreUi);
public void onWifiScanStatus(int status) {
mList.add(0, "扫描wifi状态: " + status);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

private HashMap<Integer, String> mHashMap = new HashMap();

@Override
public void OnWifiListName(int no, String name) {

mHashMap.put(no, name);
mMHandler.sendEmptyMessage(ToRefreUi);
public void onConnectWifiName(String name) {
mList.add(0, "当前连接wifi名称: " + name);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

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);
public void onWifiScanBean(WifiBleInfoBean wifiBleInfoBean) {
mList.add(0, "扫描到wifi: " + wifiBleInfoBean.toString());
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void OnWifiScanFinish(int wifiNum) {
mList.add(0, "扫描结束 扫描的wifi个数 " + wifiNum);
mMHandler.sendEmptyMessage(ToRefreUi);
public void onWifiScanFinish(List<WifiBleInfoBean> list) {
mList.add(0, "扫描结束 扫描的wifi个数 " + list.size());
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
if (mWifiBleInfoBeanList == null) {
mWifiBleInfoBeanList = new ArrayList<>();
}
mWifiBleInfoBeanList.clear();
mWifiList.clear();
for (WifiBleInfoBean wifiBleInfoBean : list) {
String ssid = wifiBleInfoBean.getSsid();
if (TextUtils.isEmpty(ssid)) {
continue;
}
mWifiList.add(new DialogStringImageBean(ssid, wifiBleInfoBean.getType()));
mWifiBleInfoBeanList.add(wifiBleInfoBean);
}
if (mShowListDialogFragment != null) {
mShowListDialogFragment.setList(mWifiList);
}
}

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) {
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.DIS_OR_CON_WIFI) {
mList.add(0, "发起连接 " + status);
mMHandler.sendEmptyMessage(ToRefreUi);
}
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void onWifiConnecting(int status) {
WifiBleDeviceData.OnWiFiBleCallback.super.onWifiConnecting(status);
}

@Override
public void getSelectWifiMac(String mac) {
public void onConnectWifiMac(String mac) {
mList.add(0, "获取到设置的wifi的mac地址 " + mac);
mMHandler.sendEmptyMessage(ToRefreUi);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void getSelectWifiPaw(String paw) {
mList.add(0, "获取到设置的wifi的密码 " + paw);
mMHandler.sendEmptyMessage(ToRefreUi);
public void onConnectWifiPwd(String pwd) {
mList.add(0, "获取到设置的wifi的密码 " + pwd);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}


@Override
public void getDid(long sn) {
public void onDeviceSn(long sn) {
mList.add(0, "sn: " + sn);
mMHandler.sendEmptyMessage(ToRefreUi);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@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:
public void onServerIp(String ip) {
mList.add(0, "ip: " + ip);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

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);
@Override
public void onServerPort(int port) {
mList.add(0, "port: " + port);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

mMHandler.sendEmptyMessage(ToRefreUi);
} catch (Exception e) {
@Override
public void onServerPath(String path) {
mList.add(0, "path: " + path);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

mList.add(0, "出错了 请按 默认时长,刷牙时长,左时长,右时长.输入单位是秒");
mMHandler.sendEmptyMessage(ToRefreUi);
e.printStackTrace();
}
}
/**
* 关于服务器设置信息
*
* @param status 状态 true 配置完成, false 配置失败
*/
@Override
public void onServerSettingInfo(boolean status) {
mList.add(0, "服务器设置信息: " + (status ? "配置完成" : "配置失败"));
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

private final int ToRefreUi = 300;
private final int ConnectWifi = 400;
private final int ToRequestToken = 500;
private final int GETBATTERY = 600;

private final int TO_REFRESH_UI = 300;
private final int CONNECT_WIFI = 400;
private final int TO_REQUEST_TOKEN = 500;
private final int GET_BATTERY = 600;


@Override
public void onVersion(String version) {
mList.add(0, "版本号:" + version);
mMHandler.sendEmptyMessage(ToRefreUi);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void onGetSupportGears(List<Integer> staif, List<Integer> secondLevel) {
mList.add(0, "牙刷支持的一级档位:" + Arrays.toString(staif.toArray()) + " 二级档位:" + Arrays.toString(secondLevel.toArray()));
mMHandler.sendEmptyMessage(ToRefreUi);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void onGetBattery(int batteryStatus, int batteryQuantity) {
mList.add(0, "电池状态:" + batteryStatus + " 电量:" + batteryQuantity);
mMHandler.sendEmptyMessage(ToRefreUi);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void onGetDefaultGearAndDuration(int time, int gear, int gearFrom) {
mList.add(0, "获得到默认的刷牙档位和时长:" + time + " 档位:" + gear + " 档位级别" + gearFrom);
mMHandler.sendEmptyMessage(ToRefreUi);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
@@ -448,13 +466,13 @@ public class ToothBrushWifiBleActivity extends BleBaseActivity implements View.O
s = "授权成功";
}
mList.add(0, "请求授权结果" + result + " " + s);
mMHandler.sendEmptyMessage(ToRefreUi);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void onGetManualParameter(int time, int hz, int duty) {
mList.add(0, " 获取手动档位的参数: 时长" + time + " 频率" + hz + " 占空比" + duty);
mMHandler.sendEmptyMessage(ToRefreUi);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
@@ -469,29 +487,29 @@ public class ToothBrushWifiBleActivity extends BleBaseActivity implements View.O
}
if (type == ToothBrushBleCmd.SET_TOOTHBRUSH_TIME_GEARS) {
mList.add(0, " 设置默认刷牙时长和工作档位: 结果" + result + " " + s);
mMHandler.sendEmptyMessage(ToRefreUi);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
} else {
mList.add(0, " 设置手动设置(自定义)档位: 结果" + result + " " + s);
mMHandler.sendEmptyMessage(ToRefreUi);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}
}

@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);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void onTryOutResult(int result) {
mList.add(0, "设置使用结果:" + result + " ( 0:设置成功 1:设置失败,原因未知 2:不支持设置)");
mMHandler.sendEmptyMessage(ToRefreUi);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}

@Override
public void onTwoLevelModeDefault(int mode) {
mList.add(0, "获取二级档位默认值:" + mode);
mMHandler.sendEmptyMessage(ToRefreUi);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}


@@ -513,7 +531,18 @@ public class ToothBrushWifiBleActivity extends BleBaseActivity implements View.O
break;
}
mList.add(0, s);
mMHandler.sendEmptyMessage(ToRefreUi);
mMHandler.sendEmptyMessage(TO_REFRESH_UI);
}


@Override
public void onGetApiKey(String apiKey) {
ToothBrushWiFiBleUtilsData.OnBleToothBrushCallback.super.onGetApiKey(apiKey);
}

@Override
public void onSetApiKey(boolean result) {
ToothBrushWiFiBleUtilsData.OnBleToothBrushCallback.super.onSetApiKey(result);
}

@Override
@@ -526,15 +555,15 @@ public class ToothBrushWifiBleActivity extends BleBaseActivity implements View.O
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case ToRefreUi:
case TO_REFRESH_UI:
if (listAdapter != null) {
listAdapter.notifyDataSetChanged();
}
break;
case ConnectWifi:
mToothBrushWiFiBleUtilsData.connectWifi();
case CONNECT_WIFI:
mToothBrushWiFiBleUtilsData.setConnectWifi();
break;
case ToRequestToken:
case TO_REQUEST_TOKEN:
mList.add(0, "请求授权");
mToothBrushWiFiBleUtilsData.requestToken(System.currentTimeMillis());
if (listAdapter != null) {
@@ -542,7 +571,7 @@ public class ToothBrushWifiBleActivity extends BleBaseActivity implements View.O
}
mToothBrushWiFiBleUtilsData.getDefaultGearAndDuration();
break;
case GETBATTERY:
case GET_BATTERY:
mToothBrushWiFiBleUtilsData.getBattery();
break;
}
@@ -550,51 +579,6 @@ public class ToothBrushWifiBleActivity extends BleBaseActivity implements View.O
}


/**
* 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() {
@@ -653,7 +637,7 @@ public class ToothBrushWifiBleActivity extends BleBaseActivity implements View.O
//
// public void initOtaUtil(Context context, Uri url, OnBleOTAListener listener, BleDevice bleDevice) {
// mOPLOtaManager = null;
// mOPLOtaManager = OPLOtaManager.newBuilder(context).setFilePath(url).setOnBleOTAListener(listener).build(bleDevice);
// mOPLOtaManager = OPLOtaManager.newBuilder(context).setFileUri(url).setOnBleOTAListener(listener).build(bleDevice);
// mOPLOtaManager.startOta();
// }


+ 5
- 5
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/weight_scale/WeightScaleActivity.java View File

@@ -290,11 +290,11 @@ public class WeightScaleActivity extends BleBaseActivity implements WeightScaleD
addText("版本号:" + version);
}

// /**
// * 请求同步时间
// *
// * @param quest 1-请求同步时间
// */
/**
* 请求同步时间
*
* @param quest 1-请求同步时间
*/
// @Override
// public void onSyncTime(int quest) {
// if (quest == 1) {

+ 115
- 136
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/wifi_ble_scale/WeightScaleWifiBleActivity.java View File

@@ -24,6 +24,8 @@ import androidx.annotation.Nullable;

import com.pingwang.bluetoothlib.config.CmdConfig;
import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.device.wifibleDevice.WifiBleDeviceData;
import com.pingwang.bluetoothlib.device.wifibleDevice.WifiBleInfoBean;
import com.pingwang.bluetoothlib.listener.OnCallbackBle;
import com.pingwang.bluetoothlib.utils.BleLog;

@@ -48,10 +50,8 @@ import cn.net.aicare.modulelibrary.module.BodyFatScale.AppHistoryRecordBean;
import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatBleUtilsData;
import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatDataUtil;
import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatRecord;
import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatUserBean;
import cn.net.aicare.modulelibrary.module.BodyFatScale.McuHistoryRecordBean;
import cn.net.aicare.modulelibrary.module.BodyFatScale.User;
import cn.net.aicare.modulelibrary.module.wifibleDevice.WifiBleDeviceData;
import cn.net.aicare.modulelibrary.module.wifibleDevice.WifiBleInfoBean;

/**
* wifi+ble体脂秤
@@ -74,19 +74,19 @@ public class WeightScaleWifiBleActivity extends BleBaseActivity implements View.

private ActivityResultLauncher<Boolean> launcher;
private WifiBleDeviceData mWifiBleDeviceData;
private User selectUser;
private BodyFatUserBean mSelectBodyFatUserBean;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//禁止横屏
setContentView(R.layout.activity_weight_scale_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.getWifiStatus).setOnClickListener(this);
findViewById(R.id.getSn).setOnClickListener(this);
findViewById(R.id.scanWifi).setOnClickListener(this);
findViewById(R.id.connectWifi).setOnClickListener(this);
findViewById(R.id.disconnectWifi).setOnClickListener(this);
findViewById(R.id.getWifiName).setOnClickListener(this);
findViewById(R.id.setedpaw).setOnClickListener(this);
findViewById(R.id.setedmac).setOnClickListener(this);
findViewById(R.id.ota).setOnClickListener(this);
@@ -157,128 +157,107 @@ public class WeightScaleWifiBleActivity extends BleBaseActivity implements View.
FileUtils.init();
mDialogList = new ArrayList<>();
initLauncher();
selectUser = getDefault();
mSelectBodyFatUserBean = getDefault();
}


@Override
public void onClick(View v) {
int id = v.getId();
switch (id) {
case R.id.reset:
mList.add(0, getString(R.string.reset));
listAdapter.notifyDataSetChanged();
if (mWifiBleDeviceData != null) {
mWifiBleDeviceData.setReset();
}
break;
case R.id.wifistatus:
if (mWifiBleDeviceData != null) {
mWifiBleDeviceData.getWifiCurrentState();
}
break;
case R.id.sn:
if (mWifiBleDeviceData != null) {
mWifiBleDeviceData.getDeviceSn();
}
break;
case R.id.scan_wifi:

if (mWifiBleDeviceData != null) {
mWifiBleDeviceData.getWifiList();
mList.add(TimeUtils.getTime() + "sacn wifi...");
mMHandler.sendEmptyMessage(REFRESH_DATA);
}
showWifiList();
break;

case R.id.setedmac:
if (mWifiBleDeviceData != null) {
mWifiBleDeviceData.getConnectWifiMac();
}
break;
case R.id.setedpaw:
if (mWifiBleDeviceData != null) {
mWifiBleDeviceData.getConnectWifiPwd();
}
break;
case R.id.setedname:
if (mWifiBleDeviceData != null) {
mWifiBleDeviceData.getConnectWifiSsid();
}
break;
case R.id.disconnect:
if (mWifiBleDeviceData != null) {
mWifiBleDeviceData.setDisconnectWifi();
}
break;
case R.id.ota:
showFileChooser();
break;
case R.id.surroundings:

String ipStr = et_ip.getText().toString();
String port = et_port.getText().toString();
String path = et_path.getText().toString();
if (mWifiBleDeviceData != null) {
mWifiBleDeviceData.setServiceInfo(ipStr, Integer.parseInt(port), path);
}
mList.add(0, getString(R.string.set_environment) + ipStr + ":" + port + path);
listAdapter.notifyDataSetChanged();
break;
case R.id.check_ip:
if (mWifiBleDeviceData != null) {
mWifiBleDeviceData.getIp();
}
mList.add(0, getString(R.string.view_environment_ip));
listAdapter.notifyDataSetChanged();
break;
case R.id.check_port:
if (mWifiBleDeviceData != null) {
mWifiBleDeviceData.getPort();
}
mList.add(0, getString(R.string.view_environment_port));
listAdapter.notifyDataSetChanged();
break;
case R.id.check_path:
if (mWifiBleDeviceData != null) {
mWifiBleDeviceData.getPath();
}
mList.add(0, getString(R.string.view_environment_path));
listAdapter.notifyDataSetChanged();
break;

case R.id.btn_select_file:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
launcher.launch(true);
} else {
mDialogList.clear();
ArrayList<String> list = FileUtils.list();
for (String s : list) {
mDialogList.add(new DialogStringImageBean(s, 0));
}
ShowListDialogFragment.newInstance()
.setTitle("")
.setCancel("", 0)
.setCancelBlank(true)
.setBackground(true)
.setBottom(false)
.setList(mDialogList)
.setOnDialogListener(new ShowListDialogFragment.onDialogListener() {
@Override
public void onItemListener(int position) {
if (mDialogList.size() > position) {
DialogStringImageBean dialogStringImageBean = mDialogList.get(position);
String name = dialogStringImageBean.getName();
SP.getInstance().putOtaFileName(name);
}
}
})
.show(getSupportFragmentManager());
if (id == R.id.reset) {
mList.add(0, getString(R.string.reset));
listAdapter.notifyDataSetChanged();
if (mWifiBleDeviceData != null) {
mWifiBleDeviceData.setReset();
}
} else if (id == R.id.getWifiStatus) {
if (mWifiBleDeviceData != null) {
mWifiBleDeviceData.getWifiCurrentState();
}
} else if (id == R.id.getSn) {
if (mWifiBleDeviceData != null) {
mWifiBleDeviceData.getDeviceSn();
}
} else if (id == R.id.scanWifi) {
if (mWifiBleDeviceData != null) {
mWifiBleDeviceData.getWifiList();
mList.add(TimeUtils.getTime() + "sacn wifi...");
mMHandler.sendEmptyMessage(REFRESH_DATA);
}
showWifiList();
} else if (id == R.id.setedmac) {
if (mWifiBleDeviceData != null) {
mWifiBleDeviceData.getConnectWifiMac();
}
} else if (id == R.id.setedpaw) {
if (mWifiBleDeviceData != null) {
mWifiBleDeviceData.getConnectWifiPwd();
}
} else if (id == R.id.getWifiName) {
if (mWifiBleDeviceData != null) {
mWifiBleDeviceData.getConnectWifiSsid();
}
} else if (id == R.id.disconnectWifi) {
if (mWifiBleDeviceData != null) {
mWifiBleDeviceData.setDisconnectWifi();
}
} else if (id == R.id.ota) {
showFileChooser();
} else if (id == R.id.surroundings) {
String ipStr = et_ip.getText().toString();
String port = et_port.getText().toString();
String path = et_path.getText().toString();
if (mWifiBleDeviceData != null) {
mWifiBleDeviceData.setServiceInfo(ipStr, Integer.parseInt(port), path);
}
mList.add(0, getString(R.string.set_environment) + ipStr + ":" + port + path);
listAdapter.notifyDataSetChanged();
} else if (id == R.id.check_ip) {
if (mWifiBleDeviceData != null) {
mWifiBleDeviceData.getIp();
}
mList.add(0, getString(R.string.view_environment_ip));
listAdapter.notifyDataSetChanged();
} else if (id == R.id.check_port) {
if (mWifiBleDeviceData != null) {
mWifiBleDeviceData.getPort();
}
mList.add(0, getString(R.string.view_environment_port));
listAdapter.notifyDataSetChanged();
} else if (id == R.id.check_path) {
if (mWifiBleDeviceData != null) {
mWifiBleDeviceData.getPath();
}
mList.add(0, getString(R.string.view_environment_path));
listAdapter.notifyDataSetChanged();
} else if (id == R.id.btn_select_file) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
launcher.launch(true);
} else {
mDialogList.clear();
ArrayList<String> list = FileUtils.list();
for (String s : list) {
mDialogList.add(new DialogStringImageBean(s, 0));
}

break;

ShowListDialogFragment.newInstance()
.setTitle("")
.setCancel("", 0)
.setCancelBlank(true)
.setBackground(true)
.setBottom(false)
.setList(mDialogList)
.setOnDialogListener(new ShowListDialogFragment.onDialogListener() {
@Override
public void onItemListener(int position) {
if (mDialogList.size() > position) {
DialogStringImageBean dialogStringImageBean = mDialogList.get(position);
String name = dialogStringImageBean.getName();
SP.getInstance().putOtaFileName(name);
}
}
})
.show(getSupportFragmentManager());
}
}

}
@@ -324,16 +303,16 @@ public class WeightScaleWifiBleActivity extends BleBaseActivity implements View.
}


private User getDefault() {
User user = new User();
user.setModeType(BodyFatDataUtil.MODE_ORDINARY);
user.setSex(BodyFatDataUtil.SEX_MAN);
user.setAge(18);
user.setHeight(170);
user.setAdc(560);
user.setWeight(50);
user.setId(1);
return user;
private BodyFatUserBean getDefault() {
BodyFatUserBean bodyFatUserBean = new BodyFatUserBean();
bodyFatUserBean.setModeType(BodyFatDataUtil.MODE_ORDINARY);
bodyFatUserBean.setSex(BodyFatDataUtil.SEX_MAN);
bodyFatUserBean.setAge(18);
bodyFatUserBean.setHeight(170);
bodyFatUserBean.setAdc(560);
bodyFatUserBean.setWeight(50);
bodyFatUserBean.setId(1);
return bodyFatUserBean;
}

private void initLauncher() {
@@ -452,7 +431,7 @@ public class WeightScaleWifiBleActivity extends BleBaseActivity implements View.
case BodyFatDataUtil.MUC_REQUEST_USER_INFO:
mList.add(0, getString(R.string.measurement_status) + status + "\n" + getString(R.string.request_user_information));
if (bodyFatBleUtilsData != null) {
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().setUserInfo(selectUser, BleDeviceConfig.WEIGHT_BODY_FAT_SCALE));
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().setUserInfo(mSelectBodyFatUserBean, BleDeviceConfig.WEIGHT_BODY_FAT_SCALE));
}
break;
default:

+ 46
- 65
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/wifible_sphy/WifiBleSphyActivity.java View File

@@ -20,6 +20,8 @@ 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.wifibleDevice.WifiBleDeviceData;
import com.pingwang.bluetoothlib.device.wifibleDevice.WifiBleInfoBean;
import com.pingwang.bluetoothlib.listener.CallbackDisIm;
import com.pingwang.bluetoothlib.listener.OnBleCompanyListener;
import com.pingwang.bluetoothlib.listener.OnBleVersionListener;
@@ -41,8 +43,6 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import cn.net.aicare.modulelibrary.module.sphygmomanometer.SphyBleConfig;
import cn.net.aicare.modulelibrary.module.sphygmomanometer.SphyWifiBleDeviceData;
import cn.net.aicare.modulelibrary.module.wifibleDevice.WifiBleDeviceData;
import cn.net.aicare.modulelibrary.module.wifibleDevice.WifiBleInfoBean;


/**
@@ -164,72 +164,53 @@ public class WifiBleSphyActivity extends BleBaseActivity implements OnCallbackDi
@Override
public void onClick(View v) {
SendBleBean sendBleBean = new SendBleBean();
switch (v.getId()) {
case R.id.btnVersion:
sendBleBean.setHex(mBleSendCmdUtil.getBleVersion());
mSphyWifiBleDeviceData.sendData(sendBleBean);
break;
case R.id.btnBattery:
sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus());
mSphyWifiBleDeviceData.sendData(sendBleBean);
break;
case R.id.btn_get_did:
sendBleBean.setHex(mBleSendCmdUtil.getDid());
mSphyWifiBleDeviceData.sendData(sendBleBean);
break;
case R.id.btn_voice:
if (mVoiceStatus == 0) {
mVoiceStatus = 1;
} else {
mVoiceStatus = 0;

}
mSphyWifiBleDeviceData.setSphyVoice(mVoiceStatus);
break;
int id = v.getId();
if (id == R.id.btnVersion) {
sendBleBean.setHex(mBleSendCmdUtil.getBleVersion());
mSphyWifiBleDeviceData.sendData(sendBleBean);
} else if (id == R.id.btnBattery) {
sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus());
mSphyWifiBleDeviceData.sendData(sendBleBean);
} else if (id == R.id.btn_get_did) {
sendBleBean.setHex(mBleSendCmdUtil.getDid());
mSphyWifiBleDeviceData.sendData(sendBleBean);
} else if (id == R.id.btn_voice) {
if (mVoiceStatus == 0) {
mVoiceStatus = 1;
} else {
mVoiceStatus = 0;

case R.id.clear:
if (mList != null)
mList.clear();
}
mSphyWifiBleDeviceData.setSphyVoice(mVoiceStatus);
} else if (id == R.id.clear) {
if (mList != null)
mList.clear();
mHandler.sendEmptyMessage(REFRESH_DATA);
} else if (id == R.id.btn_config) {
String ip = et_url.getText().toString().trim();
String port = et_port.getText().toString().trim();
String path = et_path.getText().toString().trim();
if (ip.length() == 0 || port.length() == 0) {
mList.add(TimeUtils.getTime() + "配置失败:ip或端口为空");
mHandler.sendEmptyMessage(REFRESH_DATA);
break;


case R.id.btn_config:

String ip = et_url.getText().toString().trim();
String port = et_port.getText().toString().trim();
String path = et_path.getText().toString().trim();
if (ip.length() == 0 || port.length() == 0) {
mList.add(TimeUtils.getTime() + "配置失败:ip或端口为空");
mHandler.sendEmptyMessage(REFRESH_DATA);
return;
}
setServiceInfo(ip, Integer.parseInt(port), path);
mList.add(TimeUtils.getTime() + "配置服务器信息中...");
return;
}
setServiceInfo(ip, Integer.parseInt(port), path);
mList.add(TimeUtils.getTime() + "配置服务器信息中...");
mHandler.sendEmptyMessage(REFRESH_DATA);
} else if (id == R.id.btn_read_config) {
getWifiConnectInfo();
} else if (id == R.id.btn_read_wifi_status) {
if (mWifiBleDeviceData != null) {
mWifiBleDeviceData.getWifiCurrentState();
}
} else if (id == R.id.btn_wifi) {
if (mWifiBleDeviceData != null) {
mWifiBleDeviceData.getWifiList();
mList.add(TimeUtils.getTime() + "正在扫描附近可用的wifi...");
mHandler.sendEmptyMessage(REFRESH_DATA);
break;

case R.id.btn_read_config:
getWifiConnectInfo();
break;

case R.id.btn_read_wifi_status:
if (mWifiBleDeviceData != null) {
mWifiBleDeviceData.getWifiCurrentState();
}
break;
case R.id.btn_wifi:
if (mWifiBleDeviceData != null) {
mWifiBleDeviceData.getWifiList();
mList.add(TimeUtils.getTime() + "正在扫描附近可用的wifi...");
mHandler.sendEmptyMessage(REFRESH_DATA);
}
showWifiList();
break;


default:
break;
}
showWifiList();
}
}


+ 0
- 114
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/BleScanUtil.java View File

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

import com.pingwang.bluetoothlib.AILinkBleManager;
import com.pingwang.bluetoothlib.bean.BleScanAddAilinkBean;
import com.pingwang.bluetoothlib.config.BleConfig;
import com.pingwang.bluetoothlib.server.ELinkBleServer;
import com.pingwang.bluetoothlib.utils.UuidUtils;

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

/**
* 蓝牙扫描设备工具
* 因为 AILink 现在接了不是 AILink 协议的设备,比如旧的营养秤 UUID 不同
*/
public class BleScanUtil {

/**
* 开始扫描设备
*
* @param blueToothService 蓝牙服务
* @param timeout 延迟 ms
*/
public static void scanLeDevice(ELinkBleServer blueToothService, long timeout) {
blueToothService.scanLeDevice(timeout, getScanLeDeviceMap());
}

public static void scanLeDevice(AILinkBleManager aiLinkBleManager, long timeout) {
aiLinkBleManager.startScan(timeout, getScanLeDeviceMap());
}


public static List<BleScanAddAilinkBean> getScanLeDeviceMap() {
List<BleScanAddAilinkBean> list = new ArrayList<>();
list.add(getAifresh());
list.add(getAifit02());
list.add(getAifit03());
list.add(getOkOk());
return list;
}

public static UUID[] getScanLeDeviceUUID() {
UUID[] uuids = new UUID[]{UUID.fromString("0000FFB0-0000-1000-8000-00805F9B34FB"),// 旧的营养秤 AC05
// UUID.fromString("0000FEE7-0000-1000-8000-00805F9B34FB"),// 华盛达手表
BleConfig.UUID_SERVER_AILINK, BleConfig.UUID_SERVER_BROADCAST_AILINK};
return uuids;
}


/**
* 好营养AC05的设备
*
* @return {@link BleScanAddAilinkBean}
*/
private static BleScanAddAilinkBean getAifresh() {
// 旧的营养秤
BleScanAddAilinkBean bleScanAddAilinkBean = new BleScanAddAilinkBean();
bleScanAddAilinkBean.setDeviceServiceUUID(new UUID[]{UuidUtils.getUuid("0000FFB0-0000-1000-8000-00805F9B34FB")});
byte[] bytes = new byte[]{(byte) 0xAC, 0x05};
bleScanAddAilinkBean.setDeviceBroadcast(bytes, 0, bytes.length);
bleScanAddAilinkBean.setCid(0x0037);
bleScanAddAilinkBean.setVid(0x0000);
bleScanAddAilinkBean.setPid(0x0000);
return bleScanAddAilinkBean;
}

/**
* 好身材AC02的体脂秤,带温度
*
* @return {@link BleScanAddAilinkBean}
*/
private static BleScanAddAilinkBean getAifit02() {
// 旧的好身材
BleScanAddAilinkBean bleScanAddAilinkBean = new BleScanAddAilinkBean();
bleScanAddAilinkBean.setDeviceServiceUUID(new UUID[]{UuidUtils.getUuid("0000FFB0-0000-1000-8000-00805F9B34FB")});
byte[] bytes = new byte[]{(byte) 0xAC, 0x02};
bleScanAddAilinkBean.setDeviceBroadcast(bytes, 0, bytes.length);
bleScanAddAilinkBean.setCid(0x005E);
bleScanAddAilinkBean.setVid(0x0070);
bleScanAddAilinkBean.setPid(0x0001);
return bleScanAddAilinkBean;
}

/**
* 好身材AC03的体脂秤,带温度
*
* @return {@link BleScanAddAilinkBean}
*/
private static BleScanAddAilinkBean getAifit03() {
// 旧的好身材
BleScanAddAilinkBean bleScanAddAilinkBean = new BleScanAddAilinkBean();
bleScanAddAilinkBean.setDeviceServiceUUID(new UUID[]{UuidUtils.getUuid("0000FFB0-0000-1000-8000-00805F9B34FB")});
byte[] bytes = new byte[]{(byte) 0xAC, 0x03};
bleScanAddAilinkBean.setDeviceBroadcast(bytes, 0, bytes.length);
bleScanAddAilinkBean.setCid(0x005E);
bleScanAddAilinkBean.setVid(0x0070);
bleScanAddAilinkBean.setPid(0x0001);
return bleScanAddAilinkBean;
}

private static BleScanAddAilinkBean getOkOk() {
// OKOK广播秤
BleScanAddAilinkBean bleScanAddAilinkBean = new BleScanAddAilinkBean();
bleScanAddAilinkBean.setDeviceServiceUUID(null);
byte[] bytes = new byte[]{(byte) 0x00, 0x00};
bleScanAddAilinkBean.setDeviceBroadcast(bytes, 6, 6+bytes.length);
bleScanAddAilinkBean.setCid(0x08+0xFFFF);
bleScanAddAilinkBean.setVid(0x0001);
bleScanAddAilinkBean.setPid(0x0002);
return bleScanAddAilinkBean;
}

}

+ 46
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/CoroutineUtils.kt View File

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

import kotlinx.coroutines.CoroutineExceptionHandler
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.launch
import kotlin.coroutines.cancellation.CancellationException

object CoroutineUtils {

// 使用 SupervisorJob 确保单个协程失败不影响其他协程
private val ioScope = CoroutineScope(
SupervisorJob() +
Dispatchers.IO +
CoroutineExceptionHandler { _, throwable ->
// 1. 打印详细堆栈
throwable.printStackTrace()
}
)

/**
* 在IO线程池执行协程任务,自动捕获并处理未捕获异常
*
* @param block 要执行的协程代码块
* @return 可用于取消任务的Job对象
*/
fun coroutineScopeIo(block: suspend CoroutineScope.() -> Unit): Job {
return ioScope.launch {
try {
block() // 正确执行传入的代码块
} catch (e: CancellationException) {
// 正常取消不处理
throw e
} catch (e: Exception) {
// 此处捕获协程内部未处理的异常
// 异常已由CoroutineExceptionHandler处理,此处可添加额外逻辑
L.e( "内部捕获: ${e.message}")
}
}
}



}

+ 0
- 175
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/EightBodyFatAlgorithms.java View File

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

import com.besthealth.bhBodyComposition120.BhBodyComposition;
import com.besthealth.bhBodyComposition120.BhErrorType;
import com.besthealth.bhBodyComposition120.BhSex;
import com.holtek.libHTBodyfat.HTBodyBasicInfo;
import com.holtek.libHTBodyfat.HTBodyResultAllBody;

import java.util.Locale;

import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.eight_bodyfat.EightBodyFatAdc;


public class EightBodyFatAlgorithms {


public EightBodyFatAlgorithms() {
}

private static class AlgorithmsHolder {
private static EightBodyFatAlgorithms algorithmsUnit = new EightBodyFatAlgorithms();
}


public static EightBodyFatAlgorithms getInstance() {
return AlgorithmsHolder.algorithmsUnit;

}


public EightBodyFatBean getAlgorithmsData(int algorithms, int sex, int height, float weight_kg, int age, EightBodyFatAdc eightBodyfatAdc) {
EightBodyFatBean eightBodyFatBean = new EightBodyFatBean();
switch (algorithms) {

case 0x20:
//实例化对象
BhBodyComposition bhBodyComposition = new BhBodyComposition();
//传入性别
bhBodyComposition.bhSex = sex == 1 ? BhSex.MALE.ordinal() : BhSex.FEMALE.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) {

eightBodyFatBean.setWeight(String.valueOf(bhBodyComposition.bhWeightKg));
eightBodyFatBean.setBmi(Adecimal(bhBodyComposition.bhBMI));
eightBodyFatBean.setBmr((float) bhBodyComposition.bhBMR);
eightBodyFatBean.setUvi((float) bhBodyComposition.bhVFAL);
eightBodyFatBean.setBm(String.valueOf(bhBodyComposition.bhBoneKg));
eightBodyFatBean.setBfr(Adecimal(bhBodyComposition.bhBodyFatRate));
eightBodyFatBean.setVwc(Adecimal(bhBodyComposition.bhWaterRate));
eightBodyFatBean.setRom(Adecimal(bhBodyComposition.bhMuscleRate));
eightBodyFatBean.setBodyAge(bhBodyComposition.bhBodyAge);
eightBodyFatBean.setPp(Adecimal(bhBodyComposition.bhProteinRate));
eightBodyFatBean.setSfr(Adecimal(bhBodyComposition.bhBodyFatSubCutRate));
eightBodyFatBean.setFatMassBody(String.valueOf(bhBodyComposition.bhBodyFatKgTrunk));
eightBodyFatBean.setFatMassLeftTop(String.valueOf(bhBodyComposition.bhBodyFatKgLeftArm));
eightBodyFatBean.setFatMassLeftBottom(String.valueOf(bhBodyComposition.bhBodyFatKgLeftLeg));
eightBodyFatBean.setFatMassRightTop(String.valueOf(bhBodyComposition.bhBodyFatKgRightArm));
eightBodyFatBean.setFatMassRightBottom(String.valueOf(bhBodyComposition.bhBodyFatKgRightLeg));
eightBodyFatBean.setArithmetic(algorithms);
eightBodyFatBean.setBhSkeletalMuscleKg(String.valueOf(bhBodyComposition.bhSkeletalMuscleKg));
eightBodyFatBean.setBhSkeletalMuscleKgLevel(String.valueOf(bhBodyComposition.bhSkeletalMuscleKgLevel));
eightBodyFatBean.setBhSkeletalMuscleKgListStandardOrExcellent(String.valueOf(bhBodyComposition.bhMuscleKgListStandardOrExcellent));
eightBodyFatBean.setBhSkeletalMuscleKgListUnderOrStandard(String.valueOf(bhBodyComposition.bhSkeletalMuscleKgListUnderOrStandard));


// System.out.println("解密阻抗-左側全身(Ω)=" + body.bhZLeftBodyDeCode);
// System.out.println("解密阻抗-左手(Ω)=" + body.bhZLeftArmDeCode);
// System.out.println("解密阻抗-右手(Ω)=" + body.bhZRightArmDeCode);
// System.out.println("解密阻抗-左腳(Ω)=" + body.bhZLeftLegDeCode);
// System.out.println("解密阻抗-右腳(Ω)=" + body.bhZRightLegDeCode);

eightBodyFatBean.setAdcLeftHand(bhBodyComposition.bhZLeftArmDeCode);
eightBodyFatBean.setAdcRightHand(bhBodyComposition.bhZRightArmDeCode);
eightBodyFatBean.setAdcLeftFoot(bhBodyComposition.bhZLeftLegDeCode);
eightBodyFatBean.setAdcRightFoot(bhBodyComposition.bhZRightLegDeCode);
eightBodyFatBean.setAdcLeftBody(bhBodyComposition.bhZLeftBodyDeCode);
} else {
L.e("getAlgorithmsData: " + bhErrorType.toString());
}

break;


case 1:
default:

HTBodyBasicInfo basicInfo = new HTBodyBasicInfo(sex, height, weight_kg, age);
basicInfo.htZAllBodyImpedance = eightBodyfatAdc.getAdcRightBody();
basicInfo.htZLeftLegImpedance = eightBodyfatAdc.getAdcLeftFoot();
basicInfo.htZRightLegImpedance = eightBodyfatAdc.getAdcRightFoot();
basicInfo.htZLeftArmImpedance = eightBodyfatAdc.getAdcLeftHand();
basicInfo.htZRightArmImpedance = eightBodyfatAdc.getAdcRightHand();
basicInfo.htTwoLegsImpedance = eightBodyfatAdc.getAdcFoot();
basicInfo.htTwoArmsImpedance = eightBodyfatAdc.getAdcHand();
HTBodyResultAllBody resultTwoLegs = new HTBodyResultAllBody();
int errorType = resultTwoLegs.getBodyfatWithBasicInfo(basicInfo);
if (errorType == HTBodyBasicInfo.ErrorNone) {
eightBodyFatBean.setBmi(Adecimal(resultTwoLegs.htBMI));
eightBodyFatBean.setBmr((float) resultTwoLegs.htBMR);
eightBodyFatBean.setUvi((float) resultTwoLegs.htVFAL);
eightBodyFatBean.setBm(String.valueOf((float) resultTwoLegs.htBoneKg));
eightBodyFatBean.setBfr(Adecimal(resultTwoLegs.htBodyfatPercentage));
eightBodyFatBean.setVwc(Adecimal(resultTwoLegs.htWaterPercentage));
eightBodyFatBean.setRom(Adecimal(resultTwoLegs.htMusclePercentage));
eightBodyFatBean.setBodyAge(resultTwoLegs.htBodyAge);
eightBodyFatBean.setPp(Adecimal(resultTwoLegs.htProteinPercentage));
eightBodyFatBean.setSfr(Adecimal(resultTwoLegs.htBodyfatSubcut));
eightBodyFatBean.setFatMassBody(String.valueOf(resultTwoLegs.htBodyfatKgTrunk));
eightBodyFatBean.setFatMassLeftTop(String.valueOf(resultTwoLegs.htBodyfatKgLeftArm));
eightBodyFatBean.setFatMassLeftBottom(String.valueOf(resultTwoLegs.htBodyfatKgLeftLeg));
eightBodyFatBean.setFatMassRightTop(String.valueOf(resultTwoLegs.htBodyfatKgRightArm));
eightBodyFatBean.setFatMassRightBottom(String.valueOf(resultTwoLegs.htBodyfatKgRightLeg));
// eightBodyFatBean.setFatMass(resultTwoLegs.htBodyfatKg);
eightBodyFatBean.setMuscleMassBody(String.valueOf(resultTwoLegs.htMuscleKgTrunk));
eightBodyFatBean.setMuscleMassLeftTop(String.valueOf(resultTwoLegs.htMuscleKgLeftArm));
eightBodyFatBean.setMuscleMassLeftBottom(String.valueOf(resultTwoLegs.htMuscleKgLeftLeg));
eightBodyFatBean.setMuscleMassRightTop(String.valueOf(resultTwoLegs.htMuscleKgRightArm));
eightBodyFatBean.setMuscleMassRightBottom(String.valueOf(resultTwoLegs.htMuscleKgRightLeg));


// eightBodyFatBean.setMusleMass(resultTwoLegs.htMuscleKg);
// eightBodyFatBean.setStandardWeight(resultTwoLegs.htIdealWeightKg);
// eightBodyFatBean.setWeightWithoutFat(resultTwoLegs.htBodyfatFreeMass);
// eightBodyFatBean.setWeightControl((weight_kg - resultTwoLegs.htIdealWeightKg));
// eightBodyFatBean.setFatLevel(HealthyStatusUtil.ObesitylevelsStatus(weight_kg, (float) resultTwoLegs.htIdealWeightKg));
// double muscle = (resultTwoLegs.htMuscleKgLeftArm + resultTwoLegs.htMuscleKgLeftLeg + resultTwoLegs.htMuscleKgRightArm + resultTwoLegs.htMuscleKgRightLeg);
// eightBodyFatBean.setMusleMassLimbs(Adecimal(muscle / (height * height) * 10000));

eightBodyFatBean.setAdcFoot((resultTwoLegs.htZLeftLeg + resultTwoLegs.htZRightLeg));
eightBodyFatBean.setAdcHand((resultTwoLegs.htZLeftArm + resultTwoLegs.htZRightArm));
eightBodyFatBean.setAdcLeftHand(resultTwoLegs.htZLeftArm);
eightBodyFatBean.setAdcRightHand(resultTwoLegs.htZRightArm);
eightBodyFatBean.setAdcLeftFoot(resultTwoLegs.htZLeftLeg);
eightBodyFatBean.setAdcRightFoot(resultTwoLegs.htZRightLeg);
eightBodyFatBean.setAdcLeftBody(resultTwoLegs.htZAllBody);
eightBodyFatBean.setAdcRightBody(resultTwoLegs.htZAllBody);
eightBodyFatBean.setAdcRightHandLeftFoot((resultTwoLegs.htZRightArm + resultTwoLegs.htZLeftLeg));
eightBodyFatBean.setAdcLeftHandRightFoot((resultTwoLegs.htZLeftArm + resultTwoLegs.htZRightLeg));
eightBodyFatBean.setAdcBody(resultTwoLegs.htZAllBody);

}


}
return eightBodyFatBean;
}


private float Adecimal(double data) {


return Float.parseFloat(String.format(Locale.US, "%.1f", data));


}
}

+ 102
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/ElinkCmdExtension.kt View File

@@ -0,0 +1,102 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.utils

import java.nio.ByteBuffer
import java.nio.ByteOrder
import kotlin.also
import kotlin.collections.copyOfRange
import kotlin.collections.joinToString
import kotlin.text.format
import kotlin.text.substring
import kotlin.text.toInt

/**
* @author suzy
* @date 2025/2/17 12:09
**/
fun Long.toByteArray(): ByteArray {
val buffer = ByteBuffer.allocate(8) // `Long` 类型占用 8 字节
buffer.order(ByteOrder.BIG_ENDIAN) // 设置大端序
buffer.putLong(this) // 将 `Long` 类型的时间戳放入缓冲区

val byteArray = buffer.array()

// 获取前 4 字节,即将 8 字节的时间戳截取成 4 字节(大端序)
return byteArray.copyOfRange(4, byteArray.size)
}

fun ByteArray.toHexString(separator: String = ", "): String {
return this.joinToString(separator) { "%02X".format(it) }
}

fun ByteArray.formatMac() = toHexString(":")

fun String.parseMacToByteArray(): ByteArray {
// 预编译正则表达式(提升性能)
require(Regex("^([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}$").matches(this)) {
"Invalid MAC format: must match 'XX:XX:XX:XX:XX:XX'"
}

return ByteArray(6).also { bytes ->
var index = 0
var pos = 0
while (index < 6) {
bytes[index++] = substring(pos, pos + 2).toInt(16).toByte()
pos += 3 // 跳过':'分隔符
}
}
}

fun ByteArray.toLong(): Long {
require(this.size == 4) { "ByteArray must be exactly 4 bytes long" }

val buffer = ByteBuffer.wrap(this)
buffer.order(ByteOrder.BIG_ENDIAN)
return buffer.int.toLong()
}

fun ByteArray.toAltitudeInt(): Int {
require(this.size == 2) { "Input must be 2 bytes" }

val value = ((this[0].toInt() and 0xFF) shl 8) or (this[1].toInt() and 0xFF)
val isNegative = (value and 0x8000) != 0
val absValue = value and 0x7FFF // 取低 15 位

return if (isNegative) -absValue else absValue
}

fun Int.toByteArray(): ByteArray {
val buffer = ByteBuffer.allocate(2)
buffer.order(ByteOrder.BIG_ENDIAN) // 使用大端序
buffer.putShort(this.toShort()) // 将 Int 转换为 short 类型(2 字节)
return buffer.array()
}

fun Int.toAltitudeBytes(): ByteArray {
val altitude = this
require(altitude in -32767..32767) { "Altitude must be in [-32767, 32767]" }

val isNegative = altitude < 0
val absValue = if (isNegative) -altitude else altitude

// 构造 16 位数值(bit15=符号位,bit0~14=数值)
val value = if (isNegative) absValue or 0x8000 else absValue

// 转换为大端序 2 字节
return byteArrayOf(
(value shr 8).toByte(), // 高字节
value.toByte() // 低字节
)
}

fun ByteArray.toInt(): Int {
require(this.size == 2) { "ByteArray must be of size 2" } // 检查数组长度
val buffer = ByteBuffer.wrap(this)
buffer.order(ByteOrder.BIG_ENDIAN) // 使用大端序
val unsignedShort = buffer.short.toInt() and 0xFFFF
return unsignedShort // 将 short 转换为 int
}


fun Byte.toUnsignedInt(): Int = this.toInt() and 0xFF



+ 90
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/UnitUtils.java View File

@@ -1,18 +1,108 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.utils;

import android.text.TextUtils;

import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.util.Locale;

import aicare.net.cn.sdk.ailinksdkdemoandroid.config.UserUnitConfig;

/**
* xing<br>
* 2019/4/29<br>
* 单位转换工具类
*/
public class UnitUtils {
public final static String NO_DATA = "-1";
public final static String LB_SPLIT = ":";

//-------------重量------------


/**
* 服务器返回(数据库读取)
*
* @param unit 当前的单位
* @param data 数据,已转换为当前单位的数据
* @param decimal 小数位
* @return 返回指定单位显示
*/
public static String getWeightToKg(int unit, String data, int decimal) {
float weight = -1f;
float g;
float oz;
if (TextUtils.isEmpty(data) || NO_DATA.equalsIgnoreCase(data)) {
return NO_DATA;
}
if (unit == UserUnitConfig.USER_UNIT_KG) {//单位相同直接返回
weight = Float.parseFloat(String.format(Locale.US, data));
}

switch (unit) {
case UserUnitConfig.USER_UNIT_FG:
weight = UnitUtils.fgToKG(Float.parseFloat(data));
break;

case UserUnitConfig.USER_UNIT_OZ:
g = UnitUtils.ozToG(Float.parseFloat(data));
weight = UnitUtils.gToKG(g);
break;
case UserUnitConfig.USER_UNIT_LB:
oz = getWeightLbToOz(data);
g = UnitUtils.ozToG(oz);
weight = UnitUtils.gToKG(g);
break;
case UserUnitConfig.USER_UNIT_G:
weight = UnitUtils.gToKG(Float.parseFloat(data));
break;
case UserUnitConfig.USER_UNIT_LB_LB:
oz = UnitUtils.lbToOz(Float.parseFloat(data));
g = UnitUtils.ozToG(oz);
weight = UnitUtils.gToKG(g);
break;
case UserUnitConfig.USER_UNIT_ST:
String[] weightStlb = null;
if (data.contains(":")) {
weightStlb = data.split(":");
}
if (weightStlb != null && weightStlb.length >= 2) {
if (weightStlb[0].contains("-")) {
oz = UnitUtils.lbToOz(UnitUtils.stToLb(Float.parseFloat(weightStlb[0])) - Math.abs(Float.parseFloat(weightStlb[1])));
} else {
oz = UnitUtils.lbToOz(UnitUtils.stToLb(Float.parseFloat(weightStlb[0])) + Math.abs(Float.parseFloat(weightStlb[1])));
}
g = UnitUtils.ozToG(oz);
weight = UnitUtils.gToKG(g);
}

break;
}
return getHoldDecimal(decimal, weight);
}


/**
* lb:oz转Oz
*/
private static float getWeightLbToOz(String lbStr) {
float lb = 0;
float oz = 0;
if (lbStr.contains(LB_SPLIT)) {
String[] lbOzS = lbStr.split(LB_SPLIT);
lb = Float.parseFloat(lbOzS[0]);
oz = Float.parseFloat(lbOzS[1]);
} else {
lb = Float.parseFloat(lbStr);
}

float ozSize = UnitUtils.lbToOz(lb) + oz;
return ozSize;
}




/**
* st转lb
*/

+ 4
- 4
app/src/main/res/layout/activity_ad_weight_scale_cmd.xml View File

@@ -1,8 +1,8 @@
<?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">
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<ScrollView
android:layout_width="match_parent"
@@ -23,7 +23,7 @@


<Button
android:id="@+id/user"
android:id="@+id/btnUser"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="用户"

+ 5
- 0
app/src/main/res/layout/activity_ble.xml View File

@@ -164,6 +164,11 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读SN" />
<Button
android:id="@+id/btnGetVersion46"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读版本(0x46)" />

</LinearLayout>


+ 172
- 0
app/src/main/res/layout/activity_ble_0020_hp_infrared_temp.xml View File

@@ -0,0 +1,172 @@
<?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:focusable="true"
android:focusableInTouchMode="true"
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:padding="2dp">


<Button
android:id="@+id/btnPause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="暂停刷新" />

<Button
android:id="@+id/btnContinue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="继续刷新" />

<Button
android:id="@+id/btnClear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="清除log" />

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="2dp">

<Button
android:id="@+id/btnWakeup"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="唤醒" />

<Button
android:id="@+id/btnTest"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="测量" />

<Button
android:id="@+id/btnStopTest"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="停止测量" />

<Button
android:id="@+id/btnReset"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="重置" />


</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="2dp">

<EditText
android:id="@+id/etEmissivity"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:digits="0123456789."
android:hint="发射率(0.10~1.00)"
android:textSize="12dp" />

<Button
android:id="@+id/btnEmissivity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发射率" />

<EditText
android:id="@+id/etAutoShutdown"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:digits="0123456789"
android:hint="自动关机(S)"
android:textSize="12dp" />

<Button
android:id="@+id/btnAutoShutdown"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="自动关机" />

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="2dp">

<EditText
android:id="@+id/etHighTemp"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:hint="高温(℃)"
android:textSize="12dp" />

<EditText
android:id="@+id/etLowTemp"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:hint="低温(℃)"
android:textSize="12dp" />

<Button
android:id="@+id/btnHighOrLowTemp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发送高低温" />
</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="2dp">

<Button
android:id="@+id/btnGetDeviceStatus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="获取设备信息" />
<Button
android:id="@+id/btnGetDeviceParameter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="获取设备参数" />

</LinearLayout>
</LinearLayout>
</ScrollView>


<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"
android:padding="10dp"
android:stackFromBottom="true"
android:transcriptMode="alwaysScroll">


</ListView>

</LinearLayout>

+ 197
- 0
app/src/main/res/layout/activity_ble_case_treasure.xml View File

@@ -0,0 +1,197 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="5dp">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="设备MAC:" />

<TextView
android:id="@+id/tvMac"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="00:00:00:00:00:00" />


<Button
android:id="@+id/btnConnect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:text="连接" />

<Button
android:id="@+id/btnDisconnect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="断连" />

</androidx.appcompat.widget.LinearLayoutCompat>

<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">


<Button
android:id="@+id/btnClear"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:text="清空" />

<Button
android:id="@+id/btnGetVersion"
android:layout_width="70dp"
android:layout_height="wrap_content"
android:text="版本号" />

<Button
android:id="@+id/btnGetDeviceStatus"
android:layout_width="85dp"
android:layout_height="wrap_content"
android:text="设备状态" />

<Spinner
android:id="@+id/spEncoding"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:entries="@array/spinner_encoding_format" />

</androidx.appcompat.widget.LinearLayoutCompat>

<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打字速度设置(us):" />

<EditText
android:id="@+id/etSpeedUs"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:digits="0123456789"
android:inputType="number"
android:text="100" />

<Button
android:id="@+id/btnSendSpeed"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="设置" />


</androidx.appcompat.widget.LinearLayoutCompat>

<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">

<EditText
android:id="@+id/etData"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:maxHeight="500dp" />

<Button
android:id="@+id/btnSendData"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发送数据" />

</androidx.appcompat.widget.LinearLayoutCompat>

<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="次数:" />

<EditText
android:id="@+id/etCount"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:digits="0123456789"
android:inputType="number"
android:text="1000" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="间隔(ms):" />

<EditText
android:id="@+id/etIntervalMs"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:digits="0123456789"
android:inputType="number"
android:text="1000" />


<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="已发送:" />

<TextView
android:id="@+id/tvSendCount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0" />

</androidx.appcompat.widget.LinearLayoutCompat>

<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btnLoopSend"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="循环发送" />

<Button
android:id="@+id/btnStopSend"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="停止发送" />
<Button
android:id="@+id/btnResetCount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="重置已发送" />

</androidx.appcompat.widget.LinearLayoutCompat>

<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"
android:minHeight="100dp"
android:padding="10dp">

</ListView>

</androidx.appcompat.widget.LinearLayoutCompat>

+ 195
- 0
app/src/main/res/layout/activity_ble_speed_test.xml View File

@@ -0,0 +1,195 @@
<?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:paddingStart="10dp"
android:paddingEnd="10dp">

<EditText
android:id="@+id/et_uuid"
android:layout_width="180dp"
android:layout_height="wrap_content"
android:hint="uuid"
android:lines="1"
android:text="0000FFE1" />

<Button
android:id="@+id/btn_uuid"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="特征设置" />

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="10dp"
android:paddingEnd="10dp">

<EditText
android:id="@+id/et_uuid_server"
android:layout_width="180dp"
android:layout_height="wrap_content"
android:hint="uuid_server"
android:maxLines="1"
android:text="0000FFE0" />

<Button
android:id="@+id/btn_uuid_server"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="服务设置" />


</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="10dp"
android:paddingEnd="10dp">

<EditText
android:id="@+id/et_notify"
android:layout_width="180dp"
android:layout_height="wrap_content"
android:hint="uuid_notify"
android:maxLines="1"
android:text="0000FFE2" />


<Button
android:id="@+id/btn_notify"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Notify" />


</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btnSelectFile"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="选择文件" />

<TextView
android:id="@+id/tv_file_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btnWriteTest"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开始写测试" />

<Button
android:id="@+id/btnReadTest"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开始读测试" />


</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>

<TextView
android:id="@+id/tvSpeedWrite"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0 kb/s" />
<TextView
android:id="@+id/tvSpeedRead"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0 kb/s" />
</LinearLayout>


<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="10dp"
android:paddingEnd="10dp">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="接收(B):"
android:textSize="18dp" />

<TextView
android:id="@+id/tv_receive_number"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="0"
android:textSize="18dp" />


<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发送(B):"
android:textSize="18dp" />

<TextView
android:id="@+id/tv_send_number"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="0"
android:textSize="18dp" />

</LinearLayout>

</LinearLayout>
</ScrollView>


<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:padding="10dp"
android:stackFromBottom="true"
android:transcriptMode="alwaysScroll">


</ListView>

</LinearLayout>

+ 1
- 1
app/src/main/res/layout/activity_blood_glucose.xml View File

@@ -28,7 +28,7 @@
android:layout_height="wrap_content">

<Button
android:id="@+id/support_unit"
android:id="@+id/getSupportUnit"
android:text="查询支持单位"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

+ 10
- 15
app/src/main/res/layout/activity_broadcast_weight_scale.xml View File

@@ -17,10 +17,11 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginStart="10dp"
android:layout_marginTop="10dp"
android:gravity="center_vertical">
android:gravity="center_vertical"
android:orientation="horizontal">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@@ -30,8 +31,8 @@
android:id="@+id/tv_broadcast_mac_weight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:layout_marginStart="5dp" />
android:layout_marginStart="5dp"
android:text="" />

</LinearLayout>

@@ -88,11 +89,11 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginStart="10dp"
android:layout_marginTop="10dp"
android:gravity="center_vertical"
>
android:orientation="horizontal">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@@ -104,24 +105,19 @@
android:id="@+id/tv_broadcast_temp_weight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="--℃"
android:layout_marginStart="5dp"
/>
android:text="--℃" />

<TextView
android:id="@+id/tv_broadcast_did_weight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:layout_marginStart="20dp"
/>
android:text="" />

</LinearLayout>





<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -160,8 +156,7 @@
android:layout_height="0dp"
android:layout_weight="1"
android:padding="10dp"
android:stackFromBottom="true"
android:transcriptMode="alwaysScroll">
>

</ListView>


+ 89
- 7
app/src/main/res/layout/activity_bw05_watch.xml View File

@@ -17,9 +17,9 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="请输入需要连接的设备MAC地址"
android:hint="请输入需要连接MAC地址(16进制)"
android:paddingStart="20dp"
android:inputType="textCapCharacters"
android:inputType="text"
android:digits="0123456789abcdefABCDEF:"
android:maxLength="17"
android:textSize="14dp" />
@@ -76,19 +76,19 @@
<EditText
android:id="@+id/etCheckTime"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_height="50dp"
android:layout_weight="1"
android:hint="检测间隔时间(分)"
android:paddingStart="20dp"
android:hint="检测间隔(分钟)"
android:inputType="number"
android:maxLength="3"
android:textSize="14dp" />
android:textSize="10dp" />

<CheckBox
android:id="@+id/cbCheckTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:textSize="10dp"
android:text="开启/关闭测量"/>

<Button
@@ -97,6 +97,12 @@
android:layout_height="match_parent"
android:text="设置检测间隔时间" />

<Button
android:id="@+id/btnQueryTheme"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="查询主题" />

</androidx.appcompat.widget.LinearLayoutCompat>

<androidx.appcompat.widget.LinearLayoutCompat
@@ -120,10 +126,59 @@
android:id="@+id/btnSetBleName"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="设置检测间隔时间" />
android:text="设置蓝牙名称" />

<EditText
android:id="@+id/etThemeNum"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:hint="主题编号"
android:inputType="number"
android:textSize="14dp" />

<Button
android:id="@+id/btnSetThemeNum"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="设置主题" />

</androidx.appcompat.widget.LinearLayoutCompat>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="50dp"
android:orientation="horizontal">

<EditText
android:id="@+id/etHisTime"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="设置历史上传间隔(分钟)"
android:paddingStart="20dp"
android:inputType="textCapCharacters"
android:digits="0123456789"
android:maxLength="5"
android:textSize="10dp" />

<CheckBox
android:id="@+id/cbHisTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:textSize="10dp"
android:text="开启/关闭历史定时上传"/>

<Button
android:id="@+id/btnHisTime"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="设置历史上传间隔"
android:textSize="12dp"/>

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -324,6 +379,33 @@
</LinearLayout>


<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:orientation="horizontal">

<Button
android:id="@+id/btnQueryVersion"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="查询版本号" />

<Button
android:id="@+id/btnSetBind"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="进入绑定模式" />

<Button
android:id="@+id/btnQueryHardware"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="查询硬件状态" />


</LinearLayout>

<ListView
android:id="@+id/log_list"
android:layout_width="match_parent"

+ 1
- 1
app/src/main/res/layout/activity_connect_ble_test.xml View File

@@ -51,7 +51,7 @@
android:text="过滤:true" />

<Button
android:id="@+id/跳过"
android:id="@+id/btnJump"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="跳过" />

+ 20
- 5
app/src/main/res/layout/activity_eight_body_fata.xml View File

@@ -138,11 +138,26 @@

</LinearLayout>

<Button
android:id="@+id/support_unit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="查询支持单位" />
<LinearLayout
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_height="wrap_content">

<Button
android:id="@+id/getSupportUnit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="查询支持单位" />

<Button
android:id="@+id/btnConnect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="连接" />

</LinearLayout>



<ListView
android:id="@+id/log_list"

+ 20
- 10
app/src/main/res/layout/activity_eight_double_body_fata.xml View File

@@ -40,7 +40,6 @@
android:text="lb" />
</RadioGroup>


<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -49,11 +48,12 @@
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="年龄:" />
android:text="年龄:"
android:textSize="12dp" />

<EditText
android:id="@+id/et_age"
android:layout_width="100dp"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:inputType="number"
android:text="34" />
@@ -61,11 +61,12 @@
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="性别(女=0,男=1):" />
android:text="性别(女=0,男=1):"
android:textSize="12dp" />

<EditText
android:id="@+id/et_sex"
android:layout_width="100dp"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:inputType="number"
android:text="1" />
@@ -81,11 +82,12 @@
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="身高(CM):" />
android:text="身高(CM):"
android:textSize="12dp" />

<EditText
android:id="@+id/et_height"
android:layout_width="100dp"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:inputType="number"
android:text="178" />
@@ -93,15 +95,23 @@
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="体重(kg):" />
android:text="体重(kg):"
android:textSize="12dp" />

<EditText
android:id="@+id/et_weight"
android:layout_width="100dp"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:digits="0123456789."
android:inputType="number"
android:text="78" />

<Button
android:id="@+id/btn_update"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12dp"
android:text="更新用户" />

</LinearLayout>

@@ -110,7 +120,7 @@
android:orientation="horizontal"
android:layout_height="wrap_content">
<Button
android:id="@+id/support_unit"
android:id="@+id/getSupportUnit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="查询支持单位" />

+ 15
- 2
app/src/main/res/layout/activity_gas_detector.xml View File

@@ -20,6 +20,20 @@
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btnClearLog"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="清除log" />

<Button
android:id="@+id/btnPauseLog"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="暂停log" />

<Button
android:id="@+id/btnGetCurInfo"
android:layout_width="wrap_content"
@@ -277,7 +291,6 @@
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
/>
android:layout_weight="1" />

</androidx.appcompat.widget.LinearLayoutCompat>

+ 203
- 0
app/src/main/res/layout/activity_gas_detector_plus.xml View File

@@ -0,0 +1,203 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat 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">

<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"
android:padding="5dp">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btnClearLog"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="清除log" />

<Button
android:id="@+id/btnPauseLog"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="暂停log" />


</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btnGetSupportGas"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="支持的气体" />

<Button
android:id="@+id/btnGetSupportFun"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="支持的功能" />


</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btnGetAlarmSwitch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="获取报警开关" />

<Button
android:id="@+id/btnSetAlarmSwitch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="设置报警开关" />

<Button
android:id="@+id/btnGetAlarmTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="获取报警时长" />


</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btnGetAlarmFrequency"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="获取报警频率" />

<Button
android:id="@+id/btnGetGasInfo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="气体信息" />

<Button
android:id="@+id/btnGetPowerInfo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="电量信息" />

<Button
android:id="@+id/btnSetTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="同步时间" />

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">


</LinearLayout>


<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<EditText
android:id="@+id/et1"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:digits="0123456789"
android:hint="时间1"
android:text="1"
android:inputType="number"
android:textSize="14dp" />

<Button
android:id="@+id/btnSaveFrequency"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="数据存储频率(min)" />

<Button
android:id="@+id/btnReportInterval"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="上报间隔(min)" />


</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<EditText
android:id="@+id/et2"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:digits="0123456789"
android:hint="铃声id"
android:text="1"
android:inputType="number"
android:textSize="14dp" />


<Button
android:id="@+id/btnGetAlarmRing"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="报警铃声" />

<Button
android:id="@+id/btnAlarmRingTest"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="报警铃声测试" />

</LinearLayout>

</LinearLayout>
</ScrollView>


<ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />

</androidx.appcompat.widget.LinearLayoutCompat>

+ 0
- 459
app/src/main/res/layout/activity_health_bracelet.xml View File

@@ -1,459 +0,0 @@
<?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"
xmlns:tools="http://schemas.android.com/tools"
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="0dp"
android:layout_weight="1"
android:orientation="vertical"
>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">

<Button
android:id="@+id/button_connect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="连接"
/>


<Button
android:id="@+id/button_dis"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="断开"
tools:layout_editor_absoluteX="281dp"
tools:layout_editor_absoluteY="40dp"/>

<Button
android:id="@+id/button_clear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="清空"
tools:layout_editor_absoluteX="281dp"
tools:layout_editor_absoluteY="120dp"/>

<Button
android:id="@+id/button_ota"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="OTA"
tools:layout_editor_absoluteX="281dp"
tools:layout_editor_absoluteY="120dp"/>

</LinearLayout>


<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">

<Button
android:id="@+id/button_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="同步时间"
/>


<Button
android:id="@+id/button_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="获取状态"
tools:layout_editor_absoluteX="281dp"
tools:layout_editor_absoluteY="40dp"/>

<Button
android:id="@+id/button_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="获取参数"
tools:layout_editor_absoluteX="281dp"
tools:layout_editor_absoluteY="40dp"/>

<Button
android:id="@+id/button_log"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读取记录"
tools:layout_editor_absoluteX="16dp"
tools:layout_editor_absoluteY="120dp"/>


</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">


<Button
android:id="@+id/button_close"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="关机"
tools:layout_editor_absoluteX="148dp"
tools:layout_editor_absoluteY="120dp"/>

<Button
android:id="@+id/button_activation"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="激活设备"
tools:layout_editor_absoluteX="148dp"
tools:layout_editor_absoluteY="120dp"/>

<Button
android:id="@+id/button_close_activation"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="清除激活状态"
tools:layout_editor_absoluteX="148dp"
tools:layout_editor_absoluteY="120dp"/>

<Button
android:id="@+id/button_bind"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="绑定"
tools:layout_editor_absoluteX="148dp"
tools:layout_editor_absoluteY="120dp"/>


</LinearLayout>


<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/button_reboot"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="重启"
tools:layout_editor_absoluteX="148dp"
tools:layout_editor_absoluteY="120dp"/>

<Button
android:id="@+id/button_version"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="版本号"
tools:layout_editor_absoluteX="148dp"
tools:layout_editor_absoluteY="120dp"/>


<TextView
android:id="@+id/tv_version"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="bm"
/>

</LinearLayout>





<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<EditText
android:id="@+id/et_set_user"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:digits="0123456789"
android:hint="userId"
android:text="1"
/>

<EditText
android:id="@+id/et_set_user_status"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:digits="0123456789"
android:hint="status"
android:maxLength="1"
android:text="0"
/>

<Button
android:id="@+id/button_user"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="下发用户"
tools:layout_editor_absoluteX="148dp"
tools:layout_editor_absoluteY="41dp"/>


</LinearLayout>


<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:gravity="center_vertical"
android:orientation="horizontal"
>

<TextView
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text="靠近报警阀值:"
/>

<com.pinwang.ailinkblesdk.view.SeekBarMin
android:id="@+id/seekBar1"
style="@style/Widget.AppCompat.SeekBar"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
/>

<TextView
android:id="@+id/text1"
android:layout_width="50dp"
android:layout_height="wrap_content"
android:text="阀值"
/>

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:gravity="center_vertical"
android:orientation="horizontal"
>

<TextView
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text="接收的阀值次数:"
/>

<com.pinwang.ailinkblesdk.view.SeekBarMin
android:id="@+id/seekBar2"
style="@style/Widget.AppCompat.SeekBar"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
/>

<TextView
android:id="@+id/text2"
android:layout_width="50dp"
android:layout_height="wrap_content"
android:text="阀值"
/>

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:gravity="center_vertical"
android:orientation="horizontal"
>

<TextView
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text="脱离报警时间:"
/>

<com.pinwang.ailinkblesdk.view.SeekBarMin
android:id="@+id/seekBar3"
style="@style/Widget.AppCompat.SeekBar"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
/>

<TextView
android:id="@+id/text3"
android:layout_width="50dp"
android:layout_height="wrap_content"
android:text="阀值"
/>

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:gravity="center_vertical"
android:orientation="horizontal"
>

<TextView
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text="脱离报警次数:"
/>

<com.pinwang.ailinkblesdk.view.SeekBarMin
android:id="@+id/seekBar4"
style="@style/Widget.AppCompat.SeekBar"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"/>

<TextView
android:id="@+id/text4"
android:layout_width="50dp"
android:layout_height="wrap_content"
android:text="阀值"
/>

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:gravity="center_vertical"
android:orientation="horizontal"
>

<TextView
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text="Gsensor灵敏度:"
/>

<com.pinwang.ailinkblesdk.view.SeekBarMin
android:id="@+id/seekBar5"
style="@style/Widget.AppCompat.SeekBar"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
/>

<TextView
android:id="@+id/text5"
android:layout_width="50dp"
android:layout_height="wrap_content"
android:text="阀值"
/>

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:gravity="center_vertical"
android:orientation="horizontal"
>

<TextView
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text="Gsensor不动的脱机时间:"
/>

<com.pinwang.ailinkblesdk.view.SeekBarMin
android:id="@+id/seekBar6"
style="@style/Widget.AppCompat.SeekBar"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
/>

<TextView
android:id="@+id/text6"
android:layout_width="50dp"
android:layout_height="wrap_content"
android:text="阀值"
/>

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:gravity="center_vertical"
android:orientation="horizontal"
>

<TextView
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text="马达震动时间:"
/>

<com.pinwang.ailinkblesdk.view.SeekBarMin
android:id="@+id/seekBar7"
style="@style/Widget.AppCompat.SeekBar"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
/>

<TextView
android:id="@+id/text7"
android:layout_width="50dp"
android:layout_height="wrap_content"
android:text="阀值"
/>

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="right"
>

<Button
android:id="@+id/button_set"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="设置参数"
tools:layout_editor_absoluteX="281dp"
tools:layout_editor_absoluteY="120dp"/>

</LinearLayout>

</LinearLayout>

</ScrollView>


<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="10dp"
android:layout_weight="1"
android:padding="10dp"
android:stackFromBottom="true"
android:transcriptMode="alwaysScroll"
>


</ListView>

</LinearLayout>

+ 0
- 0
app/src/main/res/layout/activity_hmi_body_fat_scale_ble.xml View File


Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save