Browse Source

更新依赖库

同步最新代码
master
陈福行 2 years ago
parent
commit
ef1ffaf4a4
100 changed files with 3484 additions and 3111 deletions
  1. 27
    2
      app/build.gradle
  2. 15
    38
      app/src/main/AndroidManifest.xml
  3. 16
    19
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ADWeightScaleCmdActivity.java
  4. 1
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ADWeightScaleUserActivity.java
  5. 0
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/AboutActivity.java
  6. 6
    4
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/AiLinkScooterActivity.java
  7. 6
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BLDWeightScaleBleActivity.java
  8. 7
    4
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BabyBodyFatCmdActivity.java
  9. 3
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BabyCmdActivity.java
  10. 99
    80
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BleCmdActivity.java
  11. 3
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BloodGlucoseActivity.java
  12. 7
    4
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BloodOxygenActivity.java
  13. 3
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BloodSugar4GActivity.java
  14. 4
    3
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BroadcastBloodOxygenActivity.java
  15. 28
    40
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BroadcastScaleActivity.java
  16. 4
    3
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ClearShakeHandsActivity.java
  17. 4
    3
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ConnectBleTestActivity.java
  18. 0
    100
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/EightBodyFatAlgorithms.java
  19. 0
    335
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/EightBodyFatBean.java
  20. 8
    3
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/EightBodyfatActivity.java
  21. 5
    4
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/HeightCmdActivity.java
  22. 45
    9
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/HeightWeightScaleActivity.java
  23. 179
    168
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/MainActivity.java
  24. 73
    99
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ShowBleActivity.java
  25. 48
    17
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/SkateboardDataActivity.java
  26. 3
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/SmartMaskActivity.java
  27. 3
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/SphyCmdActivity.java
  28. 3
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TempCmdActivity.java
  29. 3
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TempGunCmdActivity.java
  30. 7
    5
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TempHumidityActivity.java
  31. 29
    21
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TestCmdActivity.java
  32. 12
    8
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TestOtaActivity.java
  33. 0
    345
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ToothBrushBleActivity.java
  34. 0
    567
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ToothBrushBleUtilsData.java
  35. 0
    566
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ToothBrushWifiBleActivity.java
  36. 3
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TpmsConnectCmdActivity.java
  37. 8
    5
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TransmissionActivity.java
  38. 20
    3
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/WeightScaleBleActivity.java
  39. 122
    80
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/WeightScaleWifiBleActivity.java
  40. 5
    4
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/WifiConfigActivity.java
  41. 3
    29
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/adapter/StringAdapter.java
  42. 7
    6
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/base/AppBaseActivity.java
  43. 5
    3
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/base/BleAppBaseActivity.java
  44. 41
    58
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/base/BleBaseActivity.java
  45. 132
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/base/BleNewBaseActivity.java
  46. 9
    4
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/config/BleDeviceConfig.java
  47. 44
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/config/UserUnitConfig.java
  48. 2
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/AddUserDialog.java
  49. 3
    29
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/DialogStringImageAdapter.java
  50. 39
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/DialogStringImageBean.java
  51. 15
    14
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/HintDataDialogFragment.java
  52. 3
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/LoadingIosDialogFragment.java
  53. 10
    9
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/ShowListDialogFragment.java
  54. 3
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/WifiDialog.java
  55. 2
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/find/FindDeviceActivity.java
  56. 3
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/find/FindDeviceAdapter.java
  57. 8
    7
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/find/FindDeviceNewActivity.java
  58. 3
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/BleDemoActivity.java
  59. 5
    3
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/PublicBleNetworkCmdActivity.java
  60. 3
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/TempInstrument/TempInstrumentActivity.java
  61. 9
    4
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/airdetector/AirDetectorActivity.java
  62. 15
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/airdetector/AirDetectorShowUtil.java
  63. 36
    3
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/airdetector/AirUtil.java
  64. 63
    18
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/airdetector_test/AirDetectorActivityTest.java
  65. 4
    3
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/airdetector_test/AirDetectorTestAdapter.java
  66. 32
    10
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/airdetector_test/AirDetectorTestShowUtil.java
  67. 7
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/airdetector_test/SettingResultInterface.java
  68. 2
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/ble_nutrition/BleNutritionActivity.java
  69. 6
    3
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/blood_glucose/BloodGlucoseActivity.java
  70. 6
    3
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/blood_glucose/BloodGlucoseTestActivity.java
  71. 2
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/blood_pressure_tc/BloodPressureTcActivity.java
  72. 3
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/body_scale_4g/BodyScale4GActivity.java
  73. 192
    131
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/broadcast_height/BroadcastHeightActivity.java
  74. 5
    15
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/broadcast_nutrition/BroadNutritionActivity.java
  75. 18
    22
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/broadcast_weight_sacle/BroadcastWeightScaleActivity.java
  76. 2
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/coffee_scale/CoffeeScaleActivity.java
  77. 2
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/fascia_gun/FasciaGunActivity.java
  78. 2
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/food_temp/FoodTempActivity.java
  79. 3
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/leaone_broadcast/LeaOneBroadcastActivity.java
  80. 164
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/meat_probe/FoodConfig.java
  81. 342
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/meat_probe/MeatProbeActivity.java
  82. 451
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/meat_probe_charger/MeatProbeChargerActivity.java
  83. 2
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/noise_meter/BleNoiseMeterActivity.java
  84. 2
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/noise_meter/WifiBleNoiseMeterActivity.java
  85. 24
    12
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/ropeskipping/RopeSkippingActivity.java
  86. 17
    12
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/ropeskipping/RopeSkippingSetActivity.java
  87. 2
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/share_charger/ShareChargerActivity.java
  88. 3
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/share_condom/ShareCondomActivity.java
  89. 8
    5
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/share_socket/ShareSocketActivity.java
  90. 11
    10
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/toothbrush/ToothBrushWifiBleActivity.java
  91. 13
    9
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/toothbrush_test/ToothbrushTestActivity.java
  92. 4
    3
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/toothbrush_test/ToothbrushTestAdapter.java
  93. 19
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/weight_scale/WeightScaleActivity.java
  94. 490
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/AllUnitUtils.java
  95. 100
    95
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/CheckPermissionUtils.java
  96. 2
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/FileProvider7.java
  97. 3
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/FileUtils.java
  98. 2
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/L.java
  99. 267
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/UnitUtils.java
  100. 0
    0
      app/src/main/res/layout/activity_ble.xml

+ 27
- 2
app/build.gradle View File

applicationId "aicare.net.cn.sdk.ailinksdkdemoandroid" applicationId "aicare.net.cn.sdk.ailinksdkdemoandroid"
minSdkVersion 19 minSdkVersion 19
targetSdkVersion 31 targetSdkVersion 31
versionCode 17
versionName "1.10.59"
versionName "1.11.9"
versionCode getVersionCodeNumber(versionName)
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
} }
buildTypes { buildTypes {
} }


} }
static def getVersionCodeNumber(String versionName) {
//1.49.13_beta05
int code=0
if (versionName!=null){
String versionCodeStr=versionName+"80"
if (versionName.contains("_")){
String[] versionStr=versionName.split("_")
versionCodeStr=versionStr[0]+"."+versionStr[1].substring(4)
}
String[] versionCodes=versionCodeStr.split("\\.")
for(int i=0;i<versionCodes.length;i++){
String version=versionCodes[i]
if (version.length()<=1){
version="0"+version;
}
versionCodes[i]=version
}
String versionAllStr=""
for (String version:versionCodes){
versionAllStr+=version
}
code= (versionAllStr).toInteger()
}
return code
}


dependencies { dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar']) implementation fileTree(dir: 'libs', include: ['*.jar'])

+ 15
- 38
app/src/main/AndroidManifest.xml View File

<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"
android:maxSdkVersion="30"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
android:maxSdkVersion="30"/>
<!--OTA需要读写文件--> <!--OTA需要读写文件-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />




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

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

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

<uses-feature
android:name="android.hardware.bluetooth_le"
android:required="false" />
<uses-feature
android:name="android.hardware.bluetooth"
android:required="false" />


<application <application
android:name=".base.MyApplication" android:name=".base.MyApplication"
android:allowBackup="true" android:allowBackup="true"
android:theme="@style/AppTheme" android:theme="@style/AppTheme"
android:usesCleartextTraffic="true" android:usesCleartextTraffic="true"
tools:targetApi="q"> tools:targetApi="q">
<activity android:name=".ClearShakeHandsActivity" />
<activity android:name=".MainActivity" <activity android:name=".MainActivity"
android:exported="true"> android:exported="true">
<intent-filter> <intent-filter>
<activity android:name=".HeightWeightScaleActivity" /> <activity android:name=".HeightWeightScaleActivity" />
<activity android:name=".find.FindDeviceActivity" /> <activity android:name=".find.FindDeviceActivity" />
<activity android:name=".TempHumidityActivity" /> <activity android:name=".TempHumidityActivity" />
<activity android:name=".RopeSkippingActivity" />
<activity android:name=".modules.ropeskipping.RopeSkippingActivity" />
<activity android:name=".modules.airdetector.AirDetectorActivity" /> <activity android:name=".modules.airdetector.AirDetectorActivity" />
<activity android:name=".modules.airdetector_test.AirDetectorActivityTest" /> <activity android:name=".modules.airdetector_test.AirDetectorActivityTest" />
<activity <activity
<activity android:name=".modules.leaone_broadcast.LeaOneBroadcastActivity" /> <activity android:name=".modules.leaone_broadcast.LeaOneBroadcastActivity" />
<activity android:name=".modules.fascia_gun.FasciaGunActivity" /> <activity android:name=".modules.fascia_gun.FasciaGunActivity" />
<activity android:name=".modules.blood_pressure_tc.BloodPressureTcActivity" /> <activity android:name=".modules.blood_pressure_tc.BloodPressureTcActivity" />
<activity android:name=".RopeSkippingSetActivity" />
<activity android:name=".modules.ropeskipping.RopeSkippingSetActivity" />
<activity android:name=".modules.body_scale_4g.BodyScale4GActivity" /> <activity android:name=".modules.body_scale_4g.BodyScale4GActivity" />
<activity android:name=".AiLinkScooterActivity" /> <activity android:name=".AiLinkScooterActivity" />
<activity android:name=".modules.TempInstrument.TempInstrumentActivity" /> <activity android:name=".modules.TempInstrument.TempInstrumentActivity" />
<activity android:name=".AboutActivity" /> <activity android:name=".AboutActivity" />
<activity android:name=".PublicBleNetworkCmdActivity" />
<activity android:name=".modules.PublicBleNetworkCmdActivity" />
<activity android:name=".modules.noise_meter.WifiBleNoiseMeterActivity" /> <activity android:name=".modules.noise_meter.WifiBleNoiseMeterActivity" />
<activity android:name=".modules.noise_meter.BleNoiseMeterActivity" /> <activity android:name=".modules.noise_meter.BleNoiseMeterActivity" />

<activity
android:name=".modules.meat_probe_charger.MeatProbeChargerActivity"
android:screenOrientation="portrait" />
<activity
android:name=".modules.meat_probe.MeatProbeActivity"
android:screenOrientation="portrait" />
<activity <activity
android:name=".modules.weight_scale.WeightScaleActivity" android:name=".modules.weight_scale.WeightScaleActivity"
android:screenOrientation="portrait" /> android:screenOrientation="portrait" />
android:name="android.support.FILE_PROVIDER_PATHS" android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" /> android:resource="@xml/file_paths" />
</provider> </provider>
<service android:name="com.pingwang.bluetoothlib.server.ELinkBleServer"/>
</application> </application>


</manifest> </manifest>

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

import android.widget.RadioGroup; import android.widget.RadioGroup;
import android.widget.TextView; import android.widget.TextView;


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

import com.pingwang.bluetoothlib.bean.BleValueBean; import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.config.CmdConfig; import com.pingwang.bluetoothlib.config.CmdConfig;
import com.pingwang.bluetoothlib.device.BleDevice; import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.utils.BleDensityUtil; import com.pingwang.bluetoothlib.utils.BleDensityUtil;
import com.pingwang.bluetoothlib.utils.BleLog; import com.pingwang.bluetoothlib.utils.BleLog;
import com.pingwang.bluetoothlib.utils.BleStrUtils; import com.pingwang.bluetoothlib.utils.BleStrUtils;

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


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





/** /**
* xing<br> * xing<br>
* 2019/7/12<br> * 2019/7/12<br>
* 显示数据 * 显示数据
*/ */
public class ADWeightScaleCmdActivity extends BleBaseActivity implements OnCallbackBle, OnBleVersionListener, OnMcuParameterListener, OnBleCompanyListener, OnBleSettingListener,
ADWeightScaleDeviceData.onNotifyData, View.OnClickListener, RadioGroup.OnCheckedChangeListener {
public class ADWeightScaleCmdActivity extends BleBaseActivity implements OnCallbackBle, OnBleVersionListener, OnMcuParameterListener, OnBleCompanyListener, OnBleSettingListener, ADWeightScaleDeviceData.onNotifyData, View.OnClickListener, RadioGroup.OnCheckedChangeListener {


private static String TAG = ADWeightScaleCmdActivity.class.getName(); private static String TAG = ADWeightScaleCmdActivity.class.getName();
private final int REFRESH_DATA = 3; private final int REFRESH_DATA = 3;
private TextView user_id_tv, user_sex_tv, user_age_tv, user_height_tv, user_weight_tv,
user_adc_tv;
private TextView user_id_tv, user_sex_tv, user_age_tv, user_height_tv, user_weight_tv, user_adc_tv;
private List<String> mList; private List<String> mList;
private ArrayAdapter listAdapter; private ArrayAdapter listAdapter;
private Context mContext; private Context mContext;
BleLog.i(TAG, "服务与界面建立连接成功"); BleLog.i(TAG, "服务与界面建立连接成功");
//与服务建立连接 //与服务建立连接
if (mBluetoothService != null) { if (mBluetoothService != null) {
mBluetoothService.setOnCallback(this);
mBluetoothService.setOnCallbackBle(this);
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress); BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress);
if (bleDevice != null) { if (bleDevice != null) {
mDevice = ADWeightScaleDeviceData.getInstance(bleDevice); mDevice = ADWeightScaleDeviceData.getInstance(bleDevice);
mDevice.clear(); mDevice.clear();
mDevice = null; mDevice = null;
} }

if (mBluetoothService != null) {
mBluetoothService.removeOnCallbackBle(this);
}
} }


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


@Override @Override
public void getAppUpdateUser(int status) { public void getAppUpdateUser(int status) {
//00:更新列表成功
//00:更新列表成功
//01:更新个人用户成功 //01:更新个人用户成功
//02:更新列表失败 //02:更新列表失败
//03:更新个人用户失败 //03:更新个人用户失败


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


case 0: case 0:
cmdDataMsg="设置成功";
cmdDataMsg = "设置成功";
break; break;
case 1: case 1:


cmdDataMsg="设置失败";
cmdDataMsg = "设置失败";
break; break;
case 2: case 2:


cmdDataMsg="不支持设置";
cmdDataMsg = "不支持设置";
break; break;


} }

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



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

import cn.net.aicare.modulelibrary.module.ADWeight.ADWeightScaleBleConfig; import cn.net.aicare.modulelibrary.module.ADWeight.ADWeightScaleBleConfig;
import cn.net.aicare.modulelibrary.module.ADWeight.ADWeightScaleUserData; import cn.net.aicare.modulelibrary.module.ADWeight.ADWeightScaleUserData;



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



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



/** /**
* xing<br> * xing<br>
* 2022/4/6<br> * 2022/4/6<br>

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

import android.widget.EditText; import android.widget.EditText;
import android.widget.ListView; import android.widget.ListView;


import androidx.annotation.Nullable;

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


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


public class AiLinkScooterActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, AilinkScooterBleData.ScooterListener { public class AiLinkScooterActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, AilinkScooterBleData.ScooterListener {


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


@Override @Override
public void unbindServices() { public void unbindServices() {

if (mBluetoothService!=null) {
mBluetoothService.removeOnCallbackBle(this);
}
} }


@Override @Override

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

import android.widget.ListView; import android.widget.ListView;
import android.widget.RadioButton; import android.widget.RadioButton;


import androidx.annotation.Nullable;

import com.pingwang.bluetoothlib.bean.BleValueBean; import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.bean.SupportUnitBean; import com.pingwang.bluetoothlib.bean.SupportUnitBean;
import com.pingwang.bluetoothlib.device.BleDevice; import com.pingwang.bluetoothlib.device.BleDevice;
import java.util.List; import java.util.List;


import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.BLDBodyfatScale.BLDBodyFatBleUtilsData; import cn.net.aicare.modulelibrary.module.BLDBodyfatScale.BLDBodyFatBleUtilsData;
import cn.net.aicare.modulelibrary.module.BLDBodyfatScale.BLDBodyFatDataUtil; import cn.net.aicare.modulelibrary.module.BLDBodyfatScale.BLDBodyFatDataUtil;
import cn.net.aicare.modulelibrary.module.BLDBodyfatScale.BLDUser; import cn.net.aicare.modulelibrary.module.BLDBodyfatScale.BLDUser;
// BleLog.i(TAG, "服务与界面建立连接成功"); // BleLog.i(TAG, "服务与界面建立连接成功");
//与服务建立连接 //与服务建立连接
if (mBluetoothService != null) { if (mBluetoothService != null) {
mBluetoothService.setOnCallback(this);
mBluetoothService.setOnCallbackBle(this);
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress); BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress);
if (bleDevice != null) { if (bleDevice != null) {
BLDBodyFatBleUtilsData.init(bleDevice, this); BLDBodyFatBleUtilsData.init(bleDevice, this);
public void unbindServices() { public void unbindServices() {
mlogList.add(0, "服务与界面建立断开连接成功"); mlogList.add(0, "服务与界面建立断开连接成功");
mMHandler.sendEmptyMessage(ToRefreUi); mMHandler.sendEmptyMessage(ToRefreUi);
if (mBluetoothService!=null) {
mBluetoothService.removeOnCallbackBle(this);
}
} }


@Override @Override

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

import android.widget.RadioGroup; import android.widget.RadioGroup;
import android.widget.TextView; import android.widget.TextView;


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

import com.pingwang.bluetoothlib.bean.BleValueBean; import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.config.CmdConfig; import com.pingwang.bluetoothlib.config.CmdConfig;
import com.pingwang.bluetoothlib.device.BleDevice; import com.pingwang.bluetoothlib.device.BleDevice;


import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.babyBodyFat.BabyBodyFatBleConfig; import cn.net.aicare.modulelibrary.module.babyBodyFat.BabyBodyFatBleConfig;
import cn.net.aicare.modulelibrary.module.babyBodyFat.BabyBodyFatDeviceData; import cn.net.aicare.modulelibrary.module.babyBodyFat.BabyBodyFatDeviceData;
import cn.net.aicare.modulelibrary.module.babyscale.BabyBleConfig; import cn.net.aicare.modulelibrary.module.babyscale.BabyBleConfig;
BleLog.i(TAG, "服务与界面建立连接成功"); BleLog.i(TAG, "服务与界面建立连接成功");
//与服务建立连接 //与服务建立连接
if (mBluetoothService != null) { if (mBluetoothService != null) {
mBluetoothService.setOnCallback(this);
mBluetoothService.setOnCallbackBle(this);
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress); BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress);
if (bleDevice != null) { if (bleDevice != null) {
mDevice = BabyBodyFatDeviceData.getInstance(bleDevice); mDevice = BabyBodyFatDeviceData.getInstance(bleDevice);
mDevice.clear(); mDevice.clear();
mDevice = null; mDevice = null;
} }

if (mBluetoothService!=null) {
mBluetoothService.removeOnCallbackBle(this);
}
} }


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

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

import android.widget.RadioGroup; import android.widget.RadioGroup;
import android.widget.Toast; import android.widget.Toast;


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

import com.pingwang.bluetoothlib.bean.SupportUnitBean; import com.pingwang.bluetoothlib.bean.SupportUnitBean;
import com.pingwang.bluetoothlib.device.BleDevice; import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.device.BleSendCmdUtil; import com.pingwang.bluetoothlib.device.BleSendCmdUtil;


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



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

import android.widget.ListView; import android.widget.ListView;
import android.widget.Toast; import android.widget.Toast;


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

import com.pingwang.bluetoothlib.bean.SupportUnitBean; import com.pingwang.bluetoothlib.bean.SupportUnitBean;
import com.pingwang.bluetoothlib.config.CmdConfig; import com.pingwang.bluetoothlib.config.CmdConfig;
import com.pingwang.bluetoothlib.device.BleDevice; import com.pingwang.bluetoothlib.device.BleDevice;


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




/** /**
* 2019/4/25<br> * 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 static String TAG = BleCmdActivity.class.getName();
private final int REFRESH_DATA = 3; private final int REFRESH_DATA = 3;
} }
} }
}; };
private int mId = 0;

private void addShowData(String data) {
mId++;
mList.add("ID:" +mId+" " + TimeUtils.getTimeSSS() + data);
mHandler.sendEmptyMessage(REFRESH_DATA);
}


@Override @Override
protected void onCreate(@Nullable Bundle savedInstanceState) { protected void onCreate(@Nullable Bundle savedInstanceState) {
if (mBleDevice != null) { if (mBleDevice != null) {
mBleDevice.disconnect(); mBleDevice.disconnect();
} }
mList.add(TimeUtils.getTime() + "断开连接");
mHandler.sendEmptyMessage(REFRESH_DATA);
addShowData("断开连接");
break; break;
case R.id.btnConnect: case R.id.btnConnect:
mBluetoothService.connectDevice(mAddress); mBluetoothService.connectDevice(mAddress);
mList.add(TimeUtils.getTime() + "连接设备");
mHandler.sendEmptyMessage(REFRESH_DATA);
addShowData("连接设备");
break; break;
case R.id.btnClear: case R.id.btnClear:
if (mList != null) if (mList != null)
case R.id.btnHandshake: case R.id.btnHandshake:
if (mBleDevice != null) { if (mBleDevice != null) {
mBleDevice.setHandshake(true); mBleDevice.setHandshake(true);
// mBleDevice.sendHandshake();
mList.add(TimeUtils.getTime() + "发送握手");
mHandler.sendEmptyMessage(REFRESH_DATA);
// mBleDevice.sendHandshake();
addShowData("发送握手");
} }
break; break;
case R.id.btnVersion: case R.id.btnVersion:
sendBleBean = new SendBleBean(); sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); sendBleBean.setHex(mBleSendCmdUtil.getBleVersion());
sendData(sendBleBean); sendData(sendBleBean);
mList.add(TimeUtils.getTime() + "正在获取版本号.");
mHandler.sendEmptyMessage(REFRESH_DATA);
addShowData("正在获取版本号.");
return; return;
} }
mList.add(TimeUtils.getTime() + "版本号:" + version);
mHandler.sendEmptyMessage(REFRESH_DATA);
addShowData("版本号:" + version);
} }
break; break;
case R.id.btnBattery: case R.id.btnBattery:
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus());
sendData(sendBleBean);
for (int i = 0; i < 10; i++) {
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus());
sendData(sendBleBean);
}
addShowData("读取电量");

break; break;
case R.id.btnTimeRead: case R.id.btnTimeRead:
sendBleBean = new SendBleBean(); sendBleBean = new SendBleBean();
sendBleBean = new SendBleBean(); sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.setDeviceInfo(data)); sendBleBean.setHex(mBleSendCmdUtil.setDeviceInfo(data));
sendData(sendBleBean); sendData(sendBleBean);
mList.add(TimeUtils.getTime() + "设置设备信息:" + BleStrUtils.byte2HexStr(data));
mHandler.sendEmptyMessage(REFRESH_DATA);
addShowData("设置设备信息:" + BleStrUtils.byte2HexStr(data));
break; break;
case R.id.btn_get_device: case R.id.btn_get_device:
// 获取设备信息 // 获取设备信息
sendBleBean = new SendBleBean(); sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.getDeviceInfo()); sendBleBean.setHex(mBleSendCmdUtil.getDeviceInfo());
sendData(sendBleBean); sendData(sendBleBean);
mList.add(TimeUtils.getTime() + "读取设备信息");
mHandler.sendEmptyMessage(REFRESH_DATA);
addShowData("读取设备信息");
break; break;
case R.id.btnSnRead: case R.id.btnSnRead:
// 获取设备信息 // 获取设备信息
sendData[0] = (byte) 0x95; sendData[0] = (byte) 0x95;
sendBleBean.setHex(sendData); sendBleBean.setHex(sendData);
sendData(sendBleBean); sendData(sendBleBean);
mList.add(TimeUtils.getTime() + "读取SN号");
mHandler.sendEmptyMessage(REFRESH_DATA);
addShowData("读取SN号");
break; break;
} }
} }
} }




private void sendDataNow(SendBleBean sendBleBean) {
if (mBleDevice != null) {
mBleDevice.sendDataNow(sendBleBean);
}
}

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




@Override @Override
public void onServiceSuccess() { public void onServiceSuccess() {
mList.add(TimeUtils.getTime() + "服务与界面建立连接成功");
mHandler.sendEmptyMessage(REFRESH_DATA);
addShowData("服务与界面建立连接成功");
CallbackDisIm.getInstance().addListListener(this); CallbackDisIm.getInstance().addListListener(this);
mBluetoothService.setOnCallback(this);
mBluetoothService.setOnCallbackBle(this);
mBluetoothService.deviceConnectListener(mAddress, true); mBluetoothService.deviceConnectListener(mAddress, true);
connectSuccess(); connectSuccess();
} }


@Override @Override
public void onServiceErr() { public void onServiceErr() {
mList.add(TimeUtils.getTime() + "服务与界面连接断开");
mHandler.sendEmptyMessage(REFRESH_DATA);
addShowData("服务与界面连接断开");
mHandler.postDelayed(new Runnable() { mHandler.postDelayed(new Runnable() {
@Override @Override
public void run() { public void run() {
public void unbindServices() { public void unbindServices() {
CallbackDisIm.getInstance().removeListener(this); CallbackDisIm.getInstance().removeListener(this);
mBluetoothService.disconnectAll(); mBluetoothService.disconnectAll();

if (mBluetoothService!=null) {
mBluetoothService.removeOnCallbackBle(this);
}
} }




if (mAddress.equals(mac)) { if (mAddress.equals(mac)) {
Toast.makeText(mContext, "连接断开:" + code, Toast.LENGTH_SHORT).show(); Toast.makeText(mContext, "连接断开:" + code, Toast.LENGTH_SHORT).show();
mBleDevice = null; mBleDevice = null;
addShowData("连接断开:" + code);
} }
} }


if (mPauseShowCmd) { if (mPauseShowCmd) {
return; return;
} }
mList.add(TimeUtils.getTime() + "透传数据:" + BleStrUtils.byte2HexStr(data));
mHandler.sendEmptyMessage(REFRESH_DATA);
addShowData("透传数据:" + BleStrUtils.byte2HexStr(data));
} }


@Override @Override
switch (hex[0]) { switch (hex[0]) {
case CmdConfig.SET_DEVICE_INFO: { case CmdConfig.SET_DEVICE_INFO: {
// 设置设备信息 // 设置设备信息
mList.add(TimeUtils.getTime() + "设置设备信息:结果:" + hex[1]);
mHandler.sendEmptyMessage(REFRESH_DATA);
addShowData("设置设备信息:结果:" + hex[1]);
} }
break; break;
case CmdConfig.GET_DEVICE_INFO: { case CmdConfig.GET_DEVICE_INFO: {
// 读取设备信息 // 读取设备信息
byte[] data = new byte[hex.length - 1]; byte[] data = new byte[hex.length - 1];
System.arraycopy(hex, 1, data, 0, data.length); System.arraycopy(hex, 1, data, 0, data.length);
mList.add(TimeUtils.getTime() + "读取设备信息:结果:" + BleStrUtils.byte2HexStr(data));
mHandler.sendEmptyMessage(REFRESH_DATA);
addShowData("读取设备信息:结果:" + BleStrUtils.byte2HexStr(data));
} }
break; break;
case (byte) 0x95: { case (byte) 0x95: {
// 读取设备信息 // 读取设备信息
byte[] dataSn = new byte[hex.length - 1]; byte[] dataSn = new byte[hex.length - 1];
System.arraycopy(hex, 1, dataSn, 0, dataSn.length); System.arraycopy(hex, 1, dataSn, 0, dataSn.length);
mList.add(TimeUtils.getTime() + "读取SN:结果:" + BleStrUtils.byte2HexStr(dataSn));
mHandler.sendEmptyMessage(REFRESH_DATA);
addShowData("读取SN:结果:" + BleStrUtils.byte2HexStr(dataSn));
} }
break; break;
} }
} }


@Override @Override
public void onNotifyData(byte[] hex, int type) {
public void onNotifyData(String uuid, byte[] hex, int type) {
if (mPauseShowCmd) { if (mPauseShowCmd) {
return; return;
} }
if (hex != null) if (hex != null)
data = BleStrUtils.byte2HexStr(hex); data = BleStrUtils.byte2HexStr(hex);
if (type == 100) { if (type == 100) {
mList.add(TimeUtils.getTime() + "cid=" + type + "\nsend->" + data);
addShowData("cid=" + type + "\nsend->" + data);
} else { } else {
mList.add(TimeUtils.getTime() + "cid=" + type + "\nnotify->" + data);
addShowData("cid=" + type + "\nnotify->" + data);
} }
mHandler.sendEmptyMessage(REFRESH_DATA);
} }


@Override @Override
public void onHandshake(boolean status) { public void onHandshake(boolean status) {
mList.add(TimeUtils.getTime() + "握手:" + status);
mHandler.sendEmptyMessage(REFRESH_DATA);
addShowData("握手:" + status);
} }


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


@Override @Override
public void onSupportUnit(List<SupportUnitBean> list) { public void onSupportUnit(List<SupportUnitBean> list) {
StringBuilder unitStr = new StringBuilder(); StringBuilder unitStr = new StringBuilder();
unitStr.append(TimeUtils.getTime());
unitStr.append(TimeUtils.getTimeSSS());


for (SupportUnitBean supportUnitBean : list) { for (SupportUnitBean supportUnitBean : list) {
unitStr.append("单位类型:").append(supportUnitBean.getType()); unitStr.append("单位类型:").append(supportUnitBean.getType());




mList.add(unitStr.toString()); mList.add(unitStr.toString());
mHandler.sendEmptyMessage(REFRESH_DATA);
} }




@Override @Override
public void onMcuBatteryStatus(int status, int battery) { public void onMcuBatteryStatus(int status, int battery) {
mList.add(TimeUtils.getTime() + "电量:" + battery + "%" + "||状态:" + status);
mHandler.sendEmptyMessage(REFRESH_DATA);
addShowData("电量:" + battery + "%" + "||状态:" + status);
BleLog.i("当前电量:" + battery);

} }


@Override @Override
public void onSysTime(int status, int[] times) { public void onSysTime(int status, int[] times) {
String timeStr = times[0] + "-" + times[1] + "-" + times[2] + " " + times[3] + ":" + times[4] + ":" + times[5]; String timeStr = times[0] + "-" + times[1] + "-" + times[2] + " " + times[3] + ":" + times[4] + ":" + times[5];
mList.add(TimeUtils.getTime() + "时间:" + timeStr + "||是否有效:" + status);
mHandler.sendEmptyMessage(REFRESH_DATA);
addShowData("时间:" + timeStr + "||是否有效:" + status);
} }


@Override @Override
public void onErr(int cmdType) { public void onErr(int cmdType) {
mList.add(TimeUtils.getTime() + "错误:" + cmdType);
mHandler.sendEmptyMessage(REFRESH_DATA);
addShowData("错误:" + cmdType);
} }


@Override @Override
if (CmdConfig.SET_TO_SLEEP == cmdType && cmdData == CmdConfig.SETTING_SUCCESS) { if (CmdConfig.SET_TO_SLEEP == cmdType && cmdData == CmdConfig.SETTING_SUCCESS) {
//进入睡眠 //进入睡眠
} }
mList.add(TimeUtils.getTime() + "设置指令:" + cmdType + "||结果:" + cmdData);
mHandler.sendEmptyMessage(REFRESH_DATA);
addShowData("设置指令:" + cmdType + "||结果:" + cmdData);
} }


@Override @Override
public void onBleName(String name) { public void onBleName(String name) {
mList.add(TimeUtils.getTime() + "名称:" + name);
mHandler.sendEmptyMessage(REFRESH_DATA);
addShowData("名称:" + name);
} }


@Override @Override
public void onBleMac(String mac) { public void onBleMac(String mac) {
mList.add(TimeUtils.getTime() + "Mac:" + mac);
mHandler.sendEmptyMessage(REFRESH_DATA);
addShowData("Mac:" + mac);
} }


@Override @Override
public void onNoConnectSleep(int sleepSwitch, int sleepTime, int sleepBroadcastSwitch, int sleepBroadcastTime) { public void onNoConnectSleep(int sleepSwitch, int sleepTime, int sleepBroadcastSwitch, int sleepBroadcastTime) {


mList.add(TimeUtils.getTime() + "sleepSwitch:" + sleepSwitch + " ||sleepTime:" + sleepTime + " ||sleepBroadcastSwitch:" + sleepBroadcastSwitch + " ||sleepBroadcastTime:" + sleepBroadcastTime);
mHandler.sendEmptyMessage(REFRESH_DATA);
addShowData("sleepSwitch:" + sleepSwitch + " ||sleepTime:" + sleepTime + " ||sleepBroadcastSwitch:" + sleepBroadcastSwitch + " ||sleepBroadcastTime:" + sleepBroadcastTime);


} }


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




@Override @Override
public void onBleBroadcastTime(int time) { public void onBleBroadcastTime(int time) {
mList.add(TimeUtils.getTime() + "广播间隔:" + time);
mHandler.sendEmptyMessage(REFRESH_DATA);
addShowData("广播间隔:" + time);
} }


@Override @Override
public void onConnectTime(int time, int status, int timeOut) { public void onConnectTime(int time, int status, int timeOut) {
mList.add(TimeUtils.getTime() + "连接:time:" + time + "||status:" + status + "||timeOut:" + timeOut);
mHandler.sendEmptyMessage(REFRESH_DATA);
addShowData("连接:time:" + time + "||status:" + status + "||timeOut:" + timeOut);
} }


@Override @Override
public void onBlePower(int power) { public void onBlePower(int power) {
mList.add(TimeUtils.getTime() + "功率:" + power);
mHandler.sendEmptyMessage(REFRESH_DATA);
addShowData("功率:" + power);
} }


@Override @Override
public void onPortRate(int rate) { public void onPortRate(int rate) {
mList.add(TimeUtils.getTime() + "串口波特率:" + rate);
mHandler.sendEmptyMessage(REFRESH_DATA);
addShowData("串口波特率:" + rate);
} }


@Override @Override
public void onBroadcastDataType(int type) { public void onBroadcastDataType(int type) {
mList.add(TimeUtils.getTime() + "广播大小端:" + type);
mHandler.sendEmptyMessage(REFRESH_DATA);
addShowData("广播大小端:" + type);
} }


@Override @Override
public void onModuleUUID(int length, String serverUUID, String featureUUID1, String featureUUID2) { public void onModuleUUID(int length, String serverUUID, String featureUUID1, String featureUUID2) {
mList.add(TimeUtils.getTime() + "UUID:length:" + length + "||serverUUID:" + serverUUID + "||featureUUID1:" + featureUUID1 + "||featureUUID2" + featureUUID2);
mHandler.sendEmptyMessage(REFRESH_DATA);
addShowData("UUID:length:" + length + "||serverUUID:" + serverUUID + "||featureUUID1:" + featureUUID1 + "||featureUUID2" + featureUUID2);
} }


@Override @Override
public void onBleMode(int mode) { public void onBleMode(int mode) {
mList.add(TimeUtils.getTime() + "模式:" + mode);
mHandler.sendEmptyMessage(REFRESH_DATA);
addShowData("模式:" + mode);
} }


@Override @Override
if (mBleDevice != null) { if (mBleDevice != null) {
name = mBleDevice.getName(); name = mBleDevice.getName();
} }
mList.add(TimeUtils.getTime() + "名称:" + name + " ,||信号:" + rssi);
mHandler.sendEmptyMessage(REFRESH_DATA);
addShowData("名称:" + name + " ,||信号:" + rssi);
} }


@Override @Override

+ 3
- 2
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BloodGlucoseActivity.java View File

import android.widget.ListView; import android.widget.ListView;
import android.widget.RadioButton; import android.widget.RadioButton;


import androidx.annotation.Nullable;

import com.pingwang.bluetoothlib.bean.SupportUnitBean; import com.pingwang.bluetoothlib.bean.SupportUnitBean;
import com.pingwang.bluetoothlib.device.BleDevice; import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.listener.OnCallbackBle; import com.pingwang.bluetoothlib.listener.OnCallbackBle;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;


import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.BloodGlucose.BloodGlucoseBleDeviceData; import cn.net.aicare.modulelibrary.module.BloodGlucose.BloodGlucoseBleDeviceData;
import cn.net.aicare.modulelibrary.module.BloodGlucose.BloodGlucoseUtil; import cn.net.aicare.modulelibrary.module.BloodGlucose.BloodGlucoseUtil;


mLogList.add(0, "绑定服务成功"); mLogList.add(0, "绑定服务成功");
listAdapter.notifyDataSetChanged(); listAdapter.notifyDataSetChanged();
if (mBluetoothService != null) { if (mBluetoothService != null) {
mBluetoothService.setOnCallback(this);
mBluetoothService.setOnCallbackBle(this);
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress); BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress);
if (bleDevice != null) { if (bleDevice != null) {
mBloodGlucoseBleDeviceData = new BloodGlucoseBleDeviceData(bleDevice); mBloodGlucoseBleDeviceData = new BloodGlucoseBleDeviceData(bleDevice);

+ 7
- 4
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BloodOxygenActivity.java View File

import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;


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

import com.pingwang.bluetoothlib.bean.BleValueBean; import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.device.BleDevice; import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.listener.OnCallbackBle; import com.pingwang.bluetoothlib.listener.OnCallbackBle;
import java.util.List; import java.util.List;


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


@Override @Override
public void onServiceSuccess() { public void onServiceSuccess() {
loglist.add(0, "连接设备成功"); loglist.add(0, "连接设备成功");
mBluetoothService.setOnCallback(this);
mBluetoothService.setOnCallbackBle(this);
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress); BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress);
BleBloodOxygenDeviceData.init(bleDevice, this); BleBloodOxygenDeviceData.init(bleDevice, this);
mBleBloodOxygenDeviceData = BleBloodOxygenDeviceData.getInstance(); mBleBloodOxygenDeviceData = BleBloodOxygenDeviceData.getInstance();


@Override @Override
public void unbindServices() { public void unbindServices() {

if (mBluetoothService!=null) {
mBluetoothService.removeOnCallbackBle(this);
}
} }


@Override @Override

+ 3
- 2
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BloodSugar4GActivity.java View File

import android.widget.EditText; import android.widget.EditText;
import android.widget.ListView; import android.widget.ListView;


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

import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import java.util.Locale; import java.util.Locale;


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


/** /**
* 4G血糖仪 * 4G血糖仪

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

import android.widget.ListView; import android.widget.ListView;
import android.widget.TextView; import android.widget.TextView;


import androidx.annotation.Nullable;

import com.pingwang.bluetoothlib.bean.BleValueBean; import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.config.BleConfig; import com.pingwang.bluetoothlib.config.BleConfig;
import com.pingwang.bluetoothlib.listener.OnCallbackDis; import com.pingwang.bluetoothlib.listener.OnCallbackDis;


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


break; break;
case R.id.open: case R.id.open:
if (mBluetoothService != null) { if (mBluetoothService != null) {
mBluetoothService.scanLeDevice(0, UUID.fromString("0000F0A0-0000-1000-8000-00805F9B34FB"));
mBluetoothService.startScan(0, UUID.fromString("0000F0A0-0000-1000-8000-00805F9B34FB"));
} }
break; break;
case R.id.stop: case R.id.stop:
mDevice = BroadcastBloodOxygenDeviceData.getInstance(); mDevice = BroadcastBloodOxygenDeviceData.getInstance();
mDevice.setOnNotifyData(this); mDevice.setOnNotifyData(this);
mBluetoothService.setOnScanFilterListener(this); mBluetoothService.setOnScanFilterListener(this);
mBluetoothService.scanLeDevice(0, BleConfig.UUID_SERVER_BROADCAST_AILINK);
mBluetoothService.startScan(0, BleConfig.UUID_SERVER_BROADCAST_AILINK);
} }
} }



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

import android.widget.RadioGroup; import android.widget.RadioGroup;
import android.widget.TextView; import android.widget.TextView;


import androidx.annotation.Nullable;

import com.pingwang.bluetoothlib.AILinkBleManager;
import com.pingwang.bluetoothlib.bean.BleValueBean; import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.config.BleConfig; import com.pingwang.bluetoothlib.config.BleConfig;
import com.pingwang.bluetoothlib.device.BleSendCmdUtil; import com.pingwang.bluetoothlib.device.BleSendCmdUtil;
import com.pingwang.bluetoothlib.listener.OnBleBroadcastDataListener;
import com.pingwang.bluetoothlib.listener.OnCallbackDis; import com.pingwang.bluetoothlib.listener.OnCallbackDis;
import com.pingwang.bluetoothlib.listener.OnScanFilterListener;
import com.pingwang.bluetoothlib.utils.BleDensityUtil; import com.pingwang.bluetoothlib.utils.BleDensityUtil;
import com.pingwang.bluetoothlib.utils.BleLog; import com.pingwang.bluetoothlib.utils.BleLog;
import com.pingwang.bluetoothlib.utils.BleStrUtils; import com.pingwang.bluetoothlib.utils.BleStrUtils;


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


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





/** /**
* xing<br> * xing<br>
* 2020/08/10<br> * 2020/08/10<br>
* 广播秤 * 广播秤
*/ */
public class BroadcastScaleActivity extends BleBaseActivity implements OnCallbackDis, BroadcastScaleDeviceData.onNotifyData, OnScanFilterListener, View.OnClickListener,
RadioGroup.OnCheckedChangeListener {
public class BroadcastScaleActivity extends BleNewBaseActivity implements OnCallbackDis, BroadcastScaleDeviceData.onNotifyData, OnBleBroadcastDataListener, View.OnClickListener, RadioGroup.OnCheckedChangeListener {


private static String TAG = BroadcastScaleActivity.class.getName(); private static String TAG = BroadcastScaleActivity.class.getName();
private final int REFRESH_DATA = 3; private final int REFRESH_DATA = 3;


private RadioButton mRadioButtonKg, mRadioButtonLb, mRadioButtonLbLb, mRadioButtonG, mRadioButtonOz, mRadioButtonStLb, mRadioButtonJin; private RadioButton mRadioButtonKg, mRadioButtonLb, mRadioButtonLbLb, mRadioButtonG, mRadioButtonOz, mRadioButtonStLb, mRadioButtonJin;
private TextView tv_broadcast_temp, tv_broadcast_mac,tv_broadcast_did;
private TextView tv_broadcast_temp, tv_broadcast_mac, tv_broadcast_did;


private List<String> mList; private List<String> mList;
private ArrayAdapter listAdapter; private ArrayAdapter listAdapter;
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.activity_broadcast_scale); setContentView(R.layout.activity_broadcast_scale);
mContext = this; mContext = this;
// mAddress = getIntent().getStringExtra("mac");
// mAddress = getIntent().getStringExtra("mac");
mBleSendCmdUtil = BleSendCmdUtil.getInstance(); mBleSendCmdUtil = BleSendCmdUtil.getInstance();
init(); init();

} }


private void init() { private void init() {
mHandler.sendEmptyMessage(REFRESH_DATA); mHandler.sendEmptyMessage(REFRESH_DATA);
break; break;
case R.id.open: case R.id.open:
if (mBluetoothService != null) {
mBluetoothService.scanLeDevice(0, UUID.fromString("0000F0A0-0000-1000-8000-00805F9B34FB"));
}
AILinkBleManager.getInstance().startScan(0, BleConfig.UUID_SERVER_BROADCAST_AILINK);
break; break;
case R.id.stop: case R.id.stop:
if (mBluetoothService != null) {
mBluetoothService.stopScan();
}
AILinkBleManager.getInstance().stopScan();
break; break;
} }
} }
public void onServiceSuccess() { public void onServiceSuccess() {
BleLog.i(TAG, "服务与界面建立连接成功"); BleLog.i(TAG, "服务与界面建立连接成功");
//与服务建立连接 //与服务建立连接
if (mBluetoothService != null) {
mDevice = BroadcastScaleDeviceData.getInstance();
mDevice.setOnNotifyData(this);
mBluetoothService.setOnScanFilterListener(this);
mBluetoothService.scanLeDevice(0, BleConfig.UUID_SERVER_BROADCAST_AILINK);
}
mDevice = BroadcastScaleDeviceData.getInstance();
mDevice.setOnNotifyData(this);
AILinkBleManager.getInstance().setOnBleBroadcastDataListener(this);
AILinkBleManager.getInstance().startScan(0, BleConfig.UUID_SERVER_BROADCAST_AILINK);
} }


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


@Override @Override


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


private String mOldData="";
private String mOldData = "";

@Override @Override
public void onData(byte[] dataOriginal,byte[] hex, int type) {
public void onData(byte[] dataOriginal, byte[] hex, int type) {
String data = ""; String data = "";
if (hex != null) if (hex != null)
data = BleStrUtils.byte2HexStr(hex); data = BleStrUtils.byte2HexStr(hex);
if (mOldData.equals(data)){
if (mOldData.equals(data)) {
return; return;
} }
mOldData=data;
mList.add(TimeUtils.getTime() + "数据ID" + type+" ,||解密数据:"+data+" ,||原始数据:"+BleStrUtils.byte2HexStr(dataOriginal));
mOldData = data;
mList.add(TimeUtils.getTime() + "数据ID" + type + " ,||解密数据:" + data + " ,||原始数据:" + BleStrUtils.byte2HexStr(dataOriginal));
mHandler.sendEmptyMessage(REFRESH_DATA); mHandler.sendEmptyMessage(REFRESH_DATA);
} }


statusStr += "测阻抗中"; statusStr += "测阻抗中";
break; break;
case BroadcastScaleBleConfig.GET_IMPEDANCE_SUCCESS: case BroadcastScaleBleConfig.GET_IMPEDANCE_SUCCESS:
statusStr+= "测阻抗成功";
statusStr += "测阻抗成功";
break; break;
case BroadcastScaleBleConfig.GET_IMPEDANCE_FAIL: case BroadcastScaleBleConfig.GET_IMPEDANCE_FAIL:
statusStr += "测阻抗失败"; statusStr += "测阻抗失败";
statusStr += "测量完成"; statusStr += "测量完成";
break; break;
default: default:
statusStr+=Integer.toHexString(status);
statusStr += Integer.toHexString(status);
break; break;


} }
@Override @Override
public void OnDID(int cid, int vid, int pid) { public void OnDID(int cid, int vid, int pid) {
String didStr = "cid:" + cid + "||vid:" + vid + "||pid:" + pid; String didStr = "cid:" + cid + "||vid:" + vid + "||pid:" + pid;
if (tv_broadcast_did!=null){
if (tv_broadcast_did != null) {
tv_broadcast_did.setText(didStr); tv_broadcast_did.setText(didStr);
} }
} }




@Override @Override
public boolean onFilter(BleValueBean bleValueBean) {
return true;
}

@Override
public void onScanRecord(BleValueBean bleValueBean) {
public void onBleBroadcastData(BleValueBean bleValueBean, byte[] payload) {
if (TextUtils.isEmpty(mAddress) && bleValueBean.isBroadcastModule()) { if (TextUtils.isEmpty(mAddress) && bleValueBean.isBroadcastModule()) {
mAddress = bleValueBean.getMac(); mAddress = bleValueBean.getMac();
if (tv_broadcast_mac != null) { if (tv_broadcast_mac != null) {
int cid = bleValueBean.getCid(); int cid = bleValueBean.getCid();
int vid = bleValueBean.getVid(); int vid = bleValueBean.getVid();
int pid = bleValueBean.getPid(); int pid = bleValueBean.getPid();
if (mDevice != null)
mDevice.onNotifyData(manufacturerData, cid, vid, pid);
if (mDevice != null) {
mDevice.onNotifyData( manufacturerData, cid, vid, pid);
}
} }
} }


} }

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

import android.widget.EditText; import android.widget.EditText;
import android.widget.ListView; import android.widget.ListView;


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

import com.pingwang.bluetoothlib.device.BleDevice; import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.device.BleSendCmdUtil; import com.pingwang.bluetoothlib.device.BleSendCmdUtil;
import com.pingwang.bluetoothlib.device.SendBleBean; import com.pingwang.bluetoothlib.device.SendBleBean;


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








@Override @Override
public void onNotifyData(byte[] hex, int type) {
public void onNotifyData(String uuid, byte[] hex, int type) {
mList.add(TimeUtils.getTime() + "notify->" + BleStrUtils.byte2HexStr(hex)); mList.add(TimeUtils.getTime() + "notify->" + BleStrUtils.byte2HexStr(hex));
mHandler.sendEmptyMessage(REFRESH_DATA); mHandler.sendEmptyMessage(REFRESH_DATA);
} }

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

import android.widget.ListView; import android.widget.ListView;
import android.widget.Toast; import android.widget.Toast;


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

import com.pingwang.bluetoothlib.bean.BleValueBean; import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.listener.CallbackDisIm; import com.pingwang.bluetoothlib.listener.CallbackDisIm;
import com.pingwang.bluetoothlib.listener.OnCallbackBle; import com.pingwang.bluetoothlib.listener.OnCallbackBle;


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




/** /**

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

package aicare.net.cn.sdk.ailinksdkdemoandroid;

import com.holtek.libHTBodyfat.HTBodyBasicInfo;
import com.holtek.libHTBodyfat.HTBodyResultAllBody;

import java.util.Locale;


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


}
}

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

package aicare.net.cn.sdk.ailinksdkdemoandroid;

public class EightBodyFatBean {
private String weight; //体重,
private float bmi; //体质指数,
private float bfr; //体脂率,
private float sfr; //皮下脂肪率,
private float uvi; //内脏脂肪率,
private float rom; //肌肉率,
private float bmr; //基础代谢率,
private String bm; //骨骼质量,
private float vwc; //水含量,
private int bodyAge; //身体年龄,
private float pp; //蛋白率,
private double adcFoot; //双脚阻抗,
private double adcHand;//双手阻抗
private double adcLeftHand; //左手阻抗
private double adcRightHand; //右手阻抗
private double adcLeftFoot; //左脚阻抗
private double adcRightFoot; //右脚阻抗
private double adcLeftBody;
private double adcRightBody;
private double adcRightHandLeftFoot;
private double adcLeftHandRightFoot;
private double adcBody;
private int arithmetic;
private int heartRate;
private String fatMassRightTop; //体脂-右上
private String fatMassRightBottom; //体脂-右下
private String fatMassLeftTop; //体脂-左上
private String fatMassLeftBottom; //体脂-左下
private String fatMassBody; //体脂-躯干
private String muscleMassRightTop; //肌肉-右上
private String muscleMassRightBottom; //肌肉-右下
private String muscleMassLeftTop; //肌肉-左上
private String muscleMassLeftBottom; //肌肉-左下
private String muscleMassBody; //肌肉-躯干


private String testAdc;






public String getTestAdc() {
return testAdc;
}

public void setTestAdc(String testAdc) {
this.testAdc = testAdc;
}



public String getWeight() {
return weight;
}

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

public float getBmi() {
return bmi;
}

public void setBmi(float bmi) {
this.bmi = bmi;
}

public float getBfr() {
return bfr;
}

public void setBfr(float bfr) {
this.bfr = bfr;
}

public float getSfr() {
return sfr;
}

public void setSfr(float sfr) {
this.sfr = sfr;
}

public float getUvi() {
return uvi;
}

public void setUvi(float uvi) {
this.uvi = uvi;
}

public float getRom() {
return rom;
}

public void setRom(float rom) {
this.rom = rom;
}

public float getBmr() {
return bmr;
}

public void setBmr(float bmr) {
this.bmr = bmr;
}

public String getBm() {
return bm;
}

public void setBm(String bm) {
this.bm = bm;
}

public float getVwc() {
return vwc;
}

public void setVwc(float vwc) {
this.vwc = vwc;
}

public int getBodyAge() {
return bodyAge;
}

public void setBodyAge(int bodyAge) {
this.bodyAge = bodyAge;
}

public float getPp() {
return pp;
}

public void setPp(float pp) {
this.pp = pp;
}

public double getAdcFoot() {
return adcFoot;
}

public void setAdcFoot(double adcFoot) {
this.adcFoot = adcFoot;
}

public double getAdcHand() {
return adcHand;
}

public void setAdcHand(double adcHand) {
this.adcHand = adcHand;
}

public double getAdcLeftHand() {
return adcLeftHand;
}

public void setAdcLeftHand(double adcLeftHand) {
this.adcLeftHand = adcLeftHand;
}

public double getAdcRightHand() {
return adcRightHand;
}

public void setAdcRightHand(double adcRightHand) {
this.adcRightHand = adcRightHand;
}

public double getAdcLeftFoot() {
return adcLeftFoot;
}

public void setAdcLeftFoot(double adcLeftFoot) {
this.adcLeftFoot = adcLeftFoot;
}

public double getAdcRightFoot() {
return adcRightFoot;
}

public void setAdcRightFoot(double adcRightFoot) {
this.adcRightFoot = adcRightFoot;
}

public double getAdcLeftBody() {
return adcLeftBody;
}

public void setAdcLeftBody(double adcLeftBody) {
this.adcLeftBody = adcLeftBody;
}

public double getAdcRightBody() {
return adcRightBody;
}

public void setAdcRightBody(double adcRightBody) {
this.adcRightBody = adcRightBody;
}

public double getAdcRightHandLeftFoot() {
return adcRightHandLeftFoot;
}

public void setAdcRightHandLeftFoot(double adcRightHandLeftFoot) {
this.adcRightHandLeftFoot = adcRightHandLeftFoot;
}

public double getAdcLeftHandRightFoot() {
return adcLeftHandRightFoot;
}

public void setAdcLeftHandRightFoot(double adcLeftHandRightFoot) {
this.adcLeftHandRightFoot = adcLeftHandRightFoot;
}

public double getAdcBody() {
return adcBody;
}

public void setAdcBody(double adcBody) {
this.adcBody = adcBody;
}

public String getFatMassRightTop() {
return fatMassRightTop;
}

public void setFatMassRightTop(String fatMassRightTop) {
this.fatMassRightTop = fatMassRightTop;
}

public String getFatMassRightBottom() {
return fatMassRightBottom;
}

public void setFatMassRightBottom(String fatMassRightBottom) {
this.fatMassRightBottom = fatMassRightBottom;
}

public String getFatMassLeftTop() {
return fatMassLeftTop;
}

public void setFatMassLeftTop(String fatMassLeftTop) {
this.fatMassLeftTop = fatMassLeftTop;
}

public String getFatMassLeftBottom() {
return fatMassLeftBottom;
}

public void setFatMassLeftBottom(String fatMassLeftBottom) {
this.fatMassLeftBottom = fatMassLeftBottom;
}

public String getFatMassBody() {
return fatMassBody;
}

public void setFatMassBody(String fatMassBody) {
this.fatMassBody = fatMassBody;
}

public String getMuscleMassRightTop() {
return muscleMassRightTop;
}

public void setMuscleMassRightTop(String muscleMassRightTop) {
this.muscleMassRightTop = muscleMassRightTop;
}

public String getMuscleMassRightBottom() {
return muscleMassRightBottom;
}

public void setMuscleMassRightBottom(String muscleMassRightBottom) {
this.muscleMassRightBottom = muscleMassRightBottom;
}

public String getMuscleMassLeftTop() {
return muscleMassLeftTop;
}

public void setMuscleMassLeftTop(String muscleMassLeftTop) {
this.muscleMassLeftTop = muscleMassLeftTop;
}

public String getMuscleMassLeftBottom() {
return muscleMassLeftBottom;
}

public void setMuscleMassLeftBottom(String muscleMassLeftBottom) {
this.muscleMassLeftBottom = muscleMassLeftBottom;
}

public String getMuscleMassBody() {
return muscleMassBody;
}

public void setMuscleMassBody(String muscleMassBody) {
this.muscleMassBody = muscleMassBody;
}

public int getArithmetic() {
return arithmetic;
}

public void setArithmetic(int arithmetic) {
this.arithmetic = arithmetic;
}

public void setHeartRate(int heartRate) {
this.heartRate = heartRate;
}

public int getHeartRate() {
return heartRate;
}

@Override
public String toString() {
return "EightBodyFatBean{" + "weight='" + weight + '\'' + ", bmi=" + bmi + ", bfr=" + bfr + ", sfr=" + sfr + ", uvi=" + uvi + ", rom=" + rom + ", bmr=" + bmr + ", bm='" + bm + '\'' + ", " +
"vwc=" + vwc + ", bodyAge=" + bodyAge + ", pp=" + pp + ", adcFoot=" + adcFoot + ", adcHand=" + adcHand + ", adcLeftHand=" + adcLeftHand + ", adcRightHand=" + adcRightHand + ", " +
"adcLeftFoot=" + adcLeftFoot + ", adcRightFoot=" + adcRightFoot + ", adcLeftBody=" + adcLeftBody + ", adcRightBody=" + adcRightBody + ", adcRightHandLeftFoot=" + adcRightHandLeftFoot + ", adcLeftHandRightFoot=" + adcLeftHandRightFoot + ", adcBody=" + adcBody + ", arithmetic=" + arithmetic + ", heartRate=" + heartRate + ", fatMassRightTop='" + fatMassRightTop + '\'' + ", fatMassRightBottom='" + fatMassRightBottom + '\'' + ", fatMassLeftTop='" + fatMassLeftTop + '\'' + ", fatMassLeftBottom='" + fatMassLeftBottom + '\'' + ", fatMassBody='" + fatMassBody + '\'' + ", muscleMassRightTop='" + muscleMassRightTop + '\'' + ", muscleMassRightBottom='" + muscleMassRightBottom + '\'' + ", muscleMassLeftTop='" + muscleMassLeftTop + '\'' + ", muscleMassLeftBottom='" + muscleMassLeftBottom + '\'' + ", muscleMassBody='" + muscleMassBody + '\'' + ", testAdc='" + testAdc + '\'' + '}';
}
}

+ 8
- 3
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/EightBodyfatActivity.java View File

import android.widget.ListView; import android.widget.ListView;
import android.widget.RadioButton; import android.widget.RadioButton;


import androidx.annotation.Nullable;

import com.pingwang.bluetoothlib.bean.SupportUnitBean; import com.pingwang.bluetoothlib.bean.SupportUnitBean;
import com.pingwang.bluetoothlib.device.BleDevice; import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.listener.OnCallbackBle; import com.pingwang.bluetoothlib.listener.OnCallbackBle;
import java.util.List; import java.util.List;


import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import androidx.annotation.Nullable;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.EightBodyFatAlgorithms;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.EightBodyFatBean;
import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatBleDeviceData; import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatBleDeviceData;
import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatUtil; import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatUtil;


public void onServiceSuccess() { public void onServiceSuccess() {
loglist.add(0, "绑定服务成功"); loglist.add(0, "绑定服务成功");
if (mBluetoothService != null) { if (mBluetoothService != null) {
mBluetoothService.setOnCallback(this);
mBluetoothService.setOnCallbackBle(this);
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress); BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress);
if (bleDevice != null) { if (bleDevice != null) {
mEightBodyFatBleDeviceData = new EightBodyFatBleDeviceData(bleDevice); mEightBodyFatBleDeviceData = new EightBodyFatBleDeviceData(bleDevice);


@Override @Override
public void unbindServices() { public void unbindServices() {

if (mBluetoothService!=null) {
mBluetoothService.removeOnCallbackBle(this);
}
} }


@Override @Override

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

import android.widget.EditText; import android.widget.EditText;
import android.widget.ListView; import android.widget.ListView;


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

import com.pingwang.bluetoothlib.device.BleDevice; import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.device.BleSendCmdUtil; import com.pingwang.bluetoothlib.device.BleSendCmdUtil;
import com.pingwang.bluetoothlib.device.SendBleBean; import com.pingwang.bluetoothlib.device.SendBleBean;
import com.pingwang.bluetoothlib.utils.BleDensityUtil; import com.pingwang.bluetoothlib.utils.BleDensityUtil;
import com.pingwang.bluetoothlib.utils.BleLog; import com.pingwang.bluetoothlib.utils.BleLog;
import com.pingwang.bluetoothlib.utils.BleStrUtils; import com.pingwang.bluetoothlib.utils.BleStrUtils;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;


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


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





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

import android.widget.ListView; import android.widget.ListView;
import android.widget.TextView; import android.widget.TextView;


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

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


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


import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import cn.net.aicare.algorithmutil.AlgorithmUtil;
import cn.net.aicare.algorithmutil.BodyFatData;
import cn.net.aicare.modulelibrary.module.HeightWeightScale.HeightBodyFatBleData; import cn.net.aicare.modulelibrary.module.HeightWeightScale.HeightBodyFatBleData;
import cn.net.aicare.modulelibrary.module.HeightWeightScale.HeightBodyFatBleUntils; import cn.net.aicare.modulelibrary.module.HeightWeightScale.HeightBodyFatBleUntils;
import cn.net.aicare.modulelibrary.module.HeightWeightScale.HeightBodyFatUser;
import cn.net.aicare.modulelibrary.module.utils.AicareBleConfig;


/** /**
* 身高体脂秤 * 身高体脂秤
private int currentVoice = 1; private int currentVoice = 1;
private int selectVoice = 1; private int selectVoice = 1;


private HeightBodyFatUser mHeightBodyFatUser;

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


@Override @Override
public void unbindServices() { public void unbindServices() {

if (mBluetoothService!=null) {
mBluetoothService.removeOnCallbackBle(this);
}
} }




logList.add(0, "设置声音结果:" + resultStr); logList.add(0, "设置声音结果:" + resultStr);
break; break;


default:break;

} }
listAdapter.notifyDataSetChanged(); listAdapter.notifyDataSetChanged();


mMHandler.removeMessages(FINISH); mMHandler.removeMessages(FINISH);
mMHandler.sendEmptyMessageDelayed(FINISH, 40000); mMHandler.sendEmptyMessageDelayed(FINISH, 40000);
} }
if (mHeightBodyFatUser!=null) {


mHeightBodyFatUser.setWeight(weight);
mHeightBodyFatUser.setDecimals(decimals);
mHeightBodyFatUser.setUnit(unit);
}


} }


mMHandler.removeMessages(ADC); mMHandler.removeMessages(ADC);
logList.add(0, "阻抗数据 模式:" + workMode + " 测量状态: " + status + "\n 阻抗类型: " + adcType logList.add(0, "阻抗数据 模式:" + workMode + " 测量状态: " + status + "\n 阻抗类型: " + adcType
+ " 阻抗: " + adc + " 算法位: " + arithmetic); + " 阻抗: " + adc + " 算法位: " + arithmetic);

// arithmetic
if (mHeightBodyFatUser != null && arithmetic != 0) {
int sex = mHeightBodyFatUser.getSex();
if (sex == 0) {
sex = 2;
}
String weightToKg = AllUnitUtils.getWeightToKg(mHeightBodyFatUser.getUnit(), String.valueOf(mHeightBodyFatUser.getWeight()), mHeightBodyFatUser.getDecimals());
BodyFatData bodyFatData = AicareBleConfig.getBodyFatData(AlgorithmUtil.AlgorithmType.TYPE_AICARE, sex, mHeightBodyFatUser.getAge(), Double.parseDouble(weightToKg),
mHeightBodyFatUser.getHeight(), mHeightBodyFatUser.getAdc());
logList.add( "体脂数据:" + "\n 体脂率: " + bodyFatData.getBfr() + " 皮下脂肪: " + bodyFatData.getSfr() +
"\n 内脏脂肪: " + bodyFatData.getUvi() + " 肌肉率: " + bodyFatData.getRom() +
"\n 基础代谢率: " + bodyFatData.getBmr() + " 身体年龄:" + bodyFatData.getBodyAge()+
"\n 水分: " + bodyFatData.getVwc() + " 蛋白率:" + bodyFatData.getPp()+
"\n BMI: " + bodyFatData.getBmi() + " 骨量:" + bodyFatData.getBm()
);


}
listAdapter.notifyDataSetChanged(); listAdapter.notifyDataSetChanged();




case R.id.girl: case R.id.girl:
logList.add(0, "下用户 女 18岁 165cm :" + selectWUnit); logList.add(0, "下用户 女 18岁 165cm :" + selectWUnit);
listAdapter.notifyDataSetChanged(); listAdapter.notifyDataSetChanged();
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUser(0, 18, 165));
mHeightBodyFatUser=new HeightBodyFatUser(0,18,165,0,0);
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUser(mHeightBodyFatUser.getSex(), mHeightBodyFatUser.getAge(), mHeightBodyFatUser.getHeight()));
mMHandler.removeMessages(SETUSER); mMHandler.removeMessages(SETUSER);
mMHandler.sendEmptyMessageDelayed(SETUSER, 3000); mMHandler.sendEmptyMessageDelayed(SETUSER, 3000);
break; break;
case R.id.man: case R.id.man:
logList.add(0, "下用户 男 28岁 170cm :" + selectWUnit); logList.add(0, "下用户 男 28岁 170cm :" + selectWUnit);
listAdapter.notifyDataSetChanged(); listAdapter.notifyDataSetChanged();
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUser(1, 28, 170));
mHeightBodyFatUser=new HeightBodyFatUser(1,28,170,0,0);
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUser(mHeightBodyFatUser.getSex(), mHeightBodyFatUser.getAge(), mHeightBodyFatUser.getHeight()));
mMHandler.removeMessages(SETUSER); mMHandler.removeMessages(SETUSER);
mMHandler.sendEmptyMessageDelayed(SETUSER, 3000); mMHandler.sendEmptyMessageDelayed(SETUSER, 3000);



+ 179
- 168
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/MainActivity.java View File

import android.view.View; import android.view.View;
import android.widget.TextView; import android.widget.TextView;


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

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


import java.util.ArrayList; import java.util.ArrayList;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.broadcast_nutrition.BroadNutritionActivity; 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.broadcast_weight_sacle.BroadcastWeightScaleActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.leaone_broadcast.LeaOneBroadcastActivity; import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.leaone_broadcast.LeaOneBroadcastActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ropeskipping.RopeSkippingSetActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.AppStart; import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.AppStart;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L; import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.SP; import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.SP;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;




public class MainActivity extends AppCompatActivity { public class MainActivity extends AppCompatActivity {
int bodyComposition = new BhBodyComposition().getBodyComposition(); int bodyComposition = new BhBodyComposition().getBodyComposition();
L.i("bodyComposition:" + bodyComposition); L.i("bodyComposition:" + bodyComposition);


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






MyListener listener = new MyListener(); MyListener listener = new MyListener();


// Button btn_shpy = findViewById(R.id.btn_sphy);
// Button btn_tempgun = findViewById(R.id.btn_tempgun);
// Button btn_temp = findViewById(R.id.btn_temp);
// Button btn_baby = findViewById(R.id.btn_baby);
// Button btn_height = findViewById(R.id.btn_height);
// Button btn_ble = findViewById(R.id.btn_ble);
// Button btn_weightScale = findViewById(R.id.btn_lock);
// Button btn_ble_test = findViewById(R.id.btn_ble_test);
// Button btnConnectTest = findViewById(R.id.btnConnectTest);
// Button btn_ad_weight = findViewById(R.id.btn_ad_weight);
// Button btn_ble_weight = findViewById(R.id.btn_ble_weight);
// Button btn_wifi_ble_tooth = findViewById(R.id.btn_wifi_ble_tooth);
// Button wifi_config = findViewById(R.id.wifi_config);
// Button eight_scale = findViewById(R.id.eight_scale);
// Button btn_ota = findViewById(R.id.btn_ota);
// Button btn_wristband = findViewById(R.id.btn_wristband);
// Button glucometer = findViewById(R.id.glucometer);
// Button btn_broadcast_scale = findViewById(R.id.btn_broadcast_scale);
// Button btn_broadcast_blood_oxygen = findViewById(R.id.btn_broadcast_blood_oxygen);
// Button btn_smart_mask = findViewById(R.id.btn_smart_mask);
// Button btn_bld = findViewById(R.id.btn_bld);
// Button btn_bleBo = findViewById(R.id.btn_bleBo);
// Button btn_coffeeScale = findViewById(R.id.btn_coffeeScale);
// Button btn_scooter = findViewById(R.id.btn_scooter);
// Button btn_shareCharger = findViewById(R.id.btn_shareCharger);
// Button btn_transmission = findViewById(R.id.btn_transmission);
// Button btn_wifi_ble_weight = findViewById(R.id.btn_wifi_ble_weight);
// Button btn_baby_body_fat = findViewById(R.id.btn_baby_body_fat);
// Button btn_shpy = findViewById(R.id.btn_sphy);
// Button btn_tempgun = findViewById(R.id.btn_tempgun);
// Button btn_temp = findViewById(R.id.btn_temp);
// Button btn_baby = findViewById(R.id.btn_baby);
// Button btn_height = findViewById(R.id.btn_height);
// Button btn_ble = findViewById(R.id.btn_ble);
// Button btn_weightScale = findViewById(R.id.btn_lock);
// Button btn_ble_test = findViewById(R.id.btn_ble_test);
// Button btnConnectTest = findViewById(R.id.btnConnectTest);
// Button btn_ad_weight = findViewById(R.id.btn_ad_weight);
// Button btn_ble_weight = findViewById(R.id.btn_ble_weight);
// Button btn_wifi_ble_tooth = findViewById(R.id.btn_wifi_ble_tooth);
// Button wifi_config = findViewById(R.id.wifi_config);
// Button eight_scale = findViewById(R.id.eight_scale);
// Button btn_ota = findViewById(R.id.btn_ota);
// Button btn_wristband = findViewById(R.id.btn_wristband);
// Button glucometer = findViewById(R.id.glucometer);
// Button btn_broadcast_scale = findViewById(R.id.btn_broadcast_scale);
// Button btn_broadcast_blood_oxygen = findViewById(R.id.btn_broadcast_blood_oxygen);
// Button btn_smart_mask = findViewById(R.id.btn_smart_mask);
// Button btn_bld = findViewById(R.id.btn_bld);
// Button btn_bleBo = findViewById(R.id.btn_bleBo);
// Button btn_coffeeScale = findViewById(R.id.btn_coffeeScale);
// Button btn_scooter = findViewById(R.id.btn_scooter);
// Button btn_shareCharger = findViewById(R.id.btn_shareCharger);
// Button btn_transmission = findViewById(R.id.btn_transmission);
// Button btn_wifi_ble_weight = findViewById(R.id.btn_wifi_ble_weight);
// Button btn_baby_body_fat = findViewById(R.id.btn_baby_body_fat);
mList.add(findViewById(R.id.btn_sphy)); mList.add(findViewById(R.id.btn_sphy));
mList.add(findViewById(R.id.btn_tempgun)); mList.add(findViewById(R.id.btn_tempgun));
mList.add(findViewById(R.id.btn_temp)); mList.add(findViewById(R.id.btn_temp));
mList.add(findViewById(R.id.btn_baby)); mList.add(findViewById(R.id.btn_baby));
mList.add(findViewById(R.id.btn_height)); mList.add(findViewById(R.id.btn_height));
mList.add(findViewById(R.id.btn_ble)); mList.add(findViewById(R.id.btn_ble));
// mList.add(findViewById(R.id.btn_lock));
// mList.add(findViewById(R.id.btn_lock));
mList.add(findViewById(R.id.btn_ble_test)); mList.add(findViewById(R.id.btn_ble_test));
mList.add(findViewById(R.id.btnConnectTest)); mList.add(findViewById(R.id.btnConnectTest));
mList.add(findViewById(R.id.btn_ad_weight)); mList.add(findViewById(R.id.btn_ad_weight));
mList.add(findViewById(R.id.btn_body_scale_4g)); mList.add(findViewById(R.id.btn_body_scale_4g));
mList.add(findViewById(R.id.btn_scooter_cm02)); mList.add(findViewById(R.id.btn_scooter_cm02));
mList.add(findViewById(R.id.btn_temp_instrument)); mList.add(findViewById(R.id.btn_temp_instrument));
mList.add(findViewById(R.id.btn_leap_watch));
mList.add(findViewById(R.id.btn_public_ble_network)); mList.add(findViewById(R.id.btn_public_ble_network));
mList.add(findViewById(R.id.btn_rope_skipping_set_mode)); mList.add(findViewById(R.id.btn_rope_skipping_set_mode));
mList.add(findViewById(R.id.btn_air_detector)); mList.add(findViewById(R.id.btn_air_detector));
mList.add(findViewById(R.id.btn_meat_probe_charger)); mList.add(findViewById(R.id.btn_meat_probe_charger));
mList.add(findViewById(R.id.btn_weight_scale)); mList.add(findViewById(R.id.btn_weight_scale));
mList.add(findViewById(R.id.btn_broadcast_scale_weight)); mList.add(findViewById(R.id.btn_broadcast_scale_weight));
mList.add(findViewById(R.id.btn_meat_probe));
for (View view : mList) { for (View view : mList) {
view.setOnClickListener(listener); view.setOnClickListener(listener);
} }
startActivity(new Intent(mContext, RopeSkippingSetActivity.class)); startActivity(new Intent(mContext, RopeSkippingSetActivity.class));




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


} }
}); });


// AILinkBleManager.getInstance().init(mContext, new AILinkBleManager.onInitListener() {
// @Override
// public void onInitSuccess() {
// L.i("初始化成功");
// AILinkBleManager.getInstance().startScan(1000);
// AILinkBleManager.getInstance().setOnCallbackBle(new OnCallbackBle() {
// @Override
// public void onScanning(BleValueBean data) {
// L.i("当前搜索到的设备:"+data.getName()+" mac="+data.getMac());
// AILinkBleManager.getInstance().stopScan();
// AILinkBleManager.getInstance().connectDevice(data);
// }
//
// @Override
// public void onServicesDiscovered(String mac) {
// L.i("连接成功:"+mac);
// }
// });
//
// }
//
// @Override
// public void onInitFailure() {
// L.i("初始化失败");
// }
// });
// AILinkBleManager.getInstance().init(mContext, new AILinkBleManager.onInitListener() {
// @Override
// public void onInitSuccess() {
// L.i("初始化成功");
// AILinkBleManager.getInstance().startScan(1000);
// AILinkBleManager.getInstance().setOnCallbackBle(new OnCallbackBle() {
// @Override
// public void onScanning(BleValueBean data) {
// L.i("当前搜索到的设备:"+data.getName()+" mac="+data.getMac());
// AILinkBleManager.getInstance().stopScan();
// AILinkBleManager.getInstance().connectDevice(data);
// }
//
// @Override
// public void onServicesDiscovered(String mac) {
// L.i("连接成功:"+mac);
// }
// });
//
// }
//
// @Override
// public void onInitFailure() {
// L.i("初始化失败");
// }
// });


} }


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

List<AilinkLicenseBean> list = new ArrayList<>();
list.add(new AilinkLicenseBean(0x2F, 0x03, 0x09));
AILinkSDK.getInstance().initLicense(list);
} }


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

@Override
public void onInitFailure() {
}
});
SP.init(this); SP.init(this);
} }


private class MyListener implements View.OnClickListener { private class MyListener implements View.OnClickListener {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
// boolean onClick= initPermissions();
// if (!onClick){
// return;
// }
// boolean onClick= initPermissions();
// if (!onClick){
// return;
// }
int type = 0; int type = 0;
switch (v.getId()) { switch (v.getId()) {


case R.id.btn_height: case R.id.btn_height:
type = BleDeviceConfig.HEIGHT_METER; type = BleDeviceConfig.HEIGHT_METER;
break; break;
case R.id.btn_lock:
type = BleDeviceConfig.SMART_LOCK;
break;
case R.id.btn_ad_weight: case R.id.btn_ad_weight:
type = BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_AD; type = BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_AD;
break; break;
case R.id.btn_bleBo: case R.id.btn_bleBo:
type = BleDeviceConfig.BLE_BOOLD_OXYGEN; type = BleDeviceConfig.BLE_BOOLD_OXYGEN;
break; break;
// case R.id.btn_bld:
// type = BleDeviceConfig.BLD_WEIGHT;
// break;
// case R.id.btn_bld:
// type = BleDeviceConfig.BLD_WEIGHT;
// break;
case R.id.btn_ble: case R.id.btn_ble:
type = -1; type = -1;
break; break;
Intent bodyScaleIntent = new Intent(MainActivity.this, BodyScale4GActivity.class); Intent bodyScaleIntent = new Intent(MainActivity.this, BodyScale4GActivity.class);
startActivity(bodyScaleIntent); startActivity(bodyScaleIntent);
return; return;
case R.id.btn_leap_watch:
// 芯一代手表
type = BleDeviceConfig.LEAP_WATCH;
break;

case R.id.btn_public_ble_network: case R.id.btn_public_ble_network:
// BLE通用配网 // BLE通用配网
type = BleDeviceConfig.PUBLIC_BLE_NETWORK; type = BleDeviceConfig.PUBLIC_BLE_NETWORK;
//体重秤 //体重秤
type = BleDeviceConfig.WEIGHT_SCALE; type = BleDeviceConfig.WEIGHT_SCALE;
break; break;
case R.id.btn_meat_probe:
// 食物探针
type = BleDeviceConfig.MEAT_PROBE;
break;
case R.id.btn_mqtt: case R.id.btn_mqtt:


return; return;
} }




//-----------------------权限----------------------------------------
//-----------------------权限----------------------------------------
/** /**
* 需要申请的权限 * 需要申请的权限
*/ */
private String[] LOCATION_PERMISSION = new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.WRITE_EXTERNAL_STORAGE}; private String[] LOCATION_PERMISSION = new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.WRITE_EXTERNAL_STORAGE};
private final static String[] BLUETOOTH_PERMISSION = new String[]{Manifest.permission.BLUETOOTH_SCAN, Manifest.permission.BLUETOOTH_ADVERTISE, Manifest.permission.BLUETOOTH_CONNECT};
/** /**
* 权限请求返回 * 权限请求返回
*/ */
onPermissionsOk(); onPermissionsOk();
return; return;
} }
if (ContextCompat.checkSelfPermission(this, LOCATION_PERMISSION[0]) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, LOCATION_PERMISSION, PERMISSION);
} else {
boolean bleStatus = AppStart.isLocServiceEnable(mContext);
if (!bleStatus) {
//没有开启定位服务
mHintDataDialog = HintDataDialogFragment.newInstance().setTitle("提示", 0).setCancel("取消", 0).setOk("确定", 0).setContent("请求开启定位服务", true)
.setOnDialogListener(new HintDataDialogFragment.onDialogListener() {
@Override
public void onSucceedListener(View v) {
startLocationActivity();
}
});
mHintDataDialog.show(getSupportFragmentManager());



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


} else {
onPermissionsOk();
}
}
} else {
if (ContextCompat.checkSelfPermission(this, BLUETOOTH_PERMISSION[0]) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, BLUETOOTH_PERMISSION, PERMISSION);
} }
} }


} }




//请求权限被拒绝 //请求权限被拒绝
if (requestCode != PERMISSION) if (requestCode != PERMISSION)
return; return;
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
initPermissions();
} else {
if (ActivityCompat.shouldShowRequestPermissionRationale(this, LOCATION_PERMISSION[0])) {
//权限请求失败,但未选中“不再提示”选项,再次请求
ActivityCompat.requestPermissions(this, LOCATION_PERMISSION, PERMISSION);

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

}


} }

} else {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
initPermissions();
}
} }


} }





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

import android.app.Activity; import android.app.Activity;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.ServiceConnection;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.location.LocationManager; import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.IBinder;
import android.os.Looper; import android.os.Looper;
import android.os.Message; import android.os.Message;
import android.os.ParcelUuid; import android.os.ParcelUuid;
import android.widget.EditText; import android.widget.EditText;
import android.widget.Toast; import android.widget.Toast;


import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.core.app.ActivityCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.pingwang.bluetoothlib.bean.BleValueBean; import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.config.BleConfig; import com.pingwang.bluetoothlib.config.BleConfig;
import com.pingwang.bluetoothlib.device.BleDevice; import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.listener.CallbackDisIm;
import com.pingwang.bluetoothlib.listener.OnCallbackBle; import com.pingwang.bluetoothlib.listener.OnCallbackBle;
import com.pingwang.bluetoothlib.listener.OnScanFilterListener; import com.pingwang.bluetoothlib.listener.OnScanFilterListener;
import com.pingwang.bluetoothlib.server.ELinkBleServer; import com.pingwang.bluetoothlib.server.ELinkBleServer;
import java.util.UUID; import java.util.UUID;


import aicare.net.cn.sdk.ailinksdkdemoandroid.adapter.StringAdapter; import aicare.net.cn.sdk.ailinksdkdemoandroid.adapter.StringAdapter;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig; import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.HintDataDialogFragment; import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.HintDataDialogFragment;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.LoadingIosDialogFragment; import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.LoadingIosDialogFragment;
import aicare.net.cn.sdk.ailinksdkdemoandroid.find.FindDeviceNewActivity; import aicare.net.cn.sdk.ailinksdkdemoandroid.find.FindDeviceNewActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.PublicBleNetworkCmdActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.TempInstrument.TempInstrumentActivity; 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.airdetector.AirDetectorActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_nutrition.BleNutritionActivity; import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_nutrition.BleNutritionActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.coffee_scale.CoffeeScaleActivity; import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.coffee_scale.CoffeeScaleActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.fascia_gun.FasciaGunActivity; import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.fascia_gun.FasciaGunActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.food_temp.FoodTempActivity; import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.food_temp.FoodTempActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.meat_probe.MeatProbeActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.meat_probe_charger.MeatProbeChargerActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.noise_meter.BleNoiseMeterActivity; import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.noise_meter.BleNoiseMeterActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.noise_meter.WifiBleNoiseMeterActivity; import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.noise_meter.WifiBleNoiseMeterActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ropeskipping.RopeSkippingActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.share_charger.ShareChargerActivity; 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_condom.ShareCondomActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.share_socket.ShareSocketActivity; 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.toothbrush_test.ToothbrushTestActivity; 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.weight_scale.WeightScaleActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.CheckPermissionUtils; import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.CheckPermissionUtils;
import aicare.net.cn.sdk.ailinksdkdemoandroid.view.MyItemDecoration; import aicare.net.cn.sdk.ailinksdkdemoandroid.view.MyItemDecoration;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import cn.net.aicare.modulelibrary.module.RopeSkipping.RopeSkippingBleData; import cn.net.aicare.modulelibrary.module.RopeSkipping.RopeSkippingBleData;
import cn.net.aicare.modulelibrary.module.scooter.SkateboardBleConfig; import cn.net.aicare.modulelibrary.module.scooter.SkateboardBleConfig;


/** /**
* xing<br> * xing<br>
* 2019/3/6<br> * 2019/3/6<br>
* java类作用描述
* 扫描蓝牙设备界面
*/ */
public class ShowBleActivity extends AppCompatActivity implements OnCallbackBle, OnScanFilterListener {
public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, OnScanFilterListener {


public static final int REQUEST_PERMISSION_CODE = 1500; public static final int REQUEST_PERMISSION_CODE = 1500;


private EditText et_cid; private EditText et_cid;
private List<BleValueBean> mBleValueList; private List<BleValueBean> mBleValueList;
private StringAdapter listAdapter; private StringAdapter listAdapter;
private ELinkBleServer mBluetoothService;
/**
* 服务Intent
*/
private Intent bindIntent;

private Context mContext; private Context mContext;
private int mType; private int mType;
private String mNoEncryptionMac = ""; private String mNoEncryptionMac = "";
} }
} }



private void initData() { private void initData() {
bindService();


} }


if (mType == BleDeviceConfig.SMART_SCOOTER) { if (mType == BleDeviceConfig.SMART_SCOOTER) {
Map<String, String> map = new HashMap<>(); Map<String, String> map = new HashMap<>();
map.put(SkateboardBleConfig.UUID_BROADCAST.toString(), "37,3,1");//37=0x0025=电滑板的cid map.put(SkateboardBleConfig.UUID_BROADCAST.toString(), "37,3,1");//37=0x0025=电滑板的cid
mBluetoothService.scanLeDevice(30 * 1000, map, BleConfig.UUID_SERVER_AILINK, SkateboardBleConfig.UUID_BROADCAST);
mBluetoothService.startScan(30 * 1000, map, BleConfig.UUID_SERVER_AILINK, SkateboardBleConfig.UUID_BROADCAST);
} else { } else {
//0000FEE7=手表 //0000FEE7=手表
mBluetoothService.scanLeDevice(1000, BleConfig.UUID_SERVER_AILINK, UUID.fromString("0000FEE7-0000-1000-8000-00805F9B34FB"), SkateboardBleConfig.UUID_BROADCAST);
mBluetoothService.startScan(1000, BleConfig.UUID_SERVER_AILINK, UUID.fromString("0000FEE7-0000-1000-8000-00805F9B34FB"), SkateboardBleConfig.UUID_BROADCAST);
} }
mBleValueList.clear(); mBleValueList.clear();
listAdapter.notifyDataSetChanged(); listAdapter.notifyDataSetChanged();
BleConfig.setHandshakeStatus(mac, false); BleConfig.setHandshakeStatus(mac, false);
if (mBluetoothService != null) { if (mBluetoothService != null) {
mBluetoothService.stopScan(); mBluetoothService.stopScan();
mBluetoothService.connectDevice(mac);
mBluetoothService.connectDevice(new BleValueBean(mac, mCid, mVid, mPid));
showLoading(); showLoading();
} }
} else if (BleDeviceConfig.TOOTHBRUSH_WIFI_BLE == mType) { } else if (BleDeviceConfig.TOOTHBRUSH_WIFI_BLE == mType) {
//要加密要握手。别人家的东西 //要加密要握手。别人家的东西
if (mVid == 0x0027 && mPid == 0x0001) { if (mVid == 0x0027 && mPid == 0x0001) {
BleConfig.setHandshakeStatus(RopeSkippingBleData.LongXiang, mac, true); BleConfig.setHandshakeStatus(RopeSkippingBleData.LongXiang, mac, true);
} else if (mVid == 0x0003 && mPid == 0x0009) {
//设置A7不加密
mNoEncryptionMac = mac;
} }
} else if (mCid == BleDeviceConfig.LEAP_WATCH) {
// 手表不握手
BleConfig.setHandshakeStatus(mac, false);
} else if (mCid == BleDeviceConfig.MEAT_PROBE_CHARGER) {
//探针充电盒握手
BleConfig.setHandshakeStatus(mac, true, mCid, mVid, mPid);
mNoEncryptionMac = mac;
} }
if (mBluetoothService != null) { if (mBluetoothService != null) {
mBluetoothService.stopScan(); mBluetoothService.stopScan();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
mBluetoothService.connectDevice(mac, BluetoothDevice.TRANSPORT_LE);
} else {
mBluetoothService.connectDevice(mac);
}
mBluetoothService.connectDevice(new BleValueBean(mac, mCid, mVid, mPid));
showLoading(); showLoading();
} }
} }


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


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


private void unbindService() {
if (mBluetoothService != null) {
mBluetoothService.stopForeground();//停止前台服务
}
CallbackDisIm.getInstance().removeListener(this);
if (mFhrSCon != null) {
BleLog.i(TAG, "解绑服务");
this.unbindService(mFhrSCon);
}
bindIntent = null;
}


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

mHandler.sendEmptyMessage(BIND_SERVER_OK);
}
}

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



@Override @Override
public void onStartScan() { public void onStartScan() {
public void onScanning(@NonNull BleValueBean data) { public void onScanning(@NonNull BleValueBean data) {
String mAddress = data.getMac(); String mAddress = data.getMac();
BleLog.i(TAG, "MAC=" + mAddress + "||CID=" + data.getCid() + "||VID=" + data.getVid() + "||PID=" + data.getPid()); BleLog.i(TAG, "MAC=" + mAddress + "||CID=" + data.getCid() + "||VID=" + data.getVid() + "||PID=" + data.getPid());

boolean oldData = false; boolean oldData = false;
for (int i = 0; i < mBleValueList.size(); i++) { for (int i = 0; i < mBleValueList.size(); i++) {
BleValueBean bleValueBean = mBleValueList.get(i); BleValueBean bleValueBean = mBleValueList.get(i);
mBleValueList.add(data); mBleValueList.add(data);
listAdapter.notifyDataSetChanged(); listAdapter.notifyDataSetChanged();
} else { } else {
// if (System.currentTimeMillis()-mOldRefreshTime>500){
// mOldRefreshTime=System.currentTimeMillis();
// listAdapter.notifyDataSetChanged();
// }
// if (System.currentTimeMillis()-mOldRefreshTime>500){
// mOldRefreshTime=System.currentTimeMillis();
// listAdapter.notifyDataSetChanged();
// }
} }
// String data1 = BleStrUtils.byte2HexStr(data.getScanRecord());
// String data2 = BleStrUtils.byte2HexStr(data.getManufacturerData());
// BleLog.i(TAG, "设备地址+广播数据:" + mAddress + "||" + data1 + "||" + data2);
// String data1 = BleStrUtils.byte2HexStr(data.getScanRecord());
// String data2 = BleStrUtils.byte2HexStr(data.getManufacturerData());
// BleLog.i(TAG, "设备地址+广播数据:" + mAddress + "||" + data1 + "||" + data2);




} }
bleDevice.setA7Encryption(false); bleDevice.setA7Encryption(false);
mNoEncryptionMac = ""; mNoEncryptionMac = "";



} }
dismissLoading(); dismissLoading();
Intent intent = new Intent(); Intent intent = new Intent();
case BleDeviceConfig.WEIGHT_BODY_FAT_SCALE: case BleDeviceConfig.WEIGHT_BODY_FAT_SCALE:
intent.setClass(ShowBleActivity.this, WeightScaleBleActivity.class); intent.setClass(ShowBleActivity.this, WeightScaleBleActivity.class);
break; break;

case BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_AD: case BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_AD:
intent.setClass(ShowBleActivity.this, ADWeightScaleCmdActivity.class); intent.setClass(ShowBleActivity.this, ADWeightScaleCmdActivity.class);
break; break;
break; break;
case BleDeviceConfig.FIND_DEVICE: case BleDeviceConfig.FIND_DEVICE:
// 寻物器 // 寻物器
// intent.setClass(ShowBleActivity.this, FindDeviceActivity.class);
// intent.setClass(ShowBleActivity.this, FindDeviceActivity.class);
intent.setClass(ShowBleActivity.this, FindDeviceNewActivity.class); intent.setClass(ShowBleActivity.this, FindDeviceNewActivity.class);
BleConfig.setHandshakeStatus(mac, false); BleConfig.setHandshakeStatus(mac, false);
break; break;
case BleDeviceConfig.BLE_NOISE_METER: case BleDeviceConfig.BLE_NOISE_METER:
intent.setClass(ShowBleActivity.this, BleNoiseMeterActivity.class); intent.setClass(ShowBleActivity.this, BleNoiseMeterActivity.class);
break; break;

//探针充电盒
case BleDeviceConfig.MEAT_PROBE_CHARGER:
intent.setClass(ShowBleActivity.this, MeatProbeChargerActivity.class);
break;
//体脂秤 //体脂秤
case BleDeviceConfig.WEIGHT_SCALE: case BleDeviceConfig.WEIGHT_SCALE:
intent.setClass(ShowBleActivity.this, WeightScaleActivity.class); intent.setClass(ShowBleActivity.this, WeightScaleActivity.class);
break; break;
// case BleDeviceConfig.BLD_WEIGHT:
// intent.setClass(ShowBleActivity.this, BLDWeightScaleBle.class);
// break;
// case BleDeviceConfig.BLD_WEIGHT:
// intent.setClass(ShowBleActivity.this, BLDWeightScaleBle.class);
// break;
case -1: case -1:
intent.setClass(ShowBleActivity.this, BleCmdActivity.class); intent.setClass(ShowBleActivity.this, BleCmdActivity.class);
break; break;
//验证不握手不加密的界面 //验证不握手不加密的界面
intent.setClass(ShowBleActivity.this, ClearShakeHandsActivity.class); intent.setClass(ShowBleActivity.this, ClearShakeHandsActivity.class);
break; break;
//食物探针
case BleDeviceConfig.MEAT_PROBE:
intent.setClass(ShowBleActivity.this, MeatProbeActivity.class);
break;


default: default:


} }
} }



@Override
public void onServiceSuccess() {
if (mBluetoothService != null) {
mBluetoothService.setOnCallbackBle(ShowBleActivity.this);
mBluetoothService.setOnScanFilterListener(ShowBleActivity.this);
mBluetoothService.initForegroundService(1, R.mipmap.ic_launcher, "前台服务", MainActivity.class);
mBluetoothService.startForegroundService();//启动前台服务
mHandler.sendEmptyMessage(BIND_SERVER_OK);
}
}

@Override
public void onServiceErr() {

}

@Override
public void unbindServices() {
if (mBluetoothService != null) {
mBluetoothService.removeOnCallbackBle(this);
}
}

//--------------------------start Loading-------------------------- //--------------------------start Loading--------------------------
private LoadingIosDialogFragment mDialogFragment; private LoadingIosDialogFragment mDialogFragment;


protected void onResume() { protected void onResume() {
super.onResume(); super.onResume();
if (mBluetoothService != null) { if (mBluetoothService != null) {
mBluetoothService.setOnCallback(ShowBleActivity.this);
mBluetoothService.setOnCallbackBle(ShowBleActivity.this);
mBluetoothService.setOnScanFilterListener(ShowBleActivity.this); mBluetoothService.setOnScanFilterListener(ShowBleActivity.this);
} }
} }
if (mBluetoothService != null) { if (mBluetoothService != null) {
mBluetoothService.stopScan(); mBluetoothService.stopScan();
} }
unbindService();
} }





+ 48
- 17
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/SkateboardDataActivity.java View File

import com.pingwang.bluetoothlib.device.BleDevice; import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.listener.OnBleHandshakeListener; import com.pingwang.bluetoothlib.listener.OnBleHandshakeListener;
import com.pingwang.bluetoothlib.listener.OnCallbackBle; import com.pingwang.bluetoothlib.listener.OnCallbackBle;
import com.realsil.sdk.dfu.DfuConstants;


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


import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleAppBaseActivity; import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleAppBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.DialogStringImageAdapter;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.DialogStringImageBean;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.ShowListDialogFragment; import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.ShowListDialogFragment;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.FileUtils; import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.FileUtils;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L; import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L;
* 滑板车界面 * 滑板车界面
*/ */
public class SkateboardDataActivity extends BleAppBaseActivity implements OnCallbackBle, View.OnClickListener, SkateboardDevice.onNotifyData, public class SkateboardDataActivity extends BleAppBaseActivity implements OnCallbackBle, View.OnClickListener, SkateboardDevice.onNotifyData,
RtkOtaManager.OnRtkOtaInfoListener, ShowListDialogFragment.onDialogListener, OnBleHandshakeListener , OnScooterBleOTAListener {
RtkOtaManager.OnRtkOtaInfoListener, ShowListDialogFragment.onDialogListener, OnBleHandshakeListener, OnScooterBleOTAListener {


private final int REFRESH_DATA = 1; private final int REFRESH_DATA = 1;


private SkateboardDevice mDevice; private SkateboardDevice mDevice;


private int mOtaUpdateStatus; private int mOtaUpdateStatus;
private ArrayList<DialogStringImageAdapter.DialogStringImageBean> mDialogList;
private ArrayList<DialogStringImageBean> mDialogList;
/** /**
* OTA类型,0=BOOTLOADER,1=APP,2=FLASH,3=ble * OTA类型,0=BOOTLOADER,1=APP,2=FLASH,3=ble
*/ */
* rtk升级方式 * rtk升级方式
* 默认静默升级 * 默认静默升级
*/ */
// private int mRtkOtaType = RtkOtaManager.OTA_MODE_SILENT_FUNCTION;
private int mRtkOtaType = DfuConstants.OTA_MODE_NORMAL_FUNCTION;
/** /**
* ota作用域 * ota作用域
*/ */
case R.id.btn_ble: case R.id.btn_ble:
mDialogList.clear(); mDialogList.clear();
for (String s : FileUtils.list()) { for (String s : FileUtils.list()) {
mDialogList.add(new DialogStringImageAdapter.DialogStringImageBean(s, 0));
mDialogList.add(new DialogStringImageBean(s, 0));
} }
//btn_ble //btn_ble
mOTAType = 3; mOTAType = 3;
break; break;
//OTA类型 //OTA类型
case R.id.btn_ota_type: case R.id.btn_ota_type:
List<DialogStringImageAdapter.DialogStringImageBean> list = new ArrayList<>();
// list.add(new DialogStringImageAdapter.DialogStringImageBean("静默升级", RtkOtaManager.OTA_MODE_SILENT_FUNCTION));
// list.add(new DialogStringImageAdapter.DialogStringImageBean("普通升级", RtkOtaManager.OTA_MODE_NORMAL_FUNCTION));
List<DialogStringImageBean> list = new ArrayList<>();
list.add(new DialogStringImageBean("静默升级", DfuConstants.OTA_MODE_SILENT_FUNCTION));
list.add(new DialogStringImageBean("普通升级", DfuConstants.OTA_MODE_NORMAL_FUNCTION));
ShowListDialogFragment.newInstance().setTitle("").setCancel("", 0).setCancelBlank(true).setBackground(true).setBottom(false) ShowListDialogFragment.newInstance().setTitle("").setCancel("", 0).setCancelBlank(true).setBackground(true).setBottom(false)
.setList(list).setOnDialogListener(new ShowListDialogFragment.onDialogListener() { .setList(list).setOnDialogListener(new ShowListDialogFragment.onDialogListener() {
@Override @Override
public void onItemListener(int position) { public void onItemListener(int position) {
DialogStringImageAdapter.DialogStringImageBean dialogStringImageBean = list.get(position);
// mRtkOtaType = (int) dialogStringImageBean.getType();
DialogStringImageBean dialogStringImageBean = list.get(position);
mRtkOtaType = (int) dialogStringImageBean.getType();
btn_ota_type.setText(dialogStringImageBean.getName()); btn_ota_type.setText(dialogStringImageBean.getName());
} }
}).show(getSupportFragmentManager()); }).show(getSupportFragmentManager());
private void selectOta(int OTAType, int OTAScope) { private void selectOta(int OTAType, int OTAScope) {
mDialogList.clear(); mDialogList.clear();
for (String s : FileUtils.list()) { for (String s : FileUtils.list()) {
mDialogList.add(new DialogStringImageAdapter.DialogStringImageBean(s, 0));
mDialogList.add(new DialogStringImageBean(s, 0));
} }
mOTAType = OTAType; mOTAType = OTAType;
mOTAScope = OTAScope; mOTAScope = OTAScope;


private RtkOtaManager mRtkOtaManager; private RtkOtaManager mRtkOtaManager;


@Override
public void onCancelListener(View v) {

}

@Override @Override
public void onItemListener(int position) { public void onItemListener(int position) {
if (mDialogList.size() > position) { if (mDialogList.size() > position) {
DialogStringImageAdapter.DialogStringImageBean dialogStringImageBean = mDialogList.get(position);
DialogStringImageBean dialogStringImageBean = mDialogList.get(position);
String name = dialogStringImageBean.getName(); String name = dialogStringImageBean.getName();
String byFileName = FileUtils.getByFileName() + name; String byFileName = FileUtils.getByFileName() + name;
if (mOTAType == 3) { if (mOTAType == 3) {
mList.add("OTA包中包含:" + stepSize + "个小包\n现在升级" + ((step >= 0) ? step + "包" : "全部包")); mList.add("OTA包中包含:" + stepSize + "个小包\n现在升级" + ((step >= 0) ? step + "包" : "全部包"));
mHandler.sendEmptyMessage(REFRESH_DATA); mHandler.sendEmptyMessage(REFRESH_DATA);


// mRtkOtaManager.startOta(mRtkOtaType, step);
mRtkOtaManager.startOta(mRtkOtaType, step);
} else if (mDevice != null) { } else if (mDevice != null) {


mDevice.setOnScooterBleOTAListener(SkateboardDataActivity.this); mDevice.setOnScooterBleOTAListener(SkateboardDataActivity.this);
@Override @Override
public void onServiceSuccess() { public void onServiceSuccess() {
if (mBluetoothService != null) { if (mBluetoothService != null) {
mBluetoothService.setOnCallback(this);
mBluetoothService.setOnCallbackBle(this);
mBluetoothService.setOnScanFilterListener(null); mBluetoothService.setOnScanFilterListener(null);
BleDevice bleDevice = mBluetoothService.getBleDevice(mMac); BleDevice bleDevice = mBluetoothService.getBleDevice(mMac);
if (bleDevice == null) { if (bleDevice == null) {
mBluetoothService.scanLeDevice(0, SkateboardBleConfig.UUID_BROADCAST, BleConfig.UUID_SERVER_AILINK);
mBluetoothService.startScan(0, SkateboardBleConfig.UUID_BROADCAST, BleConfig.UUID_SERVER_AILINK);
} else { } else {
onServicesDiscovered(mMac); onServicesDiscovered(mMac);
} }


@Override @Override
public void unbindServices() { public void unbindServices() {

if (mBluetoothService!=null) {
mBluetoothService.removeOnCallbackBle(this);
}
} }


@Override @Override


} }


@Override
public void onScanErr(long time) {

}

@Override
public void onConnecting(String mac) {

}



@Override @Override
public void bleClose() { public void bleClose() {
mDevice = null; mDevice = null;
} }


@Override
public void onConnectionSuccess(String mac) {

}

@Override @Override
public void bleOpen() { public void bleOpen() {
mList.add("蓝牙已开启"); mList.add("蓝牙已开启");
mHandler.sendEmptyMessage(REFRESH_DATA); mHandler.sendEmptyMessage(REFRESH_DATA);
if (mBluetoothService != null) { if (mBluetoothService != null) {
mBluetoothService.scanLeDevice(0, SkateboardBleConfig.UUID_BROADCAST, BleConfig.UUID_SERVER_AILINK);
mBluetoothService.startScan(0, SkateboardBleConfig.UUID_BROADCAST, BleConfig.UUID_SERVER_AILINK);
} }
} }


mHandler.sendEmptyMessage(REFRESH_DATA); mHandler.sendEmptyMessage(REFRESH_DATA);
} }


@Override
public void onReconnect(String mac) {

}



public static int getProgressStateResId(int var0) { public static int getProgressStateResId(int var0) {
if (var0 != 527) { if (var0 != 527) {
} }







} }

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

import android.widget.ListView; import android.widget.ListView;
import android.widget.Toast; import android.widget.Toast;


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

import com.pingwang.bluetoothlib.device.BleDevice; import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.device.BleSendCmdUtil; import com.pingwang.bluetoothlib.device.BleSendCmdUtil;
import com.pingwang.bluetoothlib.device.SendBleBean; import com.pingwang.bluetoothlib.device.SendBleBean;


import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import butterknife.BindView; import butterknife.BindView;
import butterknife.ButterKnife; import butterknife.ButterKnife;
import cn.net.aicare.modulelibrary.module.SmartMask.SmartMaskBleConfig; import cn.net.aicare.modulelibrary.module.SmartMask.SmartMaskBleConfig;

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

import android.widget.EditText; import android.widget.EditText;
import android.widget.ListView; import android.widget.ListView;


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

import com.pingwang.bluetoothlib.config.CmdConfig; import com.pingwang.bluetoothlib.config.CmdConfig;
import com.pingwang.bluetoothlib.device.BleDevice; import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.device.BleSendCmdUtil; import com.pingwang.bluetoothlib.device.BleSendCmdUtil;


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



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

import android.widget.RadioButton; import android.widget.RadioButton;
import android.widget.Toast; import android.widget.Toast;


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

import com.pingwang.bluetoothlib.device.BleDevice; import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.device.BleSendCmdUtil; import com.pingwang.bluetoothlib.device.BleSendCmdUtil;
import com.pingwang.bluetoothlib.device.SendBleBean; import com.pingwang.bluetoothlib.device.SendBleBean;


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





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

import android.widget.ListView; import android.widget.ListView;
import android.widget.Toast; import android.widget.Toast;


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

import com.pingwang.bluetoothlib.device.BleDevice; import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.device.BleSendCmdUtil; import com.pingwang.bluetoothlib.device.BleSendCmdUtil;
import com.pingwang.bluetoothlib.device.SendBleBean; import com.pingwang.bluetoothlib.device.SendBleBean;


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





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

import android.widget.ListView; import android.widget.ListView;
import android.widget.TextView; import android.widget.TextView;


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

import com.pingwang.bluetoothlib.bean.BleValueBean; import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.device.BleDevice; import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.listener.OnCallbackBle; import com.pingwang.bluetoothlib.listener.OnCallbackBle;
import java.util.List; import java.util.List;


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


/** /**


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


@Override @Override
public void unbindServices() { public void unbindServices() {

if (mBluetoothService!=null) {
mBluetoothService.removeOnCallbackBle(this);
}
} }





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

import android.widget.ListView; import android.widget.ListView;
import android.widget.TextView; import android.widget.TextView;


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

import com.pingwang.bluetoothlib.config.BleConfig; import com.pingwang.bluetoothlib.config.BleConfig;
import com.pingwang.bluetoothlib.device.BleDevice; import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.device.SendDataBean; import com.pingwang.bluetoothlib.device.SendDataBean;


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




/** /**
private ArrayAdapter listAdapter; private ArrayAdapter listAdapter;
private Context mContext; private Context mContext;
private EditText et_cmd, et_uuid, et_uuid_server, et_time, et_notify; private EditText et_cmd, et_uuid, et_uuid_server, et_time, et_notify;
private BleDevice bleDevice;
private BleDevice mBleDevice;
private String mAddress; private String mAddress;
private int sendTime = 1000; private int sendTime = 1000;
private UUID sendUuid = null; private UUID sendUuid = null;
private long mSendNumber = 0; private long mSendNumber = 0;
private long mReceiveNumber = 0; private long mReceiveNumber = 0;
private boolean mShowLog = true; private boolean mShowLog = true;
private int mNum = 1;
private Handler mHandler = new Handler(Looper.getMainLooper()) { private Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override @Override
public void handleMessage(Message msg) { public void handleMessage(Message msg) {
case SEND_DATA: case SEND_DATA:


if (sendUuid != null && sendUuidServer != null) { if (sendUuid != null && sendUuidServer != null) {
SendDataBean sendDataBean = new SendDataBean(sendCmd.getBytes(), sendUuid, BleConfig.WRITE_DATA, sendUuidServer);
bleDevice.sendData(sendDataBean);
mNum++;
SendDataBean sendDataBean = new SendDataBean(String.valueOf(mNum).getBytes(), sendUuid, BleConfig.WRITE_DATA, sendUuidServer);
mBleDevice.sendData(sendDataBean);
if (sendTime > 0) { if (sendTime > 0) {
mHandler.sendEmptyMessageDelayed(SEND_DATA, sendTime); mHandler.sendEmptyMessageDelayed(SEND_DATA, sendTime);
} }
case R.id.clear: case R.id.clear:
if (mList != null) if (mList != null)
mList.clear(); mList.clear();
mSendNumber=0;
mSendNumber = 0;
mReceiveNumber = 0; mReceiveNumber = 0;
tv_receive_number.setText("0"); tv_receive_number.setText("0");
tv_send_number.setText("0"); tv_send_number.setText("0");
*/ */
private void readNotify(String notify, boolean notifyOpen) { private void readNotify(String notify, boolean notifyOpen) {
UUID uuidNotify = UuidUtils.getUuid(notify); UUID uuidNotify = UuidUtils.getUuid(notify);
if (bleDevice != null && sendUuidServer != null) {
if (mBleDevice != null && sendUuidServer != null) {
if (notifyOpen) { if (notifyOpen) {
bleDevice.setNotify(sendUuidServer, uuidNotify);
mBleDevice.setNotify(sendUuidServer, uuidNotify);
} else { } else {
bleDevice.setCloseNotify(sendUuidServer, uuidNotify);
mBleDevice.setCloseNotify(sendUuidServer, uuidNotify);
} }


} else { } else {
BleLog.i(TAG, "服务与界面建立连接成功"); BleLog.i(TAG, "服务与界面建立连接成功");
//与服务建立连接 //与服务建立连接
if (mBluetoothService != null) { if (mBluetoothService != null) {
bleDevice = mBluetoothService.getBleDevice(mAddress);
mBleDevice = mBluetoothService.getBleDevice(mAddress);
CallbackDisIm.getInstance().addListListener(this); CallbackDisIm.getInstance().addListListener(this);
if (bleDevice != null) {
bleDevice.setOnBleOtherDataListener(this);
bleDevice.setOnBleDeviceDataListener(this);
if (mBleDevice != null) {
mBleDevice.setOnBleOtherDataListener(this);
mBleDevice.setOnBleDeviceDataListener(this);


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


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





@Override @Override
public void onNotifyData(byte[] hex, int type) {
public void onNotifyData(String uuid, byte[] hex, int type) {
if (!mShowLog) { if (!mShowLog) {
return; return;
} }
if (type == 100) { if (type == 100) {
mList.add(TimeUtils.getTime() + "send->" + data); mList.add(TimeUtils.getTime() + "send->" + data);
} else { } else {
mList.add(TimeUtils.getTime() + "notify->" + data);
mList.add(TimeUtils.getTime() + "notify1->" + data);
mReceiveNumber += hex.length; mReceiveNumber += hex.length;
tv_receive_number.setText(String.valueOf(mReceiveNumber)); tv_receive_number.setText(String.valueOf(mReceiveNumber));
} }
mHandler.sendEmptyMessage(REFRESH_DATA); mHandler.sendEmptyMessage(REFRESH_DATA);
} }



@Override @Override
public void onNotifyOtherData(byte[] hex) {
public void onNotifyOtherData(String uuid, byte[] hex) {
if (mBleDevice != null) {
hex[0]= (byte) (hex[0]+1);
SendDataBean sendDataBean = new SendDataBean(hex,BleConfig.UUID_WRITE_AILINK,BleConfig.WRITE_DATA,BleConfig.UUID_SERVER_AILINK);
mBleDevice.sendDataNow(sendDataBean);
}
if (mShowLog) { if (mShowLog) {
String data = ""; String data = "";
if (hex != null) if (hex != null)
data = BleStrUtils.byte2HexStr(hex); data = BleStrUtils.byte2HexStr(hex);
mList.add(TimeUtils.getTime() + "notify->" + data);
mList.add(TimeUtils.getTime() + "notify2->" + data);
mHandler.sendEmptyMessage(REFRESH_DATA); mHandler.sendEmptyMessage(REFRESH_DATA);
} }
mReceiveNumber += hex.length; mReceiveNumber += hex.length;

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

import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;


import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;

import com.elinkthings.bleotalibrary.dialog.DialogOtaManager; import com.elinkthings.bleotalibrary.dialog.DialogOtaManager;
import com.elinkthings.bleotalibrary.listener.OnBleOTAListener; import com.elinkthings.bleotalibrary.listener.OnBleOTAListener;
import com.pingwang.bluetoothlib.device.BleDevice; import com.pingwang.bluetoothlib.device.BleDevice;
import java.util.List; import java.util.List;


import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.DialogStringImageAdapter;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.DialogStringImageBean;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.ShowListDialogFragment; import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.ShowListDialogFragment;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.FileUtils; import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.FileUtils;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.SP; import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.SP;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;




/** /**
private BleDevice mBleDevice; private BleDevice mBleDevice;
private String mAddress; private String mAddress;


private ArrayList<DialogStringImageAdapter.DialogStringImageBean> mDialogList;
private ArrayList<DialogStringImageBean> mDialogList;
private String mOTAFileName; private String mOTAFileName;
private DialogOtaManager mDialogOtaManager; private DialogOtaManager mDialogOtaManager;
private Handler mHandler = new Handler(Looper.getMainLooper()) { private Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override @Override
public void onItemListener(int position) { public void onItemListener(int position) {
if (mDialogList.size() > position) { if (mDialogList.size() > position) {
DialogStringImageAdapter.DialogStringImageBean dialogStringImageBean = mDialogList.get(position);
DialogStringImageBean dialogStringImageBean = mDialogList.get(position);
String name = dialogStringImageBean.getName(); String name = dialogStringImageBean.getName();
mOTAFileName = name; mOTAFileName = name;
SP.getInstance().putOtaFileName(name); SP.getInstance().putOtaFileName(name);
mDialogList.clear(); mDialogList.clear();
ArrayList<String> list = FileUtils.list(); ArrayList<String> list = FileUtils.list();
for (String s : list) { for (String s : list) {
mDialogList.add(new DialogStringImageAdapter.DialogStringImageBean(s, 0));
mDialogList.add(new DialogStringImageBean(s, 0));
} }


ShowListDialogFragment.newInstance().setTitle("").setCancel("", 0).setCancelBlank(true).setBackground(true).setBottom(false).setList(mDialogList).setOnDialogListener(this) ShowListDialogFragment.newInstance().setTitle("").setCancel("", 0).setCancelBlank(true).setBackground(true).setBottom(false).setList(mDialogList).setOnDialogListener(this)
//与服务建立连接 //与服务建立连接
if (mBluetoothService != null) { if (mBluetoothService != null) {
mBleDevice = mBluetoothService.getBleDevice(mAddress); mBleDevice = mBluetoothService.getBleDevice(mAddress);
mBluetoothService.setOnCallback(this);
mBluetoothService.setOnCallbackBle(this);
if (mDialogOtaManager != null) { if (mDialogOtaManager != null) {
mDialogOtaManager.setOnBleOTAListener(this); mDialogOtaManager.setOnBleOTAListener(this);
} }


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

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

package aicare.net.cn.sdk.ailinksdkdemoandroid;

import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

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

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

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

/**
* ble 牙刷
*/
public class ToothBrushBleActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle,ToothBrushBleUtilsData.BleToothBrushCallback {
private String TAG = ToothBrushBleActivity.class.getName();
private String mAddress;
private int type;
private List<String> mList;
private ArrayAdapter listAdapter;

private MHandler mMHandler;
private EditText select_gears_et;

private ToothBrushBleUtilsData mToothBrushBleUtilsData;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//禁止横屏
setContentView(R.layout.activity_tooth_brush_ble);

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


select_gears_et = findViewById(R.id.select_gears_et);

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


}


@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
}

@Override
public void onServiceSuccess() {

//与服务建立连接
mList.add(0, "服务与界面建立连接成功");
// mList.add(0, "搜索设备");
mMHandler.sendEmptyMessage(ToRefreUi);
mBluetoothService.setOnCallback(this);
mBluetoothService.scanLeDevice(30 * 1000);


}


@Override
public void onServiceErr() {

}

@Override
public void unbindServices() {

}

@Override
public void onStartScan() {

}

@Override
public void onScanning(BleValueBean data) {
BleLog.i(TAG, "MAC=" + mAddress + "||CID=" + data.getCid() + "||VID=" + data.getVid() + "||PID=" + data.getPid());
if (data.getMac().equalsIgnoreCase(mAddress)) {
mBluetoothService.stopScan();
mBluetoothService.connectDevice(data.getMac());
}
}

@Override
public void onScanTimeOut() {

}

@Override
public void onConnecting(String mac) {

}

@Override
public void onDisConnected(String mac, int code) {
mList.add(0, "蓝牙已断开");
mMHandler.sendEmptyMessage(ToRefreUi);
}

@Override
public void onServicesDiscovered(String mac) {
mList.add(0, "蓝牙已连接");
mMHandler.sendEmptyMessage(ToRefreUi);
stopScanBle();
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress);
if (bleDevice != null) {
ToothBrushBleUtilsData.init(bleDevice,this);
mToothBrushBleUtilsData =ToothBrushBleUtilsData.getInstance();

mMHandler.sendEmptyMessageDelayed(ToRequestToken, 600);
mMHandler.sendEmptyMessageDelayed(GETBATTERY, 800);
}
}

@Override
public void bleOpen() {

}

@Override
public void bleClose() {

}




@Override
public void onClick(View v) {
int id = v.getId();
if (mToothBrushBleUtilsData != null)
switch (id) {

case R.id.support_unit:
mToothBrushBleUtilsData.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 {
mToothBrushBleUtilsData.setDefault(Integer.parseInt(gears[0]), Integer.parseInt(gears[1]), Integer.parseInt(gears[2]));
} catch (Exception 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 {
mToothBrushBleUtilsData.setTryOut(Integer.parseInt(gears[1]), Integer.parseInt(gears[2]), 0, 0);
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(this, "请输入时长,档位,档位级别(数字加符号)", Toast.LENGTH_SHORT).show();
}

}
}

break;
case R.id.default_time_mode:
mToothBrushBleUtilsData.getdefaultGearAndDuration();
break;


}

}

private final int ToRefreUi = 300;
private final int ConnectWifi = 400;
private final int ToRequestToken = 500;
private final int GETBATTERY = 600;


@Override
public void onVersion(String version) {
mList.add(0, "版本号:" + version);
mMHandler.sendEmptyMessage(ToRefreUi);
}

@Override
public void onGetSupportGears(List<Integer> staif, List<Integer> secondLevel) {
mList.add(0, "牙刷支持的一级档位:" + Arrays.toString(staif.toArray()) + " 二级档位:" + Arrays.toString(secondLevel.toArray()));
mMHandler.sendEmptyMessage(ToRefreUi);
}

@Override
public void onGetBattery(int batteryStatus, int batteryQuantity) {
mList.add(0, "电池状态:" + batteryStatus + " 电量:" + batteryQuantity);
mMHandler.sendEmptyMessage(ToRefreUi);
}

@Override
public void onGetDefaultGearAndDuration(int time, int gear, int gearFrom) {
mList.add(0, "获得到默认的刷牙档位和时长:" + time + " 档位:" + gear + " 档位级别" + gearFrom);
mMHandler.sendEmptyMessage(ToRefreUi);
}

@Override
public void onGetTokenResult(int result) {
String s = "";
if (result == ToothBrushBleCmd.NO_TOKEN) {
s = "没有";
} else if (result == ToothBrushBleCmd.HAS_TOKEN) {
s = "已经授权";
} else if (result == ToothBrushBleCmd.WITHOUT_TOKEN) {
s = "不需要授权";
} else if (result == ToothBrushBleCmd.SUCCESSTOKEN) {
s = "授权成功";
}
mList.add(0, "请求授权结果" + result + " " + s);
mMHandler.sendEmptyMessage(ToRefreUi);
}

@Override
public void onGetManualParameter(int time, int hz, int duty) {
mList.add(0, " 获取手动档位的参数: 时长" + time + " 频率" + hz + " 占空比" + duty);
mMHandler.sendEmptyMessage(ToRefreUi);
}

@Override
public void onSetDefaultModeAndManualModeResult(byte type, int result) {
String s = "";
if (result == 0) {
s = "设置成功";
} else if (result == 1) {
s = "设置失败";
} else if (result == 2) {
s = "不支持设置";
}
if (type == ToothBrushBleCmd.SET_TOOTHBRUSH_TIME_GEARS) {
mList.add(0, " 设置默认刷牙时长和工作档位: 结果" + result + " " + s);
mMHandler.sendEmptyMessage(ToRefreUi);
} else {
mList.add(0, " 设置手动设置(自定义)档位: 结果" + result + " " + s);
mMHandler.sendEmptyMessage(ToRefreUi);
}
}

@Override
public void onTestFinish(int totalTime, int leftTime, int rightTime, int mode, int battery) {
mList.add(0, "刷牙完成: 总时长:" + totalTime + " 左时长:" + leftTime + " 右时长:" + rightTime + " 模式:" + mode + " 电量:" + battery);
mMHandler.sendEmptyMessage(ToRefreUi);
}

@Override
public void onTryOutResult(int result) {
mList.add(0, "设置使用结果:" + result + " ( 0:设置成功 1:设置失败,原因未知 2:不支持设置)");
mMHandler.sendEmptyMessage(ToRefreUi);
}

@Override
public void onTwoLevelModeDefault(int mode) {
mList.add(0, "获取二级档位默认值:" + mode);
mMHandler.sendEmptyMessage(ToRefreUi);
}


@Override
public void onShowData(String data) {
Log.e("蓝牙牙刷",data);
}

private class MHandler extends Handler {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case ToRefreUi:
if (listAdapter != null) {
listAdapter.notifyDataSetChanged();
}
break;

case ToRequestToken:
mList.add(0, "请求授权");
mToothBrushBleUtilsData.requestToken(System.currentTimeMillis());
if (listAdapter != null) {
listAdapter.notifyDataSetChanged();
}
break;
case GETBATTERY:
mToothBrushBleUtilsData.getBattery();
break;
}
}
}



}

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

package aicare.net.cn.sdk.ailinksdkdemoandroid;


import com.pingwang.bluetoothlib.device.BaseBleDeviceData;
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.OnBleOtherDataListener;
import com.pingwang.bluetoothlib.listener.OnBleVersionListener;
import com.pingwang.bluetoothlib.listener.OnMcuParameterListener;
import com.pingwang.bluetoothlib.utils.BleStrUtils;

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

import cn.net.aicare.modulelibrary.module.ToothBrush.ToothBrushBleCmd;

/**
* 如果在解析包中。找不到这个类。可以直接把代码复制过去
* 如果有这个类。这个类只演示用
*/
public class ToothBrushBleUtilsData extends BaseBleDeviceData {

public final static int TOOTHBRUSH_BLE = 0x2d;
private BleDevice mBleDevice = null;
private volatile static ToothBrushBleUtilsData toothBrushBleUtilsData = null;


private ToothBrushBleUtilsData(BleDevice bleDevice, BleToothBrushCallback bleToothBrushCallback) {
super(bleDevice);
mBleDevice = bleDevice;
this.bleToothBrushCallback = bleToothBrushCallback;


mBleDevice.setOnBleVersionListener(new OnBleVersionListener() {
@Override
public void onBmVersion(String version) {
//蓝牙版本号
if (bleToothBrushCallback != null) {
bleToothBrushCallback.onVersion(version);
}
}
});
bleDevice.setOnMcuParameterListener(new OnMcuParameterListener() {
@Override
public void onMcuBatteryStatus(int status, int battery) {
if (bleToothBrushCallback != null) {
bleToothBrushCallback.onGetBattery(status, battery);
}
}
});
mBleDevice.setOnBleOtherDataListener(new OnBleOtherDataListener() {
@Override
public void onNotifyOtherData(byte[] data) {
}
});


}

public static ToothBrushBleUtilsData getInstance() {
return toothBrushBleUtilsData;
}


/**
* 初始化话
*
* @param bleDevice 蓝牙操作类
* @param bleCallback 蓝牙基础回调接口
*/
public static void init(BleDevice bleDevice, BleToothBrushCallback bleCallback) {
toothBrushBleUtilsData=null;
toothBrushBleUtilsData=new ToothBrushBleUtilsData(bleDevice,bleCallback);

}


/**
* 获取到蓝牙设备对象
*
* @return 蓝牙设备
*/
public BleDevice getBleDevice() {
WeakReference weakReference = new WeakReference(mBleDevice);
return (BleDevice) weakReference.get();
}


@Override
public void onNotifyData(byte[] bytes, int type) {
if (bleToothBrushCallback != null) {
bleToothBrushCallback.onShowData("蓝牙返回的A7: " + BleStrUtils.byte2HexStr(bytes));
}
switch (bytes[0]) {
case ToothBrushBleCmd.GET_TOOTHBRUSH_TIME_GEARS:
if (bytes.length >= 5) {
int highTime = (bytes[1] & 0xff) << 8;
int lowTime = bytes[2] & 0xff;
int gears = bytes[3] & 0xff;
int gearsfrom = bytes[4] & 0xff;
if (bleToothBrushCallback != null)
bleToothBrushCallback.onGetDefaultGearAndDuration(highTime + lowTime, gears, gearsfrom);
}
break;
case ToothBrushBleCmd.SET_TOOTHBRUSH_TIME_GEARS:
case ToothBrushBleCmd.SET_MANUAL_MODE:
if (bytes.length >= 2) {
if (bleToothBrushCallback != null)
bleToothBrushCallback.onSetDefaultModeAndManualModeResult(bytes[0], bytes[1] & 0xff);

}
break;
case ToothBrushBleCmd.GET_MANUAL_MODE:
if (bytes.length >= 7) {
int hzH = (bytes[2] & 0xff) << 8;
int hzl = bytes[3] & 0xff;
int duty = bytes[4] & 0xff;
int timeH = (bytes[5] & 0xff) << 8;
int timeL = bytes[6] & 0xff;
if (bleToothBrushCallback != null) {
bleToothBrushCallback.onGetManualParameter(timeH + timeL, hzH + hzl, duty);
}
}
break;
case (byte) ToothBrushBleCmd.BRUSH_TEETH_TO_COMPLETE:
if (bytes.length >= 9) {
int mode = bytes[1] & 0xff;
int timeH = (bytes[2] & 0xff) << 8;
int timeL = bytes[3] & 0xff;
int lTimeH = (bytes[4] & 0xff) << 8;
int lTimeL = bytes[5] & 0xff;
int rTimeH = (bytes[6] & 0xff) << 8;
int rTimeL = bytes[7] & 0xff;
int battery = bytes[8] & 0xff;
if (bleToothBrushCallback != null) {
bleToothBrushCallback.onTestFinish(timeH + timeL, lTimeH + lTimeL, rTimeH + rTimeL, mode, battery);
}
}

break;
case ToothBrushBleCmd.THE_TRIAL_ORDER:
//试用指令
if (bytes.length >= 2)
if (bleToothBrushCallback != null) {
bleToothBrushCallback.onTryOutResult(bytes[1] & 0xff);
}
break;
case ToothBrushBleCmd.GET_SECOND_GEARS:
if (bytes.length >= 2)
if (bleToothBrushCallback != null) {
bleToothBrushCallback.onTwoLevelModeDefault(bytes[1] & 0xff);
}


}
}


@Override
public void onNotifyDataA6(byte[] hex) {
if (bleToothBrushCallback != null) {
bleToothBrushCallback.onShowData("蓝牙返回的A6: " + BleStrUtils.byte2HexStr(hex));
}
switch (hex[0]) {
case (byte) ToothBrushBleCmd.GET_TOOTHBRUSH_GEARS:
disposeSupportGears(hex);
break;
case ToothBrushBleCmd.REQUEST_TOKEN:
int result = hex[1] & 0xff;
if (bleToothBrushCallback != null) {
bleToothBrushCallback.onGetTokenResult(result);
}
break;

}
}

private void disposeSupportGears(byte[] hex) {
if (hex.length > 4 && hex[1] == 0x01) {
int stair = hex[2] & 0xff;
int secondLevel = hex[3] & 0xff;
List<Integer> stairs = new ArrayList<>();
List<Integer> secondLevels = new ArrayList<>();
if (hex.length >= 4 + stair) {
for (int i = 0; i < stair; i++) {
stairs.add((int) hex[i + 4] & 0xff);
}
}
if (hex.length >= 4 + stair + secondLevel) {
for (int i = 0; i < secondLevel; i++) {
secondLevels.add((int) hex[i + 4 + stair] & 0xff);
}

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


}

private BleToothBrushCallback bleToothBrushCallback;


public interface BleToothBrushCallback {

/**
* 版本号
* version number
*
* @param Version
*/
void onVersion(String Version);

/**
* 牙刷支持的档位
* Gear supported by toothbrush
*
* @param staif 一级档位 First gear
* @param secondLevel 二级档位 Second gear
*/
void onGetSupportGears(List<Integer> staif, List<Integer> secondLevel);

/**
* 获取电量
* Get battery
*
* @param batteryStatus 电池充电状态 Battery charging status
* 0x00:没有充电(默认) 0x00: No charging (default)
* 0x01:充电中 0x01: Charging
* 0x02:充满电 0x02: Fully charged
* 0x03:充电异常 0x03: abnormal charging
* @param batteryQuantity 电池电量百分比 (0—100) Battery power percentage (0-100)
*/
void onGetBattery(int batteryStatus, int batteryQuantity);

/**
* 获得到默认的刷牙档位和时长
* Get the default brushing position and duration
*
* @param time 刷牙时长 Brushing time
* @param gear 刷牙档位 Brushing gear
* @param gearFrom 刷牙档位级别 Brushing gear level
*/
void onGetDefaultGearAndDuration(int time, int gear, int gearFrom);

/**
* 请求授权的回调
* Callback to request authorization
*
* @param result 0:没有 1:已经授权 2:不需要授权 3:授权成功 {@link ToothBrushBleCmd#NO_TOKEN}
*/
void onGetTokenResult(int result);

/**
* 获取手动档位的参数
* Get the parameters of manual gear
*
* @param time 时长 duration
* @param hz 频率 frequency
* @param duty 占空比 Duty cycle
*/
void onGetManualParameter(int time, int hz, int duty);

/**
* 设置默认档位和手动模式结果回调
*
* @param type 类型 {@link ToothBrushBleCmd#SET_TOOTHBRUSH_TIME_GEARS, ToothBrushBleCmd#Set_Manual_Mode}
* @param result 0:设置成功 1:设置失败 2:不支持设置
*/
void onSetDefaultModeAndManualModeResult(byte type, int result);

/**
* 刷牙完成
* Brushing is done
*
* @param totalTime 刷牙总时长 Total brushing time
* @param leftTime 左边刷牙时间 Brushing time on the left
* @param rightTime 右边刷牙时间 Brushing time on the right
* @param mode 刷牙模式 Brushing mode
* @param battery 电量 Power
*/
void onTestFinish(int totalTime, int leftTime, int rightTime, int mode, int battery);

/**
* 试用回调
* Trial callback
*
* @param result 0:设置成功 0: Setting is successful
* 1:设置失败,原因未知 1: Setting fails, the reason is unknown
* 2:不支持设置 2: Setting is not supported
*/
void onTryOutResult(int result);

/**
* 获取二级档位默认值
* Get the default value of the second gear
*
* @param mode 0x00:不支持 0x00: not supported
* 0x01-0xfe:工作档位编号 0x01-0xfe: working gear number
* 0xFF:手动设置档位 0xFF: manual setting of gear
*/
void onTwoLevelModeDefault(int mode);

/**
* 蓝牙返回的数据
* Data returned by Bluetooth
*
* @param data
*/
void onShowData(String data);


}


/**
* 获取支持的单位 A6指令
* Supported unit
*/
public void getSupportGears() {

byte[] bytes = new byte[2];
bytes[0] = ToothBrushBleCmd.GET_TOOTHBRUSH_GEARS;
bytes[1] = 0x01;

sendA6(bytes);
}

/**
* 获取到电量
* Get power
*/
public void getBattery() {
sendA6(BleSendCmdUtil.getInstance().getMcuBatteryStatus());
}

/**
* 获取默认模式和时长
* Get the default mode and duration
*/
public void getdefaultGearAndDuration() {
byte[] bytes = new byte[1];
bytes[0] = ToothBrushBleCmd.GET_TOOTHBRUSH_TIME_GEARS;
sendA7(bytes);

}



public void setOta() {
// 91 01
byte[] bytes = new byte[2];
bytes[0] = (byte) 0x91;
bytes[1] = 0x01;
sendA6(bytes);
}


/**
* 发起连接
* Initiate connection
*
* @return
*/
public void connectWifi() {

byte[] bytes = new byte[2];
bytes[0] = (byte) 0x88;
bytes[1] = 0x01;
sendA6(bytes);
}




/**
* 设置试用
* Set up trial
*/
public void setTryOut(int id, int level, int hz, int duty) {
byte[] bytes = new byte[14];
bytes[0] = ToothBrushBleCmd.THE_TRIAL_ORDER;
bytes[1] = (byte) id;
bytes[2] = (byte) level;
bytes[3] = (byte) 0xff;
bytes[4] = (byte) (hz >> 8);
bytes[5] = (byte) hz;
bytes[6] = (byte) duty;
bytes[7] = (byte) 0;
bytes[8] = (byte) 0;
bytes[9] = (byte) 0;
bytes[10] = (byte) 0;
bytes[11] = (byte) 0;
bytes[12] = (byte) 0;
bytes[13] = (byte) 0;
sendA7(bytes);


}

/**
* 设置默认
* Set the default
*/
public void setDefault(int time, int mode, int level) {
byte[] bytes = new byte[5];
bytes[0] = ToothBrushBleCmd.SET_TOOTHBRUSH_TIME_GEARS;
bytes[1] = (byte) (time >> 8);
bytes[2] = (byte) time;
bytes[3] = (byte) mode;
bytes[4] = (byte) level;

sendA7(bytes);

}

/**
* 下发数据上报成功
* Successfully sent data and reported
*/
public void testFinishSuccess() {
byte[] bytes = new byte[2];
bytes[0] = (byte) ToothBrushBleCmd.Issue_Data_Report_Completed;
bytes[1] = 0x01;
sendA7(bytes);

}

/**
* APP 设置二级档位默认值
* Set the default value of the second gear
*/
public void setTwoLevelDefault(int modeId) {
byte[] bytes = new byte[2];
bytes[0] = ToothBrushBleCmd.Set_Second_GEARS;
bytes[1] = (byte) modeId;
sendA7(bytes);

}

/**
* APP 获取二级档位默认值
*/
public void getTwoLevelDefault() {
byte[] bytes = new byte[1];
bytes[0] = ToothBrushBleCmd.GET_SECOND_GEARS;
sendA7(bytes);
}


/**
* 开始刷牙
* Get the default value of the second gear
*/
public void starTooth() {

byte[] bytes = new byte[1];
bytes[0] = ToothBrushBleCmd.Start_Close_ToothBrush;
sendA7(bytes);
}

/**
* 设置手动模式的参数
* Set the parameters of manual mode
*/
public void setManualParameter(int hz, int duty, int time) {
byte[] bytes = new byte[7];
bytes[0] = ToothBrushBleCmd.SET_MANUAL_MODE;
bytes[1] = 0x00;
bytes[2] = (byte) (hz >> 8);
bytes[3] = (byte) hz;
bytes[4] = (byte) duty;
bytes[5] = (byte) (time >> 8);
bytes[6] = (byte) time;
sendA7(bytes);
}


/**
* 获取手动模式的参数
* Get the parameters of manual mode
*/
public void getManualParameter() {
byte[] bytes = new byte[1];
bytes[0] = ToothBrushBleCmd.GET_MANUAL_MODE;

sendA7(bytes);


}

/**
* APP 请求授权 Payload
* Request authorization
*
* @param toothbrushId 时间搓
*/
public void requestToken(long toothbrushId) {
byte[] timebyte = long2Bytes(toothbrushId); //long 长度8 byte 时间搓是6个byte 所以去后面6位
byte[] bytes = new byte[7];
bytes[0] = ToothBrushBleCmd.REQUEST_TOKEN;
bytes[1] = timebyte[2];
bytes[2] = timebyte[3];
bytes[3] = timebyte[4];
bytes[4] = timebyte[5];
bytes[5] = timebyte[6];
bytes[6] = timebyte[7];
sendA6(bytes);

}

private byte[] long2Bytes(long num) {
byte[] byteNum = new byte[8];
for (int ix = 0; ix < 8; ++ix) {
int offset = 64 - (ix + 1) * 8;
byteNum[ix] = (byte) ((num >> offset) & 0xff);
}
return byteNum;
}

private SendBleBean sendBleBean;

/**
* 发送A6指令
*
* @param bytes
*/
public void sendA6(byte[] bytes) {
if (sendBleBean == null) {
sendBleBean = new SendBleBean();
}
sendBleBean.setHex(bytes);
sendData(sendBleBean);
}

/**
* 断开连接
* Disconnect
*
* @return SendBleBean
*/
public void disconnectWifi() {
byte[] bytes = new byte[2];
bytes[0] = (byte) 0x88;
bytes[1] = 0x00;
sendA6(bytes);
}



/**
* 发送A7指令
*
* @param bytes
*/
public void sendA7(byte[] bytes) {

SendMcuBean sendMcuBean = new SendMcuBean();
sendMcuBean.setHex(TOOTHBRUSH_BLE, bytes);
sendData(sendMcuBean);
}
}

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

package aicare.net.cn.sdk.ailinksdkdemoandroid;

import android.content.Intent;
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.Toast;

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

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

import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.WifiDialog;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.ToothBrush.ToothBrushBleCmd;
import cn.net.aicare.modulelibrary.module.ToothBrush.ToothBrushWiFiBleUtilsData;

/**
* Wifi+ble 牙刷
*/
public class ToothBrushWifiBleActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, ToothBrushWiFiBleUtilsData.BleToothBrushWiFiCallback, ToothBrushWiFiBleUtilsData.BleToothBrushCallback {
private String TAG = ToothBrushWifiBleActivity.class.getName();
private String mAddress;

private List<String> mList;
private ArrayAdapter listAdapter;

private ToothBrushWiFiBleUtilsData mToothBrushWiFiBleUtilsData;
private MHandler mMHandler;
private EditText mEditText, select_gears_et;
private String dataPaw;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//禁止横屏
setContentView(R.layout.activity_tooth_brush_wifi_ble);
findViewById(R.id.wifistatus).setOnClickListener(this);
findViewById(R.id.sn).setOnClickListener(this);
findViewById(R.id.scan_wifi).setOnClickListener(this);
findViewById(R.id.connect_wifi).setOnClickListener(this);
findViewById(R.id.disconnect).setOnClickListener(this);
findViewById(R.id.setedname).setOnClickListener(this);
findViewById(R.id.support_unit).setOnClickListener(this);
findViewById(R.id.default_try_out).setOnClickListener(this);
findViewById(R.id.default_time_mode).setOnClickListener(this);
findViewById(R.id.default_mode).setOnClickListener(this);
findViewById(R.id.ota).setOnClickListener(this);

mEditText = findViewById(R.id.select_wifi_et);
select_gears_et = findViewById(R.id.select_gears_et);

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
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
}

@Override
public void onServiceSuccess() {

//与服务建立连接
mList.add(0, "服务与界面建立连接成功");
// mList.add(0, "搜索设备");
mMHandler.sendEmptyMessage(ToRefreUi);
mBluetoothService.setOnCallback(this);
mBluetoothService.scanLeDevice(30 * 1000);


}


@Override
public void onServiceErr() {

}

@Override
public void unbindServices() {

}

@Override
public void onStartScan() {

}

@Override
public void onScanning(BleValueBean data) {
BleLog.i(TAG, "MAC=" + mAddress + "||CID=" + data.getCid() + "||VID=" + data.getVid() + "||PID=" + data.getPid());
if (data.getMac().equalsIgnoreCase(mAddress)) {
mBluetoothService.connectDevice(data.getMac());
}
}

@Override
public void onScanTimeOut() {

}

@Override
public void onConnecting(String mac) {

}

@Override
public void onDisConnected(String mac, int code) {
mList.add(0, "蓝牙已断开");
mMHandler.sendEmptyMessage(ToRefreUi);
}

@Override
public void onServicesDiscovered(String mac) {
mList.add(0, "蓝牙已连接");
mMHandler.sendEmptyMessage(ToRefreUi);
mBluetoothService.setOnCallback(this);
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress);
if (bleDevice != null) {

ToothBrushWiFiBleUtilsData.init(bleDevice, this, this);
mToothBrushWiFiBleUtilsData = ToothBrushWiFiBleUtilsData.getInstance();
mMHandler.sendEmptyMessageDelayed(ToRequestToken, 600);
mMHandler.sendEmptyMessageDelayed(GETBATTERY, 800);
}
}

@Override
public void bleOpen() {

}

@Override
public void bleClose() {

}


@Override
public void OnBleAndWifiStatus(int blestatus, int wifistatus, int workstatus) {
BleLog.e(TAG, "蓝牙状态:" + blestatus + " wifi状态:" + " 工作状态:" + workstatus);
mList.add(0, "蓝牙状态:" + blestatus + " wifi状态:" + wifistatus + " 工作状态:" + workstatus);
mMHandler.sendEmptyMessage(ToRefreUi);

}

@Override
public void OnWifiScanStatus(int Status) {
mList.add(0, "扫描wifi状态: " + Status);
mMHandler.sendEmptyMessage(ToRefreUi);
}

private HashMap<Integer, String> mHashMap = new HashMap();

@Override
public void OnWifiListName(int no, String name) {

mHashMap.put(no, name);
mMHandler.sendEmptyMessage(ToRefreUi);
}

private HashMap<Integer, String> wifimacMap = new HashMap();

@Override
public void OnWifiListInfo(int no, String mac, int db, int type, int wifistatus) {

wifimacMap.put(no, mac);
mList.add(0, "WIFI序号: " + no + " WIFI名称:" + mHashMap.get(no) + " WIFImac: " + mac + " db: " + db + " type: " + type + " wifistata" + wifistatus);
mMHandler.sendEmptyMessage(ToRefreUi);
}

@Override
public void OnWifiCurrentConnect(String name) {
mList.add(0, "当前连接wifi名称: " + name);
mMHandler.sendEmptyMessage(ToRefreUi);
}

@Override
public void OnWifiScanFinish(int wifiNum) {
mList.add(0, "扫描结束 扫描的wifi个数 " + wifiNum);
mMHandler.sendEmptyMessage(ToRefreUi);
}

private boolean issetMac = false;

/**
* @param type {@link CmdConfig#SET_WIFI_MAC}
* @param status {@link ToothBrushBleCmd#STATUS_SUCCESS}
*/
@Override
public void OnSetWifiNameOrPwdOrConnectCallback(int type, int status) {
if (type == CmdConfig.SET_WIFI_MAC) {
mList.add(0, "获取到设置的mac地址状态 " + status);
if (status == ToothBrushBleCmd.STATUS_SUCCESS) {
issetMac = true;
setPaw(dataPaw);
}

}
if (type == CmdConfig.SET_WIFI_PWD) {
mList.add(0, "获取到设置的密码状态 " + status);

if (status == ToothBrushBleCmd.STATUS_SUCCESS && issetMac) {
mMHandler.sendEmptyMessage(ConnectWifi);
}
}
if (type == CmdConfig.DISCONNECT_WIFI) {
mList.add(0, "发起连接 " + status);
mMHandler.sendEmptyMessage(ToRefreUi);
}

}

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

@Override
public void getSelectWifiPaw(String paw) {
mList.add(0, "获取到设置的wifi的密码 " + paw);
mMHandler.sendEmptyMessage(ToRefreUi);
}


@Override
public void getDid(long sn) {
mList.add(0, "sn: " + sn);
mMHandler.sendEmptyMessage(ToRefreUi);
}

@Override
public void onClick(View v) {
int id = v.getId();
if (mToothBrushWiFiBleUtilsData != null)
switch (id) {
case R.id.wifistatus:

mToothBrushWiFiBleUtilsData.queryBleStatus();
break;
case R.id.sn:
mToothBrushWiFiBleUtilsData.getDevicedid();
break;
case R.id.scan_wifi:
mToothBrushWiFiBleUtilsData.scanWifi();
break;
case R.id.connect_wifi:
try {
int selectWifi = Integer.valueOf(mEditText.getText().toString().trim());
if (mHashMap.get(selectWifi) != null && wifimacMap.get(selectWifi) != null) {
WifiDialog.newInstance().setTitle(mHashMap.get(selectWifi), wifimacMap.get(selectWifi)).setOnDialogListener(new WifiDialog.OnDialogListener() {
@Override
public void tvCancelListener(View v) {

}

@Override
public void tvSucceedListener(View v, String data) {

if (data.equals("") || data.length() > 8) {
dataPaw = data.trim();
mToothBrushWiFiBleUtilsData.setWifimac(wifimacMap.get(selectWifi));
} else {
Toast.makeText(ToothBrushWifiBleActivity.this, "密码格式不对", Toast.LENGTH_SHORT).show();
}
}

@Override
public void etModifyName(EditText v) {

}
}).show(getSupportFragmentManager());
}
} catch (NumberFormatException e) {
e.printStackTrace();
mMHandler.sendEmptyMessage(ConnectWifi);
}

break;

case R.id.setedname:
mToothBrushWiFiBleUtilsData.getConnectWifiName();
break;
case R.id.disconnect:
mToothBrushWiFiBleUtilsData.disconnectWifi();
break;
case R.id.support_unit:
mToothBrushWiFiBleUtilsData.getSupportGears();
break;
case R.id.default_mode:
String gear = select_gears_et.getText().toString().trim();
if (!gear.isEmpty()) {
String[] gears = null;
if (gear.contains(",")) {
gears = gear.split(",");
} else if (gear.contains(",")) {
gears = gear.split(",");
} else {
Toast.makeText(this, "请输入时长,档位,档位级别(数字加符号)", Toast.LENGTH_SHORT).show();
}
if (gears != null) {
try {
mToothBrushWiFiBleUtilsData.setDefault(Integer.parseInt(gears[0]), Integer.parseInt(gears[1]), Integer.parseInt(gears[2]));
} catch (NumberFormatException e) {
e.printStackTrace();
Toast.makeText(this, "请输入时长,档位,档位级别(数字加符号)", Toast.LENGTH_SHORT).show();
}

}
}
break;
case R.id.default_try_out:
String gear1 = select_gears_et.getText().toString().trim();
if (!gear1.isEmpty()) {
String[] gears = null;
if (gear1.contains(",")) {
gears = gear1.split(",");
} else if (gear1.contains(",")) {
gears = gear1.split(",");
} else {
Toast.makeText(this, "请输入时长,档位,档位级别(数字加符号)", Toast.LENGTH_SHORT).show();
}
if (gears != null) {
try {
mToothBrushWiFiBleUtilsData.setTryOut(Integer.parseInt(gears[1]), Integer.parseInt(gears[2]), 0, 0);
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(this, "请输入时长,档位,档位级别(数字加符号)", Toast.LENGTH_SHORT).show();
}

}
}

break;
case R.id.default_time_mode:

mToothBrushWiFiBleUtilsData.getDefaultGearAndDuration();
break;

case R.id.ota:

mToothBrushWiFiBleUtilsData.setOta();

break;
}

}

private final int ToRefreUi = 300;
private final int ConnectWifi = 400;
private final int ToRequestToken = 500;
private final int GETBATTERY = 600;


@Override
public void onVersion(String version) {
mList.add(0, "版本号:" + version);
mMHandler.sendEmptyMessage(ToRefreUi);
}

@Override
public void onGetSupportGears(List<Integer> staif, List<Integer> secondLevel) {
mList.add(0, "牙刷支持的一级档位:" + Arrays.toString(staif.toArray()) + " 二级档位:" + Arrays.toString(secondLevel.toArray()));
mMHandler.sendEmptyMessage(ToRefreUi);
}

@Override
public void onGetBattery(int batteryStatus, int batteryQuantity) {
mList.add(0, "电池状态:" + batteryStatus + " 电量:" + batteryQuantity);
mMHandler.sendEmptyMessage(ToRefreUi);
}

@Override
public void onGetDefaultGearAndDuration(int time, int gear, int gearFrom) {
mList.add(0, "获得到默认的刷牙档位和时长:" + time + " 档位:" + gear + " 档位级别" + gearFrom);
mMHandler.sendEmptyMessage(ToRefreUi);
}

@Override
public void onGetTokenResult(int result) {
String s = "";
if (result == ToothBrushBleCmd.NO_TOKEN) {
s = "没有";
} else if (result == ToothBrushBleCmd.HAS_TOKEN) {
s = "已经授权";
} else if (result == ToothBrushBleCmd.WITHOUT_TOKEN) {
s = "不需要授权";
} else if (result == ToothBrushBleCmd.SUCCESSTOKEN) {
s = "授权成功";
}
mList.add(0, "请求授权结果" + result + " " + s);
mMHandler.sendEmptyMessage(ToRefreUi);
}

@Override
public void onGetManualParameter(int time, int hz, int duty) {
mList.add(0, " 获取手动档位的参数: 时长" + time + " 频率" + hz + " 占空比" + duty);
mMHandler.sendEmptyMessage(ToRefreUi);
}

@Override
public void onSetDefaultModeAndManualModeResult(byte type, int result) {
String s = "";
if (result == 0) {
s = "设置成功";
} else if (result == 1) {
s = "设置失败";
} else if (result == 2) {
s = "不支持设置";
}
if (type == ToothBrushBleCmd.SET_TOOTHBRUSH_TIME_GEARS) {
mList.add(0, " 设置默认刷牙时长和工作档位: 结果" + result + " " + s);
mMHandler.sendEmptyMessage(ToRefreUi);
} else {
mList.add(0, " 设置手动设置(自定义)档位: 结果" + result + " " + s);
mMHandler.sendEmptyMessage(ToRefreUi);
}
}

@Override
public void onTestFinish(int totalTime, int leftTime, int rightTime, int mode, int battery) {
mList.add(0, "刷牙完成: 总时长:" + totalTime + " 左时长:" + leftTime + " 右时长:" + rightTime + " 模式:" + mode + " 电量:" + battery);
mMHandler.sendEmptyMessage(ToRefreUi);
}

@Override
public void onTryOutResult(int result) {
mList.add(0, "设置使用结果:" + result + " ( 0:设置成功 1:设置失败,原因未知 2:不支持设置)");
mMHandler.sendEmptyMessage(ToRefreUi);
}

@Override
public void onTwoLevelModeDefault(int mode) {
mList.add(0, "获取二级档位默认值:" + mode);
mMHandler.sendEmptyMessage(ToRefreUi);
}


@Override
public void onOTA(int status) {
String s = " ";
switch (status) {
case 0x00:
s = "wifiOTA 成功";
break;
case 0x01:
s = "wifiOTA 失败";
break;
case 0x02:
s = "不支持 wifiOTA";
break;
case 0x03:
s = "模块主动开始 wifiOTA(MCU 收到该指 令后不能断电,需要等待 OTA 成功或者失败)";
break;
}
mList.add(0, s);
mMHandler.sendEmptyMessage(ToRefreUi);
}

@Override
public void onShowData(String data) {

}

private class MHandler extends Handler {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case ToRefreUi:
if (listAdapter != null) {
listAdapter.notifyDataSetChanged();
}
break;
case ConnectWifi:
mToothBrushWiFiBleUtilsData.connectWifi();
break;
case ToRequestToken:
mList.add(0, "请求授权");
mToothBrushWiFiBleUtilsData.requestToken(System.currentTimeMillis());
if (listAdapter != null) {
listAdapter.notifyDataSetChanged();
}
break;
case GETBATTERY:
mToothBrushWiFiBleUtilsData.getBattery();
break;
}
}
}


/**
* wifi密码一次只能传14个byte
* 如果密码长度超过14个byte 就需要分包传送
* subpackage 为0 时,表示后面还有数据
* subpackage 为1 时,表示数据小于或等于14个byte,后面没有数据
*
* @param paw
*/
private void setPaw(String paw) {
if (paw.isEmpty()) {
byte[] bytes = new byte[0];
mToothBrushWiFiBleUtilsData.setWifiPwd(0, bytes);
} else {
byte[] password = BleStrUtils.stringToBytes(paw);
if (password != null) {
if (password.length < 14)
mToothBrushWiFiBleUtilsData.setWifiPwd(0, password);

else {
boolean isend = false;
int i = 0;
byte[] byte1 = password;
while (!isend) {
if (byte1.length > 14) {
byte[] bytes = new byte[14];
System.arraycopy(password, i, bytes, 0, bytes.length);

mToothBrushWiFiBleUtilsData.setWifiPwd(1, bytes);
i = i + 14;
byte1 = Arrays.copyOf(password, password.length - i);
} else {
isend = true;
byte[] bytes = new byte[password.length - i];
System.arraycopy(password, i, bytes, 0, bytes.length);
mToothBrushWiFiBleUtilsData.setWifiPwd(1, bytes);

}

}


}
}
}
}

}

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

import android.widget.EditText; import android.widget.EditText;
import android.widget.ListView; import android.widget.ListView;


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

import com.pingwang.bluetoothlib.device.BleDevice; import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.device.BleSendCmdUtil; import com.pingwang.bluetoothlib.device.BleSendCmdUtil;
import com.pingwang.bluetoothlib.device.SendBleBean; import com.pingwang.bluetoothlib.device.SendBleBean;


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





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

import android.widget.ListView; import android.widget.ListView;
import android.widget.TextView; import android.widget.TextView;


import androidx.annotation.Nullable;

import com.pingwang.bluetoothlib.bean.SupportUnitBean; import com.pingwang.bluetoothlib.bean.SupportUnitBean;
import com.pingwang.bluetoothlib.device.BleDevice; import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.device.BleSendCmdUtil; import com.pingwang.bluetoothlib.device.BleSendCmdUtil;


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


/** /**
// BleLog.i(TAG, "服务与界面建立连接成功"); // BleLog.i(TAG, "服务与界面建立连接成功");
//与服务建立连接 //与服务建立连接
if (mBluetoothService != null) { if (mBluetoothService != null) {
mBluetoothService.setOnCallback(this);
mBluetoothService.setOnCallbackBle(this);
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress); BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress);
if (bleDevice != null) { if (bleDevice != null) {
if (tv_device_info!=null) { if (tv_device_info!=null) {


@Override @Override
public void unbindServices() { public void unbindServices() {

if (mBluetoothService!=null) {
mBluetoothService.removeOnCallbackBle(this);
}
} }






@Override @Override
public void showData(String data, int type) { public void showData(String data, int type) {
mlogList.add(0, "收 payload数据" + TimeUtils.getTime() +"cid=" + type + "\n" + data);
mlogList.add(0, "收 payload数据" + TimeUtils.getTimeSSS() +"cid=" + type + "\n" + data);
mMHandler.sendEmptyMessage(ToRefreUi); mMHandler.sendEmptyMessage(ToRefreUi);
} }




@Override @Override
public void sendData(String data) { public void sendData(String data) {
mlogList.add(0, "发 " + TimeUtils.getTime() + data);
mlogList.add(0, "发 " + TimeUtils.getTimeSSS() + data);
mMHandler.sendEmptyMessage(ToRefreUi); mMHandler.sendEmptyMessage(ToRefreUi);
} }



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

import android.widget.ListView; import android.widget.ListView;
import android.widget.RadioButton; import android.widget.RadioButton;


import androidx.annotation.Nullable;

import com.pingwang.bluetoothlib.bean.BleValueBean; import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.config.CmdConfig; import com.pingwang.bluetoothlib.config.CmdConfig;
import com.pingwang.bluetoothlib.device.BleDevice; import com.pingwang.bluetoothlib.device.BleDevice;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig; import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.AddUserDialog; import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.AddUserDialog;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.BodyFatScale.AppHistoryRecordBean; import cn.net.aicare.modulelibrary.module.BodyFatScale.AppHistoryRecordBean;
import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatBleUtilsData; import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatBleUtilsData;
import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatDataUtil; import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatDataUtil;
// BleLog.i(TAG, "服务与界面建立连接成功"); // BleLog.i(TAG, "服务与界面建立连接成功");
//与服务建立连接 //与服务建立连接
if (mBluetoothService != null) { if (mBluetoothService != null) {
mBluetoothService.setOnCallback(this);
mBluetoothService.setOnCallbackBle(this);
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress); BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress);
if (bleDevice != null) { if (bleDevice != null) {
BodyFatBleUtilsData.init(bleDevice, this, null); BodyFatBleUtilsData.init(bleDevice, this, null);
public void unbindServices() { public void unbindServices() {
mlogList.add(0, "服务与界面建立断开连接成功"); mlogList.add(0, "服务与界面建立断开连接成功");
mMHandler.sendEmptyMessage(ToRefreUi); mMHandler.sendEmptyMessage(ToRefreUi);
if (mBluetoothService!=null) {
mBluetoothService.removeOnCallbackBle(this);
}
} }


@Override @Override
mMHandler.sendEmptyMessage(ToRefreUi); mMHandler.sendEmptyMessage(ToRefreUi);
} }


private String mOldData = "";

@Override @Override
public void onWeightData(int status, float weight, int weightUnit, int decimals) { public void onWeightData(int status, float weight, int weightUnit, int decimals) {
mlogList.add(0, "体重数据类型:" + status + " 体重: " + weight + " 单位:" + weightUnit + " 小数点位: " + decimals);
String data = "体重数据类型:" + (status==BodyFatDataUtil.WEIGHT_TESTING?"实时":"稳定") + "\n体重: " + weight + " 单位:" + weightUnit + " 小数点位: " + decimals;
if (mOldData.equals(data)) {
return;
}
mOldData = data;
mlogList.add(0, data);
mMHandler.sendEmptyMessage(ToRefreUi); mMHandler.sendEmptyMessage(ToRefreUi);
} }


private int mOldStatus = -1;

@Override @Override
public void onStatus(int status) { public void onStatus(int status) {
if (mOldStatus == status) {
return;
}
mOldStatus = status;


switch (status) { switch (status) {
case BodyFatDataUtil.WEIGHT_TESTING: case BodyFatDataUtil.WEIGHT_TESTING:

+ 122
- 80
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/WeightScaleWifiBleActivity.java View File

import android.content.Intent; import android.content.Intent;
import android.content.pm.ActivityInfo; import android.content.pm.ActivityInfo;
import android.net.Uri; import android.net.Uri;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Environment;
import android.os.Handler; import android.os.Handler;
import android.os.Message; import android.os.Message;
import android.text.TextUtils;
import android.view.View; import android.view.View;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.CompoundButton; import android.widget.CompoundButton;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ListView; import android.widget.ListView;
import android.widget.RadioButton; import android.widget.RadioButton;
import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;


import com.elinkthings.bleotalibrary.listener.OnBleOTAListener;
import com.elinkthings.bleotalibrary.netstrap.OPLOtaManager;
import androidx.activity.result.ActivityResultLauncher;
import androidx.annotation.Nullable;

import com.pingwang.bluetoothlib.bean.BleValueBean; import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.config.CmdConfig; import com.pingwang.bluetoothlib.config.CmdConfig;
import com.pingwang.bluetoothlib.device.BleDevice; import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.utils.BleLog; import com.pingwang.bluetoothlib.utils.BleLog;
import com.pingwang.bluetoothlib.utils.BleStrUtils; import com.pingwang.bluetoothlib.utils.BleStrUtils;


import java.io.File;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;


import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig; import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.DialogStringImageBean;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.ShowListDialogFragment;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.WifiDialog; import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.WifiDialog;
import androidx.annotation.Nullable;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.FileUtils;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.ResultContact;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.SP;
import cn.net.aicare.modulelibrary.module.BodyFatScale.AppHistoryRecordBean; import cn.net.aicare.modulelibrary.module.BodyFatScale.AppHistoryRecordBean;
import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatBleUtilsData; import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatBleUtilsData;
import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatDataUtil; import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatDataUtil;
private RadioButton kg, jing, stlb, lb; private RadioButton kg, jing, stlb, lb;


private EditText et_ip, et_url, et_port; private EditText et_ip, et_url, et_port;
private TextView tv_path;


private byte[] testIp = new byte[]{0x74, 0x65, 0x73, 0x74, 0x2e, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x72, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x61, 0x69, 0x63, 0x61, 0x72, 0x65, 0x2e,
0x6e, 0x65, 0x74, 0x2e, 0x63, 0x6e};
private byte[] testIp = new byte[]{0x74, 0x65, 0x73, 0x74, 0x2e, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x72, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x61, 0x69, 0x63, 0x61, 0x72, 0x65, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x63, 0x6e};


private byte[] productIp = new byte[]{0x61, 0x69, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x69, 0x6f, 0x74, 0x2e, 0x61, 0x69, 0x63, 0x61, 0x72, 0x65, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x63, 0x6e}; private byte[] productIp = new byte[]{0x61, 0x69, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x69, 0x6f, 0x74, 0x2e, 0x61, 0x69, 0x63, 0x61, 0x72, 0x65, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x63, 0x6e};


private byte[] IpUrl = new byte[]{0x2f, 0x64, 0x65, 0x76, 0x69, 0x76, 0x63, 0x64, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x64, 0x72, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x2f}; private byte[] IpUrl = new byte[]{0x2f, 0x64, 0x65, 0x76, 0x69, 0x76, 0x63, 0x64, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x64, 0x72, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x2f};
private boolean isTest = false; private boolean isTest = false;
private ArrayList<DialogStringImageBean> mDialogList;

private ActivityResultLauncher<Boolean> launcher;


@Override @Override
protected void onCreate(@Nullable Bundle savedInstanceState) { protected void onCreate(@Nullable Bundle savedInstanceState) {
findViewById(R.id.check_ip).setOnClickListener(this); findViewById(R.id.check_ip).setOnClickListener(this);
findViewById(R.id.check_port).setOnClickListener(this); findViewById(R.id.check_port).setOnClickListener(this);
findViewById(R.id.check_url).setOnClickListener(this); findViewById(R.id.check_url).setOnClickListener(this);
findViewById(R.id.reset).setOnClickListener(this);
findViewById(R.id.btn_select_file).setOnClickListener(this);


et_ip = findViewById(R.id.et_ip); et_ip = findViewById(R.id.et_ip);
et_port = findViewById(R.id.et_port); et_port = findViewById(R.id.et_port);
ListView listView = findViewById(R.id.log_list); ListView listView = findViewById(R.id.log_list);
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList);
listView.setAdapter(listAdapter); listView.setAdapter(listAdapter);

tv_path = findViewById(R.id.tv_path);
tv_path.setText("文件路径:手机" + File.separator + Environment.DIRECTORY_DOCUMENTS + File.separator + FileUtils.FILE_DIR);

WeakReference weakReference = new WeakReference(new MHandler()); WeakReference weakReference = new WeakReference(new MHandler());
mMHandler = (MHandler) weakReference.get(); mMHandler = (MHandler) weakReference.get();
kg.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { kg.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
} }
}); });



FileUtils.init();
mDialogList = new ArrayList<>();
initLauncher();
} }


private void initLauncher() {
launcher = registerForActivityResult(new ResultContact(), result -> {
if (!TextUtils.isEmpty(result)) {
SP.getInstance().putOtaFileName(result);
mList.add(0, "选择文件:" + result);
listAdapter.notifyDataSetChanged();
}
});
}


@Override @Override
public void onServiceSuccess() { public void onServiceSuccess() {
BleLog.i(TAG, "服务与界面建立连接成功"); BleLog.i(TAG, "服务与界面建立连接成功");
//与服务建立连接 //与服务建立连接
if (mBluetoothService != null) { if (mBluetoothService != null) {
mBluetoothService.setOnCallback(this);
mBluetoothService.setOnCallbackBle(this);
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress); BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress);
if (bleDevice != null) { if (bleDevice != null) {
BodyFatBleUtilsData.init(bleDevice, this, this); BodyFatBleUtilsData.init(bleDevice, this, this);


@Override @Override
public void unbindServices() { public void unbindServices() {

if (mBluetoothService != null) {
mBluetoothService.removeOnCallbackBle(this);
}
} }


@Override @Override


} }


private String mOldData = "";

@Override @Override
public void onWeightData(int status, float weight, int weightUnit, int decimals) { public void onWeightData(int status, float weight, int weightUnit, int decimals) {
mList.add(0, "体重数据类型:" + status + " 体重: " + weight + " 单位:" + weightUnit + " 小数点位: " + decimals);
String data = "体重数据类型:" + (status==BodyFatDataUtil.WEIGHT_TESTING?"实时":"稳定") + "\n体重: " + weight + " 单位:" + weightUnit + " 小数点位: " + decimals;
if (mOldData.equals(data)) {
return;
}
mOldData = data;
mList.add(0, mOldData);
mMHandler.sendEmptyMessage(ToRefreUi); mMHandler.sendEmptyMessage(ToRefreUi);
} }


private int mOldStatus = -1;

@Override @Override
public void onStatus(int status) { public void onStatus(int status) {
if (mOldStatus == status) {
return;
}
mOldStatus = status;


switch (status) { switch (status) {
case BodyFatDataUtil.WEIGHT_TESTING: case BodyFatDataUtil.WEIGHT_TESTING:
public void onHistoryMcu(McuHistoryRecordBean mcuHistoryRecordBean) { public void onHistoryMcu(McuHistoryRecordBean mcuHistoryRecordBean) {
mList.add(0, "历史记录Mcu:" + mcuHistoryRecordBean.toString()); mList.add(0, "历史记录Mcu:" + mcuHistoryRecordBean.toString());
mMHandler.sendEmptyMessage(ToRefreUi); mMHandler.sendEmptyMessage(ToRefreUi);
// mMHandler.sendEmptyMessage(ToRefreUi);
// mMHandler.sendEmptyMessage(ToRefreUi);
} }


@Override @Override
@Override @Override
public void OnWifiListName(int no, String name) { public void OnWifiListName(int no, String name) {


// mList.add(0,"WIFI序号: "+no+" WIFI名称: "+name);
// mList.add(0,"WIFI序号: "+no+" WIFI名称: "+name);
mHashMap.put(no, name); mHashMap.put(no, name);
mMHandler.sendEmptyMessage(ToRefreUi); mMHandler.sendEmptyMessage(ToRefreUi);
} }


@Override @Override
public void onSetIpStatus(int status) { public void onSetIpStatus(int status) {
// if (status == 0) {
// if (isTest) {
// mList.add(0, "设置环境IP为生产环境成功");
// mList.add(0, "设置环境路径为生产环境");
// } else {
// mList.add(0, "设置环境IP为测试环境成功");
// mList.add(0, "设置环境路径为测试环境");
// }
// setIpUrl(IpUrl);
// } else {
// mList.add(0, "设置环境IP失败");
// }
// listAdapter.notifyDataSetChanged();
// if (status == 0) {
// if (isTest) {
// mList.add(0, "设置环境IP为生产环境成功");
// mList.add(0, "设置环境路径为生产环境");
// } else {
// mList.add(0, "设置环境IP为测试环境成功");
// mList.add(0, "设置环境路径为测试环境");
// }
// setIpUrl(IpUrl);
// } else {
// mList.add(0, "设置环境IP失败");
// }
// listAdapter.notifyDataSetChanged();
if (status == 0) { if (status == 0) {
mList.add(0, "设置环境IP成功"); mList.add(0, "设置环境IP成功");
int port = Integer.parseInt(et_port.getText().toString()); int port = Integer.parseInt(et_port.getText().toString());


@Override @Override
public void onSetIpUrlStatus(int status) { public void onSetIpUrlStatus(int status) {
// if (status == 0) {
// if (isTest) {
// mList.add(0, "设置环境路径为生产环境成功");
// isTest = false;
//
// } else {
// mList.add(0, "设置环境路径为测试环境成功");
// isTest = true;
//
// }
// } else {
// mList.add(0, "设置环境路径失败");
// }
// listAdapter.notifyDataSetChanged();
// if (status == 0) {
// if (isTest) {
// mList.add(0, "设置环境路径为生产环境成功");
// isTest = false;
//
// } else {
// mList.add(0, "设置环境路径为测试环境成功");
// isTest = true;
//
// }
// } else {
// mList.add(0, "设置环境路径失败");
// }
// listAdapter.notifyDataSetChanged();
if (status == 0) { if (status == 0) {
mList.add(0, "设置环境url成功"); mList.add(0, "设置环境url成功");
} else { } else {
public void onClick(View v) { public void onClick(View v) {
int id = v.getId(); int id = v.getId();
switch (id) { switch (id) {
case R.id.reset:
mList.add(0, "恢复出厂设置");
listAdapter.notifyDataSetChanged();
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().reset());
break;
case R.id.wifistatus: case R.id.wifistatus:
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().queryBleStatus()); bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().queryBleStatus());
break; break;
showFileChooser(); showFileChooser();
break; break;
case R.id.surroundings: case R.id.surroundings:
// if (isTest) {
// setIp(productIp);
// mList.add(0, "设置环境IP为生产环境");
//
// } else {
// setIp(testIp);
// mList.add(0, "设置环境IP为测试环境");
//
//
// }

String ipStr = et_ip.getText().toString(); String ipStr = et_ip.getText().toString();
setIp(convertToASCII(ipStr)); setIp(convertToASCII(ipStr));
mList.add(0, "设置环境IP为:" + ipStr); mList.add(0, "设置环境IP为:" + ipStr);
listAdapter.notifyDataSetChanged(); listAdapter.notifyDataSetChanged();
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().checkUrl()); bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().checkUrl());
break; 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());
}
break;

} }


} }



private byte[] convertToASCII(String string) { private byte[] convertToASCII(String string) {
char[] ch = string.toCharArray(); char[] ch = string.toCharArray();
byte[] tmp = new byte[ch.length]; byte[] tmp = new byte[ch.length];




private void setIp(byte[] ips) { private void setIp(byte[] ips) {
if (ips.length <= 14) {
if (ips.length <= 14)
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().environmentIp(0, ips)); bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().environmentIp(0, ips));
} else {
else {
boolean isend = false; boolean isend = false;
int i = 0; int i = 0;
byte[] byte1 = ips; byte[] byte1 = ips;
} }


private void setIpUrl(byte[] setIpUrl) { private void setIpUrl(byte[] setIpUrl) {
if (setIpUrl.length <= 14) {
if (setIpUrl.length <= 14)
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().environmentUrl(0, setIpUrl)); bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().environmentUrl(0, setIpUrl));
} else {
else {
boolean isend = false; boolean isend = false;
int i = 0; int i = 0;
byte[] byte1 = setIpUrl; byte[] byte1 = setIpUrl;
} else { } else {
byte[] password = BleStrUtils.stringToBytes(paw); byte[] password = BleStrUtils.stringToBytes(paw);
if (password != null) { if (password != null) {
if (password.length < 14) {
if (password.length < 14)
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().setWifiPwd(0, password)); bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().setWifiPwd(0, password));
} else {
else {
boolean isend = false; boolean isend = false;
int i = 0; int i = 0;
byte[] byte1 = password; byte[] byte1 = password;
if (resultCode == RESULT_OK) { if (resultCode == RESULT_OK) {
Uri uri = data.getData(); Uri uri = data.getData();
String path = uri.getPath(); String path = uri.getPath();
mList.add(0, "ota准备就绪,请勿操作");
SP.getInstance().put("WIFI_BLE_OTA_FILE_PATH", path);
mList.add(0, "选择文件:" + path);
listAdapter.notifyDataSetChanged(); listAdapter.notifyDataSetChanged();
OPLOtaManager build = OPLOtaManager.newBuilder(this).setFilePath(uri).setOnBleOTAListener(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;
} else {


@Override
public void onOtaProgress(float progress, int currentCount, int maxCount) {
if (mOldProgress != progress) {
mOldProgress = (int) progress;
mList.add(0, "otaProgress:" + progress);
listAdapter.notifyDataSetChanged();
}
}
}).build(bodyFatBleUtilsData.getBleDevice());
build.startOta();
} }
} }



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

import android.widget.ListView; import android.widget.ListView;
import android.widget.RadioButton; 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.JSONArray;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;


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



+ 3
- 29
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/adapter/StringAdapter.java View File

import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.TextView; import android.widget.TextView;


import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.pingwang.bluetoothlib.bean.BleValueBean; import com.pingwang.bluetoothlib.bean.BleValueBean;


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


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


/** /**
* xing<br> * xing<br>
} }




public static class DialogStringImageBean{

String mName;
long mType;

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

public String getName() {
return mName;
}

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

public long getType() {
return mType;
}

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

} }

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

import android.view.View; import android.view.View;
import android.widget.TextView; import android.widget.TextView;


import java.lang.ref.WeakReference;

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

import java.lang.ref.WeakReference;

import aicare.net.cn.sdk.ailinksdkdemoandroid.BuildConfig;
import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.HintDataDialogFragment;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.AppStart;
import butterknife.ButterKnife; import butterknife.ButterKnife;
import butterknife.Unbinder; import butterknife.Unbinder;



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

import android.view.View; import android.view.View;
import android.widget.TextView; import android.widget.TextView;


import java.lang.ref.WeakReference;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.Toolbar;


import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.HintDataDialogFragment; import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.HintDataDialogFragment;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.CheckPermissionUtils; import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.CheckPermissionUtils;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.Toolbar;

import java.lang.ref.WeakReference;

import butterknife.ButterKnife; import butterknife.ButterKnife;
import butterknife.Unbinder; import butterknife.Unbinder;



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

package aicare.net.cn.sdk.ailinksdkdemoandroid.base; package aicare.net.cn.sdk.ailinksdkdemoandroid.base;


import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle; import android.os.Bundle;
import android.os.IBinder;
import android.os.Handler;
import android.os.Looper;


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

import com.pingwang.bluetoothlib.AILinkBleManager;
import com.pingwang.bluetoothlib.bean.BleValueBean; import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.config.BleConfig; import com.pingwang.bluetoothlib.config.BleConfig;
import com.pingwang.bluetoothlib.server.ELinkBleServer;
import com.pingwang.bluetoothlib.utils.BleLog; import com.pingwang.bluetoothlib.utils.BleLog;

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



/** /**
* xing<br> * xing<br>
public abstract class BleBaseActivity extends AppCompatActivity { public abstract class BleBaseActivity extends AppCompatActivity {


private static String TAG = BleBaseActivity.class.getName(); private static String TAG = BleBaseActivity.class.getName();
protected ELinkBleServer mBluetoothService;
/**
* 服务Intent
*/
private Intent bindIntent;



protected AILinkBleManager mBluetoothService;
private Handler mHandler = new Handler(Looper.getMainLooper());


@Override @Override
protected void onCreate(@Nullable Bundle savedInstanceState) { protected void onCreate(@Nullable Bundle savedInstanceState) {
* @param timeOut 超时,小于等于0代表永不超时 * @param timeOut 超时,小于等于0代表永不超时
*/ */
protected void startScanBle(long timeOut){ protected void startScanBle(long timeOut){
if (mBluetoothService!=null){
mBluetoothService.scanLeDevice(timeOut,BleConfig.UUID_SERVER_AILINK);
if (AILinkBleManager.getInstance().isInitOk()){
AILinkBleManager.getInstance().startScan(timeOut,BleConfig.UUID_SERVER_AILINK);
} }
} }


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


* @param bleValueBean 搜索到的地址 * @param bleValueBean 搜索到的地址
*/ */
protected void connectBle(BleValueBean bleValueBean){ protected void connectBle(BleValueBean bleValueBean){
if (mBluetoothService!=null){
mBluetoothService.stopScan();
mBluetoothService.connectDevice(bleValueBean.getMac());
if (AILinkBleManager.getInstance().isInitOk()){
AILinkBleManager.getInstance().stopScan();
AILinkBleManager.getInstance().connectDevice(bleValueBean);
} }
} }


* @param mac 设备的地址 * @param mac 设备的地址
*/ */
protected void connectBle(String mac){ protected void connectBle(String mac){
if (mBluetoothService!=null){
mBluetoothService.stopScan();
mBluetoothService.connectDevice(mac);
if (AILinkBleManager.getInstance().isInitOk()){
AILinkBleManager.getInstance().stopScan();
AILinkBleManager.getInstance().connectDevice(mac);
} }
} }




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

if (!AILinkBleManager.getInstance().isInitOk()) {
AILinkBleManager.getInstance().init(this, new AILinkBleManager.onInitListener() {
@Override
public void onInitSuccess() {
mBluetoothService = AILinkBleManager.getInstance();
onServiceSuccess();
}

@Override
public void onInitFailure() {
AILinkBleManager.getInstance().clear();
mBluetoothService = null;
onServiceErr();
}
});
}else {
mHandler.postDelayed(()->{
mBluetoothService = AILinkBleManager.getInstance();
onServiceSuccess();
},500);
} }

} }


private void unbindService() { private void unbindService() {
unbindServices(); unbindServices();
if (mFhrSCon != null)
this.unbindService(mFhrSCon);
bindIntent = null;
} }







/**
* 服务连接与界面的连接
*/
private ServiceConnection mFhrSCon = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
BleLog.i(TAG, "服务与界面建立连接成功");
//与服务建立连接
mBluetoothService = ((ELinkBleServer.BluetoothBinder) service).getService();
onServiceSuccess();
}

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

/** /**
* 绑定服务成功 * 绑定服务成功
*/ */

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

package aicare.net.cn.sdk.ailinksdkdemoandroid.base;

import android.os.Bundle;

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

import com.pingwang.bluetoothlib.AILinkBleManager;
import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.config.BleConfig;
import com.pingwang.bluetoothlib.utils.BleLog;
import aicare.net.cn.sdk.ailinksdkdemoandroid.BuildConfig;
import aicare.net.cn.sdk.ailinksdkdemoandroid.R;

/**
* xing<br>
* 2019/4/25<br>
* 显示数据
*/
public abstract class BleNewBaseActivity extends AppCompatActivity {

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


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

private void init() {
bindService();

}

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

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




/**
* 连接设备
* @param bleValueBean 搜索到的地址
*/
protected void connectBle(BleValueBean bleValueBean){
if (AILinkBleManager.getInstance()!=null){
AILinkBleManager.getInstance().stopScan();
AILinkBleManager.getInstance().connectDevice(bleValueBean.getMac());
}
}

/**
* 连接设备
* @param mac 设备的地址
*/
protected void connectBle(String mac){
if (AILinkBleManager.getInstance()!=null){
AILinkBleManager.getInstance().stopScan();
AILinkBleManager.getInstance().connectDevice(mac);
}
}

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

private void bindService() {
if (!AILinkBleManager.getInstance().isInitOk()) {
AILinkBleManager.getInstance().init(this, new AILinkBleManager.onInitListener() {
@Override
public void onInitSuccess() {
onServiceSuccess();
}

@Override
public void onInitFailure() {
onServiceErr();
}
});
}else {
onServiceSuccess();
}

}

private void unbindService() {
unbindServices();
}


/**
* 绑定服务成功
*/
public abstract void onServiceSuccess();

/**
* 绑定服务失败
*/
public abstract void onServiceErr();

/**
* 解绑服务,去掉与服务相关的操作,接口等
*/
public abstract void unbindServices();


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

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

*/ */
public final static int TEMP_INSTRUMENT = 0x003D; public final static int TEMP_INSTRUMENT = 0x003D;


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




/** /**
*/ */
public final static int WEIGHT_SCALE = 0X0056; public final static int WEIGHT_SCALE = 0X0056;


/**
* 食物探针
*/
public final static int MEAT_PROBE = 0X003F;

/**
* 气压温湿度计
*/
public static final int BAROMETRIC_TEMP_HUMIDITY = 0x005C;


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



+ 44
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/config/UserUnitConfig.java View File

package aicare.net.cn.sdk.ailinksdkdemoandroid.config;

/**
* xing<br>
* 2019/7/26<br>
* java类作用描述
*/
public class UserUnitConfig {


//-------重量
public final static int USER_UNIT_KG = 0;
public final static int USER_UNIT_FG = 1;//斤
public final static int USER_UNIT_LB = 2;
public final static int USER_UNIT_OZ = 3;
public final static int USER_UNIT_ST = 4;
public final static int USER_UNIT_G = 5;
public final static int USER_UNIT_LB_LB = 6;
//-------身高
public final static int USER_UNIT_CM = 0;
public final static int USER_UNIT_INCH = 1;
public final static int USER_UNIT_FEET = 2;
public final static int USER_UNIT_M = 3;
//-------温度
public final static int USER_UNIT_C = 0;
public final static int USER_UNIT_F = 1;

//-------压力
public final static int USER_UNIT_MMHG = 0;
public final static int USER_UNIT_KPA = 1;

/**
* 热量卡
*/
public final static int USER_UNIT_CAL = 0;


/**
* 秒
*/
public final static int USER_UNIT_S = 0;


}

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

import android.widget.SeekBar; import android.widget.SeekBar;
import android.widget.TextView; import android.widget.TextView;


import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.fragment.app.DialogFragment; import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.FragmentManager; 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.BodyFatDataUtil;
import cn.net.aicare.modulelibrary.module.BodyFatScale.User; import cn.net.aicare.modulelibrary.module.BodyFatScale.User;



+ 3
- 29
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/DialogStringImageAdapter.java View File

import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.TextView; import android.widget.TextView;


import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

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


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


/** /**
* xing<br> * xing<br>
} }




public static class DialogStringImageBean{

String mName;
long mType;

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

public String getName() {
return mName;
}

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

public long getType() {
return mType;
}

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

} }

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

package aicare.net.cn.sdk.ailinksdkdemoandroid.dialog;

/**
* 对话框字符串bean
*
* @author xing
* @date 2023/07/21
*/
public class DialogStringImageBean {

private String mName;
private long mType;

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

public String getName() {
return mName;
}

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

public long getType() {
return mType;
}

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

@Override
public String toString() {
return "DialogStringImageBean{" + "mName='" + mName + '\'' + ", mType=" + mType + '}';
}
}

+ 15
- 14
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/HintDataDialogFragment.java View File

import android.view.WindowManager; import android.view.WindowManager;
import android.widget.TextView; import android.widget.TextView;


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


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



/** /**
* 显示信息的弹框 * 显示信息的弹框
* 是否居中 * 是否居中
*/ */
private boolean isCenter = false; private boolean isCenter = false;
private CharSequence mCancel;
private CharSequence mCancel = "";
@ColorInt @ColorInt
private int mCancelColor = 0; private int mCancelColor = 0;
private CharSequence mOkStr;
private CharSequence mOkStr = "";
@ColorInt @ColorInt
private int mOkColor = 0; private int mOkColor = 0;
@ColorInt @ColorInt
@NonNull @NonNull
@Override @Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
L.i(TAG, "onCreateDialog");
Dialog dialogView = new Dialog(requireContext(), R.style.MyDialog);// 创建自定义样式dialog Dialog dialogView = new Dialog(requireContext(), R.style.MyDialog);// 创建自定义样式dialog
dialogView.setCancelable(false);//设置是否可以关闭 dialogView.setCancelable(false);//设置是否可以关闭
dialogView.setCanceledOnTouchOutside(mCancelBlank);//设置点击空白处是否可以取消 dialogView.setCanceledOnTouchOutside(mCancelBlank);//设置点击空白处是否可以取消
@Override @Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) { @Nullable Bundle savedInstanceState) {
L.i(TAG, "onCreateView");
return inflater.inflate(R.layout.dialog_hint_data, container);// 得到加载view return inflater.inflate(R.layout.dialog_hint_data, container);// 得到加载view




@Override @Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) { public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState); super.onActivityCreated(savedInstanceState);
L.i(TAG, "onActivityCreated");
Dialog dialog = getDialog(); Dialog dialog = getDialog();
if (dialog != null) { if (dialog != null) {
getDialog().setOnShowListener(null); getDialog().setOnShowListener(null);
public HintDataDialogFragment initColor(@ColorInt int cancelColor, @ColorInt int okColor) { public HintDataDialogFragment initColor(@ColorInt int cancelColor, @ColorInt int okColor) {
this.mCancelColor = cancelColor; this.mCancelColor = cancelColor;
this.mOkColor = okColor; this.mOkColor = okColor;
if (mTvCancel != null && mCancelColor != 0)
if (mTvCancel != null && mCancelColor != 0) {
mTvCancel.setTextColor(mCancelColor); mTvCancel.setTextColor(mCancelColor);
if (mTvSucceed != null && mOkColor != 0)
}
if (mTvSucceed != null && mOkColor != 0) {
mTvSucceed.setTextColor(mOkColor); mTvSucceed.setTextColor(mOkColor);
}
return this; return this;
} }


} else if (mContent == null) { } else if (mContent == null) {
mTvContent.setVisibility(View.GONE); mTvContent.setVisibility(View.GONE);
} }
if (isCenter)
if (isCenter) {
mTvContent.setGravity(Gravity.CENTER); mTvContent.setGravity(Gravity.CENTER);
else
} else {
mTvContent.setGravity(Gravity.CENTER_VERTICAL); mTvContent.setGravity(Gravity.CENTER_VERTICAL);
}
} }
return this; return this;
} }
} else if (mOkStr == null) { } else if (mOkStr == null) {
mTvSucceed.setVisibility(View.GONE); mTvSucceed.setVisibility(View.GONE);
} }
if (mOkColor != 0)
if (mOkColor != 0) {
mTvSucceed.setTextColor(mOkColor); mTvSucceed.setTextColor(mOkColor);
}
} }
return this; return this;
} }
if (getActivity() != null) { if (getActivity() != null) {
getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm); getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm);
if (dialog.getWindow() != null) if (dialog.getWindow() != null)
{
//设置宽度为80% //设置宽度为80%
dialog.getWindow() dialog.getWindow()
.setLayout((int) (dm.widthPixels * 0.9), .setLayout((int) (dm.widthPixels * 0.9),
ViewGroup.LayoutParams.WRAP_CONTENT); ViewGroup.LayoutParams.WRAP_CONTENT);
}
} }
} }
} }
mShow = true; mShow = true;
} }
} catch (Exception e) { } catch (Exception e) {
L.e(TAG, "显示异常");
e.printStackTrace(); e.printStackTrace();
} }
} }
mShow = false; mShow = false;
super.dismiss(); super.dismiss();
} catch (Exception e) { } catch (Exception e) {
L.e(TAG, "关闭异常");
e.printStackTrace(); e.printStackTrace();
} }
} }

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

import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;


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


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



/** /**
* elink-android<br> * elink-android<br>
/** /**
* 默认超时时间 * 默认超时时间
*/ */
private int timeOut = 30;
private int timeOut = 10;
private boolean show = false; private boolean show = false;


public boolean isShow() { public boolean isShow() {

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

import android.view.WindowManager; import android.view.WindowManager;
import android.widget.TextView; import android.widget.TextView;


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

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L;
import aicare.net.cn.sdk.ailinksdkdemoandroid.view.MyItemDecoration;
import androidx.annotation.ColorInt; import androidx.annotation.ColorInt;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;


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

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

/** /**
* 列表显示的dialog * 列表显示的dialog
*/ */
private int mCancelColor; private int mCancelColor;
private CharSequence mCancel; private CharSequence mCancel;
private CharSequence mTitle; private CharSequence mTitle;
private ArrayList<DialogStringImageAdapter.DialogStringImageBean> mList;
private ArrayList<DialogStringImageBean> mList;
private boolean mBottom; private boolean mBottom;
/** /**
* 是否显示灰色背景 * 是否显示灰色背景
/** /**
* 初始化数据 * 初始化数据
*/ */
private void initData(ArrayList<DialogStringImageAdapter.DialogStringImageBean> list, CharSequence title, CharSequence cancel, int cancelColor) {
private void initData(ArrayList<DialogStringImageBean> list, CharSequence title, CharSequence cancel, int cancelColor) {


if (mList == null) if (mList == null)
mList = new ArrayList<>(); mList = new ArrayList<>();
/** /**
* 修改列表中的内容 * 修改列表中的内容
*/ */
public ShowListDialogFragment setList(List<DialogStringImageAdapter.DialogStringImageBean> list) {
public ShowListDialogFragment setList(List<DialogStringImageBean> list) {
if (mList == null) { if (mList == null) {
mList = new ArrayList<>(); mList = new ArrayList<>();
mList.addAll(list); mList.addAll(list);

+ 3
- 1
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/WifiDialog.java View File

import android.widget.EditText; import android.widget.EditText;
import android.widget.TextView; import android.widget.TextView;


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


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


public class WifiDialog extends DialogFragment implements View.OnClickListener { public class WifiDialog extends DialogFragment implements View.OnClickListener {


/** /**

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

import android.widget.ListView; import android.widget.ListView;
import android.widget.Toast; import android.widget.Toast;


import androidx.annotation.Nullable;

import com.pingwang.bluetoothlib.device.BleDevice; import com.pingwang.bluetoothlib.device.BleDevice;


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


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



+ 3
- 2
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/find/FindDeviceAdapter.java View File

import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.Button; import android.widget.Button;


import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

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


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


/** /**
* xing<br> * xing<br>

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

import android.widget.ListView; import android.widget.ListView;
import android.widget.TextView; import android.widget.TextView;


import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.pingwang.bluetoothlib.AILinkSDK; import com.pingwang.bluetoothlib.AILinkSDK;
import com.pingwang.bluetoothlib.bean.BleValueBean; import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.config.BleConfig; import com.pingwang.bluetoothlib.config.BleConfig;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleAppBaseActivity; import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleAppBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.SP; import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.SP;
import aicare.net.cn.sdk.ailinksdkdemoandroid.view.MyItemDecoration; import aicare.net.cn.sdk.ailinksdkdemoandroid.view.MyItemDecoration;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import cn.net.aicare.modulelibrary.module.findDevice.FindDeviceData; import cn.net.aicare.modulelibrary.module.findDevice.FindDeviceData;


public class FindDeviceNewActivity extends BleAppBaseActivity implements View.OnClickListener, OnCallbackBle, FindDeviceData.onNotifyData, OnScanFilterListener, FindDeviceAdapter.OnItemClickListener { public class FindDeviceNewActivity extends BleAppBaseActivity implements View.OnClickListener, OnCallbackBle, FindDeviceData.onNotifyData, OnScanFilterListener, FindDeviceAdapter.OnItemClickListener {
mFindDeviceAdapter.notifyDataSetChanged(); mFindDeviceAdapter.notifyDataSetChanged();
} }
mFindDeviceData.getConnectInfoList(); mFindDeviceData.getConnectInfoList();
mBluetoothService.scanLeDevice(30 * 1000);
mBluetoothService.startScan(30 * 1000);
} }
break; break;


@Override @Override
protected void onPermissionsOk() { protected void onPermissionsOk() {
if (mBluetoothService != null) { if (mBluetoothService != null) {
mBluetoothService.setOnCallback(this);
mBluetoothService.setOnCallbackBle(this);
mBleDevice = mBluetoothService.getBleDevice(mMac); mBleDevice = mBluetoothService.getBleDevice(mMac);
mBluetoothService.setOnScanFilterListener(this); mBluetoothService.setOnScanFilterListener(this);
if (mBleDevice != null) { if (mBleDevice != null) {
BleConfig.setHandshakeStatus(mMac, false); BleConfig.setHandshakeStatus(mMac, false);
mBluetoothService.stopScan(); mBluetoothService.stopScan();
mBluetoothService.connectDevice(mMac); mBluetoothService.connectDevice(mMac);
mBluetoothService.setOnCallback(this);
mBluetoothService.setOnCallbackBle(this);
} else if (bleValueBean.getName() == null || !bleValueBean.getName().trim().toUpperCase().startsWith(BLE_NAME_START.toUpperCase())) { } else if (bleValueBean.getName() == null || !bleValueBean.getName().trim().toUpperCase().startsWith(BLE_NAME_START.toUpperCase())) {
onNearbyDeviceInfo(bleValueBean.getMac(), bleValueBean.getRssi(), bleValueBean.getManufacturerData()); onNearbyDeviceInfo(bleValueBean.getMac(), bleValueBean.getRssi(), bleValueBean.getManufacturerData());
} }
if (tv_status != null) if (tv_status != null)
tv_status.setText("正在连接..."); tv_status.setText("正在连接...");
mHandler.sendEmptyMessage(REFRESH_DATA); mHandler.sendEmptyMessage(REFRESH_DATA);
mBluetoothService.scanLeDevice(0, BleConfig.UUID_SERVER_AILINK);
mBluetoothService.startScan(0, BleConfig.UUID_SERVER_AILINK);
} }


} }

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

import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.ListView; import android.widget.ListView;


import androidx.annotation.Nullable;

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


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


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


private ListView list_view; private ListView list_view;



app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/PublicBleNetworkCmdActivity.java → app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/PublicBleNetworkCmdActivity.java View File

package aicare.net.cn.sdk.ailinksdkdemoandroid;
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules;


import android.content.Context; import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ListView; import android.widget.ListView;


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

import com.pingwang.bluetoothlib.config.CmdConfig; import com.pingwang.bluetoothlib.config.CmdConfig;
import com.pingwang.bluetoothlib.device.BleDevice; import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.device.BleSendCmdUtil; import com.pingwang.bluetoothlib.device.BleSendCmdUtil;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; 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.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.WifiDialog; import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.WifiDialog;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatDataUtil; import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatDataUtil;





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

import android.widget.ListView; import android.widget.ListView;
import android.widget.Toast; import android.widget.Toast;


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

import com.pingwang.bluetoothlib.device.BleDevice; import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.device.BleSendCmdUtil; import com.pingwang.bluetoothlib.device.BleSendCmdUtil;
import com.pingwang.bluetoothlib.device.SendBleBean; import com.pingwang.bluetoothlib.device.SendBleBean;
import aicare.net.cn.sdk.ailinksdkdemoandroid.R; import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.TempInstrument.TempInstrumentBleConfig; import cn.net.aicare.modulelibrary.module.TempInstrument.TempInstrumentBleConfig;
import cn.net.aicare.modulelibrary.module.TempInstrument.TempInstrumentDeviceData; import cn.net.aicare.modulelibrary.module.TempInstrument.TempInstrumentDeviceData;



+ 9
- 4
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/airdetector/AirDetectorActivity.java View File

public void onServiceSuccess() { public void onServiceSuccess() {
mAddress = getIntent().getStringExtra("mac"); mAddress = getIntent().getStringExtra("mac");
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress); BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress);
mBluetoothService.setOnCallback(this);
mBluetoothService.setOnCallbackBle(this);
if (mAirDetectorWifeBleData == null) { if (mAirDetectorWifeBleData == null) {
AirDetectorWifeBleData.init(bleDevice); AirDetectorWifeBleData.init(bleDevice);
mAirDetectorWifeBleData = AirDetectorWifeBleData.getInstance(); mAirDetectorWifeBleData = AirDetectorWifeBleData.getInstance();


@Override @Override
public void unbindServices() { public void unbindServices() {

if (mBluetoothService!=null) {
mBluetoothService.removeOnCallbackBle(this);
}
} }


@Override @Override
String valueMin = ed_min.getText().toString().trim(); String valueMin = ed_min.getText().toString().trim();
float myValueMax = valueMax.contains("\\.") ? Float.parseFloat(valueMax) : Integer.parseInt(valueMax); float myValueMax = valueMax.contains("\\.") ? Float.parseFloat(valueMax) : Integer.parseInt(valueMax);
float myValueMin = valueMin.contains("\\.") ? Float.parseFloat(valueMin) : Integer.parseInt(valueMin); float myValueMin = valueMin.contains("\\.") ? Float.parseFloat(valueMin) : Integer.parseInt(valueMin);
sendDataBean = AirSendUtil.setWarmTemp(supportBean.getPoint(), supportBean.getUnit(), myValueMax, myValueMin,1);
int warmStateTemp = Integer.parseInt(ed_warm_state.getText().toString().trim());
sendDataBean = AirSendUtil.setWarmTemp(supportBean.getPoint(),
supportBean.getUnit(), myValueMax, myValueMin, warmStateTemp);
break; break;
case AirConst.AIR_TYPE_HUMIDITY: case AirConst.AIR_TYPE_HUMIDITY:
valueMax = ed_max.getText().toString().trim(); valueMax = ed_max.getText().toString().trim();
valueMin = ed_min.getText().toString().trim(); valueMin = ed_min.getText().toString().trim();
myValueMax = valueMax.contains("\\.") ? Float.parseFloat(valueMax) : Integer.parseInt(valueMax); myValueMax = valueMax.contains("\\.") ? Float.parseFloat(valueMax) : Integer.parseInt(valueMax);
myValueMin = valueMin.contains("\\.") ? Float.parseFloat(valueMin) : Integer.parseInt(valueMin); myValueMin = valueMin.contains("\\.") ? Float.parseFloat(valueMin) : Integer.parseInt(valueMin);
int warmStateHumi = Integer.parseInt(ed_warm_state.getText().toString().trim());
sendDataBean = AirSendUtil.setWarmHumidity(supportBean.getPoint(), sendDataBean = AirSendUtil.setWarmHumidity(supportBean.getPoint(),
myValueMax, myValueMin,1);
myValueMax, myValueMin, warmStateHumi);
break; break;
case AirConst.AIR_SETTING_VOICE: case AirConst.AIR_SETTING_VOICE:
warmState = Integer.parseInt(ed_warm_state.getText().toString().trim()); warmState = Integer.parseInt(ed_warm_state.getText().toString().trim());

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

builder.append("max : ").append(bean.getMax()).append(", min: ").append(bean.getMin()).append(", 小数点:").append(bean.getPoint()); builder.append("max : ").append(bean.getMax()).append(", min: ").append(bean.getMin()).append(", 小数点:").append(bean.getPoint());
break; break;
case AirConst.AIR_SETTING_WARM: case AirConst.AIR_SETTING_WARM:
builder.append("数值:").append(bean.getCurValue()).append(", ").append(AirUtil.dealWarnSwitch((int) bean.getCurValue()));
break;
case AirConst.AIR_SETTING_DEVICE_ERROR: case AirConst.AIR_SETTING_DEVICE_ERROR:
case AirConst.AIR_SETTING_DEVICE_SELF_TEST: case AirConst.AIR_SETTING_DEVICE_SELF_TEST:
case AirConst.AIR_RESTORE_FACTORY_SETTINGS: case AirConst.AIR_RESTORE_FACTORY_SETTINGS:
AlarmClockStatement alarmClockStatement = (AlarmClockStatement) bean.getExtentObject(); AlarmClockStatement alarmClockStatement = (AlarmClockStatement) bean.getExtentObject();
String alarmShow = "闹钟显示:" + alarmClockStatement.isShowIcon(); String alarmShow = "闹钟显示:" + alarmClockStatement.isShowIcon();
String alarmCount = ", 闹钟数量:" + alarmClockStatement.getAlarmCount(); String alarmCount = ", 闹钟数量:" + alarmClockStatement.getAlarmCount();
String supportDelete = ", 支持添加删除闹钟:" + alarmClockStatement.isSupportDelete();
String mode0 = ", 模式 0:一次性,当天有效:" + alarmClockStatement.isMode0(); String mode0 = ", 模式 0:一次性,当天有效:" + alarmClockStatement.isMode0();
String mode1 = ", 模式 1:每天都响:" + alarmClockStatement.isMode1(); String mode1 = ", 模式 1:每天都响:" + alarmClockStatement.isMode1();
String mode2 = ", 模式 2:周一至周五:" + alarmClockStatement.isMode2(); String mode2 = ", 模式 2:周一至周五:" + alarmClockStatement.isMode2();
String mode3 = ", 模式 3:周一至周六:" + alarmClockStatement.isMode3(); String mode3 = ", 模式 3:周一至周六:" + alarmClockStatement.isMode3();
String mode4 = ", 模式 4:自定义:" + alarmClockStatement.isMode4(); String mode4 = ", 模式 4:自定义:" + alarmClockStatement.isMode4();
builder.append(alarmShow).append(alarmCount).append(mode0).append(mode1).append(mode2).append(mode3).append(mode4);
builder.append(alarmShow).append(alarmCount).append(supportDelete).append(mode0).append(mode1).append(mode2).append(mode3).append(mode4);
break; break;
case AirConst.AIR_KEY_SOUND: case AirConst.AIR_KEY_SOUND:
case AirConst.AIR_ALARM_SOUND_EFFECT: case AirConst.AIR_ALARM_SOUND_EFFECT:
case AirConst.AIR_SETTING_SWITCH_TEMP_UNIT: case AirConst.AIR_SETTING_SWITCH_TEMP_UNIT:
builder.append("温度: ").append(bean.getCurValue() == 1 ? "1 - 支持" : "0 - 不支持"); builder.append("温度: ").append(bean.getCurValue() == 1 ? "1 - 支持" : "0 - 不支持");
break; break;
case AirConst.AIR_PROTOCOL_VERSION:
builder.append(bean.getCurValue());
break;
default: default:
break; break;
} }
case AirConst.AIR_MONITORING_DISPLAY_DATA: case AirConst.AIR_MONITORING_DISPLAY_DATA:
builder.append(AirUtil.getSwitchStatus(statusBean.isOpen())); builder.append(AirUtil.getSwitchStatus(statusBean.isOpen()));
break; break;
case AirConst.AIR_SETTING_SWITCH_TEMP_UNIT:
builder.append("可忽略,不处理");
break;
default: default:
break; break;
} }
int hPow = (int) Math.pow(10, supportBean.getPoint()); int hPow = (int) Math.pow(10, supportBean.getPoint());
String humpStr = "下限值:" + settingBean.getWarmMin() / hPow + ", 上限值: " + settingBean.getWarmMax() / hPow; String humpStr = "下限值:" + settingBean.getWarmMin() / hPow + ", 上限值: " + settingBean.getWarmMax() / hPow;
builder.append(humpStr); builder.append(humpStr);
builder.append(", 子开关:").append(AirUtil.getSwitchStatus(settingBean.isOpen()));
break; break;
case AirConst.AIR_TYPE_TEMP: case AirConst.AIR_TYPE_TEMP:
String tempStr = "下限值:" + settingBean.getWarmMin() + ", 上限值: " + settingBean.getWarmMax(); String tempStr = "下限值:" + settingBean.getWarmMin() + ", 上限值: " + settingBean.getWarmMax();
builder.append(tempStr); builder.append(tempStr);
builder.append(", 子开关:").append(AirUtil.getSwitchStatus(settingBean.isOpen()));
break;
case AirConst.AIR_SETTING_WARM:
builder.append(", 总开关:").append(AirUtil.getSwitchStatus(settingBean.isOpen()));
break; break;
case AirConst.AIR_SETTING_VOICE: case AirConst.AIR_SETTING_VOICE:
builder.append("开关:").append(AirUtil.getSwitchStatus(settingBean.isOpen())).append(", Level: ").append(settingBean.getValue()); builder.append("开关:").append(AirUtil.getSwitchStatus(settingBean.isOpen())).append(", Level: ").append(settingBean.getValue());

+ 36
- 3
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/airdetector/AirUtil.java View File

typeNameArray.append(AirConst.AIR_ICON_DISPLAY, "图标显示"); typeNameArray.append(AirConst.AIR_ICON_DISPLAY, "图标显示");
typeNameArray.append(AirConst.AIR_MONITORING_DISPLAY_DATA, "监控显示数据"); typeNameArray.append(AirConst.AIR_MONITORING_DISPLAY_DATA, "监控显示数据");
typeNameArray.append(AirConst.AIR_DATA_DISPLAY_MODE, "数据显示模式"); typeNameArray.append(AirConst.AIR_DATA_DISPLAY_MODE, "数据显示模式");
typeNameArray.append(AirConst.AIR_PROTOCOL_VERSION, "协议版本");
} }




} }
StringBuilder builder = new StringBuilder(); StringBuilder builder = new StringBuilder();
for (AlarmClockInfoList.AlarmInfo bean : list) { for (AlarmClockInfoList.AlarmInfo bean : list) {
builder.append(getSwitchStatus(bean.getSwitchStatus() == 1));
builder.append("编号:").append(bean.getId());
builder.append(", " + getSwitchStatus(bean.getSwitchStatus() == 1));
builder.append(", 删除:").append(bean.isDeleted()); builder.append(", 删除:").append(bean.isDeleted());
builder.append(", 编号:").append(bean.getId());
builder.append(", 模式:").append(bean.getMode()); builder.append(", 模式:").append(bean.getMode());
builder.append(", 闹钟时间:").append(bean.getHour()).append(":").append(bean.getMinute());
builder.append(", 闹钟时间:").append(dealTime(bean.getHour())).append(":").append(dealTime(bean.getMinute()));
builder.append(", 闹钟周期:").append(dealAlarmDay(bean.getAlarmDays())); builder.append(", 闹钟周期:").append(dealAlarmDay(bean.getAlarmDays()));
builder.append("\n"); builder.append("\n");
} }
} }
} }


private static String dealTime(int num){
if (num < 10) {
return "0" + num;
}
return num + "";
}

private static String dealAlarmDay(int[] days){ private static String dealAlarmDay(int[] days){
if (days == null) { if (days == null) {
return ""; return "";
builder.append("]"); builder.append("]");
return builder.toString(); return builder.toString();
} }

public static int[] getAlarmClockDayByMode(int mode){
switch (mode){
case 1:
return new int[]{0,1,1,1,1,1,1,1};
case 2:
return new int[]{0,1,1,1,1,1,0,0};
case 3:
return new int[]{0,1,1,1,1,1,1,0};
case 4:
return new int[]{0,1,1,0,1,1,0,1};
case 0:
default:
return new int[]{0,0,0,0,0,0,0,0};
}
}

public static String dealWarnSwitch(int val){
if (val == 1) {
return "各报警功能可单独设置开关";
} else if(val == 2){
return "报警功能只支持总开关";
}
return "未知";
}
} }

+ 63
- 18
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/airdetector_test/AirDetectorActivityTest.java View File



import aicare.net.cn.sdk.ailinksdkdemoandroid.R; import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleAppBaseActivity; import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleAppBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.airdetector.AirUtil;
import cn.net.aicare.modulelibrary.module.airDetector.AirConst; import cn.net.aicare.modulelibrary.module.airDetector.AirConst;
import cn.net.aicare.modulelibrary.module.airDetector.AirDetectorWifeBleData; import cn.net.aicare.modulelibrary.module.airDetector.AirDetectorWifeBleData;
import cn.net.aicare.modulelibrary.module.airDetector.AirSendUtil; import cn.net.aicare.modulelibrary.module.airDetector.AirSendUtil;
import cn.net.aicare.modulelibrary.module.airDetector.AlarmClockStatement;
import cn.net.aicare.modulelibrary.module.airDetector.StatusBean; import cn.net.aicare.modulelibrary.module.airDetector.StatusBean;
import cn.net.aicare.modulelibrary.module.airDetector.SupportBean; import cn.net.aicare.modulelibrary.module.airDetector.SupportBean;


private static final int STEP_CAL_TVOC = 36; // TVOC校准 private static final int STEP_CAL_TVOC = 36; // TVOC校准
private static final int STEP_CAL_CO = 37; // CO校准 private static final int STEP_CAL_CO = 37; // CO校准
private static final int STEP_SETTING_ALARM = 38; // 闹钟 private static final int STEP_SETTING_ALARM = 38; // 闹钟
private static final int STEP_SETTING_WARN_SWITCH = 39; // 报警总开关
// private static final int STEP_DEVICE_SELF_TEST = 18; // 设备自检 // private static final int STEP_DEVICE_SELF_TEST = 18; // 设备自检
// private static final int STEP_DEVICE_BIND = 18; // 设备绑定 // private static final int STEP_DEVICE_BIND = 18; // 设备绑定
// private static final int STEP_RESTORE_FACTORY_SETTINGS = 18; // 恢复出厂设置 // private static final int STEP_RESTORE_FACTORY_SETTINGS = 18; // 恢复出厂设置
private static final int STEP_DONE = 39;// 结束
private static final int STEP_DONE = 40;// 结束


private static final int RESULT_NULL = 0; private static final int RESULT_NULL = 0;
private static final int RESULT_SUCCESS = 1; private static final int RESULT_SUCCESS = 1;
finish(); finish();
return; return;
} }
mBluetoothService.setOnCallback(this);
mBluetoothService.setOnCallbackBle(this);
if (mAirDetectorWifeBleData == null) { if (mAirDetectorWifeBleData == null) {
// AirDetectorWifeBleData.init(bleDevice); // AirDetectorWifeBleData.init(bleDevice);
mAirDetectorWifeBleData = AirDetectorWifeBleData.getInstance(); mAirDetectorWifeBleData = AirDetectorWifeBleData.getInstance();
@Override @Override
public void unbindServices() { public void unbindServices() {
Log.i(TAG, "unbindServices"); Log.i(TAG, "unbindServices");
if (mBluetoothService!=null) {
mBluetoothService.removeOnCallbackBle(this);
}
} }


@Override @Override
public void onStatusList(SparseArray<StatusBean> statusList) { public void onStatusList(SparseArray<StatusBean> statusList) {
if (mStep == STEP_REALTIME_STATUS) { if (mStep == STEP_REALTIME_STATUS) {
stepSuccess(AirDetectorTestShowUtil.showTextStatus(statusList, deviceSupportList)); stepSuccess(AirDetectorTestShowUtil.showTextStatus(statusList, deviceSupportList));
} else if (mStep == STEP_CAL_HCHO || mStep == STEP_CAL_TEMP || mStep == STEP_CAL_HUMIDITY || mStep == STEP_CAL_PM2_5
|| mStep == STEP_CAL_PM1_0 || mStep == STEP_CAL_VOC || mStep == STEP_CAL_CO2 || mStep == STEP_CAL_AQI
|| mStep == STEP_CAL_TVOC || mStep == STEP_CAL_CO) {
if (statusList.get(AirConst.AIR_CALIBRATION_PARAMETERS) != null) {
stepSuccess(AirDetectorTestShowUtil.showCalSettingAfterTextStatus(statusList, deviceSupportList));
}
} }
} }


type = AirConst.AIR_TYPE_FORMALDEHYDE; type = AirConst.AIR_TYPE_FORMALDEHYDE;
if (isSupportWarmType(type)) { if (isSupportWarmType(type)) {
addTest("设置甲醛报警"); addTest("设置甲醛报警");
mAirDetectorWifeBleData.sendData(AirSendUtil.setWarmMaxByType(type, switchOpenFlag, 0.08f, deviceSupportList.get(type).getPoint()));
mAirDetectorWifeBleData.sendData(AirSendUtil.setWarmMaxByType(type, switchOpenFlag, 0.10f, deviceSupportList.get(type).getPoint()));
} }
break; break;
case STEP_WARM_TEMP: case STEP_WARM_TEMP:
type = AirConst.AIR_TYPE_TEMP; type = AirConst.AIR_TYPE_TEMP;
if (isSupportWarmType(type)) { if (isSupportWarmType(type)) {
addTest("设置温度报警"); addTest("设置温度报警");
mAirDetectorWifeBleData.sendData(AirSendUtil.setWarmTemp(0, AirConst.UNIT_C, 30f, 0f,1));
mAirDetectorWifeBleData.sendData(AirSendUtil.setWarmTemp(0, AirConst.UNIT_C, 30f, 0f, 1));
} }
break; break;
case STEP_WARM_HUMIDITY: case STEP_WARM_HUMIDITY:
type = AirConst.AIR_TYPE_HUMIDITY; type = AirConst.AIR_TYPE_HUMIDITY;
if (isSupportWarmType(type)) { if (isSupportWarmType(type)) {
addTest("设置湿度报警"); addTest("设置湿度报警");
mAirDetectorWifeBleData.sendData(AirSendUtil.setWarmHumidity(0, 60f, 7f,1));
mAirDetectorWifeBleData.sendData(AirSendUtil.setWarmHumidity(0, 60f, 7f, 1));
} }
break; break;
case STEP_WARM_PM2_5: case STEP_WARM_PM2_5:
case STEP_CAL_HCHO: case STEP_CAL_HCHO:
type = AirConst.AIR_TYPE_FORMALDEHYDE; type = AirConst.AIR_TYPE_FORMALDEHYDE;
if (isSupportCalType(type)) { if (isSupportCalType(type)) {
addTest("设置甲醛校准");
addTest("设置甲醛校准, 单位校准值加1");
mAirDetectorWifeBleData.sendData(AirSendUtil.setCalibrationParam(type, 0)); mAirDetectorWifeBleData.sendData(AirSendUtil.setCalibrationParam(type, 0));
} }
break; break;
case STEP_CAL_TEMP: case STEP_CAL_TEMP:
type = AirConst.AIR_TYPE_TEMP; type = AirConst.AIR_TYPE_TEMP;
if (isSupportCalType(type)) { if (isSupportCalType(type)) {
addTest("设置温度校准");
addTest("设置温度校准, 单位校准值加1");
mAirDetectorWifeBleData.sendData(AirSendUtil.setCalibrationParam(type, 0)); mAirDetectorWifeBleData.sendData(AirSendUtil.setCalibrationParam(type, 0));
} }
break; break;
case STEP_CAL_HUMIDITY: case STEP_CAL_HUMIDITY:
type = AirConst.AIR_TYPE_HUMIDITY; type = AirConst.AIR_TYPE_HUMIDITY;
if (isSupportCalType(type)) { if (isSupportCalType(type)) {
addTest("设置湿度校准");
addTest("设置湿度校准, 单位校准值加1");
mAirDetectorWifeBleData.sendData(AirSendUtil.setCalibrationParam(type, 0)); mAirDetectorWifeBleData.sendData(AirSendUtil.setCalibrationParam(type, 0));
} }
break; break;
case STEP_CAL_PM2_5: case STEP_CAL_PM2_5:
type = AirConst.AIR_TYPE_PM_2_5; type = AirConst.AIR_TYPE_PM_2_5;
if (isSupportCalType(type)) { if (isSupportCalType(type)) {
addTest("设置PM2.5校准");
addTest("设置PM2.5校准, 单位校准值加1");
mAirDetectorWifeBleData.sendData(AirSendUtil.setCalibrationParam(type, 0)); mAirDetectorWifeBleData.sendData(AirSendUtil.setCalibrationParam(type, 0));
} }
break; break;
case STEP_CAL_PM1_0: case STEP_CAL_PM1_0:
type = AirConst.AIR_TYPE_PM_1; type = AirConst.AIR_TYPE_PM_1;
if (isSupportCalType(type)) { if (isSupportCalType(type)) {
addTest("设置PM1.0校准");
addTest("设置PM1.0校准, 单位校准值加1");
mAirDetectorWifeBleData.sendData(AirSendUtil.setCalibrationParam(type, 0)); mAirDetectorWifeBleData.sendData(AirSendUtil.setCalibrationParam(type, 0));
} }
break; break;
case STEP_CAL_PM10: case STEP_CAL_PM10:
type = AirConst.AIR_TYPE_PM_10; type = AirConst.AIR_TYPE_PM_10;
if (isSupportCalType(type)) { if (isSupportCalType(type)) {
addTest("设置PM10校准");
addTest("设置PM10校准, 单位校准值加1");
mAirDetectorWifeBleData.sendData(AirSendUtil.setCalibrationParam(type, 0)); mAirDetectorWifeBleData.sendData(AirSendUtil.setCalibrationParam(type, 0));
} }
break; break;
case STEP_CAL_VOC: case STEP_CAL_VOC:
type = AirConst.AIR_TYPE_VOC; type = AirConst.AIR_TYPE_VOC;
if (isSupportCalType(type)) { if (isSupportCalType(type)) {
addTest("设置VOC校准");
addTest("设置VOC校准, 单位校准值加1");
mAirDetectorWifeBleData.sendData(AirSendUtil.setCalibrationParam(type, 0)); mAirDetectorWifeBleData.sendData(AirSendUtil.setCalibrationParam(type, 0));
} }
break; break;
case STEP_CAL_CO2: case STEP_CAL_CO2:
type = AirConst.AIR_TYPE_CO2; type = AirConst.AIR_TYPE_CO2;
if (isSupportCalType(type)) { if (isSupportCalType(type)) {
addTest("设置二氧化碳校准");
addTest("设置二氧化碳校准, 单位校准值加1");
mAirDetectorWifeBleData.sendData(AirSendUtil.setCalibrationParam(type, 0)); mAirDetectorWifeBleData.sendData(AirSendUtil.setCalibrationParam(type, 0));
} }
break; break;
case STEP_CAL_AQI: case STEP_CAL_AQI:
type = AirConst.AIR_TYPE_AQI; type = AirConst.AIR_TYPE_AQI;
if (isSupportCalType(type)) { if (isSupportCalType(type)) {
addTest("设置空气质量校准");
addTest("设置空气质量校准, 单位校准值加1");
mAirDetectorWifeBleData.sendData(AirSendUtil.setCalibrationParam(type, 0)); mAirDetectorWifeBleData.sendData(AirSendUtil.setCalibrationParam(type, 0));
} }
break; break;
case STEP_CAL_TVOC: case STEP_CAL_TVOC:
type = AirConst.AIR_TYPE_TVOC; type = AirConst.AIR_TYPE_TVOC;
if (isSupportCalType(type)) { if (isSupportCalType(type)) {
addTest("设置TVOC校准");
addTest("设置TVOC校准, 单位校准值加1");
mAirDetectorWifeBleData.sendData(AirSendUtil.setCalibrationParam(type, 0)); mAirDetectorWifeBleData.sendData(AirSendUtil.setCalibrationParam(type, 0));
} }
break; break;
case STEP_CAL_CO: case STEP_CAL_CO:
type = AirConst.AIR_TYPE_CO; type = AirConst.AIR_TYPE_CO;
if (isSupportCalType(type)) { if (isSupportCalType(type)) {
addTest("设置一氧化碳校准");
addTest("设置一氧化碳校准, 单位校准值加1");
mAirDetectorWifeBleData.sendData(AirSendUtil.setCalibrationParam(type, 0)); mAirDetectorWifeBleData.sendData(AirSendUtil.setCalibrationParam(type, 0));
} }
break; break;
type = AirConst.AIR_ALARM_CLOCK; type = AirConst.AIR_ALARM_CLOCK;
if (isSupportType(type)) { if (isSupportType(type)) {
addTest("设置闹钟"); addTest("设置闹钟");
int[] days = {0,1,1,1,1,1,1,0};
mAirDetectorWifeBleData.sendData(AirSendUtil.setAlarm(1, 14, 30, days, 4, 0, false));
SupportBean supportBean = deviceSupportList.get(AirConst.AIR_ALARM_CLOCK);
if (supportBean.getExtentObject() != null) {
AlarmClockStatement alarmClockStatement = (AlarmClockStatement) supportBean.getExtentObject();
int mode = 0;
if (alarmClockStatement.isMode4()) {
mode = 4;
} else if (alarmClockStatement.isMode0()) {
mode = 0;
} else if (alarmClockStatement.isMode1()) {
mode = 1;
} else if (alarmClockStatement.isMode2()) {
mode = 2;
} else if (alarmClockStatement.isMode3()) {
mode = 3;
}
int[] days = AirUtil.getAlarmClockDayByMode(mode);
mAirDetectorWifeBleData.sendData(AirSendUtil.setAlarm(1, 14, 30, days, 4, 0, false));
}
}
break;
case STEP_SETTING_WARN_SWITCH:
type = AirConst.AIR_SETTING_WARM;
if (isSupportType(type) && deviceSupportList.get(type).getCurValue() == 0x02) {
addTest("设置指标报警总开关");
mAirDetectorWifeBleData.sendData(AirSendUtil.setMasterWarnSwitch(1));
} else {
mStep = getNextStep();
test();
} }
break; break;
case STEP_DONE: case STEP_DONE:
} }
} }


@Override
public void onResultMasterWarnSwitch(String content) {
if (mStep == STEP_SETTING_WARN_SWITCH) {
stepSuccess(content);
}
}

@Override @Override
public void onCalResultHCHO(String content) { public void onCalResultHCHO(String content) {
if (mStep == STEP_CAL_HCHO) { if (mStep == STEP_CAL_HCHO) {

+ 4
- 3
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/airdetector_test/AirDetectorTestAdapter.java View File

import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.TextView; import android.widget.TextView;


import java.util.List;

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


import java.util.List;

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

public class AirDetectorTestAdapter extends RecyclerView.Adapter<AirDetectorTestAdapter.ViewHolder> { public class AirDetectorTestAdapter extends RecyclerView.Adapter<AirDetectorTestAdapter.ViewHolder> {


private Context mContext; private Context mContext;

+ 32
- 10
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/airdetector_test/AirDetectorTestShowUtil.java View File



import android.util.SparseArray; import android.util.SparseArray;


import androidx.annotation.NonNull;

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


import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.airdetector.AirUtil; import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.airdetector.AirUtil;
import androidx.annotation.NonNull;
import cn.net.aicare.modulelibrary.module.airDetector.AirConst; import cn.net.aicare.modulelibrary.module.airDetector.AirConst;
import cn.net.aicare.modulelibrary.module.airDetector.CalibrationListBean; import cn.net.aicare.modulelibrary.module.airDetector.CalibrationListBean;
import cn.net.aicare.modulelibrary.module.airDetector.StatusBean; import cn.net.aicare.modulelibrary.module.airDetector.StatusBean;
return builder.toString(); return builder.toString();
} }



/**
* 参数校准后,实时状态返回
*
* @param statusList
* @param supportList
* @return
*/
public static String showCalSettingAfterTextStatus(SparseArray<StatusBean> statusList, SparseArray<SupportBean> supportList) {
StringBuilder builder = new StringBuilder();
StatusBean statusBean = statusList.get(AirConst.AIR_CALIBRATION_PARAMETERS);
// 支持列表不包含,添加空字符串
SupportBean supportBean = supportList.get(AirConst.AIR_CALIBRATION_PARAMETERS);
if (supportBean != null) {
builder.append(AirUtil.dealCalResultAllStatus(statusBean, supportList));
}
return builder.toString();
}

/** /**
* 设置指令返回 * 设置指令返回
* *
* @param settingList * @param settingList
* @param supportList * @param supportList
* @Param resultInterface
* @return * @return
* @Param resultInterface
*/ */
public static String showGetResultSettings(SparseArray<StatusBean> settingList, SparseArray<SupportBean> supportList){
public static String showGetResultSettings(SparseArray<StatusBean> settingList, SparseArray<SupportBean> supportList) {
StringBuilder builder = new StringBuilder(); StringBuilder builder = new StringBuilder();
for (int i = 0; i < settingList.size(); i++) { for (int i = 0; i < settingList.size(); i++) {
int type = settingList.keyAt(i); int type = settingList.keyAt(i);
break; break;
case AirConst.AIR_TYPE_HUMIDITY: case AirConst.AIR_TYPE_HUMIDITY:
int hPow = (int) Math.pow(10, supportBean.getPoint()); int hPow = (int) Math.pow(10, supportBean.getPoint());
String humpStr = "下限值:" + settingBean.getWarmMin() / hPow + ", 上限值: "+ settingBean.getWarmMax() / hPow;
String humpStr = "下限值:" + settingBean.getWarmMin() / hPow + ", 上限值: " + settingBean.getWarmMax() / hPow;
builder.append(humpStr); builder.append(humpStr);
break; break;
case AirConst.AIR_TYPE_TEMP: case AirConst.AIR_TYPE_TEMP:
String tempStr = "下限值:" + settingBean.getWarmMin() + ", 上限值: "+ settingBean.getWarmMax();
String tempStr = "下限值:" + settingBean.getWarmMin() + ", 上限值: " + settingBean.getWarmMax();
builder.append(tempStr); builder.append(tempStr);
break; break;
case AirConst.AIR_SETTING_VOICE: case AirConst.AIR_SETTING_VOICE:
resultInterface.onWarmResultCO(AirUtil.getWarmResultStr(supportBean, resultBean)); resultInterface.onWarmResultCO(AirUtil.getWarmResultStr(supportBean, resultBean));
break; break;
case AirConst.AIR_TYPE_HUMIDITY: case AirConst.AIR_TYPE_HUMIDITY:
String humpStr = "下限值:" + resultBean.getWarmMin() + ", 上限值: "+ resultBean.getWarmMax();
String humpStr = "下限值:" + resultBean.getWarmMin() + ", 上限值: " + resultBean.getWarmMax();
resultInterface.onWarmResultHumidity(humpStr); resultInterface.onWarmResultHumidity(humpStr);
break; break;
case AirConst.AIR_TYPE_TEMP: case AirConst.AIR_TYPE_TEMP:
String tempStr = "下限值:" + resultBean.getWarmMin() + ", 上限值: "+ resultBean.getWarmMax();
String tempStr = "下限值:" + resultBean.getWarmMin() + ", 上限值: " + resultBean.getWarmMax();
resultInterface.onWarmResultTemp(tempStr); resultInterface.onWarmResultTemp(tempStr);
break; break;
case AirConst.AIR_SETTING_VOICE: case AirConst.AIR_SETTING_VOICE:
resultInterface.onResultVoice("开关:" + AirUtil.getSwitchStatus(resultBean.isOpen()) + ", Level: "+ resultBean.getValue());
resultInterface.onResultVoice("开关:" + AirUtil.getSwitchStatus(resultBean.isOpen()) + ", Level: " + resultBean.getValue());
break; break;
case AirConst.AIR_SETTING_WARM_DURATION: case AirConst.AIR_SETTING_WARM_DURATION:
resultInterface.onResultWarmDuration("时长:" + resultBean.getValue() + " S"); resultInterface.onResultWarmDuration("时长:" + resultBean.getValue() + " S");
case AirConst.AIR_MONITORING_DISPLAY_DATA: case AirConst.AIR_MONITORING_DISPLAY_DATA:
resultInterface.onResultMonitoringDisplayData("监测显示数据开关:" + AirUtil.getSwitchStatus(resultBean.isOpen())); resultInterface.onResultMonitoringDisplayData("监测显示数据开关:" + AirUtil.getSwitchStatus(resultBean.isOpen()));
break; break;
case AirConst.AIR_SETTING_WARM:
resultInterface.onResultMasterWarnSwitch("指标报警总开关:" + AirUtil.getSwitchStatus(resultBean.isOpen()));
break;
default: default:
break; break;
} }
} }
for (CalibrationListBean.CalibrationBean bean : list) { for (CalibrationListBean.CalibrationBean bean : list) {
String resultStr = AirUtil.getOperateStr(bean.getCalOperate()); String resultStr = AirUtil.getOperateStr(bean.getCalOperate());
switch (bean.getCalType()){
switch (bean.getCalType()) {
case AirConst.AIR_TYPE_FORMALDEHYDE: case AirConst.AIR_TYPE_FORMALDEHYDE:
resultInterface.onCalResultHCHO(resultStr); resultInterface.onCalResultHCHO(resultStr);
break; break;
} }
} }




} }

+ 7
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/airdetector_test/SettingResultInterface.java View File

* @param content * @param content
*/ */
public void onResultDataDisplayMode(String content); public void onResultDataDisplayMode(String content);

/**
* 报警总开关设置
* @param content
*/
public void onResultMasterWarnSwitch(String content);

/** /**
* 甲醛校准 * 甲醛校准
* @param content * @param content

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

import android.widget.ListView; import android.widget.ListView;
import android.widget.RadioButton; import android.widget.RadioButton;


import androidx.annotation.Nullable;

import com.pingwang.bluetoothlib.bean.SupportUnitBean; import com.pingwang.bluetoothlib.bean.SupportUnitBean;
import com.pingwang.bluetoothlib.device.BleDevice; import com.pingwang.bluetoothlib.device.BleDevice;




import aicare.net.cn.sdk.ailinksdkdemoandroid.R; import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.BleNutrition.BleNutritionData; import cn.net.aicare.modulelibrary.module.BleNutrition.BleNutritionData;


public class BleNutritionActivity extends BleBaseActivity implements View.OnClickListener, BleNutritionData.BleNutritionCallback { public class BleNutritionActivity extends BleBaseActivity implements View.OnClickListener, BleNutritionData.BleNutritionCallback {

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

import android.widget.ListView; import android.widget.ListView;
import android.widget.RadioButton; import android.widget.RadioButton;


import androidx.annotation.Nullable;

import com.pingwang.bluetoothlib.bean.SupportUnitBean; import com.pingwang.bluetoothlib.bean.SupportUnitBean;
import com.pingwang.bluetoothlib.device.BleDevice; import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.listener.OnCallbackBle; import com.pingwang.bluetoothlib.listener.OnCallbackBle;


import aicare.net.cn.sdk.ailinksdkdemoandroid.R; import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.BloodGlucose.BloodGlucoseBleDeviceData; import cn.net.aicare.modulelibrary.module.BloodGlucose.BloodGlucoseBleDeviceData;
import cn.net.aicare.modulelibrary.module.BloodGlucose.BloodGlucoseUtil; import cn.net.aicare.modulelibrary.module.BloodGlucose.BloodGlucoseUtil;


mLogList.add(0, "绑定服务成功"); mLogList.add(0, "绑定服务成功");
listAdapter.notifyDataSetChanged(); listAdapter.notifyDataSetChanged();
if (mBluetoothService != null) { if (mBluetoothService != null) {
mBluetoothService.setOnCallback(this);
mBluetoothService.setOnCallbackBle(this);
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress); BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress);
if (bleDevice != null) { if (bleDevice != null) {
mBloodGlucoseBleDeviceData = new BloodGlucoseBleDeviceData(bleDevice); mBloodGlucoseBleDeviceData = new BloodGlucoseBleDeviceData(bleDevice);


@Override @Override
public void unbindServices() { public void unbindServices() {

if (mBluetoothService!=null) {
mBluetoothService.removeOnCallbackBle(this);
}
} }





+ 6
- 3
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/blood_glucose/BloodGlucoseTestActivity.java View File

import android.widget.ListView; import android.widget.ListView;
import android.widget.Toast; import android.widget.Toast;


import androidx.annotation.Nullable;

import com.pingwang.bluetoothlib.bean.SupportUnitBean; import com.pingwang.bluetoothlib.bean.SupportUnitBean;
import com.pingwang.bluetoothlib.device.BleDevice; import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.listener.OnBleCompanyListener; import com.pingwang.bluetoothlib.listener.OnBleCompanyListener;


import aicare.net.cn.sdk.ailinksdkdemoandroid.R; import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.BloodGlucose.BloodGlucoseBleDeviceData; import cn.net.aicare.modulelibrary.module.BloodGlucose.BloodGlucoseBleDeviceData;
import cn.net.aicare.modulelibrary.module.BloodGlucose.BloodGlucoseUtil; import cn.net.aicare.modulelibrary.module.BloodGlucose.BloodGlucoseUtil;


@Override @Override
public void onServiceSuccess() { public void onServiceSuccess() {
if (mBluetoothService != null) { if (mBluetoothService != null) {
mBluetoothService.setOnCallback(this);
mBluetoothService.setOnCallbackBle(this);
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress); BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress);
if (bleDevice != null) { if (bleDevice != null) {
mBleDevice = new BloodGlucoseBleDeviceData(bleDevice); mBleDevice = new BloodGlucoseBleDeviceData(bleDevice);


@Override @Override
public void unbindServices() { public void unbindServices() {

if (mBluetoothService!=null) {
mBluetoothService.removeOnCallbackBle(this);
}
} }


@Override @Override

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

import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.ListView; import android.widget.ListView;


import androidx.annotation.Nullable;

import com.pingwang.bluetoothlib.bean.SupportUnitBean; import com.pingwang.bluetoothlib.bean.SupportUnitBean;
import com.pingwang.bluetoothlib.device.BleDevice; import com.pingwang.bluetoothlib.device.BleDevice;




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


/** /**

+ 3
- 2
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/body_scale_4g/BodyScale4GActivity.java View File

import android.widget.SeekBar; import android.widget.SeekBar;
import android.widget.TextView; import android.widget.TextView;


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

import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import java.util.Locale; import java.util.Locale;


import aicare.net.cn.sdk.ailinksdkdemoandroid.R; import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import cn.net.aicare.algorithmutil.AlgorithmUtil; import cn.net.aicare.algorithmutil.AlgorithmUtil;
import cn.net.aicare.algorithmutil.BodyFatData; import cn.net.aicare.algorithmutil.BodyFatData;



+ 192
- 131
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/broadcast_height/BroadcastHeightActivity.java View File

import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.ListView; import android.widget.ListView;


import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;

import com.pingwang.bluetoothlib.bean.BleValueBean; import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.config.BleConfig; import com.pingwang.bluetoothlib.config.BleConfig;
import com.pingwang.bluetoothlib.listener.OnCallbackDis; import com.pingwang.bluetoothlib.listener.OnCallbackDis;
import com.pingwang.bluetoothlib.listener.OnScanFilterListener; import com.pingwang.bluetoothlib.listener.OnScanFilterListener;
import com.pingwang.bluetoothlib.utils.BleStrUtils; import com.pingwang.bluetoothlib.utils.BleStrUtils;
import com.pinwang.ailinkble.AiLinkPwdUtil;


import java.math.BigDecimal; import java.math.BigDecimal;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;


import aicare.net.cn.sdk.ailinksdkdemoandroid.R; import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;
import cn.net.aicare.modulelibrary.module.BroadcastScale.BroadcastScaleBleConfig;
import cn.net.aicare.modulelibrary.module.broadcastheight.BroadCastHeightConfig;
import cn.net.aicare.modulelibrary.module.broadcastheight.BroadCastHeightDeviceData;


public class BroadcastHeightActivity extends BleBaseActivity implements OnCallbackDis, OnScanFilterListener {
public class BroadcastHeightActivity extends BleBaseActivity implements OnCallbackDis, OnScanFilterListener,BroadCastHeightDeviceData.OnNotifyHeightData {


private Context mContext; private Context mContext;


private ArrayAdapter mListAdapter; private ArrayAdapter mListAdapter;


private String mMac; private String mMac;
private String mac;

private BroadCastHeightDeviceData mBroadCastHeightDeviceData;


@Override @Override
protected void onCreate(@Nullable Bundle savedInstanceState) { protected void onCreate(@Nullable Bundle savedInstanceState) {


@Override @Override
public void unbindServices() { public void unbindServices() {

if (mBroadCastHeightDeviceData != null) {
mBroadCastHeightDeviceData.clear();
mBroadCastHeightDeviceData = null;
}
} }


@Override @Override
public void onScanRecord(BleValueBean bleValueBean) { public void onScanRecord(BleValueBean bleValueBean) {
if (TextUtils.isEmpty(mMac) && bleValueBean.isBroadcastModule()) { if (TextUtils.isEmpty(mMac) && bleValueBean.isBroadcastModule()) {
// 是广播模块 // 是广播模块
if (bleValueBean.getCid() == 0x03) {
if (bleValueBean.getCid() == BroadCastHeightConfig.BROAD_CAST_HEIGHT) {
// 是身高仪,进行数据解析 // 是身高仪,进行数据解析
notifyData(bleValueBean.getManufacturerData(), bleValueBean.getCid(), bleValueBean.getVid(), bleValueBean.getPid(), bleValueBean.getMac());
mac = bleValueBean.getMac();
mBroadCastHeightDeviceData.onNotifyData(bleValueBean.getManufacturerData(), bleValueBean.getCid(), bleValueBean.getVid(), bleValueBean.getPid());
// notifyData(bleValueBean.getManufacturerData(), bleValueBean.getCid(), bleValueBean.getVid(), bleValueBean.getPid(), bleValueBean.getMac());
} }
} }
} }


/**
* @param manufacturerData 自定义厂商数据0xFF后面的数据
* @param cid cid 设备类型
* @param vid vid
* @param pid pid
*/
private void notifyData(byte[] manufacturerData, int cid, int vid, int pid, String mac) {
if (manufacturerData == null) {
addText("接收到的数据:null");
return;
}
if (manufacturerData.length >= 20) {
byte sum = manufacturerData[9];
byte[] data = new byte[10];
System.arraycopy(manufacturerData, 10, data, 0, data.length);
byte newSum = cmdSum(data);
if (newSum == sum) {
// addText("接收到的数据:原始数据:" + BleStrUtils.byte2HexStr(data));
byte[] bytes;
byte[] dataOriginal = data.clone();
if (cid != 0 || vid != 0 || pid != 0) {
//数据需要解密
if (cid == BroadcastScaleBleConfig.BROADCAST_SCALE_LING_YANG_CID) {
bytes = AiLinkPwdUtil.decryptLingYang(data);
} else {
bytes = AiLinkPwdUtil.decryptBroadcast(cid, vid, pid, data);
}
} else {
bytes = data;
}

// addText("接收到的数据:" + BleStrUtils.byte2HexStr(bytes));
checkData(bytes, cid, vid, pid, mac);
} else {
addText("校验和错误");
}
}
}

// 上一次的流水号
private int mLastSerialNum = -1;

/**
* 解析数据
*
* @param hex 解密后的数据
* @param cid cid
* @param vid vid
* @param pid pid
*/
private void checkData(byte[] hex, int cid, int vid, int pid, String mac) {
// 流水号
int serialNum = hex[0];
if (serialNum == mLastSerialNum) {
return;
}
mLastSerialNum = serialNum;

// 测量标识
int flag = hex[1] & 0xff;
// 身高原始数据
int heightOrigin = (hex[2] & 0xff) << 8 | (hex[3] & 0xff);
// 身高单位 0:cm;1:inch;2:ft-in
int heightUnit = (hex[4] & 0xff) & 0x0f;
// 身高小数点
int heightDecimal = ((hex[4] & 0xff) & 0xf0) >> 4;
// 体重原始数据
int weightOrigin = (hex[5] & 0xff) << 8 | (hex[6] & 0xff);
// 体重单位 0:kg;1:斤;2:lb:oz;3:oz;4:st:lb;5:g;6:lb
int weightUnit = (hex[7] & 0xff) & 0x0f;
// 体重正负号
int weightSymbol = ((hex[7] & 0xff) & 0x10) >> 4;
// 体重小数点
int weightDecimal = ((hex[7] & 0xff) & 0xe0) >> 5;
// 电量
int battery = hex[8] & 0xff;

// 输出
String text = "";
text += "MAC地址:" + mac;
text += "\n数据解析:" + BleStrUtils.byte2HexStr(hex);
text += "\n测量标识:" + flag + ":" + getFlagStr(flag);
text += "\n身高原始数据:" + heightOrigin;
text += "\n身高单位:" + heightUnit;
text += "\n身高小数点:" + heightDecimal;
text += "\n身高最终值:" + getHeightStr(heightOrigin, heightUnit, heightDecimal);

if (weightOrigin != 0xffff) {
text += "\n体重原始数据:" + weightOrigin;
text += "\n体重单位:" + weightUnit;
text += "\n体重正负号:" + weightSymbol;
text += "\n体重小数点:" + weightDecimal;
text += "\n体重最终值:" + getWeightStr(weightOrigin, weightUnit, weightDecimal, weightSymbol);
} else {
text += "\n体重:" + "不支持";
}
if (battery != 0xff) {
text += "\n电量:" + battery;
} else {
text += "\n电量:" + "不支持";
}
addText(text);
}
// /**
// * @param manufacturerData 自定义厂商数据0xFF后面的数据
// * @param cid cid 设备类型
// * @param vid vid
// * @param pid pid
// */
// private void notifyData(byte[] manufacturerData, int cid, int vid, int pid, String mac) {
// if (manufacturerData == null) {
// addText("接收到的数据:null");
// return;
// }
// if (manufacturerData.length >= 20) {
// byte sum = manufacturerData[9];
// byte[] data = new byte[10];
// System.arraycopy(manufacturerData, 10, data, 0, data.length);
// byte newSum = cmdSum(data);
// if (newSum == sum) {
//// addText("接收到的数据:原始数据:" + BleStrUtils.byte2HexStr(data));
// byte[] bytes;
// if (cid != 0 || vid != 0 || pid != 0) {
// //数据需要解密
// if (cid == BroadcastScaleBleConfig.BROADCAST_SCALE_LING_YANG_CID) {
// bytes = AiLinkPwdUtil.decryptLingYang(data);
// } else {
// bytes = AiLinkPwdUtil.decryptBroadcast(cid, vid, pid, data);
// }
// } else {
// bytes = data;
// }
//
//// addText("接收到的数据:" + BleStrUtils.byte2HexStr(bytes));
// checkData(bytes, cid, vid, pid, mac);
// } else {
// addText("校验和错误");
// }
// }
// }
//
// // 上一次的流水号
// private int mLastSerialNum = -1;
//
// /**
// * 解析数据
// *
// * @param hex 解密后的数据
// * @param cid cid
// * @param vid vid
// * @param pid pid
// */
// private void checkData(byte[] hex, int cid, int vid, int pid, String mac) {
// // 流水号
// int serialNum = hex[0];
// if (serialNum == mLastSerialNum) {
// return;
// }
// mLastSerialNum = serialNum;
//
// // 测量标识
// int flag = hex[1] & 0xff;
// // 身高原始数据
// int heightOrigin = (hex[2] & 0xff) << 8 | (hex[3] & 0xff);
// // 身高单位 0:cm;1:inch;2:ft-in
// int heightUnit = (hex[4] & 0xff) & 0x0f;
// // 身高小数点
// int heightDecimal = ((hex[4] & 0xff) & 0xf0) >> 4;
// // 体重原始数据
// int weightOrigin = (hex[5] & 0xff) << 8 | (hex[6] & 0xff);
// // 体重单位 0:kg;1:斤;2:lb:oz;3:oz;4:st:lb;5:g;6:lb
// int weightUnit = (hex[7] & 0xff) & 0x0f;
// // 体重正负号
// int weightSymbol = ((hex[7] & 0xff) & 0x10) >> 4;
// // 体重小数点
// int weightDecimal = ((hex[7] & 0xff) & 0xe0) >> 5;
// // 电量
// int battery = hex[8] & 0xff;
//
// // 输出
// String text = "";
// text += "MAC地址:" + mac;
// text += "\n数据解析:" + BleStrUtils.byte2HexStr(hex);
// text += "\n测量标识:" + flag + ":" + getFlagStr(flag);
// text += "\n身高原始数据:" + heightOrigin;
// text += "\n身高单位:" + heightUnit;
// text += "\n身高小数点:" + heightDecimal;
// text += "\n身高最终值:" + getHeightStr(heightOrigin, heightUnit, heightDecimal);
//
// if (weightOrigin != 0xffff) {
// text += "\n体重原始数据:" + weightOrigin;
// text += "\n体重单位:" + weightUnit;
// text += "\n体重正负号:" + weightSymbol;
// text += "\n体重小数点:" + weightDecimal;
// text += "\n体重最终值:" + getWeightStr(weightOrigin, weightUnit, weightDecimal, weightSymbol);
// } else {
// text += "\n体重:" + "不支持";
// }
// if (battery != 0xff) {
// text += "\n电量:" + battery;
// } else {
// text += "\n电量:" + "不支持";
// }
// addText(text);
// }


private String getFlagStr(int flag) { private String getFlagStr(int flag) {
String str = ""; String str = "";
switch (flag) { switch (flag) {
case 0:
case BroadCastHeightConfig.MEASURING:
str = "正在测量"; str = "正在测量";
break; break;
case 1:
case BroadCastHeightConfig.MEASURING_STABLE:
str = "稳定身高体重"; str = "稳定身高体重";
break; break;
case 0xff:
case BroadCastHeightConfig.MEASURING_FAILED:
str = "测量失败"; str = "测量失败";
break; break;
} }
str += getPreFloatStr((float) (heightOrigin * 1.0f / Math.pow(10, heightDecimal)), heightDecimal, 0); str += getPreFloatStr((float) (heightOrigin * 1.0f / Math.pow(10, heightDecimal)), heightDecimal, 0);


switch (heightUnit) { switch (heightUnit) {
case 0:
case BroadCastHeightConfig.UNIT_CM:
str += "cm"; str += "cm";
break; break;
case 1:
case BroadCastHeightConfig.UNIT_INCH:
str += "inch"; str += "inch";
break; break;
case 2:
case BroadCastHeightConfig.UNIT_FT_IN:
try { try {
int ft = Integer.parseInt(str);
int f = ft / 12;
int i = ft - f * 12;
str = f + "'" + i + "\"";
float inchSize = Float.parseFloat(str);
int feet = (int) (inchSize / 12);
float inch = (inchSize % 12f);
String decimalStr = "%." + heightDecimal + "f";
inch = Float.parseFloat(String.format(Locale.US, decimalStr, inch));
str = feet + "'" + inch + "\"";
} catch (Exception e) { } catch (Exception e) {
str = "解析异常,原始值不是int型";
str = "解析异常";
} }
break; break;
} }
str += getPreFloatStr((float) (weightOrigin * 1.0f / Math.pow(10, weightDecimal)) * (weightSymbol == 1 ? -1 : 1), weightDecimal, 0); str += getPreFloatStr((float) (weightOrigin * 1.0f / Math.pow(10, weightDecimal)) * (weightSymbol == 1 ? -1 : 1), weightDecimal, 0);


switch (weightUnit) { switch (weightUnit) {
case 0:
case BroadCastHeightConfig.UNIT_KG:
str += "kg"; str += "kg";
break; break;
case 1:
case BroadCastHeightConfig.UNIT_JIN:
str += "斤"; str += "斤";
break; break;
case 2:
case BroadCastHeightConfig.UNIT_LB_OZ:
str += "lb:oz"; str += "lb:oz";
break; break;
case 3:
case BroadCastHeightConfig.UNIT_OZ:
str += "oz"; str += "oz";
break; break;
case 4:
case BroadCastHeightConfig.UNIT_ST_LB:
str += "st:lb"; str += "st:lb";
break; break;
case 5:
case BroadCastHeightConfig.UNIT_G:
str += "g"; str += "g";
break; break;
case 6:
case BroadCastHeightConfig.UNIT_LB:
str += "lb"; str += "lb";
break; break;
} }
// 权限都有了,OK // 权限都有了,OK
addText("权限都有,开始接收广播数据"); addText("权限都有,开始接收广播数据");
if (mBluetoothService != null) { if (mBluetoothService != null) {
mBroadCastHeightDeviceData = BroadCastHeightDeviceData.getInstance();
mBroadCastHeightDeviceData.setOnNotifyHeightData(this);
mBluetoothService.setOnScanFilterListener(this); mBluetoothService.setOnScanFilterListener(this);
mBluetoothService.scanLeDevice(0, BleConfig.UUID_SERVER_BROADCAST_AILINK);
mBluetoothService.startScan(0, BleConfig.UUID_SERVER_BROADCAST_AILINK);
} }
} }


mListAdapter.notifyDataSetChanged(); mListAdapter.notifyDataSetChanged();
list_view.smoothScrollToPosition(mList.size() - 1); list_view.smoothScrollToPosition(mList.size() - 1);
} }

/**
*
* @param hex 解析后的数据
* @param flag 测量标识
* @param heightOrigin 身高原始数据
* @param heightUnit 身高单位
* @param heightDecimal 身高小数点
* @param weightOrigin 体重原始数据
* @param weightUnit 体重单位
* @param weightSymbol 体重正负号
* @param weightDecimal 体重小数点
* @param battery 体重最终值
*/
@Override
public void notifyData(byte[] hex, int flag, int heightOrigin, int heightUnit, int heightDecimal,
int weightOrigin, int weightUnit, int weightSymbol, int weightDecimal, int battery) {

if (heightOrigin == 0){
return;
}

// 输出
String text = "";
text += "MAC地址:" + mac;
text += "\n数据解析:" + BleStrUtils.byte2HexStr(hex);
text += "\n测量标识:" + flag + ":" + getFlagStr(flag);
text += "\n身高原始数据:" + heightOrigin;
text += "\n身高单位:" + heightUnit;
text += "\n身高小数点:" + heightDecimal;
text += "\n身高最终值:" + getHeightStr(heightOrigin, heightUnit, heightDecimal);

if (weightOrigin != 0xffff) {
text += "\n体重原始数据:" + weightOrigin;
text += "\n体重单位:" + weightUnit;
text += "\n体重正负号:" + weightSymbol;
text += "\n体重小数点:" + weightDecimal;
text += "\n体重最终值:" + getWeightStr(weightOrigin, weightUnit, weightDecimal, weightSymbol);
} else {
text += "\n体重:" + "不支持";
}
if (battery != 0xff) {
text += "\n电量:" + battery;
} else {
text += "\n电量:" + "不支持";
}
addText(text);

}
} }

+ 5
- 15
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/broadcast_nutrition/BroadNutritionActivity.java View File

import android.widget.Button; import android.widget.Button;
import android.widget.ListView; import android.widget.ListView;


import androidx.annotation.Nullable;

import com.pingwang.bluetoothlib.bean.BleValueBean; import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.config.BleConfig; import com.pingwang.bluetoothlib.config.BleConfig;
import com.pingwang.bluetoothlib.listener.OnScanFilterListener; import com.pingwang.bluetoothlib.listener.OnScanFilterListener;


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


public class BroadNutritionActivity extends BleBaseActivity implements View.OnClickListener, OnScanFilterListener { public class BroadNutritionActivity extends BleBaseActivity implements View.OnClickListener, OnScanFilterListener {


public void onClick(View v) { public void onClick(View v) {
int id = v.getId(); int id = v.getId();
if (id == R.id.btn_start) { if (id == R.id.btn_start) {
mBluetoothService.scanLeDevice(0, BleConfig.UUID_SERVER_BROADCAST_AILINK);
mBluetoothService.startScan(0, BleConfig.UUID_SERVER_BROADCAST_AILINK);
} else if (id == R.id.btn_stop) { } else if (id == R.id.btn_stop) {
mBluetoothService.stopScan(); mBluetoothService.stopScan();
} else if (id == R.id.btn_clear) { } else if (id == R.id.btn_clear) {
public void onScanRecord(BleValueBean bleValueBean) { public void onScanRecord(BleValueBean bleValueBean) {
byte[] manufacturerData = bleValueBean.getManufacturerData(); byte[] manufacturerData = bleValueBean.getManufacturerData();
mMac = bleValueBean.getMac(); mMac = bleValueBean.getMac();
onNotifyData(manufacturerData, bleValueBean.getCid(), bleValueBean.getVid(), bleValueBean.getPid());
onNotifyData("",manufacturerData, bleValueBean.getCid(), bleValueBean.getVid(), bleValueBean.getPid());
} }


private SimpleDateFormat mSdf; private SimpleDateFormat mSdf;
* @param vid vid * @param vid vid
* @param pid pid * @param pid pid
*/ */
public void onNotifyData(byte[] manufacturerData, int cid, int vid, int pid) {
public void onNotifyData(String uuid, byte[] manufacturerData, int cid, int vid, int pid) {
if (manufacturerData == null) { if (manufacturerData == null) {
BleLog.i("Tag1", "接收到的数据:null"); BleLog.i("Tag1", "接收到的数据:null");
return; return;
int symbol = (hex[5] & 0xff) >> 7; int symbol = (hex[5] & 0xff) >> 7;
int battery = hex[6] & 0xff; int battery = hex[6] & 0xff;
int err = hex[7] & 0xff; int err = hex[7] & 0xff;

float weightValue = weight; float weightValue = weight;
if (symbol == 1) { if (symbol == 1) {
weightValue *= -1; weightValue *= -1;
} }
weightValue /= Math.pow(10, decimal); weightValue /= Math.pow(10, decimal);
String weightStr = getPreFloatStr(weightValue, decimal); String weightStr = getPreFloatStr(weightValue, decimal);
switch (unit) {
default:
case 0:
weightStr += "g";
break;
case 1:
weightStr += "ml";
break;
}

addText("Mac:" + mMac + "\n流水号:" + no + "\n测量标识符:" + type + "\n原始重量:" + weight + ",单位:" + unit + ",小数点:" + decimal + ",正负:" + symbol + "\n重量:" + weightStr + "\n电量:" + battery + "\n异常标志位:" + err); addText("Mac:" + mMac + "\n流水号:" + no + "\n测量标识符:" + type + "\n原始重量:" + weight + ",单位:" + unit + ",小数点:" + decimal + ",正负:" + symbol + "\n重量:" + weightStr + "\n电量:" + battery + "\n异常标志位:" + err);
} }
} }

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

import android.widget.RadioGroup; import android.widget.RadioGroup;
import android.widget.TextView; import android.widget.TextView;


import androidx.annotation.Nullable;

import com.pingwang.bluetoothlib.AILinkBleManager;
import com.pingwang.bluetoothlib.bean.BleValueBean; import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.config.BleConfig; import com.pingwang.bluetoothlib.config.BleConfig;
import com.pingwang.bluetoothlib.device.BleSendCmdUtil; import com.pingwang.bluetoothlib.device.BleSendCmdUtil;
import com.pingwang.bluetoothlib.listener.OnBleBroadcastDataListener;
import com.pingwang.bluetoothlib.listener.OnCallbackDis; import com.pingwang.bluetoothlib.listener.OnCallbackDis;
import com.pingwang.bluetoothlib.listener.OnScanFilterListener;
import com.pingwang.bluetoothlib.utils.BleDensityUtil; import com.pingwang.bluetoothlib.utils.BleDensityUtil;
import com.pingwang.bluetoothlib.utils.BleLog; import com.pingwang.bluetoothlib.utils.BleLog;
import com.pingwang.bluetoothlib.utils.BleStrUtils; import com.pingwang.bluetoothlib.utils.BleStrUtils;


import aicare.net.cn.sdk.ailinksdkdemoandroid.BroadcastScaleActivity; import aicare.net.cn.sdk.ailinksdkdemoandroid.BroadcastScaleActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.R; import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleNewBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.broadcastweightscale.BroadcastWeightScaleBleConfig; import cn.net.aicare.modulelibrary.module.broadcastweightscale.BroadcastWeightScaleBleConfig;
import cn.net.aicare.modulelibrary.module.broadcastweightscale.BroadcastWeightScaleDeviceData; import cn.net.aicare.modulelibrary.module.broadcastweightscale.BroadcastWeightScaleDeviceData;


/** /**
* 广播体重秤
* @auther ljl * @auther ljl
* on 2023/3/10 * on 2023/3/10
*/ */
public class BroadcastWeightScaleActivity extends BleBaseActivity implements OnCallbackDis, BroadcastWeightScaleDeviceData.OnNotifyData, OnScanFilterListener, View.OnClickListener,
public class BroadcastWeightScaleActivity extends BleNewBaseActivity implements OnCallbackDis, BroadcastWeightScaleDeviceData.OnNotifyData, OnBleBroadcastDataListener, View.OnClickListener,
RadioGroup.OnCheckedChangeListener { RadioGroup.OnCheckedChangeListener {


private static String TAG = BroadcastScaleActivity.class.getName(); private static String TAG = BroadcastScaleActivity.class.getName();
mHandler.sendEmptyMessage(REFRESH_DATA); mHandler.sendEmptyMessage(REFRESH_DATA);
break; break;
case R.id.open_weight: case R.id.open_weight:
if (mBluetoothService != null) {
mBluetoothService.scanLeDevice(0, UUID.fromString("0000F0A0-0000-1000-8000-00805F9B34FB"));
if (AILinkBleManager.getInstance() != null) {
AILinkBleManager.getInstance().startScan(0, UUID.fromString("0000F0A0-0000-1000-8000-00805F9B34FB"));
} }
break; break;
case R.id.stop_weight: case R.id.stop_weight:
if (mBluetoothService != null) {
mBluetoothService.stopScan();
if (AILinkBleManager.getInstance() != null) {
AILinkBleManager.getInstance().stopScan();
} }
break; break;
default: default:
public void onServiceSuccess() { public void onServiceSuccess() {
BleLog.i("ljl", "服务与界面建立连接成功"); BleLog.i("ljl", "服务与界面建立连接成功");
//与服务建立连接 //与服务建立连接
if (mBluetoothService != null) {
if (AILinkBleManager.getInstance() != null) {
mDevice = BroadcastWeightScaleDeviceData.getInstance(); mDevice = BroadcastWeightScaleDeviceData.getInstance();
mDevice.setOnNotifyData(this); mDevice.setOnNotifyData(this);
mBluetoothService.setOnScanFilterListener(this);
mBluetoothService.scanLeDevice(0, BleConfig.UUID_SERVER_BROADCAST_AILINK);
AILinkBleManager.getInstance().setOnBleBroadcastDataListener(this);
AILinkBleManager.getInstance().startScan(0, BleConfig.UUID_SERVER_BROADCAST_AILINK);
} }
} }


public void onServiceErr() { public void onServiceErr() {
BleLog.i("ljl", "服务与界面连接断开"); BleLog.i("ljl", "服务与界面连接断开");
//与服务断开连接 //与服务断开连接
mBluetoothService = null;
AILinkBleManager.getInstance().setOnBleBroadcastDataListener(null);
} }


@Override @Override
mDevice.clear(); mDevice.clear();
mDevice = null; mDevice = null;
} }

} }


//-----------------状态------------------- //-----------------状态-------------------
return; return;
} }
mOldData = data; mOldData = data;
mList.add(TimeUtils.getTime() + "数据ID" + type + " ,||解密数据:" + data + " ,||原始数据:" + BleStrUtils.byte2HexStr(dataOriginal));
mList.add(TimeUtils.getTime() + "数据ID" + type + " ,||解密payload数据:" + data + " ,||原始厂商数据:" + BleStrUtils.byte2HexStr(dataOriginal));
mHandler.sendEmptyMessage(REFRESH_DATA); mHandler.sendEmptyMessage(REFRESH_DATA);
} }






@Override @Override
public boolean onFilter(BleValueBean bleValueBean) {
return true;
}

@Override
public void onScanRecord(BleValueBean bleValueBean) {
public void onBleBroadcastData(BleValueBean bleValueBean, byte[] payload) {
if (TextUtils.isEmpty(mAddress) && bleValueBean.isBroadcastModule()) { if (TextUtils.isEmpty(mAddress) && bleValueBean.isBroadcastModule()) {
mAddress = bleValueBean.getMac(); mAddress = bleValueBean.getMac();
if (tv_broadcast_mac != null) { if (tv_broadcast_mac != null) {


//地址相同,并且是广播秤 //地址相同,并且是广播秤
if (mAddress.equalsIgnoreCase(bleValueBean.getMac()) && bleValueBean.isBroadcastModule()) { if (mAddress.equalsIgnoreCase(bleValueBean.getMac()) && bleValueBean.isBroadcastModule()) {
byte[] manufacturerData = bleValueBean.getManufacturerData();
int cid = bleValueBean.getCid(); int cid = bleValueBean.getCid();
int vid = bleValueBean.getVid(); int vid = bleValueBean.getVid();
int pid = bleValueBean.getPid(); int pid = bleValueBean.getPid();
if (mDevice != null) { if (mDevice != null) {
mDevice.onNotifyData(manufacturerData, cid, vid, pid);
mDevice.onNotifyData(bleValueBean.getManufacturerData(), cid, vid, pid);
} }
} }
} }

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

import android.widget.ListView; import android.widget.ListView;
import android.widget.RadioButton; import android.widget.RadioButton;


import androidx.annotation.Nullable;

import com.pingwang.bluetoothlib.bean.SupportUnitBean; import com.pingwang.bluetoothlib.bean.SupportUnitBean;
import com.pingwang.bluetoothlib.device.BleDevice; import com.pingwang.bluetoothlib.device.BleDevice;




import aicare.net.cn.sdk.ailinksdkdemoandroid.R; import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.CoffeeScale.CoffeeScaleData; import cn.net.aicare.modulelibrary.module.CoffeeScale.CoffeeScaleData;


public class CoffeeScaleActivity extends BleBaseActivity implements View.OnClickListener, CoffeeScaleData.CoffeeScaleCallback { public class CoffeeScaleActivity extends BleBaseActivity implements View.OnClickListener, CoffeeScaleData.CoffeeScaleCallback {

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

import android.widget.RadioButton; import android.widget.RadioButton;
import android.widget.Spinner; import android.widget.Spinner;


import androidx.annotation.Nullable;

import com.pingwang.bluetoothlib.device.BleDevice; import com.pingwang.bluetoothlib.device.BleDevice;


import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;


import aicare.net.cn.sdk.ailinksdkdemoandroid.R; import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.FasciaGun.FasciaGunData; import cn.net.aicare.modulelibrary.module.FasciaGun.FasciaGunData;


/** /**

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

import android.widget.Spinner; import android.widget.Spinner;
import android.widget.TextView; import android.widget.TextView;


import androidx.annotation.Nullable;

import com.pingwang.bluetoothlib.device.BleDevice; import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.device.BleSendCmdUtil; import com.pingwang.bluetoothlib.device.BleSendCmdUtil;
import com.pingwang.bluetoothlib.device.SendBleBean; import com.pingwang.bluetoothlib.device.SendBleBean;


import aicare.net.cn.sdk.ailinksdkdemoandroid.R; import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.FoodTemp.FoodTempData; import cn.net.aicare.modulelibrary.module.FoodTemp.FoodTempData;


/** /**

+ 3
- 2
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/leaone_broadcast/LeaOneBroadcastActivity.java View File

import android.widget.ListView; import android.widget.ListView;
import android.widget.TextView; import android.widget.TextView;


import androidx.annotation.Nullable;

import com.pingwang.bluetoothlib.bean.BleValueBean; import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.listener.OnScanFilterListener; import com.pingwang.bluetoothlib.listener.OnScanFilterListener;
import com.pingwang.bluetoothlib.utils.BleStrUtils; import com.pingwang.bluetoothlib.utils.BleStrUtils;


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


public class LeaOneBroadcastActivity extends BleBaseActivity implements View.OnClickListener, OnScanFilterListener { public class LeaOneBroadcastActivity extends BleBaseActivity implements View.OnClickListener, OnScanFilterListener {


public void onClick(View v) { public void onClick(View v) {
int id = v.getId(); int id = v.getId();
if (id == R.id.btn_start) { if (id == R.id.btn_start) {
mBluetoothService.scanLeDevice(0);
mBluetoothService.startScan(0);
} else if (id == R.id.btn_stop) { } else if (id == R.id.btn_stop) {
mBluetoothService.stopScan(); mBluetoothService.stopScan();
} else if (id == R.id.btn_clear) { } else if (id == R.id.btn_clear) {

+ 164
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/meat_probe/FoodConfig.java View File

package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.meat_probe;

public class FoodConfig {

/**
* 摄氏度
*/
public static final int UNIT_C = 0;

/**
* 华氏度
*/
public static final int UNIT_F = 1;

/**
* 牛肉
*/
public static final int FOOD_TYPE_BEEF = 0;

/**
* 小牛肉
*/
public static final int FOOD_TYPE_VEAL = 1;

/**
* 羊肉
*/
public static final int FOOD_TYPE_LAMB = 2;

/**
* 猪肉
*/
public static final int FOOD_TYPE_PORK = 3;

/**
* 鸡肉
*/
public static final int FOOD_TYPE_CHICKEN = 4;

/**
* 火鸡肉
*/
public static final int FOOD_TYPE_TURKEY = 5;

/**
* 鱼肉
*/
public static final int FOOD_TYPE_FISH = 6;

/**
* 汉堡
*/
public static final int FOOD_TYPE_HAMBURGER = 7;

/**
* 其它
*/
public static final int FOOD_TYPE_OTHER = 8;

/**
* 食物类型未设置
*/
public static final int FOOD_TYPE_NO_SETTING = 9;

/**
* 食品成熟度 DIY
*/
public static final int FOOD_DEGREE_DIY = 4;

/**
* 三分熟
*/
public static final int FOOD_DEGREE_MRATE = 0;

/**
* 五分熟
*/
public static final int FOOD_DEGREE_MEDIUM = 1;

/**
* 七分熟
*/
public static final int FOOD_DEGREE_MWELL = 2;

/**
* 全熟
*/
public static final int FOOD_DEGREE_WELL = 3;



/**
* 报警 铃声
*/
public static final int ALERT_TYPE_RING = 0;

/**
* 报警 震动
*/
public static final int ALERT_TYPE_SHOCK = 1;

/**
* 报警 铃声和震动
*/
public static final int ALERT_TYPE_RING_AND_SHOCK = 2;

/**
* 烧烤模式 烤炉
*/
public static final int FOOD_COOK_MODE_OVEN = 0;

/**
* 烧烤
*/
public static final int FOOD_COOK_MODE_BARBECUE = 1;

/**
* 正常状态
*/
public static final int BATTERY_STATE_NORMAL = 0;

/**
* 充电中
*/
public static final int BATTERY_STATE_CHARGING = 1;

/**
* 设备低电
*/
public static final int BATTERY_STATE_LOW = 2;


/**
* 设置温度单位
*/
public static final String BROADCAST_SET_TEMP_UNIT = "BROADCAST_SET_TEMP_UNIT";

/**
* 温度为这个值就不处理,-16383为0xFFFF的前13个bit
*/
public static final int DISABLE_TEMP = 0xFFFF;


/**
* 设备高温警告(摄氏度)
*/
public static final int DEVICE_HIGH_TEMP_C = 85;
/**
* 设备高温警告(华氏度)
*/
public static final int DEVICE_HIGH_TEMP_F = 185;

/**
* 设备超高温警告(摄氏度)
*/
public static final int DEVICE_SUPER_HIGH_TEMP_C = 100;
/**
* 设备超高温警告(华氏度)
*/
public static final int DEVICE_SUPER_HIGH_TEMP_F = 212;

}



+ 342
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/meat_probe/MeatProbeActivity.java View File

package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.meat_probe;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.Nullable;

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

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

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import cn.net.aicare.modulelibrary.module.meatprobe.MeatProbeBleData;
import cn.net.aicare.modulelibrary.module.meatprobe.MeatProbeSendCmdUtil;
import cn.net.aicare.modulelibrary.module.meatprobe.OnMeatProbeDataListener;
import cn.net.aicare.modulelibrary.module.meatprobe.ProbeBean;
import cn.net.aicare.modulelibrary.module.meatprobe.ProbeNowBean;

/**
* @author ljl
* on 2023/6/6
*/
public class MeatProbeActivity extends BleBaseActivity implements OnCallbackBle, OnMeatProbeDataListener, View.OnClickListener {
private Button btn_meat_probe_connect, btn_meat_probe_disconnect;
private Button btn_meat_probe_version, btn_meat_probe_battery;
private Button btn_meat_probe_switch_unit, btn_meat_probe_get_info;
private Button btn_meat_probe_start, btn_meat_probe_end;
private TextView tv_meat_probe_ambient, tv_meat_probe_internal, tv_meat_probe_target;
private TextView tv_meat_probe_battery, tv_meat_probe_version;
private TextView tv_meat_probe_ambient_unit, tv_meat_probe_internal_unit, tv_meat_probe_target_unit;
ListView list_view_meat_probe;
private List<String> mList;
private ArrayAdapter mListAdapter;

private String mMac;
private int mCid;
private int mVid;
private int mPid;
private BleDevice mBleDevice;
private MeatProbeBleData mMeatProbeBleData;
private long mCookingId;
private double percent = 0.8;
private int foodType = 0;
private int foodRawness = 2;
private int unit = 0;
private ProbeBean mProbeBean;


@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_meat_probe);
initView();
initData();
}

/**
* 初始化控件
*/

private void initView() {
btn_meat_probe_connect = findViewById(R.id.btn_meat_probe_connect);
btn_meat_probe_disconnect = findViewById(R.id.btn_meat_probe_disconnect);
btn_meat_probe_version = findViewById(R.id.btn_meat_probe_version);
btn_meat_probe_battery = findViewById(R.id.btn_meat_probe_battery);
btn_meat_probe_switch_unit = findViewById(R.id.btn_meat_probe_switch_unit);
btn_meat_probe_get_info = findViewById(R.id.btn_meat_probe_get_info);
btn_meat_probe_start = findViewById(R.id.btn_meat_probe_start);
btn_meat_probe_end = findViewById(R.id.btn_meat_probe_end);
tv_meat_probe_ambient = findViewById(R.id.tv_meat_probe_ambient);
tv_meat_probe_internal = findViewById(R.id.tv_meat_probe_internal);

tv_meat_probe_battery = findViewById(R.id.tv_meat_probe_battery);
tv_meat_probe_version = findViewById(R.id.tv_meat_probe_version);

tv_meat_probe_target = findViewById(R.id.tv_meat_probe_target);
tv_meat_probe_ambient_unit = findViewById(R.id.tv_meat_probe_ambient_unit);
tv_meat_probe_internal_unit = findViewById(R.id.tv_meat_probe_internal_unit);
tv_meat_probe_target_unit = findViewById(R.id.tv_meat_probe_target_unit);

list_view_meat_probe = findViewById(R.id.list_view_meat_probe);
}

/**
* 初始化数据
*/
private void initData() {
if (getIntent() != null) {
mMac = getIntent().getStringExtra("mac");
mCid = getIntent().getIntExtra("type", 0);
mVid = getIntent().getIntExtra("vid", 0);
mPid = getIntent().getIntExtra("pid", 0);
}
CallbackDisIm.getInstance().addListListener(this);
btn_meat_probe_connect.setOnClickListener(this);
btn_meat_probe_disconnect.setOnClickListener(this);
btn_meat_probe_version.setOnClickListener(this);
btn_meat_probe_battery.setOnClickListener(this);
btn_meat_probe_switch_unit.setOnClickListener(this);
btn_meat_probe_get_info.setOnClickListener(this);
btn_meat_probe_start.setOnClickListener(this);
btn_meat_probe_end.setOnClickListener(this);

mProbeBean = new ProbeBean(mMac);
mProbeBean.setAlarmTemperaturePercent(0.8);
mProbeBean.setFoodType(foodType);
mProbeBean.setFoodRawness(foodRawness);
mProbeBean.setTargetTemperature_C(65);
mProbeBean.setTargetTemperature_F(149);
mProbeBean.setAmbientMinTemperature_C(0);
mProbeBean.setAmbientMinTemperature_F(32);
mProbeBean.setAmbientMaxTemperature_C(100);
mProbeBean.setAmbientMaxTemperature_F(212);
mProbeBean.setTimerStart(0);
mProbeBean.setTimerEnd(0);

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

}

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

@Override
public void onServiceSuccess() {
if (mBluetoothService != null) {
mBluetoothService.setOnCallbackBle(this);
BleDevice bleDevice = mBluetoothService.getBleDevice(mMac);
MeatProbeBleData.init(bleDevice);
mMeatProbeBleData = MeatProbeBleData.getInstance();
mMeatProbeBleData.addOnMeatProbeDataListener(this);
MeatProbeSendCmdUtil.getInstance().setListeners(this);
}
}

@Override
public void onServiceErr() {

}

@Override
public void unbindServices() {
if (mBluetoothService!=null) {
mBluetoothService.removeOnCallbackBle(this);
}
}

@Override
public void onServicesDiscovered(String mac) {
//连接成功
Log.e("ljl", "onServicesDiscovered: mac is " + mac);
if (mBluetoothService != null) {
mBluetoothService.setOnCallbackBle(this);
BleDevice bleDevice = mBluetoothService.getBleDevice(mMac);
MeatProbeBleData.init(bleDevice);
mMeatProbeBleData = MeatProbeBleData.getInstance();
mMeatProbeBleData.addOnMeatProbeDataListener(this);
MeatProbeSendCmdUtil.getInstance().setListeners(this);
}
}

@Override
public void onDisConnected(String mac, int code) {
//断开连接
Toast.makeText(this, "断开连接", Toast.LENGTH_SHORT).show();
}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_meat_probe_connect:
if (mBluetoothService != null) {
mBluetoothService.connectDevice(mMac);
}
break;
case R.id.btn_meat_probe_disconnect:
if (mBluetoothService != null) {
mBluetoothService.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;
}
}

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

@Override
public void onBleNowData(String mac, ProbeNowBean probeNowBean) {

//当前单位取实时温度的单位
unit = probeNowBean.getRealTimeUnit();
//环境温度
tv_meat_probe_ambient.setText("环境温度:" + (probeNowBean.getAmbientPositive() == 0 ? probeNowBean.getAmbientTemp() : -probeNowBean.getAmbientTemp()));
//食物温度
tv_meat_probe_internal.setText("食物温度:" + (probeNowBean.getRealTimePositive() == 0 ? probeNowBean.getRealTimeTemp() : -probeNowBean.getRealTimeTemp()));

//环境温度单位
tv_meat_probe_ambient_unit.setText("环境温度单位:" + (probeNowBean.getAmbientUnit() == 0 ? "0(℃)" : "1(℉)"));
//食物温度单位
tv_meat_probe_internal_unit.setText("食物温度单位:" + (probeNowBean.getRealTimeUnit() == 0 ? "0(℃)" : "1(℉)"));

// addText("环境温度:" + (probeNowBean.getAmbientPositive() == 0 ? probeNowBean.getAmbientTemp() : -probeNowBean.getAmbientTemp()) +
// "食物温度:" + (probeNowBean.getRealTimePositive() == 0 ? probeNowBean.getRealTimeTemp() : -probeNowBean.getRealTimeTemp()) +
// "目标温度:" + (probeNowBean.getTargetPositive() == 0 ? probeNowBean.getTargetTemp() : -probeNowBean.getTargetTemp()) +
// "环境温度单位:" + (probeNowBean.getAmbientUnit() == 0 ? "0(℃)" : "1(℉)") +
// "食物温度单位:" + (probeNowBean.getRealTimeUnit() == 0 ? "0(℃)" : "1(℉)") +
// "目标温度单位:" + (probeNowBean.getTargetUnit() == 0 ? "0(℃)" : "1(℉)"));
}

@Override
public void onBatteryState(String mac, int status, int battery) {
Log.e("ljl", "onBatteryState: mac is " + mac + " status is " + status + " battery is " + battery);
//当前电量
tv_meat_probe_battery.setText("当前电量:" + battery);
addText("当前电量:" + battery);
}

@Override
public void onMcuVersionInfo(String mac, String versionInfo) {
Log.e("ljl", "onMcuVersionInfo: mac is " + mac + " versionInfo is " + versionInfo);
//版本号
tv_meat_probe_version.setText("模块版本号:" + versionInfo);
addText("模块版本号:" + versionInfo);
}

@Override
public void getDeviceInfo(String mac, ProbeBean probeBean) {
//目标温度
tv_meat_probe_target.setText("目标温度:" + probeBean.getTargetTemperature_C());
//目标温度单位
tv_meat_probe_target_unit.setText("目标温度单位:" + (probeBean.getCurrentUnit() == 0 ? "0(℃)" : "1(℉)"));
}

@Override
public void getInfoFailed(String mac) {
Log.e("ljl", "getInfoFailed: mac is " + mac);
}

@Override
public void getInfoSuccess(String mac) {
Log.e("ljl", "getInfoSuccess: mac is " + mac);
}

@Override
public void onDataNotifyA7(String mac, byte[] dataA7) {
//接收到的A7 payload数据
addText("接收的A7 payload[" + BleStrUtils.byte2HexStr(dataA7) + "]");
}

@Override
public void onDataNotifyA6(String mac, byte[] dataA6) {
//接收到的A6 payload数据
addText("接收的A6 payload[" + BleStrUtils.byte2HexStr(dataA6) + "]");
}

@Override
public void onDataA6(byte[] dataA6) {
//发出的A6 payload数据

addText("发送的A6 payload[" + BleStrUtils.byte2HexStr(dataA6) + "]");
}

@Override
public void onDataA7(byte[] dataA7) {
//发出的A7 payload数据
addText("发送的A7 payload[" + BleStrUtils.byte2HexStr(dataA7) + "]");
}
}

+ 451
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/meat_probe_charger/MeatProbeChargerActivity.java View File

package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.meat_probe_charger;

import android.os.Bundle;
import android.text.InputType;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.Nullable;

import com.pingwang.bluetoothlib.config.BleConfig;
import com.pingwang.bluetoothlib.device.BleDevice;

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

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.DialogStringImageBean;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.ShowListDialogFragment;
import cn.net.aicare.modulelibrary.module.meatprobecharger.ChargerProbeBean;
import cn.net.aicare.modulelibrary.module.meatprobecharger.MeatProbeChargerBleDevice;

/**
* @auther ljl
* 食物探针充电盒ble
* on 2023/2/24
*/
public class MeatProbeChargerActivity extends BleBaseActivity implements View.OnClickListener, MeatProbeChargerBleDevice.OnMeatProbeChargerDataListener {
private String mMac;
private int mVid;
private BleDevice mBleDevice;

private ListView list_view;

private List<String> mList;
private ArrayAdapter mListAdapter;
private List<String> mMacList;
private List<DialogStringImageBean> mDialogMacList;

private MeatProbeChargerBleDevice mMeatProbeChargerBleDevice;

private Button btn_probe_version, btn_probe_sync_time, btn_probe_info, btn_probe_clear;
private Button btn_probe_set, btn_probe_get, btn_probe_unit, btn_probe_set_alarm;
private Button btn_probe_clear_alarm, btn_probe_set_hand;
private EditText et_probe_set_hand;
private TextView tv_version, tv_other;
private List<ChargerProbeBean> mChargerProbeBeanList;


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

initView();
mMac = getIntent().getStringExtra("mac");
mVid = getIntent().getIntExtra("vid", 0);
// 初始化列表
mList = new ArrayList<>();
mMacList = new ArrayList<>();
// mMacList.add("44:33:22:11:10:10");
// mMacList.add("44:33:22:11:10:09");
// mMacList.add("44:33:22:11:10:08");
// mMacList.add("44:33:22:11:10:07");
mDialogMacList = new ArrayList<>();
// mDialogMacList.add(new DialogStringImageBean("44:33:22:11:10:10", 0));
// mDialogMacList.add(new DialogStringImageBean("44:33:22:11:10:09", 0));
// mDialogMacList.add(new DialogStringImageBean("44:33:22:11:10:08", 0));
// mDialogMacList.add(new DialogStringImageBean("44:33:22:11:10:07", 0));
mListAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList);
list_view.setAdapter(mListAdapter);
}

private void initView() {
list_view = findViewById(R.id.list_view);
btn_probe_version = findViewById(R.id.btn_probe_version);
btn_probe_sync_time = findViewById(R.id.btn_probe_sync_time);
btn_probe_info = findViewById(R.id.btn_probe_info);
btn_probe_set = findViewById(R.id.btn_probe_set);
btn_probe_get = findViewById(R.id.btn_probe_get);
btn_probe_unit = findViewById(R.id.btn_probe_unit);
btn_probe_set_alarm = findViewById(R.id.btn_probe_set_alarm);
btn_probe_clear = findViewById(R.id.btn_probe_clear);
btn_probe_clear_alarm = findViewById(R.id.btn_probe_clear_alarm);
btn_probe_set_hand = findViewById(R.id.btn_probe_set_hand);
et_probe_set_hand = findViewById(R.id.et_probe_set_hand);
btn_probe_version.setOnClickListener(this);
btn_probe_sync_time.setOnClickListener(this);
btn_probe_info.setOnClickListener(this);
btn_probe_set.setOnClickListener(this);
btn_probe_get.setOnClickListener(this);
btn_probe_unit.setOnClickListener(this);
btn_probe_set_alarm.setOnClickListener(this);
btn_probe_clear.setOnClickListener(this);
btn_probe_clear_alarm.setOnClickListener(this);
btn_probe_set_hand.setOnClickListener(this);

tv_version = findViewById(R.id.tv_probe_version);
tv_other = findViewById(R.id.tv_probe_other);

et_probe_set_hand.setInputType(InputType.TYPE_CLASS_NUMBER);
}

@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);
}
} else {
Toast.makeText(MeatProbeChargerActivity.this, "请先输入CID,VID,PID", Toast.LENGTH_SHORT).show();
}
break;
default:
break;
}
}

/**
* 取消报警
*/
private void cancelDialog() {
ShowListDialogFragment.newInstance().setTitle("选择探针").setCancel("取消", 0).setCancelBlank(true).setBackground(true).setBottom(false).setList(mDialogMacList)
.setOnDialogListener(new ShowListDialogFragment.onDialogListener() {
@Override
public void onItemListener(int position) {
Toast.makeText(MeatProbeChargerActivity.this, mDialogMacList.get(position).getName() + "设置该指令", Toast.LENGTH_SHORT).show();
mMeatProbeChargerBleDevice.cancelAlarm(mDialogMacList.get(position).getName());
}
}).show(getSupportFragmentManager());
}

/**
* 发送报警设置
*/
private void setAlarmDialog() {
ShowListDialogFragment.newInstance().setTitle("选择探针").setCancel("取消", 0).setCancelBlank(true).setBackground(true).setBottom(false).setList(mDialogMacList)
.setOnDialogListener(new ShowListDialogFragment.onDialogListener() {
@Override
public void onItemListener(int position) {
Toast.makeText(MeatProbeChargerActivity.this, mDialogMacList.get(position).getName() + "设置该指令", Toast.LENGTH_SHORT).show();
mMeatProbeChargerBleDevice.setAlarmInfo(mDialogMacList.get(position).getName(), true, true, true);
}
}).show(getSupportFragmentManager());
}

/**
* 清除探针数据
*/
private void clearProbeDataDialog() {
ShowListDialogFragment.newInstance().setTitle("选择探针").setCancel("取消", 0).setCancelBlank(true).setBackground(true).setBottom(false).setList(mDialogMacList)
.setOnDialogListener(new ShowListDialogFragment.onDialogListener() {
@Override
public void onItemListener(int position) {
Toast.makeText(MeatProbeChargerActivity.this, mDialogMacList.get(position).getName() + "设置该指令", Toast.LENGTH_SHORT).show();
mMeatProbeChargerBleDevice.setProbeData(0, mDialogMacList.get(position).getName());
}
}).show(getSupportFragmentManager());
}

/**
* 获取探针数据指令
*/
private void getProbeDataDialog() {
ShowListDialogFragment.newInstance().setTitle("选择探针").setCancel("取消", 0).setCancelBlank(true).setBackground(true).setBottom(false).setList(mDialogMacList)
.setOnDialogListener(new ShowListDialogFragment.onDialogListener() {
@Override
public void onItemListener(int position) {
Toast.makeText(MeatProbeChargerActivity.this, mDialogMacList.get(position).getName() + "设置该指令", Toast.LENGTH_SHORT).show();
mMeatProbeChargerBleDevice.setProbeData(2, mDialogMacList.get(position).getName());
}
}).show(getSupportFragmentManager());
}

/**
* 设置探针数据
*/
private void setProbeDataDialog() {
ShowListDialogFragment.newInstance().setTitle("选择探针").setCancel("取消", 0).setCancelBlank(true).setBackground(true).setBottom(false).setList(mDialogMacList)
.setOnDialogListener(new ShowListDialogFragment.onDialogListener() {
@Override
public void onItemListener(int position) {
Toast.makeText(MeatProbeChargerActivity.this, mDialogMacList.get(position).getName() + "设置该指令", Toast.LENGTH_SHORT).show();
mMeatProbeChargerBleDevice.setProbeData(mDialogMacList.get(position).getName(), 2, System.currentTimeMillis(), 0, 0, -15, 5, 0, 0, 0, 0, 0.8, 0, 0, 0, -15, 5);
}
}).show(getSupportFragmentManager());
}

@Override
public void onServiceSuccess() {
mBleDevice = mBluetoothService.getBleDevice(mMac);
if (mBleDevice != null) {
if (mMeatProbeChargerBleDevice == null) {
Log.e("ljl", "onServiceSuccess: 绑定设备,设置监听");
MeatProbeChargerBleDevice.init(mBleDevice);
mMeatProbeChargerBleDevice = MeatProbeChargerBleDevice.getInstance();
mMeatProbeChargerBleDevice.setOnMeatProbeChargerDataListener(this);
if (btn_probe_version != null) {
btn_probe_version.postDelayed(new Runnable() {
@Override
public void run() {
mBleDevice.setMtu(247);
}
}, 200);
}
}
}
addText("连接成功,充电盒Mac地址为:" + mMac);
}

@Override
public void onServiceErr() {

}

@Override
public void unbindServices() {

}



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

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

@Override
public void setVersion() {
if (mMeatProbeChargerBleDevice != null) {
mMeatProbeChargerBleDevice.getVersion();
}
}

/**
* 设置mtu成功后可以设置设备信息
*/
@Override
public void setDeviceInfo() {
}

@Override
public void onVersionInfo(String version) {
tv_version.setText("固件版本号:" + version);
}

@Override
public void appSyncTimeResult(int result) {
addText("同步时间状态码:" + result);
}

@Override
public void switchUnitResult(int result) {
addText("切换单位状态码:" + result);
}

@Override
public void setAlarmresult(String mac, int alarmResult) {
addText("设置警报->探针Mac地址" + mac + " 状态码:" + alarmResult);
}

@Override
public void cancelAlarmresult(String mac, int alarmResult) {
addText("取消警报->探针Mac地址" + mac + " 状态码:" + alarmResult);
}

private int index = 0;

@Override
public void onDeviceInfo(int supportNum, int currentNum, int chargerState, int battery, int boxUnit, List<ChargerProbeBean> chargerProbeBeanList) {
addText("设备支持探针数:" + supportNum + " 当前连接探针数:" + currentNum + " 充电状态:" + chargerState + " 电池电量:" + battery + " 充电盒单位:" + boxUnit);
if (mChargerProbeBeanList == null) {
mChargerProbeBeanList = new ArrayList<>();
mChargerProbeBeanList.addAll(chargerProbeBeanList);
} else {
mChargerProbeBeanList.clear();
mChargerProbeBeanList.addAll(chargerProbeBeanList);
}
if (mMacList.size() > 0) {
mMacList.clear();
}
if (mDialogMacList.size() > 0) {
index = 0;
mDialogMacList.clear();
}
for (ChargerProbeBean chargerProbeBean : chargerProbeBeanList) {
mMacList.add(chargerProbeBean.getMac());
mDialogMacList.add(new DialogStringImageBean(chargerProbeBean.getMac(), ++index));
addText("探针编号:" + chargerProbeBean.getNum() + " 探针mac地址:" + chargerProbeBean.getMac() + " 食物温度单位: " + chargerProbeBean.getFoodUnit() + " 正负: " + chargerProbeBean.getFoodPositive() + " " + "温度绝对值: " + chargerProbeBean.getFoodTemp() + " 环境温度单位: " + chargerProbeBean.getAmbientUnit() + " 正负: " + chargerProbeBean.getAmbientPositive() + " 温度绝对值: " + chargerProbeBean.getAmbientTemp() + " 探针充电状态:" + chargerProbeBean.getChargerState() + " 电量: " + chargerProbeBean.getBattery() + " 插入食物状态: " + chargerProbeBean.getInsertState());
}
}

@Override
public void onNoDeviceInfo(int supportNum, int currentNum, int chargingState, int battery, int boxUnit) {
addText("设备支持探针数:" + supportNum + " 当前连接探针数:" + currentNum + " 充电状态:" + chargingState + " 电池电量:" + battery + " 充电盒单位:" + boxUnit);
}

@Override
public void onBatteryStatus(int status, int battery) {
if (btn_probe_version != null) {
btn_probe_version.postDelayed(new Runnable() {
@Override
public void run() {
if (mBleDevice != null) {
mBleDevice.setMtu(247);
}
}
}, 200);
}
}

@Override
public void onOtherData(String hexStr) {
//其他数据
addText("其他数据:[" + hexStr + "]");
}

@Override
public void onDataStrA6(String hexStrA6) {
addText("收到A6数据:[" + hexStrA6 + "]");
}

@Override
public void onDataStrA7(String hexStrA7) {
addText("收到A7数据:[" + hexStrA7 + "]");
}

@Override
public void sendDataA6(String hexStrA6) {
addText("发送A6数据:[" + hexStrA6 + "]");
}

@Override
public void sendDataA7(String hexStrA7) {
addText("发送A7数据:[" + hexStrA7 + "]");
}

@Override
public void onHand(boolean status) {
addText("握手" + (status ? "成功" : "失败"));
if (!status) {
Toast.makeText(MeatProbeChargerActivity.this, "握手失败,请退出界面重新搜索蓝牙连接设备", Toast.LENGTH_SHORT).show();
}
}
}

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

import android.widget.Button; import android.widget.Button;
import android.widget.ListView; import android.widget.ListView;


import androidx.annotation.Nullable;

import com.pingwang.bluetoothlib.device.BleDevice; import com.pingwang.bluetoothlib.device.BleDevice;


import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;


import aicare.net.cn.sdk.ailinksdkdemoandroid.R; import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.NoiseMeter.NoiseMeterBleDevice; import cn.net.aicare.modulelibrary.module.NoiseMeter.NoiseMeterBleDevice;


/** /**

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

import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.ListView; import android.widget.ListView;


import androidx.annotation.Nullable;

import com.pingwang.bluetoothlib.device.BleDevice; import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.listener.OnBleOtherDataListener; import com.pingwang.bluetoothlib.listener.OnBleOtherDataListener;
import com.pingwang.bluetoothlib.utils.BleStrUtils; import com.pingwang.bluetoothlib.utils.BleStrUtils;
import aicare.net.cn.sdk.ailinksdkdemoandroid.R; import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.NoiseMeter.BleNoiseTLVBean; import cn.net.aicare.modulelibrary.module.NoiseMeter.BleNoiseTLVBean;
import cn.net.aicare.modulelibrary.module.NoiseMeter.NoiseMeterHistoryBean; import cn.net.aicare.modulelibrary.module.NoiseMeter.NoiseMeterHistoryBean;
import cn.net.aicare.modulelibrary.module.NoiseMeter.NoiseMeterWifiBleDevice; import cn.net.aicare.modulelibrary.module.NoiseMeter.NoiseMeterWifiBleDevice;

app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/RopeSkippingActivity.java → app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/ropeskipping/RopeSkippingActivity.java View File

package aicare.net.cn.sdk.ailinksdkdemoandroid;
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ropeskipping;


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


import androidx.annotation.Nullable;

import com.google.gson.Gson; import com.google.gson.Gson;
import com.pingwang.bluetoothlib.device.BleDevice; import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.listener.OnCallbackBle; import com.pingwang.bluetoothlib.listener.OnCallbackBle;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; 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.base.BleBaseActivity;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.RopeSkipping.OnRopeSkipCallBack; import cn.net.aicare.modulelibrary.module.RopeSkipping.OnRopeSkipCallBack;
import cn.net.aicare.modulelibrary.module.RopeSkipping.RopeSkipRecord; import cn.net.aicare.modulelibrary.module.RopeSkipping.RopeSkipRecord;
import cn.net.aicare.modulelibrary.module.RopeSkipping.RopeSkippingBleData; import cn.net.aicare.modulelibrary.module.RopeSkipping.RopeSkippingBleData;


@Override @Override
public void onServiceSuccess() { public void onServiceSuccess() {
mBluetoothService.setOnCallback(this);
logList.add("绑定服务成功"); logList.add("绑定服务成功");
if (mBluetoothService != null) { if (mBluetoothService != null) {
mBluetoothService.setOnCallback(this);
mBluetoothService.setOnCallbackBle(this);
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress); BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress);
if (bleDevice != null) { if (bleDevice != null) {
RopeSkippingBleData.init(bleDevice); RopeSkippingBleData.init(bleDevice);
if (mArrayAdapter != null && logList != null) { if (mArrayAdapter != null && logList != null) {
refreshLog("解除绑定服务"); refreshLog("解除绑定服务");
} }

if (mBluetoothService!=null) {
mBluetoothService.removeOnCallbackBle(this);
}
} }




} else if (v.getId() == R.id.btn_clear_log) { } else if (v.getId() == R.id.btn_clear_log) {
if (!isPauseLog) { if (!isPauseLog) {
isPauseLog = true; isPauseLog = true;
}else {
} else {
isPauseLog = false; isPauseLog = false;
} }


@Override @Override
public void onFinish(RopeSkipRecord ropeSkipBean) { public void onFinish(RopeSkipRecord ropeSkipBean) {


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


@Override @Override


} }


private String mOldData = "";
private int mId = 0;

@Override @Override
public void onCurrentData(int status, int mode, int defaultValue, int currentJumpNum, int currentJumpTime, int batter) { public void onCurrentData(int status, int mode, int defaultValue, int currentJumpNum, int currentJumpTime, int batter) {
refreshLog("实时数据 \n" + "状态: " + status + " ( 0:准备 1:进行中 2:完成) \n" + "模式: "
+ mode + " (1:自由 2:倒计时 3:倒计数) \n"
+ "默认值: " + defaultValue + " 电量 " + batter + "\n 当前个数: " + currentJumpNum + " 时间 " + currentJumpTime);
String data = "实时数据 \n" + "状态: " + status + " ( 0:准备 1:进行中 2:完成) \n" + "模式: " + mode + " (1:自由 2:倒计时 3:倒计数) \n" + "默认值: " + defaultValue + " 电量 " + batter + "\n 当前个数: " + currentJumpNum +
" 时间 " + currentJumpTime;
mId++;
if (mOldData.equals(data)) {
return;
}
mOldData = data;
refreshLog(mId+data);
} }


@Override @Override
refreshLog("没有离线记录"); refreshLog("没有离线记录");
} else { } else {


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


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

app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/RopeSkippingSetActivity.java → app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/ropeskipping/RopeSkippingSetActivity.java View File

package aicare.net.cn.sdk.ailinksdkdemoandroid;
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ropeskipping;


import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ListView; import android.widget.ListView;


import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.collection.ArraySet;

import com.pingwang.bluetoothlib.bean.BleValueBean; import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.config.BleConfig; import com.pingwang.bluetoothlib.config.BleConfig;
import com.pingwang.bluetoothlib.device.BleDevice; import com.pingwang.bluetoothlib.device.BleDevice;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;


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


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




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


} }


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

if (mBluetoothService!=null) {
mBluetoothService.removeOnCallbackBle(this);
}
} }




et_rssi.setEnabled(false); et_rssi.setEnabled(false);
mSetMode = true; mSetMode = true;
if (mBluetoothService != null) { if (mBluetoothService != null) {
mBluetoothService.scanLeDevice(0, BleConfig.UUID_BROADCAST_AILINK);
mBluetoothService.startScan(0, BleConfig.UUID_BROADCAST_AILINK);
} }
} else if (v.getId() == R.id.btn_start_read) { } else if (v.getId() == R.id.btn_start_read) {
//开始读取 //开始读取


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


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


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

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

import android.widget.SeekBar; import android.widget.SeekBar;
import android.widget.TextView; import android.widget.TextView;


import androidx.annotation.Nullable;

import com.pingwang.bluetoothlib.device.BleDevice; import com.pingwang.bluetoothlib.device.BleDevice;


import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;


import aicare.net.cn.sdk.ailinksdkdemoandroid.R; import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.ShareCharger.ShareChargerData; import cn.net.aicare.modulelibrary.module.ShareCharger.ShareChargerData;


public class ShareChargerActivity extends BleBaseActivity implements View.OnClickListener, ShareChargerData.ShareChargerCallback { public class ShareChargerActivity extends BleBaseActivity implements View.OnClickListener, ShareChargerData.ShareChargerCallback {

+ 3
- 2
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/share_condom/ShareCondomActivity.java View File

import android.widget.SeekBar; import android.widget.SeekBar;
import android.widget.TextView; import android.widget.TextView;


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

import com.pingwang.bluetoothlib.device.BleDevice; import com.pingwang.bluetoothlib.device.BleDevice;


import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;


import aicare.net.cn.sdk.ailinksdkdemoandroid.R; import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.ShareCondom.ShareCondomData; import cn.net.aicare.modulelibrary.module.ShareCondom.ShareCondomData;


public class ShareCondomActivity extends BleBaseActivity implements View.OnClickListener, ShareCondomData.ShareCondomCallback { public class ShareCondomActivity extends BleBaseActivity implements View.OnClickListener, ShareCondomData.ShareCondomCallback {

+ 8
- 5
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/share_socket/ShareSocketActivity.java View File

import android.widget.Spinner; import android.widget.Spinner;
import android.widget.TextView; import android.widget.TextView;


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

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


import aicare.net.cn.sdk.ailinksdkdemoandroid.R; import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.ShareSocket.ShareSocketData; import cn.net.aicare.modulelibrary.module.ShareSocket.ShareSocketData;


public class ShareSocketActivity extends BleBaseActivity implements View.OnClickListener, ShareSocketData.ShareSocketCallback, OnCallbackBle, OnScanFilterListener { public class ShareSocketActivity extends BleBaseActivity implements View.OnClickListener, ShareSocketData.ShareSocketCallback, OnCallbackBle, OnScanFilterListener {
case MSG_TEST_START_SCAN: case MSG_TEST_START_SCAN:
// 开始扫描设备 // 开始扫描设备
addText("准备重连,开始扫描设备:" + mMac); addText("准备重连,开始扫描设备:" + mMac);
mBluetoothService.scanLeDevice(0);
mBluetoothService.startScan(0);
break; break;
} }
} }


@Override @Override
public void onServiceSuccess() { public void onServiceSuccess() {
mBluetoothService.setOnCallback(this);
mBluetoothService.setOnCallbackBle(this);
mBluetoothService.setOnScanFilterListener(this); mBluetoothService.setOnScanFilterListener(this);
mBleDevice = mBluetoothService.getBleDevice(mMac); mBleDevice = mBluetoothService.getBleDevice(mMac);
if (mBleDevice != null) { if (mBleDevice != null) {


@Override @Override
public void unbindServices() { public void unbindServices() {

if (mBluetoothService!=null) {
mBluetoothService.removeOnCallbackBle(this);
}
} }


@Override @Override

+ 11
- 10
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/toothbrush/ToothBrushWifiBleActivity.java View File

import android.widget.ListView; import android.widget.ListView;
import android.widget.Toast; import android.widget.Toast;


import androidx.annotation.Nullable;

import com.elinkthings.bleotalibrary.listener.OnBleOTAListener; import com.elinkthings.bleotalibrary.listener.OnBleOTAListener;
import com.elinkthings.bleotalibrary.netstrap.OPLOtaManager; import com.elinkthings.bleotalibrary.netstrap.OPLOtaManager;
import com.pingwang.bluetoothlib.bean.BleValueBean; import com.pingwang.bluetoothlib.bean.BleValueBean;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.WifiDialog; import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.WifiDialog;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L; import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.ToothBrushUtils; import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.ToothBrushUtils;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.ToothBrush.ToothBrushBleCmd; import cn.net.aicare.modulelibrary.module.ToothBrush.ToothBrushBleCmd;
import cn.net.aicare.modulelibrary.module.ToothBrush.ToothBrushWiFiBleUtilsData; import cn.net.aicare.modulelibrary.module.ToothBrush.ToothBrushWiFiBleUtilsData;


/** /**
* Wifi+ble 牙刷 * Wifi+ble 牙刷
*/ */
public class ToothBrushWifiBleActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, ToothBrushWiFiBleUtilsData.BleToothBrushWiFiCallback,
ToothBrushWiFiBleUtilsData.BleToothBrushCallback {
public class ToothBrushWifiBleActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, ToothBrushWiFiBleUtilsData.BleToothBrushWiFiCallback, ToothBrushWiFiBleUtilsData.BleToothBrushCallback {
private String TAG = ToothBrushWifiBleActivity.class.getName(); private String TAG = ToothBrushWifiBleActivity.class.getName();
private String mAddress; private String mAddress;
private List<String> mList; private List<String> mList;


//与服务建立连接 //与服务建立连接
mList.add(0, "服务与界面建立连接成功"); mList.add(0, "服务与界面建立连接成功");
// mList.add(0, "搜索设备");
// mList.add(0, "搜索设备");
mMHandler.sendEmptyMessage(ToRefreUi); mMHandler.sendEmptyMessage(ToRefreUi);
mBluetoothService.setOnCallback(this);
mBluetoothService.scanLeDevice(30 * 1000);
mBluetoothService.setOnCallbackBle(this);
mBluetoothService.startScan(30 * 1000);




} }


@Override @Override
public void unbindServices() { public void unbindServices() {
if (mBluetoothService!=null) {
if (mBluetoothService != null) {
mBluetoothService.removeOnCallbackBle(this);
mBluetoothService.disconnectAll(); mBluetoothService.disconnectAll();
} }
} }
public void onScanning(BleValueBean data) { public void onScanning(BleValueBean data) {
BleLog.i(TAG, "MAC=" + mAddress + "||CID=" + data.getCid() + "||VID=" + data.getVid() + "||PID=" + data.getPid()); BleLog.i(TAG, "MAC=" + mAddress + "||CID=" + data.getCid() + "||VID=" + data.getVid() + "||PID=" + data.getPid());
if (data.getMac().equalsIgnoreCase(mAddress)) { if (data.getMac().equalsIgnoreCase(mAddress)) {
if (mBluetoothService!=null) {
if (mBluetoothService != null) {
mBluetoothService.stopScan(); mBluetoothService.stopScan();
mBluetoothService.connectDevice(data.getMac()); mBluetoothService.connectDevice(data.getMac());
} }
public void onServicesDiscovered(String mac) { public void onServicesDiscovered(String mac) {
mList.add(0, "蓝牙已连接"); mList.add(0, "蓝牙已连接");
mMHandler.sendEmptyMessage(ToRefreUi); mMHandler.sendEmptyMessage(ToRefreUi);
mBluetoothService.setOnCallback(this);
mBluetoothService.setOnCallbackBle(this);
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress); BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress);
if (bleDevice != null) { if (bleDevice != null) {
ToothBrushWiFiBleUtilsData.init(bleDevice, this, this); ToothBrushWiFiBleUtilsData.init(bleDevice, this, this);


case R.id.ota: case R.id.ota:
showFileChooser(); showFileChooser();
// mToothBrushWiFiBleUtilsData.setOta();
// mToothBrushWiFiBleUtilsData.setOta();


break; break;



+ 13
- 9
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/toothbrush_test/ToothbrushTestActivity.java View File

import android.os.Looper; import android.os.Looper;
import android.os.Message; import android.os.Message;
import android.text.TextUtils; import android.text.TextUtils;
import android.widget.Button;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;


import com.pingwang.bluetoothlib.device.BleDevice; import com.pingwang.bluetoothlib.device.BleDevice;




import aicare.net.cn.sdk.ailinksdkdemoandroid.R; import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import cn.net.aicare.modulelibrary.module.BleToothbrush.ToothbrushTestData; import cn.net.aicare.modulelibrary.module.BleToothbrush.ToothbrushTestData;
import cn.net.aicare.modulelibrary.module.ToothBrush.ToothBrushBleUtilsData;


public class ToothbrushTestActivity extends BleBaseActivity implements ToothbrushTestData.BleToothbrushCallback, ToothbrushTestAdapter.OnSelectListener { public class ToothbrushTestActivity extends BleBaseActivity implements ToothbrushTestData.BleToothbrushCallback, ToothbrushTestAdapter.OnSelectListener {


private static final int MSG_NEXT = 101;// 下一步 private static final int MSG_NEXT = 101;// 下一步


private RecyclerView recycler_view; private RecyclerView recycler_view;
private Button btn_toothbrush_prevent_splash, btn_toothbrush_prevent_splash_test;
private TextView tv_toothbrush_status;


private List<ToothbrushTestBean> mList; private List<ToothbrushTestBean> mList;
private ToothbrushTestAdapter mAdapter; private ToothbrushTestAdapter mAdapter;
private String mMac; private String mMac;
private BleDevice mBleDevice; private BleDevice mBleDevice;
private ToothbrushTestData mToothbrushTestData; private ToothbrushTestData mToothbrushTestData;
private ToothBrushBleUtilsData mToothBrushBleUtilsData;


private int mStep;// 当前正在进行哪个步骤 private int mStep;// 当前正在进行哪个步骤
private int mSupportMode;// 支持的模式 private int mSupportMode;// 支持的模式


/** /**
* 添加测试项标题 * 添加测试项标题
*
* @param type 1:自动测试;2:手动测试 * @param type 1:自动测试;2:手动测试
*/ */
private void addTestTitle(int type) { private void addTestTitle(int type) {
* @param str str * @param str str
*/ */
private void showNgDialog(String str) { private void showNgDialog(String str) {
new AlertDialog.Builder(this)
.setTitle("请按照协议回复:")
.setMessage("\n" + str)
.setPositiveButton("确认", null)
.show();
new AlertDialog.Builder(this).setTitle("请按照协议回复:").setMessage("\n" + str).setPositiveButton("确认", null).show();
} }
} }

+ 4
- 3
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/toothbrush_test/ToothbrushTestAdapter.java View File

import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.TextView; import android.widget.TextView;


import java.util.List;

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


import java.util.List;

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

public class ToothbrushTestAdapter extends RecyclerView.Adapter<ToothbrushTestAdapter.ViewHolder> { public class ToothbrushTestAdapter extends RecyclerView.Adapter<ToothbrushTestAdapter.ViewHolder> {


private Context mContext; private Context mContext;

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

public static float[] LbToSt(float lbSize) { public static float[] LbToSt(float lbSize) {
float[] lbFloatS = new float[2]; float[] lbFloatS = new float[2];
int st = (int) lbSize / 14; int st = (int) lbSize / 14;
float lb = lbSize % 14f;
String str = String.valueOf(lbSize);
float lb = (float) (Double.parseDouble(str) - (st * 14));
lbFloatS[0] = st; lbFloatS[0] = st;
lbFloatS[1] = lb; lbFloatS[1] = lb;
return lbFloatS; return lbFloatS;


@Override @Override
public void onSupportUnit(List<SupportUnitBean> list) { public void onSupportUnit(List<SupportUnitBean> list) {
//支持的单位列表
for (SupportUnitBean supportUnitBean : list) {
addText("支持的单位列表:[" + supportUnitBean.toString() + "]");
}


} }


addText("版本号:" + version); addText("版本号:" + version);
} }


/**
* 请求同步时间
*
* @param quest 1-请求同步时间
*/
// @Override
// public void onSyncTime(int quest) {
// if (quest == 1) {
// if (mWeightScaleDevice != null) {
// mWeightScaleDevice.appSyncTime();
// }
// }
// }


@Override @Override
public void onBattery(int status, int battery) { public void onBattery(int status, int battery) {

+ 490
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/AllUnitUtils.java View File

package aicare.net.cn.sdk.ailinksdkdemoandroid.utils;

import android.text.TextUtils;

import java.text.DecimalFormat;
import java.util.Locale;

import aicare.net.cn.sdk.ailinksdkdemoandroid.config.UserUnitConfig;


/**
* 总的单位换算工具类
*/
public class AllUnitUtils {


public final static String LB_SPLIT = ":";
public final static String NO_DATA = "-1";
public final static String INCH_SPLIT_ONE = "′";
public final static String INCH_SPLIT_ONE_1 = "'";
public final static String INCH_SPLIT_TWO = "″";
public final static String INCH_SPLIT_TWO_1 = "\"";

public static String getHeightToUnit(int unit, int newUnit, String data, int decimal) {
String height = "";
if (TextUtils.isEmpty(data) || NO_DATA.equalsIgnoreCase(data)) {
return NO_DATA;
}
if (unit == newUnit) {
height = data;
}
switch (newUnit) {

case UserUnitConfig.USER_UNIT_CM:
height = getHeightToCm(unit, data, decimal);
break;

case UserUnitConfig.USER_UNIT_FEET:
height = getHeightToFeetFeet(unit, data, decimal);
break;
case UserUnitConfig.USER_UNIT_INCH:
height = getHeightToInch(unit, data, decimal);
break;

}
return height;

}


public static String getHeightToFeetFeet(int unit, String data, int decimal) {
String height = "";
float inch;
float cm;
if (TextUtils.isEmpty(data) || NO_DATA.equalsIgnoreCase(data)) {
return NO_DATA;
}
if (unit == UserUnitConfig.USER_UNIT_FEET) {//单位相同直接返回
height = data;
}

switch (unit) {
case UserUnitConfig.USER_UNIT_CM:
inch = UnitUtils.cmToInch(Float.parseFloat(data));
height = getHeightInchToFeet(inch, decimal);
break;
case UserUnitConfig.USER_UNIT_INCH:
height = getHeightInchToFeet(Float.parseFloat(data), decimal);
break;
}


return height;

}

private static String getHeightInchToFeet(float heightStr, int decimal) {
String inch;
float[] feetS = UnitUtils.inchToFeet(heightStr);
String decimalStr = "%." + decimal + "f";
inch = String.format(Locale.US, decimalStr, feetS[1]);
return ((int) feetS[0]) + INCH_SPLIT_ONE + inch + INCH_SPLIT_TWO;
}


/**
* 服务器返回(数据库读取)
*
* @param unit 当前的单位
* @param data 数据
* @param decimal 小数位
* @return 返回指定单位显示
*/
public static String getHeightToCm(int unit, String data, int decimal) {
double height = -1.0;
float inch;
if (TextUtils.isEmpty(data) || NO_DATA.equalsIgnoreCase(data)) {
return NO_DATA;
}
if (unit == UserUnitConfig.USER_UNIT_CM) {//单位相同直接返回
height = Float.parseFloat(data);
}

switch (unit) {
case UserUnitConfig.USER_UNIT_INCH:
if (data.contains(INCH_SPLIT_ONE)) {
return NO_DATA;
}
height = UnitUtils.inchToCm(Float.parseFloat(data));
break;

case UserUnitConfig.USER_UNIT_FEET:
inch = getHeightFeetToInch(data);
height = UnitUtils.inchToCm(inch);
break;

}
return getHoldDecimal(decimal, (float) height);
}


/**
* 服务器返回(数据库读取)
*
* @param unit 当前的单位
* @param data 数据
* @param decimal 小数位
* @return 返回指定单位显示
*/
public static String getHeightToInch(int unit, String data, int decimal) {
float height = -1f;
float inch;
if (TextUtils.isEmpty(data) || NO_DATA.equalsIgnoreCase(data)) {
return NO_DATA;
}
if (unit == UserUnitConfig.USER_UNIT_INCH) {//单位相同直接返回
height = Float.parseFloat(data);
}

switch (unit) {
case UserUnitConfig.USER_UNIT_CM:
height = UnitUtils.cmToInch(Float.parseFloat(data));
break;

case UserUnitConfig.USER_UNIT_FEET:
height = getHeightFeetToInch(data);
break;

}
return getHoldDecimal(decimal, height);
}


/**
* Feet:Inch转Inch
*/
private static float getHeightFeetToInch(String feetStr) {
float feet = 0;
float inch = 0;
if (feetStr.contains(INCH_SPLIT_ONE) && feetStr.contains(INCH_SPLIT_TWO)) {
String[] strings = feetStr.split(INCH_SPLIT_ONE);
feet = Float.parseFloat(strings[0]);
inch = Float.parseFloat(strings[1].substring(0, strings[1].length() - 1));
} else if (feetStr.contains(INCH_SPLIT_ONE_1) && feetStr.contains(INCH_SPLIT_TWO_1)) {
String[] strings = feetStr.split(INCH_SPLIT_ONE_1);
feet = Float.parseFloat(strings[0]);
inch = Float.parseFloat(strings[1].substring(0, strings[1].length() - 1));
}
return UnitUtils.feetToInch(feet) + inch;
}


/**
* 服务器返回(数据库读取)
*
* @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) {
oz = UnitUtils.lbToOz(UnitUtils.stToLb(Float.parseFloat(weightStlb[0])) + Float.parseFloat(weightStlb[1]));
g = UnitUtils.ozToG(oz);
weight = UnitUtils.gToKG(g);
}

break;
}
return getHoldDecimal(decimal, weight);
}


public static String getWeightToFg(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_FG) {//单位相同直接返回
weight = Float.parseFloat(data);
}

switch (unit) {
case UserUnitConfig.USER_UNIT_KG:
weight = UnitUtils.gToFG(UnitUtils.kgToG(Float.parseFloat(data)));
// KgTo(Float.valueOf(data));
break;

case UserUnitConfig.USER_UNIT_OZ:
g = UnitUtils.ozToG(Float.parseFloat(data));
weight = UnitUtils.gToFG(g);
break;
case UserUnitConfig.USER_UNIT_LB:
oz = getWeightLbToOz(data);
g = UnitUtils.ozToG(oz);
weight = UnitUtils.gToFG(g);
break;
case UserUnitConfig.USER_UNIT_G:
weight = UnitUtils.gToFG(Float.parseFloat(data));
break;
case UserUnitConfig.USER_UNIT_LB_LB:
oz = UnitUtils.lbToOz(Float.parseFloat(data));
g = UnitUtils.ozToG(oz);
weight = UnitUtils.gToFG(g);
break;
case UserUnitConfig.USER_UNIT_ST:
String[] weightStlb = null;
if (data.contains(":")) weightStlb = data.split(":");
if (weightStlb != null && weightStlb.length >= 2) {
oz = UnitUtils.lbToOz(UnitUtils.stToLb(Float.parseFloat(weightStlb[0])) + Float.parseFloat(weightStlb[1]));
g = UnitUtils.ozToG(oz);
weight = UnitUtils.gToFG(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;
}

public static int getWeightToG(int unit, String data, int decimal) {

int weightg = 0;
try {
weightg = (int) (Float.parseFloat(getWeightToKg(unit, data, decimal).trim()) * 1000);
} catch (Exception e) {
e.printStackTrace();
}


return weightg;


}


public static String getWeightToUnit(int unit, int newUnit, String data, int decimal) {
String weight = "";
if (TextUtils.isEmpty(data) || NO_DATA.equalsIgnoreCase(data)) {
return NO_DATA;
}
if (unit == newUnit) {
weight = data;
}
switch (newUnit) {

case UserUnitConfig.USER_UNIT_KG:
weight = getWeightToKg(unit, data, decimal);
break;
case UserUnitConfig.USER_UNIT_LB_LB:
weight = getWeightToLbLb(unit, data, decimal);
break;
case UserUnitConfig.USER_UNIT_ST:
weight = getWeightToStLb(unit, data, decimal);
break;
case UserUnitConfig.USER_UNIT_FG:
weight = getWeightToFg(unit, data, decimal);
break;


}
return weight;

}


public static String getWeightKgToOther(int goalUnit, String data, int decimal) {
return getWeightToUnit(UserUnitConfig.USER_UNIT_KG, goalUnit, data, decimal);
}


private static String getWeightToLbLb(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_LB_LB) {//单位相同直接返回
weight = Float.parseFloat(data);
}

switch (unit) {
case UserUnitConfig.USER_UNIT_FG:
g = UnitUtils.fgToG(Float.parseFloat(data));
oz = UnitUtils.gToOz(g);
weight = UnitUtils.ozToLbLb(oz);
break;
case UserUnitConfig.USER_UNIT_KG:
g = UnitUtils.kgToG(Float.parseFloat(data));
oz = UnitUtils.gToOz(g);
weight = UnitUtils.ozToLbLb(oz);
break;
case UserUnitConfig.USER_UNIT_OZ:
weight = UnitUtils.ozToLbLb(Float.parseFloat(data));
break;
case UserUnitConfig.USER_UNIT_LB:
oz = getWeightLbToOz(data);
weight = UnitUtils.ozToLbLb(oz);
break;
case UserUnitConfig.USER_UNIT_G:
oz = UnitUtils.gToOz(Float.parseFloat(data));
weight = UnitUtils.ozToLbLb(oz);
break;

}
return getHoldDecimal(decimal, weight);
}

private static String getWeightToStLb(int unit, String data, int decimal) {
String stlb_str = "0:0.0";

float weight = -1f;
float g;
float oz;
if (TextUtils.isEmpty(data) || NO_DATA.equalsIgnoreCase(data)) {
return NO_DATA;
}
if (unit == UserUnitConfig.USER_UNIT_ST) {//单位相同直接返回
return data;
}
switch (unit) {
case UserUnitConfig.USER_UNIT_FG:
g = UnitUtils.fgToG(Float.parseFloat(data));
oz = UnitUtils.gToOz(g);
weight = UnitUtils.ozToLbLb(oz);
break;
case UserUnitConfig.USER_UNIT_KG:
g = UnitUtils.kgToG(Float.parseFloat(data));
oz = UnitUtils.gToOz(g);
weight = UnitUtils.ozToLbLb(oz);
break;
case UserUnitConfig.USER_UNIT_OZ:
weight = UnitUtils.ozToLbLb(Float.parseFloat(data));
break;
case UserUnitConfig.USER_UNIT_LB:
oz = getWeightLbToOz(data);
weight = UnitUtils.ozToLbLb(oz);
break;
case UserUnitConfig.USER_UNIT_G:
oz = UnitUtils.gToOz(Float.parseFloat(data));
weight = UnitUtils.ozToLbLb(oz);
break;

}


float[] stlb = UnitUtils.LbToSt(weight);
stlb_str = (int) stlb[0] + ":" + Math.round(stlb[1] * 10) / 10f;


return stlb_str;
}


public static int getToMmhg(float kpa, int decimal, int unit) {
float mmhg = 0;
switch (unit) {
case UserUnitConfig.USER_UNIT_KPA:
float data = UnitUtils.kpaToMmhg(kpa);
mmhg = Float.parseFloat(getHoldDecimal(decimal, data));
break;
case UserUnitConfig.USER_UNIT_MMHG:
mmhg = kpa;
break;
}
return (int) mmhg;
}

public static int getToMmhg(String kpa, int decimal, int unit) {
return getToMmhg(Float.parseFloat(kpa), decimal, unit);
}

public static int getC(String temperature, int decimal, int unit) {
float c = 0f;
try {
if (unit == UserUnitConfig.USER_UNIT_F) {
c = Float.parseFloat(getHoldDecimal(decimal, UnitUtils.FToC(Float.parseFloat(temperature)))) * 100f;
} else if (unit == UserUnitConfig.USER_UNIT_C) {
c = Float.parseFloat(temperature) * 100f;
}
} catch (NumberFormatException e) {
e.printStackTrace();
}
return (int) c;


}




/**
* 保留小数位,不足后面补0
*
* @param decimal 保留几位小数,后面补0
* @param value 原始小数
* @return 保留后的数据
*/
public static String getHoldDecimal(int decimal, float value) {
if (decimal > 0) {

StringBuilder decimalStr = new StringBuilder("0.");
for (int i = 0; i < decimal; i++) {
decimalStr.append("0");
}

DecimalFormat df = new DecimalFormat(decimalStr.toString());
return df.format(value).replace(",", ".");

}
String s = String.format(Locale.US, "%."+decimal+"f", value);
return s;
}
}

+ 100
- 95
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/CheckPermissionUtils.java View File

package aicare.net.cn.sdk.ailinksdkdemoandroid.utils; package aicare.net.cn.sdk.ailinksdkdemoandroid.utils;


import android.Manifest; import android.Manifest;
import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.provider.Settings; import android.provider.Settings;
import android.view.View; import android.view.View;


import java.lang.ref.WeakReference;
import java.util.Map;

import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.HintDataDialogFragment;
import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback; import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts; import androidx.activity.result.contract.ActivityResultContracts;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;


import java.lang.ref.WeakReference;
import java.util.Map;

import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.HintDataDialogFragment;

/** /**
* @author xing<br> * @author xing<br>
* @date 2022/11/24<br> * @date 2022/11/24<br>


public CheckPermissionUtils(AppCompatActivity activity) { public CheckPermissionUtils(AppCompatActivity activity) {
mPermissionRequestFragment = new PermissionRequestFragment(); mPermissionRequestFragment = new PermissionRequestFragment();
WeakReference<AppCompatActivity> mActivity = new WeakReference<>(activity);;
WeakReference<AppCompatActivity> mActivity = new WeakReference<>(activity);
mPermissionRequestFragment.setActivity(mActivity.get()); mPermissionRequestFragment.setActivity(mActivity.get());


} }
private String[] LOCATION_PERMISSION = new String[]{Manifest.permission.ACCESS_FINE_LOCATION}; private String[] LOCATION_PERMISSION = new String[]{Manifest.permission.ACCESS_FINE_LOCATION};
private String[] BLUETOOTH_PERMISSION = new String[]{Manifest.permission.BLUETOOTH_SCAN, Manifest.permission.BLUETOOTH_ADVERTISE, Manifest.permission.BLUETOOTH_CONNECT}; private String[] BLUETOOTH_PERMISSION = new String[]{Manifest.permission.BLUETOOTH_SCAN, Manifest.permission.BLUETOOTH_ADVERTISE, Manifest.permission.BLUETOOTH_CONNECT};
private ActivityResultLauncher<String[]> mActivityResultLauncher; private ActivityResultLauncher<String[]> mActivityResultLauncher;
private ActivityResultLauncher<Intent> mActivityResultIntentLauncher;
private int mErrNumber; private int mErrNumber;
private FragmentManager mFragmentManager; private FragmentManager mFragmentManager;


public void onCreate(@Nullable Bundle savedInstanceState) { public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
initPermissions(); initPermissions();
initLocationActivity();
} }


protected void initPermissions() { protected void initPermissions() {
} }
return; return;
} }
if (mContext==null||mActivity==null) {
if (mContext == null || mActivity == null) {
return; return;
} }
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
boolean bleStatus = isLocServiceEnable(mContext); boolean bleStatus = isLocServiceEnable(mContext);
if (!bleStatus) { if (!bleStatus) {
//没有开启定位服务 //没有开启定位服务
HintDataDialogFragment.newInstance().setTitle("提示",0)
.setContent("请求打开定位权限", true)
.setOnDialogListener(new HintDataDialogFragment.onDialogListener() {
@Override
public void onCancelListener(View v) {

}

@Override
public void onSucceedListener(View v) {
startLocationActivity();
}
}).show(mActivity.getSupportFragmentManager());
HintDataDialogFragment.newInstance().setTitle("提示", 0).setContent("请求开启定位服务", true).setOnDialogListener(new HintDataDialogFragment.onDialogListener() {
@Override
public void onCancelListener(View v) {

}

@Override
public void onSucceedListener(View v) {
startLocationActivity();
}
}).show(mActivity.getSupportFragmentManager());
} else { } else {
onPermissionsOk(); onPermissionsOk();
} }


} }


/**
* 检查蓝牙权限
*
* @return boolean
*/
private boolean checkBluetoothPermission() { private boolean checkBluetoothPermission() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
return true; return true;
onPermissionsOk(); onPermissionsOk();
} else { } else {
//请求的权限有一个或者多个被拒绝 //请求的权限有一个或者多个被拒绝
HintDataDialogFragment.newInstance().setTitle("提示",0).setContent("请求蓝牙权限", true)
.setOnDialogListener(new HintDataDialogFragment.onDialogListener() {
@Override
public void onCancelListener(View v) {

}

@Override
public void onSucceedListener(View v) {
mErrNumber++;
if (mErrNumber >= 3) {
startUseSetActivity(mContext);
} else {
mActivityResultLauncher.launch(BLUETOOTH_PERMISSION);
}
}
}).show(mActivity.getSupportFragmentManager());
HintDataDialogFragment.newInstance().setTitle("提示", 0).setContent("请求蓝牙权限", true).setOnDialogListener(new HintDataDialogFragment.onDialogListener() {
@Override
public void onCancelListener(View v) {

}

@Override
public void onSucceedListener(View v) {
mErrNumber++;
if (mErrNumber >= 3) {
startUseSetActivity(mContext);
} else {
mActivityResultLauncher.launch(BLUETOOTH_PERMISSION);
}
}
}).show(mActivity.getSupportFragmentManager());
} }




boolean bleStatus = isLocServiceEnable(mContext); boolean bleStatus = isLocServiceEnable(mContext);
if (!bleStatus) { if (!bleStatus) {
//没有开启定位服务 //没有开启定位服务
HintDataDialogFragment.newInstance().setTitle("提示",0).setContent("请求位置权限", true)
.setOnDialogListener(new HintDataDialogFragment.onDialogListener() {
@Override
public void onCancelListener(View v) {

}

@Override
public void onSucceedListener(View v) {
startLocationActivity();
}
}).show(mActivity.getSupportFragmentManager());
HintDataDialogFragment.newInstance().setTitle("提示", 0).setContent("请求位置权限", true).setOnDialogListener(new HintDataDialogFragment.onDialogListener() {
@Override
public void onCancelListener(View v) {

}

@Override
public void onSucceedListener(View v) {
startLocationActivity();
}
}).show(mActivity.getSupportFragmentManager());
} else { } else {
onPermissionsOk(); onPermissionsOk();
} }
} else { } else {
//请求的权限有一个或者多个被拒绝 //请求的权限有一个或者多个被拒绝
HintDataDialogFragment.newInstance().setTitle("提示",0).setContent("请求定位权限", true)
.setOnDialogListener(new HintDataDialogFragment.onDialogListener() {
@Override
public void onCancelListener(View v) {
HintDataDialogFragment.newInstance().setTitle("提示", 0).setContent("请求定位权限", true).setOnDialogListener(new HintDataDialogFragment.onDialogListener() {
@Override
public void onCancelListener(View v) {


}
}


@Override
public void onSucceedListener(View v) {
mErrNumber++;
if (mErrNumber >= 3) {
startUseSetActivity(mContext);
} else {
mActivityResultLauncher.launch(LOCATION_PERMISSION);
}
}
}).show(mActivity.getSupportFragmentManager());
@Override
public void onSucceedListener(View v) {
mErrNumber++;
if (mErrNumber >= 3) {
startUseSetActivity(mContext);
} else {
mActivityResultLauncher.launch(LOCATION_PERMISSION);
}
}
}).show(mActivity.getSupportFragmentManager());
} }




mActivityResultLauncher.launch(LOCATION_PERMISSION); mActivityResultLauncher.launch(LOCATION_PERMISSION);
} }


/**
* 初始化位置活动
*/
private void initLocationActivity() {
mActivityResultIntentLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
//定位服务页面返回
boolean bleStatus = isLocServiceEnable(mContext);
if (!bleStatus) {
//没有开启定位服务
HintDataDialogFragment.newInstance().setTitle("提示", 0).setContent("请求开启定位服务", true).setOnDialogListener(new HintDataDialogFragment.onDialogListener() {
@Override
public void onCancelListener(View v) {

}

@Override
public void onSucceedListener(View v) {
startLocationActivity();
}
}).show(mActivity.getSupportFragmentManager());
} else {
onPermissionsOk();
}
});
}


/** /**
* 启动去设置定位服务 * 启动去设置定位服务
*/ */
protected void startLocationActivity() {
Intent localIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
if (mActivity.getPackageManager().resolveActivity(localIntent, PackageManager.MATCH_DEFAULT_ONLY) != null) {
registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult result) {
if (result.getResultCode() == Activity.RESULT_OK) {
//定位服务页面返回
boolean bleStatus = isLocServiceEnable(mContext);
if (!bleStatus) {
//没有开启定位服务
HintDataDialogFragment.newInstance().setTitle("提示",0).setContent("请求位置权限", true)
.setOnDialogListener(new HintDataDialogFragment.onDialogListener() {
@Override
public void onCancelListener(View v) {

}

@Override
public void onSucceedListener(View v) {
startLocationActivity();
}
}).show(mActivity.getSupportFragmentManager());
} else {
onPermissionsOk();
}
}
}
}).launch(localIntent);
private void startLocationActivity() {
try {
if (mActivityResultIntentLauncher != null) {
Intent localIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
mActivityResultIntentLauncher.launch(localIntent);
}
} catch (Exception e) {
e.printStackTrace();
} }
} }


* 权限ok * 权限ok
*/ */
private void onPermissionsOk() { private void onPermissionsOk() {
if (!isDetached()&&!isRemoving()) {
if (!isDetached() && !isRemoving()) {
mFragmentManager.beginTransaction().detach(this).commit(); mFragmentManager.beginTransaction().detach(this).commit();
} }



+ 2
- 2
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/FileProvider7.java View File

import android.net.Uri; import android.net.Uri;
import android.os.Build; import android.os.Build;


import java.io.File;

import androidx.core.content.FileProvider; import androidx.core.content.FileProvider;


import java.io.File;

/** /**
* 兼容android 7.0以上获取uri异常的工具类 * 兼容android 7.0以上获取uri异常的工具类
*/ */

+ 3
- 2
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/FileUtils.java View File

import android.provider.OpenableColumns; import android.provider.OpenableColumns;
import android.util.Log; import android.util.Log;


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

import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.util.Comparator; import java.util.Comparator;


import aicare.net.cn.sdk.ailinksdkdemoandroid.base.MyApplication; import aicare.net.cn.sdk.ailinksdkdemoandroid.base.MyApplication;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;




public class FileUtils { public class FileUtils {

+ 2
- 2
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/L.java View File



import android.util.Log; import android.util.Log;


import androidx.annotation.NonNull;

import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import java.util.Locale; import java.util.Locale;


import androidx.annotation.NonNull;

/** /**
* 打印日志工具 * 打印日志工具
*/ */

+ 267
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/UnitUtils.java View File

package aicare.net.cn.sdk.ailinksdkdemoandroid.utils;

import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.util.Locale;

/**
* xing<br>
* 2019/4/29<br>
* 单位转换工具类
*/
public class UnitUtils {

//-------------重量------------

/**
* st转lb
*/
public static float stToLb(float st) {
float lb = st * 14;
return lb;
}
// public static float LbToSt(float lb) {
// float st = lb / 14;
// return st;
// }

/**
* lb转oz
*/
public static float lbToOz(float lb) {
float oz = lb * 16;
return oz;
}

/**
* oz转lb:oz
*/
public static float[] ozToLb(float ozSize) {
float[] ozFloatS = new float[2];
int lb = (int) ozSize / 16;
float oz = ozSize % 16f;
ozFloatS[0] = lb;
ozFloatS[1] = oz;
return ozFloatS;
}

/**
* oz转lb
*/
public static float ozToLbLb(float ozSize) {
return ozSize / 16f;
}

/**
* lb转st:lb
*/
public static float[] LbToSt(float lbSize) {
float[] lbFloatS = new float[2];
int st = (int) lbSize / 14;
float lb = lbSize % 14f;
lbFloatS[0] = st;
lbFloatS[1] = lb;
return lbFloatS;
}

/**
* lb转st
*/
public static float LbToStSt(float lbSize) {
return lbSize / 14f;
}

/**
* oz转g
*/
public static float ozToG(float oz) {
float g = oz * 28.3495F;
return g;
}

public static float gToOz(float g) {
return g / 28.3495F;
}


/**
* 千克转克
*/
public static float kgToG(float kg) {
return kg * 1000;
}

public static float gToKG(float g) {
return g / 1000;
}

/**
* 斤转克
*/
public static float fgToG(float fg) {
return fg * 500;
}

public static float gToFG(float g) {
return g / 500;
}

/**
* 斤转Kg
*/
public static float fgToKG(float fg) {
return fg / 2;
}


//-----------温度-------------

/**
* 摄氏度转华氏度,可能会出现小数点精度问题,例:xx.99999999
*/
public static float CToF(float c) {
float f = c * 1.8F + 32;
return f;
}


public static float CToFOne(float c) {
float f = c * 1.8F + 32;
return Math.round(f * 10) / 10f;
}

/**
* 华氏度转摄氏度
*/
public static float FToC(float f) {
float c = (f - 32) / 1.8f;
return c;
}
/**
* 华氏度转度
*/
public static float FToCOne(float f) {
float c = (f - 32) / 1.8f;
return Math.round(c * 10) / 10f;
}

//------------压力-----------------------

/**
* 千帕转毫米汞柱
*/
public static float kpaToMmhg(float kpa) {
float mmhg = (kpa * 7.50f);
return mmhg;
}

/**
* 毫米汞柱转千帕
*/
public static float mmhgToKpa(float mmhg) {
float kpa = (mmhg / 7.50f);
return kpa;
}

//-----------长度--------------------

public static float feetToInch(float feet) {
float inch = (feet * 12f);
return inch;
}

/**
* Inch转Feet:Inch
*/
public static float[] inchToFeet(float inchSize) {
float[] feetS = new float[2];
int feet = (int) (inchSize / 12);
float inch = (inchSize % 12f);
feetS[0] = feet;
feetS[1] = inch;
return feetS;
}

/**
* Inch转Feet
*/
public static float inchToFeetFeet(float inchSize) {
return inchSize / 12f;
}


public static float inchToCm(float inch) {
float cm = (inch * 2.54f);
return cm;
}

public static float cmToInch(float cm) {
return cm / 2.54F;
}


/**
* 米转码
*/
public static float mToYard(float m) {
return m * 1.0936133F;
}


/**
* 码转英里
*/
public static float yardToMi(float yard) {
return yard / 1760F;
}


//----------转换用----------


/**
* 保留小数位,不足后面补0
*
* @param decimal 保留几位小数,后面补0
* @param value 原始小数
* @return 保留后的数据
*/
public static String getHoldDecimal(int decimal, float value) {
if (decimal > 0) {

StringBuilder decimalStr = new StringBuilder("0.");
for (int i = 0; i < decimal; i++) {
decimalStr.append("0");
}

DecimalFormat df = new DecimalFormat(decimalStr.toString());
return df.format(value).replace(",", ".");

}
String s = String.format(Locale.US, "%."+decimal+"f", value);
return s;
}


/**
* 保留小数位,不足后面补0
*
* @param decimal 保留几位小数,后面补0
* @param value 原始小数
* @return 保留后的数据
*/
public static String getHoldDecimalNotRounding(int decimal, double value) {
if (decimal > 0) {
StringBuilder decimalStr = new StringBuilder("0.");
for (int i = 0; i < decimal; i++) {
decimalStr.append("0");
}
DecimalFormat df = new DecimalFormat(decimalStr.toString());
df.setRoundingMode(RoundingMode.DOWN);//向下取,丢掉后面的
return df.format(value).replace(",", ".");

}
return String.valueOf((int) value);
}

}

+ 0
- 0
app/src/main/res/layout/activity_ble.xml View File


Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save