Ver código fonte

更新demo到1.15.05版本

master
陈福行 7 meses atrás
pai
commit
790b7ff755
72 arquivos alterados com 5271 adições e 390 exclusões
  1. 9
    9
      app/build.gradle
  2. 17
    4
      app/src/main/AndroidManifest.xml
  3. 0
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ADWeightScaleUserActivity.java
  4. 0
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/AboutActivity.java
  5. 17
    13
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BleCmdActivity.java
  6. 2
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BroadcastScaleActivity.java
  7. 38
    21
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ClearShakeHandsActivity.java
  8. 2
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/HeightCmdActivity.java
  9. 133
    113
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/HeightWeightScaleActivity.java
  10. 42
    15
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ShowBleActivity.java
  11. 73
    15
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TestCmdActivity.java
  12. 41
    20
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TransmissionActivity.java
  13. 30
    11
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/WeightScaleBleActivity.java
  14. 9
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/adapter/StringAdapter.java
  15. 253
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/base/BleAppNewBaseActivity.java
  16. 0
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/base/MyApplication.java
  17. 24
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/config/BleDeviceConfig.java
  18. 83
    55
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/home/HomeDataManager.java
  19. 4
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/home/JumpBean.java
  20. 117
    9
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/home/MainActivity.java
  21. 1
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/BleDemoActivity.java
  22. 246
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/PublicMqttActivity.java
  23. 2
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/TempInstrument/TempInstrumentActivity.java
  24. 23
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/airdetector/AirDetectorActivity.java
  25. 1
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/airdetector/AirDetectorShowUtil.java
  26. 97
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/ble_nutrition/BleNutritionActivity.java
  27. 419
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/ble_nutrition/BleNutritionNutrientActivity.java
  28. 1
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/blood_glucose/BloodGlucoseActivity.java
  29. 56
    16
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/body_scale_4g/BodyScale4GActivity.java
  30. 17
    6
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/broadcast_nutrition/BroadNutritionActivity.java
  31. 2
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/broadcast_weight_sacle/BroadcastWeightScaleActivity.java
  32. 511
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/bw05watch/Bw05WatchActivity.java
  33. 49
    4
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/coffee_scale/CoffeeScaleActivity.java
  34. 378
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/eight_bodyfat/EightBodyFatMcuActivity.java
  35. 15
    14
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/eight_bodyfat/EightBodyfatActivity.java
  36. 37
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/eight_bodyfat/EightBodyfatAdc.java
  37. 464
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/eight_bodyfat/dual_band/EightDoubleBodyfatActivity.java
  38. 47
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/eight_bodyfat/dual_band/UserInfoBean.java
  39. 395
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/gasDetector/GasDetectorActivity.java
  40. 1
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/meat_probe_charger/MeatProbeChargerActivity.java
  41. 114
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/BleScanUtil.java
  42. 38
    5
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/EightBodyFatAlgorithms.java
  43. 112
    5
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/EightBodyFatBean.java
  44. 2
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/FileProvider7.java
  45. 65
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/JsonLoader.java
  46. 6
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/L.java
  47. 5
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/MyBleStrUtils.java
  48. 5
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/TimeUtils.java
  49. 9
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/UnitUtils.java
  50. 5
    0
      app/src/main/res/drawable/baseline_delete_24.xml
  51. 6
    3
      app/src/main/res/layout/activity_ble.xml
  52. 36
    1
      app/src/main/res/layout/activity_ble_nutrition.xml
  53. 180
    0
      app/src/main/res/layout/activity_ble_nutrition_nutrient.xml
  54. 9
    4
      app/src/main/res/layout/activity_body_scale_4g.xml
  55. 333
    0
      app/src/main/res/layout/activity_bw05_watch.xml
  56. 15
    1
      app/src/main/res/layout/activity_clear_shake_hands.xml
  57. 6
    0
      app/src/main/res/layout/activity_coffee_scale.xml
  58. 142
    0
      app/src/main/res/layout/activity_eight_double_body_fata.xml
  59. 283
    0
      app/src/main/res/layout/activity_gas_detector.xml
  60. 15
    0
      app/src/main/res/layout/activity_height_bodyfat.xml
  61. 25
    0
      app/src/main/res/layout/activity_main.xml
  62. 136
    0
      app/src/main/res/layout/activity_public_mqtt.xml
  63. 2
    2
      app/src/main/res/layout/activity_show_ble.xml
  64. 1
    1
      app/src/main/res/layout/activity_temp_instrument.xml
  65. 32
    5
      app/src/main/res/layout/activity_test_cmd.xml
  66. 7
    1
      app/src/main/res/layout/activity_transmission.xml
  67. 2
    2
      app/src/main/res/layout/item_home_list.xml
  68. 2
    1
      app/src/main/res/values-fr/strings.xml
  69. 8
    2
      app/src/main/res/values-zh/strings.xml
  70. 2
    2
      app/src/main/res/values/colors.xml
  71. 10
    4
      app/src/main/res/values/strings.xml
  72. 2
    2
      build.gradle

+ 9
- 9
app/build.gradle Ver arquivo

@@ -1,12 +1,12 @@
apply plugin: 'com.android.application'
apply plugin: 'com.jakewharton.butterknife'
android {
compileSdkVersion 33
compileSdkVersion 34
defaultConfig {
applicationId "aicare.net.cn.sdk.ailinksdkdemoandroid"
minSdkVersion 21
targetSdkVersion 33
versionName "1.11.14"
targetSdkVersion 34
versionName "1.15.05"
versionCode getVersionCodeNumber(versionName)
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
@@ -18,8 +18,8 @@ android {
}

compileOptions {
sourceCompatibility '1.8'
targetCompatibility '1.8'
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}

repositories {
@@ -66,10 +66,10 @@ dependencies {
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'androidx.cardview:cardview:1.0.0'
testImplementation 'junit:junit:4.12'
implementation 'com.github.elinkthings:AILinkSDKRepositoryAndroid:1.14.6'//蓝牙核心库
//OTA库,需要依赖核心库
// implementation 'com.github.elinkthings:AILinkSDKOtaLibraryAndroid:1.1.6'
implementation 'com.github.elinkthings:AILinkSDKParsingLibraryAndroid:1.9.4'//蓝牙解析
implementation 'com.github.elinkthings:AILinkSDKRepositoryAndroid:1.14.17'//蓝牙核心库
implementation 'com.github.elinkthings:AILinkSDKParsingLibraryAndroid:1.9.6'//蓝牙解析库,需要依赖核心库
implementation 'com.github.elinkthings:AILinkMqttRepositoryAndroid:1.2.0'//MQTT
implementation 'androidx.recyclerview:recyclerview:1.3.2'
implementation 'com.jakewharton:butterknife:10.2.3'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.3'

+ 17
- 4
app/src/main/AndroidManifest.xml Ver arquivo

@@ -45,6 +45,7 @@


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

<activity android:name=".ShowBleActivity" />
<activity android:name=".BabyCmdActivity" />
<activity android:name=".TempGunCmdActivity" />
@@ -57,9 +58,10 @@
<activity android:name=".ConnectBleTestActivity" />
<activity android:name=".ADWeightScaleCmdActivity" />
<activity android:name=".ADWeightScaleUserActivity" />
<activity android:name=".modules.wifi_ble_scale.WeightScaleWifiBleActivity" />
<activity android:name=".WeightScaleBleActivity" />
<activity android:name=".WifiConfigActivity" />
<activity android:name=".EightBodyfatActivity" />
<activity android:name=".modules.eight_bodyfat.EightBodyfatActivity" />
<activity android:name=".modules.blood_glucose.BloodGlucoseActivity" />
<activity android:name=".BabyBodyFatCmdActivity" />
<activity android:name=".BroadcastScaleActivity" />
@@ -117,9 +119,16 @@
android:name=".modules.barometric_temp_humidity.BarometricTempHygrometerActivity"
android:screenOrientation="portrait" />
<activity android:name=".modules.wifible_sphy.WifiBleSphyActivity" />
<activity android:name=".modules.wifi_ble_scale.WeightScaleWifiBleActivity" />
<activity android:name=".modules.BleDemoActivity" />
<activity android:name=".modules.PublicWifiBleOtaActivity" />
<activity android:name=".modules.eight_bodyfat.dual_band.EightDoubleBodyfatActivity" />
<activity android:name=".modules.PublicMqttActivity" />

<activity
android:name=".modules.bw05watch.Bw05WatchActivity"
android:screenOrientation="portrait" />
<activity android:name=".modules.ble_nutrition.BleNutritionNutrientActivity" />
<activity android:name=".modules.eight_bodyfat.EightBodyFatMcuActivity" />
<activity android:name=".modules.gasDetector.GasDetectorActivity" />

<provider
android:name="androidx.core.content.FileProvider"
@@ -130,7 +139,11 @@
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
<service android:name="com.pingwang.bluetoothlib.server.ELinkBleServer"/>

<service
android:name="org.eclipse.paho.android.service.MqttService"
android:enabled="true"
android:exported="true"></service>
</application>

</manifest>

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

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

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

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


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

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

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


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

+ 17
- 13
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BleCmdActivity.java Ver arquivo

@@ -27,7 +27,6 @@ import com.pingwang.bluetoothlib.config.CmdConfig;
import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.device.BleSendCmdUtil;
import com.pingwang.bluetoothlib.device.SendBleBean;
import com.pingwang.bluetoothlib.listener.CallbackDisIm;
import com.pingwang.bluetoothlib.listener.OnBleCompanyListener;
import com.pingwang.bluetoothlib.listener.OnBleDeviceDataListener;
import com.pingwang.bluetoothlib.listener.OnBleErrListener;
@@ -122,7 +121,7 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList);
listView.setAdapter(listAdapter);
bleDataUtils = BleDataUtils.getInstance();
findViewById(R.id.btnClear).setOnClickListener(this);
findViewById(R.id.btnClearShakeHands).setOnClickListener(this);
findViewById(R.id.btnPause).setOnClickListener(this);
findViewById(R.id.btnHandshake).setOnClickListener(this);
findViewById(R.id.btnVersion).setOnClickListener(this);
@@ -172,7 +171,7 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On
mAILinkBleManager.connectDevice(new BleValueBean(mAddress, mCid, mVid, mPid));
addShowData("连接设备");
break;
case R.id.btnClear:
case R.id.btnClearShakeHands:
if (mList != null)
mList.clear();
mHandler.sendEmptyMessage(REFRESH_DATA);
@@ -247,11 +246,16 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On
sendData(sendBleBean);
break;
case R.id.btnBroadcastTimeWrite:
int time = Integer.parseInt(etBroadcastTime.getText().toString().trim());
byte[] broadcastTime = bleDataUtils.getBroadcastTime(time);
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.setBleBroadcastTime(broadcastTime));
sendData(sendBleBean);
try {
int time = Integer.parseInt(etBroadcastTime.getText().toString().trim());
byte[] broadcastTime = bleDataUtils.getBroadcastTime(time);
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.setBleBroadcastTime(broadcastTime));
sendData(sendBleBean);
} catch (NumberFormatException e) {
e.printStackTrace();
Toast.makeText(this, "请输入正确的广播时间", Toast.LENGTH_SHORT).show();
}
break;

case R.id.btnDidRead:
@@ -369,7 +373,6 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On
public void onServiceSuccess() {
addShowData("服务与界面建立连接成功");

CallbackDisIm.getInstance().addListListener(this);
mAILinkBleManager.setOnCallbackBle(this);
mAILinkBleManager.deviceConnectListener(mAddress, true);
connectSuccess();
@@ -416,7 +419,6 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On

@Override
public void unbindServices() {
CallbackDisIm.getInstance().removeListener(this);
mAILinkBleManager.disconnectAll();
if (mAILinkBleManager != null) {
mAILinkBleManager.removeOnCallbackBle(this);
@@ -436,7 +438,7 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On
@Override
public void onDisConnected(@NonNull String mac, int code) {
//TODO 连接断开
L.iw(TAG, "连接断开");
L.i( "连接断开");
if (mAddress.equals(mac)) {
Toast.makeText(mContext, "连接断开:" + code, Toast.LENGTH_SHORT).show();
mBleDevice = null;
@@ -621,7 +623,9 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On
@Override
public void onBleBroadcastTime(int time) {
addShowData("广播间隔:" + time);

if (etBroadcastTime != null) {
etBroadcastTime.setText(String.valueOf(time));
}
}

@Override
@@ -701,7 +705,7 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On
"\n设备版本:" + mDeviceVersion +
"\n设备:CID=0x" + Integer.toHexString(mCid) + " VID=0x" + Integer.toHexString(mVid) + " PID=0x" + Integer.toHexString(mPid) +
"\n手机型号:" + AppPhoneInfoUtils.getPhoneInfo() + " " + AppPhoneInfoUtils.getBrand() +
"\n手机系统:" + AppPhoneInfoUtils.getSystemVersionString()+
"\n手机系统:" + AppPhoneInfoUtils.getSystemVersionString() +
"\n手机电量:" + systemBattery;
L.iw(appData);


+ 2
- 1
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BroadcastScaleActivity.java Ver arquivo

@@ -195,7 +195,7 @@ public class BroadcastScaleActivity extends BleNewBaseActivity implements OnCall
//与服务建立连接
mDevice = BroadcastScaleDeviceData.getInstance();
mDevice.setOnNotifyData(this);
AILinkBleManager.getInstance().setOnBleBroadcastDataListener(this);
AILinkBleManager.getInstance().addOnBleBroadcastDataListener(this);
AILinkBleManager.getInstance().startScan(0, BleConfig.UUID_SERVER_BROADCAST_AILINK);
}

@@ -211,6 +211,7 @@ public class BroadcastScaleActivity extends BleNewBaseActivity implements OnCall
mDevice.clear();
mDevice = null;
}
AILinkBleManager.getInstance().removeOnBleBroadcastDataListener(this);

}


+ 38
- 21
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ClearShakeHandsActivity.java Ver arquivo

@@ -52,8 +52,9 @@ public class ClearShakeHandsActivity extends BleBaseActivity implements OnCallba
private BleDevice mBleDevice;
private String mAddress;
private BleSendCmdUtil mBleSendCmdUtil;
private int type=0x01;
private int mCid = 0x01;
private byte unit = 0;
private boolean mPauseRefresh = false;
private Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
@@ -74,7 +75,7 @@ public class ClearShakeHandsActivity extends BleBaseActivity implements OnCallba
setContentView(R.layout.activity_clear_shake_hands);
mContext = this;
mAddress = getIntent().getStringExtra("mac");
type = getIntent().getIntExtra("type", -1);
mCid = getIntent().getIntExtra("cid", -1);
mBleSendCmdUtil = BleSendCmdUtil.getInstance();

init();
@@ -86,9 +87,11 @@ public class ClearShakeHandsActivity extends BleBaseActivity implements OnCallba
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList);
listView.setAdapter(listAdapter);

findViewById(R.id.btnPause).setOnClickListener(this);
findViewById(R.id.btn_set_unit).setOnClickListener(this);
findViewById(R.id.btn1).setOnClickListener(this);
findViewById(R.id.clear).setOnClickListener(this);
findViewById(R.id.btnClearShakeHands).setOnClickListener(this);
et_type = findViewById(R.id.et_type);
}

@@ -107,17 +110,21 @@ public class ClearShakeHandsActivity extends BleBaseActivity implements OnCallba
}
break;

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

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

@@ -141,7 +156,7 @@ public class ClearShakeHandsActivity extends BleBaseActivity implements OnCallba
data[1] = unit;
sendMcuBean.setHex(0x01, data);
mBleDevice.sendData(sendMcuBean);
mList.add(TimeUtils.getTime() + "发送->" + BleStrUtils.byte2HexStr(data));
mList.add(TimeUtils.getTime() + "发送(A7)->" + BleStrUtils.byte2HexStr(data));
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@@ -155,14 +170,13 @@ public class ClearShakeHandsActivity extends BleBaseActivity implements OnCallba
//与服务建立连接
if (mAILinkBleManager != null) {
mBleDevice = mAILinkBleManager.getBleDevice(mAddress);
//设置不加密
mBleDevice.setA7Encryption(false);
mBleDevice.setOnBleDeviceDataListener(ClearShakeHandsActivity.this);
mBleDevice.setOnBleVersionListener(ClearShakeHandsActivity.this);
mBleDevice.setOnBleOtherDataListener(ClearShakeHandsActivity.this);
byte[] bytes = mBleSendCmdUtil.setClearShakeHands();
SendBleBean sendBleBean=new SendBleBean();
sendBleBean.setHex(bytes);
mBleDevice.sendData(sendBleBean);
mBleDevice.sendData(new SendBleBean(mBleSendCmdUtil.getBleVersion()));

}
}

@@ -228,25 +242,28 @@ public class ClearShakeHandsActivity extends BleBaseActivity implements OnCallba

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

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

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

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

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


+ 2
- 2
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/HeightCmdActivity.java Ver arquivo

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

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

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



+ 133
- 113
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/HeightWeightScaleActivity.java Ver arquivo

@@ -60,7 +60,7 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall

@Override
public void onServiceSuccess() {
logList.add(0, "绑定服务成功");
addText(0, "绑定服务成功");
if (mAILinkBleManager != null) {
mAILinkBleManager.setOnCallbackBle(this);
BleDevice bleDevice = mAILinkBleManager.getBleDevice(mAddress);
@@ -81,7 +81,7 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall

@Override
public void unbindServices() {
if (mAILinkBleManager !=null) {
if (mAILinkBleManager != null) {
mAILinkBleManager.removeOnCallbackBle(this);
}
}
@@ -96,6 +96,7 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall

listView = findViewById(R.id.listView);
mMHandler = new WeakReference<>(new MHandler()).get();
findViewById(R.id.btnPause).setOnClickListener(this);
findViewById(R.id.kg).setOnClickListener(this);
findViewById(R.id.jin).setOnClickListener(this);
findViewById(R.id.st_lb).setOnClickListener(this);
@@ -143,8 +144,7 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall
@Override
public void onDisConnected(String mac, int code) {
if (mac.equals(mAddress)) {
logList.add(0, "连接已经断开");
listAdapter.notifyDataSetChanged();
addText(0, "连接已经断开");

}

@@ -173,7 +173,7 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall

@Override
public void onVersion(String version) {
logList.add(0, "版本号:" + version);
addText(0, "版本号:" + version);

}

@@ -197,7 +197,7 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall
case HeightBodyFatBleUntils.MCU_SET_USER_RESULT:
mMHandler.removeMessages(SETUSER);

logList.add(0, "下发用户结果:" + resultStr);
addText(0, "下发用户结果:" + resultStr);
break;
case HeightBodyFatBleUntils.MCU_SET_UNIT_RESULT:
if (result == 0) {
@@ -206,46 +206,45 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall
if (currentHUnit == 0) {

}
text.setText("体重单位: " + currentWUnit +
"\n身高单位: " + currentHUnit +
text.setText("体重单位: " + getWeightUnitStr(currentWUnit) +
"\n身高单位: " + getHeightUnitStr(currentHUnit) +
"\n模式:" + currentMode + " 声音: " + currentVoice);
}
mMHandler.removeMessages(SETUNIT);
logList.add(0, "设置单位结果:" + resultStr);
addText(0, "设置单位结果:" + resultStr);
break;
case HeightBodyFatBleUntils.MCU_SET_WORK_MODE_RESULT:
if (result == 0) {
currentMode = selectMode;
text.setText("体重单位: " + currentWUnit +
"\n身高单位: " + currentHUnit +
text.setText("体重单位: " + getWeightUnitStr(currentWUnit) +
"\n身高单位: " + getHeightUnitStr(currentHUnit) +
"\n模式:" + currentMode + " 声音: " + currentVoice);
}
mMHandler.removeMessages(SETMODE);
logList.add(0, "设置工作模式:" + resultStr);
addText(0, "设置工作模式:" + resultStr);
break;
case HeightBodyFatBleUntils.MUC_REQUEST_VOICE_SET_RESULT:
if (result == 0) {
currentVoice = selectVoice;
text.setText("体重单位: " + currentWUnit +
"\n身高单位: " + currentHUnit +
text.setText("体重单位: " + getWeightUnitStr(currentWUnit) +
"\n身高单位: " + getHeightUnitStr(currentHUnit) +
"\n模式:" + currentMode + " 声音: " + currentVoice);
}
mMHandler.removeMessages(VOICE);
logList.add(0, "设置声音结果:" + resultStr);
addText(0, "设置声音结果:" + resultStr);
break;

default:break;
default:
break;

}
listAdapter.notifyDataSetChanged();


}

@Override
public void onMcuRequestUser() {
logList.add(0, "请求下发用户,点击下发用户");
listAdapter.notifyDataSetChanged();
addText(0, "请求下发用户,点击下发用户");

}

@@ -259,17 +258,16 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall
text.setText("体重单位: " + currentWUnit +
"\n身高单位: " + currentHUnit +
"\n模式:" + currentMode + " 声音: " + currentVoice);
logList.add(0, "体重状态 模式:" + workMode + " 电池电量: " + battery + " 电池状态: " + batteryStatus
+ "\n 体重单位: " + weightUnit + " 身高单位: " + heightUnit + " 声音状态: " + voice);
listAdapter.notifyDataSetChanged();
addText(0, "体重状态 模式:" + workMode + " 电池电量: " + battery + " 电池状态: " + batteryStatus
+ "\n 体重单位: " + getWeightUnitStr(weightUnit) + " 身高单位: " + getHeightUnitStr(heightUnit) + " 声音状态: " + voice);

}

@Override
public void onWeightBodyFat(int workMode, int weightMode, int weight, int decimals, int unit) {
logList.add(0, "体重体脂 模式:" + workMode + " 测量状态: " + weightMode + "\n 体重: " + weight
+ " 小数位: " + decimals + " 单位: " + unit);
listAdapter.notifyDataSetChanged();
addText(0, "体重体脂 模式:" + workMode + " 测量状态: " + weightMode + "\n 体重: " + weight
+ " 小数位: " + decimals + " 单位: " + getWeightUnitStr(unit));
if (weightMode == 2) {
mMHandler.removeMessages(ADC);
mMHandler.removeMessages(FINISH);
@@ -281,9 +279,9 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall

@Override
public void onWeightBaby(int workMode, int weightMode, int adultWeight, int adultBabyWeight, int babyWeight, int decimals, int unit) {
logList.add(0, "抱婴体重 模式:" + workMode + " 测量状态:" + weightMode + " 成人体重:" + adultWeight +
"\n 抱婴体重:" + adultBabyWeight + " 婴儿体重:" + babyWeight + " 小数位:" + decimals + " 单位" + unit);
listAdapter.notifyDataSetChanged();
addText(0, "抱婴体重 模式:" + workMode + " 测量状态:" + weightMode + " 成人体重:" + adultWeight +
"\n 抱婴体重:" + adultBabyWeight + " 婴儿体重:" + babyWeight + " 小数位:" + decimals + " 单位" + getWeightUnitStr(unit));
if (weightMode == 2) {
mMHandler.removeMessages(FINISH);

@@ -295,14 +293,15 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall

@Override
public void onWeight(int workMode, int weightMode, int weight, int decimals, int unit) {
logList.add(0, "体重 模式:" + workMode + " 测量状态: " + weightMode + "\n 体重: " + weight
+ " 小数位: " + decimals + " 单位: " + unit);
listAdapter.notifyDataSetChanged();


addText(0, "体重 模式:" + workMode + " 测量状态: " + weightMode + "\n 体重: " + weight
+ " 小数位: " + decimals + " 单位: " + getWeightUnitStr(unit));
if (weightMode == 2) {
mMHandler.removeMessages(FINISH);
mMHandler.sendEmptyMessageDelayed(FINISH, 40000);
}
if (mHeightBodyFatUser!=null) {
if (mHeightBodyFatUser != null) {

mHeightBodyFatUser.setWeight(weight);
mHeightBodyFatUser.setDecimals(decimals);
@@ -314,7 +313,7 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall
@Override
public void onAdc(int workMode, int status, int adcType, long adc, int arithmetic) {
mMHandler.removeMessages(ADC);
logList.add(0, "阻抗数据 模式:" + workMode + " 测量状态: " + status + "\n 阻抗类型: " + adcType
addText(0, "阻抗数据 模式:" + workMode + " 测量状态: " + status + "\n 阻抗类型: " + adcType
+ " 阻抗: " + adc + " 算法位: " + arithmetic);

// arithmetic
@@ -326,55 +325,49 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall
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()
);
addText("体脂数据:" + "\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();


}

@Override
public void onHeart(int workMode, int status, int heart) {
logList.add(0, "心率数据 模式:" + workMode + " 测量状态: " + status + " 心率: " + heart);
listAdapter.notifyDataSetChanged();
addText(0, "心率数据 模式:" + workMode + " 测量状态: " + status + " 心率: " + heart);


}

@Override
public void onTEMP(int workMode, int sign, int temp, int decimals, int unit) {
logList.add(0, "温度数据 模式:" + workMode + " 温度: " + temp + " 正负: " + sign + "小数 : " + decimals + " 单位 : " + unit);
listAdapter.notifyDataSetChanged();
addText(0, "温度数据 模式:" + workMode + " 温度: " + temp + " 正负: " + sign + "小数 : " + decimals + " 单位 : " + unit);

}

@Override
public void onHeight(int workMode, int height, int decimals, int unit) {
logList.add(0, "身高数据 模式:" + workMode + " 身高: " + height + " 小数位: " + decimals + "单位 : " + unit);
listAdapter.notifyDataSetChanged();
addText(0, "身高数据 模式:" + workMode + " 身高: " + height + " 小数位: " + decimals + "单位 : " + getHeightUnitStr(unit));

}

@Override
public void onBodyfat1(int workMode, int bfr, int sfr, int vfr, int rom, int bmr, int age) {
logList.add(0, "体脂数据 模式:" + workMode + "\n 体脂率: " + bfr + " 皮下脂肪: " + sfr
addText(0, "体脂数据 模式:" + workMode + "\n 体脂率: " + bfr + " 皮下脂肪: " + sfr
+ "\n 内脏脂肪: " + vfr + " 肌肉路: " + rom + "\n 基础代谢率: " + bmr + " 年龄" + age);
listAdapter.notifyDataSetChanged();

}

@Override
public void onBodyfat2(int workMode, int bm, int water, int pp, int bmi, int heart, int obesityLevels) {
logList.add(0, "体脂数据 模式:" + workMode + " 骨量: " + bm + " 水分: " + water
addText(0, "体脂数据 模式:" + workMode + " 骨量: " + bm + " 水分: " + water
+ "\n 蛋白率: " + pp + " bmi: " + bmi + " 心率: " + heart + " \n肥胖等级" + obesityLevels);
listAdapter.notifyDataSetChanged();


}
@@ -382,22 +375,19 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall
@Override
public void onVoice(int status) {
mMHandler.removeMessages(VOICESTATUS);
logList.add(0, "声音状态 模式:" + status);
listAdapter.notifyDataSetChanged();
addText(0, "声音状态 模式:" + status);
}

@Override
public void onFinish(int workMode) {
logList.add(0, "测量完成 模式:" + workMode);
listAdapter.notifyDataSetChanged();
addText(0, "测量完成 模式:" + workMode);
mMHandler.removeMessages(FINISH);

}

@Override
public void onError(int error) {
logList.add(0, "错误码: " + error);
listAdapter.notifyDataSetChanged();
addText(0, "错误码: " + error);
}

@Override
@@ -407,48 +397,42 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall
switch (v.getId()) {
case R.id.kg:
selectWUnit = 0;
logList.add(0, "下发体重单位 :" + selectWUnit);
listAdapter.notifyDataSetChanged();
addText(0, "下发体重单位 :" + getHeightUnitStr(currentHUnit)+","+getWeightUnitStr(selectWUnit));
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(currentHUnit, selectWUnit));
mMHandler.removeMessages(SETUNIT);
mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000);
break;
case R.id.jin:
selectWUnit = 1;
logList.add(0, "下发体重单位 :" + selectWUnit);
listAdapter.notifyDataSetChanged();
addText(0, "下发体重单位 :" + getHeightUnitStr(currentHUnit)+","+getWeightUnitStr(selectWUnit));
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(currentHUnit, selectWUnit));
mMHandler.removeMessages(SETUNIT);
mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000);
break;
case R.id.st_lb:
selectWUnit = 4;
logList.add(0, "下发体重单位 :" + selectWUnit);
listAdapter.notifyDataSetChanged();
addText(0, "下发体重单位 :" + getHeightUnitStr(currentHUnit)+","+getWeightUnitStr(selectWUnit));
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(currentHUnit, selectWUnit));
mMHandler.removeMessages(SETUNIT);
mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000);
break;
case R.id.lb:
selectWUnit = 6;
logList.add(0, "下发体重单位 :" + selectWUnit);
listAdapter.notifyDataSetChanged();
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(currentHUnit, selectWUnit));
addText(0, "下发体重单位 :" + getHeightUnitStr(currentHUnit)+","+getWeightUnitStr(selectWUnit));
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(currentHUnit, currentHUnit));
mMHandler.removeMessages(SETUNIT);
mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000);
break;
case R.id.girl:
logList.add(0, "下用户 女 18岁 165cm :" + selectWUnit);
listAdapter.notifyDataSetChanged();
mHeightBodyFatUser=new HeightBodyFatUser(0,18,165,0,0);
addText(0, "下用户 女 18岁 165cm :" + selectWUnit);
mHeightBodyFatUser = new HeightBodyFatUser(0, 18, 165, 0, 0);
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUser(mHeightBodyFatUser.getSex(), mHeightBodyFatUser.getAge(), mHeightBodyFatUser.getHeight()));
mMHandler.removeMessages(SETUSER);
mMHandler.sendEmptyMessageDelayed(SETUSER, 3000);
break;
case R.id.man:
logList.add(0, "下用户 男 28岁 170cm :" + selectWUnit);
listAdapter.notifyDataSetChanged();
mHeightBodyFatUser=new HeightBodyFatUser(1,28,170,0,0);
addText(0, "下用户 男 28岁 170cm :" + selectWUnit);
mHeightBodyFatUser = new HeightBodyFatUser(1, 28, 170, 0, 0);
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUser(mHeightBodyFatUser.getSex(), mHeightBodyFatUser.getAge(), mHeightBodyFatUser.getHeight()));
mMHandler.removeMessages(SETUSER);
mMHandler.sendEmptyMessageDelayed(SETUSER, 3000);
@@ -456,98 +440,93 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall
break;
case R.id.cm:
selectHUnit = 0;
logList.add(0, "下发身高单位 :" + selectHUnit);
listAdapter.notifyDataSetChanged();
addText(0, "下发身高单位 :" + getHeightUnitStr(selectHUnit)+","+getWeightUnitStr(currentWUnit));
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(selectHUnit, currentWUnit));
mMHandler.removeMessages(SETUNIT);
mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000);
break;
case R.id.inch:
selectHUnit = 1;
logList.add(0, "下发身高单位 :" + selectHUnit);
listAdapter.notifyDataSetChanged();
addText(0, "下发身高单位 :" + getHeightUnitStr(selectHUnit)+","+getWeightUnitStr(currentWUnit));
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(selectHUnit, currentWUnit));
mMHandler.removeMessages(SETUNIT);
mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000);
break;
case R.id.ft_in:
selectHUnit = 2;
logList.add(0, "下发身高单位 :" + selectHUnit);
listAdapter.notifyDataSetChanged();
addText(0, "下发身高单位 :" + getHeightUnitStr(selectHUnit)+","+getWeightUnitStr(currentWUnit));
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(selectHUnit, currentWUnit));
mMHandler.removeMessages(SETUNIT);
mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000);
break;
case R.id.baby:
selectMode = 2;
logList.add(0, "下发工作模式 :" + selectMode);
listAdapter.notifyDataSetChanged();
addText(0, "下发工作模式 :" + selectMode);
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setWorkMode(selectMode));
mMHandler.removeMessages(SETMODE);
mMHandler.sendEmptyMessageDelayed(SETMODE, 3000);
break;
case R.id.bodyfat:
selectMode = 1;
logList.add(0, "下发工作模式 :" + selectMode);
listAdapter.notifyDataSetChanged();
addText(0, "下发工作模式 :" + selectMode);
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setWorkMode(selectMode));
mMHandler.removeMessages(SETMODE);
mMHandler.sendEmptyMessageDelayed(SETMODE, 3000);
break;
case R.id.weight:
selectMode = 3;
logList.add(0, "下发工作模式 :" + selectMode);
listAdapter.notifyDataSetChanged();
addText(0, "下发工作模式 :" + selectMode);
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setWorkMode(selectMode));
mMHandler.removeMessages(SETMODE);
mMHandler.sendEmptyMessageDelayed(SETMODE, 3000);
break;
case R.id.height_weight:
selectMode = 4;
logList.add(0, "下发工作模式 :" + selectMode);
listAdapter.notifyDataSetChanged();
addText(0, "下发工作模式 :" + selectMode);
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setWorkMode(selectMode));
mMHandler.removeMessages(SETMODE);
mMHandler.sendEmptyMessageDelayed(SETMODE, 3000);
break;
case R.id.deviceStatus:

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

logList.add(0, "获取声音状态");
listAdapter.notifyDataSetChanged();
addText(0, "获取声音状态");
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.getVoiceStatus());
mMHandler.removeMessages(VOICESTATUS);
mMHandler.sendEmptyMessageDelayed(VOICESTATUS, 3000);
break;
case R.id.finish:
logList.add(0, "回复测量完成");
listAdapter.notifyDataSetChanged();
addText(0, "回复测量完成");
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.replyTestFinish());
break;

case R.id.btnPause:
pauseRefresh = !pauseRefresh;
if (pauseRefresh) {
addText(0, "暂停刷新");
} else {
addText(0, "继续刷新");
}
break;


}
@@ -560,40 +539,81 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall
super.handleMessage(msg);
switch (msg.what) {
case SETMODE:
logList.add(0, "下发模式没有回复");
listAdapter.notifyDataSetChanged();
addText(0, "下发模式没有回复");
break;
case SETUNIT:
logList.add(0, "下发单位没有回复");
listAdapter.notifyDataSetChanged();
addText(0, "下发单位没有回复");
break;
case SETUSER:
logList.add(0, "下发用户没有回复");
listAdapter.notifyDataSetChanged();
addText(0, "下发用户没有回复");
break;
case FINISH:
logList.add(0, "没有回复测量完成指令(\n为了检测是否有回复。" +
addText(0, "没有回复测量完成指令(\n为了检测是否有回复。" +
"app会在接收到稳定体重的时候。开启定时器。去确认设备是否有回复测量完成。" +
"\n如果回复。此消息可以忽略)"+"\n 每次测量(母婴模式。的测量完成也只能发一次),测量完成的命令只能发一次!!!!。");
listAdapter.notifyDataSetChanged();
"\n如果回复。此消息可以忽略)" + "\n 每次测量(母婴模式。的测量完成也只能发一次),测量完成的命令只能发一次!!!!。");
break;
case ADC:
logList.add(0, "没有测量阻抗的指令(\n为了检测是否有回复。app会在接收到稳定体重的时候。开启定时器。去确认设备是否有回复测量阻抗的状态。\n如果回复。此消息可以忽略)");
listAdapter.notifyDataSetChanged();
addText(0, "没有测量阻抗的指令(\n为了检测是否有回复。app会在接收到稳定体重的时候。开启定时器。去确认设备是否有回复测量阻抗的状态。\n如果回复。此消息可以忽略)");
break;
case DEVICESTATUS:
logList.add(0, "没有接收到设备状态(\n为了检测是否有回复。app会在点击获取设备状态指令的时候。开启定时器。去确认设备是否有回复设备状态。\n如果回复。此消息可以忽略)");
listAdapter.notifyDataSetChanged();
addText("没有接收到设备状态(\n为了检测是否有回复。app会在点击获取设备状态指令的时候。开启定时器。去确认设备是否有回复设备状态。\n如果回复。此消息可以忽略)");
break;
case VOICE:
logList.add(0, "没有声音设置的回复(\n为了检测是否有回复。app会在点击设置声音的时候。开启定时器。去确认设备是否有回复设置声音。\n如果回复。此消息可以忽略)");
listAdapter.notifyDataSetChanged();
addText("没有声音设置的回复(\n为了检测是否有回复。app会在点击设置声音的时候。开启定时器。去确认设备是否有回复设置声音。\n如果回复。此消息可以忽略)");
break;
case VOICESTATUS:
logList.add(0, "没有声音状态的回复(\n为了检测是否有回复。app会在点击声音状态的时候。开启定时器。去确认设备是否有回复声音状态。\n如果回复。此消息可以忽略)");
listAdapter.notifyDataSetChanged();
addText(0, "没有声音状态的回复(\n为了检测是否有回复。app会在点击声音状态的时候。开启定时器。去确认设备是否有回复声音状态。\n如果回复。此消息可以忽略)");
break;
}
}
}

private String getWeightUnitStr(int weightUnit) {
switch (weightUnit) {
case 0:
return "kg";
case 1:
return "斤";
case 2:
return "lb:oz";
case 3:
return "oz";
case 4:
return "st:lb";
case 5:
return "g";
case 6:
return "lb";
}
return "";
}

private String getHeightUnitStr(int unit) {
switch (unit) {
case 0:
return "cm";
case 1:
return "inch";
case 2:
return "feet";

}
return "";
}


private boolean pauseRefresh = false;

private void addText(String text) {
addText(0, text);
}

private void addText(int index, String text) {
if (pauseRefresh) {
return;
}
logList.add(index, text);
listAdapter.notifyDataSetChanged();
}

}

+ 42
- 15
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ShowBleActivity.java Ver arquivo

@@ -28,6 +28,8 @@ import androidx.core.app.ActivityCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.pingwang.bluetoothlib.AILinkSDK;
import com.pingwang.bluetoothlib.bean.BleHandshakeBean;
import com.pingwang.bluetoothlib.bean.BleScanAddAilinkBean;
import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.config.BleConfig;
@@ -50,6 +52,7 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.home.HomeDataManager;
import aicare.net.cn.sdk.ailinksdkdemoandroid.home.MainActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.toothbrush.ToothBrushWifiBleActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.CheckPermissionUtils;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.MyBleStrUtils;
import aicare.net.cn.sdk.ailinksdkdemoandroid.view.MyItemDecoration;
import cn.net.aicare.modulelibrary.module.RopeSkipping.RopeSkippingBleData;
import cn.net.aicare.modulelibrary.module.scooter.SkateboardBleConfig;
@@ -145,14 +148,18 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O
RecyclerView recyclerView = findViewById(R.id.rv_data);
recyclerView.setLayoutManager(new LinearLayoutManager(mContext));
recyclerView.addItemDecoration(new MyItemDecoration(mContext, LinearLayoutManager.VERTICAL, 1, mContext.getResources()
.getColor(R.color.public_press_bg)));
.getColor(R.color.public_press_bg)));
Button btn = findViewById(R.id.btn);
Button btn1 = findViewById(R.id.btn1);
Button clear = findViewById(R.id.clear);
EditText et_filter_name = findViewById(R.id.et_filter_name);
EditText et_filter_mac = findViewById(R.id.et_filter_mac);
EditText et_cid = findViewById(R.id.et_cid);
et_cid.setText(String.valueOf(mScanCid));
if (mScanCid > 0) {
et_cid.setText(MyBleStrUtils.getHexString(mScanCid));
} else {
et_cid.setText(String.valueOf(mScanCid));
}


btn.setOnClickListener(new View.OnClickListener() {
@@ -162,24 +169,22 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O
BleLog.i(TAG, "搜索设备");
try {
String cidStr = et_cid.getText().toString().trim();
if (cidStr.startsWith("0x")) {
mScanCid = Integer.parseInt(cidStr, 16);
} else {
mScanCid = Integer.parseInt(cidStr);
}
mScanCid = Integer.parseInt(cidStr, 16);
} catch (NumberFormatException e) {
mScanCid = -1;
e.printStackTrace();
}
mFilterName = et_filter_name.getText().toString().trim();
mFilterMac = et_filter_mac.getText().toString().trim();
long scanOut = 30 * 1000;
if (mType == BleDeviceConfig.SMART_SCOOTER) {
List<BleScanAddAilinkBean> list = new ArrayList<>();
list.add(new BleScanAddAilinkBean(0x37, 0x03, 0x01, SkateboardBleConfig.UUID_BROADCAST));
mAILinkBleManager.startScan(30 * 1000, list, BleConfig.UUID_SERVER_AILINK, SkateboardBleConfig.UUID_BROADCAST);
mAILinkBleManager.startScan(scanOut, list, BleConfig.UUID_SERVER_AILINK, SkateboardBleConfig.UUID_BROADCAST);
} else {
//0000FEE7=手表
mAILinkBleManager.startScan(30 * 1000, BleConfig.UUID_BROADCAST_AILINK, BleConfig.UUID_SERVER_BROADCAST_AILINK, UUID.fromString("0000FEE7-0000-1000-8000-00805F9B34FB"), SkateboardBleConfig.UUID_BROADCAST);
mAILinkBleManager.startScan(scanOut, BleConfig.UUID_BROADCAST_AILINK, BleConfig.UUID_SERVER_BROADCAST_AILINK, UUID.fromString("0000FEE7-0000-1000-8000-00805F9B34FB"), SkateboardBleConfig.UUID_BROADCAST);
// BleScanUtil.scanLeDevice(AILinkBleManager.getInstance(), scanOut);
}
mBleValueList.clear();
listAdapter.notifyDataSetChanged();
@@ -191,7 +196,7 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O
@Override
public void onClick(View v) {
if (mAILinkBleManager != null) {
mAILinkBleManager.stopScan(10000);
mAILinkBleManager.stopScan();
}
}
});
@@ -214,8 +219,10 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O
mVid = bleValueBean.getVid();
mPid = bleValueBean.getPid();
mBleName = bleValueBean.getName();

if (mType == BleDeviceConfig.CLEAR_SHAKE_HANDS) {
//验证不握手,不加密的界面使用
//设置不握手
BleConfig.setHandshakeStatus(mac, false);
if (mAILinkBleManager != null) {
mAILinkBleManager.stopScan();
@@ -226,6 +233,7 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O
Intent intent = new Intent();
intent.setClass(ShowBleActivity.this, ToothBrushWifiBleActivity.class);
intent.putExtra("type", mType);
intent.putExtra("cid", mCid);
intent.putExtra("mac", mac);
startActivity(intent);

@@ -283,10 +291,10 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O
String data2 = BleStrUtils.byte2HexStr(bleValueBean.getManufacturerData());
showData.append(data2);
HintDataDialogFragment.newInstance()
.setTitle("自定义厂商数据", 0)
.setContent(showData.toString(), false)
.setOk("", 0)
.show(getSupportFragmentManager());
.setTitle("自定义厂商数据", 0)
.setContent(showData.toString(), false)
.setOk("", 0)
.show(getSupportFragmentManager());
}
});
recyclerView.setAdapter(listAdapter);
@@ -360,8 +368,9 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O

@Override
public void onServicesDiscovered(@NonNull String mac) {
BleDevice bleDevice = mAILinkBleManager.getBleDevice(mac);
initEncryption(bleDevice);
if (mac.equalsIgnoreCase(mNoEncryptionMac)) {
BleDevice bleDevice = mAILinkBleManager.getBleDevice(mac);
bleDevice.setA7Encryption(false);
mNoEncryptionMac = "";

@@ -614,4 +623,22 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivityForResult(intent, REQUEST_PERMISSION_CODE);
}

/**
* 初始化加密
* 主要用于license设备,不用加密
*/
public static void initEncryption(BleDevice bleDevice) {
if (bleDevice == null) {
return;
}
BleValueBean bleValueBean = bleDevice.getBleValueBean();
if (bleValueBean != null) {
BleHandshakeBean licenseDevice = AILinkSDK.getInstance().isLicenseDevice(bleValueBean.getCid(), bleValueBean.getVid(), bleValueBean.getPid());
if (licenseDevice != null) {
//license设备,不用加密
bleDevice.setA7Encryption(false);
}
}
}
}

+ 73
- 15
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TestCmdActivity.java Ver arquivo

@@ -20,19 +20,22 @@ import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.device.SendDataBean;
import com.pingwang.bluetoothlib.listener.CallbackDisIm;
import com.pingwang.bluetoothlib.listener.OnBleDeviceDataListener;
import com.pingwang.bluetoothlib.listener.OnBleMtuListener;
import com.pingwang.bluetoothlib.listener.OnBleOtherDataListener;
import com.pingwang.bluetoothlib.listener.OnCallbackDis;
import com.pingwang.bluetoothlib.utils.BleDensityUtil;
import com.pingwang.bluetoothlib.utils.BleLog;
import com.pingwang.bluetoothlib.utils.BleStrUtils;
import com.pingwang.bluetoothlib.utils.UuidUtils;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;

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

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


/**
* xing<br>
@@ -50,7 +53,7 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O
private List<String> mList;
private ArrayAdapter listAdapter;
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, etIncrementNumber;
private BleDevice mBleDevice;
private String mAddress;
private int sendTime = 1000;
@@ -58,10 +61,13 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O
private UUID sendUuidServer = null;
private String uuidEnd = "-0000-1000-8000-00805F9B34FB";
private String sendCmd;
private byte[] sendCmdB;
private long mSendNumber = 0;
private long mReceiveNumber = 0;
private boolean mShowLog = true;
private int mNum = 1;
private boolean mIncrementSend = false;
private int mNum = 0;
private int mNumMax = 514;
private Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
@@ -74,16 +80,34 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O
break;

case SEND_DATA:

if (sendUuid != null && sendUuidServer != null) {
mNum++;
SendDataBean sendDataBean = new SendDataBean(String.valueOf(mNum).getBytes(), sendUuid, BleConfig.WRITE_DATA, sendUuidServer);
mBleDevice.sendData(sendDataBean);
if (sendTime > 0) {
mHandler.sendEmptyMessageDelayed(SEND_DATA, sendTime);
int intervalTime = sendTime;
if (sendUuid != null && sendUuidServer != null && mBleDevice != null) {
byte[] sendData = sendCmdB;
if (mIncrementSend) {
//递增字节发送
mNum++;
if (mNum > mNumMax) {
addLog("递增发送结束");
mNum = 1;
return;
}
sendData = new byte[mNum];
for (int i = 0; i < mNum; i++) {
sendData[i] = (byte) (i);
}

intervalTime = sendTime + mNum;
addLog("发送数据量:" + mNum);
}
SendDataBean sendDataBean = new SendDataBean(sendData, sendUuid, BleConfig.WRITE_DATA, sendUuidServer);
mBleDevice.sendDataNow(sendDataBean);
if (intervalTime > 0) {
mHandler.sendEmptyMessageDelayed(SEND_DATA, intervalTime);
}
mSendNumber += sendDataBean.getHex().length;
tv_send_number.setText(String.valueOf(mSendNumber));
} else {
addLog("请先设置特征UUID和服务UUID");
}

break;
@@ -115,7 +139,9 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O
findViewById(R.id.btn_notify_status).setOnClickListener(this);
findViewById(R.id.btn_uuid_server).setOnClickListener(this);
findViewById(R.id.btn_log).setOnClickListener(this);
findViewById(R.id.btnIncrementSend).setOnClickListener(this);

etIncrementNumber = findViewById(R.id.etIncrementNumber);
et_cmd = findViewById(R.id.et_cmd);
et_uuid = findViewById(R.id.et_uuid);
et_time = findViewById(R.id.et_time);
@@ -130,7 +156,14 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn1:
try {
mNumMax = Integer.parseInt(etIncrementNumber.getText().toString().trim());
} catch (NumberFormatException e) {
e.printStackTrace();
mNumMax = 514;
}
sendCmd = et_cmd.getText().toString().trim();
sendCmdB = BleDensityUtil.getInstance().toBytes(sendCmd);
mHandler.removeMessages(SEND_DATA);
mHandler.sendEmptyMessage(SEND_DATA);
break;
@@ -151,19 +184,23 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O
case R.id.btn_uuid:
String uuid = et_uuid.getText().toString().trim().toUpperCase(Locale.ENGLISH);
sendUuid = UuidUtils.getUuid(uuid);
addLog("设置特征UUID");
break;
case R.id.btn_uuid_server:
String uuidServer = et_uuid_server.getText().toString().trim().toUpperCase(Locale.ENGLISH);
sendUuidServer = UuidUtils.getUuid(uuidServer);
addLog("设置服务UUID");
break;
case R.id.btn_time:
String time = et_time.getText().toString().trim().toUpperCase(Locale.ENGLISH);
sendTime = Integer.parseInt(time);
addLog("设置时间间隔(ms):" + sendTime);
break;

case R.id.btn_notify:
String notify = et_notify.getText().toString().trim().toUpperCase(Locale.ENGLISH);
readNotify(notify, mNotify);
addLog("设置Notify UUID");
break;
case R.id.btn_notify_status:
mNotify = !mNotify;
@@ -174,6 +211,12 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O
((Button) v).setText("log:" + (mShowLog ? "Y" : "N"));
break;

case R.id.btnIncrementSend:
mIncrementSend = !mIncrementSend;
// mBleDevice.setMtu(mNumMax);
((Button) v).setText("递增发送:" + (mIncrementSend ? "Y" : "N"));
break;

}
}

@@ -197,6 +240,13 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O
}
}


private void addLog(String log) {
if (mShowLog) {
mList.add(TimeUtils.getTimeSSS() + log);
mHandler.sendEmptyMessage(REFRESH_DATA);
}
}
//---------------------------------服务---------------------------------------------------


@@ -210,7 +260,12 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O
if (mBleDevice != null) {
mBleDevice.setOnBleOtherDataListener(this);
mBleDevice.setOnBleDeviceDataListener(this);

mBleDevice.setOnBleMtuListener(new OnBleMtuListener() {
@Override
public void OnMtu(int mtu) {
addLog("系统返回MTU:" + mtu);
}
});
}
}
}
@@ -246,8 +301,9 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O
//TODO 连接断开
BleLog.i(TAG, "连接断开");
mList.add(TimeUtils.getTime() + "连接断开");
mHandler.removeMessages(SEND_DATA);
mHandler.sendEmptyMessage(REFRESH_DATA);
finish();
}

@Override
@@ -264,6 +320,8 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O

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

@@ -292,8 +350,8 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O
@Override
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);
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) {

+ 41
- 20
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TransmissionActivity.java Ver arquivo

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

private TextView tv_device_info;
private EditText et, et_cid,et_a6,et_customize,et_name;
private Button send,send_a6, bt_clear, bt_clear_log,bt_cid,send_customize;
private EditText et, et_cid, et_a6, et_customize, et_name;
private Button send, send_a6, bt_clear, bt_clear_log, bt_cid, send_customize;
private ListView mListView;
private List<String> mlogList;
private final int ToRefreUi = 1;
@@ -44,6 +44,7 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic
private ArrayAdapter listAdapter;
private String mAddress;
private TransmissionDeviceData mTransmissionDeviceData;
private boolean isPause = false;

@Override
public void onServiceSuccess() {
@@ -55,8 +56,8 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic
mAILinkBleManager.setOnCallbackBle(this);
BleDevice bleDevice = mAILinkBleManager.getBleDevice(mAddress);
if (bleDevice != null) {
if (tv_device_info!=null) {
tv_device_info.setText("MAC:"+bleDevice.getMac());
if (tv_device_info != null) {
tv_device_info.setText("MAC:" + bleDevice.getMac());
}
mTransmissionDeviceData = new TransmissionDeviceData(bleDevice);
mTransmissionDeviceData.setMyBleCallback(this);
@@ -73,7 +74,7 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic

@Override
public void unbindServices() {
if (mAILinkBleManager !=null) {
if (mAILinkBleManager != null) {
mAILinkBleManager.removeOnCallbackBle(this);
}
}
@@ -104,6 +105,7 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic
send_a6.setOnClickListener(this);
send_customize.setOnClickListener(this);
findViewById(R.id.send_name).setOnClickListener(this);
findViewById(R.id.btPause).setOnClickListener(this);
bt_clear.setOnClickListener(this);
bt_cid.setOnClickListener(this);
bt_clear_log.setOnClickListener(this);
@@ -128,6 +130,8 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic
}
} else if (id == R.id.bt_clear) {
et.setText("");
et_a6.setText("");
et_customize.setText("");
} else if (id == R.id.bt_clear_log) {
mlogList.clear();
mMHandler.sendEmptyMessage(ToRefreUi);
@@ -136,28 +140,30 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic
if (mTransmissionDeviceData != null) {
mTransmissionDeviceData.getCid();
}
}else if (id == R.id.send_a6) {
} else if (id == R.id.send_a6) {
String hex = et_a6.getText().toString().toUpperCase().trim();
if (!TextUtils.isEmpty(hex)) {
byte[] hexStr = BleStrUtils.stringToByte(hex);
if (mTransmissionDeviceData != null) {
mTransmissionDeviceData.setSendDataA6( hexStr);
mTransmissionDeviceData.setSendDataA6(hexStr);
}
}
}else if (id == R.id.send_customize) {
} else if (id == R.id.send_customize) {
String hex = et_customize.getText().toString().toUpperCase().trim();
if (!TextUtils.isEmpty(hex)) {
byte[] hexStr = BleStrUtils.stringToByte(hex);
if (mTransmissionDeviceData != null) {
mTransmissionDeviceData.setSendDataCustomize( hexStr);
mTransmissionDeviceData.setSendDataCustomize(hexStr);
}
}
}else if (id == R.id.send_name) {
} else if (id == R.id.send_name) {
String name = et_name.getText().toString().trim();
if (!TextUtils.isEmpty(name)) {
byte[] names = BleDataUtils.getInstance().getBleName(name);
mTransmissionDeviceData.setSendDataA6(BleSendCmdUtil.getInstance().setBleName(names));
}
}else if (id == R.id.btPause){
isPause = !isPause;
}
}

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

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

@Override
@@ -179,24 +184,30 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic

@Override
public void onCid(int cid, int vid, int pid) {
mlogList.add(0, "收" + TimeUtils.getTime() + "cid:" + cid + "||vid:" + vid + "||pid:" + pid);
mMHandler.sendEmptyMessage(ToRefreUi);
addLog("收" + TimeUtils.getTime() + "cid:" + cid + "||vid:" + vid + "||pid:" + pid);
}

@Override
public void otherData(byte[] hex, String data) {
mlogList.add(0, "收 透传数据" + TimeUtils.getTime() + data);
mMHandler.sendEmptyMessage(ToRefreUi);
addLog("收 透传数据" + TimeUtils.getTime() + data);
}

@Override
public void sendData(String data) {
mlogList.add(0, "发 " + TimeUtils.getTimeSSS() + data);
mMHandler.sendEmptyMessage(ToRefreUi);
public void a6Data(byte[] hex, String data) {
addLog("收A6 payload数据" + TimeUtils.getTime() + data);
}

@Override
public void sendData(String data) {
addLog("发 " + TimeUtils.getTimeSSS() + data);
}


@Override
public void onDisConnected(String mac, int code) {
mlogList.add(0, "连接断开: " + mac + " code:" + code);
mMHandler.sendEmptyMessage(ToRefreUi);
}

private class MHandler extends Handler {
@Override
@@ -220,8 +231,18 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic
@Override
protected void onDestroy() {
super.onDestroy();
if (mAILinkBleManager !=null) {
if (mAILinkBleManager != null) {
mAILinkBleManager.disconnectAll();
}
}


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

}

+ 30
- 11
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/WeightScaleBleActivity.java Ver arquivo

@@ -53,7 +53,7 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl
private List<User> mUsers;
private User selectUser;
private int weighunit = BodyFatDataUtil.KG;
private ListView loglistView;
private ListView loglistView;
private ListView userlistView;

@Override
@@ -66,13 +66,9 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl
initdata();






}

private void initView(){
private void initView() {
findViewById(R.id.history).setOnClickListener(this);
findViewById(R.id.userlist).setOnClickListener(this);
findViewById(R.id.user).setOnClickListener(this);
@@ -89,7 +85,8 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl


}
private void initdata(){

private void initdata() {
mAddress = getIntent().getStringExtra("mac");

WeakReference weakReference = new WeakReference(new MHandler());
@@ -99,7 +96,7 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mlogList);
loglistView.setAdapter(listAdapter);

User defaultUser=getdefault();
User defaultUser = getdefault();
selectUser = defaultUser;

mUsers = new ArrayList<>();
@@ -112,7 +109,7 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl
userlistView.setAdapter(userAdapter);
}

private User getdefault(){
private User getdefault() {
User user = new User();
user.setModeType(BodyFatDataUtil.MODE_ORDINARY);
user.setSex(BodyFatDataUtil.SEX_MAN);
@@ -123,6 +120,7 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl
user.setId(1);
return user;
}

private void setUnitinit() {
kg.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
@@ -199,7 +197,7 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl
public void unbindServices() {
mlogList.add(0, "服务与界面建立断开连接成功");
mMHandler.sendEmptyMessage(ToRefreUi);
if (mAILinkBleManager !=null) {
if (mAILinkBleManager != null) {
mAILinkBleManager.removeOnCallbackBle(this);
}
}
@@ -257,10 +255,17 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl

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

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

mOldData = data;
mlogList.add(0, data);
mMHandler.sendEmptyMessage(ToRefreUi);
@@ -323,6 +328,8 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl
@Override
public void onAdc(int adc, int algorithmic) {
mlogList.add(0, "阻抗:" + adc + " 算法位:" + algorithmic);
selectUser.setAdc(adc);
mMHandler.sendEmptyMessage(TO_REFRE_USER);
mMHandler.sendEmptyMessage(ToRefreUi);
}

@@ -529,6 +536,7 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl
}

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


private class MHandler extends Handler {
@@ -541,6 +549,17 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl
listAdapter.notifyDataSetChanged();
}
break;
case TO_REFRE_USER:
if (userAdapter != null) {
mUserlogList.clear();
if (mUsers!=null) {
for (User user : mUsers) {
mUserlogList.add(user.toString());
}
}
userAdapter.notifyDataSetChanged();
}
break;

}
}

+ 9
- 1
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/adapter/StringAdapter.java Ver arquivo

@@ -28,6 +28,7 @@ public class StringAdapter extends RecyclerView.Adapter<StringAdapter.KeyViewHol

public interface OnItemClickListener {
void onItemClick(int position);

void onLongClick(int position);
}

@@ -50,7 +51,7 @@ public class StringAdapter extends RecyclerView.Adapter<StringAdapter.KeyViewHol
@Override
public void onBindViewHolder(@NonNull KeyViewHolder holder, int position) {
BleValueBean data = mList.get(position);
String showData=data.getMac()+"="+data.getName()+"=" + data.getCid() + ";" + data.getVid() + ";" + data.getPid()+"="+data.getRssi();
String showData = data.getMac() + "=" + data.getRssi() + "\n" + data.getName() + "=" + getHexString(data.getCid()) + ";" + getHexString(data.getVid()) + ";" + getHexString(data.getPid());
holder.mTvTitle.setText(showData);
holder.mTvTitle.setOnClickListener(v -> {
if (listener != null)
@@ -97,5 +98,12 @@ public class StringAdapter extends RecyclerView.Adapter<StringAdapter.KeyViewHol
}
}

private String getHexString(int value) {
if (value < 10) {
return "0x0" + Integer.toHexString(value);
}
return "0x" + Integer.toHexString(value);
}


}

+ 253
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/base/BleAppNewBaseActivity.java Ver arquivo

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

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

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

import java.lang.ref.WeakReference;

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


/**
* xing
* 2019/4/16 11:55
* activity的基类, 共有的功能都可以写在这里
*/
public abstract class BleAppNewBaseActivity extends BleNewBaseActivity {
/**
* 上下文对象
*/
protected Context mContext;
protected String TAG = this.getClass().getName();
protected Handler mHandler = new MyHandler(this);
@Nullable
protected TextView mTvTopTitle;
@Nullable
protected Toolbar mToolbar;
//--------------ble---------------



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

}

protected void SaveActivityData(Bundle savedInstanceState) {

}


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

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

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

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

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


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

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

/**
* 初始化
*/
protected final void init() {
addInit();
initView();
initData();
initListener();
}





protected void addInit() {

}


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


protected void initPermissions() {
new CheckPermissionUtils(this).checkPermissions(new CheckPermissionUtils.OnPermissionListener() {
@Override
public void onPermissionsOk() {
BleAppNewBaseActivity.this.onPermissionsOk();
}
});

}


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

}


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

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

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

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

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


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

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

protected void onClickRight() {

}


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

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

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

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


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


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

+ 0
- 1
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/base/MyApplication.java Ver arquivo

@@ -4,7 +4,6 @@ import android.app.Application;

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


public class MyApplication extends Application {

private static MyApplication sInstance;

+ 24
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/config/BleDeviceConfig.java Ver arquivo

@@ -79,6 +79,20 @@ public class BleDeviceConfig {
* 八电极体脂秤
*/
public final static int EIGHT_BODY_FAT_SCALE = 0x13;
/**
* 八电极体脂秤 MCU算法
*/
public final static int EIGHT_BODY_FAT_SCALE_MCU = 0x32;

/**
* 八电极体脂秤(双频_APP)
*/
public final static int EIGHT_BODY_FAT_SCALE_DUAL_BAND_APP = 0x0052;

/**
* 八电极体脂秤(双频_MCU)
*/
public final static int EIGHT_BODY_FAT_SCALE_DUAL_BAND_MCU = 0x0068;

/**
* 风速计
@@ -117,6 +131,10 @@ public class BleDeviceConfig {
* 蓝牙营养秤
*/
public final static int BLE_NUTRITION_SCALE = 0x0034;
/**
* 蓝牙营养秤(支持营养元素)
*/
public final static int BLE_NUTRITION_SCALE_NUTRIENT = 0x006C;

/**
* 蓝牙牙刷
@@ -257,6 +275,12 @@ public class BleDeviceConfig {
* 气压温湿度计
*/
public static final int BAROMETRIC_TEMP_HUMIDITY = 0x005C;
/**
* 气体检测仪(BLE)
*/
public static final int BLE_GAS_DETECTOR = 0x006F;



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

+ 83
- 55
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/home/HomeDataManager.java Ver arquivo

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


import java.util.ArrayList;

import aicare.net.cn.sdk.ailinksdkdemoandroid.ADWeightScaleCmdActivity;
@@ -14,10 +13,10 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.BroadcastBloodOxygenActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.BroadcastScaleActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.ClearShakeHandsActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.ConnectBleTestActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.EightBodyfatActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.HeightCmdActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.HeightWeightScaleActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.ShowBleActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.SmartMaskActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.SphyCmdActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.TempCmdActivity;
@@ -30,19 +29,27 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.WifiConfigActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig;
import aicare.net.cn.sdk.ailinksdkdemoandroid.find.FindDeviceNewActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.PublicBleNetworkCmdActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.PublicMqttActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.PublicWifiBleOtaActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.TempInstrument.TempInstrumentActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.airdetector.AirDetectorActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.barometric_temp_humidity.BarometricTempHygrometerActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_nutrition.BleNutritionActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_nutrition.BleNutritionNutrientActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.blood_glucose.BloodGlucoseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.blood_pressure_tc.BloodPressureTcActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.body_scale_4g.BodyScale4GActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.broadcast_height.BroadcastHeightActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.broadcast_nutrition.BroadNutritionActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.broadcast_weight_sacle.BroadcastWeightScaleActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.bw05watch.Bw05WatchActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.coffee_scale.CoffeeScaleActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.eight_bodyfat.EightBodyFatMcuActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.eight_bodyfat.EightBodyfatActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.eight_bodyfat.dual_band.EightDoubleBodyfatActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.fascia_gun.FasciaGunActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.food_temp.FoodTempActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.gasDetector.GasDetectorActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.leaone_broadcast.LeaOneBroadcastActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.meat_probe.MeatProbeActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.meat_probe_charger.MeatProbeChargerActivity;
@@ -74,123 +81,144 @@ public class HomeDataManager {
*/
public static ArrayList<JumpBean> getHomeDataList() {
ArrayList<JumpBean> beanList = new ArrayList<>();
Class<?> publicJumpActivity = ShowBleActivity.class;
// 不握手不加密
// beanList.add(new JumpBean(BleDeviceConfig.CLEAR_SHAKE_HANDS, R.string.item_no_handshake_encryption, publicJumpActivity, ClearShakeHandsActivity.class));
// Ble通用设置
beanList.add(new JumpBean(BleDeviceConfig.BLE_GENERAL_SETTINGS, R.string.item_ble_general_settings, null, BleCmdActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.BLE_GENERAL_SETTINGS, R.string.item_ble_general_settings, publicJumpActivity, BleCmdActivity.class));
// BLE通用配网
beanList.add(new JumpBean(BleDeviceConfig.PUBLIC_BLE_NETWORK, R.string.item_ble_universal_distribution_network, null, PublicBleNetworkCmdActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.PUBLIC_BLE_NETWORK, R.string.item_ble_universal_distribution_network, publicJumpActivity, PublicBleNetworkCmdActivity.class));
// Ble test
beanList.add(new JumpBean(BleDeviceConfig.BLE_TEST, R.string.item_ble_test, null, TestCmdActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.BLE_TEST, R.string.item_ble_test, publicJumpActivity, TestCmdActivity.class));
// Ble connect test
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_ble_connect_test, ConnectBleTestActivity.class, null));
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_ble_connect_test, null, ConnectBleTestActivity.class));
// OTA通用
// beanList.add(new JumpBean(BleDeviceConfig.OTA, R.string.item_ota, publicJumpActivity, TestOtaActivity.class));
//MQTT通用
beanList.add(new JumpBean(BleDeviceConfig.OTA, R.string.item_mqtt, null, PublicMqttActivity.class));
// 透传
beanList.add(new JumpBean(BleDeviceConfig.PENETRATE, R.string.item_penetrate, null, TransmissionActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.PENETRATE, R.string.item_penetrate, publicJumpActivity, TransmissionActivity.class));
//气体检测仪
beanList.add(new JumpBean(BleDeviceConfig.BLE_GAS_DETECTOR, R.string.gas_detector, publicJumpActivity, GasDetectorActivity.class));
// 广播秤
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_body_fat_scale_broadcast, BroadcastScaleActivity.class, null));
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_body_fat_scale_broadcast, null, BroadcastScaleActivity.class));
// Ble体脂秤
beanList.add(new JumpBean(BleDeviceConfig.WEIGHT_BODY_FAT_SCALE, R.string.item_body_fat_scale_ble, null, WeightScaleBleActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.WEIGHT_BODY_FAT_SCALE, R.string.item_body_fat_scale_ble, publicJumpActivity, WeightScaleBleActivity.class));
// 4G体脂秤
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_body_fat_scale_4g, BodyScale4GActivity.class, null));
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_body_fat_scale_4g, null, BodyScale4GActivity.class));
// WiFi+Ble体脂秤
beanList.add(new JumpBean(BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_WIFI_BLE, R.string.item_body_fat_scale_wifi_ble, null, WeightScaleWifiBleActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_WIFI_BLE, R.string.item_body_fat_scale_wifi_ble, publicJumpActivity, WeightScaleWifiBleActivity.class));
// 八极秤
beanList.add(new JumpBean(BleDeviceConfig.EIGHT_BODY_FAT_SCALE, R.string.item_body_fat_scale_eight, null, EightBodyfatActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.EIGHT_BODY_FAT_SCALE, R.string.item_body_fat_scale_eight, publicJumpActivity, EightBodyfatActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.EIGHT_BODY_FAT_SCALE_MCU, R.string.item_body_fat_scale_eight_mcu, publicJumpActivity, EightBodyFatMcuActivity.class));
//八电极秤,双频 APP
beanList.add(new JumpBean(BleDeviceConfig.EIGHT_BODY_FAT_SCALE_DUAL_BAND_APP, R.string.item_body_fat_scale_eight_dual_band, publicJumpActivity, EightDoubleBodyfatActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.EIGHT_BODY_FAT_SCALE_DUAL_BAND_MCU, R.string.item_body_fat_scale_eight_dual_band_mcu, publicJumpActivity, EightDoubleBodyfatActivity.class));
// 艾迪体脂秤
beanList.add(new JumpBean(BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_AD, R.string.item_body_fat_scale_aidi, null, ADWeightScaleCmdActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_AD, R.string.item_body_fat_scale_aidi, publicJumpActivity, ADWeightScaleCmdActivity.class));
// 婴儿秤
beanList.add(new JumpBean(BleDeviceConfig.BABY_SCALE, R.string.item_baby_scale, null, BabyCmdActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.BABY_SCALE, R.string.item_baby_scale, publicJumpActivity, BabyCmdActivity.class));
// 婴儿体脂两用秤
beanList.add(new JumpBean(BleDeviceConfig.BABY_BODY_FAT, R.string.item_baby_body_fat_scale, null, BabyBodyFatCmdActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.BABY_BODY_FAT, R.string.item_baby_body_fat_scale, publicJumpActivity, BabyBodyFatCmdActivity.class));
// Ble体重秤
beanList.add(new JumpBean(BleDeviceConfig.WEIGHT_SCALE, R.string.item_weight_scale_ble, null, WeightScaleActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.WEIGHT_SCALE, R.string.item_weight_scale_ble, publicJumpActivity, WeightScaleActivity.class));
// 广播体重秤
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_weight_scale_broadcast, BroadcastWeightScaleActivity.class, null));
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_weight_scale_broadcast, null, BroadcastWeightScaleActivity.class));
// 蓝牙营养秤
beanList.add(new JumpBean(BleDeviceConfig.BLE_NUTRITION_SCALE, R.string.item_nutritional_scale_ble, null, BleNutritionActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.BLE_NUTRITION_SCALE, R.string.item_nutritional_scale_ble, publicJumpActivity, BleNutritionActivity.class));
//支持营养元素的营养秤
beanList.add(new JumpBean(BleDeviceConfig.BLE_NUTRITION_SCALE_NUTRIENT, R.string.item_nutritional_scale_ble_nutrient, publicJumpActivity, BleNutritionNutrientActivity.class));
// 广播营养秤
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_nutritional_scale_broadcast, BroadNutritionActivity.class, null));
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_nutritional_scale_broadcast, null, BroadNutritionActivity.class));
// 咖啡秤
beanList.add(new JumpBean(BleDeviceConfig.COFFEE_SCALE, R.string.item_coffee_scale, null, CoffeeScaleActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.COFFEE_SCALE, R.string.item_coffee_scale, publicJumpActivity, CoffeeScaleActivity.class));
// 身高体脂秤
beanList.add(new JumpBean(BleDeviceConfig.HEIGHT_BODY_FAT, R.string.item_height_body_fat_scale, null, HeightWeightScaleActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.HEIGHT_BODY_FAT, R.string.item_height_body_fat_scale, publicJumpActivity, HeightWeightScaleActivity.class));
// 身高仪
beanList.add(new JumpBean(BleDeviceConfig.HEIGHT_METER, R.string.item_height_measuring_ble, null, HeightCmdActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.HEIGHT_METER, R.string.item_height_measuring_ble, publicJumpActivity, HeightCmdActivity.class));
// 广播身高仪
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_height_measuring_broadcast, BroadcastHeightActivity.class, null));
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_height_measuring_broadcast, null, BroadcastHeightActivity.class));
// BLE血压计
beanList.add(new JumpBean(BleDeviceConfig.BLOOD_PRESSURE, R.string.item_sphygmometer_ble, null, SphyCmdActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.BLOOD_PRESSURE, R.string.item_sphygmometer_ble, publicJumpActivity, SphyCmdActivity.class));
// wifi血压计
beanList.add(new JumpBean(BleDeviceConfig.SPHY_WIFI_BLE, R.string.item_sphygmometer_wifi, null, WifiBleSphyActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.SPHY_WIFI_BLE, R.string.item_sphygmometer_wifi, publicJumpActivity, WifiBleSphyActivity.class));
// 血压计透传
beanList.add(new JumpBean(BleDeviceConfig.SPHYGMOMETER_PENETRATE, R.string.item_sphygmometer_penetrate, null, BloodPressureTcActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.SPHYGMOMETER_PENETRATE, R.string.item_sphygmometer_penetrate, publicJumpActivity, BloodPressureTcActivity.class));
// 血糖仪
beanList.add(new JumpBean(BleDeviceConfig.BLOOD_GLUCOSE, R.string.item_blood_glucose_meter_ble, null, BloodGlucoseActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.BLOOD_GLUCOSE, R.string.item_blood_glucose_meter_ble, publicJumpActivity, BloodGlucoseActivity.class));
// 4G血糖仪
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_blood_glucose_meter_4g, BloodSugar4GActivity.class, null));
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_blood_glucose_meter_4g, null, BloodSugar4GActivity.class));
// 血氧仪(广播)
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_oximeter_broadcast, BroadcastBloodOxygenActivity.class, null));
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_oximeter_broadcast, null, BroadcastBloodOxygenActivity.class));
// 血氧(连接)
beanList.add(new JumpBean(BleDeviceConfig.BLE_BOOLD_OXYGEN, R.string.item_oximeter_ble, null, BloodOxygenActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.BLE_BOOLD_OXYGEN, R.string.item_oximeter_ble, publicJumpActivity, BloodOxygenActivity.class));
// 额温枪
beanList.add(new JumpBean(BleDeviceConfig.INFRARED_THERMOMETER, R.string.item_infrared_thermometer, null, TempGunCmdActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.INFRARED_THERMOMETER, R.string.item_infrared_thermometer, publicJumpActivity, TempGunCmdActivity.class));
// 体温计
beanList.add(new JumpBean(BleDeviceConfig.THERMOMETER, R.string.item_thermometer, null, TempCmdActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.THERMOMETER, R.string.item_thermometer, publicJumpActivity, TempCmdActivity.class));
// 测温仪
beanList.add(new JumpBean(BleDeviceConfig.TEMP_INSTRUMENT, R.string.item_auto_thermometer, null, TempInstrumentActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.TEMP_INSTRUMENT, R.string.item_auto_thermometer, publicJumpActivity, TempInstrumentActivity.class));
// 食品温度计
beanList.add(new JumpBean(BleDeviceConfig.FOOD_TEMP, R.string.item_food_thermometer, null, FoodTempActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.FOOD_TEMP, R.string.item_food_thermometer, publicJumpActivity, FoodTempActivity.class));
// 食物探针
beanList.add(new JumpBean(BleDeviceConfig.MEAT_PROBE, R.string.item_meat_probe, null, MeatProbeActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.MEAT_PROBE, R.string.item_meat_probe, publicJumpActivity, MeatProbeActivity.class));
// 探针充电盒
beanList.add(new JumpBean(BleDeviceConfig.MEAT_PROBE_CHARGER, R.string.item_probe_charging_box, null, MeatProbeChargerActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.MEAT_PROBE_CHARGER, R.string.item_probe_charging_box, publicJumpActivity, MeatProbeChargerActivity.class));
// 牙刷(wifi+ble)
beanList.add(new JumpBean(BleDeviceConfig.TOOTHBRUSH_WIFI_BLE, R.string.item_toothbrush_wifi_ble, null, ToothBrushWifiBleActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.TOOTHBRUSH_WIFI_BLE, R.string.item_toothbrush_wifi_ble, publicJumpActivity, ToothBrushWifiBleActivity.class));
// 牙刷测试
beanList.add(new JumpBean(BleDeviceConfig.TOOTHBRUSH_TEST, R.string.item_toothbrush_test, null, ToothbrushTestActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.TOOTHBRUSH_TEST, R.string.item_toothbrush_test, publicJumpActivity, ToothbrushTestActivity.class));
// 口罩
beanList.add(new JumpBean(BleDeviceConfig.SMART_MASK, R.string.item_smart_mask, null, SmartMaskActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.SMART_MASK, R.string.item_smart_mask, publicJumpActivity, SmartMaskActivity.class));
// 筋膜枪
beanList.add(new JumpBean(BleDeviceConfig.FASCIA_GUN, R.string.item_fascia_gun, null, FasciaGunActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.FASCIA_GUN, R.string.item_fascia_gun, publicJumpActivity, FasciaGunActivity.class));
// 跳绳
beanList.add(new JumpBean(BleDeviceConfig.ROPE_SKIPPING, R.string.item_rope_skipping, null, RopeSkippingActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.ROPE_SKIPPING, R.string.item_rope_skipping, publicJumpActivity, RopeSkippingActivity.class));
// 跳绳设置模式
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_rope_skipping_set_mode, RopeSkippingSetActivity.class, null));
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_rope_skipping_set_mode, null, RopeSkippingSetActivity.class));
// 温湿度计
beanList.add(new JumpBean(BleDeviceConfig.TEMP_Humidity, R.string.item_hygrothermograph, null, TempHumidityActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.TEMP_Humidity, R.string.item_hygrothermograph, publicJumpActivity, TempHumidityActivity.class));
// 气压温湿度计
beanList.add(new JumpBean(BleDeviceConfig.BAROMETRIC_TEMP_HUMIDITY, R.string.item_barothermohygrograph, null, BarometricTempHygrometerActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.BAROMETRIC_TEMP_HUMIDITY, R.string.item_barothermohygrograph, publicJumpActivity, BarometricTempHygrometerActivity.class));
// ble噪音计
beanList.add(new JumpBean(BleDeviceConfig.BLE_NOISE_METER, R.string.item_noise_meter_ble, null, BleNoiseMeterActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.BLE_NOISE_METER, R.string.item_noise_meter_ble, publicJumpActivity, BleNoiseMeterActivity.class));
// wifi+ble噪音计
beanList.add(new JumpBean(BleDeviceConfig.WIFI_BLE_NOISE_METER, R.string.item_noise_meter_wifi_ble, null, WifiBleNoiseMeterActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.WIFI_BLE_NOISE_METER, R.string.item_noise_meter_wifi_ble, publicJumpActivity, WifiBleNoiseMeterActivity.class));
// 空气检测仪
beanList.add(new JumpBean(BleDeviceConfig.MQTT_AIR_DETECTOR, R.string.item_air_Detector, null, AirDetectorActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.MQTT_AIR_DETECTOR, R.string.item_air_Detector, publicJumpActivity, AirDetectorActivity.class));
// 电滑板Cm02
beanList.add(new JumpBean(BleDeviceConfig.SMART_SCOOTER_CM02, R.string.item_scooter_cm02, null, AiLinkScooterActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.SMART_SCOOTER_CM02, R.string.item_scooter_cm02, publicJumpActivity, AiLinkScooterActivity.class));
// 共享充电器
beanList.add(new JumpBean(BleDeviceConfig.SHARE_CHARGER, R.string.item_shared_charger, null, ShareChargerActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.SHARE_CHARGER, R.string.item_shared_charger, publicJumpActivity, ShareChargerActivity.class));
// 共享插座
beanList.add(new JumpBean(BleDeviceConfig.SHARE_SOCKET, R.string.item_shared_socket, null, ShareSocketActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.SHARE_SOCKET, R.string.item_shared_socket, publicJumpActivity, ShareSocketActivity.class));
// 共享套套机
beanList.add(new JumpBean(BleDeviceConfig.SHARE_CONDOM, R.string.item_condom, null, ShareCondomActivity.class));
beanList.add(new JumpBean(BleDeviceConfig.SHARE_CONDOM, R.string.item_condom, publicJumpActivity, ShareCondomActivity.class));
// 寻物器
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_finder, FindDeviceNewActivity.class, null));
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_finder, null, FindDeviceNewActivity.class));
// LeaOne测试
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_leaone, LeaOneBroadcastActivity.class, null));
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_leaone, null, LeaOneBroadcastActivity.class));

// wifi+ble ota工具
beanList.add(new JumpBean(BleDeviceConfig.WIFI_BLE_OTA, BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_WIFI_BLE, R.string.wifi_ble_ota_tool, publicJumpActivity, PublicWifiBleOtaActivity.class));
//bw05暨芯手表
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_bw05_watch, null, Bw05WatchActivity.class));
return beanList;
}

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

/**
* 要跳转的目标Activity
*
* @param type
* @return
*/

+ 4
- 1
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/home/JumpBean.java Ver arquivo

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

import java.util.List;

/**
* 说明:
*
@@ -9,6 +11,7 @@ package aicare.net.cn.sdk.ailinksdkdemoandroid.home;
public class JumpBean {

private int itemType;
private List<Integer> itemTypeList;
/**
* cid
*/
@@ -18,7 +21,7 @@ public class JumpBean {
*/
private int itemNameResId;
/**
* 需要单独跳转的 Activity
* 需要单独跳转的 Activity, null 表示不需要跳转
*/
private Class<?> jumpActivityClass;


+ 117
- 9
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/home/MainActivity.java Ver arquivo

@@ -8,9 +8,16 @@ import android.graphics.Canvas;
import android.graphics.Rect;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -25,6 +32,8 @@ 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.bean.BleValueBean;
import com.pingwang.bluetoothlib.listener.OnCallbackBle;
import com.pingwang.bluetoothlib.utils.BleLog;

import java.util.ArrayList;
@@ -45,6 +54,19 @@ public class MainActivity extends AppCompatActivity {

private Context mContext;
private RecyclerView rvList;
private ArrayList<JumpBean> mList = new ArrayList<>();
private ArrayList<JumpBean> homeDataList = HomeDataManager.getHomeDataList();
private CharSequence inputData = "";
private HomeListAdapter mHomeListAdapter;

private Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(@NonNull Message msg) {
if (mHomeListAdapter != null) {
mHomeListAdapter.notifyDataSetChanged();
}
}
};

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -56,7 +78,73 @@ public class MainActivity extends AppCompatActivity {
initListener();
int bodyComposition = new BhBodyComposition().getBodyComposition();
L.i("bodyComposition:" + bodyComposition);
EditText etSearch = findViewById(R.id.etSearch);

etSearch.addTextChangedListener(new TextWatcher() {
/**
* @param s 年代
* @param start 开始
* @param count 数
* @param after
*/
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {

}

/**
* 文本更改
*
* @param s 年代
* @param start 开始
* @param before 之前
* @param count 数
*/
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
inputData = s;
}

/**
* 文本更改后
*
* @param s 年代
*/
@Override
public void afterTextChanged(Editable s) {
String data = inputData.toString().trim();
if (TextUtils.isEmpty(data)) {
//未输入内容,显示全部
mList.clear();
mList.addAll(homeDataList);
mHandler.sendEmptyMessage(1);
} else {
refreshList(data);
}
}
});

findViewById(R.id.ivClear).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
etSearch.setText("");
}
});

}


private void refreshList(String data) {
ArrayList<JumpBean> list = new ArrayList<>();
for (JumpBean jumpBean : homeDataList) {
String name = mContext.getString(jumpBean.getItemNameResId()).toUpperCase();
if (name.contains(data.toUpperCase())) {
list.add(jumpBean);
}
}
mList.clear();
mList.addAll(list);
mHandler.sendEmptyMessage(1);
}


@@ -73,10 +161,24 @@ public class MainActivity extends AppCompatActivity {
list.add(new AilinkLicenseBean(0x2F, 0x03, 0x09));
list.add(new AilinkLicenseBean(0x2F, 0x03, 0x01));
list.add(new AilinkLicenseBean(65544, 103, 0));
list.add(new AilinkLicenseBean(65544, 21, 0));
list.add(new AilinkLicenseBean(0x02, 0x99, 0x01));
AILinkSDK.getInstance().initLicense(list);
}

private int count = 0;
private OnCallbackBle mOnCallbackBle = new OnCallbackBle() {
@Override
public void onStartScan() {
OnCallbackBle.super.onStartScan();
}

@Override
public void onScanning(BleValueBean data) {
// AILinkBleManager.getInstance().removeOnCallbackBle(mOnCallbackBle);
}
};

}

protected void initView() {
BleLog.init(true);
@@ -86,11 +188,12 @@ public class MainActivity extends AppCompatActivity {
AILinkBleManager.getInstance().init(mContext, new AILinkBleManager.onInitListener() {
@Override
public void onInitSuccess() {
AILinkBleManager.getInstance().startScan(0);
// AILinkBleManager.getInstance().setOnCallbackBle(mOnCallbackBle);
}

@Override
public void onInitFailure() {
L.e("初始化失败");

}
});
@@ -98,15 +201,20 @@ public class MainActivity extends AppCompatActivity {

rvList = findViewById(R.id.rv_list);
rvList.setLayoutManager(new LinearLayoutManager(this));
HomeListAdapter adapter = new HomeListAdapter(this, HomeDataManager.getHomeDataList());
rvList.setAdapter(adapter);
adapter.setItemClickListener(new HomeListAdapter.ItemClickListener() {
mList.clear();
mList.addAll(homeDataList);
mHomeListAdapter = new HomeListAdapter(this, mList);
rvList.setAdapter(mHomeListAdapter);
mHomeListAdapter.setItemClickListener(new HomeListAdapter.ItemClickListener() {
@Override
public void onItemClick(JumpBean bean) {
count = 0;
if (bean.getJumpActivityClass() != null) {
startActivity(bean.getJumpActivityClass());
startActivity(bean.getItemType(), bean.getCid(), bean.getJumpActivityClass());
} else if (bean.getTargetActivityClass() != null) {
startActivity(bean.getTargetActivityClass());
} else {
startActivity(bean.getItemType(),bean.getCid());
startActivity(bean.getItemType(), bean.getCid(), ShowBleActivity.class);
}
}
});
@@ -126,8 +234,8 @@ public class MainActivity extends AppCompatActivity {
});
}

private void startActivity(int type,int cid) {
Intent intent = new Intent(this, ShowBleActivity.class);
private void startActivity(int type, int cid, Class<?> activityClass) {
Intent intent = new Intent(this, activityClass);
intent.putExtra("type", type);
intent.putExtra("cid", cid);
startActivity(intent);

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

@@ -19,7 +19,7 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
*
* @author xing
*/
public class BleDemoActivity extends BleBaseActivity {
public class BleDemoActivity extends BleBaseActivity {

private ListView list_view;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

}
});
}

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

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

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

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

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

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

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

}

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

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

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

+ 2
- 2
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/TempInstrument/TempInstrumentActivity.java Ver arquivo

@@ -100,7 +100,7 @@ public class TempInstrumentActivity extends BleBaseActivity implements OnCallbac
findViewById(R.id.btnVersion).setOnClickListener(this);
findViewById(R.id.btnBattery).setOnClickListener(this);
findViewById(R.id.btn_get_did).setOnClickListener(this);
findViewById(R.id.btnClear).setOnClickListener(this);
findViewById(R.id.btnClearShakeHands).setOnClickListener(this);

findViewById(R.id.btnGetConfig).setOnClickListener(this);
findViewById(R.id.btnSetUnit).setOnClickListener(this);
@@ -219,7 +219,7 @@ public class TempInstrumentActivity extends BleBaseActivity implements OnCallbac
mBleDevice.sendData(sendBleBean);
break;

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

+ 23
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/airdetector/AirDetectorActivity.java Ver arquivo

@@ -1,6 +1,9 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.airdetector;

import android.app.AlertDialog;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.os.Message;
import android.util.SparseArray;
@@ -185,11 +188,28 @@ public class AirDetectorActivity extends BleAppBaseActivity implements AirDetect
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList);
listAdapterPayload = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mListPayload);
list_view.setAdapter(listAdapter);
list_view.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
copyTextToClipboard(AirDetectorActivity.this, mList.get(position));
return true;
}
});

list_view_payload.setAdapter(listAdapterPayload);
initSettingTypes();
initAlarmModeSP();
}

private void copyTextToClipboard(Context context, String text) {
ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
if (clipboard != null) {
clipboard.setPrimaryClip(ClipData.newPlainText("label", text));
Toast.makeText(context, "已复制到剪切板", Toast.LENGTH_SHORT).show();
}
}


private void initAlarmModeSP() {
ArrayList<String> modeList = new ArrayList<>();
modeList.add("选择模式");
@@ -599,6 +619,9 @@ public class AirDetectorActivity extends BleAppBaseActivity implements AirDetect

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

+ 1
- 1
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/airdetector/AirDetectorShowUtil.java Ver arquivo

@@ -8,8 +8,8 @@ import java.util.LinkedHashMap;
import cn.net.aicare.modulelibrary.module.airDetector.AirConst;
import cn.net.aicare.modulelibrary.module.airDetector.AlarmClockStatement;
import cn.net.aicare.modulelibrary.module.airDetector.BrightnessStatement;
import cn.net.aicare.modulelibrary.module.airDetector.StatusBean;
import cn.net.aicare.modulelibrary.module.airDetector.SupportBean;
import cn.net.aicare.modulelibrary.module.airDetector.StatusBean;

/**
* @author yesp

+ 97
- 2
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/ble_nutrition/BleNutritionActivity.java Ver arquivo

@@ -10,7 +10,9 @@ import android.widget.RadioButton;
import androidx.annotation.Nullable;

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

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
@@ -20,9 +22,11 @@ import java.util.Locale;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import cn.net.aicare.modulelibrary.module.BleNutrition.BleNutritionData;
import cn.net.aicare.modulelibrary.module.BleNutrition.BleNutritionHistoryBean;

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

private static final String TAG = "Tag1";

@@ -37,7 +41,7 @@ public class BleNutritionActivity extends BleBaseActivity implements View.OnClic

private String mMac;
private BleDevice mBleDevice;
private boolean mBuzzOpen = false;
private BleNutritionData mBleNutritionData;

@Override
@@ -53,6 +57,10 @@ public class BleNutritionActivity extends BleBaseActivity implements View.OnClic
btn_clear.setOnClickListener(this);
btn_set_unit.setOnClickListener(this);
btn_set_zero.setOnClickListener(this);
findViewById(R.id.btnVoice).setOnClickListener(this);
findViewById(R.id.btnReadHistory).setOnClickListener(this);
findViewById(R.id.btnClearHistory).setOnClickListener(this);
findViewById(R.id.btnSynTime).setOnClickListener(this);

rb_list = new ArrayList<>();
rb_list.add(findViewById(R.id.rb_g));
@@ -97,6 +105,19 @@ public class BleNutritionActivity extends BleBaseActivity implements View.OnClic
} else if (id == R.id.btn_set_zero) {
// 去皮指令
setZero();
} else if (id == R.id.btnVoice) {
//蜂鸣器开关切换
mBuzzOpen = !mBuzzOpen;
setBuzz(mBuzzOpen);
} else if (id == R.id.btnReadHistory) {
// 获取历史数据
getHistoryData();
} else if (id == R.id.btnClearHistory) {
// 清空历史数据
clearHistoryData();
} else if (id == R.id.btnSynTime) {
// 同步时间
appSynTime();
}
}

@@ -112,6 +133,7 @@ public class BleNutritionActivity extends BleBaseActivity implements View.OnClic
public void onServiceSuccess() {
mBleDevice = mAILinkBleManager.getBleDevice(mMac);
if (mBleDevice != null) {
mBleDevice.setOnBleSettingListener(this);
mBleNutritionData = new BleNutritionData(mBleDevice);
mBleNutritionData.setBleNutritionCallback(this);
addText("连接成功:" + mMac);
@@ -226,6 +248,31 @@ public class BleNutritionActivity extends BleBaseActivity implements View.OnClic
addText(str);
}

@Override
public void onHistoryRecord(int schedule, List<BleNutritionHistoryBean> list) {
if (schedule < 99) {
addText("获取历史数据:进度" + schedule + "%");
return;
}
addText("获取历史数据:进度" + schedule + "%");
addText("获取历史数据:" + list.size() + "条");
StringBuilder str = new StringBuilder();
for (BleNutritionHistoryBean bean : list) {
str.append("时间:").append(TimeUtils.getTimeNoNewline(bean.getTime() * 1000L)).append(";");
str.append("重量:").append(bean.getSymbol() == 1 ? "-" : "").append(bean.getWeight()).append(";");
str.append("单位:").append(getUnitStr(bean.getUnit())).append(";");
str.append("小数点:").append(bean.getDecimal()).append(";");
str.append("\n");
}
addText("历史数据:\n" + str.toString());
addText("APP获取历史数据完成");
}

@Override
public void onClearHistoryRecord(int status) {
addText("清除历史数据结果:" + (status == 0x00 ? "成功" : "失败"));
}

private SimpleDateFormat sdf;

// 添加一条文本
@@ -260,6 +307,19 @@ public class BleNutritionActivity extends BleBaseActivity implements View.OnClic
}
}

/**
* 设置蜂鸣器
*
* @param open 开放
*/
private void setBuzz(boolean open) {
if (mBleNutritionData != null) {
mBleNutritionData.setBuzz(open);
addText("APP下发蜂鸣器指令:" + open);
}
}


/**
* APP 下发单位
*/
@@ -326,4 +386,39 @@ public class BleNutritionActivity extends BleBaseActivity implements View.OnClic
}
return unitStr;
}

/**
* 获取历史数据
*/
public void getHistoryData() {
if (mBleNutritionData != null) {
mBleNutritionData.getHistoryData(0);
addText("APP下发获取历史数据指令");
}
}

public void clearHistoryData() {
if (mBleNutritionData != null) {
mBleNutritionData.clearHistoryData();
}

}

/**
* 应用同步时间
*/
public void appSynTime() {
if (mBleNutritionData != null) {
mBleNutritionData.appSynTime();
addText("APP下发同步时间指令");
}

}

@Override
public void OnSettingReturn(int cmdType, int cmdData) {
if (cmdType == CmdConfig.SET_DEVICE_TIME_UNIX) {
addText("MCU上发同步时间结果:" + (cmdData == 0 ? "成功" : "失败"));
}
}
}

+ 419
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/ble_nutrition/BleNutritionNutrientActivity.java Ver arquivo

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

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

import androidx.annotation.Nullable;

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

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

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.UnitUtils;
import cn.net.aicare.modulelibrary.module.ble_nutrition_nutrient.BleNutritionNutrientData;
import cn.net.aicare.modulelibrary.module.ble_nutrition_nutrient.FoodNutrientBean;

/**
* 支持营养元素的蓝牙营养秤
*
* @author xing
* @date 2024/06/15
*/
public class BleNutritionNutrientActivity extends BleBaseActivity implements View.OnClickListener, BleNutritionNutrientData.OnNutritionNutrientListener, OnBleSettingListener {

private static final String TAG = "Tag1";

private Button btn_clear;
private ListView list_view;
private Button btn_set_unit;
private Button btn_set_zero;
private List<RadioButton> rb_list;

private List<String> mList;
private ArrayAdapter mListAdapter;

private String mMac;
private BleDevice mBleDevice;
private BleNutritionNutrientData mBleNutritionNutrientData;

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

btn_clear = findViewById(R.id.btn_clear);
list_view = findViewById(R.id.list_view);
btn_set_unit = findViewById(R.id.btn_set_unit);
btn_set_zero = findViewById(R.id.btn_set_zero);

btn_clear.setOnClickListener(this);
btn_set_unit.setOnClickListener(this);
btn_set_zero.setOnClickListener(this);
findViewById(R.id.btnSendApple).setOnClickListener(this);
findViewById(R.id.btnSendBeef).setOnClickListener(this);

rb_list = new ArrayList<>();
rb_list.add(findViewById(R.id.rb_g));
rb_list.add(findViewById(R.id.rb_ml));
rb_list.add(findViewById(R.id.rb_lb_oz));
rb_list.add(findViewById(R.id.rb_oz));
rb_list.add(findViewById(R.id.rb_kg));
rb_list.add(findViewById(R.id.rb_jin));
rb_list.add(findViewById(R.id.rb_milk_ml));
rb_list.add(findViewById(R.id.rb_water_ml));
rb_list.add(findViewById(R.id.rb_milk_fl_oz));
rb_list.add(findViewById(R.id.rb_water_fl_oz));
rb_list.add(findViewById(R.id.rb_lb));

// 单位只能单选
for (RadioButton radioButton : rb_list) {
radioButton.setOnClickListener(v -> {
for (RadioButton rb : rb_list) {
rb.setChecked(rb == v);
}
});
}

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

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

@Override
public void onClick(View v) {
int id = v.getId();
if (id == R.id.btn_clear) {
// 清空文本框
clearText();
} else if (id == R.id.btn_set_unit) {
// 设置单位
setUnit();
} else if (id == R.id.btn_set_zero) {
// 去皮指令
setZero();
} else if (id == R.id.btnSendApple) {
// 苹果
sendFoodApple();
} else if (id == R.id.btnSendBeef) {
// 牛肉
sendFoodBeef();
}
}


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

@Override
public void onServiceSuccess() {
mBleDevice = mAILinkBleManager.getBleDevice(mMac);
if (mBleDevice != null) {
mBleDevice.setOnBleSettingListener(this);
mBleNutritionNutrientData = new BleNutritionNutrientData(mBleDevice);
mBleNutritionNutrientData.setBleNutritionCallback(this);
addText("连接成功:" + mMac);
}
}

@Override
public void onServiceErr() {

}

@Override
public void unbindServices() {

}

@Override
public void onBmVersion(String version) {
addText("MCU上发BM版本:" + version);
}

@Override
public void onSupportUnit(List<SupportUnitBean> list) {
String str = "";
for (SupportUnitBean supportUnitBean : list) {
str += supportUnitBean.toString() + ";";
if (supportUnitBean.getType() != null && supportUnitBean.getType().equals("8")) {
// 遍历所有单位,有这个支持单位就显示
for (int i = 0; i < rb_list.size(); i++) {
boolean hasUnit = false;
for (Integer integer : supportUnitBean.getSupportUnit()) {
if (integer != null && integer == i) {
hasUnit = true;
break;
}
}
rb_list.get(i).setEnabled(hasUnit);
}
// 再次遍历,如果选中了不支持的单位,就重新选择
boolean unitDisable = false;
for (int i = 0; i < rb_list.size(); i++) {
if (!rb_list.get(i).isEnabled() && rb_list.get(i).isChecked()) {
unitDisable = true;
rb_list.get(i).setChecked(false);
}
if (rb_list.get(i).isEnabled() && unitDisable) {
unitDisable = false;
rb_list.get(i).setChecked(true);
}
}
}
}
addText("MCU上发支持单位列表:\n" + str);
}

@Override
public void onWeight(int no, int weight, int unit, int decimal, int symbol, int type) {

float w = weight;
// 正负
if (symbol == 1) {
w *= -1;
}
// 小数点
w = (float) (w / Math.pow(10, decimal));
// 保留小数位
String weightStr = getPreFloatStr(w, decimal);


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

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

mBleNutritionNutrientData.setNutrient(foodNutrientBean);
addText("APP下发营养元素数据:" + foodNutrientBean.toString());
addText("APP下发营养元素数据(Int):" + foodNutrientBean.toStringInt());
} else {
L.i("未选择食物");
}

}
}

@Override
public void onUnitResult(int status) {
String statusStr = "";
switch (status) {
case 0:
statusStr = "成功";
break;
case 1:
statusStr = "失败";
break;
case 2:
statusStr = "不支持";
break;
}
String str = "MCU上发设置单位结果:" + statusStr;
addText(str);
}

@Override
public void onErr(int weightErr, int batteryErr) {
String weightErrStr = "";
switch (weightErr) {
case 0:
weightErrStr = "正常";
break;
case 1:
weightErrStr = "超重";
break;
}
String batteryErrStr = "";
switch (batteryErr) {
case 0:
batteryErrStr = "正常";
break;
case 1:
batteryErrStr = "低电";
break;
}
String str = "MCU上发异常报警:\n重量状态:" + weightErrStr + "\n电池状态:" + batteryErrStr;
addText(str);
}


private SimpleDateFormat sdf;

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

// 清空文本
private void clearText() {
mList.clear();
mListAdapter.notifyDataSetChanged();
}

// 保留小数位
private String getPreFloatStr(float f, int decimal) {
BigDecimal bigDecimal = new BigDecimal(f);
return bigDecimal.setScale(decimal, BigDecimal.ROUND_HALF_UP).toString();
}

/**
* APP 发送归零指令
*/
private void setZero() {
if (mBleNutritionNutrientData != null) {
mBleNutritionNutrientData.setZero();
addText("APP下发去皮指令");
}
}

private FoodNutrientBean foodNutrientBean;

private void sendFoodApple() {
foodNutrientBean = new FoodNutrientBean();
foodNutrientBean.setKcal(65);
foodNutrientBean.setFat(0.16);
foodNutrientBean.setSatFat(0);
foodNutrientBean.setTransFat(0);
foodNutrientBean.setCholesterol(0);
foodNutrientBean.setNa(1);
foodNutrientBean.setK(104);
foodNutrientBean.setTotalCarbohydrate(15.4);
foodNutrientBean.setFiber(2.1);
foodNutrientBean.setSugar(13.3);
foodNutrientBean.setProtein(0.15);
addText("选择 苹果");
}

private void sendFoodBeef() {
foodNutrientBean = new FoodNutrientBean();
foodNutrientBean.setKcal(164);
foodNutrientBean.setFat(9.4);
foodNutrientBean.setSatFat(3.55);
foodNutrientBean.setTransFat(0.389);
foodNutrientBean.setCholesterol(58);
foodNutrientBean.setNa(51);
foodNutrientBean.setK(332);
foodNutrientBean.setTotalCarbohydrate(20);
foodNutrientBean.setFiber(0);
foodNutrientBean.setSugar(0);
foodNutrientBean.setProtein(20.1);
addText("选择 牛肉");
}


/**
* APP 下发单位
*/
private void setUnit() {
if (mBleNutritionNutrientData != null) {
int unit = -1;
for (int i = 0; i < rb_list.size(); i++) {
if (rb_list.get(i).isChecked()) {
unit = i;
break;
}
}
if (unit == -1) {
addText("APP下发单位:失败:未选择单位");
return;
}
mBleNutritionNutrientData.setUnit(unit);
addText("APP下发单位:" + unit + ":" + getUnitStr(unit));
}
}

/**
* 获取单位字符串
*
* @param unit 0
* @return g
*/
private String getUnitStr(int unit) {
String unitStr = "";
switch (unit) {
case 0x00:
unitStr = "g";
break;
case 0x01:
unitStr = "ml";
break;
case 0x02:
unitStr = "lb:oz";
break;
case 0x03:
unitStr = "oz";
break;
case 0x04:
unitStr = "kg";
break;
case 0x05:
unitStr = "斤";
break;
case 0x06:
unitStr = "牛奶ml";
break;
case 0x07:
unitStr = "水ml";
break;
case 0x08:
unitStr = "牛奶floz";
break;
case 0x09:
unitStr = "水floz";
break;
case 0x0A:
unitStr = "lb";
break;
}
return unitStr;
}


@Override
public void OnSettingReturn(int cmdType, int cmdData) {
if (cmdType == CmdConfig.SET_DEVICE_TIME_UNIX) {
addText("MCU上发同步时间结果:" + (cmdData == 0 ? "成功" : "失败"));
}
}
}

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

@@ -52,7 +52,7 @@ public class BloodGlucoseActivity extends BleBaseActivity implements OnCallbackB
log_list = findViewById(R.id.log_list);
mLogList = new ArrayList<>();
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mLogList);
log_list.setAdapter(listAdapter);
log_list.setAdapter(listAdapter);
mmol.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

+ 56
- 16
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/body_scale_4g/BodyScale4GActivity.java Ver arquivo

@@ -33,6 +33,7 @@ import java.util.List;
import java.util.Locale;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.UnitUtils;
import cn.net.aicare.algorithmutil.AlgorithmUtil;
import cn.net.aicare.algorithmutil.BodyFatData;

@@ -62,7 +63,8 @@ public class BodyScale4GActivity extends AppCompatActivity implements View.OnCli
private EditText et_vid;
private EditText et_pid;
private String url = "https://ailink.aicare.net.cn";

private String userId = "622733";
private String roomId = "4376156";
private SeekBar seek_height;
private SeekBar seek_age;
private TextView tv_height;
@@ -73,6 +75,10 @@ public class BodyScale4GActivity extends AppCompatActivity implements View.OnCli
private int mHeight;
private int mAge;
private int mGender;
private String mCid;
private String mVid;
private String mPid;


@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -188,7 +194,7 @@ public class BodyScale4GActivity extends AppCompatActivity implements View.OnCli
}

public void login() throws Throwable {
String mUrl=url + "/api/user/login?key=inet_elink&username=10037&password=5abd06d6f6ef0e022e11b8a41f57ebda";
String mUrl = url + "/api/user/login?key=inet_elink&username=" + userId + "&password=a0277db099cbb609cbda238c74a44aae";
URL uri = new URL(mUrl);
HttpURLConnection httpURLConnection = (HttpURLConnection) uri.openConnection();
// Post请求必须设置允许输出
@@ -199,8 +205,7 @@ public class BodyScale4GActivity extends AppCompatActivity implements View.OnCli
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setInstanceFollowRedirects(true);
// 配置请求Content-Type
httpURLConnection.setRequestProperty("Content-Type",
"application/x-www-form-urlencode");
httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencode");
// 设置连接超时时间
httpURLConnection.setConnectTimeout(6 * 1000);
// 开始连接
@@ -244,7 +249,17 @@ public class BodyScale4GActivity extends AppCompatActivity implements View.OnCli
}


public void getDeviceId() throws Throwable {
public void getMyDeviceId() throws Throwable {

String cid = et_cid.getText().toString().trim();
String vid = et_vid.getText().toString().trim();
String pid = et_pid.getText().toString().trim();
if (TextUtils.isEmpty(cid) || TextUtils.isEmpty(vid) || TextUtils.isEmpty(pid)) {
loglist.add(0, "请先输入CID,VID,PID");
logAdapter.notifyDataSetChanged();
return;
}

StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(url);
stringBuilder.append("/api/device/getDeviceBySN?key=inet_elink&appUserId=");
@@ -253,6 +268,12 @@ public class BodyScale4GActivity extends AppCompatActivity implements View.OnCli
stringBuilder.append(token);
stringBuilder.append("&deviceSN=");
stringBuilder.append(imei);
stringBuilder.append("&cid=");
stringBuilder.append(cid);
stringBuilder.append("&vid=");
stringBuilder.append(vid);
stringBuilder.append("&pid=");
stringBuilder.append(pid);
Log.e(TAG, stringBuilder.toString());
URL uri = new URL(stringBuilder.toString());
HttpURLConnection httpURLConnection = (HttpURLConnection) uri.openConnection();
@@ -288,6 +309,9 @@ public class BodyScale4GActivity extends AppCompatActivity implements View.OnCli
try {
if (datajson.length() > 0) {
myDeviceId = datajson.getJSONObject(0).getString("deviceId");
mCid = datajson.getJSONObject(0).getString("cid");
mVid = datajson.getJSONObject(0).getString("vid");
mPid = datajson.getJSONObject(0).getString("pid");
}
loglist.add(0, "设备信息" + result);
logAdapter.notifyDataSetChanged();
@@ -321,8 +345,7 @@ public class BodyScale4GActivity extends AppCompatActivity implements View.OnCli
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setInstanceFollowRedirects(true);
// 配置请求Content-Type
httpURLConnection.setRequestProperty("Content-Type",
"application/x-www-form-urlencode");
httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencode");
// 设置连接超时时间
httpURLConnection.setConnectTimeout(6 * 1000);
// 开始连接
@@ -358,17 +381,24 @@ public class BodyScale4GActivity extends AppCompatActivity implements View.OnCli
private boolean isFirstBind = true;

public void bindDevice() throws Throwable {
if (TextUtils.isEmpty(mCid) || TextUtils.isEmpty(mVid) || TextUtils.isEmpty(mPid)) {
runOnUiThread(() -> {
loglist.add(0, "请先获取设备ID");
logAdapter.notifyDataSetChanged();
});
return;
}
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(url);
stringBuilder.append("/api/device/add?key=inet_elink&appUserId=" + appid);
stringBuilder.append("&token=" + token);
stringBuilder.append("&deviceSN=" + imei);
stringBuilder.append("&mac=" + imei);
stringBuilder.append("&roomId=" + 86360);
stringBuilder.append("&roomId=" + roomId);
stringBuilder.append("&deviceName=" + "4G体脂秤");
stringBuilder.append("&cid=" + et_cid.getText().toString());
stringBuilder.append("&vid=" + et_vid.getText().toString());
stringBuilder.append("&pid=" + et_pid.getText().toString());
stringBuilder.append("&cid=" + mCid);
stringBuilder.append("&vid=" + mVid);
stringBuilder.append("&pid=" + mPid);
stringBuilder.append("&supportUnit=" + "");
// stringBuilder.append("&version=" + "1.0");
Log.e(TAG, stringBuilder.toString());
@@ -382,8 +412,7 @@ public class BodyScale4GActivity extends AppCompatActivity implements View.OnCli
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setInstanceFollowRedirects(true);
// 配置请求Content-Type
httpURLConnection.setRequestProperty("Content-Type",
"application/x-www-form-urlencode");
httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencode");
// 设置连接超时时间
httpURLConnection.setConnectTimeout(6 * 1000);
// 开始连接
@@ -452,7 +481,7 @@ public class BodyScale4GActivity extends AppCompatActivity implements View.OnCli
stringBuilder.append(myDeviceId);
stringBuilder.append("&maxId=");
stringBuilder.append(maxId);
stringBuilder.append("&subUserId=0");
stringBuilder.append("&subUserId=0&source=1");
Log.e(TAG, stringBuilder.toString());
URL uri = new URL(stringBuilder.toString());
HttpURLConnection httpURLConnection = (HttpURLConnection) uri.openConnection();
@@ -497,8 +526,15 @@ public class BodyScale4GActivity extends AppCompatActivity implements View.OnCli
int algorithm = json.getInt("deviceAlgorithm");

BigDecimal bigDecimal = BigDecimal.valueOf(weightSource / Math.pow(10, weightDecimal));
String weightStr = bigDecimal.setScale(weightDecimal, BigDecimal.ROUND_HALF_UP).toString();



String weightStr = bigDecimal.setScale(weightDecimal, BigDecimal.ROUND_HALF_UP)
.toString();
if (weightUnit == 4){
float[] floats = UnitUtils.LbToSt(Float.parseFloat(weightStr));
weightStr = (int)floats[0] + ":" + UnitUtils.getHoldDecimal(weightDecimal,floats[1]);
}
BodyFatData bodyFatData = AlgorithmUtil.getBodyFatData(algorithm, (mGender == 0 ? 2 : 1), mAge, bigDecimal.floatValue(), mHeight, adc);

switch (weightUnit) {
@@ -584,7 +620,7 @@ public class BodyScale4GActivity extends AppCompatActivity implements View.OnCli
@Override
public void run() {
try {
getDeviceId();
getMyDeviceId();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
@@ -631,9 +667,13 @@ public class BodyScale4GActivity extends AppCompatActivity implements View.OnCli
}).start();
} else if (v.getId() == R.id.btn_produce) {
url = "https://ailink.aicare.net.cn";
userId = "622733";
roomId = "4376156";

} else if (v.getId() == R.id.btn_test) {
url = "http://test.ailink.app.aicare.net.cn";
userId = "21578";
roomId = "82731";

}
}

+ 17
- 6
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/broadcast_nutrition/BroadNutritionActivity.java Ver arquivo

@@ -11,6 +11,7 @@ import androidx.annotation.Nullable;

import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.config.BleConfig;
import com.pingwang.bluetoothlib.listener.OnBleBroadcastDataListener;
import com.pingwang.bluetoothlib.listener.OnScanFilterListener;
import com.pingwang.bluetoothlib.utils.BleLog;
import com.pingwang.bluetoothlib.utils.BleStrUtils;
@@ -25,7 +26,7 @@ import java.util.Locale;
import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;

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

private ListView list_view;
private Button btn_start;
@@ -70,6 +71,7 @@ public class BroadNutritionActivity extends BleBaseActivity implements View.OnCl
protected void onDestroy() {
if (mAILinkBleManager != null) {
mAILinkBleManager.stopScan();
mAILinkBleManager.removeOnBleBroadcastDataListener(this);
}
super.onDestroy();
}
@@ -77,6 +79,7 @@ public class BroadNutritionActivity extends BleBaseActivity implements View.OnCl
@Override
public void onServiceSuccess() {
mAILinkBleManager.setOnScanFilterListener(this);
mAILinkBleManager.addOnBleBroadcastDataListener(this);
}

@Override
@@ -99,13 +102,14 @@ public class BroadNutritionActivity extends BleBaseActivity implements View.OnCl

private String mMac;


@Override
public void onScanRecord(BleValueBean bleValueBean) {
byte[] manufacturerData = bleValueBean.getManufacturerData();
public void onBleBroadcastData(BleValueBean bleValueBean, byte[] payload) {
mMac = bleValueBean.getMac();
onNotifyData("",manufacturerData, bleValueBean.getCid(), bleValueBean.getVid(), bleValueBean.getPid());
notifyData(payload);
}

private String mOldText = "";
private SimpleDateFormat mSdf;

// 添加一条文本
@@ -113,7 +117,12 @@ public class BroadNutritionActivity extends BleBaseActivity implements View.OnCl
if (mSdf == null) {
mSdf = new SimpleDateFormat("HH:mm:ss", Locale.US);
}
mList.add(mSdf.format(System.currentTimeMillis()) + ":\n" + text);
if (mOldText.equals(text)) {
return;
}
mOldText = text;
String log = mSdf.format(System.currentTimeMillis()) + ":\n" + text;
mList.add(log);
mListAdapter.notifyDataSetChanged();
list_view.smoothScrollToPosition(mList.size() - 1);
}
@@ -179,7 +188,7 @@ public class BroadNutritionActivity extends BleBaseActivity implements View.OnCl
*
* @param hex payloads
*/
private void notifyData(byte[] hex) {
public void notifyData(byte[] hex) {
if (hex.length >= 10) {
int no = hex[0] & 0xff;
int type = hex[1] & 0xff;
@@ -209,4 +218,6 @@ public class BroadNutritionActivity extends BleBaseActivity implements View.OnCl
BigDecimal dc = new BigDecimal(f);
return dc.setScale(decimal, BigDecimal.ROUND_HALF_UP).toString();
}


}

+ 2
- 2
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/broadcast_weight_sacle/BroadcastWeightScaleActivity.java Ver arquivo

@@ -188,7 +188,7 @@ public class BroadcastWeightScaleActivity extends BleNewBaseActivity implements
if (AILinkBleManager.getInstance() != null) {
mDevice = BroadcastWeightScaleDeviceData.getInstance();
mDevice.setOnNotifyData(this);
AILinkBleManager.getInstance().setOnBleBroadcastDataListener(this);
AILinkBleManager.getInstance().addOnBleBroadcastDataListener(this);
AILinkBleManager.getInstance().startScan(0, BleConfig.UUID_SERVER_BROADCAST_AILINK);
}
}
@@ -197,7 +197,7 @@ public class BroadcastWeightScaleActivity extends BleNewBaseActivity implements
public void onServiceErr() {
BleLog.i("ljl", "服务与界面连接断开");
//与服务断开连接
AILinkBleManager.getInstance().setOnBleBroadcastDataListener(null);
AILinkBleManager.getInstance().removeOnBleBroadcastDataListener(this);
}

@Override

+ 511
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/bw05watch/Bw05WatchActivity.java Ver arquivo

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

import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.LocationManager;
import android.os.Bundle;
import android.provider.Settings;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

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

import com.pingwang.bluetoothlib.config.BleConfig;
import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.listener.CallbackDisIm;
import com.pingwang.bluetoothlib.listener.OnCallbackDis;

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

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.CheckPermissionUtils;
import cn.net.aicare.modulelibrary.module.bw05.Bw05WatchBleDevice;
import cn.net.aicare.modulelibrary.module.bw05.OnBw05WatchDataListener;

/**
* @author ljl
* on 2024/6/4
*/
public class Bw05WatchActivity extends BleBaseActivity implements OnBw05WatchDataListener,
View.OnClickListener, OnCallbackDis {

//01:B6:EC:E6:C8:8D
private String connectMac = "";

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

private EditText etCheckTime, etBleName;
private EditText etHrMin, etHrMax;
private EditText etSpo2Min, etSpo2Max;
private EditText etTempMin, etTempMax;
private EditText etSbpMin, etSbpMax;
private EditText etDbpMin, etDbpMax;
private EditText etMac;

private CheckBox cbCheckTime;

private ListView log_list;

private List<String> mList;
private ArrayAdapter mListAdapter;

private String checkTimeOp;

private Bw05WatchBleDevice mBw05WatchBleDevice;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bw05_watch);
initView();
initData();
}

private void initView() {
btnSetTime = findViewById(R.id.btnSetTime);
btnSetTime.setOnClickListener(this);
btnQueryInfo = findViewById(R.id.btnQueryInfo);
btnQueryInfo.setOnClickListener(this);
btnQueryThreshold = findViewById(R.id.btnQueryThreshold);
btnQueryThreshold.setOnClickListener(this);
btnSetCheckTime = findViewById(R.id.btnSetCheckTime);
btnSetCheckTime.setOnClickListener(this);
btnSetBleName = findViewById(R.id.btnSetBleName);
btnSetBleName.setOnClickListener(this);
btnSetThreshold = findViewById(R.id.btnSetThreshold);
btnSetThreshold.setOnClickListener(this);
btnConnect = findViewById(R.id.btnConnect);
btnConnect.setOnClickListener(this);
btnClearLog = findViewById(R.id.btnClearLog);
btnClearLog.setOnClickListener(this);

etCheckTime = findViewById(R.id.etCheckTime);
etBleName = findViewById(R.id.etBleName);
etHrMin = findViewById(R.id.etHrMin);
etHrMax = findViewById(R.id.etHrMax);
etSpo2Min = findViewById(R.id.etSpo2Min);
etSpo2Max = findViewById(R.id.etSpo2Max);
etTempMin = findViewById(R.id.etTempMin);
etTempMax = findViewById(R.id.etTempMax);
etSbpMin = findViewById(R.id.etSbpMin);
etSbpMax = findViewById(R.id.etSbpMax);
etDbpMin = findViewById(R.id.etDbpMin);
etDbpMax = findViewById(R.id.etDbpMax);
etMac = findViewById(R.id.etMac);

cbCheckTime = findViewById(R.id.cbCheckTime);

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

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

etTempMin.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {

}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {

}

@Override
public void afterTextChanged(Editable s) {

if (s.toString().length() == 1 && s.toString().equals(".")) {
s.clear();
}
}
});

etTempMax.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {

}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {

}

@Override
public void afterTextChanged(Editable s) {

if (s.toString().length() == 1 && s.toString().equals(".")) {
s.clear();
}
}
});

log_list = findViewById(R.id.log_list);
}

private void initData() {
mList = new ArrayList<>();
mListAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList);
log_list.setAdapter(mListAdapter);

new CheckPermissionUtils(this).checkPermissions(() -> {

});

// 没有蓝牙权限就请求蓝牙权限
if (!hasBluetooth()) {
requestBluetooth();
return;
}
// 没有定位权限就请求定位权限
if (!hasLocationPermission()) {
requestLocationPermission(this);
return;
}
// 没有定位服务就请求定位服务
if (!hasLocationService()) {
requestLocationService();
return;
}
}

@Override
public void onClick(View v) {
if (v == null) {
return;
}
switch (v.getId()) {
case R.id.btnSetTime:
//设置时间
if (mBw05WatchBleDevice != null) {
mBw05WatchBleDevice.setTime();
}
break;
case R.id.btnQueryInfo:
//查询信息
if (mBw05WatchBleDevice != null) {
mBw05WatchBleDevice.queryInfo();
}
break;
case R.id.btnQueryThreshold:
//查询阈值
if (mBw05WatchBleDevice != null) {
mBw05WatchBleDevice.queryThreshold();
}
break;
case R.id.btnSetCheckTime:
//设置检测间隔时间
if (!TextUtils.isEmpty(etCheckTime.getText().toString())) {
if (etCheckTime.getText().toString().length() < 4 && mBw05WatchBleDevice != null) {
mBw05WatchBleDevice.setCheckTime(checkTimeOp + formatDataStr(etCheckTime.getText().toString(), 3));
}
}
break;
case R.id.btnSetBleName:
//设置蓝牙名称
if (!TextUtils.isEmpty(etBleName.getText().toString())) {
if (mBw05WatchBleDevice != null) {
mBw05WatchBleDevice.setBleName(etBleName.getText().toString());
}
}
break;
case R.id.btnSetThreshold:
//设置阈值
if (!TextUtils.isEmpty(getFloatThresholdValue(etTempMin.getText().toString(), etTempMin.getHint().toString()))
&& !TextUtils.isEmpty(getFloatThresholdValue(etTempMax.getText().toString(), etTempMax.getHint().toString()))) {
if (mBw05WatchBleDevice != null) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(getIntThresholdValue(etHrMin.getText().toString(), etHrMin.getHint().toString()));
stringBuilder.append(getIntThresholdValue(etHrMax.getText().toString(), etHrMax.getHint().toString()));
stringBuilder.append(getIntThresholdValue(etSpo2Min.getText().toString(), etSpo2Min.getHint().toString()));
stringBuilder.append(getIntThresholdValue(etSpo2Max.getText().toString(), etSpo2Max.getHint().toString()));
// stringBuilder.append(getIntThresholdValue(etSbpMin.getText().toString(), etSbpMin.getHint().toString()));
// stringBuilder.append(getIntThresholdValue(etSbpMax.getText().toString(), etSbpMax.getHint().toString()));
// stringBuilder.append(getIntThresholdValue(etDbpMin.getText().toString(), etDbpMin.getHint().toString()));
// stringBuilder.append(getIntThresholdValue(etDbpMax.getText().toString(), etDbpMax.getHint().toString()));
stringBuilder.append(getFloatThresholdValue(etTempMin.getText().toString(), etTempMin.getHint().toString()));
stringBuilder.append(getFloatThresholdValue(etTempMax.getText().toString(), etTempMax.getHint().toString()));

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

case R.id.btnClearLog:
clearText();
break;
default:
break;
}
}

// 清空文本
private void clearText() {
mList.clear();
mListAdapter.notifyDataSetChanged();
}

private SimpleDateFormat mSdf;

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

@Override
public void onServiceSuccess() {
CallbackDisIm.getInstance().addListListener(this);
}

@Override
public void onServiceErr() {

}

@Override
public void unbindServices() {

}

@Override
public void bleClose() {
addText("蓝牙未开启,请退出打开蓝牙重试");
}

@Override
public void onDataStr(String dataStr) {
addText(dataStr);
}

@Override
public void onConnecting(String mac) {
addText("正在连接设备:" + mac);
}

@Override
public void onConnectionSuccess(String mac) {
BleConfig.setHandshakeStatus(mac, false);
}

@Override
public void onServicesDiscovered(String mac) {
addText("连接成功:" + mac);
if (mAILinkBleManager != null) {
runOnUiThread(() -> {
btnConnect.setText("断开");
});
BleDevice bleDevice = mAILinkBleManager.getBleDevice(mac);
Bw05WatchBleDevice.init(bleDevice);
mBw05WatchBleDevice = Bw05WatchBleDevice.getInstance();
mBw05WatchBleDevice.setOnBw05WatchDataListener(this);
}
}

@Override
public void onDisConnected(String mac, int code) {
addText("连接断开:" + mac + "错误码:" + code);
runOnUiThread(() -> {
btnConnect.setText("连接");
});
}

@Override
protected void onDestroy() {
super.onDestroy();
CallbackDisIm.getInstance().removeListener(this);
if (mAILinkBleManager != null) {
mAILinkBleManager.disconnect(connectMac);
}
}

/**
* 转整数
*
* @param inputStr 输入的数据
* @return
*/
private int getIntData(String inputStr) {
try {
return Integer.parseInt(inputStr);
} catch (Exception e) {
return -1000;
}
}

/**
* 转浮点型
*
* @param inputStr 输入的数据
* @return
*/
private float getFloatData(String inputStr) {
try {
return Float.parseFloat(inputStr);
} catch (Exception e) {
return -1000;
}
}

/**
* 阈值整数数值处理
*
* @param inputStr
* @param hintStr
* @return
*/
private String getIntThresholdValue(String inputStr, String hintStr) {
if (TextUtils.isEmpty(inputStr)) {
return formatDataStr(hintStr, 3);
} else {
return formatDataStr(inputStr, 3);
}
}

private String getFloatThresholdValue(String inputStr, String hintStr) {
if (TextUtils.isEmpty(inputStr)) {
return hintStr;
} else {
if ((Float.parseFloat(inputStr) + "").length() > 4) {
Toast.makeText(this, "输入的范围过大", Toast.LENGTH_SHORT).show();
return "";
} else {
return formatDataStr((Float.parseFloat(inputStr) + ""), 4);
}
}
}

/**
* 不足有效数据位需要补零
*
* @param dataStr 输入的数据
* @param digit 该数据的有效数据位
* @return
*/
private String formatDataStr(String dataStr, int digit) {
if (dataStr.length() < digit) {
int diff = digit - dataStr.length();
StringBuilder newDataStr = new StringBuilder();
for (int i = 0; i < diff; i++) {
newDataStr.append("0");
}
newDataStr.append(dataStr);
return newDataStr.toString();
} else {
return dataStr;
}
}

/**
* 判断输入的是否是合法的mac地址
*
* @param inputMacStr
* @return
*/
private boolean isValidMacAddress(String inputMacStr) {
String regex = "^([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}$";
return inputMacStr.matches(regex);
}

public static final int REQUEST_PERMISSION_CODE = 1500;

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

/**
* 蓝牙是否打开
*
* @return boolean
*/
private boolean hasBluetooth() {
return BluetoothAdapter.getDefaultAdapter().isEnabled();
}

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

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

/**
* 申请打开蓝牙
*/
@SuppressLint("MissingPermission")
private void requestBluetooth() {
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(intent, REQUEST_PERMISSION_CODE);
}

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

+ 49
- 4
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/coffee_scale/CoffeeScaleActivity.java Ver arquivo

@@ -14,6 +14,9 @@ import androidx.annotation.Nullable;

import com.pingwang.bluetoothlib.bean.SupportUnitBean;
import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.listener.CallbackDisIm;
import com.pingwang.bluetoothlib.listener.OnCallbackDis;
import com.pingwang.bluetoothlib.utils.BleDensityUtil;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
@@ -24,11 +27,18 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import cn.net.aicare.modulelibrary.module.CoffeeScale.CoffeeScaleData;

public class CoffeeScaleActivity extends BleBaseActivity implements View.OnClickListener, CoffeeScaleData.CoffeeScaleCallback {
/**
* 咖啡秤
*
* @author xing
* @date 2024/04/18
*/
public class CoffeeScaleActivity extends BleBaseActivity implements View.OnClickListener, CoffeeScaleData.CoffeeScaleCallback, OnCallbackDis {

private static final String TAG = "Tag1";

private Button btn_clear;
private Button btnPause;
private Button btn_zero;
private Button btn_set_weight_unit;
private Button btn_set_temp_unit;
@@ -74,7 +84,7 @@ public class CoffeeScaleActivity extends BleBaseActivity implements View.OnClick

private List<String> mList;
private ArrayAdapter mListAdapter;
private boolean mPauseRefresh = false;
private String mMac;
private BleDevice mBleDevice;
private CoffeeScaleData mCoffeeScaleData;
@@ -85,6 +95,7 @@ public class CoffeeScaleActivity extends BleBaseActivity implements View.OnClick
setContentView(R.layout.activity_coffee_scale);

btn_clear = findViewById(R.id.btn_clear);
btnPause = findViewById(R.id.btnPause);
btn_zero = findViewById(R.id.btn_zero);
btn_set_weight_unit = findViewById(R.id.btn_set_weight_unit);
btn_set_temp_unit = findViewById(R.id.btn_set_temp_unit);
@@ -129,6 +140,7 @@ public class CoffeeScaleActivity extends BleBaseActivity implements View.OnClick
list_view = findViewById(R.id.list_view);

btn_clear.setOnClickListener(this);
btnPause.setOnClickListener(this);
btn_zero.setOnClickListener(this);
btn_set_weight_unit.setOnClickListener(this);
btn_set_temp_unit.setOnClickListener(this);
@@ -148,6 +160,8 @@ public class CoffeeScaleActivity extends BleBaseActivity implements View.OnClick
mList = new ArrayList<>();
mListAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList);
list_view.setAdapter(mListAdapter);
CallbackDisIm.getInstance().addListListener(this);

}

@Override
@@ -157,8 +171,13 @@ public class CoffeeScaleActivity extends BleBaseActivity implements View.OnClick
// 清空文本框
clearText();
break;
case R.id.btnPause:
// 清空文本框
mPauseRefresh = !mPauseRefresh;
break;
case R.id.btn_zero:
// APP下发去皮功能(归零功能)
//某些秤可能需要进入冲煮模式才能使用,并且设备上面的定时和归零可用
appSetZero();
break;
case R.id.btn_set_weight_unit:
@@ -206,6 +225,7 @@ public class CoffeeScaleActivity extends BleBaseActivity implements View.OnClick

@Override
protected void onDestroy() {
CallbackDisIm.getInstance().removeListener(this);
if (mAILinkBleManager != null) {
mAILinkBleManager.disconnectAll();
}
@@ -344,6 +364,20 @@ public class CoffeeScaleActivity extends BleBaseActivity implements View.OnClick

}

@Override
public void onWeightResult(int status, int weightUnit, int weightDecimal, int weightSource, int err) {
String weightStr = (status == 1 ? "稳定重量" : "实时重量") + ":" + BleDensityUtil.getInstance().holdDecimals(weightSource, weightDecimal) + getWeightUnitStr(weightUnit);
String text = "体重数据:" + weightStr;
addText(text);
}

@Override
public void onTempResult(int tempUnit, int tempDecimal, int tempSource) {
String tempStr = BleDensityUtil.getInstance().holdDecimals(tempSource, tempDecimal) + getTempUnitStr(tempUnit);
String text = "温度数据:" + tempStr;
addText(text);
}

// APP下发去皮功能(归零功能)
private void appSetZero() {
Log.i(TAG, "去皮功能(归零功能)");
@@ -504,9 +538,11 @@ public class CoffeeScaleActivity extends BleBaseActivity implements View.OnClick
}

SimpleDateFormat sdf;

// 添加一条文本
private void addText(String text) {
if (mPauseRefresh) {
return;
}
if (sdf == null) {
sdf = new SimpleDateFormat("HH:mm:ss", Locale.US);
}
@@ -608,7 +644,7 @@ public class CoffeeScaleActivity extends BleBaseActivity implements View.OnClick
}
return "";
}
private String getAlertOpStr(int op) {
switch (op) {
case 0:
@@ -628,4 +664,13 @@ public class CoffeeScaleActivity extends BleBaseActivity implements View.OnClick
}
return "";
}


@Override
public void onDisConnected(String mac, int code) {
if (mac.equalsIgnoreCase(mMac)) {
addText("设备:" + mac + "断开连接:" + code);
finish();
}
}
}

+ 378
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/eight_bodyfat/EightBodyFatMcuActivity.java Ver arquivo

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

import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.CompoundButton;
import android.widget.ListView;
import android.widget.RadioButton;

import androidx.annotation.Nullable;

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

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

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatMcuDeviceData;
import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatUtil;

/**
* 八电极秤 MCU
*/
public class EightBodyFatMcuActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, EightBodyFatMcuDeviceData.onEightBodyFatMcuCallback {

private List<String> loglist;
private ListView log_list;
private ArrayAdapter listAdapter;
private String mAddress;
private EightBodyFatMcuDeviceData mEightBodyFatDeviceData;
private RadioButton kg, jing, stlb, lb, C, F;

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

}


private void init() {
log_list = findViewById(R.id.log_list);
kg = findViewById(R.id.kg);
jing = findViewById(R.id.jin);
stlb = findViewById(R.id.st_lb);
lb = findViewById(R.id.lb);
C = findViewById(R.id.c);
F = findViewById(R.id.f);
findViewById(R.id.support_unit).setOnClickListener(this);
kg.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
if (mEightBodyFatDeviceData != null)
mEightBodyFatDeviceData.setWeightUnit(EightBodyFatUtil.KG);

}
}
});
jing.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
if (mEightBodyFatDeviceData != null)
mEightBodyFatDeviceData.setWeightUnit(EightBodyFatUtil.JIN);
}
}
});
stlb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
if (mEightBodyFatDeviceData != null)
mEightBodyFatDeviceData.setWeightUnit(EightBodyFatUtil.ST);
}
}
});
lb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
if (mEightBodyFatDeviceData != null)
mEightBodyFatDeviceData.setWeightUnit(EightBodyFatUtil.LB);
}
}
});
C.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
if (mEightBodyFatDeviceData != null)
mEightBodyFatDeviceData.setTempUnit(EightBodyFatUtil.C);
}
}
});
F.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
if (mEightBodyFatDeviceData != null)
mEightBodyFatDeviceData.setTempUnit(EightBodyFatUtil.F);
}
}
});
kg.setChecked(true);
C.setChecked(true);
}

@Override
public void onServiceSuccess() {
loglist.add(0, "绑定服务成功");
if (mAILinkBleManager != null) {
mAILinkBleManager.setOnCallbackBle(this);
BleDevice bleDevice = mAILinkBleManager.getBleDevice(mAddress);
if (bleDevice != null) {
mEightBodyFatDeviceData = new EightBodyFatMcuDeviceData(bleDevice);
mEightBodyFatDeviceData.setEightBodyFatCallback(this);
}
}

}

@Override
public void onServiceErr() {

}

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

@Override
public void onDisConnected(String mac, int code) {
if (mAddress.equals(mac)) {
addLog("连接断开:" + code);
}
}

@Override
public void onClick(View v) {
if (v.getId() == R.id.support_unit) {
if (mEightBodyFatDeviceData != null)
mEightBodyFatDeviceData.getUnitList();
}
}


@Override
public void onState(int opCode, int result) {
//0x01 : 校准 0x02 : 温度单位切换 0x03:重量单位切换
String opCodeStr = "";
if (opCode == 0x01) {
opCodeStr = "校准";
} else if (opCode == 0x02) {
opCodeStr = "温度单位切换";
} else if (opCode == 0x03) {
opCodeStr = "重量单位切换";
}
String resultStr = "";
if (result == 0x00) {
resultStr = "操作成功";
} else if (result == 0x01) {
resultStr = "操作失败";
} else if (result == 0x02) {
resultStr = "正在操作中";
}
addLog("设备返回操作指令:" + opCodeStr + " 结果:" + resultStr);
}

private double weightValue;

@Override
public void onWeight(int status, int weight, int unit, int decimal) {
String statusStr = "";
if (status == 0x01) {
statusStr = "实时体重";
} else if (status == 0x02) {
statusStr = "稳定体重";
}
if (decimal == 0) {
weightValue = weight;
} else {
weightValue = weight / (decimal * 10.0);
}
String unitStr = "";
if (unit == EightBodyFatUtil.KG) {
unitStr = "kg";
} else if (unit == EightBodyFatUtil.JIN) {
unitStr = "斤";
} else if (unit == EightBodyFatUtil.ST) {
unitStr = "lb(未转换为st:lb)";
} else if (unit == EightBodyFatUtil.LB) {
unitStr = "lb";
}

addLog("体重:" + statusStr + " " + weightValue + unitStr);
}

@Override
public void onHeight(int status, int height, int unit) {
String statusStr = "";
if (status == 0x01) {
statusStr = "测量中";
} else if (status == 0x03) {
statusStr = "测量失败";
} else if (status == 0x02) {
statusStr = "测量完成";
}
String unitStr = "";
if (unit == 0x00) {
unitStr = "cm";
} else if (unit == 0x01) {
unitStr = "inch";
} else if (unit == 0x02) {
unitStr = "ft-in";
}
addLog("身高:" + statusStr + " " + height + unitStr);
}

@Override
public void onImpedance(int status, EightBodyFatMcuDeviceData.EightBodyFatAdc eightBodyFatAdc, int arithmetic) {
String statusStr = "";
if (status == EightBodyFatUtil.IMPEDANCE_MEASUREMENT) {
statusStr = "测量中";
} else if (status == EightBodyFatUtil.IMPEDANCE_FAILED) {
statusStr = "测量失败";
} else if (status == EightBodyFatUtil.IMPEDANCE_SUCCESS_MCU) {
statusStr = "测量完成";
}
String partStr = "";
int part = eightBodyFatAdc.getPart();
int adc = eightBodyFatAdc.getAdc();
if (part == 0x00) {
partStr = "双脚阻抗";
} else if (part == 0x01) {
partStr = "双手阻抗";
} else if (part == 0x02) {
partStr = "左手阻抗";
} else if (part == 0x03) {
partStr = "右手阻抗";
} else if (part == 0x04) {
partStr = "左脚阻抗";
} else if (part == 0x05) {
partStr = "右脚阻抗";
} else if (part == 0x06) {
partStr = "左全身阻抗";
} else if (part == 0x07) {
partStr = "右全身阻抗";
} else if (part == 0x08) {
partStr = "右手左脚阻抗";
} else if (part == 0x09) {
partStr = "左手右脚阻抗";
} else if (part == 0x0A) {
partStr = "躯干阻抗";
}

addLog("阻抗:" + statusStr + " " + partStr + " : " + adc);
}

@Override
public void onHeartRate(int status, int heartRate) {
String statusStr = "";
if (status == EightBodyFatUtil.HEART_RATE_MEASUREMENT) {
statusStr = "测量中";
} else if (status == EightBodyFatUtil.HEART_RATE_SUCCESS) {
statusStr = "测量成功";
} else if (status == EightBodyFatUtil.HEART_RATE_FAILED) {
statusStr = "测量失败";
}
addLog("心率:" + statusStr + " " + heartRate);
}

@Override
public void onTemp(int sign, int temp, int unit, int decimal) {
double tempValue = temp / (decimal * 10.0);
if (decimal == 0) {
tempValue = temp;
}
if (sign == 1) {
tempValue = -tempValue;
}
String unitStr = "";
if (unit == EightBodyFatUtil.C) {
unitStr = "℃";
} else if (unit == EightBodyFatUtil.F) {
unitStr = "℉";
}
addLog("温度:" + tempValue + unitStr);
}

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

@Override
public void onCompletionData() {
addLog("请求补充体脂数据");
}

@Override
public void onBodyFatData(int step, EightBodyFatMcuDeviceData.EightBodyFatInfo bodyFat) {
addLog("体脂测量中,步骤:" + step);
}

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

@Override
public void onErrCode(int code) {
addLog("错误码:" + code);
}

@Override
public void onVersion(String version) {
addLog("当前版本:" + version);
}

@Override
public void onSupportUnit(List<SupportUnitBean> list) {
addLog("支持单位:");
for (SupportUnitBean supportUnitBean : list) {
addLog(supportUnitBean.toString());
}
}

@Override
public void showData(String data) {
addLog(data);
}


@Override
protected void onDestroy() {
super.onDestroy();
AILinkBleManager.getInstance().disconnect(mAddress);

}

private String mOldLog = "";

/**
* 添加日志
*
* @param log 日志
*/
private void addLog(String log) {
if (mOldLog.equalsIgnoreCase(log)) {
return;
}
mOldLog = log;
loglist.add(0, log);
if (listAdapter != null) {
listAdapter.notifyDataSetChanged();
}
}




}

app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/EightBodyfatActivity.java → app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/eight_bodyfat/EightBodyfatActivity.java Ver arquivo

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

import android.os.Bundle;
import android.view.View;
@@ -16,6 +16,7 @@ import com.pingwang.bluetoothlib.listener.OnCallbackBle;
import java.util.ArrayList;
import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.EightBodyFatAlgorithms;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.EightBodyFatBean;
@@ -45,19 +46,19 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, loglist);
log_list.setAdapter(listAdapter);

weight = 60;
if (mEightBodyfatAdc == null) {
mEightBodyfatAdc = new EightBodyfatAdc();
}
mEightBodyfatAdc.setAdcFoot(5784349);
mEightBodyfatAdc.setAdcHand(5121114);
mEightBodyfatAdc.setAdcLeftHand(12854746);
mEightBodyfatAdc.setAdcRightHand(15738341);
mEightBodyfatAdc.setAdcLeftFoot(1074604);
mEightBodyfatAdc.setAdcRightFoot(13046299);
mEightBodyfatAdc.setAdcLeftBody(7480094);
mEightBodyfatAdc.setAdcRightBody(7480094);
kaimengJieMi(mEightBodyfatAdc);
// weight = 60;
// if (mEightBodyfatAdc == null) {
// mEightBodyfatAdc = new EightBodyfatAdc();
// }
// mEightBodyfatAdc.setAdcFoot(5784349);
// mEightBodyfatAdc.setAdcHand(5121114);
// mEightBodyfatAdc.setAdcLeftHand(12854746);
// mEightBodyfatAdc.setAdcRightHand(15738341);
// mEightBodyfatAdc.setAdcLeftFoot(1074604);
// mEightBodyfatAdc.setAdcRightFoot(13046299);
// mEightBodyfatAdc.setAdcLeftBody(7480094);
// mEightBodyfatAdc.setAdcRightBody(7480094);
// kaimengJieMi(mEightBodyfatAdc);

}


app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/EightBodyfatAdc.java → app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/eight_bodyfat/EightBodyfatAdc.java Ver arquivo

@@ -1,19 +1,55 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid;
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.eight_bodyfat;

public class EightBodyfatAdc {


/**
* 双脚阻抗
*/
private int adcFoot; //双脚阻抗,
/**
* 双手阻抗
*/
private int adcHand;//双手阻抗
/**
* 左手阻抗
*/
private int adcLeftHand; //左手阻抗
/**
* 右手阻抗
*/
private int adcRightHand; //右手阻抗
/**
* 左脚阻抗
*/
private int adcLeftFoot; //左脚阻抗
/**
* 右脚阻抗
*/
private int adcRightFoot; //右脚阻抗
/**
* 左身体阻抗
*/
private int adcLeftBody;
/**
* 右身体阻抗
*/
private int adcRightBody;
/**
* 阻抗右手左脚
*/
private int adcRightHandLeftFoot;
/**
* 阻抗左手右脚
*/
private int adcLeftHandRightFoot;
/**
* 阻抗身体
*/
private int adcBody;
/**
* 算法ID
*/
private int algorithms;



+ 464
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/eight_bodyfat/dual_band/EightDoubleBodyfatActivity.java Ver arquivo

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

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

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

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

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

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.JsonLoader;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.UnitUtils;
import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatUtil;
import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.BaseEightDoubleBodyFatData;
import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.EightDoubleBodyFatAdcBean;
import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.EightDoubleBodyFatBean;
import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.EightDoubleBodyFatBleConfig;
import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.EightDoubleBodyFatBleDeviceData;
import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.EightDoubleBodyFatBleMcuDeviceData;
import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.OnEightDoubleBodyFatCallback;

/**
* 双频八电极秤(mcu算法)
*
* @author xing
* @date 2024/03/14
*/
public class EightDoubleBodyfatActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, OnEightDoubleBodyFatCallback {


/**
* 刷新键
*/
private final int REFRESH_KEY = 0x01;
private List<String> mLoglist;
private ListView log_list;
private ArrayAdapter mAdapter;
private String mAddress;
private BaseEightDoubleBodyFatData mEightDoubleBodyFatData;
private RadioButton kg, jing, stlb, lb;
private EditText et_weight, et_height, et_age, et_sex;
private String mWeightKg = "78";
private UserInfoBean mUserInfoBean;
private Map<String, String> mMap;
private int mCid;

private Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
if (msg.what == REFRESH_KEY) {
if (mAdapter != null) {
mAdapter.notifyDataSetChanged();
}
}


}
};

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_eight_double_body_fata);
mAddress = getIntent().getStringExtra("mac");
mCid = getIntent().getIntExtra("cid", 0);
initView();
initListener();
initData();

}

private void initData() {
mLoglist = new ArrayList<>();
mAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mLoglist);
log_list.setAdapter(mAdapter);
mMap = JsonLoader.loadJsonFromAsset(this, "text.json");
initUserInfo();
Button test_bodyfit = findViewById(R.id.test_bodyfit);
test_bodyfit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
List<EightDoubleBodyFatAdcBean> list = new ArrayList<>();
EightDoubleBodyFatAdcBean adcBean = new EightDoubleBodyFatAdcBean();
adcBean.setAdcRightHand(2433844368L);
adcBean.setAdcLeftHand(3781622117L);
adcBean.setAdcBody(1349958013L);
adcBean.setAdcRightFoot(1365295937L);
adcBean.setAdcLeftFoot(1903359127L);
adcBean.setFrequencyId(0x01);
adcBean.setAlgorithmsId(0x01);
list.add(adcBean);

EightDoubleBodyFatAdcBean adcBean100 = new EightDoubleBodyFatAdcBean();
adcBean100.setAdcRightHand(2447381468L);
adcBean100.setAdcLeftHand(1909750593L);
adcBean100.setAdcBody(2954962439L);
adcBean100.setAdcRightFoot(4036701847L);
adcBean100.setAdcLeftFoot(2421978775L);
adcBean100.setFrequencyId(0x02);
adcBean100.setAlgorithmsId(0x01);
list.add(adcBean100);
onTestCompleted(list);
}
});
}

private void initUserInfo() {
mWeightKg = et_weight.getText().toString().trim();
String height = et_height.getText().toString().trim();
String age = et_age.getText().toString().trim();
String sex = et_sex.getText().toString().trim();
if (mUserInfoBean == null) {
mUserInfoBean = new UserInfoBean();
}
mUserInfoBean.setAge(Integer.parseInt(age));
mUserInfoBean.setSex(Integer.parseInt(sex));
mUserInfoBean.setHeightCm(Integer.parseInt(height));
mUserInfoBean.setWeightKg(Float.parseFloat(mWeightKg));
}

private void initView() {
et_weight = findViewById(R.id.et_weight);
et_height = findViewById(R.id.et_height);
et_age = findViewById(R.id.et_age);
et_sex = findViewById(R.id.et_sex);
log_list = findViewById(R.id.log_list);
kg = findViewById(R.id.kg);
jing = findViewById(R.id.jin);
stlb = findViewById(R.id.st_lb);
lb = findViewById(R.id.lb);
}


private void initListener() {

findViewById(R.id.support_unit).setOnClickListener(this);
findViewById(R.id.btn_clear_log).setOnClickListener(this);
kg.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
if (mEightDoubleBodyFatData != null) {
mEightDoubleBodyFatData.setWeightUnit(EightBodyFatUtil.KG);
}
}
}
});
jing.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
if (mEightDoubleBodyFatData != null) {
mEightDoubleBodyFatData.setWeightUnit(EightBodyFatUtil.JIN);
}

}
}
});
stlb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
if (mEightDoubleBodyFatData != null) {
mEightDoubleBodyFatData.setWeightUnit(EightBodyFatUtil.ST);
}
}
}
});
lb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
if (mEightDoubleBodyFatData != null) {
mEightDoubleBodyFatData.setWeightUnit(EightBodyFatUtil.LB);
}
}
}
});
kg.setChecked(true);
}

@Override
public void onServiceSuccess() {
showData("绑定服务成功");
if (mAILinkBleManager != null) {
mAILinkBleManager.setOnCallbackBle(this);
BleDevice bleDevice = mAILinkBleManager.getBleDevice(mAddress);
if (bleDevice != null) {
if (mCid == EightDoubleBodyFatBleConfig.CID_APP) {
mEightDoubleBodyFatData = EightDoubleBodyFatBleDeviceData.init(bleDevice);
} else if (mCid == EightDoubleBodyFatBleConfig.CID_MCU) {
mEightDoubleBodyFatData = EightDoubleBodyFatBleMcuDeviceData.init(bleDevice);
} else {
L.e("无效的CID:" + mCid);
return;
}
mEightDoubleBodyFatData.setEightBodyFatCallback(this);
}
}

}

@Override
public void onServiceErr() {

}

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

@Override
public void onDisConnected(String mac, int code) {
showData("连接断开:" + mac + " code=" + code);
}

@Override
public void onClick(View v) {
if (v.getId() == R.id.support_unit) {
if (mEightDoubleBodyFatData != null) {
mEightDoubleBodyFatData.getUnitList();
}
} else if (v.getId() == R.id.btn_clear_log) {
mLoglist.clear();
mHandler.sendEmptyMessage(REFRESH_KEY);
}
}


@Override
public void onErrCode(int state) {
showData("错误码:" + state);
}

@Override
public void onUnitState(int state) {
showData("单位状态:" + state);
}

@Override
public void onTestCompleted(List<EightDoubleBodyFatAdcBean> adcBeanList) {
initUserInfo();
mLoglist.add(0, "测试完成:" + adcBeanList.size());
for (EightDoubleBodyFatAdcBean adcBean : adcBeanList) {
String data = "";
data += (adcBean.getFrequencyId() == 0x01) ? "频率:20kHz" : "频率:100kHz";
data += "\n 左手阻抗:" + adcBean.getAdcLeftHand();
data += "\n 右手阻抗:" + adcBean.getAdcRightHand();
data += "\n 左脚阻抗:" + adcBean.getAdcLeftFoot();
data += "\n 右脚阻抗:" + adcBean.getAdcRightFoot();
data += "\n 躯干阻抗:" + adcBean.getAdcBody();
data += "\n 算法:" + adcBean.getAlgorithmsId();
mLoglist.add(0, data);
}
mLoglist.add(0, "用户信息:" + mUserInfoBean.toString());
mHandler.sendEmptyMessage(REFRESH_KEY);
getBodyFatData(adcBeanList);
}

// private HetaiHttpUtils mHetaiHttpUtils;

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


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

}

@Override
public void onWeight(int state, int weight, int decimal, int unit, int batteryStatus, int power) {
//测量状态 1实时体重 2稳定体重
float weightF = Float.parseFloat(UnitUtils.getHoldDecimal(decimal, weight));
String stateStr = "";
if (state == EightDoubleBodyFatBleConfig.STATUS_WEIGHT_REAL_TIME_WEIGH) {
stateStr = "实时体重";
} else if (state == EightDoubleBodyFatBleConfig.STATUS_WEIGHT_STABILIZATION_WEIGHT) {
stateStr = "稳定体重";
mWeightKg = String.valueOf(weightF);
if (et_weight != null) {
et_weight.setText(mWeightKg);
}
}

if (unit == EightDoubleBodyFatBleConfig.STATUS_ST) {
showData("测量状态:" + state + stateStr + " 体重:" + lbToStlb(weightF) + " 体重单位:" + unit + " 小数点位" + decimal);
} else {
showData("测量状态:" + state + stateStr + " 体重:" + weightF + " 体重单位:" + unit + " 小数点位" + decimal);
}
}


public static String lbToStlb(float lb) {
int st = (int) lb / 14;
float mlb = lb % 14f;
return st + ":" + mlb;
}

@Override
public void onImpedanceStatus(int status) {
String adc = "";
switch (status) {
case EightDoubleBodyFatBleConfig.STATUS_IMPEDANCE_MEASUREMENT:
adc = "阻抗测量中";
break;
case EightDoubleBodyFatBleConfig.STATUS_IMPEDANCE_SUCCESS:
//阻抗测量成功
adc = "阻抗测量成功";
break;
case EightDoubleBodyFatBleConfig.STATUS_IMPEDANCE_FAILED:
adc = "阻抗测量失败";
//阻抗测量失败
break;

}
showData(adc);
}


@Override
public void onVersion(String version) {
showData("当前版本:" + version);
}

@Override
public void onSupportUnit(List<SupportUnitBean> list) {
mLoglist.add(0, "支持单位:");
for (SupportUnitBean supportUnitBean : list) {
mLoglist.add(0, supportUnitBean.toString());
}
mHandler.sendEmptyMessage(REFRESH_KEY);
}

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

@Override
public void onHeartRate(int status, int heartRate) {
String statusStr = "";
if (status == 0x01) {
statusStr = "心率测量中";
} else if (status == 0x02) {
statusStr = "心率测量成功:" + heartRate;
} else if (status == 0x03) {
statusStr = "心率测量失败";
}
showData(statusStr);
}

@Override
public void onTemperature(int temp, int unit, int decimal) {
showData("温度:" + temp + " 单位:" + unit + " 小数点位" + decimal);
}

@Override
public void onSyncUser() {
if (mEightDoubleBodyFatData != null && mEightDoubleBodyFatData instanceof EightDoubleBodyFatBleMcuDeviceData) {
((EightDoubleBodyFatBleMcuDeviceData) mEightDoubleBodyFatData).setUserInfo(0, 0, mUserInfoBean.getAge(), mUserInfoBean.getSex(), mUserInfoBean.getHeightCm());
}
showData("设备请求同步用户信息");
}

private String mOldData = "";

@Override
public void showData(String data) {
if (mOldData.equals(data)) {
return;
}
mOldData = data;
mLoglist.add(0, data);
mHandler.sendEmptyMessage(REFRESH_KEY);
}


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

+ 47
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/eight_bodyfat/dual_band/UserInfoBean.java Ver arquivo

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

public class UserInfoBean {

private int age;
private int heightCm;
private float weightKg;

private int sex;

public int getAge() {
return age;
}

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

public int getHeightCm() {
return heightCm;
}

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

public float getWeightKg() {
return weightKg;
}

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

public int getSex() {
return sex;
}

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

@Override
public String toString() {
return "UserInfoBean{" + "age=" + age + ", heightCm=" + heightCm + ", weightKg=" + weightKg + ", sex=" + sex + '}';
}
}

+ 395
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/gasDetector/GasDetectorActivity.java Ver arquivo

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

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

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

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

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleAppNewBaseActivity;
import cn.net.aicare.modulelibrary.module.gasDetector.GasDetectorCurrentInfoBean;
import cn.net.aicare.modulelibrary.module.gasDetector.GasDetectorDevice;
import cn.net.aicare.modulelibrary.module.gasDetector.GasDetectorHistoryInfoBean;
import cn.net.aicare.modulelibrary.module.gasDetector.OnGasDetectorInfoListener;

/**
* 气体探测器界面
*
* @author xing
* @date 2024/09/05
*/
public class GasDetectorActivity extends BleAppNewBaseActivity implements View.OnClickListener, OnCallbackBle, OnGasDetectorInfoListener {

private String mMac = "";
private EditText etInterval, etDensity, etHpa, etInHg;
private GasDetectorDevice mGasDetectorDevice;
private ListView list_view;
private List<String> mList;
private ArrayAdapter mListAdapter;

@Override
protected void uiHandlerMessage(Message msg) {

}

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

@Override
protected void initListener() {

}

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

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

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

break;

}
}

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

@Override
protected void initView() {
etDensity = (EditText) findViewById(R.id.etDensity);
etInterval = (EditText) findViewById(R.id.etInterval);
etHpa = (EditText) findViewById(R.id.etHpa);
etInHg = (EditText) findViewById(R.id.etInHg);
list_view = findViewById(R.id.list_view);
}

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

@Override
public void onServiceErr() {

}

@Override
public void unbindServices() {

}


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


@Override
public void onCurrentInfo(GasDetectorCurrentInfoBean currentInfoBean) {
addText("当前信息:" + currentInfoBean.toString());
}

@Override
public void onCo2Density(int density) {
addText("CO2报警浓度(单位ppm):" + density);
}

@Override
public void onCo2Interval(int interval) {
addText("CO2间隔(单位min)0代表一直:" + interval);
}

@Override
public void onCo2Switch(int status) {
addText("CO2开关:" + (status == 0 ? "打开" : "关闭"));
}

@Override
public void onCoDensity(int density) {
addText("CO报警浓度(单位ppm):" + density);
}

@Override
public void onCoInterval(int interval) {
addText("CO间隔(单位min)0代表一直:" + interval);
}

@Override
public void onCoSwitch(int status) {
addText("CO开关:" + (status == 0 ? "打开" : "关闭"));
}

@Override
public void onO2Density(int density) {
addText("O2报警浓度(单位%):" + density);
}

@Override
public void onHistorySaveInterval(int interval) {
addText("历史记录保存间隔(单位:分钟,0代表一直):" + interval);
}

@Override
public void onTempUnit(int unit) {
addText("温度单位:" + (unit == 0 ? "℃" : "℉"));
}

@Override
public void onPressureUnit(int unit) {
addText("气压单位:" + (unit == 0 ? "hPa" : "inHg"));
}

@Override
public void onPressureCalibration(int hpa, int inHg) {
addText("气压校准:hpa=" + hpa + " inHg=" + inHg);
}

@Override
public void onBrightness(int brightness) {
addText("亮度:" + brightness);
}

@Override
public void onSoundSwitch(int status) {
addText("声音开关:" + (status == 0 ? "打开" : "关闭"));
}

@Override
public void onShockSwitch(int status) {
addText("震动开关:" + (status == 0 ? "打开" : "关闭"));
}

@Override
public void onSyncTime(long time) {
addText("同步时间成功:time=" + time + " 格式化:" + sdf.format(time * 1000));
}

@Override
public void onScreenOffTime(int time) {
addText("息屏时间(单位,秒)0代表从不:" + time);
}

@Override
public void onShutdownTime(int time) {
addText("关机时间(单位,小时)0代表从不:" + time);
}

@Override
public void onHistoryInfo(GasDetectorHistoryInfoBean historyInfoBean) {
addText("历史记录:" + historyInfoBean.toString());
if (historyInfoBean.getAllCount() != historyInfoBean.getCount()) {
mGasDetectorDevice.getOfflineHistory(historyInfoBean.getCount());
}
}

@Override
public void onClearHistory() {
addText("清空历史记录成功");
}

private SimpleDateFormat sdf;
private String mOldText = "";

private void addText(String text) {
if (mOldText.equals(text)) {
return;
}
if (sdf == null) {
sdf = new SimpleDateFormat("HH:mm:ss", Locale.US);
}
mList.add(0, sdf.format(System.currentTimeMillis()) + ":\n" + text);
mListAdapter.notifyDataSetChanged();
}


@Override
protected void onDestroy() {
super.onDestroy();
AILinkBleManager.getInstance().removeOnCallbackBle(this);
if (mGasDetectorDevice != null) {
mGasDetectorDevice.clear();
}
}
}

+ 1
- 1
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/meat_probe_charger/MeatProbeChargerActivity.java Ver arquivo

@@ -205,7 +205,7 @@ public class MeatProbeChargerActivity extends BleBaseActivity implements View.On
*/
private void cancelDialog() {
ShowListDialogFragment.newInstance().setTitle("选择探针").setCancel("取消", 0).setCancelBlank(true).setBackground(true).setBottom(false).setList(mDialogMacList)
.setOnDialogListener(new ShowListDialogFragment.onDialogListener() {
.setOnDialogListener(new ShowListDialogFragment.onDialogListener() {
@Override
public void onItemListener(int position) {
Toast.makeText(MeatProbeChargerActivity.this, mDialogMacList.get(position).getName() + "设置该指令", Toast.LENGTH_SHORT).show();

+ 114
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/BleScanUtil.java Ver arquivo

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

import com.pingwang.bluetoothlib.AILinkBleManager;
import com.pingwang.bluetoothlib.bean.BleScanAddAilinkBean;
import com.pingwang.bluetoothlib.config.BleConfig;
import com.pingwang.bluetoothlib.server.ELinkBleServer;
import com.pingwang.bluetoothlib.utils.UuidUtils;

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

/**
* 蓝牙扫描设备工具
* 因为 AILink 现在接了不是 AILink 协议的设备,比如旧的营养秤 UUID 不同
*/
public class BleScanUtil {

/**
* 开始扫描设备
*
* @param blueToothService 蓝牙服务
* @param timeout 延迟 ms
*/
public static void scanLeDevice(ELinkBleServer blueToothService, long timeout) {
blueToothService.scanLeDevice(timeout, getScanLeDeviceMap());
}

public static void scanLeDevice(AILinkBleManager aiLinkBleManager, long timeout) {
aiLinkBleManager.startScan(timeout, getScanLeDeviceMap());
}


public static List<BleScanAddAilinkBean> getScanLeDeviceMap() {
List<BleScanAddAilinkBean> list = new ArrayList<>();
list.add(getAifresh());
list.add(getAifit02());
list.add(getAifit03());
list.add(getOkOk());
return list;
}

public static UUID[] getScanLeDeviceUUID() {
UUID[] uuids = new UUID[]{UUID.fromString("0000FFB0-0000-1000-8000-00805F9B34FB"),// 旧的营养秤 AC05
// UUID.fromString("0000FEE7-0000-1000-8000-00805F9B34FB"),// 华盛达手表
BleConfig.UUID_SERVER_AILINK, BleConfig.UUID_SERVER_BROADCAST_AILINK};
return uuids;
}


/**
* 好营养AC05的设备
*
* @return {@link BleScanAddAilinkBean}
*/
private static BleScanAddAilinkBean getAifresh() {
// 旧的营养秤
BleScanAddAilinkBean bleScanAddAilinkBean = new BleScanAddAilinkBean();
bleScanAddAilinkBean.setDeviceServiceUUID(new UUID[]{UuidUtils.getUuid("0000FFB0-0000-1000-8000-00805F9B34FB")});
byte[] bytes = new byte[]{(byte) 0xAC, 0x05};
bleScanAddAilinkBean.setDeviceBroadcast(bytes, 0, bytes.length);
bleScanAddAilinkBean.setCid(0x0037);
bleScanAddAilinkBean.setVid(0x0000);
bleScanAddAilinkBean.setPid(0x0000);
return bleScanAddAilinkBean;
}

/**
* 好身材AC02的体脂秤,带温度
*
* @return {@link BleScanAddAilinkBean}
*/
private static BleScanAddAilinkBean getAifit02() {
// 旧的好身材
BleScanAddAilinkBean bleScanAddAilinkBean = new BleScanAddAilinkBean();
bleScanAddAilinkBean.setDeviceServiceUUID(new UUID[]{UuidUtils.getUuid("0000FFB0-0000-1000-8000-00805F9B34FB")});
byte[] bytes = new byte[]{(byte) 0xAC, 0x02};
bleScanAddAilinkBean.setDeviceBroadcast(bytes, 0, bytes.length);
bleScanAddAilinkBean.setCid(0x005E);
bleScanAddAilinkBean.setVid(0x0070);
bleScanAddAilinkBean.setPid(0x0001);
return bleScanAddAilinkBean;
}

/**
* 好身材AC03的体脂秤,带温度
*
* @return {@link BleScanAddAilinkBean}
*/
private static BleScanAddAilinkBean getAifit03() {
// 旧的好身材
BleScanAddAilinkBean bleScanAddAilinkBean = new BleScanAddAilinkBean();
bleScanAddAilinkBean.setDeviceServiceUUID(new UUID[]{UuidUtils.getUuid("0000FFB0-0000-1000-8000-00805F9B34FB")});
byte[] bytes = new byte[]{(byte) 0xAC, 0x03};
bleScanAddAilinkBean.setDeviceBroadcast(bytes, 0, bytes.length);
bleScanAddAilinkBean.setCid(0x005E);
bleScanAddAilinkBean.setVid(0x0070);
bleScanAddAilinkBean.setPid(0x0001);
return bleScanAddAilinkBean;
}

private static BleScanAddAilinkBean getOkOk() {
// OKOK广播秤
BleScanAddAilinkBean bleScanAddAilinkBean = new BleScanAddAilinkBean();
bleScanAddAilinkBean.setDeviceServiceUUID(null);
byte[] bytes = new byte[]{(byte) 0x00, 0x00};
bleScanAddAilinkBean.setDeviceBroadcast(bytes, 6, 6+bytes.length);
bleScanAddAilinkBean.setCid(0x08+0xFFFF);
bleScanAddAilinkBean.setVid(0x0001);
bleScanAddAilinkBean.setPid(0x0002);
return bleScanAddAilinkBean;
}

}

+ 38
- 5
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/EightBodyFatAlgorithms.java Ver arquivo

@@ -8,7 +8,7 @@ import com.holtek.libHTBodyfat.HTBodyResultAllBody;

import java.util.Locale;

import aicare.net.cn.sdk.ailinksdkdemoandroid.EightBodyfatAdc;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.eight_bodyfat.EightBodyfatAdc;


public class EightBodyFatAlgorithms {
@@ -58,10 +58,43 @@ public class EightBodyFatAlgorithms {
BhErrorType bhErrorType = BhErrorType.values()[bhBodyComposition.getBodyComposition()];

if (bhErrorType == BhErrorType.NONE) {
eightBodyFatBean.setBhSkeletalMuscleKg(bhBodyComposition.bhSkeletalMuscleKg + "");
eightBodyFatBean.setBhSkeletalMuscleKgLevel(bhBodyComposition.bhSkeletalMuscleKgLevel + "");
eightBodyFatBean.setBhSkeletalMuscleKgListStandardOrExcellent(bhBodyComposition.bhMuscleKgListStandardOrExcellent + "");
eightBodyFatBean.setBhSkeletalMuscleKgListUnderOrStandard(bhBodyComposition.bhSkeletalMuscleKgListUnderOrStandard + "");

eightBodyFatBean.setWeight(String.valueOf(bhBodyComposition.bhWeightKg));
eightBodyFatBean.setBmi(Adecimal(bhBodyComposition.bhBMI));
eightBodyFatBean.setBmr((float) bhBodyComposition.bhBMR);
eightBodyFatBean.setUvi((float) bhBodyComposition.bhVFAL);
eightBodyFatBean.setBm(String.valueOf(bhBodyComposition.bhBoneKg));
eightBodyFatBean.setBfr(Adecimal(bhBodyComposition.bhBodyFatRate));
eightBodyFatBean.setVwc(Adecimal(bhBodyComposition.bhWaterRate));
eightBodyFatBean.setRom(Adecimal(bhBodyComposition.bhMuscleRate));
eightBodyFatBean.setBodyAge(bhBodyComposition.bhBodyAge);
eightBodyFatBean.setPp(Adecimal(bhBodyComposition.bhProteinRate));
eightBodyFatBean.setSfr(Adecimal(bhBodyComposition.bhBodyFatSubCutRate));
eightBodyFatBean.setFatMassBody(String.valueOf(bhBodyComposition.bhBodyFatKgTrunk));
eightBodyFatBean.setFatMassLeftTop(String.valueOf(bhBodyComposition.bhBodyFatKgLeftArm));
eightBodyFatBean.setFatMassLeftBottom(String.valueOf(bhBodyComposition.bhBodyFatKgLeftLeg));
eightBodyFatBean.setFatMassRightTop(String.valueOf(bhBodyComposition.bhBodyFatKgRightArm));
eightBodyFatBean.setFatMassRightBottom(String.valueOf(bhBodyComposition.bhBodyFatKgRightLeg));
eightBodyFatBean.setArithmetic(algorithms);
eightBodyFatBean.setBhSkeletalMuscleKg(String.valueOf(bhBodyComposition.bhSkeletalMuscleKg));
eightBodyFatBean.setBhSkeletalMuscleKgLevel(String.valueOf(bhBodyComposition.bhSkeletalMuscleKgLevel));
eightBodyFatBean.setBhSkeletalMuscleKgListStandardOrExcellent(String.valueOf(bhBodyComposition.bhMuscleKgListStandardOrExcellent));
eightBodyFatBean.setBhSkeletalMuscleKgListUnderOrStandard(String.valueOf(bhBodyComposition.bhSkeletalMuscleKgListUnderOrStandard));


// System.out.println("解密阻抗-左側全身(Ω)=" + body.bhZLeftBodyDeCode);
// System.out.println("解密阻抗-左手(Ω)=" + body.bhZLeftArmDeCode);
// System.out.println("解密阻抗-右手(Ω)=" + body.bhZRightArmDeCode);
// System.out.println("解密阻抗-左腳(Ω)=" + body.bhZLeftLegDeCode);
// System.out.println("解密阻抗-右腳(Ω)=" + body.bhZRightLegDeCode);

eightBodyFatBean.setAdcLeftHand(bhBodyComposition.bhZLeftArmDeCode);
eightBodyFatBean.setAdcRightHand(bhBodyComposition.bhZRightArmDeCode);
eightBodyFatBean.setAdcLeftFoot(bhBodyComposition.bhZLeftLegDeCode);
eightBodyFatBean.setAdcRightFoot(bhBodyComposition.bhZRightLegDeCode);
eightBodyFatBean.setAdcLeftBody(bhBodyComposition.bhZLeftBodyDeCode);
} else {
L.e("getAlgorithmsData: " + bhErrorType.toString());
}

break;

+ 112
- 5
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/EightBodyFatBean.java Ver arquivo

@@ -1,51 +1,148 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.utils;

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 adcRightFoot;
/**
* 阻抗左身体
*/
private double adcLeftBody;
/**
* 阻抗右身体
*/
private double adcRightBody;
/**
* 阻抗右手左脚
*/
private double adcRightHandLeftFoot;
/**
* 阻抗左手右脚
*/
private double adcLeftHandRightFoot;
/**
* adc身体
*/
private double adcBody;
/**
* 算
* 算法ID
*/
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;

/**
@@ -382,9 +479,19 @@ public class EightBodyFatBean {

@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 + '\'' + '}';
return "EightBodyFatBean{" + "体重=" + weight + ", bmi=" + bmi + ", 体脂率=" + bfr +
", 皮下脂肪率=" + sfr + ", 内脏脂肪率=" + uvi + ", 肌肉率=" + rom + ", 基础代谢率=" + bmr + ", 骨量=" + bm +
", 水分=" + vwc + ", 身体年龄=" + bodyAge + ", 蛋白率=" + pp + ", 双脚阻抗=" + adcFoot +
", 双手阻抗=" + adcHand + ", 阻抗左手=" + adcLeftHand + ", 阻抗右手=" + adcRightHand +
", 阻抗左脚=" + adcLeftFoot + ", 阻抗右脚=" + adcRightFoot + ", 阻抗左身体=" + adcLeftBody +
", 阻抗右身体=" + adcRightBody + ", 阻抗右手左脚=" + adcRightHandLeftFoot +
", 阻抗左手右脚=" + adcLeftHandRightFoot + ", 身体阻抗=" + adcBody +
", 算法ID=" + arithmetic + ", 心率=" + heartRate + ", fatMassRightTop=" + fatMassRightTop +
", fatMassRightBottom=" + fatMassRightBottom + ", fatMassLeftTop=" + fatMassLeftTop +
", fatMassLeftBottom=" + fatMassLeftBottom + ", fatMassBody=" + fatMassBody +
", muscleMassRightTop=" + muscleMassRightTop + ", muscleMassRightBottom=" + muscleMassRightBottom +
", muscleMassLeftTop=" + muscleMassLeftTop + ", muscleMassLeftBottom=" + muscleMassLeftBottom
+ ", muscleMassBody=" + muscleMassBody + ", testAdc=" + testAdc + '}';
}

}

+ 2
- 2
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/FileProvider7.java Ver arquivo

@@ -5,10 +5,10 @@ import android.content.Intent;
import android.net.Uri;
import android.os.Build;

import androidx.core.content.FileProvider;

import java.io.File;

import androidx.core.content.FileProvider;

/**
* 兼容android 7.0以上获取uri异常的工具类
*/

+ 65
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/JsonLoader.java Ver arquivo

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

import android.content.Context;
import android.content.res.AssetManager;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

/**
* json装载机
*
* @author xing
* @date 2024/04/29
*/
public class JsonLoader {

public static JSONObject loadJSONFromAsset(Context context, String fileName) {
JSONObject jsonObject = null;
AssetManager manager = context.getAssets();
try (InputStream is = manager.open(fileName);
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"))) {
StringBuilder sb = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
jsonObject = new JSONObject(sb.toString());
} catch (IOException | JSONException e) {
e.printStackTrace();
}
return jsonObject;
}


public static Map<String, String> loadJsonFromAsset(Context context, String fileName) {
JSONObject jsonObject = loadJSONFromAsset(context, fileName);
Map<String, String> map = new HashMap<>();
try {
if (jsonObject != null) {
JSONArray dataList = jsonObject.getJSONArray("data");
for (int i = 0; i < dataList.length(); i++) {
JSONObject data = dataList.getJSONObject(i);
String nameEn = data.getString("name");
String nameZh = nameEn;
if (data.has("nameNew")) {
nameZh = data.getString("nameNew");
}
map.put(nameEn, nameZh);
}

}
} catch (JSONException e) {
e.printStackTrace();
}
return map;
}
}

+ 6
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/L.java Ver arquivo

@@ -130,6 +130,12 @@ public class L {
}
}

public static void iStack(String msg) {
if (isLog) {
logContent("", msg+"\n"+Log.getStackTraceString(new Throwable()), 0);
}
}

/**
* 信息日志
*/

+ 5
- 1
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/MyBleStrUtils.java Ver arquivo

@@ -37,8 +37,12 @@ public class MyBleStrUtils {
* @return 16进制String
*/
public static String getHexString(int number) {
return Integer.toHexString(number);
if (number<10) {
return "0"+Integer.toHexString(number).toUpperCase();
}
return Integer.toHexString(number).toUpperCase();
}



}

+ 5
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/TimeUtils.java Ver arquivo

@@ -28,6 +28,11 @@ public class TimeUtils {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);
return format.format(time)+":\n";
}

public static String getTimeNoNewline(long time){
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);
return format.format(time);
}
/**
* 返回当前年
*/

+ 9
- 2
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/UnitUtils.java Ver arquivo

@@ -122,7 +122,7 @@ public class UnitUtils {
public static float CToF(float c) {
float f = c * 1.8F + 32;
return f;
}
}


public static float CToFOne(float c) {
@@ -137,6 +137,7 @@ public class UnitUtils {
float c = (f - 32) / 1.8f;
return c;
}

/**
* 华氏度转度
*/
@@ -219,6 +220,12 @@ public class UnitUtils {
//----------转换用----------


public static String getHoldDecimal(int decimal, int value) {
float v = (float) (value / (Math.pow(10,decimal)));
return getHoldDecimal(decimal, v);
}


/**
* 保留小数位,不足后面补0
*
@@ -238,7 +245,7 @@ public class UnitUtils {
return df.format(value).replace(",", ".");

}
String s = String.format(Locale.US, "%."+decimal+"f", value);
String s = String.format(Locale.US, "%." + decimal + "f", value);
return s;
}


+ 5
- 0
app/src/main/res/drawable/baseline_delete_24.xml Ver arquivo

@@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#F30606"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M6,19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V7H6v12zM19,4h-3.5l-1,-1h-5l-1,1H5v2h14V4z"/>
</vector>

+ 6
- 3
app/src/main/res/layout/activity_ble.xml Ver arquivo

@@ -26,7 +26,7 @@
android:orientation="horizontal">

<Button
android:id="@+id/btnClear"
android:id="@+id/btnClearShakeHands"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/clear" />
@@ -249,7 +249,9 @@
android:id="@+id/etBroadcastTime"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:digits="0987654321" />
android:digits="0987654321"
android:text="100"
/>
</LinearLayout>

<LinearLayout
@@ -318,7 +320,8 @@
android:layout_weight="1"
android:padding="10dp"
android:stackFromBottom="true"
android:transcriptMode="alwaysScroll">
android:transcriptMode="alwaysScroll"
>


</ListView>

+ 36
- 1
app/src/main/res/layout/activity_ble_nutrition.xml Ver arquivo

@@ -2,7 +2,9 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
tools:context="com.pinwang.ailinkblesdk.modules.ble_nutrition.BleNutritionActivity">

<ScrollView
android:layout_width="match_parent"
@@ -51,6 +53,12 @@
android:layout_height="wrap_content"
android:text="设置单位" />

<Button
android:id="@+id/btnVoice"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="蜂鸣器开关" />

</LinearLayout>

<LinearLayout
@@ -136,6 +144,33 @@

</LinearLayout>

<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/btnReadHistory"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读取历史"
/>
<Button
android:id="@+id/btnClearHistory"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="清除历史"
/>

<Button
android:id="@+id/btnSynTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="同步时间"
/>

</LinearLayout>


</LinearLayout>

</ScrollView>

+ 180
- 0
app/src/main/res/layout/activity_ble_nutrition_nutrient.xml Ver arquivo

@@ -0,0 +1,180 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
tools:context="com.pinwang.ailinkblesdk.modules.ble_nutrition.BleNutritionActivity">

<ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:orientation="horizontal">

<Button
android:id="@+id/btn_clear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="清空" />

</LinearLayout>

<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="?android:attr/listDivider" />

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:orientation="horizontal">

<Button
android:id="@+id/btn_set_zero"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="去皮指令" />

<Button
android:id="@+id/btn_set_unit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="设置单位" />



</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:orientation="horizontal">

<RadioButton
android:id="@+id/rb_g"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="g" />

<RadioButton
android:id="@+id/rb_ml"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ml" />

<RadioButton
android:id="@+id/rb_lb_oz"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="lb:oz" />

<RadioButton
android:id="@+id/rb_oz"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="oz" />

<RadioButton
android:id="@+id/rb_kg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="kg" />

<RadioButton
android:id="@+id/rb_jin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="斤" />

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:orientation="horizontal">

<RadioButton
android:id="@+id/rb_milk_ml"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="牛奶ml" />

<RadioButton
android:id="@+id/rb_water_ml"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="水ml" />

<RadioButton
android:id="@+id/rb_milk_fl_oz"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="牛奶floz" />

<RadioButton
android:id="@+id/rb_water_fl_oz"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="水floz" />

<RadioButton
android:id="@+id/rb_lb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="lb" />

</LinearLayout>

<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btnSendApple"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="选择食物:苹果"
/>

<Button
android:id="@+id/btnSendBeef"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="选择食物:牛肉"
/>

</LinearLayout>


</LinearLayout>

</ScrollView>

<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="?android:attr/listDivider" />

<ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />

</LinearLayout>

+ 9
- 4
app/src/main/res/layout/activity_body_scale_4g.xml Ver arquivo

@@ -4,6 +4,11 @@
android:layout_height="match_parent"
android:orientation="vertical">

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="请先登录,然后获取设备ID,再绑定设备."
/>

<LinearLayout
android:layout_width="match_parent"
@@ -24,7 +29,7 @@
android:id="@+id/ed_imei"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="866156054199057" />
android:text="" />


</LinearLayout>
@@ -45,7 +50,7 @@
<EditText
android:id="@+id/et_cid"
android:inputType="number"
android:text="57"
android:text=""
android:layout_width="50dp"
android:layout_height="wrap_content" />

@@ -60,7 +65,7 @@
<EditText
android:id="@+id/et_vid"
android:inputType="number"
android:text="44"
android:text=""
android:layout_width="50dp"
android:layout_height="wrap_content" />

@@ -75,7 +80,7 @@
<EditText
android:id="@+id/et_pid"
android:inputType="number"
android:text="1"
android:text=""
android:layout_width="50dp"
android:layout_height="wrap_content" />


+ 333
- 0
app/src/main/res/layout/activity_bw05_watch.xml Ver arquivo

@@ -0,0 +1,333 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!-- 设置时间、设置阈值范围(心率、血氧、收缩、舒张压、温度)、
设置检测间隔时间、设置蓝牙名称-->

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">

<EditText
android:id="@+id/etMac"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="请输入需要连接的设备MAC地址"
android:paddingStart="20dp"
android:inputType="textCapCharacters"
android:digits="0123456789abcdefABCDEF:"
android:maxLength="17"
android:textSize="14dp" />

<Button
android:id="@+id/btnConnect"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="连接" />

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginTop="10dp"
android:orientation="horizontal">

<Button
android:id="@+id/btnSetTime"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="设置时间" />

<Button
android:id="@+id/btnQueryInfo"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="查询信息" />

<Button
android:id="@+id/btnQueryThreshold"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="获取本地存储数据" />

<Button
android:id="@+id/btnClearLog"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="清空log" />

</LinearLayout>


<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:gravity="center_vertical"
android:orientation="horizontal">

<EditText
android:id="@+id/etCheckTime"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="检测间隔时间(分)"
android:paddingStart="20dp"
android:inputType="number"
android:maxLength="3"
android:textSize="14dp" />

<CheckBox
android:id="@+id/cbCheckTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="开启/关闭测量"/>

<Button
android:id="@+id/btnSetCheckTime"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="设置检测间隔时间" />

</androidx.appcompat.widget.LinearLayoutCompat>

<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:gravity="center_vertical"
android:orientation="horizontal">

<EditText
android:id="@+id/etBleName"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:hint="蓝牙名称"
android:paddingStart="20dp"
android:inputType="text"
android:textSize="14dp" />

<Button
android:id="@+id/btnSetBleName"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="设置检测间隔时间" />

</androidx.appcompat.widget.LinearLayoutCompat>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:gravity="center_vertical"
android:orientation="horizontal">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="心率:低值" />

<EditText
android:id="@+id/etHrMin"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:hint="60"
android:inputType="number"
android:maxLength="3"
android:textSize="14dp" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="高值" />

<EditText
android:id="@+id/etHrMax"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:hint="120"
android:inputType="number"
android:maxLength="3"
android:textSize="14dp" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:text="血氧:低值" />

<EditText
android:id="@+id/etSpo2Min"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:hint="95"
android:inputType="number"
android:maxLength="3"
android:textSize="14dp" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="高值" />

<EditText
android:id="@+id/etSpo2Max"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:hint="100"
android:inputType="number"
android:maxLength="3"
android:textSize="14dp" />

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:visibility="gone"
android:gravity="center_vertical"
android:orientation="horizontal">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="收缩压:低值" />

<EditText
android:id="@+id/etSbpMin"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:hint="90"
android:inputType="number"
android:maxLength="3"
android:textSize="14dp" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="高值" />

<EditText
android:id="@+id/etSbpMax"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:hint="140"
android:inputType="number"
android:maxLength="3"
android:textSize="14dp" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:text="舒张压:低值" />

<EditText
android:id="@+id/etDbpMin"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:hint="60"
android:inputType="number"
android:maxLength="3"
android:textSize="14dp" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="高值" />

<EditText
android:id="@+id/etDbpMax"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:hint="90"
android:inputType="number"
android:maxLength="3"
android:textSize="14dp" />

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:gravity="center_vertical"
android:orientation="horizontal">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="温度:低值" />

<EditText
android:id="@+id/etTempMin"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:hint="36.0"
android:inputType="numberDecimal"
android:maxLength="4"
android:textSize="14dp" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="高值" />

<EditText
android:id="@+id/etTempMax"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:hint="38.0"
android:inputType="numberDecimal"
android:maxLength="4"
android:textSize="14dp" />

<Button
android:id="@+id/btnSetThreshold"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
android:text="设置阈值" />

</LinearLayout>


<ListView
android:id="@+id/log_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp" />

</LinearLayout>

+ 15
- 1
app/src/main/res/layout/activity_clear_shake_hands.xml Ver arquivo

@@ -29,7 +29,7 @@
android:id="@+id/et_type"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:hint="透传数据"
android:hint="A7 payload数据"
android:text="01"
android:digits="0123456789abcdefABCDEF"
/>
@@ -61,6 +61,20 @@
android:text="set_unit"
/>

<Button
android:id="@+id/btnPause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="暂停"
/>

<Button
android:id="@+id/btnClearShakeHands"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="解除握手加密"
/>

</LinearLayout>
</LinearLayout>
</ScrollView>

+ 6
- 0
app/src/main/res/layout/activity_coffee_scale.xml Ver arquivo

@@ -26,6 +26,12 @@
android:layout_height="wrap_content"
android:text="清空" />

<Button
android:id="@+id/btnPause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="暂停" />

</LinearLayout>

<LinearLayout

+ 142
- 0
app/src/main/res/layout/activity_eight_double_body_fata.xml Ver arquivo

@@ -0,0 +1,142 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<RadioGroup
android:id="@+id/unit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/edit_Userid"
android:orientation="horizontal">

<RadioButton
android:id="@+id/kg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="kg" />

<RadioButton
android:id="@+id/jin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="斤" />

<RadioButton
android:id="@+id/st_lb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="st:lb" />

<RadioButton
android:id="@+id/lb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="lb" />
</RadioGroup>


<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="年龄:" />

<EditText
android:id="@+id/et_age"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:inputType="number"
android:text="34" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="性别(女=0,男=1):" />

<EditText
android:id="@+id/et_sex"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:inputType="number"
android:text="1" />


</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="身高(CM):" />

<EditText
android:id="@+id/et_height"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:inputType="number"
android:text="178" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="体重(kg):" />

<EditText
android:id="@+id/et_weight"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:inputType="number"
android:text="78" />


</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_height="wrap_content">
<Button
android:id="@+id/support_unit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="查询支持单位" />

<Button
android:id="@+id/btn_clear_log"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="清空log" />

</LinearLayout>



<Button
android:id="@+id/test_bodyfit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="计算体脂数据" />

<ListView
android:id="@+id/log_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/unit"
android:layout_marginTop="20dp">

</ListView>
</LinearLayout>

+ 283
- 0
app/src/main/res/layout/activity_gas_detector.xml Ver arquivo

@@ -0,0 +1,283 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="5dp">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btnGetCurInfo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="实时信息" />

<Button
android:id="@+id/btnSyncTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="同步时间" />

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btnGetCO2Density"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="CO2报警浓度" />

<Button
android:id="@+id/btnGetCODensity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="CO报警浓度" />

<Button
android:id="@+id/btnGetO2Density"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="O2报警浓度" />

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btnGetCO2Interval"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="CO2间隔" />

<Button
android:id="@+id/btnGetCOInterval"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="CO间隔" />

<Button
android:id="@+id/btnGetHistoryInterval"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="历史记录间隔" />

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btnGetCO2Switch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="CO2开关" />

<Button
android:id="@+id/btnGetCOSwitch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="CO开关" />

<Button
android:id="@+id/btnGetSoundSwitch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="声音开关" />

<Button
android:id="@+id/btnGetShakeSwitch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="震动开关" />
</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btnGetTempUnit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="温度单位" />

<Button
android:id="@+id/btnGetPressureUnit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="气压单位" />

<Button
android:id="@+id/btnGetScreenOffTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="息屏时间" />

<Button
android:id="@+id/btnGetShutdownTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="关机时间" />

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btnGetHistory"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="历史记录" />

<Button
android:id="@+id/btnClearHistory"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="清空历史记录" />

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<EditText
android:id="@+id/etDensity"
android:layout_width="160dp"
android:layout_height="wrap_content"
android:digits="0123456789"
android:hint="报警浓度(单位ppm)"
android:inputType="number"
android:textSize="14dp" />

<Button
android:id="@+id/btnSetCo2Density"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="设置Co2浓度" />

<Button
android:id="@+id/btnSetO2Density"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="设置O2浓度" />


</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<EditText
android:id="@+id/etInterval"
android:layout_width="160dp"
android:layout_height="wrap_content"
android:digits="0123456789"
android:hint="间隔(min)0代表一直"
android:inputType="number"
android:textSize="14dp" />

<Button
android:id="@+id/btnSetCo2Interval"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="设置CO2间隔" />

<Button
android:id="@+id/btnSetCoInterval"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="设置CO间隔" />


</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<EditText
android:id="@+id/etHpa"
android:layout_width="120dp"
android:layout_height="wrap_content"
android:digits="0123456789"
android:hint="气压(hPa,0-9999)"
android:inputType="number"
android:textSize="14dp" />

<EditText
android:id="@+id/etInHg"
android:layout_width="120dp"
android:layout_height="wrap_content"
android:digits="0123456789"
android:hint="气压(hPa,0-9999)"
android:inputType="number"
android:textSize="14dp" />

<Button
android:id="@+id/btnSetPressureCali"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="气压校准" />


</LinearLayout>

</LinearLayout>
</ScrollView>


<ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
/>

</androidx.appcompat.widget.LinearLayoutCompat>

+ 15
- 0
app/src/main/res/layout/activity_height_bodyfat.xml Ver arquivo

@@ -172,7 +172,22 @@
android:text="回复测量完成"
android:textAllCaps="false" />


</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btnPause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="暂停"
/>

</LinearLayout>

<ListView
android:id="@+id/listView"
android:layout_width="match_parent"

+ 25
- 0
app/src/main/res/layout/activity_main.xml Ver arquivo

@@ -5,6 +5,31 @@
android:layout_height="match_parent"
android:orientation="vertical">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="搜索:" />

<EditText
android:id="@+id/etSearch"
android:layout_width="300dp"
android:layout_height="50dp"
android:hint=" 请输入关键字" />

<ImageView
android:id="@+id/ivClear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/baseline_delete_24" />

</LinearLayout>

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_list"
android:layout_width="match_parent"

+ 136
- 0
app/src/main/res/layout/activity_public_mqtt.xml Ver arquivo

@@ -0,0 +1,136 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="10dp">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">

<Button
android:id="@+id/btnClearShakeHands"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="清空" />

<TextView
android:id="@+id/tvDeviceList"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

</LinearLayout>


<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="当前APPID:" />

<EditText
android:id="@+id/etAppUserId"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:digits="0123456789"
android:text="1" />

<Button
android:id="@+id/btnConnectMqtt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="连接MQTT" />

<Button
android:id="@+id/btnDisconnectMqtt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="断开MQTT" />

</LinearLayout>


<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">


<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="设备ID:" />

<EditText
android:id="@+id/etDeviceId"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:digits="0123456789"
android:hint="请输入设备ID"
android:text="1" />

<Button
android:id="@+id/btnAddDevice"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="添加设备" />

<Button
android:id="@+id/btnRemoveDevice"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="移除设备" />


</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_height="wrap_content">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="设备ID:"
/>

<EditText
android:id="@+id/etSendDataDeviceId"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:digits="0123456789"
/>
<EditText
android:id="@+id/etSendData"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text=""
android:hint="请输入要发送的数据"
android:textSize="12dp"
android:digits="0123456789abcdefABCDEF"
/>

<Button
android:id="@+id/btnSendData"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发送"
/>
</LinearLayout>


<ListView
android:id="@+id/lv_log"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="10dp" />

</LinearLayout>

+ 2
- 2
app/src/main/res/layout/activity_show_ble.xml Ver arquivo

@@ -34,8 +34,8 @@
android:id="@+id/et_cid"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:digits="-0123456789"
android:hint="CID(decimal)" />
android:digits="-0123456789abcdefABCDEF"
android:hint="CID" />


</LinearLayout>

+ 1
- 1
app/src/main/res/layout/activity_temp_instrument.xml Ver arquivo

@@ -43,7 +43,7 @@
android:text="Battery" />

<Button
android:id="@+id/btnClear"
android:id="@+id/btnClearShakeHands"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="清空" />

+ 32
- 5
app/src/main/res/layout/activity_test_cmd.xml Ver arquivo

@@ -25,8 +25,9 @@
android:id="@+id/et_cmd"
android:layout_width="180dp"
android:layout_height="wrap_content"
android:hint="透传数据"
android:text="4" />
android:digits="0123456789ABCDEFabcdef"
android:hint="16进制数据(hex)"
android:text="04" />

<Button
android:id="@+id/btn1"
@@ -130,10 +131,10 @@
android:id="@+id/et_time"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:digits="0123456789-"
android:hint="发送间隔"
android:maxLines="1"
android:digits="0123456789-"
android:text="1000" />
android:text="100" />

<Button
android:id="@+id/btn_time"
@@ -156,6 +157,32 @@
</LinearLayout>


<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="10dp"
android:paddingEnd="5dp">

<EditText
android:id="@+id/etIncrementNumber"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:digits="0123456789"
android:hint="递增数"
android:maxLines="1"
android:text="517" />

<Button
android:id="@+id/btnIncrementSend"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="递增发送:N" />



</LinearLayout>


<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -179,8 +206,8 @@
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发送:"
android:layout_marginStart="50dp"
android:text="发送:"
android:textSize="18dp" />

<TextView

+ 7
- 1
app/src/main/res/layout/activity_transmission.xml Ver arquivo

@@ -8,6 +8,7 @@
android:id="@+id/tv_device_info"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@color/colorAccent"
/>

<LinearLayout
@@ -136,13 +137,18 @@
android:id="@+id/bt_clear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="清空" />
android:text="清空输入" />

<Button
android:id="@+id/bt_clear_log"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="清空log" />
<Button
android:id="@+id/btPause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="暂停" />


</LinearLayout>

+ 2
- 2
app/src/main/res/layout/item_home_list.xml Ver arquivo

@@ -7,7 +7,7 @@
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:layout_marginBottom="10dp"
app:cardBackgroundColor="@color/white"
app:cardBackgroundColor="@color/colorPrimary"
app:cardCornerRadius="8dp"
android:foreground="?attr/selectableItemBackground"
app:cardElevation="0dp"
@@ -18,7 +18,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textColor="@color/black"
android:textColor="@color/white"
android:textSize="18dp"
tools:text="item" />


+ 2
- 1
app/src/main/res/values-fr/strings.xml Ver arquivo

@@ -1,5 +1,5 @@
<resources>
<string name="app_name" translatable="false">AILink联调工具</string>
<string name="app_name" translatable="false">AILinkSDKDemo</string>

<string name="clear">Vide</string>
<string name="handshake">serrer la main</string>
@@ -43,4 +43,5 @@
<string name="check_version">version:</string>
<string name="upgrade_controller">Contrôleur de mise à niveau</string>
<string name="upgrade_watch">Mettre à niveau l\'instrument</string>
<string name="gas_detector">Détecteur de gaz</string>
</resources>

+ 8
- 2
app/src/main/res/values-zh/strings.xml Ver arquivo

@@ -118,18 +118,22 @@
<string name="connecting_wifi">正在连接wifi...</string>
<string name="cancel">取消</string>
<string name="select_wifi">选择WIFI</string>
<string name="item_ble_general_settings">Ble通用设置</string>
<string name="item_ble_universal_distribution_network">BLE通用配网</string>
<string name="item_ble_test">Ble test</string>
<string name="item_ble_connect_test">Ble connect test</string>
<string name="item_ota">OTA通用</string>
<string name="item_mqtt">MQTT通用</string>
<string name="item_penetrate">透传</string>
<string name="item_body_fat_scale_broadcast">广播秤</string>
<string name="item_body_fat_scale_ble">Ble体脂秤</string>
<string name="item_body_fat_scale_4g">4G体脂秤</string>
<string name="item_body_fat_scale_wifi_ble">WiFi+Ble体脂秤</string>
<string name="item_body_fat_scale_eight">八极秤</string>
<string name="item_body_fat_scale_eight">八极秤(单频)APP</string>
<string name="item_body_fat_scale_eight_mcu">八极秤(单频)MCU</string>
<string name="item_body_fat_scale_eight_dual_band">八极秤(双频)APP</string>
<string name="item_body_fat_scale_eight_dual_band_mcu">八极秤(双频)MCU</string>
<string name="item_body_fat_scale_aidi">艾迪体脂秤</string>
<string name="item_baby_scale">婴儿秤</string>
<string name="item_baby_body_fat_scale">婴儿体脂两用秤</string>
@@ -178,4 +182,6 @@
<string name="about_us">关于我们</string>
<string name="share">分享</string>
<string name="wifi_ble_ota_tool">WIFI+BLE OTA工具</string>
<string name="item_bw05_watch">BW05手表</string>
<string name="gas_detector">气体检测仪</string>
</resources>

+ 2
- 2
app/src/main/res/values/colors.xml Ver arquivo

@@ -5,6 +5,6 @@
<color name="colorAccent">#D81B60</color>
<color name="public_white">#FFFFFF</color>
<color name="public_press_bg">#dcdcdc</color>
<color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color>
<color name="black">#000000</color>
<color name="white">#FFFFFF</color>
</resources>

+ 10
- 4
app/src/main/res/values/strings.xml Ver arquivo

@@ -6,7 +6,6 @@
<string name="baby_hold">锁定</string>



<string name="rtk_dfu_progress_state_origin"> ready to upgrade </string>
<string name="rtk_dfu_state_abort_processing">waiting for cancellation...</string>
<string name="rtk_dfu_state_aborted"> has been cancelled</string>
@@ -44,7 +43,7 @@
<string name="upgrade_controller">Upgrade controller</string>
<string name="upgrade_watch">Upgrade instrument</string>

<!-- wifi+ble体脂秤 -->
<!-- wifi+ble体脂秤 -->
<string name="check_wifi_status">Check wifi status</string>
<string name="search_wifi_hotspots">Search wifi hotspots</string>
<string name="select_wifi_serial_number">Select wifi serial number</string>
@@ -127,12 +126,16 @@
<string name="item_ble_test">Ble test</string>
<string name="item_ble_connect_test">Ble connect test</string>
<string name="item_ota">OTA</string>
<string name="item_mqtt">MQTT</string>
<string name="item_penetrate">Penetrate</string>
<string name="item_body_fat_scale_broadcast">Body fat scale (Broadcast)</string>
<string name="item_body_fat_scale_ble">Body fat scale (Ble)</string>
<string name="item_body_fat_scale_4g">Body fat scale (4G)</string>
<string name="item_body_fat_scale_wifi_ble">Body fat scale (WiFi+Ble)</string>
<string name="item_body_fat_scale_eight">Eight-electrode body fat scale</string>
<string name="item_body_fat_scale_eight">Eight-electrode body fat scale app</string>
<string name="item_body_fat_scale_eight_mcu">Eight-electrode body fat scale MCU</string>
<string name="item_body_fat_scale_eight_dual_band">Eight-electrode body fat scale(dual band)APP</string>
<string name="item_body_fat_scale_eight_dual_band_mcu">Eight-electrode body fat scale(dual band)MCU</string>
<string name="item_body_fat_scale_aidi">Body fat scale (Aidi)</string>
<string name="item_baby_scale">Baby scale</string>
<string name="item_baby_body_fat_scale">Baby body fat scale</string>
@@ -180,5 +183,8 @@
<string name="item_wifi_config">WIFI config</string>
<string name="about_us">About us</string>
<string name="share">Share</string>
<string name="wifi_ble_ota_tool">WIFI+BLE OTA工具</string>
<string name="wifi_ble_ota_tool">WIFI+BLE OTA Tools</string>
<string name="item_bw05_watch">BW05 WATCH</string>
<string name="item_nutritional_scale_ble_nutrient">Bluetooth Nutrition Scale-Nutrients</string>
<string name="gas_detector">Gas detector</string>
</resources>

+ 2
- 2
build.gradle Ver arquivo

@@ -4,8 +4,8 @@ buildscript {
repositories {
google()
mavenCentral()
jcenter()
maven { url 'https://jitpack.io' }
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.1.2'
@@ -19,8 +19,8 @@ allprojects {
repositories {
google()
mavenCentral()
jcenter()
maven { url 'https://jitpack.io' }
jcenter()
}
}


Carregando…
Cancelar
Salvar