Bladeren bron

Update demo

master
陈福行 3 jaren geleden
bovenliggende
commit
cef03b5f6e
100 gewijzigde bestanden met toevoegingen van 12572 en 1491 verwijderingen
  1. 8
    4
      app/build.gradle
  2. BIN
      app/libs/AlgorithmUtil.jar
  3. BIN
      app/libs/HTBodyfat_SDK.jar
  4. BIN
      app/libs/arm64-v8a/libBodyfat_SDK.so
  5. BIN
      app/libs/arm64-v8a/libalgorithm-lib.so
  6. BIN
      app/libs/armeabi-v7a/libBodyfat_SDK.so
  7. BIN
      app/libs/armeabi-v7a/libalgorithm-lib.so
  8. BIN
      app/libs/x86/libBodyfat_SDK.so
  9. BIN
      app/libs/x86/libalgorithm-lib.so
  10. BIN
      app/libs/x86_64/libBodyfat_SDK.so
  11. BIN
      app/libs/x86_64/libalgorithm-lib.so
  12. 2
    3
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ADWeightScaleCmdActivity.java
  13. 1
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ADWeightScaleUserActivity.java
  14. 12
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BabyBodyFatCmdActivity.java
  15. 5
    3
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BabyCmdActivity.java
  16. 72
    29
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BleCmdActivity.java
  17. 0
    500
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BleCmdActivityDataData.java
  18. 347
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BloodOxygenActivity.java
  19. 394
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BloodSugar4GActivity.java
  20. 6
    4
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BroadcastScaleActivity.java
  21. 258
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ClearShakeHandsActivity.java
  22. 3
    3
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ConnectBleTestActivity.java
  23. 112
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/EightBodyfatActivity.java
  24. 123
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/EightBodyfatAdc.java
  25. 11
    5
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/HeightCmdActivity.java
  26. 562
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/HeightWeightScaleActivity.java
  27. 0
    144
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/LoadingIosDialogFragment.java
  28. 201
    120
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/MainActivity.java
  29. 262
    52
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ShowBleActivity.java
  30. 1371
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/SkateboardDataActivity.java
  31. 78
    3
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/SmartMaskActivity.java
  32. 22
    12
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/SphyCmdActivity.java
  33. 10
    3
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TempCmdActivity.java
  34. 11
    6
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TempGunCmdActivity.java
  35. 299
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TempHumidityActivity.java
  36. 9
    10
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TestCmdActivity.java
  37. 72
    62
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TestOtaActivity.java
  38. 0
    18
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TimeUtils.java
  39. 10
    6
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ToothBrushWifiBleActivity.java
  40. 13
    5
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TpmsConnectCmdActivity.java
  41. 8
    8
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TransmissionActivity.java
  42. 0
    101
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/UserAdapter.java
  43. 4
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/WeightScaleBleActivity.java
  44. 25
    21
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/WeightScaleWifiBleActivity.java
  45. 7
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/WifiConfigActivity.java
  46. 3
    6
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/base/BleAppBaseActivity.java
  47. 1
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/base/BleBaseActivity.java
  48. 21
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/config/AppConfig.java
  49. 2
    5
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/AddUserDialog.java
  50. 1
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/DialogStringImageAdapter.java
  51. 0
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/HintDataDialogFragment.java
  52. 0
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/LoadingIosDialogFragment.java
  53. 2
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/WifiDialog.java
  54. 223
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/find/FindDeviceActivity.java
  55. 82
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/find/FindDeviceAdapter.java
  56. 88
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/find/FindDeviceBean.java
  57. 381
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/find/FindDeviceNewActivity.java
  58. 232
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/blood_glucose/BloodGlucoseActivity.java
  59. 523
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/blood_glucose/BloodGlucoseTestActivity.java
  60. 447
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/broadcast_height/BroadcastHeightActivity.java
  61. 633
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/coffee_scale/CoffeeScaleActivity.java
  62. 361
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/food_temp/FoodTempActivity.java
  63. 241
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/share_charger/ShareChargerActivity.java
  64. 346
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/share_condom/ShareCondomActivity.java
  65. 564
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/share_socket/ShareSocketActivity.java
  66. 207
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/AES128Util.java
  67. 5
    3
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/FileUtils.java
  68. 153
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/MyBleStrUtils.java
  69. 14
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/SP.java
  70. 73
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/TimeUtils.java
  71. 6
    0
      app/src/main/res/drawable/divider.xml
  72. 58
    0
      app/src/main/res/layout/activity_baby_body_fat_cmd.xml
  73. 52
    0
      app/src/main/res/layout/activity_bld_weight_scale_ble.xml
  74. 112
    123
      app/src/main/res/layout/activity_ble.xml
  75. 14
    0
      app/src/main/res/layout/activity_blood_glucose.xml
  76. 12
    0
      app/src/main/res/layout/activity_blood_glucose_test.xml
  77. 251
    0
      app/src/main/res/layout/activity_bloodoxygen.xml
  78. 108
    0
      app/src/main/res/layout/activity_bloodsugar_4g.xml
  79. 13
    0
      app/src/main/res/layout/activity_broadcast_height.xml
  80. 9
    1
      app/src/main/res/layout/activity_broadcast_scale.xml
  81. 82
    0
      app/src/main/res/layout/activity_clear_shake_hands.xml
  82. 469
    0
      app/src/main/res/layout/activity_coffee_scale.xml
  83. 136
    0
      app/src/main/res/layout/activity_find_device.xml
  84. 59
    0
      app/src/main/res/layout/activity_find_device_new.xml
  85. 403
    0
      app/src/main/res/layout/activity_food_temp.xml
  86. 7
    7
      app/src/main/res/layout/activity_health_bracelet.xml
  87. 14
    0
      app/src/main/res/layout/activity_height.xml
  88. 180
    0
      app/src/main/res/layout/activity_height_bodyfat.xml
  89. 296
    174
      app/src/main/res/layout/activity_main.xml
  90. 136
    0
      app/src/main/res/layout/activity_share_charger.xml
  91. 167
    0
      app/src/main/res/layout/activity_share_condom.xml
  92. 188
    0
      app/src/main/res/layout/activity_share_socket.xml
  93. 48
    35
      app/src/main/res/layout/activity_show_ble.xml
  94. 648
    0
      app/src/main/res/layout/activity_skateboard_data.xml
  95. 104
    0
      app/src/main/res/layout/activity_skateboard_data_user.xml
  96. 36
    5
      app/src/main/res/layout/activity_smart_mask.xml
  97. 15
    1
      app/src/main/res/layout/activity_sphy.xml
  98. 13
    0
      app/src/main/res/layout/activity_temp.xml
  99. 15
    0
      app/src/main/res/layout/activity_temp_gun.xml
  100. 0
    0
      app/src/main/res/layout/activity_temp_humidity.xml

+ 8
- 4
app/build.gradle Bestand weergeven

@@ -22,7 +22,11 @@ android {
sourceCompatibility 1.8
targetCompatibility 1.8
}

sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}

}

@@ -31,9 +35,9 @@ dependencies {
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
implementation 'com.github.elinkthings:AILinkSDKRepositoryAndroid:1.7.4'
implementation 'com.github.elinkthings:AILinkSDKOtaLibraryAndroid:1.0.0'
implementation 'com.github.elinkthings:AILinkSDKParsingLibraryAndroid:1.5.4'
implementation 'com.github.elinkthings:AILinkSDKRepositoryAndroid:1.7.4'//蓝牙核心库
implementation 'com.github.elinkthings:AILinkSDKOtaLibraryAndroid:1.0.0'//OTA库,需要依赖核心库
implementation 'com.github.elinkthings:AILinkSDKParsingLibraryAndroid:1.5.4'//解析库,需要依赖核心库
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'com.jakewharton:butterknife:10.2.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.0'

BIN
app/libs/AlgorithmUtil.jar Bestand weergeven


BIN
app/libs/HTBodyfat_SDK.jar Bestand weergeven


BIN
app/libs/arm64-v8a/libBodyfat_SDK.so Bestand weergeven


BIN
app/libs/arm64-v8a/libalgorithm-lib.so Bestand weergeven


BIN
app/libs/armeabi-v7a/libBodyfat_SDK.so Bestand weergeven


BIN
app/libs/armeabi-v7a/libalgorithm-lib.so Bestand weergeven


BIN
app/libs/x86/libBodyfat_SDK.so Bestand weergeven


BIN
app/libs/x86/libalgorithm-lib.so Bestand weergeven


BIN
app/libs/x86_64/libBodyfat_SDK.so Bestand weergeven


BIN
app/libs/x86_64/libalgorithm-lib.so Bestand weergeven


+ 2
- 3
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ADWeightScaleCmdActivity.java Bestand weergeven

@@ -29,11 +29,11 @@ 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.utils.TimeUtils;

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

import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.ADWeight.ADWeightScaleBleConfig;
@@ -43,11 +43,10 @@ import cn.net.aicare.modulelibrary.module.ADWeight.ADWeightScaleDeviceData;
import cn.net.aicare.modulelibrary.module.ADWeight.ADWeightScaleUserData;



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

+ 1
- 1
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ADWeightScaleUserActivity.java Bestand weergeven

@@ -26,7 +26,7 @@ import cn.net.aicare.modulelibrary.module.ADWeight.ADWeightScaleUserData;
/**
* xing<br>
* 2019/11/14<br>
* java类作用描述
* 艾地体脂秤用户管理界面
*/
public class ADWeightScaleUserActivity extends AppCompatActivity implements View.OnClickListener {


+ 12
- 1
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BabyBodyFatCmdActivity.java Bestand weergeven

@@ -10,6 +10,7 @@ import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;

import com.pingwang.bluetoothlib.BleBaseActivity;
import com.pingwang.bluetoothlib.bean.BleValueBean;
@@ -24,11 +25,11 @@ 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.utils.TimeUtils;

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

import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.babyBodyFat.BabyBodyFatBleConfig;
@@ -57,6 +58,7 @@ public class BabyBodyFatCmdActivity extends BleBaseActivity implements OnCallbac
private int heightUnit = 0;
private RadioButton mRadioButtonKg, mRadioButtonLb, mRadioButtonLbLb, mRadioButtonG, mRadioButtonOz, mRadioButtonStLb, mRadioButtonJin;
private RadioButton mRadioButtonCm, mRadioButtonInch, mRadioButtonFoot;
private TextView tv_baby_body_fat_weight,tv_baby_body_fat_height,tv_baby_body_fat_adc;

private Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override
@@ -112,6 +114,11 @@ public class BabyBodyFatCmdActivity extends BleBaseActivity implements OnCallbac
mRadioButtonFoot = findViewById(R.id.radio_height_foot);


tv_baby_body_fat_weight = findViewById(R.id.tv_baby_body_fat_weight);
tv_baby_body_fat_height = findViewById(R.id.tv_baby_body_fat_height);
tv_baby_body_fat_adc = findViewById(R.id.tv_baby_body_fat_adc);


}


@@ -386,6 +393,8 @@ public class BabyBodyFatCmdActivity extends BleBaseActivity implements OnCallbac
weightUnit = unit;
showWeightUnit(weightUnit);
}
tv_baby_body_fat_weight.setText(weightStr+unitStr);

mHandler.sendEmptyMessage(REFRESH_DATA);

}
@@ -415,6 +424,7 @@ public class BabyBodyFatCmdActivity extends BleBaseActivity implements OnCallbac
heightUnit = unit;
showHeightUnit(heightUnit);
}
tv_baby_body_fat_height.setText(heightStr+unitStr);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@@ -429,6 +439,7 @@ public class BabyBodyFatCmdActivity extends BleBaseActivity implements OnCallbac
public void onImpedanceSuccess(boolean appAlgorithm,int adc, int algorithmId) {
BleLog.i(TAG, "测阻抗成功");
mList.add(TimeUtils.getTime() + "测阻抗成功,阻抗值:" + adc + " ,算法ID:" + algorithmId+" ;"+(appAlgorithm?"使用app算法":"使用秤算法"));
tv_baby_body_fat_adc.setText(String.valueOf(adc));
mHandler.sendEmptyMessage(REFRESH_DATA);
}


+ 5
- 3
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BabyCmdActivity.java Bestand weergeven

@@ -24,22 +24,21 @@ 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.utils.TimeUtils;

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

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



/**
* xing<br>
* 2019/4/25<br>
* 显示数据
* 婴儿秤
*/
public class BabyCmdActivity extends BleBaseActivity implements OnCallbackDis, OnBleVersionListener
, OnMcuParameterListener, OnBleCompanyListener, View.OnClickListener,
@@ -431,6 +430,9 @@ public class BabyCmdActivity extends BleBaseActivity implements OnCallbackDis, O

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

+ 72
- 29
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BleCmdActivity.java Bestand weergeven

@@ -5,6 +5,7 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.text.TextUtils;
import android.view.View;
import android.view.WindowManager;
import android.widget.ArrayAdapter;
@@ -26,6 +27,7 @@ import com.pingwang.bluetoothlib.listener.OnBleHandshakeListener;
import com.pingwang.bluetoothlib.listener.OnBleInfoListener;
import com.pingwang.bluetoothlib.listener.OnBleOtherDataListener;
import com.pingwang.bluetoothlib.listener.OnBleParameterListener;
import com.pingwang.bluetoothlib.listener.OnBleRssiListener;
import com.pingwang.bluetoothlib.listener.OnBleSettingListener;
import com.pingwang.bluetoothlib.listener.OnBleVersionListener;
import com.pingwang.bluetoothlib.listener.OnCallbackDis;
@@ -33,12 +35,12 @@ import com.pingwang.bluetoothlib.listener.OnMcuParameterListener;
import com.pingwang.bluetoothlib.utils.BleDataUtils;
import com.pingwang.bluetoothlib.utils.BleLog;
import com.pingwang.bluetoothlib.utils.BleStrUtils;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;

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

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

@@ -48,14 +50,13 @@ import androidx.annotation.Nullable;
* 2019/4/25<br>
* 基础指令信息数据显示
*/
public class BleCmdActivity extends BleBaseActivity implements OnCallbackDis, OnBleDeviceDataListener, OnBleVersionListener, OnMcuParameterListener, OnBleErrListener, OnBleInfoListener,
OnBleParameterListener, OnBleCompanyListener, OnBleSettingListener, OnBleHandshakeListener, View.OnClickListener, OnBleOtherDataListener {
public class BleCmdActivity extends BleBaseActivity implements OnCallbackDis, OnBleDeviceDataListener, OnBleVersionListener, OnMcuParameterListener, OnBleErrListener, OnBleInfoListener, OnBleParameterListener, OnBleCompanyListener, OnBleSettingListener, OnBleHandshakeListener, View.OnClickListener, OnBleOtherDataListener, OnBleRssiListener {

private static String TAG = BleCmdActivity.class.getName();
private final int REFRESH_DATA = 3;
private List<String> mList;
private ArrayAdapter listAdapter;
private EditText etName, etMacType, etDid, etBroadcastTime, etMcuType, etSleepTime;
private EditText etName, etMacType, etCid, etVid, etPid, etBroadcastTime, etMcuType, etSleepTime;
private Context mContext;
private String mAddress;
private BleSendCmdUtil mBleSendCmdUtil;
@@ -65,7 +66,7 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackDis, On
/**
* 是否暂停显示数据
*/
private boolean mPauseShowCmd=false;
private boolean mPauseShowCmd = false;
private Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
@@ -120,9 +121,12 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackDis, On
findViewById(R.id.btnSleepTimeWrite).setOnClickListener(this);
findViewById(R.id.btnSleepTimeRead).setOnClickListener(this);
findViewById(R.id.btn_start_ble).setOnClickListener(this);
findViewById(R.id.btnNameRssi).setOnClickListener(this);
etName = findViewById(R.id.etName);
etMacType = findViewById(R.id.etMacType);
etDid = findViewById(R.id.etDid);
etCid = findViewById(R.id.etCid);
etVid = findViewById(R.id.etVid);
etPid = findViewById(R.id.etPid);
etBroadcastTime = findViewById(R.id.etBroadcastTime);
etMcuType = findViewById(R.id.etMcuType);
etSleepTime = findViewById(R.id.etSleepTime);
@@ -138,16 +142,25 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackDis, On
mHandler.sendEmptyMessage(REFRESH_DATA);
break;
case R.id.btnPause:
mPauseShowCmd=!mPauseShowCmd;
mPauseShowCmd = !mPauseShowCmd;
break;
case R.id.btnHandshake:
if (mBleDevice != null)
mBleDevice.sendHandshake();
if (mBleDevice != null) {
mBleDevice.setHandshakeStatus(true);
// mBleDevice.sendHandshake();
mList.add(TimeUtils.getTime() + "发送握手");
mHandler.sendEmptyMessage(REFRESH_DATA);
}
break;
case R.id.btnVersion:
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.getBleVersion());
sendData(sendBleBean);
// sendBleBean = new SendBleBean();
// sendBleBean.setHex(mBleSendCmdUtil.getBleVersion());
// sendData(sendBleBean);
if (mBleDevice != null) {
String version = mBleDevice.getVersion();
mList.add(TimeUtils.getTime() + "版本号:" + version);
mHandler.sendEmptyMessage(REFRESH_DATA);
}
break;
case R.id.btnBattery:
sendBleBean = new SendBleBean();
@@ -204,21 +217,29 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackDis, On
sendData(sendBleBean);
break;
case R.id.btnDidWrite:
String didStr = etDid.getText().toString().trim().toLowerCase(Locale.US);
if (didStr.contains(",")) {
String[] didStrS = didStr.split(",");
if (didStrS.length > 5) {
int cidS = Integer.parseInt(didStrS[0]);
int vidS = Integer.parseInt(didStrS[1]);
int pidS = Integer.parseInt(didStrS[2]);
int cid = Integer.parseInt(didStrS[3]);
int vid = Integer.parseInt(didStrS[4]);
int pid = Integer.parseInt(didStrS[5]);
byte[] did = bleDataUtils.getDid(cidS, vidS, pidS, cid, vid, pid);
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.setDid(did));
sendData(sendBleBean);
try {
String cidS = etCid.getText().toString().trim().toLowerCase(Locale.US);
String vidS = etVid.getText().toString().trim().toLowerCase(Locale.US);
String pidS = etPid.getText().toString().trim().toLowerCase(Locale.US);
int cid = 0;
int vid = 0;
int pid = 0;
if (!TextUtils.isEmpty(cidS)) {
cid = Integer.parseInt(cidS);
}
if (!TextUtils.isEmpty(vidS)) {
vid = Integer.parseInt(vidS);
}
if (!TextUtils.isEmpty(pidS)) {
pid = Integer.parseInt(pidS);
}

byte[] did = bleDataUtils.getDid(1, 1, 1, cid, vid, pid);
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.setDid(did));
sendData(sendBleBean);
} catch (NumberFormatException e) {
e.printStackTrace();
}
break;
case R.id.btnDidRead:
@@ -275,6 +296,11 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackDis, On
sendBleBean.setHex(mBleSendCmdUtil.setToWake());
sendData(sendBleBean);
break;
case R.id.btnNameRssi:
if (mBleDevice != null) {
mBleDevice.readRssi();
}
break;


}
@@ -300,9 +326,10 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackDis, On
if (mBleDevice == null) {
finish();
BleLog.i(TAG, "mBleDevice==null");
return;
}
mBleDevice.setOnBleVersionListener(this);
// mBleDevice.setOnBleDeviceDataListener(this);
mBleDevice.setOnBleDeviceDataListener(this);
mBleDevice.setOnBleErrListener(this);
mBleDevice.setOnBleInfoListener(this);
mBleDevice.setOnMcuParameterListener(this);
@@ -311,6 +338,7 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackDis, On
mBleDevice.setOnBleParameterListener(this);
mBleDevice.setOnBleHandshakeListener(this);
mBleDevice.setOnBleOtherDataListener(this);
mBleDevice.setOnBleRssiListener(this);
}
}

@@ -383,16 +411,21 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackDis, On

@Override
public void onNotifyOtherData(byte[] data) {
if (mPauseShowCmd){
if (mPauseShowCmd) {
return;
}
mList.add(TimeUtils.getTime() + "透传数据:" + BleStrUtils.byte2HexStr(data));
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onNotifyDataA6(byte[] hex) {

}

@Override
public void onNotifyData(byte[] hex, int type) {
if (mPauseShowCmd){
if (mPauseShowCmd) {
return;
}
String data = "";
@@ -538,6 +571,16 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackDis, On
mHandler.sendEmptyMessage(REFRESH_DATA);
}

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

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

+ 0
- 500
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BleCmdActivityDataData.java Bestand weergeven

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

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

import com.pingwang.bluetoothlib.bean.SupportUnitBean;
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;
import com.pingwang.bluetoothlib.listener.OnBleHandshakeListener;
import com.pingwang.bluetoothlib.listener.OnBleInfoListener;
import com.pingwang.bluetoothlib.listener.OnBleOtherDataListener;
import com.pingwang.bluetoothlib.listener.OnBleParameterListener;
import com.pingwang.bluetoothlib.listener.OnBleSettingListener;
import com.pingwang.bluetoothlib.listener.OnBleVersionListener;
import com.pingwang.bluetoothlib.listener.OnCallbackDis;
import com.pingwang.bluetoothlib.listener.OnMcuParameterListener;
import com.pingwang.bluetoothlib.utils.BleDataUtils;
import com.pingwang.bluetoothlib.utils.BleLog;
import com.pingwang.bluetoothlib.utils.BleStrUtils;

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

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


/**
* xing<br>
* 2019/4/25<br>
* 基础指令信息数据显示
*/
public class BleCmdActivityDataData extends BleBaseActivity implements OnCallbackDis, OnBleDeviceDataListener, OnBleVersionListener, OnMcuParameterListener, OnBleErrListener, OnBleInfoListener, OnBleParameterListener, OnBleCompanyListener, OnBleSettingListener, OnBleHandshakeListener,View.OnClickListener , OnBleOtherDataListener {

private static String TAG = BleCmdActivityDataData.class.getName();
private final int REFRESH_DATA = 3;
private List<String> mList;
private ArrayAdapter listAdapter;
private EditText etName, etMacType, etDid, etBroadcastTime, etMcuType;
private Context mContext;
private String mAddress;
private BleSendCmdUtil mBleSendCmdUtil;
private BleDataUtils bleDataUtils;
private BleDevice mBleDevice;
private int type;
private Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {

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

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

private void init() {
mList = new ArrayList<>();
ListView listView = findViewById(R.id.listview);
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList);
listView.setAdapter(listAdapter);
bleDataUtils = BleDataUtils.getInstance();
findViewById(R.id.btnClear).setOnClickListener(this);
findViewById(R.id.btnHandshake).setOnClickListener(this);
findViewById(R.id.btnVersion).setOnClickListener(this);
findViewById(R.id.btnBattery).setOnClickListener(this);
findViewById(R.id.btnTimeRead).setOnClickListener(this);
findViewById(R.id.btnTimeWrite).setOnClickListener(this);
findViewById(R.id.btnNameRead).setOnClickListener(this);
findViewById(R.id.btnMacRead).setOnClickListener(this);
findViewById(R.id.btnMacTypeRead).setOnClickListener(this);
findViewById(R.id.btnNameWrite).setOnClickListener(this);
findViewById(R.id.btnMacTypeWrite).setOnClickListener(this);
findViewById(R.id.btnDidWrite).setOnClickListener(this);
findViewById(R.id.btnDidRead).setOnClickListener(this);
findViewById(R.id.btnBroadcastTimeWrite).setOnClickListener(this);
findViewById(R.id.btnBroadcastTimeRead).setOnClickListener(this);
findViewById(R.id.btnBmRestart).setOnClickListener(this);
findViewById(R.id.btnBmReset).setOnClickListener(this);
findViewById(R.id.btnMcuType).setOnClickListener(this);
findViewById(R.id.btnUnits).setOnClickListener(this);
etName = findViewById(R.id.etName);
etMacType = findViewById(R.id.etMacType);
etDid = findViewById(R.id.etDid);
etBroadcastTime = findViewById(R.id.etBroadcastTime);
etMcuType = findViewById(R.id.etMcuType);
}

@Override
public void onClick(View v) {
SendBleBean sendBleBean;
switch (v.getId()) {
case R.id.btnClear:
if (mList != null)
mList.clear();
mHandler.sendEmptyMessage(REFRESH_DATA);
break;
case R.id.btnHandshake:
if (mBleDevice != null)
mBleDevice.sendHandshake();
break;
case R.id.btnVersion:
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.getBleVersion());
sendData(sendBleBean);
break;
case R.id.btnBattery:
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus());
sendData(sendBleBean);
break;
case R.id.btnTimeRead:
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.getSysTime());
sendData(sendBleBean);
break;
case R.id.btnTimeWrite:
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.setSysTime(bleDataUtils.getCurrentTime(),true));
sendData(sendBleBean);
break;
case R.id.btnNameRead:
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.getBleName());
sendData(sendBleBean);
break;
case R.id.btnMacRead:
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.getBleMac());
sendData(sendBleBean);
break;
case R.id.btnMacTypeRead:
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.getBroadcastDataType());
sendData(sendBleBean);
break;
case R.id.btnMacTypeWrite:
byte macType = Byte.valueOf(etMacType.getText().toString().trim());
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.setBroadcastDataType(macType));
sendData(sendBleBean);
break;
case R.id.btnNameWrite:
byte[] names = bleDataUtils.getBleName(etName.getText().toString().trim());
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.setBleName(names));
sendData(sendBleBean);
break;
case R.id.btnBroadcastTimeRead:
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.getBleBroadcastTime());
sendData(sendBleBean);
break;
case R.id.btnBroadcastTimeWrite:
int time = Integer.parseInt(etBroadcastTime.getText().toString().trim());
byte[] broadcastTime = bleDataUtils.getBroadcastTime(time);
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.setBleBroadcastTime(broadcastTime));
sendData(sendBleBean);
break;
case R.id.btnDidWrite:
String didStr = etDid.getText().toString().trim().toLowerCase(Locale.US);
if (didStr.contains(",")) {
String[] didStrS = didStr.split(",");
if (didStrS.length > 5) {
int cidS = Integer.parseInt(didStrS[0]);
int vidS = Integer.parseInt(didStrS[1]);
int pidS = Integer.parseInt(didStrS[2]);
int cid = Integer.parseInt(didStrS[3]);
int vid = Integer.parseInt(didStrS[4]);
int pid = Integer.parseInt(didStrS[5]);
byte[] did = bleDataUtils.getDid(cidS, vidS, pidS, cid, vid, pid);
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.setDid(did));
sendData(sendBleBean);
}
}
break;
case R.id.btnDidRead:
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.getDid());
sendData(sendBleBean);
break;
case R.id.btnBmRestart:
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.setBleRestart());
sendData(sendBleBean);
break;
case R.id.btnBmReset:
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.setBleReset());
sendData(sendBleBean);
break;
case R.id.btnMcuType:
byte mode=(byte)Integer.parseInt(etMcuType.getText().toString().trim());
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.setPortI2cSpiMode(mode));
sendData(sendBleBean);
break;

case R.id.btnUnits:
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.getSupportUnit());
sendData(sendBleBean);
break;


}
}

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


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


@Override
public void onServiceSuccess() {
mList.add(TimeUtils.getTime() + "服务与界面建立连接成功");
mHandler.sendEmptyMessage(REFRESH_DATA);
CallbackDisIm.getInstance().addListListener(this);
if (mBluetoothService != null) {
mBleDevice = mBluetoothService.getBleDevice(mAddress);
if (mBleDevice == null) {
finish();
BleLog.i(TAG, "mBleDevice==null");
}
mBleDevice.setOnBleVersionListener(this);
// mBleDevice.setOnBleDeviceDataListener(this);
mBleDevice.setOnBleErrListener(this);
mBleDevice.setOnBleInfoListener(this);
mBleDevice.setOnMcuParameterListener(this);
mBleDevice.setOnBleSettingListener(this);
mBleDevice.setOnBleCompanyListener(this);
mBleDevice.setOnBleParameterListener(this);
mBleDevice.setOnBleHandshakeListener(this);
mBleDevice.setOnBleOtherDataListener(this);
}
}


@Override
public void onServiceErr() {
mList.add(TimeUtils.getTime() + "服务与界面连接断开");
mHandler.sendEmptyMessage(REFRESH_DATA);
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
finish();
}
}, 3000);
//与服务断开连接
mBluetoothService = null;
}

@Override
public void unbindServices() {
CallbackDisIm.getInstance().removeListener(this);
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress);
if (bleDevice != null) {
BleLog.i(TAG, "unbindService,断开连接");
bleDevice.disconnect();
}
}


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


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

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

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

}


@Override
public void bleOpen() {

}

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


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


@Override
public void onNotifyOtherData(byte[] data) {
mList.add(TimeUtils.getTime() + "透传数据:" + BleStrUtils.byte2HexStr(data));
mHandler.sendEmptyMessage(REFRESH_DATA);
}

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

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

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

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

for (SupportUnitBean supportUnitBean : list) {
unitStr.append("单位类型:").append(supportUnitBean.getType());
StringBuilder units= new StringBuilder();
units.append("[");
for (Integer integer1 : supportUnitBean.getSupportUnit()) {
units.append(integer1).append(",");
}
units.append("]");
unitStr.append("单位列表:").append(units);
unitStr.append("\n");
}


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



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

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

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

@Override
public void OnSettingReturn(byte cmdType, byte cmdData) {
mList.add(TimeUtils.getTime() + "设置指令:" + cmdType + "||结果:" + cmdData);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

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

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

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

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

}

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


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

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

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

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

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

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

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

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

+ 347
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BloodOxygenActivity.java Bestand weergeven

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

import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;

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

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

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

/**
* 血氧仪
*/
public class BloodOxygenActivity extends BleBaseActivity implements OnCallbackBle, BleBloodOxygenDeviceData.DataCallback {

private TextView tv_sp_max, tv_sp_min, tv_pr_max, tv_pr_min, tv_pl_max, tv_pl_min, tv_version;
private AppCompatSeekBar sb_sp_max, sb_sp_min, sb_pr_max, sb_pr_min, sb_pl_max, sb_pl_min;
private ListView mListView;
private List<String> loglist;
private ArrayAdapter listAdapter;
private String mAddress;
private boolean mPauseRefresh = false;
private BleBloodOxygenDeviceData mBleBloodOxygenDeviceData;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bloodoxygen);
mAddress = getIntent().getStringExtra("mac");

tv_sp_max = findViewById(R.id.tv_sp_max);
tv_sp_min = findViewById(R.id.tv_sp_min);
tv_pr_max = findViewById(R.id.tv_pr_max);
tv_pr_min = findViewById(R.id.tv_pr_min);
tv_pl_max = findViewById(R.id.tv_pl_max);
tv_pl_min = findViewById(R.id.tv_pl_min);
tv_version = findViewById(R.id.tv_version);
sb_sp_max = findViewById(R.id.sb_sp_max);
sb_sp_min = findViewById(R.id.sb_sp_min);
sb_pr_max = findViewById(R.id.sb_pr_max);
sb_pr_min = findViewById(R.id.sb_pr_min);
sb_pl_max = findViewById(R.id.sb_pl_max);
sb_pl_min = findViewById(R.id.sb_pl_min);
sb_pl_min = findViewById(R.id.sb_pl_min);
mListView = findViewById(R.id.lv_log);
loglist = new ArrayList<>();
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, loglist);
mListView.setAdapter(listAdapter);
findViewById(R.id.bt_status).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mBleBloodOxygenDeviceData != null)
mBleBloodOxygenDeviceData.getDeviceStatus();
}
});
findViewById(R.id.bt_alarm).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int sp_max = sb_sp_max.getProgress();
int sp_min = sb_sp_min.getProgress();
int pl_max = sb_pl_max.getProgress();
int pl_min = sb_pl_min.getProgress();
int pr_max = sb_pr_max.getProgress();
int pr_min = sb_pr_min.getProgress();
if (mBleBloodOxygenDeviceData != null)
mBleBloodOxygenDeviceData.setAlarm(sp_max, sp_min, pr_max, pr_min, pl_max, pl_min);


}
});
findViewById(R.id.bt_version).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mBleBloodOxygenDeviceData != null)
mBleBloodOxygenDeviceData.getVersion();
}
});
findViewById(R.id.bt_pause).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mPauseRefresh=!mPauseRefresh;

}
});
findViewById(R.id.bt_clear).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mPauseRefresh=false;
loglist.clear();
listAdapter.notifyDataSetChanged();
}
});
sb_sp_max.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
tv_sp_max.setText(progress + "");
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {

}
});
sb_sp_min.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
tv_sp_min.setText(progress + "");
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {

}
});
sb_pr_max.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
tv_pr_max.setText(progress + "");
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {

}
});
sb_pr_min.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
tv_pr_min.setText(progress + "");
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {

}
});
sb_pl_max.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
tv_pl_max.setText(progress + "");
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {

}
});
sb_pl_min.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
tv_pl_min.setText(progress + "");
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {

}
});
}


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

@Override
public void onServiceErr() {

}

@Override
public void unbindServices() {

}

@Override
protected void startScanBle(long timeOut) {
super.startScanBle(timeOut);
}

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

@Override
protected void connectBle(BleValueBean bleValueBean) {
super.connectBle(bleValueBean);
}

@Override
protected void connectBle(String mac) {
super.connectBle(mac);
}

@Override
public void onDisConnected(String mac, int code) {
if (mAddress.equalsIgnoreCase(mac)) {
Toast.makeText(this, "设备断开连接", Toast.LENGTH_SHORT).show();
finish();
}
}

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

@Override
public void onData(byte[] data, int type) {
String dataStr = "收到的数据";
if (type == 1) {
dataStr = "收到透传数据:";
}
dataStr += BleStrUtils.byte2HexStr(data);
loglist.add(0, dataStr);
refreshData();
}

@Override
public void onResult(int status, int spo2, int pr, float pi, int battery, float rr, int py, int pyTrough, int wearStatus) {

String statusStr = "";
switch (status) {
case BleBloodOxygenBleConfig.Test_status_START:
statusStr = "开始测试";
break;
case BleBloodOxygenBleConfig.Test_status_Finish:
statusStr = "正在测试";
break;
case BleBloodOxygenBleConfig.Test_status_ERROR:
statusStr = "测试结束";
break;
}
String wearStatusStr = wearStatus == 1 ? "已佩戴" : "未佩戴";

String showData =
"测试状态:" + statusStr + "\n血氧饱和度:" + spo2 + "\n脉率:" + pr + "\n血流灌注指数:" + pi + "\n电池电量:" + battery + "\n呼吸频率(RR):" + rr + "\n脉率曲线值:" + py + "\n脉率曲线波谷:" + pyTrough + "\n佩戴状态:" + wearStatusStr;
loglist.add(0, showData);

refreshData();
}

@Override
public void onSetResult(int result) {
String resultStr = "";
switch (result) {
case BleBloodOxygenBleConfig.SET_RESULT_FAIL:
resultStr = "设置失败";
break;
case BleBloodOxygenBleConfig.SET_RESULT_SUCCESS:
resultStr = "设置成功";
break;

}
loglist.add(0, "设置结果" + resultStr);
refreshData();
}

@Override
public void onErrorCode(int code) {
String errorStr = "";
switch (code) {

case BleBloodOxygenBleConfig.ErrorCode_Saturation_Rate_Not_Stable:
errorStr = "血氧饱和率不稳定";
break;
case BleBloodOxygenBleConfig.ErrorCode_Pulse_Rate_Unstable:
errorStr = "脉率不稳定";
break;
case BleBloodOxygenBleConfig.ErrorCode_Test_Error:
errorStr = "测量出错";
break;
case BleBloodOxygenBleConfig.ErrorCode_Low_Power:
errorStr = "设备低电";
break;

}
loglist.add(0, "设置结果" + errorStr);
refreshData();
}


private void refreshData() {
if (listAdapter != null && !mPauseRefresh) {
listAdapter.notifyDataSetChanged();
}
}


@Override
public void onBmVersion(String version) {
tv_version.setText(version);
}
}

+ 394
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BloodSugar4GActivity.java Bestand weergeven

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

import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;

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

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

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

/**
* 4G血糖仪
*/
public class BloodSugar4GActivity extends AppCompatActivity implements View.OnClickListener {
private String TAG = BloodSugar4GActivity.class.getName();
private String token;
private long appid;
private String imei;
private List<String> loglist;
private String myDeviceId;
private ArrayAdapter logAdapter;
private ListView listviw;
private EditText mEditText;
private Button btn_deviceId;
private Button btn_data;
private Button btn_clear;
private Button btn_login;
private List<Long> bodyIds;
private long maxId = 0l;
private Button btn_test;
private Button btn_produce;
private String url = "https://ailink.aicare.net.cn";


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

listviw = findViewById(R.id.listviw);
mEditText = findViewById(R.id.ed_imei);
btn_deviceId = findViewById(R.id.btn_deviceId);
btn_data = findViewById(R.id.btn_data);
btn_clear = findViewById(R.id.btn_clear);
btn_login = findViewById(R.id.btn_login);
btn_test = findViewById(R.id.btn_test);
btn_produce = findViewById(R.id.btn_produce);
btn_deviceId.setOnClickListener(this);
btn_data.setOnClickListener(this);
btn_clear.setOnClickListener(this);
btn_login.setOnClickListener(this);
btn_test.setOnClickListener(this);
btn_produce.setOnClickListener(this);
loglist = new ArrayList<>();
bodyIds = new ArrayList<>();
logAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, loglist);
listviw.setAdapter(logAdapter);
new Thread(new Runnable() {
@Override
public void run() {
try {
login();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
}).start();

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

}

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

}

@Override
public void afterTextChanged(Editable s) {
myDeviceId = "";
maxId = 0;

}
});
}

public void login() throws Throwable {
String mUrl=url + "/api/user/login?key=inet_elink&username=dhls@qq.com&password=dc483e80a7a0bd9ef71d8cf973673924";
URL uri = new URL(mUrl);
HttpURLConnection httpURLConnection = (HttpURLConnection) uri.openConnection();
// Post请求必须设置允许输出
httpURLConnection.setDoOutput(true);
// Post请求不能使用缓存
httpURLConnection.setUseCaches(false);
// 设置为Post请求
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setInstanceFollowRedirects(true);
// 配置请求Content-Type
httpURLConnection.setRequestProperty("Content-Type",
"application/x-www-form-urlencode");
// 设置连接超时时间
httpURLConnection.setConnectTimeout(6 * 1000);
// 开始连接
httpURLConnection.connect();
// DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream());
// dos.write(map.toString().getBytes());
// dos.flush();
// dos.close();
// 判断请求是否成功
if (httpURLConnection.getResponseCode() == 200) {
// 获取返回的数据
byte[] data = readInputStream(httpURLConnection.getInputStream());
String result = new String(data, "UTF-8");
Log.i(TAG, result);
JSONObject jsonObject = new JSONObject(result);
JSONObject datajson = jsonObject.getJSONObject("data");
runOnUiThread(new Runnable() {
@Override
public void run() {
try {
token = jsonObject.getString("token");
appid = datajson.getLong("appUserId");
loglist.add(0, "登录成功");
logAdapter.notifyDataSetChanged();
} catch (JSONException e) {
e.printStackTrace();
}

}
});
} else {
Log.i(TAG, "Post方式请求失败");
runOnUiThread(new Runnable() {
@Override
public void run() {
loglist.add(0, "登录失败");
}
});
}

}


public void getDeviceid() throws Throwable {

StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(url);
stringBuilder.append("/api/device/getDeviceBySN?key=inet_elink&appUserId=");
stringBuilder.append(appid);
stringBuilder.append("&token=");
stringBuilder.append(token);
stringBuilder.append("&deviceSN=");
stringBuilder.append(imei);
Log.e(TAG, stringBuilder.toString());
URL uri = new URL(stringBuilder.toString());
HttpURLConnection httpURLConnection = (HttpURLConnection) uri.openConnection();
// Post请求必须设置允许输出
httpURLConnection.setDoOutput(true);
// Post请求不能使用缓存
httpURLConnection.setUseCaches(false);
// 设置为Post请求
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setInstanceFollowRedirects(true);
// 配置请求Content-Type
httpURLConnection.setRequestProperty("Content-Type",
"application/x-www-form-urlencode");
// 设置连接超时时间
httpURLConnection.setConnectTimeout(6 * 1000);
// 开始连接
httpURLConnection.connect();
// DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream());
// dos.write(map.toString().getBytes());
// dos.flush();
// dos.close();
// 判断请求是否成功
if (httpURLConnection.getResponseCode() == 200) {
// 获取返回的数据
byte[] data = readInputStream(httpURLConnection.getInputStream());
String result = new String(data, "UTF-8");
Log.i(TAG, result);
JSONObject jsonObject = new JSONObject(result);
JSONArray datajson = jsonObject.getJSONArray("data");

runOnUiThread(new Runnable() {
@Override
public void run() {
try {
if (datajson.length() > 0)
myDeviceId = datajson.getJSONObject(0).getString("deviceId");
loglist.add(0, "设备信息" + result);
logAdapter.notifyDataSetChanged();
} catch (JSONException e) {
e.printStackTrace();
}
}
});


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


public void getData() throws Throwable {
if (myDeviceId.isEmpty()) {
runOnUiThread(new Runnable() {
@Override
public void run() {
loglist.add(0, "请获取设备Id");
logAdapter.notifyDataSetChanged();
}
});

return;
}
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(url);
stringBuilder.append("/api/deDataGlu/listByDeviceId?key=inet_elink&appUserId=");
stringBuilder.append(appid);
stringBuilder.append("&token=");
stringBuilder.append(token);
stringBuilder.append("&deviceId=");
stringBuilder.append(myDeviceId);
stringBuilder.append("&maxId=");
stringBuilder.append(maxId);
URL uri = new URL(stringBuilder.toString());
HttpURLConnection httpURLConnection = (HttpURLConnection) uri.openConnection();
// // Post请求必须设置允许输出
// httpURLConnection.setDoOutput(true);
// // Post请求不能使用缓存
// httpURLConnection.setUseCaches(false);
// 设置为Post请求
// httpURLConnection.setRequestMethod("GET");
// httpURLConnection.setInstanceFollowRedirects(true);
// // 配置请求Content-Type
// httpURLConnection.setRequestProperty("Content-Type",
// "application/x-www-form-urlencode");
// 设置连接超时时间
httpURLConnection.setConnectTimeout(6 * 1000);
// 开始连接
httpURLConnection.connect();
// DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream());
// dos.write(map.toString().getBytes());
// dos.flush();
// dos.close();
// 判断请求是否成功
if (httpURLConnection.getResponseCode() == 200) {
// 获取返回的数据
byte[] data = readInputStream(httpURLConnection.getInputStream());
String result = new String(data, "UTF-8");
JSONObject jsonObject = new JSONObject(result);
JSONObject dataObject = jsonObject.getJSONObject("data");
JSONArray datajson = dataObject.getJSONArray("list");
bodyIds.clear();
for (int i = 0; i < datajson.length(); i++) {
long id = datajson.getJSONObject(i).getLong("id");
bodyIds.add(id);
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("id:");
stringBuffer.append(id);
stringBuffer.append(" 创建时间:");
stringBuffer.append(TimeUtils.getTime(datajson.getJSONObject(i).getLong("createTime")));
stringBuffer.append("血糖值(原始值):");
int value = datajson.getJSONObject(i).getInt("gluFasting");
stringBuffer.append(value);
stringBuffer.append(" 小数位:");
int point = datajson.getJSONObject(i).getInt("gluPoint");
stringBuffer.append(point);
stringBuffer.append(" 单位:");
int unit = datajson.getJSONObject(i).getInt("gluUnit");
stringBuffer.append(unit);
stringBuffer.append("\n血糖(计算后)");
stringBuffer.append(String.format(Locale.US, "%." + point + "f", (value * 1f) * Math.pow(10, 0 - point)));
stringBuffer.append(unit == 1 ? "mmol/L" : "mg/dL");


loglist.add(0, stringBuffer.toString());
}
if (maxId == 0) {
loglist.add(0, "总共有:" + bodyIds.size() + " 条");
} else {
loglist.add(0, "新增了:" + bodyIds.size() + " 条");

}
if (bodyIds.size() > 0) {
maxId = bodyIds.get(bodyIds.size() - 1);
}
Log.i(TAG, result);
runOnUiThread(new Runnable() {
@Override
public void run() {
logAdapter.notifyDataSetChanged();
}

});

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

public byte[] readInputStream(InputStream inputStream) throws IOException {
byte[] buffer = new byte[1024];
int len = 0;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while ((len = inputStream.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
bos.close();
return bos.toByteArray();
}

@Override
public void onClick(View v) {
if (v.getId() == R.id.btn_deviceId) {
imei = mEditText.getText().toString().trim();
if (imei == null || imei.isEmpty()) {
loglist.add("请输入IMEI号");
} else {

new Thread(new Runnable() {
@Override
public void run() {
try {
getDeviceid();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
}).start();

}
} else if (v.getId() == R.id.btn_data) {
new Thread(new Runnable() {
@Override
public void run() {
try {
getData();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
}).start();
} else if (v.getId() == R.id.btn_clear) {
loglist.clear();
logAdapter.notifyDataSetChanged();
} else if (v.getId() == R.id.btn_login) {
new Thread(new Runnable() {
@Override
public void run() {
try {
login();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
}).start();
} else if (v.getId() == R.id.btn_produce) {
url = "https://ailink.aicare.net.cn";

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

}
}
}

+ 6
- 4
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BroadcastScaleActivity.java Bestand weergeven

@@ -27,6 +27,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.BroadcastScale.BroadcastScaleBleConfig;
import cn.net.aicare.modulelibrary.module.BroadcastScale.BroadcastScaleDeviceData;
@@ -45,7 +46,7 @@ public class BroadcastScaleActivity extends BleBaseActivity implements OnCallbac
private final int REFRESH_DATA = 3;

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

private List<String> mList;
private ArrayAdapter listAdapter;
@@ -104,6 +105,7 @@ public class BroadcastScaleActivity extends BleBaseActivity implements OnCallbac
mRadioButtonLbLb = findViewById(R.id.radio_weight_lb_lb);

tv_broadcast_mac = findViewById(R.id.tv_broadcast_mac);
tv_broadcast_did = findViewById(R.id.tv_broadcast_did);

}

@@ -353,9 +355,9 @@ public class BroadcastScaleActivity extends BleBaseActivity implements OnCallbac
@Override
public void OnDID(int cid, int vid, int pid) {
String didStr = "cid:" + cid + "||vid:" + vid + "||pid:" + pid;
// if (tv_broadcast_did!=null){
// tv_broadcast_did.setText(didStr);
// }
if (tv_broadcast_did!=null){
tv_broadcast_did.setText(didStr);
}
}



+ 258
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ClearShakeHandsActivity.java Bestand weergeven

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

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

import com.pingwang.bluetoothlib.BleBaseActivity;
import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.device.BleSendCmdUtil;
import com.pingwang.bluetoothlib.device.SendBleBean;
import com.pingwang.bluetoothlib.device.SendMcuBean;
import com.pingwang.bluetoothlib.listener.CallbackDisIm;
import com.pingwang.bluetoothlib.listener.OnBleDeviceDataListener;
import com.pingwang.bluetoothlib.listener.OnBleOtherDataListener;
import com.pingwang.bluetoothlib.listener.OnBleVersionListener;
import com.pingwang.bluetoothlib.listener.OnCallbackDis;
import com.pingwang.bluetoothlib.listener.OnMcuParameterListener;
import com.pingwang.bluetoothlib.utils.BleLog;
import com.pingwang.bluetoothlib.utils.BleStrUtils;

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

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


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

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

private Context mContext;
private EditText et_type;
private BleDevice mBleDevice;
private String mAddress;
private BleSendCmdUtil mBleSendCmdUtil;
private int type=0x01;
private byte unit = 0;
private Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {


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

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

init();
}

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

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


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

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

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


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

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


@Override
public void onServiceSuccess() {
CallbackDisIm.getInstance().addListListener(this);
BleLog.i(TAG, "服务与界面建立连接成功");
//与服务建立连接
if (mBluetoothService != null) {
mBleDevice = mBluetoothService.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);
}
}

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


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


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


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

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

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


@Override
public void bleOpen() {

}

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


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


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

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

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

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


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

+ 3
- 3
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ConnectBleTestActivity.java Bestand weergeven

@@ -22,12 +22,12 @@ import com.pingwang.bluetoothlib.listener.OnCallbackBle;
import com.pingwang.bluetoothlib.server.ELinkBleServer;
import com.pingwang.bluetoothlib.utils.BleLog;
import com.pingwang.bluetoothlib.utils.BleStrUtils;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.LoadingIosDialogFragment;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;

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

import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.LoadingIosDialogFragment;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
@@ -36,7 +36,7 @@ import androidx.appcompat.app.AppCompatActivity;
/**
* xing<br>
* 2019/3/6<br>
* java类作用描述
* 连接测试工具
*/
public class ConnectBleTestActivity extends AppCompatActivity implements OnCallbackBle {


+ 112
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/EightBodyfatActivity.java Bestand weergeven

@@ -7,6 +7,8 @@ import android.widget.CompoundButton;
import android.widget.ListView;
import android.widget.RadioButton;

import com.holtek.libHTBodyfat.HTBodyBasicInfo;
import com.holtek.libHTBodyfat.HTBodyResultAllBody;
import com.pingwang.bluetoothlib.BleBaseActivity;
import com.pingwang.bluetoothlib.bean.SupportUnitBean;
import com.pingwang.bluetoothlib.device.BleDevice;
@@ -19,6 +21,9 @@ import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatBleDeviceData;
import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatUtil;

/**
* 八电极秤
*/
public class EightBodyfatActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, EightBodyFatBleDeviceData.EightBodyFatCallback {

private List<String> loglist;
@@ -235,6 +240,8 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic
case EightBodyFatUtil.MEASUREMENT_END:
loglist.add(0, "测量完成");
//测量完成
if (mEightBodyfatAdc!=null)kaimengJieMi(mEightBodyfatAdc);

break;
case EightBodyFatUtil.MUC_CALL_BACK_RESULT:
switch (typeState) {
@@ -299,6 +306,7 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic
@Override
public void onImpedance(int adc, int part, int arithmetic) {
loglist.add(0, "阻抗:" + adc + " 部位: " + part + " 算法" + arithmetic);
kaimeng(part,adc);
}

@Override
@@ -330,4 +338,108 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic
public void showData(String data) {
// loglist.add(0, data);
}


private EightBodyfatAdc mEightBodyfatAdc;

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

switch (part) {
case EightBodyFatUtil.IMPEDANCE_FOOT:
//双脚阻抗
mEightBodyfatAdc.setAdcFoot(adc);
break;
case EightBodyFatUtil.IMPEDANCE_HAND:
//双手阻抗
mEightBodyfatAdc.setAdcHand(adc);

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

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

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

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

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

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

break;
default:


}

}

private void kaimengJieMi(EightBodyfatAdc mEightBodyfatAdc) {
loglist.add(0,mEightBodyfatAdc.toString());
HTBodyBasicInfo basicInfo = new HTBodyBasicInfo(1, 170, 65, 25);
loglist.add(0, "默认传入用户: 性别:男,身高:170,体重 65kg 年龄25");
basicInfo.htZAllBodyImpedance = mEightBodyfatAdc.getAdcRightBody();
basicInfo.htZLeftLegImpedance = mEightBodyfatAdc.getAdcLeftFoot();
basicInfo.htZRightLegImpedance = mEightBodyfatAdc.getAdcRightFoot();
basicInfo.htZLeftArmImpedance = mEightBodyfatAdc.getAdcLeftHand();
basicInfo.htZRightArmImpedance = mEightBodyfatAdc.getAdcRightHand();
basicInfo.htTwoLegsImpedance = mEightBodyfatAdc.getAdcFoot();
basicInfo.htTwoArmsImpedance = mEightBodyfatAdc.getAdcHand();
HTBodyResultAllBody resultTwoLegs = new HTBodyResultAllBody();
int errorType = resultTwoLegs.getBodyfatWithBasicInfo(basicInfo);
if (errorType == HTBodyBasicInfo.ErrorNone) {
String jiemi="加密阻抗:" +
" \n双脚=" + (resultTwoLegs.htZLeftLeg + resultTwoLegs.htZRightLeg) +
" \n双手=" + (resultTwoLegs.htZLeftArm + resultTwoLegs.htZRightArm) +
" \n左手=" + resultTwoLegs.htZLeftArm +
" \n右手=" + resultTwoLegs.htZRightArm +
" \n左脚=" + resultTwoLegs.htZLeftLeg +
" \n右脚=" + resultTwoLegs.htZRightLeg +
" \n左躯干=" + (resultTwoLegs.htZAllBody)+
" \n右躯干=" + (resultTwoLegs.htZAllBody)+
" \n右手左脚=" + (resultTwoLegs.htZRightArm + resultTwoLegs.htZLeftLeg) +
" \n左手右脚=" + (resultTwoLegs.htZLeftArm + resultTwoLegs.htZRightLeg) +
" \n全身=" + resultTwoLegs.htZAllBody;
loglist.add(0, jiemi);
} else {
loglist.add(0, "解析阻抗:错误码:" + errorType + "\n"
+ " ErrorAge = 1 ,ErrorWeight = 2, ErrorHeight = 4, ErrorSex = 8, ErrorImpedance = 16, ErrorImpedanceLeftLeg = 32, ErrorImpedanceRightLeg = 64,ErrorImpedanceLeftArm = 128, ErrorImpedanceRightArm = 256"
);


}

}


}

+ 123
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/EightBodyfatAdc.java Bestand weergeven

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

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;


public int getAdcFoot() {
return adcFoot;
}

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

public int getAdcHand() {
return adcHand;
}

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

public int getAdcLeftHand() {
return adcLeftHand;
}

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

public int getAdcRightHand() {
return adcRightHand;
}

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

public int getAdcLeftFoot() {
return adcLeftFoot;
}

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

public int getAdcRightFoot() {
return adcRightFoot;
}

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

public int getAdcLeftBody() {
return adcLeftBody;
}

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

public int getAdcRightBody() {
return adcRightBody;
}

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

public int getAdcRightHandLeftFoot() {
return adcRightHandLeftFoot;
}

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

public int getAdcLeftHandRightFoot() {
return adcLeftHandRightFoot;
}

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

public int getAdcBody() {
return adcBody;
}

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


@Override
public String toString() {
return "加密阻抗:" +
" \n双脚=" + adcFoot +
" \n双手=" + adcHand +
" \n左手=" + adcLeftHand +
" \n右手=" + adcRightHand +
" \n左脚=" + adcLeftFoot +
" \n右脚=" + adcRightFoot +
" \n左躯干=" + adcLeftBody +
" \n右躯干=" + adcRightBody +
" \n右手左脚=" + adcRightHandLeftFoot +
" \n左手右脚=" + adcLeftHandRightFoot +
" \n全身=" + adcBody ;
}
}

+ 11
- 5
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/HeightCmdActivity.java Bestand weergeven

@@ -24,24 +24,23 @@ 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.utils.TimeUtils;

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

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



/**
* xing<br>
* 2019/4/25<br>
* 显示数据
* 身高仪
*/
public class HeightCmdActivity extends BleBaseActivity implements OnCallbackDis,
HeightDeviceData.onNotifyData, OnBleVersionListener , OnMcuParameterListener, OnBleCompanyListener, View.OnClickListener {
HeightDeviceData.onNotifyData, OnBleVersionListener, OnMcuParameterListener, OnBleCompanyListener, View.OnClickListener {

private static String TAG = HeightCmdActivity.class.getName();
private final int REFRESH_DATA = 3;
@@ -52,6 +51,7 @@ public class HeightCmdActivity extends BleBaseActivity implements OnCallbackDis,
* 服务Intent
*/
private Context mContext;
private EditText et_type;
private HeightDeviceData mBleDevice;
private String mAddress;
private BleSendCmdUtil mBleSendCmdUtil;
@@ -94,6 +94,7 @@ public class HeightCmdActivity extends BleBaseActivity implements OnCallbackDis,
findViewById(R.id.btnVersion).setOnClickListener(this);
findViewById(R.id.btnBattery).setOnClickListener(this);
findViewById(R.id.btn_get_did).setOnClickListener(this);
et_type = findViewById(R.id.et_type);

cmdBtn();
}
@@ -133,7 +134,12 @@ public class HeightCmdActivity extends BleBaseActivity implements OnCallbackDis,
sendBleBean.setHex(mBleSendCmdUtil.getDid());
mBleDevice.sendData(sendBleBean);
break;

case R.id.btn1:
String cmd = et_type.getText().toString().trim();
SendMcuBean sendDataBean = new SendMcuBean();
sendDataBean.setHex(type,cmd.getBytes());
mBleDevice.sendData(sendDataBean);
break;
case R.id.clear:
if (mList != null)
mList.clear();

+ 562
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/HeightWeightScaleActivity.java Bestand weergeven

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

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

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

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

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.HeightWeightScale.HeightBodyFatBleData;
import cn.net.aicare.modulelibrary.module.HeightWeightScale.HeightBodyFatBleUntils;

/**
* 身高体重秤
*/
public class HeightWeightScaleActivity extends BleBaseActivity implements OnCallbackBle, HeightBodyFatBleData.OnHeightBodyFatDataCallback, View.OnClickListener {
private String mAddress = "";
private List<String> logList;
private ListView listView;
private ArrayAdapter listAdapter;
private int selectWUnit;
private int selectHUnit;
private int currentWUnit = 0;
private int currentHUnit = 0;
private int currentMode = 1;
private int selectMode = 1;
private final int SETUNIT = 0;
private final int SETUSER = 1;
private final int SETMODE = 2;
private final int ADC = 3;
private final int FINISH = 4;
private final int DEVICESTATUS = 5;
private final int VOICE = 6;
private final int VOICESTATUS = 7;
private MHandler mMHandler;
private TextView text;
private int currentVoice = 1;
private int selectVoice = 1;

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

}

@Override
public void onServiceErr() {

}

@Override
public void unbindServices() {

}


@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_height_bodyfat);
mAddress = getIntent().getStringExtra("mac");
logList = new ArrayList<>();

listView = findViewById(R.id.listView);
mMHandler = new WeakReference<>(new MHandler()).get();
findViewById(R.id.kg).setOnClickListener(this);
findViewById(R.id.jin).setOnClickListener(this);
findViewById(R.id.st_lb).setOnClickListener(this);
findViewById(R.id.lb).setOnClickListener(this);
findViewById(R.id.girl).setOnClickListener(this);
findViewById(R.id.man).setOnClickListener(this);
findViewById(R.id.cm).setOnClickListener(this);
findViewById(R.id.inch).setOnClickListener(this);
findViewById(R.id.ft_in).setOnClickListener(this);
findViewById(R.id.bodyfat).setOnClickListener(this);
findViewById(R.id.weight).setOnClickListener(this);
findViewById(R.id.baby).setOnClickListener(this);
findViewById(R.id.deviceStatus).setOnClickListener(this);
findViewById(R.id.voice_open).setOnClickListener(this);
findViewById(R.id.voice_close).setOnClickListener(this);
findViewById(R.id.voice_status).setOnClickListener(this);
findViewById(R.id.finish).setOnClickListener(this);
findViewById(R.id.height_weight).setOnClickListener(this);
text = findViewById(R.id.text);
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, logList);
listView.setAdapter(listAdapter);
}

@Override
public void onStartScan() {

}

@Override
public void onScanning(BleValueBean data) {


}

@Override
public void onScanTimeOut() {

}

@Override
public void onConnecting(String mac) {

}

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

}

}

@Override
public void onConnectionSuccess(String mac) {

}

@Override
public void onServicesDiscovered(String mac) {


}

@Override
public void bleOpen() {

}

@Override
public void bleClose() {

}

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

}

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

}

@Override
public void onMcuResult(int type, int result) {
String resultStr = "";
if (result == HeightBodyFatBleUntils.SET_SUCCESS) {
resultStr = "成功";
} else if (result == HeightBodyFatBleUntils.SET_FAIL) {
resultStr = "失败";

} else {
resultStr = "不支持";
}
switch (type) {
case HeightBodyFatBleUntils.MCU_SET_USER_RESULT:
mMHandler.removeMessages(SETUSER);

logList.add(0, "下发用户结果:" + resultStr);
break;
case HeightBodyFatBleUntils.MCU_SET_UNIT_RESULT:
if (result == 0) {
currentHUnit = selectHUnit;
currentWUnit = selectWUnit;
if (currentHUnit == 0) {

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

}
listAdapter.notifyDataSetChanged();


}

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

}

@Override
public void onDeviceStatus(int workMode, int battery, int batteryStatus, int weightUnit, int heightUnit, int voice) {
mMHandler.removeMessages(DEVICESTATUS);
currentMode = workMode;
currentWUnit = weightUnit;
currentHUnit = heightUnit;
currentVoice = voice;
text.setText("体重单位: " + currentWUnit +
"\n身高单位: " + currentHUnit +
"\n模式:" + currentMode + " 声音: " + currentVoice);
logList.add(0, "体重状态 模式:" + workMode + " 电池电量: " + battery + " 电池状态: " + batteryStatus
+ "\n 体重单位: " + weightUnit + " 身高单位: " + heightUnit + " 声音状态: " + voice);
listAdapter.notifyDataSetChanged();

}

@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();
if (weightMode == 2) {
mMHandler.removeMessages(ADC);
mMHandler.removeMessages(FINISH);
mMHandler.sendEmptyMessageDelayed(ADC, 30000);
mMHandler.sendEmptyMessageDelayed(FINISH, 40000);
}

}

@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();
if (weightMode == 2) {
mMHandler.removeMessages(FINISH);

mMHandler.sendEmptyMessageDelayed(FINISH, 40000);
}


}

@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();
if (weightMode == 2) {
mMHandler.removeMessages(FINISH);
mMHandler.sendEmptyMessageDelayed(FINISH, 40000);
}


}

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


}

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


}

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

}

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

}

@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
+ "\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
+ "\n 蛋白率: " + pp + " bmi: " + bmi + " 心率: " + heart + " \n肥胖等级" + obesityLevels);
listAdapter.notifyDataSetChanged();


}

@Override
public void onVoice(int status) {
mMHandler.removeMessages(VOICESTATUS);
logList.add(0, "声音状态 模式:" + status);
listAdapter.notifyDataSetChanged();
}

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

}

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

@Override
public void onClick(View v) {
if (HeightBodyFatBleData.getInstance() != null) {

switch (v.getId()) {
case R.id.kg:
selectWUnit = 0;
logList.add(0, "下发体重单位 :" + selectWUnit);
listAdapter.notifyDataSetChanged();
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();
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();
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));
mMHandler.removeMessages(SETUNIT);
mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000);
break;
case R.id.girl:
logList.add(0, "下用户 女 18岁 165cm :" + selectWUnit);
listAdapter.notifyDataSetChanged();
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUser(0, 18, 165));
mMHandler.removeMessages(SETUSER);
mMHandler.sendEmptyMessageDelayed(SETUSER, 3000);
break;
case R.id.man:
logList.add(0, "下用户 男 28岁 170cm :" + selectWUnit);
listAdapter.notifyDataSetChanged();

HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUser(1, 28, 170));
mMHandler.removeMessages(SETUSER);
mMHandler.sendEmptyMessageDelayed(SETUSER, 3000);

break;
case R.id.cm:
selectHUnit = 0;
logList.add(0, "下发身高单位 :" + selectHUnit);
listAdapter.notifyDataSetChanged();
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();
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();
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();
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();
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();
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();
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setWorkMode(selectMode));
mMHandler.removeMessages(SETMODE);
mMHandler.sendEmptyMessageDelayed(SETMODE, 3000);
break;
case R.id.deviceStatus:

logList.add(0, "请求设备状态 :" );
listAdapter.notifyDataSetChanged();
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();
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();
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setVoiceStatus(selectVoice));
mMHandler.removeMessages(VOICE);
mMHandler.sendEmptyMessageDelayed(VOICE, 3000);
break;
case R.id.voice_status:

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



}
}
}

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

+ 0
- 144
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/LoadingIosDialogFragment.java Bestand weergeven

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

import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

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


/**
* elink-android<br>
* LoadingIosDialogFragment<br>
* xing<br>
* 2019/2/26 16:07<br>
* 加载提示框
*/
public class LoadingIosDialogFragment extends DialogFragment {
private static String TAG = LoadingIosDialogFragment.class.getName();
private final static int DISMISS_OUT = 1;
/**
* 默认超时时间
*/
private int timeOut = 30;
private boolean show = false;

public boolean isShow() {
return show;
}

private Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case DISMISS_OUT:
LoadingIosDialogFragment.this.dismiss();
break;

}
}
};


@Override
public void dismiss() {
try {
mHandler.removeMessages(DISMISS_OUT);
if (getFragmentManager() != null)
super.dismiss();
show = false;
} catch (Exception e) {
e.printStackTrace();
}
}

public int getTimeOut() {
return timeOut;
}

public void setTimeOut(int timeOut) {
this.timeOut = timeOut;
}

public void show(@NonNull FragmentManager manager) {
this.show(manager, "LoadingIosDialogFragment");
}

@Override
public void show(@NonNull FragmentManager manager, @Nullable String tag) {
try {
super.show(manager, tag);
show = true;
} catch (Exception e) {
show = false;
e.printStackTrace();
}
mHandler.sendEmptyMessageDelayed(DISMISS_OUT, timeOut * 1000);
}

@Override
public int show(@NonNull FragmentTransaction transaction, @Nullable String tag) {
return super.show(transaction, tag);
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (getDialog() != null) {
getDialog().setOnShowListener(null);
getDialog().setOnCancelListener(null);
getDialog().setOnDismissListener(null);
}


}

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return super.onCreateView(inflater, container, savedInstanceState);
}

@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
LayoutInflater inflater = LayoutInflater.from(requireContext());
View v = inflater.inflate(R.layout.dialog_loading_ios, null);// 得到加载view
Dialog loadingDialog = new Dialog(requireContext(), R.style.MyDialog);// 创建自定义样式dialog

loadingDialog.setCancelable(false);//设置点击空白处是否可以取消
//按返回键是否可以取消
loadingDialog.setCanceledOnTouchOutside(false);
loadingDialog.setContentView(v);// 设置布局

loadingDialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
@Override
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
//返回不关闭
return keyCode == KeyEvent.KEYCODE_BACK;
}
});

return loadingDialog;

}

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

+ 201
- 120
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/MainActivity.java Bestand weergeven

@@ -1,74 +1,153 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid;

import android.Manifest;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.pingwang.bluetoothlib.AILinkSDK;
import com.pingwang.bluetoothlib.utils.BleLog;

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

import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleAppBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.config.AppConfig;
import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig;
import aicare.net.cn.sdk.ailinksdkdemoandroid.find.FindDeviceNewActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.broadcast_height.BroadcastHeightActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.SP;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;


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

private static String TAG = MainActivity.class.getName();
private List<View> mList = new ArrayList<>();

@Override
protected void uiHandlerMessage(Message msg) {

}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AILinkSDK.getInstance().init(this);
setContentView(R.layout.activity_main);
protected int getLayoutId() {
return R.layout.activity_main;
}


@Override
public void onServiceSuccess() {

}

@Override
public void onServiceErr() {

}

@Override
public void unbindServices() {

}

@Override
protected void initListener() {
MyListener listener = new MyListener();

// Button btn_shpy = findViewById(R.id.btn_sphy);
// Button btn_tempgun = findViewById(R.id.btn_tempgun);
// Button btn_temp = findViewById(R.id.btn_temp);
// Button btn_baby = findViewById(R.id.btn_baby);
// Button btn_height = findViewById(R.id.btn_height);
// Button btn_ble = findViewById(R.id.btn_ble);
// Button btn_weightScale = findViewById(R.id.btn_lock);
// Button btn_ble_test = findViewById(R.id.btn_ble_test);
// Button btnConnectTest = findViewById(R.id.btnConnectTest);
// Button btn_ad_weight = findViewById(R.id.btn_ad_weight);
// Button btn_ble_weight = findViewById(R.id.btn_ble_weight);
// Button btn_wifi_ble_tooth = findViewById(R.id.btn_wifi_ble_tooth);
// Button wifi_config = findViewById(R.id.wifi_config);
// Button eight_scale = findViewById(R.id.eight_scale);
// Button btn_ota = findViewById(R.id.btn_ota);
// Button btn_wristband = findViewById(R.id.btn_wristband);
// Button glucometer = findViewById(R.id.glucometer);
// Button btn_broadcast_scale = findViewById(R.id.btn_broadcast_scale);
// Button btn_broadcast_blood_oxygen = findViewById(R.id.btn_broadcast_blood_oxygen);
// Button btn_smart_mask = findViewById(R.id.btn_smart_mask);
// Button btn_bld = findViewById(R.id.btn_bld);
// Button btn_bleBo = findViewById(R.id.btn_bleBo);
// Button btn_coffeeScale = findViewById(R.id.btn_coffeeScale);
// Button btn_scooter = findViewById(R.id.btn_scooter);
// Button btn_shareCharger = findViewById(R.id.btn_shareCharger);
// Button btn_transmission = findViewById(R.id.btn_transmission);
// Button btn_wifi_ble_weight = findViewById(R.id.btn_wifi_ble_weight);
// Button btn_baby_body_fat = findViewById(R.id.btn_baby_body_fat);
mList.add(findViewById(R.id.btn_sphy));
mList.add(findViewById(R.id.btn_tempgun));
mList.add(findViewById(R.id.btn_temp));
mList.add(findViewById(R.id.btn_baby));
mList.add(findViewById(R.id.btn_height));
mList.add(findViewById(R.id.btn_ble));
mList.add(findViewById(R.id.btn_lock));
mList.add(findViewById(R.id.btn_ble_test));
mList.add(findViewById(R.id.btnConnectTest));
mList.add(findViewById(R.id.btn_ad_weight));
mList.add(findViewById(R.id.btn_ble_weight));
mList.add(findViewById(R.id.btn_wifi_ble_tooth));
mList.add(findViewById(R.id.wifi_config));
mList.add(findViewById(R.id.eight_scale));
mList.add(findViewById(R.id.btn_ota));
mList.add(findViewById(R.id.glucometer));
mList.add(findViewById(R.id.btn_broadcast_scale));
mList.add(findViewById(R.id.btn_broadcast_blood_oxygen));
mList.add(findViewById(R.id.btn_smart_mask));
mList.add(findViewById(R.id.btn_bld));
mList.add(findViewById(R.id.btn_bleBo));
mList.add(findViewById(R.id.btn_coffeeScale));
mList.add(findViewById(R.id.btn_scooter));
mList.add(findViewById(R.id.btn_shareCharger));
mList.add(findViewById(R.id.btn_share_socket));
mList.add(findViewById(R.id.btn_transmission));
mList.add(findViewById(R.id.btn_wifi_ble_weight));
mList.add(findViewById(R.id.btn_baby_body_fat));
mList.add(findViewById(R.id.btn_broadcast_height));
mList.add(findViewById(R.id.btn_hbfs));
mList.add(findViewById(R.id.btn_find));
mList.add(findViewById(R.id.btn_4g_bs));
mList.add(findViewById(R.id.btn_clear_shake_hands));
mList.add(findViewById(R.id.btn_food_temp));
mList.add(findViewById(R.id.btn_temp_humidity));
mList.add(findViewById(R.id.btn_share_condom));
for (View view : mList) {
view.setOnClickListener(listener);
}
List<Integer> showViewId = AppConfig.SHOW_VIEW_ID;
if (showViewId != null) {
for (View view : mList) {
view.setVisibility(View.GONE);
}
for (Integer integer : showViewId) {
findViewById(integer).setVisibility(View.VISIBLE);
}
}


}

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

@Override
protected void initView() {
BleLog.init("", "", BuildConfig.DEBUG);
String version = getString(R.string.version) + ":" + BuildConfig.VERSION_NAME;
((TextView) findViewById(R.id.tv_app_version)).setText(version);
init();
initPermissions();
AILinkSDK.getInstance().init(this);//sdk
SP.init(this);
}

private void init() {
MyListener listener = new MyListener();
Button btn_shpy = findViewById(R.id.btn_sphy);
Button btn_tempgun = findViewById(R.id.btn_tempgun);
Button btn_temp = findViewById(R.id.btn_temp);
Button btn_baby = findViewById(R.id.btn_baby);
Button btn_height = findViewById(R.id.btn_height);
Button btn_ble = findViewById(R.id.btn_ble);
findViewById(R.id.btn_ble_weight).setOnClickListener(listener);
findViewById(R.id.btn_wifi_ble_tooth).setOnClickListener(listener);
findViewById(R.id.wifi_config).setOnClickListener(listener);
findViewById(R.id.eight_scale).setOnClickListener(listener);
findViewById(R.id.btn_ota).setOnClickListener(listener);
findViewById(R.id.glucometer).setOnClickListener(listener);
findViewById(R.id.btn_broadcast_scale).setOnClickListener(listener);
findViewById(R.id.btn_broadcast_blood_oxygen).setOnClickListener(listener);
findViewById(R.id.btn_smart_mask).setOnClickListener(listener);

findViewById(R.id.btn_transmission).setOnClickListener(listener);
btn_shpy.setOnClickListener(listener);
btn_tempgun.setOnClickListener(listener);
btn_temp.setOnClickListener(listener);
btn_baby.setOnClickListener(listener);
btn_height.setOnClickListener(listener);
btn_ble.setOnClickListener(listener);
findViewById(R.id.btn_wifi_ble_weight).setOnClickListener(listener);
findViewById(R.id.btn_baby_body_fat).setOnClickListener(listener);
}

private class MyListener implements View.OnClickListener {
@Override
public void onClick(View v) {
@@ -78,6 +157,11 @@ public class MainActivity extends AppCompatActivity {
// }
int type = 0;
switch (v.getId()) {

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

case R.id.btn_sphy:
type = BleDeviceConfig.BLOOD_PRESSURE;
break;
@@ -93,7 +177,12 @@ public class MainActivity extends AppCompatActivity {
case R.id.btn_height:
type = BleDeviceConfig.HEIGHT_METER;
break;

case R.id.btn_lock:
type = BleDeviceConfig.SMART_LOCK;
break;
case R.id.btn_ad_weight:
type = BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_AD;
break;
case R.id.btn_wifi_ble_weight:
type = BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_WIFI_BLE;
break;
@@ -110,110 +199,102 @@ public class MainActivity extends AppCompatActivity {
type = BleDeviceConfig.BABY_BODY_FAT;
break;
case R.id.btn_broadcast_scale:
Intent intentBroadcast = new Intent(MainActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.BroadcastScaleActivity.class);
Intent intentBroadcast = new Intent(MainActivity.this, BroadcastScaleActivity.class);
startActivity(intentBroadcast);
return;
case R.id.btn_broadcast_blood_oxygen:
Intent intentBloodOxygen = new Intent(MainActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.BroadcastBloodOxygenActivity.class);
Intent intentBloodOxygen = new Intent(MainActivity.this, BroadcastBloodOxygenActivity.class);
startActivity(intentBloodOxygen);
return;

case R.id.btn_smart_mask:
type = BleDeviceConfig.SMART_MASK;
break;
case R.id.btn_bleBo:
type = BleDeviceConfig.BLE_BOOLD_OXYGEN;
break;
// case R.id.btn_bld:
// type = BleDeviceConfig.BLD_WEIGHT;
// break;
case R.id.btn_ble:
type = -1;
break;
case R.id.btn_ble_test:
type = -2;
break;
case R.id.btn_ota:
type = -3;
break;

case R.id.btn_transmission:
type = -4;
break;
case R.id.eight_scale:
type = BleDeviceConfig.EIGHT_BODY_FAT_SCALE;
break;
case R.id.btnConnectTest:
Intent intent = new Intent(MainActivity.this, ConnectBleTestActivity.class);
startActivity(intent);
return;
case R.id.wifi_config:
Intent intent1 = new Intent(MainActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.WifiConfigActivity.class);
Intent intent1 = new Intent(MainActivity.this, WifiConfigActivity.class);
startActivity(intent1);
return;
case R.id.btn_coffeeScale:
// 咖啡秤
type = BleDeviceConfig.COFFEE_SCALE;
break;
case R.id.btn_scooter:
type = BleDeviceConfig.SMART_SCOOTER;
break;
case R.id.btn_shareCharger:
// 共享充电器
type = BleDeviceConfig.SHARE_CHARGER;
break;
case R.id.btn_share_socket:
// 共享插座
type = BleDeviceConfig.SHARE_SOCKET;
break;
case R.id.btn_share_condom:
// 共享套套机
type = BleDeviceConfig.SHARE_CONDOM;
break;
case R.id.btn_find:
// 寻物器
Intent findDeviceActivity = new Intent(MainActivity.this, FindDeviceNewActivity.class);
startActivity(findDeviceActivity);
return;

case R.id.btn_broadcast_height:
// 广播身高仪
Intent intentBroadcastHeight = new Intent(MainActivity.this, BroadcastHeightActivity.class);
startActivity(intentBroadcastHeight);
return;
case R.id.btn_4g_bs:

}
startActivity(type);
}
}


/**
* 初始化请求权限
*/
private void initPermissions() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
ActivityCompat
.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.CHANGE_WIFI_MULTICAST_STATE, Manifest.permission.ACCESS_WIFI_STATE,
Manifest.permission.CHANGE_WIFI_STATE}, 1);
}
}
// 广播身高仪
Intent bloodSugar4GIntent = new Intent(MainActivity.this, BloodSugar4GActivity.class);
startActivity(bloodSugar4GIntent);
return;
case R.id.btn_food_temp:
// 食品温度计
type = BleDeviceConfig.FOOD_TEMP;
break;
case R.id.btn_hbfs:
type=BleDeviceConfig.HEIGHT_BODY_FAT;
break;
case R.id.btn_temp_humidity:
type= BleDeviceConfig.TEMP_Humidity;
break;

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

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

}
}).show();
}
startActivity(type);
}

}


private void startActivity(int tyep) {
Intent intent = new Intent(this, aicare.net.cn.sdk.ailinksdkdemoandroid.ShowBleActivity.class);
Intent intent = new Intent(this, ShowBleActivity.class);
intent.putExtra("type", tyep);
startActivity(intent);
}

+ 262
- 52
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ShowBleActivity.java Bestand weergeven

@@ -1,23 +1,32 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid;

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

import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.config.BleConfig;
import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.listener.CallbackDisIm;
import com.pingwang.bluetoothlib.listener.OnCallbackBle;
import com.pingwang.bluetoothlib.listener.OnScanFilterListener;
@@ -26,13 +35,24 @@ import com.pingwang.bluetoothlib.utils.BleLog;
import com.pingwang.bluetoothlib.utils.BleStrUtils;

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

import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.LoadingIosDialogFragment;
import aicare.net.cn.sdk.ailinksdkdemoandroid.find.FindDeviceNewActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.coffee_scale.CoffeeScaleActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.food_temp.FoodTempActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.share_charger.ShareChargerActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.share_condom.ShareCondomActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.share_socket.ShareSocketActivity;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import cn.net.aicare.modulelibrary.module.scooter.SkateboardBleConfig;


/**
@@ -42,6 +62,8 @@ import androidx.appcompat.app.AppCompatActivity;
*/
public class ShowBleActivity extends AppCompatActivity implements OnCallbackBle, OnScanFilterListener {

public static final int REQUEST_PERMISSION_CODE = 1500;

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

private final int BIND_SERVER_OK = 1;
@@ -56,8 +78,12 @@ public class ShowBleActivity extends AppCompatActivity implements OnCallbackBle,
private Intent bindIntent;
private Context mContext;
private int mType;
private boolean mFilter = true;

private String mNoEncryptionMac = "";
private String mFilterName = "";
private String mFilterMac = "";
private int mCid;
private int mVid;
private int mPid;
private Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
@@ -89,8 +115,6 @@ public class ShowBleActivity extends AppCompatActivity implements OnCallbackBle,
}
init();
initData();


}

private void initData() {
@@ -105,22 +129,23 @@ public class ShowBleActivity extends AppCompatActivity implements OnCallbackBle,
Button btn = findViewById(R.id.btn);
Button btn1 = findViewById(R.id.btn1);
Button clear = findViewById(R.id.clear);
final Button filter = findViewById(R.id.filter);
filter.setTag(true);
filter.setText(getString(R.string.filter)+"true");
EditText et_filter_name = findViewById(R.id.et_filter_name);
EditText et_filter_mac = findViewById(R.id.et_filter_mac);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mBluetoothService != null) {
BleLog.i(TAG, "搜索设备");
if (mType == -3) {
mBluetoothService.scanLeDevice(0);

mFilterName = et_filter_name.getText().toString().trim();
mFilterMac = et_filter_mac.getText().toString().trim();
if (mType == BleDeviceConfig.SMART_SCOOTER) {
Map<String, String> map = new HashMap<>();
map.put(SkateboardBleConfig.UUID_BROADCAST.toString(), "37,3,1");//37=0x0025=电滑板的cid
mBluetoothService.scanLeDevice(0, map, BleConfig.UUID_SERVER_AILINK, SkateboardBleConfig.UUID_BROADCAST);
} else {
if (mFilter)
mBluetoothService.scanLeDevice(0, BleConfig.UUID_SERVER_AILINK);
else
mBluetoothService.scanLeDevice(0);
//0000FEE7=手表
mBluetoothService.scanLeDevice(0, BleConfig.UUID_SERVER_AILINK, UUID
.fromString("0000FEE7-0000-1000-8000-00805F9B34FB"), SkateboardBleConfig.UUID_BROADCAST);
}
mList.clear();
listAdapter.notifyDataSetChanged();
@@ -146,16 +171,6 @@ public class ShowBleActivity extends AppCompatActivity implements OnCallbackBle,
}
});

filter.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
boolean m = (Boolean) filter.getTag();
filter.setTag(!m);
mFilter = !m;
filter.setText("过滤:" + mFilter);
}
});

listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList);
listView.setAdapter(listAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@@ -163,15 +178,41 @@ public class ShowBleActivity extends AppCompatActivity implements OnCallbackBle,
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String itemStr = mList.get(position);
String mac = itemStr.split("=")[0];
if (BleDeviceConfig.TOOTHBRUSH_WIFI_BLE==mType){
Intent intent=new Intent();
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.ToothBrushWifiBleActivity.class);
String cidVidPid = itemStr.split("=")[2];
mCid = Integer.parseInt(cidVidPid.split(";")[0]);
mVid = Integer.parseInt(cidVidPid.split(";")[1]);
mPid = Integer.parseInt(cidVidPid.split(";")[2]);
if (mType == BleDeviceConfig.CLEAR_SHAKE_HANDS) {
//验证不握手,不加密的界面使用
BleConfig.setHandshakeStatus(mac, false);
if (mBluetoothService != null) {
mBluetoothService.stopScan();
mBluetoothService.connectDevice(mac);
showLoading();
}
} else if (BleDeviceConfig.TOOTHBRUSH_WIFI_BLE == mType) {
Intent intent = new Intent();
intent.setClass(ShowBleActivity.this, ToothBrushWifiBleActivity.class);
intent.putExtra("type", mType);
intent.putExtra("mac", mac);
startActivity(intent);
finish();

}else {
} else {
if (mCid == BleDeviceConfig.BLE_BOOLD_OXYGEN && mVid == 0x0012) {
//vid=12的不用握手校验,不加密
mNoEncryptionMac = mac;
BleConfig.setHandshakeStatus(mac, false);
} else if (mCid == BleDeviceConfig.SMART_SCOOTER) {
if (mPid == 0x0001) {
//电滑板pid=01的不用握手校验,不加密
BleConfig.setHandshakeStatus(mac, false);
}
mNoEncryptionMac = mac;
} else if (mCid == 0) {
//CID=0不需要握手
BleConfig.setHandshakeStatus(mac, false);
}
if (mBluetoothService != null) {
mBluetoothService.stopScan();
mBluetoothService.connectDevice(mac);
@@ -182,6 +223,14 @@ public class ShowBleActivity extends AppCompatActivity implements OnCallbackBle,
});


// 延迟后请求权限
btn.postDelayed(() -> {
if (isDestroyed()) {
return;
}

checkPermission();
}, 500);
}


@@ -246,11 +295,12 @@ public class ShowBleActivity extends AppCompatActivity implements OnCallbackBle,
public void onScanning(@NonNull BleValueBean data) {
String mAddress = data.getMac();
BleLog.i(TAG, "MAC=" + mAddress + "||CID=" + data.getCid() + "||VID=" + data.getVid() + "||PID=" + data.getPid());
if (!mList.contains(mAddress + "=" + data.getName())) {
String dataStr = mAddress + "=" + data.getName() + "=" + data.getCid() + ";" + data.getVid() + ";" + data.getPid();
if (!mList.contains(dataStr)) {
String data1 = BleStrUtils.byte2HexStr(data.getScanRecord());
String data2 = BleStrUtils.byte2HexStr(data.getManufacturerData());
BleLog.i(TAG, "MAC=" + mAddress + " ||" + data1 + "||" + data2);
mList.add(mAddress + "=" + data.getName());
BleLog.i(TAG, "设备地址+广播数据:" + mAddress + "||" + data1 + "||" + data2);
mList.add(dataStr);
listAdapter.notifyDataSetChanged();
}

@@ -266,73 +316,128 @@ public class ShowBleActivity extends AppCompatActivity implements OnCallbackBle,
@Override
public void onDisConnected(@NonNull String mac, int code) {
dismissLoading();
Toast.makeText(mContext, getString(R.string.disconnect) + code, Toast.LENGTH_SHORT).show();
Toast.makeText(mContext, "连接断开:" + code, Toast.LENGTH_SHORT).show();

}

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

}
dismissLoading();
Intent intent = new Intent();
int type = mType;//默认婴儿秤
switch (type) {
case BleDeviceConfig.BABY_SCALE:
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.BabyCmdActivity.class);
intent.setClass(ShowBleActivity.this, BabyCmdActivity.class);
break;
case BleDeviceConfig.INFRARED_THERMOMETER:
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.TempGunCmdActivity.class);
intent.setClass(ShowBleActivity.this, TempGunCmdActivity.class);
break;
case BleDeviceConfig.BLOOD_PRESSURE:
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.SphyCmdActivity.class);
intent.setClass(ShowBleActivity.this, SphyCmdActivity.class);
break;
case BleDeviceConfig.THERMOMETER:
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.TempCmdActivity.class);
intent.setClass(ShowBleActivity.this, TempCmdActivity.class);
break;
case BleDeviceConfig.HEIGHT_METER:
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.HeightCmdActivity.class);
intent.setClass(ShowBleActivity.this, HeightCmdActivity.class);
break;
case BleDeviceConfig.WEIGHT_BODY_FAT_SCALE:
intent.setClass(ShowBleActivity.this, WeightScaleBleActivity.class);
break;

case BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_AD:
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.ADWeightScaleCmdActivity.class);
intent.setClass(ShowBleActivity.this, ADWeightScaleCmdActivity.class);
break;
case BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_WIFI_BLE:
intent.setClass(ShowBleActivity.this, WeightScaleWifiBleActivity.class);
break;
case BleDeviceConfig.TOOTHBRUSH_WIFI_BLE:
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.ToothBrushWifiBleActivity.class);
intent.setClass(ShowBleActivity.this, ToothBrushWifiBleActivity.class);
break;
case BleDeviceConfig.EIGHT_BODY_FAT_SCALE:
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.EightBodyfatActivity.class);
intent.setClass(ShowBleActivity.this, EightBodyfatActivity.class);
break;
case BleDeviceConfig.BLOOD_GLUCOSE:
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.BloodGlucoseActivity.class);
intent.setClass(ShowBleActivity.this, BloodGlucoseActivity.class);
break;
case BleDeviceConfig.BABY_BODY_FAT:
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.BabyBodyFatCmdActivity.class);
intent.setClass(ShowBleActivity.this, BabyBodyFatCmdActivity.class);
break;
case BleDeviceConfig.SMART_MASK:
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.SmartMaskActivity.class);
intent.setClass(ShowBleActivity.this, SmartMaskActivity.class);
break;
case BleDeviceConfig.SMART_SCOOTER:
intent.setClass(ShowBleActivity.this, SkateboardDataActivity.class);
break;
case BleDeviceConfig.BLE_BOOLD_OXYGEN:
intent.setClass(ShowBleActivity.this, BloodOxygenActivity.class);
break;
case BleDeviceConfig.COFFEE_SCALE:
// 咖啡秤
intent.setClass(ShowBleActivity.this, CoffeeScaleActivity.class);
break;
case BleDeviceConfig.SHARE_CHARGER:
// 共享充电器
intent.setClass(ShowBleActivity.this, ShareChargerActivity.class);
break;
case BleDeviceConfig.SHARE_SOCKET:
// 共享插座
intent.setClass(ShowBleActivity.this, ShareSocketActivity.class);
break;
case BleDeviceConfig.SHARE_CONDOM:
// 共享套套机
intent.setClass(ShowBleActivity.this, ShareCondomActivity.class);
break;
case BleDeviceConfig.FIND_DEVICE:
// 寻物器
// intent.setClass(ShowBleActivity.this, FindDeviceActivity.class);
intent.setClass(ShowBleActivity.this, FindDeviceNewActivity.class);
BleConfig.setHandshakeStatus(mac, false);
break;
case BleDeviceConfig.FOOD_TEMP:
// 食品温度计
intent.setClass(ShowBleActivity.this, FoodTempActivity.class);
break;
case BleDeviceConfig.HEIGHT_BODY_FAT:
intent.setClass(ShowBleActivity.this, HeightWeightScaleActivity.class);
break;
case BleDeviceConfig.TEMP_Humidity:
intent.setClass(ShowBleActivity.this, TempHumidityActivity.class);
break;
// case BleDeviceConfig.BLD_WEIGHT:
// intent.setClass(ShowBleActivity.this, BLDWeightScaleBle.class);
// break;
case -1:
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.BleCmdActivity.class);
intent.setClass(ShowBleActivity.this, BleCmdActivity.class);
break;
case -2:
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.TestCmdActivity.class);
intent.setClass(ShowBleActivity.this, TestCmdActivity.class);
break;
case -3:
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.TestOtaActivity.class);
intent.setClass(ShowBleActivity.this, TestOtaActivity.class);
break;
case -4:
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.TransmissionActivity.class);
intent.setClass(ShowBleActivity.this, TransmissionActivity.class);
break;
case 65536:
//验证不握手不加密的界面
intent.setClass(ShowBleActivity.this, ClearShakeHandsActivity.class);
break;

}

}

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

}
@@ -345,17 +450,32 @@ public class ShowBleActivity extends AppCompatActivity implements OnCallbackBle,

@Override
public void bleClose() {
checkPermission();
}

@Override
public boolean onFilter(BleValueBean bleValueBean) {
int cid = bleValueBean.getCid();
BleLog.i(TAG, "绑定设备广播类型:" + cid + "||添加的类型:" + mType);
if (mType < 0 || mType > 0xFF)
return true;
else
if (mType < 0) {
if (TextUtils.isEmpty(mFilterName) && TextUtils.isEmpty(mFilterMac)) {
return true;
}
if (!TextUtils.isEmpty(mFilterName)) {
String name = bleValueBean.getName();
if (name != null && name.toUpperCase().contains(mFilterName.toUpperCase())) {
return true;
}
}
if (!TextUtils.isEmpty(mFilterMac)) {
String mac = bleValueBean.getMac().replace(":", "").toUpperCase().trim();
return mac.contains(mFilterMac.toUpperCase());
}
return false;
} else {
return mType == cid;
}

}

@Override
@@ -363,6 +483,13 @@ public class ShowBleActivity extends AppCompatActivity implements OnCallbackBle,
//TODO 过滤后的设备
}

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

//--------------------------start Loading--------------------------
private LoadingIosDialogFragment mDialogFragment;
@@ -399,6 +526,89 @@ public class ShowBleActivity extends AppCompatActivity implements OnCallbackBle,
@Override
protected void onDestroy() {
super.onDestroy();
if (mBluetoothService != null) {
mBluetoothService.stopScan();
}
unbindService();
}


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

/**
* 检查权限
*/
private void checkPermission() {
// 没有蓝牙权限就请求蓝牙权限
if (!hasBluetooth()) {
requestBluetooth();
return;
}
// 没有定位权限就请求定位权限
if (!hasLocationPermission()) {
requestLocationPermission(this);
return;
}
// 没有定位服务就请求定位服务
if (!hasLocationService()) {
requestLocationService();
return;
}
// 都有了,OK
Toast.makeText(mContext, "权限都有,可以开始搜索", Toast.LENGTH_SHORT).show();
}

/**
* 是否有定位权限
*
* @return boolean
*/
private boolean hasLocationPermission() {
return ActivityCompat.checkSelfPermission(mContext, 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) mContext.getSystemService(Context.LOCATION_SERVICE);
if (locationManager == null) {
return false;
}
return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
}

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

/**
* 申请打开蓝牙
*/
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);
}
}

+ 1371
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/SkateboardDataActivity.java
Diff onderdrukt omdat het te groot bestand
Bestand weergeven


+ 78
- 3
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/SmartMaskActivity.java Bestand weergeven

@@ -20,11 +20,11 @@ import com.pingwang.bluetoothlib.listener.OnCallbackDis;
import com.pingwang.bluetoothlib.listener.OnScanFilterListener;
import com.pingwang.bluetoothlib.utils.BleLog;
import com.pingwang.bluetoothlib.utils.BleStrUtils;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;

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

import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import butterknife.BindView;
@@ -54,7 +54,14 @@ public class SmartMaskActivity extends BleBaseActivity implements OnCallbackDis,
ListView mListview;
@BindView(R.id.get_version)
Button mGetVersion;

@BindView(R.id.get_AIQ)
Button mGetAIQ;
@BindView(R.id.close_power)
Button closePower;
@BindView(R.id.set_mode)
Button setMode;
@BindView(R.id.set_payload)
Button setPayload;
private List<String> mList;
private ArrayAdapter listAdapter;
private Context mContext;
@@ -63,6 +70,8 @@ public class SmartMaskActivity extends BleBaseActivity implements OnCallbackDis,
private BleSendCmdUtil mBleSendCmdUtil;
private int type = SmartMaskBleConfig.SMART_MASK;
private int mFanStatus = 0;
private boolean showPayload;


private Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override
@@ -102,6 +111,11 @@ public class SmartMaskActivity extends BleBaseActivity implements OnCallbackDis,
mSetFan.setOnClickListener(this);
mGetVersion.setOnClickListener(this);

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


}

@@ -141,7 +155,18 @@ public class SmartMaskActivity extends BleBaseActivity implements OnCallbackDis,
mDevice.setFanStatus(mFanStatus);
}
break;

case R.id.get_AIQ:
if (mDevice != null) mDevice.getIAQData();
break;
case R.id.set_mode:
if (mDevice != null) mDevice.setTestMode();
break;
case R.id.close_power:
if (mDevice != null) mDevice.closePower();
break;
case R.id.set_payload:
showPayload = true;
break;
}
}

@@ -232,6 +257,38 @@ public class SmartMaskActivity extends BleBaseActivity implements OnCallbackDis,
//-----------------通知-------------------


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

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

}
}

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


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

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

@@ -314,6 +371,24 @@ public class SmartMaskActivity extends BleBaseActivity implements OnCallbackDis,
}


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

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

+ 22
- 12
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/SphyCmdActivity.java Bestand weergeven

@@ -8,6 +8,7 @@ import android.os.Message;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;

import com.pingwang.bluetoothlib.BleBaseActivity;
@@ -15,6 +16,7 @@ import com.pingwang.bluetoothlib.config.CmdConfig;
import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.device.BleSendCmdUtil;
import com.pingwang.bluetoothlib.device.SendBleBean;
import com.pingwang.bluetoothlib.device.SendMcuBean;
import com.pingwang.bluetoothlib.listener.CallbackDisIm;
import com.pingwang.bluetoothlib.listener.OnBleCompanyListener;
import com.pingwang.bluetoothlib.listener.OnBleVersionListener;
@@ -48,6 +50,7 @@ public class SphyCmdActivity extends BleBaseActivity implements OnCallbackDis, O
private ArrayAdapter listAdapter;

private Context mContext;
private EditText et_type;
private SphyDeviceData mBleDevice;
private String mAddress;
private BleSendCmdUtil mBleSendCmdUtil;
@@ -95,10 +98,12 @@ public class SphyCmdActivity extends BleBaseActivity implements OnCallbackDis, O
});


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

cmdBtn();
}
@@ -153,7 +158,12 @@ public class SphyCmdActivity extends BleBaseActivity implements OnCallbackDis, O
sendBleBean.setHex(mBleSendCmdUtil.getDid());
mBleDevice.sendData(sendBleBean);
break;

case R.id.btn1:
String cmd = et_type.getText().toString().trim();
SendMcuBean sendDataBean = new SendMcuBean();
sendDataBean.setHex(type,cmd.getBytes());
mBleDevice.sendData(sendDataBean);
break;
case R.id.clear:
if (mList != null)
mList.clear();
@@ -258,7 +268,7 @@ public class SphyCmdActivity extends BleBaseActivity implements OnCallbackDis, O

@Override
public void getSphyCmd(byte cmd) {
mList.add(TimeUtils.getTime() + "cmd:" + cmd);
mList.add(TimeUtils.getTime() + "指令:" + cmd);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@@ -266,7 +276,7 @@ public class SphyCmdActivity extends BleBaseActivity implements OnCallbackDis, O
public void sphyDataNow(int dia, int sys, int decimal, int pul, int unit) {
String diaStr = BleDensityUtil.getInstance().holdDecimals(dia, decimal);
String sysStr = BleDensityUtil.getInstance().holdDecimals(sys, decimal);
mList.add(TimeUtils.getTime() + "current:dia=" + diaStr + " sys=" + sysStr + " pul=" + pul + " unit=" + unit);
mList.add(TimeUtils.getTime() + "实时:dia=" + diaStr + "sys=" + sysStr + "pul=" + pul + "unit" + "=" + unit);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@@ -274,7 +284,7 @@ public class SphyCmdActivity extends BleBaseActivity implements OnCallbackDis, O
public void sphyData(int dia, int sys, int decimal, int pul, int unit) {
String diaStr = BleDensityUtil.getInstance().holdDecimals(dia, decimal);
String sysStr = BleDensityUtil.getInstance().holdDecimals(sys, decimal);
mList.add(TimeUtils.getTime() + "result:dia=" + diaStr + " sys=" + sysStr + " pul=" + pul + " unit=" + unit);
mList.add(TimeUtils.getTime() + "稳定:dia=" + diaStr + "sys=" + sysStr + "pul=" + pul + "unit" + "=" + unit);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@@ -283,31 +293,31 @@ public class SphyCmdActivity extends BleBaseActivity implements OnCallbackDis, O
String showData = "";
switch (unit) {
case CmdConfig.SETTING_SUCCESS:
showData = getString(R.string.set_success);
showData = "设置单位成功";
break;
case CmdConfig.SETTING_FAILURE:
showData = getString(R.string.set_failure);
showData = "设置单位失败";

break;
case CmdConfig.SETTING_ERR:

showData = getString(R.string.set_err);
showData = "设置单位错误";
break;
}
mList.add(TimeUtils.getTime() + showData+" unit="+SphyCmdActivity.this.unit);
mList.add(TimeUtils.getTime() + showData);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

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

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

@@ -320,7 +330,7 @@ public class SphyCmdActivity extends BleBaseActivity implements OnCallbackDis, O

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

@@ -329,7 +339,7 @@ public class SphyCmdActivity extends BleBaseActivity implements OnCallbackDis, O
String time =
times[0] + "-" + times[1] + "-" + times[2] + " " + times[3] + ":" + times[4] +
":" + times[5];
mList.add(TimeUtils.getTime() + "system Time:" + time);
mList.add(TimeUtils.getTime() + "系统时间:" + time);
mHandler.sendEmptyMessage(REFRESH_DATA);
}


+ 10
- 3
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TempCmdActivity.java Bestand weergeven

@@ -24,11 +24,11 @@ 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.utils.TimeUtils;

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

import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.thermometer.TempDeviceData;
@@ -37,7 +37,7 @@ import cn.net.aicare.modulelibrary.module.thermometer.TempDeviceData;
/**
* xing<br>
* 2019/4/25<br>
* 显示数据
* 体温计
*/
public class TempCmdActivity extends BleBaseActivity implements OnCallbackDis, OnBleVersionListener, OnMcuParameterListener, OnBleCompanyListener, View.OnClickListener {

@@ -50,6 +50,7 @@ public class TempCmdActivity extends BleBaseActivity implements OnCallbackDis, O
* 服务Intent
*/
private Context mContext;
private EditText et_type;
private TempDeviceData mBleDevice;
private String mAddress;
private BleSendCmdUtil mBleSendCmdUtil;
@@ -91,6 +92,7 @@ public class TempCmdActivity extends BleBaseActivity implements OnCallbackDis, O
findViewById(R.id.btnBattery).setOnClickListener(this);
findViewById(R.id.btn_get_did).setOnClickListener(this);
findViewById(R.id.clear).setOnClickListener(this);
et_type = findViewById(R.id.et_type);

cmdBtn();
}
@@ -129,7 +131,12 @@ public class TempCmdActivity extends BleBaseActivity implements OnCallbackDis, O
sendBleBean.setHex(mBleSendCmdUtil.getDid());
mBleDevice.sendData(sendBleBean);
break;

case R.id.btn1:
String cmd = et_type.getText().toString().trim();
SendMcuBean sendDataBean = new SendMcuBean();
sendDataBean.setHex(type,cmd.getBytes());
mBleDevice.sendData(sendDataBean);
break;
case R.id.clear:
if (mList != null)
mList.clear();

+ 11
- 6
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TempGunCmdActivity.java Bestand weergeven

@@ -25,24 +25,22 @@ 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.utils.TimeUtils;

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

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



/**
* xing<br>
* 2019/4/25<br>
* 显示数据
* 额温枪
*/
public class TempGunCmdActivity extends BleBaseActivity implements OnCallbackDis,
OnBleVersionListener, TempGunDeviceData.onNotifyData , OnBleCompanyListener, OnMcuParameterListener, View.OnClickListener {
public class TempGunCmdActivity extends BleBaseActivity implements OnCallbackDis, OnBleVersionListener, TempGunDeviceData.onNotifyData , OnBleCompanyListener, OnMcuParameterListener, View.OnClickListener {

private static String TAG = TempGunCmdActivity.class.getName();
private final int REFRESH_DATA = 3;
@@ -53,6 +51,7 @@ public class TempGunCmdActivity extends BleBaseActivity implements OnCallbackDis
* 服务Intent
*/
private Context mContext;
private EditText et_type;
private TempGunDeviceData mBleDevice;
private String mAddress;
private BleSendCmdUtil mBleSendCmdUtil;
@@ -94,6 +93,7 @@ public class TempGunCmdActivity extends BleBaseActivity implements OnCallbackDis
findViewById(R.id.btnBattery).setOnClickListener(this);
findViewById(R.id.btn_get_did).setOnClickListener(this);
findViewById(R.id.clear).setOnClickListener(this);
et_type = findViewById(R.id.et_type);

cmdBtn();
}
@@ -135,7 +135,12 @@ public class TempGunCmdActivity extends BleBaseActivity implements OnCallbackDis
sendBleBean.setHex(mBleSendCmdUtil.getDid());
mBleDevice.sendData(sendBleBean);
break;

case R.id.btn1:
String cmd = et_type.getText().toString().trim();
SendMcuBean sendDataBean = new SendMcuBean();
sendDataBean.setHex(type,cmd.getBytes());
mBleDevice.sendData(sendDataBean);
break;
case R.id.clear:
if (mList != null)
mList.clear();

+ 299
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TempHumidityActivity.java Bestand weergeven

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

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

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

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

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.TempHumidity.TempHumidityBleUtils;

/**
* 温湿度计
*/
public class TempHumidityActivity extends BleBaseActivity implements OnCallbackBle, TempHumidityBleUtils.BleDataCallBack, View.OnClickListener {
private String mAddress = "";
private List<String> logList;
private List<String> historyLogList;
private List<Long> historyLogListId;
private ListView listView;
private ListView list_view_history;
private ArrayAdapter listAdapter;
private ArrayAdapter historyListAdapter;
private MHandler mMHandler;
private EditText et_history;
private boolean isHeart;
private final int HEART = 1;
private TextView tv_result;


@Override
public void onServiceSuccess() {
mBluetoothService.setOnCallback(this);
logList.add(0, "绑定服务成功");
if (mBluetoothService != null) {
mBluetoothService.setOnCallback(this);
mBluetoothService.deviceConnectListener(mAddress, true);
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress);
if (bleDevice != null) {
TempHumidityBleUtils.init(bleDevice);
TempHumidityBleUtils.getInstance().setBleDataCallBack(this);
} else {
mBluetoothService.disconnectAll();
startScanBle(0);
}
}

}

@Override
public void onServiceErr() {

}

@Override
public void unbindServices() {

}


@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_temp_humidity);
mAddress = getIntent().getStringExtra("mac");
logList = new ArrayList<>();
historyLogList = new ArrayList<>();
historyLogListId = new ArrayList<>();

listView = findViewById(R.id.listView);
list_view_history = findViewById(R.id.list_view_history);
tv_result = findViewById(R.id.tv_result);
et_history = findViewById(R.id.et_history);
mMHandler = new WeakReference<>(new MHandler()).get();
findViewById(R.id.btn_slow).setOnClickListener(this);
findViewById(R.id.btn_fat).setOnClickListener(this);
findViewById(R.id.btn_history).setOnClickListener(this);
findViewById(R.id.btn_hear).setOnClickListener(this);
findViewById(R.id.btn_show_history).setOnClickListener(this);
findViewById(R.id.btn_clear).setOnClickListener(this);


listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, logList);
historyListAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, historyLogList);
listView.setAdapter(listAdapter);
list_view_history.setAdapter(historyListAdapter);
}

@Override
public void onStartScan() {

}

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


}

@Override
public void onScanTimeOut() {

}

@Override
public void onConnecting(String mac) {

}

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

}

}

@Override
public void onConnectionSuccess(String mac) {
stopScanBle();

logList.add(0, "连接成功" + mac);

}

@Override
public void onServicesDiscovered(String mac) {
if (mac.equalsIgnoreCase(mAddress)) {
stopScanBle();

BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress);
if (bleDevice != null) {
TempHumidityBleUtils.init(bleDevice);
TempHumidityBleUtils.getInstance().setBleDataCallBack(this);

}
}
}

@Override
public void bleOpen() {

}

@Override
public void bleClose() {

}


@Override
public void onClick(View v) {
if (TempHumidityBleUtils.getInstance() != null) {

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

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

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

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


} else {
isHeart = false;
mMHandler.removeMessages(HEART);
logList.add(0, "关闭心跳");
}
listAdapter.notifyDataSetChanged();

break;
case R.id.btn_clear:
logList.clear();
historyLogListId.clear();
historyLogList.clear();
listAdapter.notifyDataSetChanged();
historyListAdapter.notifyDataSetChanged();
break;
}
}
}

@Override
public void onDeviceStatus(int battery, long time, float temp, float humidity) {
logList.add(0, "设备状态 电池电量:" + battery + "\n时间:" + time + " 温度: " + temp + " 湿度:" + humidity);
listAdapter.notifyDataSetChanged();

}

@Override
public void onOffLineRecordNum(long total, long sendNum) {
logList.add(0, "历史记录 总量:" + total + "发送量:" + sendNum);

if (total == sendNum) {
if (historyLogListId.size() > 0) {
Collections.sort(historyLogListId);
tv_result.setText("总:" + historyLogListId.size() + "开:" + historyLogListId.get(0) + "结:" + historyLogListId.get(historyLogList.size() - 1));
} else {
tv_result.setText("");

}
}
listAdapter.notifyDataSetChanged();

}

@Override
public void onOffLineRecord(long time, float temp, float humidity) {
historyLogList.add(0, "时间:" + time + " 温度: " + temp + " 湿度:" + humidity);
historyLogListId.add(time);

}

public class MHandler extends Handler {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case HEART:
if (TempHumidityBleUtils.getInstance() != null) {
TempHumidityBleUtils.getInstance().getDeviceStatus();
mMHandler.sendEmptyMessageDelayed(HEART, 5000);
}

break;

}
}
}

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

+ 9
- 10
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TestCmdActivity.java Bestand weergeven

@@ -34,10 +34,9 @@ import androidx.annotation.Nullable;
/**
* xing<br>
* 2019/4/25<br>
* 显示数据
* 测试指令界面
*/
public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, OnBleDeviceDataListener,
View.OnClickListener {
public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, OnBleDeviceDataListener, View.OnClickListener {

private static String TAG = TestCmdActivity.class.getName();
private final int REFRESH_DATA = 3;
@@ -67,8 +66,7 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O
case SEND_DATA:

if (sendUuid != null && sendUuidServer != null) {
SendDataBean sendDataBean = new SendDataBean(sendCmd.getBytes(), sendUuid
, BleConfig.WRITE_DATA, sendUuidServer);
SendDataBean sendDataBean = new SendDataBean(sendCmd.getBytes(), sendUuid, BleConfig.WRITE_DATA, sendUuidServer);
bleDevice.sendData(sendDataBean);
mHandler.sendEmptyMessageDelayed(SEND_DATA, sendTime);
}
@@ -135,8 +133,7 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O
sendUuid = UUID.fromString(uuid);
break;
case R.id.btn_uuid_server:
String uuidServer =
et_uuid_server.getText().toString().trim().toUpperCase(Locale.ENGLISH);
String uuidServer = et_uuid_server.getText().toString().trim().toUpperCase(Locale.ENGLISH);
if (uuidServer.length() == 8) {
uuidServer += uuidEnd;
}
@@ -172,7 +169,11 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O
UUID UUID_NOTIFY = UUID.fromString(notify);
if (bleDevice != null && sendUuidServer != null) {
// bleDevice.setNotify(notifyOpen);
bleDevice.setNotify(sendUuidServer,UUID_NOTIFY);
if (notifyOpen) {
bleDevice.setNotify(sendUuidServer, UUID_NOTIFY);
} else {
bleDevice.setCloseNotify(sendUuidServer, UUID_NOTIFY);
}

}
}
@@ -263,8 +264,6 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O
}




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

+ 72
- 62
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TestOtaActivity.java Bestand weergeven

@@ -16,6 +16,7 @@ import android.provider.Settings;
import android.text.TextUtils;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
@@ -44,16 +45,16 @@ import androidx.core.app.ActivityCompat;
/**
* xing<br>
* 2019/4/25<br>
* 显示数据
* OTA测试界面
*/
public class TestOtaActivity extends BleBaseActivity implements OnCallbackBle,
OnBleDeviceDataListener, View.OnClickListener, OnBleOTAListener, ShowListDialogFragment.onDialogListener {
public class TestOtaActivity extends BleBaseActivity implements OnCallbackBle, OnBleDeviceDataListener, View.OnClickListener, OnBleOTAListener, ShowListDialogFragment.onDialogListener {

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

private TextView mTvVersion;
private Button btn_shake_hands;

private List<String> mList;
private ArrayAdapter listAdapter;
@@ -63,6 +64,7 @@ public class TestOtaActivity extends BleBaseActivity implements OnCallbackBle,

private ArrayList<DialogStringImageAdapter.DialogStringImageBean> mDialogList;
private String mOTAFileName;
private DialogOtaManager mDialogOtaManager;
private Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
@@ -98,29 +100,31 @@ public class TestOtaActivity extends BleBaseActivity implements OnCallbackBle,
ListView listView = findViewById(R.id.listview);
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList);
listView.setAdapter(listAdapter);

mTvVersion = findViewById(R.id.tv_version);
btn_shake_hands = findViewById(R.id.btn_shake_hands);
btn_shake_hands.setTag(false);
findViewById(R.id.btn_ota_connect).setOnClickListener(this);
findViewById(R.id.btn_ota_dis).setOnClickListener(this);
findViewById(R.id.btn_ota_file).setOnClickListener(this);
findViewById(R.id.btn_ota_start).setOnClickListener(this);
mTvVersion=findViewById(R.id.tv_version);
findViewById(R.id.btn_ota_start_585).setOnClickListener(this);
findViewById(R.id.btn_ota_start_531).setOnClickListener(this);
findViewById(R.id.btn_ota_start_580).setOnClickListener(this);
btn_shake_hands.setOnClickListener(this);

mOTAFileName = SP.getInstance().getOtaFileName();
if (mOTAFileName.isEmpty())
mTvVersion.setText("xxxxxxxx");
else
mTvVersion.setText(mOTAFileName);
mDialogList=new ArrayList<>();
mDialogList = new ArrayList<>();

}



@Override
public void onItemListener(int position) {
if (mDialogList.size() > position) {
DialogStringImageAdapter.DialogStringImageBean dialogStringImageBean = mDialogList
.get(position);
DialogStringImageAdapter.DialogStringImageBean dialogStringImageBean = mDialogList.get(position);
String name = dialogStringImageBean.getName();
mOTAFileName = name;
SP.getInstance().putOtaFileName(name);
@@ -133,15 +137,15 @@ public class TestOtaActivity extends BleBaseActivity implements OnCallbackBle,
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_ota_connect:
if (mBleDevice==null&&!TextUtils.isEmpty(mAddress)){
if (mBleDevice == null && !TextUtils.isEmpty(mAddress)) {
connectBle(mAddress);
}
break;

case R.id.btn_ota_dis:
if (mBleDevice!=null){
if (mBleDevice != null) {
mBleDevice.disconnect();
mBleDevice=null;
mBleDevice = null;
}
break;
case R.id.btn_ota_file:
@@ -151,21 +155,23 @@ public class TestOtaActivity extends BleBaseActivity implements OnCallbackBle,
mDialogList.add(new DialogStringImageAdapter.DialogStringImageBean(s, 0));
}

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

case R.id.btn_ota_start:
if (mOTAFileName.isEmpty()) {
Toast.makeText(mContext, "请先选择文件", Toast.LENGTH_SHORT).show();
return;
}
String byFileName = FileUtils.getByFileName()+mOTAFileName;
mList.add(TimeUtils.getTime() + "OTA已开始,请耐心等待");
mHandler.sendEmptyMessage(REFRESH_DATA);
DialogOtaManager build = DialogOtaManager.newBuilder().setOnBleOTAListener(this).setFilePath(byFileName).build(mBleDevice);
build.startOta();
case R.id.btn_ota_start_585:
startOta(DialogOtaManager.IC_TYPE_585);
break;
case R.id.btn_ota_start_531:
startOta(DialogOtaManager.IC_TYPE_531);
break;
case R.id.btn_ota_start_580:
startOta(DialogOtaManager.IC_TYPE_580);
break;
case R.id.btn_shake_hands:
boolean status = (boolean) btn_shake_hands.getTag();
btn_shake_hands.setTag(!status);
btn_shake_hands.setText("握手:" + !status);
break;


@@ -173,21 +179,31 @@ public class TestOtaActivity extends BleBaseActivity implements OnCallbackBle,
}


private void startOta(int icType){
if (mOTAFileName.isEmpty()) {
Toast.makeText(mContext, "请先选择文件", Toast.LENGTH_SHORT).show();
return;
}
String byFileName = FileUtils.getByFileName() + mOTAFileName;
mList.add(TimeUtils.getTime() + "OTA已开始,请耐心等待");
mHandler.sendEmptyMessage(REFRESH_DATA);
mDialogOtaManager= DialogOtaManager.newBuilder().setOnBleOTAListener(this).setFilePath(byFileName).setIcType(icType).build(mBleDevice);
// mBleDevice.setOnDialogOTAListener(this);
// mBleDevice.startDialogOta(byFileName, icType,((Boolean) btn_shake_hands.getTag()));
}


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

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode != 1) {
return;
@@ -196,19 +212,16 @@ public class TestOtaActivity extends BleBaseActivity implements OnCallbackBle,
} else {
if (ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[0])) {
//权限请求失败,但未选中“不再提示”选项
new AlertDialog.Builder(this).setTitle("提示").setMessage("请求使用定位权限搜索蓝牙设备")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//引导用户至设置页手动授权
Intent intent =
new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getApplicationContext()
.getPackageName(), null);
intent.setData(uri);
startActivity(intent);
}
}).setNegativeButton("取消", new DialogInterface.OnClickListener() {
new AlertDialog.Builder(this).setTitle("提示").setMessage("请求使用定位权限搜索蓝牙设备").setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//引导用户至设置页手动授权
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getApplicationContext().getPackageName(), null);
intent.setData(uri);
startActivity(intent);
}
}).setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (dialog != null) {
@@ -220,19 +233,16 @@ public class TestOtaActivity extends BleBaseActivity implements OnCallbackBle,
} else {
//权限请求失败,选中“不再提示”选项
// T.showShort(MainActivity.this, "获取权限失败");
new AlertDialog.Builder(this).setTitle("提示").setMessage("请求使用定位权限搜索蓝牙设备")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//引导用户至设置页手动授权
Intent intent =
new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getApplicationContext()
.getPackageName(), null);
intent.setData(uri);
startActivity(intent);
}
}).setNegativeButton("取消", new DialogInterface.OnClickListener() {
new AlertDialog.Builder(this).setTitle("提示").setMessage("请求使用定位权限搜索蓝牙设备").setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//引导用户至设置页手动授权
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getApplicationContext().getPackageName(), null);
intent.setData(uri);
startActivity(intent);
}
}).setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (dialog != null) {
@@ -257,7 +267,9 @@ public class TestOtaActivity extends BleBaseActivity implements OnCallbackBle,
if (mBluetoothService != null) {
mBleDevice = mBluetoothService.getBleDevice(mAddress);
mBluetoothService.setOnCallback(this);

if (mDialogOtaManager != null) {
mDialogOtaManager.setOnBleOTAListener(this);
}
}
}

@@ -319,7 +331,6 @@ public class TestOtaActivity extends BleBaseActivity implements OnCallbackBle,
//-----------------通知-------------------



@Override
protected void onDestroy() {
super.onDestroy();
@@ -336,7 +347,7 @@ public class TestOtaActivity extends BleBaseActivity implements OnCallbackBle,
}

@Override
public void onOtaFailure(int cmd ,String err) {
public void onOtaFailure(int cmd, String err) {
mList.add(TimeUtils.getTime() + "OTA失败:" + err);
mHandler.sendEmptyMessage(REFRESH_DATA);
if (mBleDevice != null) {
@@ -346,9 +357,8 @@ public class TestOtaActivity extends BleBaseActivity implements OnCallbackBle,

private int progressOld;


@Override
public void onOtaProgress(float progress, int currentCount, int maxCount) {
public void onOtaProgress(float progress,int currentCount,int maxCount) {
int progressInt = (int) progress;
if (progressOld != progressInt) {
progressOld = progressInt;

+ 0
- 18
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TimeUtils.java Bestand weergeven

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

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

/**
* xing<br>
* 2019/5/25<br>
* java类作用描述
*/
public class TimeUtils {

public static String getTime(){
SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss", Locale.US);
return format.format(System.currentTimeMillis())+":\n";
}

}

+ 10
- 6
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ToothBrushWifiBleActivity.java Bestand weergeven

@@ -24,10 +24,14 @@ import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

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

/**
* Wifi+ble 牙刷
*/
public class ToothBrushWifiBleActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, ToothBrushWiFiBleUtilsData.BleToothBrushWiFiCallback, ToothBrushWiFiBleUtilsData.BleToothBrushCallback {
private String TAG = ToothBrushWifiBleActivity.class.getName();
private String mAddress;
@@ -54,7 +58,7 @@ public class ToothBrushWifiBleActivity extends BleBaseActivity implements View.O
findViewById(R.id.default_try_out).setOnClickListener(this);
findViewById(R.id.default_time_mode).setOnClickListener(this);
findViewById(R.id.default_mode).setOnClickListener(this);
// findViewById(R.id.ota).setOnClickListener(this);
findViewById(R.id.ota).setOnClickListener(this);

mEditText = findViewById(R.id.select_wifi_et);
select_gears_et = findViewById(R.id.select_gears_et);
@@ -351,11 +355,11 @@ public class ToothBrushWifiBleActivity extends BleBaseActivity implements View.O
mToothBrushWiFiBleUtilsData.getdefaultGearAndDuration();
break;

// case R.id.ota:
//
// mToothBrushWiFiBleUtilsData.setOta();
//
// break;
case R.id.ota:
mToothBrushWiFiBleUtilsData.setOta();
break;
}

}

+ 13
- 5
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TpmsConnectCmdActivity.java Bestand weergeven

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

import android.content.Context;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
@@ -15,6 +16,7 @@ import com.pingwang.bluetoothlib.BleBaseActivity;
import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.device.BleSendCmdUtil;
import com.pingwang.bluetoothlib.device.SendBleBean;
import com.pingwang.bluetoothlib.device.SendMcuBean;
import com.pingwang.bluetoothlib.listener.CallbackDisIm;
import com.pingwang.bluetoothlib.listener.OnBleCompanyListener;
import com.pingwang.bluetoothlib.listener.OnBleVersionListener;
@@ -32,15 +34,13 @@ import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.tpms.TpmsDeviceData;



/**
* xing<br>
* 2019/9/2<br>
* 显示数据
* tpms连接版
*/
public class TpmsConnectCmdActivity extends BleBaseActivity implements OnCallbackDis,
TpmsDeviceData.onNotifyData, TpmsDeviceData.onTpmsSetting, TpmsDeviceData.onTpmsInfo, OnBleVersionListener,
OnMcuParameterListener, OnBleCompanyListener, View.OnClickListener {
TpmsDeviceData.onNotifyData, TpmsDeviceData.onTpmsSetting, TpmsDeviceData.onTpmsInfo, OnBleVersionListener, OnMcuParameterListener, OnBleCompanyListener, View.OnClickListener {

private static String TAG = TpmsConnectCmdActivity.class.getName();
private final int REFRESH_DATA = 3;
@@ -51,6 +51,7 @@ public class TpmsConnectCmdActivity extends BleBaseActivity implements OnCallbac
* 服务Intent
*/
private Context mContext;
private EditText et_type;
private TpmsDeviceData mBleDevice;
private String mAddress;
private BleSendCmdUtil mBleSendCmdUtil;
@@ -72,6 +73,7 @@ public class TpmsConnectCmdActivity extends BleBaseActivity implements OnCallbac
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//禁止横屏
setContentView(R.layout.activity_height);
mContext = this;
mAddress = getIntent().getStringExtra("mac");
@@ -92,6 +94,7 @@ public class TpmsConnectCmdActivity extends BleBaseActivity implements OnCallbac
findViewById(R.id.btnVersion).setOnClickListener(this);
findViewById(R.id.btnBattery).setOnClickListener(this);
findViewById(R.id.btn_get_did).setOnClickListener(this);
et_type = findViewById(R.id.et_type);

cmdBtn();
}
@@ -131,7 +134,12 @@ public class TpmsConnectCmdActivity extends BleBaseActivity implements OnCallbac
sendBleBean.setHex(mBleSendCmdUtil.getDid());
mBleDevice.sendData(sendBleBean);
break;

case R.id.btn1:
String cmd = et_type.getText().toString().trim();
SendMcuBean sendDataBean = new SendMcuBean();
sendDataBean.setHex(type,cmd.getBytes());
mBleDevice.sendData(sendDataBean);
break;
case R.id.clear:
if (mList != null)
mList.clear();

+ 8
- 8
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TransmissionActivity.java Bestand weergeven

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

import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
@@ -9,21 +10,23 @@ import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;

import androidx.annotation.Nullable;

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

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

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

/**
* 透传界面
*/
public class TransmissionActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, TransmissionDeviceData.MyBleCallback {
private EditText et, et_cid;
private Button send, bt_clear, bt_clear_log,bt_cid;
@@ -68,6 +71,7 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//禁止横屏
setContentView(R.layout.activity_transmission);
WeakReference weakReference = new WeakReference(new MHandler());
mMHandler = (MHandler) weakReference.get();
@@ -97,10 +101,6 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic
byte[] hexStr = BleStrUtils.stringToByte(hex);
String cid = et_cid.getText().toString().toUpperCase().trim();
int hexStrCid = Integer.parseInt(cid, 16);




if (mTransmissionDeviceData != null) {
mTransmissionDeviceData.setSendData(hexStrCid, hexStr);
}
@@ -125,7 +125,7 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic

@Override
public void showdata(String data) {
mlogList.add(0, "收 payload数据"+TimeUtils.getTime()+data);
mlogList.add(0, "收 payload数据"+ TimeUtils.getTime()+data);
mMHandler.sendEmptyMessage(ToRefreUi);
}


+ 0
- 101
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/UserAdapter.java Bestand weergeven

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


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

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

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

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

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

private List<User> mUser;
private Context mContext;

public UserAdapter(Context context, List<User> mUser) {
this.mContext = context;
this.mUser = mUser;
}


@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new ViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_user_info,parent));
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {

}


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

class ViewHolder extends RecyclerView.ViewHolder implements SeekBar.OnSeekBarChangeListener {

private TextView id;
private SeekBar agesb, heightsb, weightsb, adcsb;


public ViewHolder(@NonNull View itemView) {
super(itemView);
id = itemView.findViewById(R.id.id);
agesb = itemView.findViewById(R.id.adcsb);
agesb.setOnSeekBarChangeListener(this);
heightsb = itemView.findViewById(R.id.heightsb);
heightsb.setOnSeekBarChangeListener(this);
weightsb = itemView.findViewById(R.id.weightsb);
weightsb.setOnSeekBarChangeListener(this);
adcsb = itemView.findViewById(R.id.adcsb);
adcsb.setOnSeekBarChangeListener(this);

}

@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
int id = seekBar.getId();
User user = mUser.get(getLayoutPosition());
if (id == R.id.weightsb) {
user.setWeight(progress);

} else if (id == R.id.adcsb) {
user.setAdc(progress);

} else if (id == R.id.heightsb) {
user.setHeight(progress);

} else if (id == R.id.age) {
user.setAge(progress);

}


}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {

}
}


}

+ 4
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/WeightScaleBleActivity.java Bestand weergeven

@@ -26,6 +26,7 @@ import java.util.ArrayList;
import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.AddUserDialog;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.BodyFatScale.AppHistoryRecordBean;
import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatBleUtilsData;
@@ -34,6 +35,9 @@ import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatRecord;
import cn.net.aicare.modulelibrary.module.BodyFatScale.McuHistoryRecordBean;
import cn.net.aicare.modulelibrary.module.BodyFatScale.User;

/**
* Ble体脂秤
*/
public class WeightScaleBleActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, BodyFatBleUtilsData.BleBodyFatCallback {
private String TAG = WeightScaleBleActivity.class.getName();
private String mAddress;

+ 25
- 21
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/WeightScaleWifiBleActivity.java Bestand weergeven

@@ -31,6 +31,7 @@ import java.util.HashMap;
import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.WifiDialog;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.BodyFatScale.AppHistoryRecordBean;
import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatBleUtilsData;
@@ -38,6 +39,9 @@ import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatDataUtil;
import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatRecord;
import cn.net.aicare.modulelibrary.module.BodyFatScale.McuHistoryRecordBean;

/**
* wifi+ble体脂秤
*/
public class WeightScaleWifiBleActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, BodyFatBleUtilsData.BleBodyFatCallback, BodyFatBleUtilsData.BleBodyFatWiFiCallback {
private String TAG = WeightScaleWifiBleActivity.class.getName();
private String mAddress;
@@ -85,8 +89,8 @@ public class WeightScaleWifiBleActivity extends BleBaseActivity implements View.
findViewById(R.id.setedname).setOnClickListener(this);
findViewById(R.id.setedpaw).setOnClickListener(this);
findViewById(R.id.setedmac).setOnClickListener(this);
// findViewById(R.id.ota).setOnClickListener(this);
// findViewById(R.id.surroundings).setOnClickListener(this);
findViewById(R.id.ota).setOnClickListener(this);
findViewById(R.id.surroundings).setOnClickListener(this);
mEditText = findViewById(R.id.select_wifi_et);
kg = findViewById(R.id.kg);
jing = findViewById(R.id.jin);
@@ -590,25 +594,25 @@ public class WeightScaleWifiBleActivity extends BleBaseActivity implements View.
case R.id.disconnect:
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().disconnectWifi());
break;
// case R.id.ota:
//// bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().ota());
//// OtaUtil otaUtil=new OtaUtil(this,mBluetoothService.getBleDevice(mAddress));
// showFileChooser();
// break;
// case R.id.surroundings:
// if (isTest) {
// setIp(productIp);
// mList.add(0, "设置环境IP为生产环境");
//
// } else {
// setIp(testIp);
// mList.add(0, "设置环境IP为测试环境");
//
//
// }
// listAdapter.notifyDataSetChanged();
//
// break;
case R.id.ota:
// bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().ota());
// OtaUtil otaUtil=new OtaUtil(this,mBluetoothService.getBleDevice(mAddress));
showFileChooser();
break;
case R.id.surroundings:
if (isTest) {
setIp(productIp);
mList.add(0, "设置环境IP为生产环境");
} else {
setIp(testIp);
mList.add(0, "设置环境IP为测试环境");
}
listAdapter.notifyDataSetChanged();
break;


}

+ 7
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/WifiConfigActivity.java Bestand weergeven

@@ -1,8 +1,10 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid;

import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.location.LocationManager;
import android.os.Build;
@@ -38,6 +40,9 @@ import androidx.core.content.ContextCompat;
import cn.net.aicare.modulelibrary.module.wifi.WifiConfig;
import cn.net.aicare.modulelibrary.module.wifi.WifiUtils;

/**
* wifi配置界面
*/
public class WifiConfigActivity extends AppCompatActivity implements View.OnClickListener, WifiUtils.OnWifiEventListener {
private String TAG = WifiConfigActivity.class.getName();
private EditText ssid, paw, key, sn, devicename;
@@ -58,9 +63,11 @@ public class WifiConfigActivity extends AppCompatActivity implements View.OnClic
private RadioButton kg, jing, stlb, lb;
private String mDeviceName;

@SuppressLint("SetTextI18n")
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//禁止横屏
setContentView(R.layout.activity_wifi_config);
ssid = findViewById(R.id.ssid);
paw = findViewById(R.id.password);

+ 3
- 6
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/base/BleAppBaseActivity.java Bestand weergeven

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

import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
@@ -12,17 +11,15 @@ import android.os.Handler;
import android.os.Message;
import android.view.KeyEvent;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.TextView;

import com.pingwang.bluetoothlib.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.HintDataDialogFragment;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.AppStart;

import java.lang.ref.WeakReference;

import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.HintDataDialogFragment;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.AppStart;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.Toolbar;
@@ -53,7 +50,7 @@ public abstract class BleAppBaseActivity extends BleBaseActivity {
/**
* 需要申请的权限
*/
private String[] LOCATION_PERMISSION = new String[]{Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION};
private String[] LOCATION_PERMISSION = new String[]{Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.WRITE_EXTERNAL_STORAGE};

/**
* 权限请求返回

app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BleBaseActivity.java → app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/base/BleBaseActivity.java Bestand weergeven

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

import android.content.ComponentName;
import android.content.Context;

+ 21
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/config/AppConfig.java Bestand weergeven

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

import java.util.List;

/**
* xing<br>
* 2021/3/5<br>
* java类作用描述
*/
public class AppConfig {

/**
* 是否为客户专用OTA
*/
public static boolean APP_TYPE_OTA=false;
/**
* 支持显示的ID,null表示所有的都显示,ID是按钮的ID不是CID
*/
public static List<Integer> SHOW_VIEW_ID = null;

}

app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/AddUserDialog.java → app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/AddUserDialog.java Bestand weergeven

@@ -1,8 +1,7 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid;
package aicare.net.cn.sdk.ailinksdkdemoandroid.dialog;

import android.app.Dialog;
import android.content.DialogInterface;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.LayoutInflater;
@@ -12,13 +11,11 @@ import android.widget.RadioGroup;
import android.widget.SeekBar;
import android.widget.TextView;

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

import java.net.IDN;

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


+ 1
- 2
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/DialogStringImageAdapter.java Bestand weergeven

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

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

import java.util.List;

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


+ 0
- 1
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/HintDataDialogFragment.java Bestand weergeven

@@ -18,7 +18,6 @@ import android.widget.TextView;

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

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

+ 0
- 1
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/LoadingIosDialogFragment.java Bestand weergeven

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

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

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

app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/WifiDialog.java → app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/WifiDialog.java Bestand weergeven

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

import android.app.Dialog;
import android.content.Context;
@@ -12,6 +12,7 @@ import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.TextView;

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

+ 223
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/find/FindDeviceActivity.java Bestand weergeven

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

import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

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

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

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

public class FindDeviceActivity extends BleBaseActivity implements View.OnClickListener, FindDeviceData.onNotifyData {

private Button btn_device_id_0, btn_device_id_1, btn_device_id_2, btn_device_id_3, btn_device_id_4, btn_device_id_5, btn_device_id_6;
private Button btn_clear, btn_get_connect_number, btn_connect_info_list,btn_scan_ble;
private EditText et_send_data;
private ListView list_view;

private List<String> mList;
private ArrayAdapter mListAdapter;
private Context mContext;
private String mMac;
private BleDevice mBleDevice;
private FindDeviceData mFindDeviceData;
private Map<Integer, FindConnectDeviceInfoBean> mMap = new HashMap<>();

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_find_device);
mContext = this;
btn_get_connect_number = findViewById(R.id.btn_get_connect_number);
btn_connect_info_list = findViewById(R.id.btn_connect_info_list);
btn_device_id_0 = findViewById(R.id.btn_device_id_0);
btn_device_id_1 = findViewById(R.id.btn_device_id_1);
btn_device_id_2 = findViewById(R.id.btn_device_id_2);
btn_device_id_3 = findViewById(R.id.btn_device_id_3);
btn_device_id_4 = findViewById(R.id.btn_device_id_4);
btn_device_id_5 = findViewById(R.id.btn_device_id_5);
btn_device_id_6 = findViewById(R.id.btn_device_id_6);
et_send_data = findViewById(R.id.et_send_data);
btn_clear = findViewById(R.id.btn_clear);
list_view = findViewById(R.id.list_view);
btn_scan_ble = findViewById(R.id.btn_scan_ble);

btn_device_id_0.setOnClickListener(this);
btn_device_id_1.setOnClickListener(this);
btn_device_id_2.setOnClickListener(this);
btn_device_id_3.setOnClickListener(this);
btn_device_id_4.setOnClickListener(this);
btn_device_id_5.setOnClickListener(this);
btn_device_id_6.setOnClickListener(this);
btn_clear.setOnClickListener(this);
btn_scan_ble.setOnClickListener(this);
btn_get_connect_number.setOnClickListener(this);
btn_connect_info_list.setOnClickListener(this);

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

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

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

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

}
}


/**
* 发送指令
*/
private void sendCmd(int id) {
if (mMap != null) {
FindConnectDeviceInfoBean findConnectDeviceInfoBean = mMap.get(id);
if (findConnectDeviceInfoBean != null) {
String trim = et_send_data.getText().toString().trim();
mFindDeviceData.setCmd(findConnectDeviceInfoBean.getDeviceId(), trim, findConnectDeviceInfoBean.getMac());
} else {
Toast.makeText(mContext, "当前ID没有设备", Toast.LENGTH_SHORT).show();
}
}
}


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

@Override
public void onServiceSuccess() {
mBleDevice = mBluetoothService.getBleDevice(mMac);
if (mBleDevice != null) {
mFindDeviceData = FindDeviceData.getInstance(mBleDevice);
mFindDeviceData.setOnNotifyData(this);
}
}

@Override
public void onServiceErr() {

}

@Override
public void unbindServices() {

}


@Override
public void onData(byte[] data, int type) {

}

@Override
public void onConnectNumber(int number) {
mList.add("当前连接的设备数量:" + number);
if (mListAdapter != null) {
mListAdapter.notifyDataSetChanged();
}
}

@Override
public void onConnectDeviceInfoList(List<FindConnectDeviceInfoBean> list) {
StringBuilder deviceInfo = new StringBuilder();
for (FindConnectDeviceInfoBean findConnectDeviceInfoBean : list) {
mMap.put(findConnectDeviceInfoBean.getDeviceId(), findConnectDeviceInfoBean);
deviceInfo.append("设备ID").append(findConnectDeviceInfoBean.getDeviceId()).append(" || MAC地址:").append(findConnectDeviceInfoBean.getMac()).append("\n");
}
mList.add(deviceInfo.toString());
if (mListAdapter != null) {
mListAdapter.notifyDataSetChanged();
}
}

@Override
public void onConnectDeviceStatus(int id, int status) {
String statusStr = status == 0 ? "断开" : "连接";
mList.add("设备ID:" + id + " || 状态:" + statusStr);
if (mListAdapter != null) {
mListAdapter.notifyDataSetChanged();
}
}


//---------------新--------------


@Override
public void onNearbyDeviceInfo(String mac, int rssi, byte[] broadcastData) {

}

@Override
public void onConnectDeviceStatus(String mac, int status) {

}

@Override
public void onConnectDeviceInfo(int status, String mac) {

}
}

+ 82
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/find/FindDeviceAdapter.java Bestand weergeven

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

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

import java.util.List;

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

/**
* xing<br>

*/
public class FindDeviceAdapter extends RecyclerView.Adapter<FindDeviceAdapter.KeyViewHolder> {

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

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


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


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

return new KeyViewHolder(view, listener);
}

@Override
public void onBindViewHolder(@NonNull KeyViewHolder holder, int position) {
FindDeviceBean bean = mList.get(position);
holder.btn_find_device.setText("MAC="+bean.getMac());
holder.btn_find_device.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null)
listener.onItemClick(position);
}
});
}

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


static class KeyViewHolder extends RecyclerView.ViewHolder {

private Button btn_find_device;

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

itemView.setOnClickListener(v -> {
if (listener != null)
listener.onItemClick(getLayoutPosition());
});
}
}




}

+ 88
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/find/FindDeviceBean.java Bestand weergeven

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

import androidx.annotation.Nullable;

/**
* xing<br>
* 2021/4/12<br>
* java类作用描述
*/
public class FindDeviceBean {

private String mMac;

private String mName;

private int mRssi;

private byte[] mBroadcastData;


public FindDeviceBean(String mac, String name, int rssi, byte[] broadcastData) {
mMac = mac;
mName = name;
mRssi = rssi;
mBroadcastData = broadcastData;
}

public FindDeviceBean(String mac, String name, int rssi) {
mMac = mac;
mName = name;
mRssi = rssi;
}

public FindDeviceBean(String mac, int rssi) {
mMac = mac;
mRssi = rssi;
}

public FindDeviceBean(String mac, int rssi, byte[] broadcastData) {
mMac = mac;
mRssi = rssi;
mBroadcastData = broadcastData;
}

public String getMac() {
return mMac;
}

public void setMac(String mac) {
mMac = mac;
}

public String getName() {
return mName;
}

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

public int getRssi() {
return mRssi;
}

public void setRssi(int rssi) {
mRssi = rssi;
}

public byte[] getBroadcastData() {
return mBroadcastData;
}

public void setBroadcastData(byte[] broadcastData) {
mBroadcastData = broadcastData;
}


@Override
public boolean equals(@Nullable Object obj) {
if (obj instanceof String) {
return this.mMac.equalsIgnoreCase((String) obj);
} else if (obj instanceof FindDeviceBean) {
return this.mMac.equalsIgnoreCase(((FindDeviceBean) obj).getMac());
} else {
return super.equals(obj);
}
}
}

+ 381
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/find/FindDeviceNewActivity.java Bestand weergeven

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

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

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

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

import aicare.net.cn.sdk.ailinksdkdemoandroid.BuildConfig;
import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleAppBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.SP;
import aicare.net.cn.sdk.ailinksdkdemoandroid.view.MyItemDecoration;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import cn.net.aicare.modulelibrary.module.findDevice.FindDeviceData;

public class FindDeviceNewActivity extends BleAppBaseActivity implements View.OnClickListener, OnCallbackBle, FindDeviceData.onNotifyData, OnScanFilterListener, FindDeviceAdapter.OnItemClickListener {


private final int REFRESH_DATA = 2;
private final int START_SCAN_BLE =3;
private final static String BLE_NAME_START = "FiLink";
private final static String BLE_UUID_1 = "74278bdab64445208f0c720eaf00001a";
private final static String BLE_UUID_2 = "74278bdab64445208f0c720eaf00001b";

private Button btn_clear, btn_scan_ble;
private TextView tv_status;
private ListView list_view;
private RecyclerView rv_device;

private List<String> mList;
private ArrayAdapter mListAdapter;
private String mMac;
private BleDevice mBleDevice;
private FindDeviceData mFindDeviceData;
private volatile ArrayList<FindDeviceBean> mFindDeviceBeanList;
private FindDeviceAdapter mFindDeviceAdapter;

@Override
protected void uiHandlerMessage(Message msg) {

switch (msg.what) {

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

case START_SCAN_BLE:
bleOpen();
break;

}

}

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

@Override
protected void initListener() {
btn_clear.setOnClickListener(this);
btn_scan_ble.setOnClickListener(this);
}

@Override
protected void initData() {

if (getSupportActionBar() != null) {
getSupportActionBar().setTitle(getString(R.string.app_name) + ":" + BuildConfig.VERSION_NAME);
}
SP.init(this);
// 获取Mac
// mMac = getIntent().getStringExtra("mac");

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

mFindDeviceBeanList = new ArrayList<>();
String findDeviceMacList = SP.getInstance().getFindDeviceMacList();
if (!TextUtils.isEmpty(findDeviceMacList) && findDeviceMacList.contains(";")) {
String[] split = findDeviceMacList.split(";");
for (int i = 0; i < split.length; i++) {
String mac = split[i];
if (!TextUtils.isEmpty(mac)) {
mFindDeviceBeanList.add(new FindDeviceBean(mac, String.valueOf(i), -60));
}
}
}

mFindDeviceAdapter = new FindDeviceAdapter(mContext, mFindDeviceBeanList, this);
rv_device.setAdapter(mFindDeviceAdapter);


}

@Override
protected void initView() {
AILinkSDK.getInstance().init(this);//sdk
btn_clear = findViewById(R.id.btn_clear);
tv_status = findViewById(R.id.tv_status);
list_view = findViewById(R.id.list_view);
btn_scan_ble = findViewById(R.id.btn_scan_ble);
rv_device = findViewById(R.id.rv_device);
rv_device.setLayoutManager(new GridLayoutManager(mContext, 2, LinearLayoutManager.VERTICAL, false));
rv_device.addItemDecoration(new MyItemDecoration(mContext, LinearLayoutManager.VERTICAL, 1, mContext.getResources().getColor(R.color.public_white)));
// rv_device.setVisibility(View.INVISIBLE);
}


@Override
public void onItemClick(int position) {

if (mFindDeviceBeanList.size() > position) {
FindDeviceBean findDeviceBean = mFindDeviceBeanList.get(position);
if (mFindDeviceData != null) {
// mFindDeviceData.setDisconnectDevice();
mFindDeviceData.setConnectDevice(findDeviceBean.getMac());

}
}

}


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

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

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

}
}


@Override
protected void onDestroy() {
StringBuilder mac = new StringBuilder();
for (FindDeviceBean findDeviceBean : mFindDeviceBeanList) {
mac.append(findDeviceBean.getMac()).append(";");
}
if (mac.length() > 0) {
mac.deleteCharAt(mac.length() - 1);
}
SP.getInstance().putFindDeviceMacList(mac.toString());
if (mBluetoothService != null) {
mBluetoothService.disconnectAll();
}
super.onDestroy();
}

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

}

// ------------------- 权限 ------------------
@Override
protected void onPermissionsOk() {
if (mBluetoothService != null) {
mBluetoothService.setOnCallback(this);
mBleDevice = mBluetoothService.getBleDevice(mMac);
mBluetoothService.setOnScanFilterListener(this);
if (mBleDevice != null) {
mFindDeviceData = FindDeviceData.getInstance(mBleDevice);
mFindDeviceData.setOnNotifyData(this);
if (tv_status != null)
tv_status.setText("已连接:" + mMac);
mList.add("连接设备成功!");
mHandler.sendEmptyMessage(REFRESH_DATA);
} else {
mHandler.removeMessages(START_SCAN_BLE);
mHandler.sendEmptyMessage(START_SCAN_BLE);
}
}
}


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


@Override
public void onServiceSuccess() {
if (mBluetoothService != null) {
initPermissions();
}


}

@Override
public void onServiceErr() {

}

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

@Override
public boolean onFilter(BleValueBean bleValueBean) {
if (bleValueBean.getName() != null && bleValueBean.getName().trim().toUpperCase().startsWith(BLE_NAME_START.toUpperCase())) {
return true;
} else {
byte[] data = bleValueBean.getManufacturerData();
if (data != null && data.length > 20) {
byte[] uuidData = new byte[16];
System.arraycopy(data, 4, uuidData, 0, uuidData.length);
String uuid = BleStrUtils.byte2HexStr_1(uuidData);
if (uuid.equalsIgnoreCase(BLE_UUID_1) || uuid.equalsIgnoreCase(BLE_UUID_2)) {
return true;
}
}
}
return false;
}

@Override
public void onScanning(BleValueBean bleValueBean) {
if (TextUtils.isEmpty(mMac) && bleValueBean.getName() != null && bleValueBean.getName().trim().toUpperCase().startsWith(BLE_NAME_START.toUpperCase())) {
mMac = bleValueBean.getMac();
} else if (bleValueBean.getMac().equalsIgnoreCase(mMac) && mFindDeviceData == null) {
BleConfig.setHandshakeStatus(mMac, false);
mBluetoothService.stopScan();
mBluetoothService.connectDevice(mMac);
mBluetoothService.setOnCallback(this);
} else if (bleValueBean.getName() == null || !bleValueBean.getName().trim().toUpperCase().startsWith(BLE_NAME_START.toUpperCase())) {
onNearbyDeviceInfo(bleValueBean.getMac(), bleValueBean.getRssi(), bleValueBean.getManufacturerData());
}

}

@Override
public void onDisConnected(String mac, int code) {
if (mac.equalsIgnoreCase(mMac)) {
mFindDeviceData = null;
mList.add("连接断开:"+code);
mHandler.sendEmptyMessage(REFRESH_DATA);
mHandler.removeMessages(START_SCAN_BLE);
mHandler.sendEmptyMessageDelayed(START_SCAN_BLE,2000);
}
}

@Override
public void onServicesDiscovered(String mac) {
if (mac.equalsIgnoreCase(mMac)) {
mBluetoothService.stopScan();
onServiceSuccess();
}
}

@Override
public void bleOpen() {

if (mBluetoothService != null) {
mBluetoothService.stopScan();

mList.add("正在扫描连接...");
if (tv_status != null)
tv_status.setText("正在连接...");
mHandler.sendEmptyMessage(REFRESH_DATA);
mBluetoothService.scanLeDevice(0, BleConfig.UUID_SERVER_AILINK);
}

}

@Override
public void bleClose() {
mFindDeviceData = null;
mList.add("蓝牙已关闭!");
if (tv_status != null)
tv_status.setText("蓝牙已关闭!");
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onData(byte[] data, int type) {

}


//---------------新--------------


@Override
public void onNearbyDeviceInfo(String mac, int rssi, byte[] broadcastData) {
for (FindDeviceBean findDeviceBean : mFindDeviceBeanList) {
if (findDeviceBean.getMac().equalsIgnoreCase(mac)) {
return;
}
}
mFindDeviceBeanList.add(new FindDeviceBean(mac, rssi, broadcastData));
if (mFindDeviceAdapter != null) {
mFindDeviceAdapter.notifyDataSetChanged();
}
}

@Override
public void onConnectDeviceStatus(String mac, int status) {
String statusStr = "";
switch (status) {

case 0:
statusStr = "连接成功";
break;
case 1:
statusStr = "断开连接";
break;
case 2:
statusStr = "响铃...";
break;
case 3:
statusStr = "连接超时";
break;

}
mList.add("设备:" + mac + " || 状态:" + statusStr);
mHandler.sendEmptyMessage(REFRESH_DATA);
}


@Override
public void onConnectDeviceInfo(int status, String mac) {
BleLog.i(TAG, "当前连接的设备:" + mac + " || status=" + status);
if (status == 1) {

mFindDeviceBeanList.add(new FindDeviceBean(mac, -60, new byte[]{}));
if (mFindDeviceAdapter != null) {
mFindDeviceAdapter.notifyDataSetChanged();
}
}

}
}

+ 232
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/blood_glucose/BloodGlucoseActivity.java Bestand weergeven

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

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

import com.pingwang.bluetoothlib.BleBaseActivity;
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 androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.BloodGlucose.BloodGlucoseBleDeviceData;
import cn.net.aicare.modulelibrary.module.BloodGlucose.BloodGlucoseUtil;

/**
* 血糖仪
*/
public class BloodGlucoseActivity extends BleBaseActivity implements OnCallbackBle, BloodGlucoseBleDeviceData.BloodGlucoseCallback {

private Button support_unit, quest_status, showdata, test;
private RadioButton mmol, mg;
private ListView log_list;

private List<String> mLogList;
private ArrayAdapter listAdapter;
private String mAddress;
private boolean isShowData=false;
private BloodGlucoseBleDeviceData mBloodGlucoseBleDeviceData;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_blood_glucose);
mAddress = getIntent().getStringExtra("mac");
support_unit = findViewById(R.id.support_unit);
quest_status = findViewById(R.id.quest_status);
showdata=findViewById(R.id.showdata);
test = findViewById(R.id.test);
mmol = findViewById(R.id.mmol);
mg = findViewById(R.id.mg);
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);
mmol.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked)
if (mBloodGlucoseBleDeviceData != null)
mBloodGlucoseBleDeviceData.setUnit(BloodGlucoseUtil.UNIT_MMOL_L);
}
});
mg.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked)
if (mBloodGlucoseBleDeviceData != null)
mBloodGlucoseBleDeviceData.setUnit(BloodGlucoseUtil.UNIT_MG_DL);
}
});
showdata.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!isShowData){
showdata.setText("隐藏Data数据");
isShowData=true;
}else {
showdata.setText("显示Data数据");
isShowData=false;
}
}
});
quest_status.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mBloodGlucoseBleDeviceData != null)
mBloodGlucoseBleDeviceData.queryStatus();
}
});
// 流程测试
test.setOnClickListener(v -> {
Intent intent = new Intent(this, BloodGlucoseTestActivity.class);
intent.putExtra("mac", mAddress);
startActivity(intent);
});
// 查询设备支持单位
support_unit.setOnClickListener(v -> {
if (mBloodGlucoseBleDeviceData != null) {
mBloodGlucoseBleDeviceData.getSupportUnit();
}
});
}

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

@Override
public void onDisConnected(String mac, int code) {
// 断开连接直接退出
finish();
}

@Override
public void onServiceErr() {

}

@Override
public void unbindServices() {

}


@Override
public void onVersion(String version) {
mLogList.add(0, "版本号:"+version);
listAdapter.notifyDataSetChanged();
}

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

@Override
public void onDeviceStatus(int status) {
switch (status){
case BloodGlucoseUtil.STATUS_STATELESS:
mLogList.add(0,status+" 无状态");
break;
case BloodGlucoseUtil.STATUS_WAIT_TEST_PAPER:
mLogList.add(0,status+" 设备等待插入试纸");
break;
case BloodGlucoseUtil.STATUS_WAIT_BLOOD_SAMPLES:
mLogList.add(0,status+" 设备已插入试纸,等待获取血样");
break;
case BloodGlucoseUtil.STATUS_ANALYSIS_BLOOD_SAMPLES:
mLogList.add(0,status+" 血样已获取,分析血样中");
break;

case BloodGlucoseUtil.STATUS_TEST_FINISH:
mLogList.add(0,status+" 上发数据完成,测量完成");
break;
}
listAdapter.notifyDataSetChanged();
}

@Override
public void onResult(int originalValue, float value, int unit, int decimal) {
mLogList.add(0,"原始数据:"+originalValue+" 值:"+value+" 单位:"+unit+" 小数点位:"+decimal);
listAdapter.notifyDataSetChanged();
}

@Override
public void onErrorCode(int code) {
switch (code){
case BloodGlucoseUtil.ERROR_CODE_NO_ELECTRICITY:
mLogList.add(0,code+" 电池没电");
break;
case BloodGlucoseUtil.ERROR_CODE_USED_TEST_PAPER:
mLogList.add(0,code+" 已使用过的试纸");
break;
case BloodGlucoseUtil.ERROR_CODE_TEMPERATURE_OUT_OF_RANGE:
mLogList.add(0,code+" 环境温度超出使用范围");
break;
case BloodGlucoseUtil.ERROR_CODE_WITHDRAWN_TEST_PAPER:
mLogList.add(0,code+" 试纸施加血样后测试未完成,被退出试纸");
break;
case BloodGlucoseUtil.ERROR_CODE_SELF_CHECK_FAIL:
mLogList.add(0,code+" 机器自检未通过");
break;
case BloodGlucoseUtil.ERROR_CODE_RESULT_LOWER:
mLogList.add(0,code+" 测量结果过低,超出测量范围");
break;
case BloodGlucoseUtil.ERROR_CODE_RESULT_OVERTOP:
mLogList.add(0,code+" 测量结果过高,超出测量范围");
break;
default:
mLogList.add(0,"错误码:"+code);
break;
}
listAdapter.notifyDataSetChanged();
}

@Override
public void onSetUnitResult(int result) {
switch (result){
case BloodGlucoseUtil.SUCCESS:
mLogList.add(0,result+" 成功");
break;
case BloodGlucoseUtil.FAILED:
mLogList.add(0,result+" 失败");
break;
case BloodGlucoseUtil.NONSUPPORT:
mLogList.add(0,result+" 不支持");
break;
}
listAdapter.notifyDataSetChanged();

}

@Override
public void onData(String data) {
if (isShowData)
mLogList.add(0,data);
}
}

+ 523
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/blood_glucose/BloodGlucoseTestActivity.java Bestand weergeven

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

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

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

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

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

public class BloodGlucoseTestActivity extends BleBaseActivity implements OnCallbackBle, BloodGlucoseBleDeviceData.BloodGlucoseCallback, OnBleCompanyListener {

private ListView list_view;
private ArrayAdapter mAdapter;
private List<String> mList;

private String mAddress;
private BloodGlucoseBleDeviceData mBleDevice;
private List<Integer> mSupportUnit;// 设备支持的单位列表
private int mCurTestUnit = 0;// 当前在测试第几个单位

private int mCurStep = 1;// 当前流程进行到第几步

private static final int STEP_END_FAIL = -1;// 测试结束 失败
private static final int STEP_END_SUCCESS = -2;// 测试结束 成功

private static final int STEP_CID = 1;// 查询设备CID VID PID
private static final int STEP_UNIT = 2;// 查询设备支持的单位
private static final int STEP_DEVICE_STATUS = 3;// 获取设备状态
private static final int STEP_TEST_STATUS_1 = 4;// 测量状态1 插入试纸
private static final int STEP_TEST_STATUS_2 = 5;// 测量状态2 获取血样
private static final int STEP_TEST_STATUS_3 = 6;// 测量状态3 分析血样
private static final int STEP_TEST_DATA = 7;// 测量数据
private static final int STEP_TEST_STATUS_4 = 8;// 测量状态4 测量完成

private static final int STEP_SET_UNIT = 9;// APP设置单位 需要设备支持该单位
private static final int STEP_SET_UNIT_SUCCESS = 10;// APP设置单位 需要返回成功
private static final int STEP_SET_UNIT_FAIL = 11;// APP设置单位 需要返回失败
private static final int STEP_SET_UNIT_UNSUPPORT = 12;// APP设置单位 需要返回不支持

private static final int STEP_ERROR_CODE_1 = 13;// 错误码 电池没电
private static final int STEP_ERROR_CODE_2 = 14;// 错误码 已使用过的试纸
private static final int STEP_ERROR_CODE_3 = 15;// 错误码 环境温度超出使用范围
private static final int STEP_ERROR_CODE_4 = 16;// 错误码 试纸施加血样后测试未完成, 被退出试纸
private static final int STEP_ERROR_CODE_5 = 17;// 错误码 机器自检未通过
private static final int STEP_ERROR_CODE_6 = 18;// 错误码 测量结果过低, 超出测量范围
private static final int STEP_ERROR_CODE_7 = 19;// 错误码 测量结果过高, 超出测量范围

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

list_view = findViewById(R.id.list_view);

mAddress = getIntent().getStringExtra("mac");

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

setTitle("流程测试");
list_view.postDelayed(this::nextStep, 500);
}

@Override
public void onDisConnected(String mac, int code) {
showToast("设备断开连接");
finish();
}

@Override
public void onServiceSuccess() {
if (mBluetoothService != null) {
mBluetoothService.setOnCallback(this);
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress);
if (bleDevice != null) {
mBleDevice = new BloodGlucoseBleDeviceData(bleDevice);
mBleDevice.setBloodGlucoseCallback(this);
bleDevice.setOnBleCompanyListener(this);
} else {
// 无法获取到设备
showToast("无法获取到设备信息");
finish();
}
}
}

@Override
public void onServiceErr() {

}

@Override
public void unbindServices() {

}

@Override
public void onVersion(String version) {

}

@Override
public void onSupportUnit(List<SupportUnitBean> list) {
// 获取到设备支持的单位
if (mCurStep == STEP_UNIT) {
String supportUnitStr = "设备支持的单位:";
if (list != null && list.size() > 0) {
boolean hasUnit = false;
for (SupportUnitBean bean : list) {
// 6 是血糖单位
if (bean.getType().equals("6")) {
mSupportUnit = bean.getSupportUnit();
hasUnit = true;
for (int unit : bean.getSupportUnit()) {
// if (unit == BloodGlucoseUtil.UNIT_MMOL_L) {
if (unit == 0) {
supportUnitStr += "mmol/L,";
}
// if (unit == BloodGlucoseUtil.UNIT_MG_DL) {
if (unit == 1) {
supportUnitStr += "mg/DL,";
}
}
}
}
if (!hasUnit) {
supportUnitStr += "空";
}
} else {
supportUnitStr += "空";
}
if (supportUnitStr.contains(",")) {
supportUnitStr = supportUnitStr.substring(0, supportUnitStr.length() - 1);
}
addText(supportUnitStr);
addText("测试通过");
mCurStep = STEP_DEVICE_STATUS;
nextStep();
} else {
stepError();
}
}

@Override
public void onDeviceStatus(int status) {
if (mCurStep == STEP_DEVICE_STATUS) {
addText("获取到设备状态:" + status);
addText("测试通过");
addText("下面进入血氧值测量流程测试");
mCurStep = STEP_TEST_STATUS_1;
nextStep();
} else {
switch (mCurStep) {
case STEP_TEST_STATUS_1:
// 插入试纸
if (status == BloodGlucoseUtil.STATUS_WAIT_TEST_PAPER) {
addText("收到插入试纸,下一步");
mCurStep = STEP_TEST_STATUS_2;
nextStep();
} else {
stepError();
}
break;
case STEP_TEST_STATUS_2:
// 获取血样
if (status == BloodGlucoseUtil.STATUS_WAIT_BLOOD_SAMPLES) {
addText("收到获取血样,下一步");
mCurStep = STEP_TEST_STATUS_3;
nextStep();
} else {
stepError();
}
break;
case STEP_TEST_STATUS_3:
// 分析血样
if (status == BloodGlucoseUtil.STATUS_ANALYSIS_BLOOD_SAMPLES) {
addText("收到分析血样,下一步");
mCurStep = STEP_TEST_DATA;
nextStep();
} else {
stepError();
}
break;
case STEP_TEST_STATUS_4:
// 测量完成
if (status == BloodGlucoseUtil.STATUS_TEST_FINISH) {
addText("收到测量完成");
mCurStep = STEP_SET_UNIT;
nextStep();
} else {
stepError();
}
break;
default:
stepError();
break;
}
}

}

@Override
public void onResult(int originalValue, float value, int unit, int decimal) {
if (mCurStep == STEP_TEST_DATA) {
addText("收到数据:originValue:" + originalValue + ",value:" + value + ",unit:" + unit + ",decimal:" + decimal);
mCurStep = STEP_TEST_STATUS_4;
nextStep();
} else {
stepError();
}
}

@Override
public void onErrorCode(int code) {
if (mCurStep == STEP_ERROR_CODE_1) {
addText("收到错误码:" + code + ",下一步");
mCurStep = STEP_END_SUCCESS;
nextStep();
} else {
stepError();
}

// switch (mCurStep) {
// case STEP_ERROR_CODE_1:
// if (code == 1) {
// addText("收到错误码:" + code + ",下一步");
// mCurStep = STEP_ERROR_CODE_2;
// nextStep();
// } else {
// stepError();
// }
// break;
// case STEP_ERROR_CODE_2:
// if (code == 2) {
// addText("收到错误码:" + code + ",下一步");
// mCurStep = STEP_ERROR_CODE_3;
// nextStep();
// } else {
// stepError();
// }
// break;
// case STEP_ERROR_CODE_3:
// if (code == 3) {
// addText("收到错误码:" + code + ",下一步");
// mCurStep = STEP_ERROR_CODE_4;
// nextStep();
// } else {
// stepError();
// }
// break;
// case STEP_ERROR_CODE_4:
// if (code == 4) {
// addText("收到错误码:" + code + ",下一步");
// mCurStep = STEP_ERROR_CODE_5;
// nextStep();
// } else {
// stepError();
// }
// break;
// case STEP_ERROR_CODE_5:
// if (code == 5) {
// addText("收到错误码:" + code + ",下一步");
// mCurStep = STEP_ERROR_CODE_6;
// nextStep();
// } else {
// stepError();
// }
// break;
// case STEP_ERROR_CODE_6:
// if (code == 6) {
// addText("收到错误码:" + code + ",下一步");
// mCurStep = STEP_ERROR_CODE_7;
// nextStep();
// } else {
// stepError();
// }
// break;
// case STEP_ERROR_CODE_7:
// if (code == 7) {
// addText("收到错误码:" + code + ",下一步");
// mCurStep = STEP_END_SUCCESS;
// nextStep();
// } else {
// stepError();
// }
// break;
// }
}

@Override
public void onSetUnitResult(int result) {
switch (mCurStep) {
case STEP_SET_UNIT_SUCCESS:
// 设置单位成功
// if (result == 0) {
if (result == 0 || result == 1 || result == 2) {
if (result == 0) {
addText("收到设置单位成功,下一步");
} else if (result == 1) {
addText("收到设置单位失败,下一步");
} else if (result == 2) {
addText("收到设置单位不支持,下一步");
}
// mCurStep = STEP_SET_UNIT_FAIL;
mCurStep = STEP_SET_UNIT;
nextStep();
} else {
stepError();
}
break;
case STEP_SET_UNIT_FAIL:
// if (result == 1) {
if (result == 0 || result == 1 || result == 2) {
// mCurStep = STEP_SET_UNIT_UNSUPPORT;
mCurStep = STEP_SET_UNIT;
nextStep();
} else {
stepError();
}
break;
case STEP_SET_UNIT_UNSUPPORT:
// if (result == 2) {
if (result == 0 || result == 1 || result == 2) {
mCurStep = STEP_SET_UNIT;
nextStep();
} else {
stepError();
}
break;
default:
stepError();
break;
}
}

@Override
public void onData(String data) {

}

@Override
public void OnDID(int cid, int vid, int pid) {
// 获取到设备的CID VID PID
if (cid < 0) {
cid = 0;
}
if (vid < 0) {
vid = 0;
}
if (pid < 0) {
pid = 0;
}
if (mCurStep == STEP_CID) {
addText("CID:" + cid + ",VID:" + vid + ",PID:" + pid);
if (cid > 0 && vid > 0 && pid > 0) {
addText("测试通过");
mCurStep = STEP_UNIT;
nextStep();
} else {
addText("测试不通过,CID VID PID不能小于等于0");
mCurStep = STEP_END_FAIL;
nextStep();
}
} else {
stepError();
}
}

// 进行下一步
private void nextStep() {
if (this.isDestroyed()) {
return;
}
String stepStr = "第" + mCurStep + "步:";

switch (mCurStep) {
case STEP_CID:
// 查询CID VID PID
addText(stepStr + "查询设备CID VID PID");
mBleDevice.getCidVidPid();
break;
case STEP_UNIT:
// 查询设备支持单位
addText(stepStr + "查询设备支持的单位");
mBleDevice.getSupportUnit();
break;
case STEP_DEVICE_STATUS:
// 获取设备状态
addText(stepStr + "APP下发查询状态指令,MCU接收到指令需要回复设备当前状态");
mBleDevice.queryStatus();
break;
case STEP_TEST_STATUS_1:
// 测量状态1
addText(stepStr + "请发送插入试纸");
break;
case STEP_TEST_STATUS_2:
// 测量状态2
addText(stepStr + "请发送获取血样");
break;
case STEP_TEST_STATUS_3:
// 测量状态3
addText(stepStr + "请发送分析血样中");
break;
case STEP_TEST_DATA:
// 测量数据
addText(stepStr + "请发送测量数据");
break;
case STEP_TEST_STATUS_4:
// 测量状态4
addText(stepStr + "请发送测量完成");
break;
case STEP_SET_UNIT:
// APP设置单位
if (mSupportUnit.size() > mCurTestUnit) {
// 还有单位没测,进行测试
addText(stepStr + "APP下发单位:" + mSupportUnit.get(mCurTestUnit));
mCurTestUnit++;
mCurStep = STEP_SET_UNIT_SUCCESS;
nextStep();
} else {
// 单位都测试完了
addText("单位设置测试完成");
mCurStep = STEP_ERROR_CODE_1;
nextStep();
}
break;
case STEP_SET_UNIT_SUCCESS:
// 单位设置成功
// addText(stepStr + "请回复单位设置成功");
addText(stepStr + "请回复单位设置结果");
break;
case STEP_SET_UNIT_FAIL:
// 单位设置失败
// addText(stepStr + "请回复单位设置失败");
addText(stepStr + "请回复单位设置结果");
break;
case STEP_SET_UNIT_UNSUPPORT:
// 单位设置不支持
// addText(stepStr + "请回复单位设置不支持");
addText(stepStr + "请回复单位设置结果");
break;
case STEP_ERROR_CODE_1:
// 错误码 电池没电
// addText(stepStr + "请发送错误码:电池没电");
addText(stepStr + "目前血糖仪支持的错误码有:\n" +
"0x01:电池没电\n" +
"0x02:已使用过的试纸\n" +
"0x03:环境温度超出使用范围\n" +
"0x04:试纸施加血样后测试未完成,被退出试纸\n" +
"0x05:机器自检未通过\n" +
"0x06:测量结果过低,超出测量范围\n" +
"0x07:测量结果过高,超出测量范围\n\n" +
"请设备发送支持的其中一种错误码");
break;
case STEP_ERROR_CODE_2:
// 错误码 已使用过的试纸
addText(stepStr + "请发送错误码:已使用过的试纸");
break;
case STEP_ERROR_CODE_3:
// 错误码 环境温度超出使用范围
addText(stepStr + "请发送错误码:环境温度超出使用范围");
break;
case STEP_ERROR_CODE_4:
// 错误码 试纸施加血样后测试未完成, 被退出试纸
addText(stepStr + "请发送错误码:试纸施加血样后测试未完成, 被退出试纸");
break;
case STEP_ERROR_CODE_5:
// 错误码 机器自检未通过
addText(stepStr + "请发送错误码:机器自检未通过");
break;
case STEP_ERROR_CODE_6:
// 错误码 测量结果过低, 超出测量范围
addText(stepStr + "测量结果过低, 超出测量范围");
break;
case STEP_ERROR_CODE_7:
// 错误码 测量结果过高, 超出测量范围
addText(stepStr + "测量结果过高, 超出测量范围");
break;
case STEP_END_FAIL:
// 测试结束
addText("❌ 测试结束:失败");
addText("❌ 请退出当前页面,重新进行流程测试");
setTitle("❌ 测试结束:失败");
break;
case STEP_END_SUCCESS:
// 测试结束
addText("✔ 测试结束:成功");
setTitle("✔ 测试结束:成功");
break;
}
}

// 显示流程错误
private void stepError() {
addText("❌ 第" + mCurStep + "步:" + "请严格按照流程进行测试!");
}

// 添加一条文本
private void addText(String text) {
mList.add(text);
mAdapter.notifyDataSetChanged();
list_view.smoothScrollToPosition(mList.size() - 1);
}

// 弹出Toast
private void showToast(String text) {
Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
}
}

+ 447
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/broadcast_height/BroadcastHeightActivity.java Bestand weergeven

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

import android.Manifest;
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.TextUtils;
import android.widget.ArrayAdapter;
import android.widget.ListView;

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

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 androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;
import cn.net.aicare.modulelibrary.module.BroadcastScale.BroadcastScaleBleConfig;

/**
* 广播身高仪
*/
public class BroadcastHeightActivity extends BleBaseActivity implements OnCallbackDis, OnScanFilterListener {

private Context mContext;

private ListView list_view;

private List<String> mList;
private ArrayAdapter mListAdapter;

private String mMac;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_broadcast_height);
mContext = this;

list_view = findViewById(R.id.list_view);

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

@Override
public void onServiceSuccess() {
// 绑定服务成功,检查权限
checkPermission();
}

@Override
public void onServiceErr() {

}

@Override
public void unbindServices() {

}

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

/**
* 请求权限的Code
*/
public static final int REQUEST_PERMISSION_CODE = 1500;

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

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

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

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

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

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

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

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

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

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

private String getFlagStr(int flag) {
String str = "";
switch (flag) {
case 0:
str = "正在测量";
break;
case 1:
str = "稳定身高体重";
break;
case 0xff:
str = "测量失败";
break;
}
return str;
}

private String getHeightStr(int heightOrigin, int heightUnit, int heightDecimal) {
String str = "";
str += getPreFloatStr((float) (heightOrigin * 1.0f / Math.pow(10, heightDecimal)), heightDecimal, 0);

switch (heightUnit) {
case 0:
str += "cm";
break;
case 1:
str += "inch";
break;
case 2:
try {
int ft = Integer.parseInt(str);
int f = ft / 12;
int i = ft - f * 12;
str = f + "'" + i + "\"";
} catch (Exception e) {
str = "解析异常,原始值不是int型";
}
break;
}

return str;
}

private String getWeightStr(int weightOrigin, int weightUnit, int weightDecimal, int weightSymbol) {
String str = "";
str += getPreFloatStr((float) (weightOrigin * 1.0f / Math.pow(10, weightDecimal)) * (weightSymbol == 1 ? -1 : 1), weightDecimal, 0);

switch (weightUnit) {
case 0:
str += "kg";
break;
case 1:
str += "斤";
break;
case 2:
str += "lb:oz";
break;
case 3:
str += "oz";
break;
case 4:
str += "st:lb";
break;
case 5:
str += "g";
break;
case 6:
str += "lb";
break;
}

return str;
}

/**
* 四舍五入保留一位小数
*
* @param f 原来小数
* @return 保留后的小数
*/
public static float getPreFloat(float f) {
return getPreFloat(f, 1, 0);
}

/**
* 保留小数
*
* @param f 原始小数
* @param bit 保留多少位
* @param type 0 四舍五入,1 去尾,2 银行家, 3 进一
* @return 保留后的小数
*/
public static float getPreFloat(float f, int bit, int type) {
return Float.parseFloat(getPreFloatStr(f, bit, type));
}

/**
* 保留小数,获取字符串
*
* @param f 原始小数
* @param bit 保留多少位
* @param type 0 四舍五入,1 去尾,2 银行家, 3 进一
* @return 保留后的小数
*/
public static String getPreFloatStr(float f, int bit, int type) {
BigDecimal dc = new BigDecimal(f);

switch (type) {
default:
case 0:
// 四舍五入
return dc.setScale(bit, BigDecimal.ROUND_HALF_UP).toString();
case 1:
// 去尾
return dc.setScale(bit, BigDecimal.ROUND_DOWN).toString();
case 2:
// 银行家
return dc.setScale(bit, BigDecimal.ROUND_HALF_EVEN).toString();
case 3:
// 进一
return dc.setScale(bit, BigDecimal.ROUND_UP).toString();
}
}

/**
* 校验累加,从1开始加
*/
private static byte cmdSum(byte[] data) {
byte sum = 0;
for (byte datum : data) {
sum += datum;
}
return sum;
}

/**
* 检查权限,并开始扫描
*/
private void checkPermission() {
// 没有打开蓝牙就请求打开蓝牙
if (!hasBluetooth()) {
requestBluetooth();
return;
}
// 没有定位权限就请求定位权限
if (!hasLocationPermission()) {
requestLocationPermission(this);
return;
}
// 没有定位服务就请求定位服务
if (!hasLocationService()) {
requestLocationService();
return;
}
// 权限都有了,OK
addText("权限都有,开始接收广播数据");
if (mBluetoothService != null) {
mBluetoothService.setOnScanFilterListener(this);
mBluetoothService.scanLeDevice(0, BleConfig.UUID_SERVER_BROADCAST_AILINK);
}
}

/**
* 是否有定位权限
*
* @return boolean
*/
private boolean hasLocationPermission() {
return ActivityCompat.checkSelfPermission(mContext, 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) mContext.getSystemService(Context.LOCATION_SERVICE);
if (locationManager == null) {
return false;
}
return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
}

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

/**
* 申请打开蓝牙
*/
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);
}

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

+ 633
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/coffee_scale/CoffeeScaleActivity.java Bestand weergeven

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

import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.RadioButton;

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

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

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

/**
* 咖啡秤
*/
public class CoffeeScaleActivity extends BleBaseActivity implements View.OnClickListener, CoffeeScaleData.CoffeeScaleCallback {

private static final String TAG = "Tag1";

private Button btn_clear;
private Button btn_zero;
private Button btn_set_weight_unit;
private Button btn_set_temp_unit;
private Button btn_set_auto_shutdown;
private Button btn_set_timing;
private Button btn_callback_timing;
private Button btn_set_alert;
private Button btn_stop_alert;
private Button btn_callback_alert;
private Button btn_callback_stop_alert;
private Button btn_brew_mode;
private RadioButton rb_kg;
private RadioButton rb_jin;
private RadioButton rb_lb_oz;
private RadioButton rb_oz;
private RadioButton rb_st_lb;
private RadioButton rb_g;
private RadioButton rb_lb;
private RadioButton rb_c;
private RadioButton rb_f;
private RadioButton rb_positive_timing;
private RadioButton rb_negative_timing;
private RadioButton rb_timing_start;
private RadioButton rb_timing_pause;
private RadioButton rb_timing_reset;
private RadioButton rb_callback_timing_success;
private RadioButton rb_callback_timing_fail;
private RadioButton rb_callback_timing_not_support;
private RadioButton rb_alert_close;
private RadioButton rb_alert_open;
private RadioButton rb_callback_alert_success;
private RadioButton rb_callback_alert_fail;
private RadioButton rb_callback_alert_not_support;
private RadioButton rb_callback_stop_alert_success;
private RadioButton rb_callback_stop_alert_fail;
private RadioButton rb_callback_stop_alert_not_support;
private RadioButton rb_brew_mode_enter;
private RadioButton rb_brew_mode_exit;
private EditText et_auto_shutdown;
private EditText et_timing;
private EditText et_alert;
private ListView list_view;

private List<String> mList;
private ArrayAdapter mListAdapter;

private String mMac;
private BleDevice mBleDevice;
private CoffeeScaleData mCoffeeScaleData;

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

btn_clear = findViewById(R.id.btn_clear);
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);
btn_set_auto_shutdown = findViewById(R.id.btn_set_auto_shutdown);
btn_set_timing = findViewById(R.id.btn_set_timing);
btn_callback_timing = findViewById(R.id.btn_callback_timing);
btn_set_alert = findViewById(R.id.btn_set_alert);
btn_stop_alert = findViewById(R.id.btn_stop_alert);
btn_callback_alert = findViewById(R.id.btn_callback_alert);
btn_callback_stop_alert = findViewById(R.id.btn_callback_stop_alert);
btn_brew_mode = findViewById(R.id.btn_brew_mode);
rb_kg = findViewById(R.id.rb_kg);
rb_jin = findViewById(R.id.rb_jin);
rb_lb_oz = findViewById(R.id.rb_lb_oz);
rb_oz = findViewById(R.id.rb_oz);
rb_st_lb = findViewById(R.id.rb_st_lb);
rb_g = findViewById(R.id.rb_g);
rb_lb = findViewById(R.id.rb_lb);
rb_c = findViewById(R.id.rb_c);
rb_f = findViewById(R.id.rb_f);
rb_positive_timing = findViewById(R.id.rb_positive_timing);
rb_negative_timing = findViewById(R.id.rb_negative_timing);
rb_timing_start = findViewById(R.id.rb_timing_start);
rb_timing_pause = findViewById(R.id.rb_timing_pause);
rb_timing_reset = findViewById(R.id.rb_timing_reset);
rb_callback_timing_success = findViewById(R.id.rb_callback_timing_success);
rb_callback_timing_fail = findViewById(R.id.rb_callback_timing_fail);
rb_callback_timing_not_support = findViewById(R.id.rb_callback_timing_not_support);
rb_alert_close = findViewById(R.id.rb_alert_close);
rb_alert_open = findViewById(R.id.rb_alert_open);
rb_callback_alert_success = findViewById(R.id.rb_callback_alert_success);
rb_callback_alert_fail = findViewById(R.id.rb_callback_alert_fail);
rb_callback_alert_not_support = findViewById(R.id.rb_callback_alert_not_support);
rb_callback_stop_alert_success = findViewById(R.id.rb_callback_stop_alert_success);
rb_callback_stop_alert_fail = findViewById(R.id.rb_callback_stop_alert_fail);
rb_callback_stop_alert_not_support = findViewById(R.id.rb_callback_stop_alert_not_support);
rb_brew_mode_enter = findViewById(R.id.rb_brew_mode_enter);
rb_brew_mode_exit = findViewById(R.id.rb_brew_mode_exit);
et_auto_shutdown = findViewById(R.id.et_auto_shutdown);
et_timing = findViewById(R.id.et_timing);
et_alert = findViewById(R.id.et_alert);
list_view = findViewById(R.id.list_view);

btn_clear.setOnClickListener(this);
btn_zero.setOnClickListener(this);
btn_set_weight_unit.setOnClickListener(this);
btn_set_temp_unit.setOnClickListener(this);
btn_set_auto_shutdown.setOnClickListener(this);
btn_set_timing.setOnClickListener(this);
btn_callback_timing.setOnClickListener(this);
btn_set_alert.setOnClickListener(this);
btn_stop_alert.setOnClickListener(this);
btn_callback_alert.setOnClickListener(this);
btn_callback_stop_alert.setOnClickListener(this);
btn_brew_mode.setOnClickListener(this);

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

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

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_clear:
// 清空文本框
clearText();
break;
case R.id.btn_zero:
// APP下发去皮功能(归零功能)
appSetZero();
break;
case R.id.btn_set_weight_unit:
// APP下发重量单位
appSetWeightUnit();
break;
case R.id.btn_set_temp_unit:
// APP下发温度单位
appSetTempUnit();
break;
case R.id.btn_set_auto_shutdown:
// APP下发自动关机
appSetAutoShutdown();
break;
case R.id.btn_set_timing:
// APP下发计时功能控制
appSetTiming();
break;
case R.id.btn_callback_timing:
// APP回复计时功能
appCallbackTiming();
break;
case R.id.btn_set_alert:
// APP下发报警设置
appSetAlert();
break;
case R.id.btn_stop_alert:
// APP停止报警指令
appStopAlert();
break;
case R.id.btn_callback_alert:
// APP回复报警设置
appCallbackAlert();
break;
case R.id.btn_callback_stop_alert:
// APP回复停止报警
appCallbackStopAlert();
break;
case R.id.btn_brew_mode:
// APP设置冲煮模式
appBrewMode();
break;
}
}

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

@Override
public void onServiceSuccess() {
mBleDevice = mBluetoothService.getBleDevice(mMac);
if (mBleDevice != null) {
mCoffeeScaleData = new CoffeeScaleData(mBleDevice);
mCoffeeScaleData.setCoffeeScaleCallback(this);
}
}

@Override
public void onServiceErr() {

}

@Override
public void unbindServices() {

}

@Override
public void mcuResult(int weightType, int weightUnit, int weightDecimal, int weightSource, float weight, int tempUnit, int tempDecimal, int tempSource, float temp, int err) {
Log.i(TAG, "onResult");
String text = "MCU上发重量:" + (weightType == 1 ? "稳定重量" : "实时重量");
text += ";重量小数点:" + weightDecimal;
text += ";重量原始值:" + weightSource;
text += ";重量:" + (weightDecimal > 0 ? weight : (int) weight) + getWeightUnitStr(weightUnit);
if (tempUnit != 0xff) {
text += ";温度小数点:" + tempDecimal;
text += ";温度原始值:" + tempSource;
text += ";温度:" + (tempDecimal > 0 ? temp : (int) temp) + getTempUnitStr(tempUnit);
} else {
text += ";温度:不支持";
}
if (err != 0xff) {
text += ";异常:" + getErrStr(err);
} else {
text += ";异常:不支持";
}
addText(text);
}

@Override
public void mcuPower(int status, int power) {
Log.i(TAG, "onPower:" + status + "," + power);
String text = "MCU上发充电状态:" + getPowerStatusStr(status);
text += ";电量:" + power + "%";
addText(text);
}

@Override
public void mcuTiming(int seconds, int type, int op) {
Log.i(TAG, "onTiming:" + seconds + ",type:" + type + ",op:" + op);
String text = "MCU上发计时:" + seconds + "秒";
text += ";" + getTimingStr(type) + ";" + getTimingOpStr(op);
addText(text);
}

@Override
public void mcuAlert(int seconds, int op) {
Log.i(TAG, "onAlert:" + seconds + "," + op);
String text = "MCU上发报警:" + seconds + "秒;" + getAlertOpStr(op);
addText(text);
}

@Override
public void mcuStopAlert() {
Log.i(TAG, "onStopAlert");
String text = "MCU停止报警";
addText(text);
}

@Override
public void mcuCallbackSetZero(int status) {
Log.i(TAG, "onSetZero:" + status);
String text = "MCU回复去皮(归零):" + getStatusStr(status);
addText(text);
}

@Override
public void mcuCallbackSetWeightUnit(int status) {
Log.i(TAG, "onSetWeightUnit:" + status);
String text = "MCU回复设置重量单位:" + getStatusStr(status);
addText(text);
}

@Override
public void mcuCallbackSetTempUnit(int status) {
Log.i(TAG, "onSetTempUnit:" + status);
String text = "MCU回复设置温度单位:" + getStatusStr(status);
addText(text);
}

@Override
public void mcuCallbackSetAutoShutdown(int status) {
Log.i(TAG, "onSetAutoShutdown:" + status);
String text = "MCU回复设置自动关机:" + getStatusStr(status);
addText(text);
}

@Override
public void mcuCallbackSetTiming(int status) {
Log.i(TAG, "onSetTiming:" + status);
String text = "MCU回复设置计时功能:" + getStatusStr(status);
addText(text);
}

@Override
public void mcuCallbackSetAlert(int status) {
Log.i(TAG, "onSetAlert:" + status);
String text = "MCU回复设置警报功能:" + getStatusStr(status);
addText(text);
}

@Override
public void mcuCallbackStopAlert(int status) {
Log.i(TAG, "onStopAlert:" + status);
String text = "MCU回复停止警报功能:" + getStatusStr(status);
addText(text);
}

@Override
public void mcuBrewMode(int status) {
Log.i(TAG, "onBrewMode:" + status);
String text = "MCU冲煮模式:" + getBrewMode(status);
addText(text);
}

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

}

// APP下发去皮功能(归零功能)
private void appSetZero() {
Log.i(TAG, "去皮功能(归零功能)");
if (mCoffeeScaleData != null) {
addText("APP下发归零");
mCoffeeScaleData.setZero();
}
}

// APP设置重量单位
private void appSetWeightUnit() {
Log.i(TAG, "设置重量单位");
int weightUnit = rb_kg.isChecked() ? 0 : rb_jin.isChecked() ? 1 : rb_lb_oz.isChecked() ? 2 : rb_oz.isChecked() ? 3 : rb_st_lb.isChecked() ? 4 : rb_g.isChecked() ? 5 : rb_lb.isChecked() ? 6 : 0;
if (mCoffeeScaleData != null) {
addText("APP下发重量单位:" + weightUnit + ";" + getWeightUnitStr(weightUnit));
mCoffeeScaleData.setWeightUnit(weightUnit);
}
}

// APP设置温度单位
private void appSetTempUnit() {
Log.i(TAG, "设置温度单位");
int tempUnit = rb_c.isChecked() ? 0 : rb_f.isChecked() ? 1 : 0;
if (mCoffeeScaleData != null) {
addText("APP下发温度单位:" + tempUnit + ";" + getTempUnitStr(tempUnit));
mCoffeeScaleData.setTempUnit(tempUnit);
}
}

// APP设置自动关机
private void appSetAutoShutdown() {
Log.i(TAG, "设置自动关机");
String str = et_auto_shutdown.getText().toString();
if (!TextUtils.isEmpty(str)) {
int num = -1;
try {
num = Integer.parseInt(str);
} catch (Exception e) {
addText("APP下发自动关机:必须为整数");
}
if (num >= 0xffff) {
addText("APP下发自动关机:不能≥65535");
} else if (num < 0) {
addText("APP下发自动关机:必须为正整数");
} else {
if (mCoffeeScaleData != null) {
addText("APP下发自动关机:" + num + "秒");
mCoffeeScaleData.setAutoShutdown(num);
}
}
} else {
addText("APP下发自动关机:不能为空");
}
}

// APP计时功能控制
private void appSetTiming() {
Log.i(TAG, "计时功能控制");
String str = et_timing.getText().toString();
if (!TextUtils.isEmpty(str)) {
int num = -1;
try {
num = Integer.parseInt(str);
} catch (Exception e) {
addText("APP下发计时功能:必须为整数");
}
if (num >= 0xffff) {
addText("APP下发计时功能:不能≥65535");
} else if (num < 0) {
addText("APP下发计时功能:必须为正整数");
} else {
int type = rb_positive_timing.isChecked() ? 0 : rb_negative_timing.isChecked() ? 1 : 0;
int op = rb_timing_start.isChecked() ? 1 : rb_timing_pause.isChecked() ? 2 : rb_timing_reset.isChecked() ? 3 : 0;
if (mCoffeeScaleData != null) {
addText("APP下发计时功能:" + num + "秒;" + getTimingStr(type) + ";" + getTimingOpStr(op));
mCoffeeScaleData.setTiming(num, type, op);
}
}
} else {
addText("APP下发计时功能:不能为空");
}
}

// APP回复计时功能
private void appCallbackTiming() {
Log.i(TAG, "回复计时功能");
int status = rb_callback_timing_success.isChecked() ? 0 : rb_callback_timing_fail.isChecked() ? 1 : rb_callback_timing_not_support.isChecked() ? 2 : 0;
if (mCoffeeScaleData != null) {
addText("APP回复计时功能:" + status + ";" + getStatusStr(status));
mCoffeeScaleData.callbackTiming(status);
}
}

// APP报警设置指令
private void appSetAlert() {
Log.i(TAG, "报警设置指令");
String str = et_alert.getText().toString();
if (!TextUtils.isEmpty(str)) {
int num = -1;
try {
num = Integer.parseInt(str);
} catch (Exception e) {
addText("APP下发报警设置:必须为整数");
}
if (num >= 0xffff) {
addText("APP下发报警设置:不能≥65535");
} else if (num < 0) {
addText("APP下发报警设置:必须为正整数");
} else {
int op = rb_alert_close.isChecked() ? 0 : rb_alert_open.isChecked() ? 1 : 0;
if (mCoffeeScaleData != null) {
addText("APP下发报警设置:" + num + "秒;" + getAlertOpStr(op));
mCoffeeScaleData.setAlert(num, op);
}
}
} else {
addText("APP下发报警设置:不能为空");
}
}

// APP停止报警指令
private void appStopAlert() {
Log.i(TAG, "停止报警指令");
if (mCoffeeScaleData != null) {
addText("APP下发停止报警");
mCoffeeScaleData.stopAlert();
}
}

// APP回复报警设置
private void appCallbackAlert() {
Log.i(TAG, "回复报警设置");
int status = rb_callback_alert_success.isChecked() ? 0 : rb_callback_alert_fail.isChecked() ? 1 : rb_callback_alert_not_support.isChecked() ? 2 : 0;
if (mCoffeeScaleData != null) {
addText("APP回复报警设置:" + status + ";" + getStatusStr(status));
mCoffeeScaleData.callbackAlert(status);
}
}

// APP回复停止报警
private void appCallbackStopAlert() {
Log.i(TAG, "回复停止报警");
int status = rb_callback_stop_alert_success.isChecked() ? 0 : rb_callback_stop_alert_fail.isChecked() ? 1 : rb_callback_stop_alert_not_support.isChecked() ? 2 : 0;
if (mCoffeeScaleData != null) {
addText("APP回复停止报警:" + status + ";" + getStatusStr(status));
mCoffeeScaleData.callbackStopAlert(status);
}
}

// APP设置冲煮模式
private void appBrewMode() {
Log.i(TAG, "设置冲煮模式");
int status = rb_brew_mode_enter.isChecked() ? 1 : 0;
if (mCoffeeScaleData != null) {
addText("APP设置冲煮模式:" + status + ";" + getBrewMode(status));
mCoffeeScaleData.brewMode(status);
}
}

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 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 getTempUnitStr(int tempUnit) {
switch (tempUnit) {
case 0:
return "℃";
case 1:
return "℉";
}
return "";
}

private String getErrStr(int err) {
switch (err) {
case 0:
return "无异常";
case 1:
return "超重";
}
return "";
}

private String getStatusStr(int status) {
switch (status) {
case 0:
return "成功";
case 1:
return "失败";
case 2:
return "不支持";
}
return "";
}

private String getPowerStatusStr(int status) {
switch (status) {
case 0:
return "没有充电";
case 1:
return "充电中";
case 2:
return "充满电";
case 3:
return "充电异常";
}
return "";
}

private String getTimingStr(int type) {
switch (type) {
case 0:
return "正计时";
case 1:
return "倒计时";
}
return "";
}

private String getTimingOpStr(int op) {
switch (op) {
case 1:
return "计时";
case 2:
return "暂停";
case 3:
return "重置";
}
return "";
}
private String getAlertOpStr(int op) {
switch (op) {
case 0:
return "关闭";
case 1:
return "打开";
}
return "";
}

private String getBrewMode(int status) {
switch (status) {
case 0:
return "退出";
case 1:
return "进入";
}
return "";
}
}

+ 361
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/food_temp/FoodTempActivity.java Bestand weergeven

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

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

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

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

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

/**
* 食品温度计界面
*/
public class FoodTempActivity extends BleBaseActivity implements View.OnClickListener, FoodTempData.FoodTempCallback {

private static final String TAG = "Tag1";

private Button btn_clear;
private Button btn_get_device;
private Button btn_set_temp_unit;
private RadioButton rb_set_c;
private RadioButton rb_set_f;
private Button btn_stop_alert;
private Spinner sp_stop_alert;
private Button btn_set_target;
private Spinner sp_set_target;
private EditText et_set_target;
private RadioButton rb_set_target_c;
private RadioButton rb_set_target_f;
private Button btn_set_timing;
private Spinner sp_set_timing;
private EditText et_set_timing;
private Button btn_open_close;
private RadioButton rb_open;
private RadioButton rb_close;
private Button btn_sync_time;
private EditText et_year;
private EditText et_month;
private EditText et_day;
private EditText et_hour;
private EditText et_minute;
private EditText et_second;
private EditText et_week;
private Button btn_open_close_probe;
private Spinner sp_open_close_probe;
private RadioButton rb_open_probe;
private RadioButton rb_close_probe;

private ListView list_view;

private List<String> mList;
private ArrayAdapter mListAdapter;

private String mMac;
private BleDevice mBleDevice;
private FoodTempData mFoodTempData;

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

btn_clear = findViewById(R.id.btn_clear);
btn_get_device = findViewById(R.id.btn_get_device);
btn_set_temp_unit = findViewById(R.id.btn_set_temp_unit);
rb_set_c = findViewById(R.id.rb_set_c);
rb_set_f = findViewById(R.id.rb_set_f);
btn_stop_alert = findViewById(R.id.btn_stop_alert);
sp_stop_alert = findViewById(R.id.sp_stop_alert);
btn_set_target = findViewById(R.id.btn_set_target);
sp_set_target = findViewById(R.id.sp_set_target);
et_set_target = findViewById(R.id.et_set_target);
rb_set_target_c = findViewById(R.id.rb_set_target_c);
rb_set_target_f = findViewById(R.id.rb_set_target_f);
btn_set_timing = findViewById(R.id.btn_set_timing);
sp_set_timing = findViewById(R.id.sp_set_timing);
et_set_timing = findViewById(R.id.et_set_timing);
btn_open_close = findViewById(R.id.btn_open_close);
rb_open = findViewById(R.id.rb_open);
rb_close = findViewById(R.id.rb_close);
btn_sync_time = findViewById(R.id.btn_sync_time);
et_year = findViewById(R.id.et_year);
et_month = findViewById(R.id.et_month);
et_day = findViewById(R.id.et_day);
et_hour = findViewById(R.id.et_hour);
et_minute = findViewById(R.id.et_minute);
et_second = findViewById(R.id.et_second);
et_week = findViewById(R.id.et_week);
btn_open_close_probe = findViewById(R.id.btn_open_close_probe);
sp_open_close_probe = findViewById(R.id.sp_open_close_probe);
rb_open_probe = findViewById(R.id.rb_open_probe);
rb_close_probe = findViewById(R.id.rb_close_probe);
list_view = findViewById(R.id.list_view);

btn_clear.setOnClickListener(this);
btn_get_device.setOnClickListener(this);
btn_set_temp_unit.setOnClickListener(this);
btn_stop_alert.setOnClickListener(this);
btn_set_target.setOnClickListener(this);
btn_set_timing.setOnClickListener(this);
btn_open_close.setOnClickListener(this);
btn_sync_time.setOnClickListener(this);
btn_open_close_probe.setOnClickListener(this);

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

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

// 默认时间
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
et_year.setText("" + calendar.get(Calendar.YEAR));
et_month.setText("" + (calendar.get(Calendar.MONTH) + 1));
et_day.setText("" + calendar.get(Calendar.DAY_OF_MONTH));
et_hour.setText("" + calendar.get(Calendar.HOUR_OF_DAY));
et_minute.setText("" + calendar.get(Calendar.MINUTE));
et_second.setText("" + calendar.get(Calendar.SECOND));
int week = (calendar.get(Calendar.DAY_OF_WEEK) - 1);
if (week <= 0) {
week = 7;
}
et_week.setText("" + week);
}

@Override
public void onClick(View v) {
int id = v.getId();
if (id == R.id.btn_clear) {
clearText();
} else if (id == R.id.btn_get_device) {
appGetDevice();
} else if (id == R.id.btn_set_temp_unit) {
appSetTempUnit();
} else if (id == R.id.btn_stop_alert) {
appStopAlert();
} else if (id == R.id.btn_set_target) {
appSetTargetTemp();
} else if (id == R.id.btn_set_timing) {
appSetTiming();
} else if (id == R.id.btn_open_close) {
appOpenClose();
} else if (id == R.id.btn_sync_time) {
appSyncTime();
} else if (id == R.id.btn_open_close_probe) {
appOpenCloseProbe();
}
}

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

@Override
public void onServiceSuccess() {
mBleDevice = mBluetoothService.getBleDevice(mMac);
if (mBleDevice != null) {
mFoodTempData = new FoodTempData(mBleDevice);
mFoodTempData.setFoodTempCallback(this);
}
}

@Override
public void onServiceErr() {

}

@Override
public void unbindServices() {

}

@Override
public void mcuDevice(int probeNum, int chargerState, int battery, int tempUnit, int alertType) {
addText("MCU上发设备信息:探针数量:" + probeNum + ",充电状态:" + chargerState + ",电量:" + battery + ",温度单位:" + tempUnit + ",警报类型:" + alertType);
}

@Override
public void mcuResult(int id, int inDevice, int curTemp, int curTempUnit, int ambienceTemp, int ambienceTempUnit, int targetTemp, int targetTempUnit, int inMeat, int enableAlert, int mode, int timing, int alertType) {
addText("MCU上发数据:探针编号:" + id + ",探针插入设备状态:" + inDevice + ",当前温度:" + curTemp + ",当前温度单位:" + curTempUnit + ",环境温度:" + ambienceTemp + ",环境温度单位:" + ambienceTempUnit + ",目标温度:" + targetTemp + ",目标温度单位:" + targetTempUnit + ",探针插入肉状态:" + inMeat + ",警报启动状态:" + enableAlert + ",模式:" + mode + ",定时:" + timing + ",警报类型:" + alertType);
}

@Override
public void mcuSetTempUnitResult(int result) {
addText("MCU回复设置温度单位结果:" + result);
}

@Override
public void mcuStopAlertResult(int result) {
addText("MCU回复停止警报结果:" + result);
}

@Override
public void mcuSetTargetTempResult(int result) {
addText("MCU回复设置目标温度结果:" + result);
}

@Override
public void mcuSetTimingResult(int result) {
addText("MCU回复设置定时结果:" + result);
}

@Override
public void mcuOpenCloseResult(int result) {
addText("MCU回复开关机结果:" + result);
}

@Override
public void mcuSyncTimeResult(int result) {
addText("MCU回复同步时间结果:" + result);
}

@Override
public void mcuOpenCloseProbeResult(int result) {
addText("MCU回复开关探针结果:" + result);
}

/**
* APP获取设备信息
*/
private void appGetDevice() {
mFoodTempData.appGetDevice();
addText("APP请求获取设备信息");
}

/**
* APP设置温度单位
*/
private void appSetTempUnit() {
int unit = rb_set_c.isChecked() ? 0 : 1;
mFoodTempData.appSetTempUnit(unit);
addText("APP设置温度单位:" + unit);
}

/**
* APP停止设备报警
*/
private void appStopAlert() {
int id = sp_stop_alert.getSelectedItemPosition();
mFoodTempData.appStopAlert(id);
addText("APP停止设备报警:" + id);
}

/**
* APP设置目标温度
*/
private void appSetTargetTemp() {
int id = sp_set_target.getSelectedItemPosition();
int temp = 0;
int tempUnit = rb_set_target_c.isChecked() ? 0 : 1;
try {
temp = Integer.parseInt(et_set_target.getText().toString());
} catch (Exception ignored) {
addText("目标温度必须是整数");
return;
}
mFoodTempData.appSetTargetTemp(id, temp, tempUnit);
addText("APP设置目标温度:编号:" + id + ",温度:" + temp + ",温度单位:" + tempUnit);
}

/**
* APP设置定时
*/
private void appSetTiming() {
int id = sp_set_timing.getSelectedItemPosition();
int minute = 0;
try {
minute = Integer.parseInt(et_set_timing.getText().toString());
} catch (Exception ignored) {
addText("定时必须是整数");
return;
}
mFoodTempData.appSetTiming(id, minute);
addText("APP设置定时:编号:" + id + ",分钟:" + minute);
}

/**
* APP开关设备
*/
private void appOpenClose() {
boolean isOpen = rb_open.isChecked();
mFoodTempData.appOpenClose(isOpen);
addText("APP开关设备:" + isOpen);
}

/**
* APP同步时间
*/
private void appSyncTime() {
int year = 0;
int month = 0;
int day = 0;
int hour = 0;
int minute = 0;
int second = 0;
int week = 0;
try {
year = Integer.parseInt(et_year.getText().toString());
month = Integer.parseInt(et_month.getText().toString());
day = Integer.parseInt(et_day.getText().toString());
hour = Integer.parseInt(et_hour.getText().toString());
minute = Integer.parseInt(et_minute.getText().toString());
second = Integer.parseInt(et_second.getText().toString());
week = Integer.parseInt(et_week.getText().toString());
} catch (Exception ignored) {
addText("年月日时分秒必须是整数");
return;
}
mFoodTempData.appSyncTime(year, month, day, hour, minute, second, week);
addText("APP同步时间:年:" + year + ",月:" + month + ",日:" + day + ",时:" + hour + ",分:" + minute + ",秒:" + second + ",一周第几天:" + week);
}

/**
* APP开关探针
*/
private void appOpenCloseProbe() {
int id = sp_open_close_probe.getSelectedItemPosition();
boolean isOpen = rb_open_probe.isChecked();
mFoodTempData.appOpenCloseProbe(id, isOpen);
addText("APP开关探针:编号:" + id + "," + isOpen);
}

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

+ 241
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/share_charger/ShareChargerActivity.java Bestand weergeven

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

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 android.widget.SeekBar;
import android.widget.TextView;

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

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

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.ShareCharger.ShareChargerData;

/**
* 共享充电器
*/
public class ShareChargerActivity extends BleBaseActivity implements View.OnClickListener, ShareChargerData.ShareChargerCallback {

private Button btn_set;
private SeekBar seek_hour;
private SeekBar seek_minute;
private SeekBar seek_second;
private TextView tv_hour;
private TextView tv_minute;
private TextView tv_second;
private Button btn_get;
private Button btn_switch;
private RadioButton rb_open;
private RadioButton rb_close;
private ListView list_view;

private List<String> mList;
private ArrayAdapter mListAdapter;

private String mMac;
private BleDevice mBleDevice;
private ShareChargerData mShareChargerData;

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

btn_set = findViewById(R.id.btn_set);
seek_hour = findViewById(R.id.seek_hour);
seek_minute = findViewById(R.id.seek_minute);
seek_second = findViewById(R.id.seek_second);
tv_hour = findViewById(R.id.tv_hour);
tv_minute = findViewById(R.id.tv_minute);
tv_second = findViewById(R.id.tv_second);
btn_get = findViewById(R.id.btn_get);
btn_switch = findViewById(R.id.btn_switch);
rb_open = findViewById(R.id.rb_open);
rb_close = findViewById(R.id.rb_close);
list_view = findViewById(R.id.list_view);

btn_set.setOnClickListener(this);
btn_get.setOnClickListener(this);
btn_switch.setOnClickListener(this);

// 滑动修改时间显示
seek_hour.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
tv_hour.setText(progress + "时");
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {

}
});
seek_minute.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
tv_minute.setText(progress + "分");
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {

}
});
seek_second.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
tv_second.setText((progress + 1) + "秒");
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {

}
});

// 获取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) {
switch (v.getId()) {
case R.id.btn_set:
int hour = seek_hour.getProgress();
int minute = seek_minute.getProgress();
int second = seek_second.getProgress() + 1;
if (mShareChargerData != null) {
addText("APP设置充电时间:" + getTimeStr(hour, minute, second));
mShareChargerData.appSetChargerTime(hour, minute, second);
}
break;
case R.id.btn_get:
if (mShareChargerData != null) {
addText("APP获取剩余充电时间");
mShareChargerData.appGetChargerTime();
}
break;
case R.id.btn_switch:
boolean isOpen = rb_open.isChecked();
if (mShareChargerData != null) {
addText("APP切换开关:" + isOpen);
mShareChargerData.appSwitch(isOpen);
}
break;
}
}

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

@Override
public void onServiceSuccess() {
mBleDevice = mBluetoothService.getBleDevice(mMac);
if (mBleDevice != null) {
mShareChargerData = new ShareChargerData(mBleDevice);
mShareChargerData.setShareChargerCallback(this);
}
}

@Override
public void onServiceErr() {

}

@Override
public void unbindServices() {

}

@Override
public void mcuSetChargerTime(int status) {
addText("MCU回复设置充电时间:" + getStatusStr(status));
}

@Override
public void mcuGetChargerTime(int status, int hour, int minute, int second) {
addText("MCU回复查询剩余充电时间:" + getStatusStr(status) + ";" + getTimeStr(hour, minute, second));
}

@Override
public void mcuSwitch(int status) {
addText("MCU回复开关:" + getStatusStr(status));
}

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

private String getStatusStr(int status) {
switch (status) {
case 0:
return "成功";
case 1:
return "失败";
case 2:
return "不支持";
}
return "";
}
private String getTimeStr(int hour, int minute, int second) {
String hourStr;
if (hour >= 0) {
hourStr = hour >= 10 ? "" + hour : "0" + hour;
} else {
hourStr = "NULL";
}
String minuteStr;
if (minute >= 0) {
minuteStr = minute >= 10 ? "" + minute : "0" + minute;
} else {
minuteStr = "NULL";
}
String secondStr;
if (second >= 0) {
secondStr = second >= 10 ? "" + second : "0" + second;
} else {
secondStr = "NULL";
}
return hourStr + ":" + minuteStr + ":" + secondStr;
}
}

+ 346
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/share_condom/ShareCondomActivity.java Bestand weergeven

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

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

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

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

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.ShareCondom.ShareCondomData;

/**
* 共享套套机
*/
public class ShareCondomActivity extends BleBaseActivity implements View.OnClickListener, ShareCondomData.ShareCondomCallback {

private static final int MSG_TIMING = 100;

private Button btn_set;
private SeekBar seek_hour;
private SeekBar seek_minute;
private SeekBar seek_second;
private TextView tv_hour;
private TextView tv_minute;
private TextView tv_second;
private Button btn_get;
private Button btn_switch;
private RadioButton rb_open;
private RadioButton rb_close;
private ListView list_view;
private Button btn_out;
private Button btn_recycle;
private Button btn_open;
private TextView tv_time;

private List<String> mList;
private ArrayAdapter mListAdapter;

private String mMac;
private BleDevice mBleDevice;
private ShareCondomData mShareCondomData;

private long mEndStamp = 0;// 剩余时间目标的结束时间

/**
* 计时
*/
private Handler mHandler = new Handler(Looper.myLooper()) {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
if (msg.what == MSG_TIMING) {
// 判断显示
long stamp = mEndStamp - System.currentTimeMillis();
int second = (int) stamp / 1000;
if (second > 0) {
tv_time.setText("剩余时间:" + second + "秒");
// 1秒后重新刷新
sendEmptyMessageDelayed(MSG_TIMING, 1000);
} else {
tv_time.setText("");
// 停止刷新
removeMessages(MSG_TIMING);
}
}
}
};

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

btn_set = findViewById(R.id.btn_set);
seek_hour = findViewById(R.id.seek_hour);
seek_minute = findViewById(R.id.seek_minute);
seek_second = findViewById(R.id.seek_second);
tv_hour = findViewById(R.id.tv_hour);
tv_minute = findViewById(R.id.tv_minute);
tv_second = findViewById(R.id.tv_second);
btn_get = findViewById(R.id.btn_get);
btn_switch = findViewById(R.id.btn_switch);
rb_open = findViewById(R.id.rb_open);
rb_close = findViewById(R.id.rb_close);
list_view = findViewById(R.id.list_view);
btn_out = findViewById(R.id.btn_out);
btn_recycle = findViewById(R.id.btn_recycle);
btn_open = findViewById(R.id.btn_open);
tv_time = findViewById(R.id.tv_time);

btn_set.setOnClickListener(this);
btn_get.setOnClickListener(this);
btn_switch.setOnClickListener(this);
btn_out.setOnClickListener(this);
btn_recycle.setOnClickListener(this);
btn_open.setOnClickListener(this);

// 滑动修改时间显示
seek_hour.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
tv_hour.setText(progress + "时");
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {

}
});
seek_minute.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
tv_minute.setText(progress + "分");
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {

}
});
seek_second.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
tv_second.setText((progress + 1) + "秒");
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {

}
});

// 获取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_set) {
int hour = seek_hour.getProgress();
int minute = seek_minute.getProgress();
int second = seek_second.getProgress() + 1;
if (mShareCondomData != null) {
addText("APP设置充电时间:" + getTimeStr(hour, minute, second));
mShareCondomData.appSetCondomTime(hour, minute, second);

mEndStamp = System.currentTimeMillis() + (hour * 60 * 60 + minute * 60 + second) * 1000 + 1500;// 500是当前秒,1000是设备自己加的
mHandler.removeMessages(MSG_TIMING);
mHandler.sendEmptyMessageDelayed(MSG_TIMING, 1000);
}
} else if (id == R.id.btn_get) {
if (mShareCondomData != null) {
addText("APP获取剩余充电时间");
mShareCondomData.appGetCondomTime();
}
} else if (id == R.id.btn_switch) {
boolean isOpen = rb_open.isChecked();
if (mShareCondomData != null) {
addText("APP切换开关:" + isOpen);
mShareCondomData.appSwitch(isOpen);
}
} else if (id == R.id.btn_out) {
if (mShareCondomData != null) {
addText("APP仓位出仓");
mShareCondomData.appOut();
}
} else if (id == R.id.btn_recycle) {
if (mShareCondomData != null) {
addText("APP仓位回收");
mShareCondomData.appRecycle();
}
} else if (id == R.id.btn_open) {
if (mShareCondomData != null) {
addText("APP打开补货门");
mShareCondomData.appOpen();
}
}
}

@Override
protected void onDestroy() {
mHandler.removeCallbacksAndMessages(null);
mHandler = null;

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

@Override
public void onServiceSuccess() {
mBleDevice = mBluetoothService.getBleDevice(mMac);
if (mBleDevice != null) {
mShareCondomData = new ShareCondomData(mBleDevice);
mShareCondomData.setShareCondomCallback(this);
}
}

@Override
public void onServiceErr() {

}

@Override
public void unbindServices() {

}

@Override
public void mcuSetCondomTime(int status) {
addText("MCU回复设置充电时间:" + getStatusStr(status));
}

@Override
public void mcuGetCondomTime(int status, int hour, int minute, int second) {
addText("MCU回复查询剩余充电时间:" + getStatusStr(status) + ";" + getTimeStr(hour, minute, second));
}

@Override
public void mcuSwitch(int status) {
addText("MCU回复开关:" + getStatusStr(status));
}

@Override
public void mcuOut(int status) {
addText("MCU回复仓位出仓:" + getCondomOutStr(status));
}

@Override
public void mcuRecycle(int status) {
addText("MCU回复仓位回收:" + getCondomRecycleStr(status));
}

@Override
public void mcuOpen(int status) {
addText("MCU回复打开缺货仓:" + getCondomOutStr(status));
}

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

private String getStatusStr(int status) {
switch (status) {
case 0:
return "成功";
case 1:
return "失败";
case 2:
return "不支持";
}
return "";
}

private String getCondomOutStr(int status) {
switch (status) {
case 0:
return "成功";
case 1:
return "不支持";
case 2:
return "电机或限位开关故障";
case 3:
return "仓位已出仓";
}
return "";
}

private String getCondomRecycleStr(int status) {
switch (status) {
case 0:
return "成功";
case 1:
return "不支持";
case 2:
return "电机或限位开关故障";
case 3:
return "仓位未出仓";
}
return "";
}

private String getTimeStr(int hour, int minute, int second) {
String hourStr;
if (hour >= 0) {
hourStr = hour >= 10 ? "" + hour : "0" + hour;
} else {
hourStr = "NULL";
}
String minuteStr;
if (minute >= 0) {
minuteStr = minute >= 10 ? "" + minute : "0" + minute;
} else {
minuteStr = "NULL";
}
String secondStr;
if (second >= 0) {
secondStr = second >= 10 ? "" + second : "0" + second;
} else {
secondStr = "NULL";
}
return hourStr + ":" + minuteStr + ":" + secondStr;
}
}

+ 564
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/share_socket/ShareSocketActivity.java Bestand weergeven

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

import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.SeekBar;
import android.widget.Spinner;
import android.widget.TextView;

import com.pingwang.bluetoothlib.BleBaseActivity;
import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.listener.OnCallbackBle;
import com.pingwang.bluetoothlib.listener.OnScanFilterListener;

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

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import cn.net.aicare.modulelibrary.module.ShareSocket.ShareSocketData;

/**
* 共享插座
*/
public class ShareSocketActivity extends BleBaseActivity implements View.OnClickListener, ShareSocketData.ShareSocketCallback, OnCallbackBle, OnScanFilterListener {

private static final int MSG_TEST_START_SCAN = 100;

private Button btn_set;
private SeekBar seek_hour;
private SeekBar seek_minute;
private SeekBar seek_second;
private TextView tv_hour;
private TextView tv_minute;
private TextView tv_second;
private Button btn_get;
private Button btn_switch;
private RadioButton rb_open;
private RadioButton rb_close;
private ListView list_view;
private Spinner sp;
private TextView tv_timing_0;
private TextView tv_timing_1;
private TextView tv_test;

private List<String> mList;
private ArrayAdapter mListAdapter;

private String mMac;
private BleDevice mBleDevice;
private ShareSocketData mShareSocketData;

private Map<Integer, Long> mTimingMap;// 计时map;key:编号;value:结束的时间戳

private SimpleDateFormat mSDF;

private boolean mIsTest = false;// 是否在进行测试
private long mTestAllStamp = 30 * 60 * 1000;// 完整测试时长
private long mTestSingleStamp = 2 * 60 * 1000;// 单轮测试时长
private long mTestStartStamp = 0;// 下发完整测试时长那一刻的时间戳

private int mTest1SuccessCount = 0;// 成功次数
private int mTest1AbnormalCount = 0;// 异常次数
private int mTest1Abnormal10Count = 0;// 异常超过10秒的次数
private int mTest1ResetCount = 0;// 复位次数

private int mTest2SuccessCount = 0;// 成功次数
private int mTest2AbnormalCount = 0;// 异常次数
private int mTest2Abnormal10Count = 0;// 异常超过20秒的次数
private int mTest2ResetCount = 0;// 复位次数

private int mTestConnectSuccessCount = 0;// 测试时连接成功的次数
private int mTestConnectFailCount = 0;// 测试时连接失败的次数

private Handler mHandler = new Handler(Looper.myLooper()) {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);

long endStamp = mTimingMap.get(msg.what);
int timeStamp = (int) (endStamp - System.currentTimeMillis()) / 1000;
String text = "编号" + msg.what + "计时:" + timeStamp + "秒";
switch (msg.what) {
case 0:
tv_timing_0.setText(text);
break;
case 1:
tv_timing_1.setText(text);
break;
}
// 判断倒计时结束了没有
if (timeStamp > 0) {
// 没结束,1秒后继续
mHandler.sendEmptyMessageDelayed(msg.what, 1000);
} else {
// 结束了,gg
mHandler.removeMessages(msg.what);
}
}
};

// 测试Handler
private Handler mTestHandler = new Handler(Looper.myLooper()) {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case MSG_TEST_START_SCAN:
// 开始扫描设备
addText("准备重连,开始扫描设备:" + mMac);
mBluetoothService.scanLeDevice(0);
break;
}
}
};

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

btn_set = findViewById(R.id.btn_set);
seek_hour = findViewById(R.id.seek_hour);
seek_minute = findViewById(R.id.seek_minute);
seek_second = findViewById(R.id.seek_second);
tv_hour = findViewById(R.id.tv_hour);
tv_minute = findViewById(R.id.tv_minute);
tv_second = findViewById(R.id.tv_second);
btn_get = findViewById(R.id.btn_get);
btn_switch = findViewById(R.id.btn_switch);
rb_open = findViewById(R.id.rb_open);
rb_close = findViewById(R.id.rb_close);
list_view = findViewById(R.id.list_view);
sp = findViewById(R.id.sp);
tv_timing_0 = findViewById(R.id.tv_timing_0);
tv_timing_1 = findViewById(R.id.tv_timing_1);
tv_test = findViewById(R.id.tv_test);

btn_set.setOnClickListener(this);
btn_get.setOnClickListener(this);
btn_switch.setOnClickListener(this);

// 滑动修改时间显示
seek_hour.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
tv_hour.setText(progress + "时");
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {

}
});
seek_minute.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
tv_minute.setText(progress + "分");
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {

}
});
seek_second.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
tv_second.setText((progress + 1) + "秒");
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {

}
});

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

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

mTimingMap = new HashMap<>();

mSDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);
}

@Override
public void onClick(View v) {
int id = v.getId();
if (id == R.id.btn_set) {
int spId = sp.getSelectedItemPosition();
int hour = seek_hour.getProgress();
int minute = seek_minute.getProgress();
int second = seek_second.getProgress() + 1;
if (mShareSocketData != null) {
addText("APP设置充电时间:" + getTimeStr(hour, minute, second));
mShareSocketData.appSetSocketTime(spId, hour, minute, second);
// 保存到map
long endStamp = System.currentTimeMillis() + hour * 60 * 60 * 1000 + minute * 60 * 1000 + second * 1000 + 2000;// 最后包括这一秒,然后设备又多一秒
mTimingMap.put(spId, endStamp);
// Handler开始计时
mHandler.removeMessages(spId);
mHandler.sendEmptyMessageDelayed(spId, 1000);
}
} else if (id == R.id.btn_get) {
int spId = sp.getSelectedItemPosition();
if (mShareSocketData != null) {
addText("APP获取剩余充电时间");
mShareSocketData.appGetSocketTime(spId);
}
} else if (id == R.id.btn_switch) {
int spId = sp.getSelectedItemPosition();
boolean isOpen = rb_open.isChecked();
if (mShareSocketData != null) {
addText("APP切换开关:" + isOpen);
mShareSocketData.appSwitch(spId, isOpen);
}
} else if (id == R.id.btn_version) {
if (mShareSocketData != null) {
addText("APP获取设备版本号");
mShareSocketData.appGetVersion();
}
} else if (id == R.id.btn_test) {
if (!mIsTest && mShareSocketData != null) {
mIsTest = true;
addText("开始性能测试");
startTest();
}
}
}

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

@Override
public void onServiceSuccess() {
mBluetoothService.setOnCallback(this);
mBluetoothService.setOnScanFilterListener(this);
mBleDevice = mBluetoothService.getBleDevice(mMac);
if (mBleDevice != null) {
mShareSocketData = new ShareSocketData(mBleDevice);
mShareSocketData.setShareSocketCallback(this);
}
}

@Override
public void onScanning(BleValueBean data) {
// 扫描到了设备
if (mIsTest && !mBluetoothService.isConnectStatus()) {
// 开始连接设备
addText("扫描到设备,开始连接");
mBluetoothService.connectDevice(mMac);
// 停止扫描
mBluetoothService.stopScan();
}
}

@Override
public boolean onFilter(BleValueBean bleValueBean) {
// 只扫描相同的设备
return bleValueBean.getMac().equals(mMac);
}

@Override
public void onServiceErr() {

}

@Override
public void unbindServices() {

}

@Override
public void mcuSetSocketTime(int id, int status) {
addText("MCU回复设置充电时间:编号:" + id + ";" + getStatusStr(status));
}

private int mCha1 = -1;
private int mCha2 = -1;
@Override
public void mcuGetSocketTime(int id, int status, int hour, int minute, int second) {
if (mCha1 >= 0 && mCha2 >= 0) {
// 已经回了2次了,多出来的回复不处理
return;
}

addText("MCU回复查询剩余充电时间:编号:" + id + ";" + getStatusStr(status) + ";" + getTimeStr(hour, minute, second));
long mcuStamp = hour * 60 * 60 * 1000 + minute * 60 * 1000 + second * 1000;
long appStamp = mTestAllStamp - (System.currentTimeMillis() - mTestStartStamp);

if (appStamp < 0) {
appStamp = 0;
}

if (mIsTest) {
int cha = Math.abs((int) (mcuStamp - appStamp));
appStamp /= 1000;
int h = (int) (appStamp / 60 / 60);
int m = (int) (appStamp - hour * 60 * 60) / 60;
int s = (int) appStamp % 60;
addText("和APP的计时:" + getTimeStr(h, m, s) + "相差" + cha + "ms");

cha /= 1000;
if (id == 0) {
mCha1 = cha;
} else if (id == 1) {
mCha2 = cha;
}
boolean needReset = false;
if (mCha1 >= 0 && mCha2 >= 0) {
// 两条数据都回来了
if (mcuStamp == 0 && appStamp > 0) {
mTest1ResetCount++;
needReset = true;
} else if (mCha1 < 5000) {
mTest1SuccessCount++;
} else if (mCha1 < 10000) {
mTest1AbnormalCount++;
needReset = true;
} else {
mTest1Abnormal10Count++;
needReset = true;
}
if (mcuStamp == 0 && appStamp > 0) {
mTest2ResetCount++;
needReset = true;
} else if (mCha2 < 5000) {
mTest2SuccessCount++;
} else if (mCha2 < 10000) {
mTest2AbnormalCount++;
needReset = true;
} else {
mTest2Abnormal10Count++;
needReset = true;
}
// 刷新显示
refreshTest();
// 判断要不要重新发送充电时长
if (needReset) {
// 有异常,需要重置
addText("出现异常,需要重置充电时间");
startTest();
} else if (appStamp <= 0) {
// 几轮都走完了
addText("测试完成,重新设置充电时间");
startTest();
} else {
// 没有问题
addText("本轮测试结束,总时长还没结束,直接断开,不重置充电时长");
if (mBleDevice != null) {
mBleDevice.disconnect();
mBleDevice = null;
}
}
}
}
}

@Override
public void mcuSwitch(int id, int status) {
addText("MCU回复开关:编号:" + id + ";" + getStatusStr(status));
}

@Override
public void mcuVersion(String version) {
addText("MCU回复版本:" + version);
}

@Override
public void onServicesDiscovered(String mac) {
mBleDevice = mBluetoothService.getBleDevice(mMac);
if (mIsTest && mBleDevice != null) {
mTestConnectSuccessCount++;
addText("连接成功:" + mMac + ",查询剩余充电时间");
mShareSocketData = new ShareSocketData(mBleDevice);
mShareSocketData.setShareSocketCallback(this);

mCha1 = mCha2 = -1;
mShareSocketData.appGetSocketTime(0);
mShareSocketData.appGetSocketTime(1);
}
}

@Override
public void onDisConnected(String mac, int code) {
if (mIsTest) {
long stamp = mTestSingleStamp;
if (stamp < 0) {
stamp = 0;
}
mBleDevice = null;
if (code != 0) {
// 0是自己断开,不是0就说明是连接失败
mTestConnectFailCount++;
addText("设备断开连接:" + code + "。正在测试,等待" + getTimeStrByStamp(10000) + "后重连");
mTestHandler.sendEmptyMessageDelayed(MSG_TEST_START_SCAN, 10000);
} else {
// 自己主动断开要等待
addText("主动断开连接:" + code + "。正在测试,等待" + getTimeStrByStamp(stamp) + "后重连");
mTestHandler.sendEmptyMessageDelayed(MSG_TEST_START_SCAN, stamp);
}
} else {
addText("设备断开连接:" + code);
}
}

// 开始插口1的测试
private void startTest() {
addText("设置充电总时长:" + getTimeStrByStamp(mTestAllStamp));
mTestStartStamp = System.currentTimeMillis() + 2000L;// 1000毫秒是蓝牙的延迟,1000毫秒是MCU自己的延迟

long stamp = mTestAllStamp;
stamp /= 1000;
int hour = (int) (stamp / 60 / 60);
int minute = (int) (stamp - hour * 60 * 60) / 60;
int second = (int) stamp % 60;

mShareSocketData.appSetSocketTime(0, hour, minute, second);
mShareSocketData.appSetSocketTime(1, hour, minute, second);
new Thread(() -> {
try {
Thread.sleep(2000);
} catch (Exception ignored) {
}
if (mBleDevice != null && mBleDevice.isConnectSuccess()) {
addText("设置充电总时长后断开连接");
mBleDevice.disconnect();
mBleDevice = null;
}
}).start();
}

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

private String getStatusStr(int status) {
switch (status) {
case 0:
return "成功";
case 1:
return "失败";
case 2:
return "不支持";
}
return "";
}

private String getTimeStr(int hour, int minute, int second) {
String hourStr;
if (hour >= 0) {
hourStr = hour >= 10 ? "" + hour : "0" + hour;
} else {
hourStr = "NULL";
}
String minuteStr;
if (minute >= 0) {
minuteStr = minute >= 10 ? "" + minute : "0" + minute;
} else {
minuteStr = "NULL";
}
String secondStr;
if (second >= 0) {
secondStr = second >= 10 ? "" + second : "0" + second;
} else {
secondStr = "NULL";
}
return hourStr + ":" + minuteStr + ":" + secondStr;
}

/**
* 根据毫秒数获取时间字符串
*
* @param stamp 毫秒
* @return 时间
*/
private String getTimeStrByStamp(long stamp) {
String str = "";

stamp /= 1000;
int hour = (int) (stamp / 60 / 60);
int minute = (int) (stamp - hour * 60 * 60) / 60;
int second = (int) stamp % 60;

if (hour > 0) {
str += hour + "小时";
}
if (minute > 0) {
str += minute + "分钟";
}
if (second > 0) {
str += second + "秒";
}

return str;
}

/**
* 刷新测试统计
*/
private void refreshTest() {
String str = "";
str += "\n连接次数:" + (mTestConnectSuccessCount + mTestConnectFailCount);
str += "\n连接成功次数:" + mTestConnectSuccessCount;
str += "\n连接失败次数:" + mTestConnectFailCount;
str += "\n连接成功率:" + (mTestConnectSuccessCount * 1.0f / (mTestConnectSuccessCount + mTestConnectFailCount) * 100) + "%";
str += "\n\n插口1成功次数:" + mTest1SuccessCount;
str += "\n插口1重置次数:" + mTest1ResetCount;
str += "\n插口1异常不超过10秒次数:" + mTest1AbnormalCount;
str += "\n插口1异常超过10秒次数:" + mTest1Abnormal10Count;
str += "\n插口1成功率" + (mTest1SuccessCount * 1.0f / (mTest1SuccessCount + mTest1AbnormalCount + mTest1ResetCount + mTest1Abnormal10Count) * 100) + "%";
str += "\n\n插口2成功次数:" + mTest2SuccessCount;
str += "\n插口2重置次数:" + mTest2ResetCount;
str += "\n插口2异常不超过10秒次数:" + mTest2AbnormalCount;
str += "\n插口2异常超过10秒次数:" + mTest2Abnormal10Count;
str += "\n插口2成功率" + (mTest2SuccessCount * 1.0f / (mTest2SuccessCount + mTest2AbnormalCount + mTest2ResetCount + mTest2Abnormal10Count) * 100) + "%";
tv_test.setText(str);
}
}

+ 207
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/AES128Util.java Bestand weergeven

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

import java.security.AlgorithmParameters;
import java.security.Key;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class AES128Util {


//算法名

public static final String KEY_ALGORITHM = "AES";

//加解密算法/模式/填充方式

//可以任意选择,为了方便后面与iOS端的加密解密,采用与其相同的模式与填充方式

//ECB模式只用密钥即可对数据进行加密解密,CBC模式需要添加一个参数iv

public static final String CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding";


//生成密钥

private static byte[] generateKey(String aesKey) throws Exception {

// KeyGenerator kgen = KeyGenerator.getInstance(KEY_ALGORITHM);
//
// kgen.init(128, new SecureRandom(aesKey.getBytes()));
//
// SecretKey secretKey = kgen.generateKey();
//
// byte[] encodeFormat = secretKey.getEncoded();
//
// SecretKeySpec keySpec = new SecretKeySpec(encodeFormat, "AES");
//
// return keySpec.getEncoded();

return aesKey.getBytes();
}


//生成iv

private static AlgorithmParameters generateIV(String ivVal) throws Exception {

//iv 为一个 16 字节的数组,这里采用和 iOS 端一样的构造方法,数据全为0

//byte[] iv = new byte[16];

//Arrays.fill(iv, (byte) 0x00);

//Arrays.fill(iv,ivVal.getBytes());
byte[] iv;
if (ivVal == null || ivVal.length() == 0) {
iv = new byte[16];
} else {
iv = ivVal.getBytes();
}

AlgorithmParameters params = AlgorithmParameters.getInstance(KEY_ALGORITHM);

params.init(new IvParameterSpec(iv));

return params;

}


//转化成JAVA的密钥格式

private static Key convertToKey(byte[] keyBytes) throws Exception {

SecretKey secretKey = new SecretKeySpec(keyBytes, KEY_ALGORITHM);

return secretKey;

}


//加密

public static String encrypt(String plainText, String aesKey, String ivVal) throws Exception {

byte[] data = plainText.getBytes();
byte[] iv;
if (ivVal == null || ivVal.length() == 0) {
iv = new byte[16];
} else {
iv = ivVal.getBytes();
}
AlgorithmParameters params = AlgorithmParameters.getInstance(KEY_ALGORITHM);
params.init(new IvParameterSpec(iv));

//转化为密钥
Key key = convertToKey(aesKey.getBytes());

Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);

//设置为加密模式

cipher.init(Cipher.ENCRYPT_MODE, key, params);

byte[] encryptData = cipher.doFinal(data);

return bytesToHexString(encryptData);

}


//解密

public static String decrypt(String encryptedStr, String aesKey, String ivVal) throws Exception {

byte[] encryptedData = hexStringToByte(encryptedStr);

byte[] keyBytes = generateKey(aesKey);

Key key = convertToKey(keyBytes);

Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);

AlgorithmParameters iv = generateIV(ivVal);

//设置为解密模式

cipher.init(Cipher.DECRYPT_MODE, key, iv);

byte[] decryptData = cipher.doFinal(encryptedData);

return new String(decryptData);

}


/**
* 十六进制字符串转换成数组
*
* @param hex
* @return
*/

private static byte[] hexStringToByte(String hex) {

int len = (hex.length() / 2);

byte[] result = new byte[len];

char[] achar = hex.toCharArray();

for (int i = 0; i < len; i++) {

int pos = i * 2;

result[i] = (byte) (toByte(achar[pos]) << 4 | toByte(achar[pos + 1]));

}

return result;

}


private static byte toByte(char c) {

byte b = (byte) "0123456789abcdef".indexOf(c);

return b;

}


/**
* 把字节数组转换成16进制字符串
*
* @param bArray
* @return
*/

private static final String bytesToHexString(byte[] bArray) {

StringBuffer sb = new StringBuffer(bArray.length);

String sTemp;

for (int i = 0; i < bArray.length; i++) {

sTemp = Integer.toHexString(0xFF & bArray[i]);

if (sTemp.length() < 2)

sb.append(0);

sb.append(sTemp.toLowerCase());

}

return sb.toString();

}


}

+ 5
- 3
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/FileUtils.java Bestand weergeven

@@ -54,11 +54,13 @@ public class FileUtils {
});
L.d("Files", "Size: " + file.length);
ArrayList<String> names = new ArrayList<String>();
for (int i = 0; i < file.length; i++) {
L.d("Files", "FileName:" + file[i].getName());
names.add(file[i].getName());
for (File value : file) {
L.d("Files", "FileName:" + value.getName());
names.add(value.getName());
}
return names;
}



}

+ 153
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/MyBleStrUtils.java Bestand weergeven

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

/**
* xing<br>
* 2019/3/7<br>
* 广播解析工具类
*/
public class MyBleStrUtils {


/**
* (16进制)
* BLE蓝牙返回的byte[]
* byte[]转字符串
*/
public static String byte2HexStr(byte[] b) {
if (b == null)
return "";
StringBuilder hs = new StringBuilder();
String stmp;
for (byte aB : b) {
int a = aB & 0XFF;
stmp = getHexString(a);
if (stmp.length() == 1)
hs.append("0").append(stmp);
else
hs.append(stmp);
hs.append(" ");
}
return hs.toString();
}

/**
* int 10进制转16进制(返回大写字母)
*
* @return 16进制String
*/
public static String getHexString(int number) {
return Integer.toHexString(number);
}


/**
* int到byte[] 由高位到低位
* @param i 需要转换为byte数组的整行值。
* @return byte数组
*/
public static byte[] intToByteArray(int i) {
byte[] result = new byte[4];
result[0] = (byte)((i >> 24) & 0xFF);
result[1] = (byte)((i >> 16) & 0xFF);
result[2] = (byte)((i >> 8) & 0xFF);
result[3] = (byte)(i & 0xFF);
return result;
}

/**
* 时间戳(秒)转byte数组 由高位到低位
* @param time 时间戳,精确到秒
* @return byte[5]数组
*/
public static byte[] getTimestampByte(long time) {
byte[] result = new byte[5];
result[4] = (byte)((time >> 32) & 0xFF);
result[3] = (byte)((time >> 24) & 0xFF);
result[2] = (byte)((time >> 16) & 0xFF);
result[1] = (byte)((time >> 8) & 0xFF);
result[0] = (byte)(time & 0xFF);
return result;
}


/**
* byte[]转long
* @param bytes 需要转换的数组
* @param isBig 是否为大端序
* @return 数值
*/
public static long byteArrayToLong(byte[] bytes,boolean isBig) {
long value=0;
int length = bytes.length;
if (isBig){
for(int i = length; i >0; i--) {
int shift= ((length-1)-(length-i)) * 8;
value +=(bytes[(i-1)] & 0xFF) << shift;
}
}else {
for(int i = 0; i <length; i++) {
int shift= ((length-1)-i) * 8;
value +=(bytes[i] & 0xFF) << shift;
}
}
return value;
}


/**
* (16进制)
* BLE蓝牙返回的byte[]
* byte[]转字符串
*/
public static String getMac(byte[] b,boolean isBig) {
if (b == null)
return "";
StringBuilder hs = new StringBuilder();
String stmp;
if (isBig){
for (byte aB : b) {
int a = aB & 0XFF;
stmp = getHexString(a);
if (stmp.length() == 1)
hs.append("0").append(stmp);
else
hs.append(stmp);
hs.append(":");
}
}else {

for (int i = b.length - 1; i >= 0; i--) {
byte aB=b[i];
int a = aB & 0XFF;
stmp = getHexString(a);
if (stmp.length() == 1)
hs.append("0").append(stmp);
else
hs.append(stmp);
hs.append(":");
}
}

hs.deleteCharAt(hs.length()-1);
return hs.toString();
}



/**
* mac地址转byte
* @param mac
* @return
*/
public static byte[] getDeviceMacByte(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;
}

}

+ 14
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/SP.java Bestand weergeven

@@ -19,6 +19,11 @@ public class SP {

public static String OTA_FILE_NAME = "OTA_FILE_NAME";

/**
* 寻物器mac地址列表
*/
private final static String FIND_DEVICE_MAC_LIST="FIND_DEVICE_MAC_LIST";


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

@@ -53,6 +58,15 @@ public class SP {
editor.putString(OTA_FILE_NAME, name);
apply(editor);
}
public String getFindDeviceMacList() {
return sp.getString(FIND_DEVICE_MAC_LIST, STR_DEFAULT);
}

public void putFindDeviceMacList(String name) {
SharedPreferences.Editor editor = sp.edit();
editor.putString(FIND_DEVICE_MAC_LIST, name);
apply(editor);
}


/**

+ 73
- 1
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/TimeUtils.java Bestand weergeven

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

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;

/**
@@ -11,8 +12,79 @@ import java.util.Locale;
public class TimeUtils {

public static String getTime(){
java.text.SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss", Locale.US);
SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss", Locale.US);
return format.format(System.currentTimeMillis())+":\n";
}
public static String getTimeSSS(){
SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss:SSS", Locale.US);
return format.format(System.currentTimeMillis())+":\n";
}

public static String getDateString() {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss", Locale.US);
return simpleDateFormat.format(System.currentTimeMillis());
}
public static String getTime(long time){
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);
return format.format(time)+":\n";
}
/**
* 返回当前年
*/
public static int getYear() {
Calendar c = Calendar.getInstance();
return c.get(Calendar.YEAR);
}

/**
* 返回当前月(1~12)
*/
public static int getMonth() {
Calendar c = Calendar.getInstance();
return c.get(Calendar.MONTH) + 1;
}

/**
* 返回当前日
*/
public static int getDay() {
Calendar c = Calendar.getInstance();
return c.get(Calendar.DAY_OF_MONTH);
}


/**
* 返回当前日
*/
public static int getHour() {
Calendar c = Calendar.getInstance();
return c.get(Calendar.HOUR_OF_DAY);
}


/**
* 返回当前日
*/
public static int getMinute() {
Calendar c = Calendar.getInstance();
return c.get(Calendar.MINUTE);
}

public static int[] getTimeArr(){
int[] time=new int[3];
Calendar c = Calendar.getInstance();
time[0] = c.get(Calendar.HOUR_OF_DAY);
time[1] = c.get(Calendar.MINUTE);
time[2]= c.get(Calendar.SECOND);
return time;
}



public static String getTimeM(){
SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss", Locale.US);
return format.format(System.currentTimeMillis())+":\n";
}


}

+ 6
- 0
app/src/main/res/drawable/divider.xml Bestand weergeven

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android = "http://schemas.android.com/apk/res/android">
<size
android:width = "0dp"
android:height = "10dp"/>
</shape>

+ 58
- 0
app/src/main/res/layout/activity_baby_body_fat_cmd.xml Bestand weergeven

@@ -43,6 +43,64 @@
android:textAllCaps="false" />

</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_margin="10dp"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Weight:"
android:textSize="18dp"
/>
<TextView
android:id="@+id/tv_baby_body_fat_weight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0.0"
android:textSize="18dp"
android:layout_marginStart="5dp"
/>


<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Height:"
android:textSize="18dp"
android:layout_marginStart="20dp"
/>
<TextView
android:id="@+id/tv_baby_body_fat_height"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0.0"
android:textSize="18dp"
android:layout_marginStart="5dp"
/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="adc:"
android:textSize="18dp"
android:layout_marginStart="20dp"
/>
<TextView
android:id="@+id/tv_baby_body_fat_adc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0.0"
android:textSize="18dp"
android:layout_marginStart="5dp"
/>

</LinearLayout>




<TextView
android:layout_width="wrap_content"

+ 52
- 0
app/src/main/res/layout/activity_bld_weight_scale_ble.xml Bestand weergeven

@@ -0,0 +1,52 @@
<?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_below="@+id/edit_Userid"
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_height="wrap_content">
<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>
<ListView
android:id="@+id/log_list"
android:layout_marginTop="20dp"
android:layout_below="@id/unit"
android:layout_width="match_parent"
android:layout_height="match_parent">

</ListView>


</LinearLayout>

+ 112
- 123
app/src/main/res/layout/activity_ble.xml Bestand weergeven

@@ -1,47 +1,41 @@
<?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:focusable="true"
android:focusableInTouchMode="true"
>
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusable="true"
android:focusableInTouchMode="true"
android:orientation="vertical">




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

android:layout_weight="1">


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

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

<Button
android:id="@+id/btnClear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/clear"
/>
android:text="@string/clear" />

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

android:text="暂停" />


</LinearLayout>
@@ -49,32 +43,32 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
android:orientation="horizontal">


<Button
android:id="@+id/btnHandshake"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/handshake"
/>
android:text="@string/handshake" />

<Button
android:id="@+id/btnVersion"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读版本"
/>
android:text="读版本" />

<Button
android:id="@+id/btnBattery"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读电量"
/>

android:text="读电量" />

<Button
android:id="@+id/btnNameRssi"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读名称信号" />

</LinearLayout>

@@ -83,138 +77,144 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="5dp"
>
android:padding="5dp">

<Button
android:id="@+id/btnTimeRead"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读时间"
/>
android:text="读时间" />

<Button
android:id="@+id/btnTimeWrite"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="写时间"
/>
android:text="写时间" />

<Button
android:id="@+id/btnMacRead"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读mac"
/>
android:text="读mac" />
<Button
android:id="@+id/btnBmRestart"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="重启模块"
/>
android:text="重启模块" />

</LinearLayout>


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

<EditText
android:id="@+id/etMcuType"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:hint="串口,i2c,spi"
android:text="1"
/>
<Button
android:id="@+id/btnMcuType"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="设置模式"
/>
android:text="设置模式" />

<Button
android:id="@+id/btnBmReset"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="出厂设置"
/>
android:text="出厂设置" />

<Button
android:id="@+id/btnUnits"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读单位"
/>
android:text="读单位" />

<EditText
android:id="@+id/etMcuType"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:hint="串口,i2c,spi"
android:text="1" />

</LinearLayout>

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

<EditText
android:id="@+id/etCid"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:digits="0123456789"
android:hint="cid"
android:text="0" />

<EditText
android:id="@+id/etDid"
android:layout_width="200dp"
android:id="@+id/etVid"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:hint="cidS,vidS,pidS,cid,vid,pid"
android:text="1,1,1,1,2,3"
/>
android:digits="0123456789"
android:hint="vid"
android:text="0" />

<EditText
android:id="@+id/etPid"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:digits="0123456789"
android:hint="pid"
android:text="0" />


<Button
android:id="@+id/btnDidWrite"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="写DID"
/>
android:text="写DID" />
<Button
android:id="@+id/btnDidRead"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读DID"
/>
android:text="读DID" />


</LinearLayout>

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

<EditText
android:id="@+id/etName"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:maxLength="13"
/>
android:padding="5dp">

<Button
android:id="@+id/btnNameWrite"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="写名称"
/>
android:text="写名称" />

<Button
android:id="@+id/btnNameRead"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读名称"
/>
android:text="读名称" />

<Button
android:id="@+id/btn_start_ble"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="唤醒模块"
/>
android:text="唤醒模块" />

<EditText
android:id="@+id/etName"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:maxLength="13" />


</LinearLayout>
@@ -223,30 +223,26 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="5dp"
>

<EditText
android:id="@+id/etMacType"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:maxLength="1"
android:digits="0987654321"
/>
android:padding="5dp">

<Button
android:id="@+id/btnMacTypeWrite"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="写Mac大小端"
/>
android:text="写Mac大小端" />

<Button
android:id="@+id/btnMacTypeRead"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读Mac大小端"
/>
android:text="读Mac大小端" />

<EditText
android:id="@+id/etMacType"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:digits="0987654321"
android:maxLength="1" />
</LinearLayout>


@@ -254,60 +250,52 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="5dp"
>

<EditText
android:id="@+id/etBroadcastTime"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:digits="0987654321"
/>
android:padding="5dp">

<Button
android:id="@+id/btnBroadcastTimeWrite"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="写广播间隔"
/>
android:text="写广播间隔" />

<Button
android:id="@+id/btnBroadcastTimeRead"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读广播间隔"
/>
android:text="读广播间隔" />

<EditText
android:id="@+id/etBroadcastTime"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:digits="0987654321" />
</LinearLayout>

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

<EditText
android:id="@+id/etSleepTime"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:digits="0987654321,"
android:text="1,60,1,1000"
android:hint="标记,时间,操作,广播时间"
/>
android:padding="5dp">

<Button
android:id="@+id/btnSleepTimeWrite"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="写自动休眠"
/>
android:text="写自动休眠" />

<Button
android:id="@+id/btnSleepTimeRead"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读自动休眠"
/>
android:text="读自动休眠" />

<EditText
android:id="@+id/etSleepTime"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:digits="0987654321,"
android:hint="标记,时间,操作,广播时间"
android:text="1,60,1,1000" />
</LinearLayout>

</LinearLayout>
@@ -322,10 +310,11 @@
android:layout_weight="1"
android:padding="10dp"
android:stackFromBottom="true"
android:transcriptMode="alwaysScroll"
>
android:transcriptMode="alwaysScroll">


</ListView>



</LinearLayout>

+ 14
- 0
app/src/main/res/layout/activity_blood_glucose.xml Bestand weergeven

@@ -48,6 +48,20 @@


</LinearLayout>

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

<Button
android:id="@+id/test"
android:text="流程测试"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>

</LinearLayout>

<ListView
android:id="@+id/log_list"
android:layout_marginTop="20dp"

+ 12
- 0
app/src/main/res/layout/activity_blood_glucose_test.xml Bestand weergeven

@@ -0,0 +1,12 @@
<?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">

<ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />

</LinearLayout>

+ 251
- 0
app/src/main/res/layout/activity_bloodoxygen.xml Bestand weergeven

@@ -0,0 +1,251 @@
<?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">


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

<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.3"
android:gravity="center"
android:text="SpO2上限" />


<TextView

android:id="@+id/tv_sp_max"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.3"
android:gravity="center" />


<androidx.appcompat.widget.AppCompatSeekBar
android:id="@+id/sb_sp_max"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:max="255"
android:min="0" />
</LinearLayout>

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

<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.3"
android:gravity="center"
android:text="SpO2下限" />


<TextView
android:id="@+id/tv_sp_min"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.3"
android:gravity="center" />

<androidx.appcompat.widget.AppCompatSeekBar
android:id="@+id/sb_sp_min"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:max="255"
android:min="0" />

</LinearLayout>

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

<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.3"
android:gravity="center"
android:text="脉率上限" />

<TextView
android:id="@+id/tv_pr_max"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.3"
android:gravity="center" />

<androidx.appcompat.widget.AppCompatSeekBar
android:id="@+id/sb_pr_max"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:max="255"
android:min="0" />

</LinearLayout>

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

<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.3"
android:gravity="center"
android:text="脉率下限" />

<TextView
android:id="@+id/tv_pr_min"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.3"
android:gravity="center" />


<androidx.appcompat.widget.AppCompatSeekBar
android:id="@+id/sb_pr_min"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:max="255"
android:min="0" />

</LinearLayout>

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

<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.3"
android:gravity="center"
android:text="血流灌注上限" />


<TextView
android:id="@+id/tv_pl_max"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.3"
android:gravity="center" />

<androidx.appcompat.widget.AppCompatSeekBar
android:id="@+id/sb_pl_max"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:max="255"
android:min="0" />

</LinearLayout>

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

<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.3"
android:gravity="center"
android:text="血流灌注下限" />


<TextView
android:id="@+id/tv_pl_min"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.3"
android:gravity="center" />


<androidx.appcompat.widget.AppCompatSeekBar
android:id="@+id/sb_pl_min"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"

android:max="255"
android:min="0" />

</LinearLayout>


<LinearLayout

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

<Button
android:id="@+id/bt_alarm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="设置警报" />

<Button
android:id="@+id/bt_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="查询状态" />
<Button
android:id="@+id/bt_pause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="暂停接收" />
<Button
android:id="@+id/bt_clear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="清空" />

</LinearLayout>

<LinearLayout

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

<Button
android:id="@+id/bt_version"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="查询版本号" />

<TextView
android:id="@+id/tv_version"
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>

+ 108
- 0
app/src/main/res/layout/activity_bloodsugar_4g.xml Bestand weergeven

@@ -0,0 +1,108 @@
<?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">


<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:padding="5dp"
android:text="IMEI号:"
android:textColor="#000000"
android:textSize="16dp" />
<EditText
android:id="@+id/ed_imei"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="869324050002769" />


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

<Button
android:id="@+id/btn_login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:padding="5dp"
android:text="登录(仅一次)"
android:textColor="#000000"
android:textSize="16dp" />
<Button
android:id="@+id/btn_deviceId"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:padding="5dp"
android:text="获取设备Id"
android:textColor="#000000"
android:textSize="16dp" />

<Button
android:id="@+id/btn_data"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:padding="5dp"
android:text="获取数据"
android:textColor="#000000"
android:textSize="16dp" />

<Button
android:id="@+id/btn_clear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:padding="5dp"
android:text="清屏"
android:textColor="#000000"
android:textSize="16dp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="horizontal">

<Button
android:id="@+id/btn_test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:padding="5dp"
android:text="测试环境"
android:textColor="#000000"
android:textSize="16dp" />
<Button
android:id="@+id/btn_produce"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:padding="5dp"
android:text="生产环境"
android:textColor="#000000"
android:textSize="16dp" />
<TextView
android:text="默认为生产环境,切换环境需要重新登录和获取设备id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>

<ListView
android:id="@+id/listviw"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>

+ 13
- 0
app/src/main/res/layout/activity_broadcast_height.xml Bestand weergeven

@@ -0,0 +1,13 @@
<?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">

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

</LinearLayout>

+ 9
- 1
app/src/main/res/layout/activity_broadcast_scale.xml Bestand weergeven

@@ -127,10 +127,18 @@
android:id="@+id/tv_broadcast_temp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="30℃"
android:text="--℃"
android:layout_marginStart="5dp"
/>

<TextView
android:id="@+id/tv_broadcast_did"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:layout_marginStart="20dp"
/>

</LinearLayout>



+ 82
- 0
app/src/main/res/layout/activity_clear_shake_hands.xml Bestand weergeven

@@ -0,0 +1,82 @@
<?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:focusable="true"
android:focusableInTouchMode="true"
>


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

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

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp">

<EditText
android:id="@+id/et_type"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:hint="透传数据"
android:text="01"
android:digits="0123456789abcdefABCDEF"
/>

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

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

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp">

<Button
android:id="@+id/btn_set_unit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="set_unit"
/>

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


<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"
android:padding="10dp"
android:stackFromBottom="true"
android:transcriptMode="alwaysScroll"
>


</ListView>

</LinearLayout>

+ 469
- 0
app/src/main/res/layout/activity_coffee_scale.xml Bestand weergeven

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

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

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

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android: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>

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

<Button
android:id="@+id/btn_zero"
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_margin="5dp"
android:orientation="horizontal">

<Button
android:id="@+id/btn_set_weight_unit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="APP下发重量单位" />

</LinearLayout>

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

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

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

<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_st_lb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="st:lb" />

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

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

</RadioGroup>

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

<Button
android:id="@+id/btn_set_temp_unit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="APP下发温度单位" />

</LinearLayout>

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

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

<RadioButton
android:id="@+id/rb_f"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="℉" />

</RadioGroup>

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

<Button
android:id="@+id/btn_set_auto_shutdown"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="APP下发自动关机" />

<EditText
android:id="@+id/et_auto_shutdown"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:inputType="number"
android:text="60" />

<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="3"
android:text="(秒)" />

</LinearLayout>

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

<Button
android:id="@+id/btn_set_timing"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="计时功能控制" />

<EditText
android:id="@+id/et_timing"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:inputType="number"
android:text="30" />

<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="3"
android:text="(秒)" />

</LinearLayout>

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

<RadioButton
android:id="@+id/rb_positive_timing"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="正计时" />

<RadioButton
android:id="@+id/rb_negative_timing"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="倒计时" />

</RadioGroup>

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

<RadioButton
android:id="@+id/rb_timing_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="计时" />

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

<RadioButton
android:id="@+id/rb_timing_reset"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="重置" />

</RadioGroup>

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

<Button
android:id="@+id/btn_callback_timing"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="APP回复计时功能" />

</LinearLayout>

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

<RadioButton
android:id="@+id/rb_callback_timing_success"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="成功" />

<RadioButton
android:id="@+id/rb_callback_timing_fail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="失败" />

<RadioButton
android:id="@+id/rb_callback_timing_not_support"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="不支持" />

</RadioGroup>

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

<Button
android:id="@+id/btn_set_alert"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="报警设置指令" />

<EditText
android:id="@+id/et_alert"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:inputType="number"
android:text="5" />

<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="3"
android:text="(秒)" />


</LinearLayout>

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

<RadioButton
android:id="@+id/rb_alert_close"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="关闭(默认)" />

<RadioButton
android:id="@+id/rb_alert_open"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打开" />

</RadioGroup>

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

<Button
android:id="@+id/btn_callback_alert"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="APP回复报警设置" />

</LinearLayout>

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

<RadioButton
android:id="@+id/rb_callback_alert_success"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="成功" />

<RadioButton
android:id="@+id/rb_callback_alert_fail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="失败" />

<RadioButton
android:id="@+id/rb_callback_alert_not_support"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="不支持" />

</RadioGroup>

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

<Button
android:id="@+id/btn_stop_alert"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="停止报警指令" />

<Button
android:id="@+id/btn_callback_stop_alert"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="APP回复停止报警" />

</LinearLayout>

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

<RadioButton
android:id="@+id/rb_callback_stop_alert_success"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="成功" />

<RadioButton
android:id="@+id/rb_callback_stop_alert_fail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="失败" />

<RadioButton
android:id="@+id/rb_callback_stop_alert_not_support"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="不支持" />

</RadioGroup>

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

<Button
android:id="@+id/btn_brew_mode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="APP设置冲煮模式" />

</LinearLayout>

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

<RadioButton
android:id="@+id/rb_brew_mode_enter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="进入冲煮模式" />

<RadioButton
android:id="@+id/rb_brew_mode_exit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="退出冲煮模式" />

</RadioGroup>

</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>

+ 136
- 0
app/src/main/res/layout/activity_find_device.xml Bestand weergeven

@@ -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">

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

<Button
android:id="@+id/btn_get_connect_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="连接个数" />

<Button
android:id="@+id/btn_connect_info_list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="连接的信息列表" />

<EditText
android:id="@+id/et_send_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:text="123"
android:textSize="18dp" />


</LinearLayout>


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

<Button
android:id="@+id/btn_device_id_0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0" />

<Button
android:id="@+id/btn_device_id_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="1" />

<Button
android:id="@+id/btn_device_id_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="2" />

<Button
android:id="@+id/btn_device_id_3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="3" />


</LinearLayout>

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

<Button
android:id="@+id/btn_device_id_4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="4" />

<Button
android:id="@+id/btn_device_id_5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="5" />

<Button
android:id="@+id/btn_device_id_6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="6" />

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



</LinearLayout>

<androidx.recyclerview.widget.RecyclerView
android:layout_width="wrap_content"
android:layout_height="wrap_content"

/>



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

<Button
android:id="@+id/btn_scan_ble"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="扫描设备"
/>

</LinearLayout>

<ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="10dp"
android:layout_weight="1"
android:padding="10dp"
android:stackFromBottom="true"
android:transcriptMode="alwaysScroll"
>


</ListView>
</LinearLayout>

+ 59
- 0
app/src/main/res/layout/activity_find_device_new.xml Bestand weergeven

@@ -0,0 +1,59 @@
<?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">

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

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

<Button
android:id="@+id/btn_scan_ble"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="扫描设备"
/>

<TextView
android:id="@+id/tv_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
/>

</LinearLayout>


<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_device"
android:layout_width="match_parent"
android:layout_height="300dp"
/>



<ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="10dp"
android:layout_weight="1"
android:padding="10dp"
android:stackFromBottom="true"
android:transcriptMode="alwaysScroll"
>


</ListView>
</LinearLayout>

+ 403
- 0
app/src/main/res/layout/activity_food_temp.xml Bestand weergeven

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

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

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

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

<Button
android:id="@+id/btn_get_device"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="APP获取设备信息" />

<View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="@android:color/darker_gray" />

<Button
android:id="@+id/btn_set_temp_unit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="APP下发温度单位" />

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

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

<RadioButton
android:id="@+id/rb_set_f"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="℉" />

</RadioGroup>

<View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="@android:color/darker_gray" />

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

<Button
android:id="@+id/btn_stop_alert"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="APP取消报警" />

<Spinner
android:id="@+id/sp_stop_alert"
android:layout_width="wrap_content"
android:entries="@array/food_temp_probe"
android:layout_height="wrap_content" />

</LinearLayout>

<View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="@android:color/darker_gray" />

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

<Button
android:id="@+id/btn_set_target"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="APP下发目标温度" />

<Spinner
android:id="@+id/sp_set_target"
android:layout_width="wrap_content"
android:entries="@array/food_temp_probe"
android:layout_height="wrap_content" />

<EditText
android:id="@+id/et_set_target"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:inputType="number" />

</LinearLayout>

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

<RadioGroup
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="horizontal">

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

<RadioButton
android:id="@+id/rb_set_target_f"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="℉" />

</RadioGroup>

</LinearLayout>

<View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="@android:color/darker_gray" />

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

<Button
android:id="@+id/btn_set_timing"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="APP下发定时" />

<Spinner
android:id="@+id/sp_set_timing"
android:layout_width="wrap_content"
android:entries="@array/food_temp_probe"
android:layout_height="wrap_content" />

<EditText
android:id="@+id/et_set_timing"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:inputType="number" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="5dp"
android:text="min" />

</LinearLayout>

<View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="@android:color/darker_gray" />

<Button
android:id="@+id/btn_open_close"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="APP下发设备开关机" />

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

<RadioButton
android:id="@+id/rb_open"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="开机" />

<RadioButton
android:id="@+id/rb_close"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="关机" />

</RadioGroup>

<View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="@android:color/darker_gray" />

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

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

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:text="年" />

<EditText
android:id="@+id/et_year"
android:layout_width="50dp"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:inputType="number" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:text="月" />

<EditText
android:id="@+id/et_month"
android:layout_width="50dp"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:inputType="number" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:text="日" />

<EditText
android:id="@+id/et_day"
android:layout_width="50dp"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:inputType="number" />

</LinearLayout>

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

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:text="时" />

<EditText
android:id="@+id/et_hour"
android:layout_width="50dp"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:inputType="number" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:text="分" />

<EditText
android:id="@+id/et_minute"
android:layout_width="50dp"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:inputType="number" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:text="秒" />

<EditText
android:id="@+id/et_second"
android:layout_width="50dp"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:inputType="number" />

</LinearLayout>

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

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:text="星期" />

<EditText
android:id="@+id/et_week"
android:layout_width="50dp"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:inputType="number" />

</LinearLayout>

<View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="@android:color/darker_gray" />

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

<Button
android:id="@+id/btn_open_close_probe"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="APP下发探针开关机" />

<Spinner
android:id="@+id/sp_open_close_probe"
android:layout_width="wrap_content"
android:entries="@array/food_temp_probe"
android:layout_height="wrap_content" />

</LinearLayout>


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

<RadioButton
android:id="@+id/rb_open_probe"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="开机" />

<RadioButton
android:id="@+id/rb_close_probe"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="关机" />

</RadioGroup>

</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"
android:background="@android:color/white" />

</LinearLayout>

+ 7
- 7
app/src/main/res/layout/activity_health_bracelet.xml Bestand weergeven

@@ -225,7 +225,7 @@
android:text="靠近报警阀值:"
/>

<aicare.net.cn.sdk.ailinksdkdemoandroid.view.SeekBarMin
<com.pinwang.ailinkblesdk.view.SeekBarMin
android:id="@+id/seekBar1"
style="@style/Widget.AppCompat.SeekBar"
android:layout_width="0dp"
@@ -255,7 +255,7 @@
android:text="接收的阀值次数:"
/>

<aicare.net.cn.sdk.ailinksdkdemoandroid.view.SeekBarMin
<com.pinwang.ailinkblesdk.view.SeekBarMin
android:id="@+id/seekBar2"
style="@style/Widget.AppCompat.SeekBar"
android:layout_width="0dp"
@@ -285,7 +285,7 @@
android:text="脱离报警时间:"
/>

<aicare.net.cn.sdk.ailinksdkdemoandroid.view.SeekBarMin
<com.pinwang.ailinkblesdk.view.SeekBarMin
android:id="@+id/seekBar3"
style="@style/Widget.AppCompat.SeekBar"
android:layout_width="0dp"
@@ -315,7 +315,7 @@
android:text="脱离报警次数:"
/>

<aicare.net.cn.sdk.ailinksdkdemoandroid.view.SeekBarMin
<com.pinwang.ailinkblesdk.view.SeekBarMin
android:id="@+id/seekBar4"
style="@style/Widget.AppCompat.SeekBar"
android:layout_width="0dp"
@@ -344,7 +344,7 @@
android:text="Gsensor灵敏度:"
/>

<aicare.net.cn.sdk.ailinksdkdemoandroid.view.SeekBarMin
<com.pinwang.ailinkblesdk.view.SeekBarMin
android:id="@+id/seekBar5"
style="@style/Widget.AppCompat.SeekBar"
android:layout_width="0dp"
@@ -374,7 +374,7 @@
android:text="Gsensor不动的脱机时间:"
/>

<aicare.net.cn.sdk.ailinksdkdemoandroid.view.SeekBarMin
<com.pinwang.ailinkblesdk.view.SeekBarMin
android:id="@+id/seekBar6"
style="@style/Widget.AppCompat.SeekBar"
android:layout_width="0dp"
@@ -404,7 +404,7 @@
android:text="马达震动时间:"
/>

<aicare.net.cn.sdk.ailinksdkdemoandroid.view.SeekBarMin
<com.pinwang.ailinkblesdk.view.SeekBarMin
android:id="@+id/seekBar7"
style="@style/Widget.AppCompat.SeekBar"
android:layout_width="0dp"

+ 14
- 0
app/src/main/res/layout/activity_height.xml Bestand weergeven

@@ -25,6 +25,20 @@
android:layout_height="wrap_content"
android:padding="10dp">

<EditText
android:id="@+id/et_type"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:hint="透传数据"
android:text="4"
/>

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

<Button
android:id="@+id/clear"

+ 180
- 0
app/src/main/res/layout/activity_height_bodyfat.xml Bestand weergeven

@@ -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"
android:orientation="vertical">


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

<Button
android:id="@+id/kg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="kg"
android:textAllCaps="false" />

<Button
android:id="@+id/jin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="斤"
android:textAllCaps="false" />

<Button
android:id="@+id/st_lb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ST:LB"
android:textAllCaps="false" />

<Button
android:id="@+id/lb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="lb"
android:textAllCaps="false" />

</LinearLayout>

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

<Button
android:id="@+id/cm"

android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="cm"
android:textAllCaps="false" />

<Button
android:id="@+id/inch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="inch"
android:textAllCaps="false" />

<Button
android:id="@+id/ft_in"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ft-in"
android:textAllCaps="false" />


<TextView
android:layout_gravity="top"
android:gravity="top"
android:id="@+id/text"
android:text="体重单位:kg \n身高单位:cm, \n模式 身高体脂模式"
android:layout_width="match_parent"
android:layout_height="60dp"/>

</LinearLayout>

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

<Button
android:id="@+id/deviceStatus"
android:text="获取设备状态"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/bodyfat"

android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="身高体脂模式"
android:textAllCaps="false" />

<Button
android:id="@+id/weight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="体重模式"
android:textAllCaps="false" />

<Button
android:id="@+id/baby"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="抱婴模式"
android:textAllCaps="false" />

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


<Button
android:id="@+id/voice_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="获取声音状态"
android:textAllCaps="false" />
<Button
android:id="@+id/voice_open"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="声音开"
android:textAllCaps="false" />
<Button
android:id="@+id/voice_close"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="声音关"
android:textAllCaps="false" />
<Button
android:id="@+id/height_weight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="体重身高模式"
android:textAllCaps="false" />

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

<Button
android:id="@+id/girl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="女,18岁,165cm"
android:textAllCaps="false" />

<Button
android:id="@+id/man"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="男,28岁,170cm"
android:textAllCaps="false" />

<Button
android:id="@+id/finish"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="回复测量完成"
android:textAllCaps="false" />

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

+ 296
- 174
app/src/main/res/layout/activity_main.xml Bestand weergeven

@@ -12,191 +12,313 @@
android:padding="10dp"
android:text="@string/version" />


<LinearLayout

android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:gravity="center_vertical">

<Button
android:id="@+id/btn_sphy"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/sphygmometer"
android:textSize="12dp" />

<Button
android:id="@+id/btn_tempgun"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/forehead_gun"
android:textSize="12dp" />

<Button
android:id="@+id/btn_temp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/thermometer"
android:textSize="12dp" />


</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:gravity="center_vertical">

<Button
android:id="@+id/btn_height"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/height_meter"
android:textSize="12dp" />

<Button
android:id="@+id/btn_smart_mask"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/smart_mask"
android:textSize="12dp" />

<Button
android:id="@+id/btn_baby"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/baby_scale"
android:textSize="12dp" />

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:gravity="center_vertical">

<Button
android:id="@+id/btn_baby_body_fat"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/baby_body_fat_scale"
android:textSize="12dp" />

<Button
android:id="@+id/btn_broadcast_scale"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/broadcast_scale"
android:textSize="12dp" />

<Button
android:id="@+id/btn_broadcast_blood_oxygen"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/oximeter"
android:textSize="12dp" />

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:gravity="center_vertical">

<Button
android:id="@+id/btn_wifi_ble_weight"
android:layout_width="wrap_content"

android:layout_height="wrap_content"
android:text="@string/wifi_ble_weight_scale"
android:textSize="12dp" />

<Button
android:id="@+id/btn_ble_weight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/ble_body_fat_scale"
android:textSize="12dp" />

<Button
android:id="@+id/btn_wifi_ble_tooth"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/wifi_ble_toothbrush"
android:textSize="12dp" />
</LinearLayout>

<LinearLayout
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:gravity="center_vertical">
android:layout_height="match_parent">

<Button
android:id="@+id/btn_ble"
android:layout_width="wrap_content"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/general_settings"
android:textSize="12dp" />


</LinearLayout>

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

<Button
android:id="@+id/btn_clear_shake_hands"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="不握手不加密" />



</LinearLayout>

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

<Button
android:id="@+id/btn_sphy"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="血压计" />

<Button
android:id="@+id/btn_tempgun"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="额温枪" />

<Button
android:id="@+id/btn_temp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="体温计" />

<Button
android:id="@+id/btn_baby"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="婴儿秤" />
</LinearLayout>

<LinearLayout

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

<Button
android:id="@+id/btn_height"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="身高仪" />

<Button
android:id="@+id/btn_lock"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="电子锁" />

<Button
android:id="@+id/wifi_config"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/device_wifi_config"
android:textSize="12dp" />

<Button
android:id="@+id/eight_scale"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/eight_scale"
android:textSize="12dp" />
<Button
android:id="@+id/btn_ad_weight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="艾迪体脂秤" />

<Button
android:id="@+id/btn_smart_mask"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="口罩" />


</LinearLayout>

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

<Button
android:id="@+id/btn_baby_body_fat"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="婴儿体脂两用秤" />

<Button
android:id="@+id/btn_broadcast_scale"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="广播秤" />

<Button
android:id="@+id/glucometer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/blood_glucose_meter"
android:textSize="12dp" />
</LinearLayout>
<Button
android:id="@+id/btn_broadcast_blood_oxygen"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="血氧仪" />

</LinearLayout>

<LinearLayout

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

<Button
android:id="@+id/btn_wifi_ble_weight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="WiFi+Ble体脂秤" />

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:gravity="center_vertical">
<Button
android:id="@+id/btn_ble_weight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Ble体脂秤" />

<Button
android:id="@+id/btn_wifi_ble_tooth"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="牙刷(wifi+ble)" />
</LinearLayout>

<Button
android:id="@+id/btn_ota"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/ota_general"
android:textSize="12dp" />
<LinearLayout

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

<Button
android:id="@+id/btn_ble"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Ble通用设置" />

<Button
android:id="@+id/btn_ble_test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

android:text="BleTest"

/>

<Button
android:id="@+id/btn_transmission"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/penetrate"
android:textSize="12dp" />
<Button
android:id="@+id/btnConnectTest"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="BleConnectTest"

/>

</LinearLayout>

<LinearLayout

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

<Button
android:id="@+id/wifi_config"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="WIFI设备(配置wifi)" />

<Button
android:id="@+id/eight_scale"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="八极秤" />

<Button
android:id="@+id/glucometer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="血糖仪" />
</LinearLayout>

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

<Button

android:id="@+id/btn_ota"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="OTA通用" />



<Button
android:id="@+id/btn_transmission"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="透传" />

<Button
android:id="@+id/btn_bld"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="百利达"
android:visibility="gone" />

<Button
android:id="@+id/btn_bleBo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="血氧(连接)" />


</LinearLayout>

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

<Button
android:id="@+id/btn_coffeeScale"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="咖啡秤" />


<Button
android:id="@+id/btn_scooter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="电滑板" />

<Button
android:id="@+id/btn_shareCharger"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="共享充电器" />

<Button
android:id="@+id/btn_share_socket"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="共享插座" />


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

<Button
android:id="@+id/btn_broadcast_height"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="广播身高仪" />

<Button
android:id="@+id/btn_hbfs"
android:text="身高体脂秤"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_find"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="寻物器" />
<Button
android:id="@+id/btn_4g_bs"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="4G血糖仪" />

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

<Button
android:id="@+id/btn_food_temp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="食品温度计" />

<Button
android:id="@+id/btn_temp_humidity"
android:text="温湿度计"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

<Button
android:id="@+id/btn_share_condom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="共享套套机" />

</LinearLayout>


</LinearLayout>
</ScrollView>

</LinearLayout>

</LinearLayout>

+ 136
- 0
app/src/main/res/layout/activity_share_charger.xml Bestand weergeven

@@ -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">

<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">

<Button
android:id="@+id/btn_set"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="APP设置充电时间" />

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

<SeekBar
android:id="@+id/seek_hour"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:max="23"
android:progress="0" />

<TextView
android:id="@+id/tv_hour"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0时" />

</LinearLayout>

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

<SeekBar
android:id="@+id/seek_minute"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:max="59"
android:progress="0" />

<TextView
android:id="@+id/tv_minute"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0分" />

</LinearLayout>

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

<SeekBar
android:id="@+id/seek_second"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:max="58"
android:progress="0" />

<TextView
android:id="@+id/tv_second"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="1秒" />

</LinearLayout>

<Button
android:id="@+id/btn_get"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="APP获取剩余充电时间" />

<Button
android:id="@+id/btn_switch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="APP切换开关" />

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

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

<RadioButton
android:id="@+id/rb_close"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="关" />

</RadioGroup>

</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>

+ 167
- 0
app/src/main/res/layout/activity_share_condom.xml Bestand weergeven

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

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

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

<Button
android:id="@+id/btn_set"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="APP设置充电时间" />

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

<SeekBar
android:id="@+id/seek_hour"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:max="23"
android:progress="0" />

<TextView
android:id="@+id/tv_hour"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0时" />

</LinearLayout>

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

<SeekBar
android:id="@+id/seek_minute"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:max="59"
android:progress="0" />

<TextView
android:id="@+id/tv_minute"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0分" />

</LinearLayout>

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

<SeekBar
android:id="@+id/seek_second"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:max="58"
android:progress="0" />

<TextView
android:id="@+id/tv_second"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="1秒" />

</LinearLayout>

<Button
android:id="@+id/btn_get"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="APP获取剩余充电时间" />

<TextView
android:id="@+id/tv_time"
android:text=""
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

<Button
android:id="@+id/btn_switch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="APP切换开关" />

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

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

<RadioButton
android:id="@+id/rb_close"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="关" />

</RadioGroup>

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

<Button
android:id="@+id/btn_out"
android:text="出仓"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

<Button
android:id="@+id/btn_recycle"
android:text="回收"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

<Button
android:id="@+id/btn_open"
android:text="打开补仓门"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

</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>

+ 188
- 0
app/src/main/res/layout/activity_share_socket.xml Bestand weergeven

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

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

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

<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:gravity="center_vertical"
android:orientation="horizontal">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="插座编号" />

<Spinner
android:id="@+id/sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:entries="@array/share_socket_id" />

</LinearLayout>

<Button
android:id="@+id/btn_set"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="APP设置充电时间" />

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

<SeekBar
android:id="@+id/seek_hour"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:max="23"
android:progress="0" />

<TextView
android:id="@+id/tv_hour"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0时" />

</LinearLayout>

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

<SeekBar
android:id="@+id/seek_minute"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:max="59"
android:progress="0" />

<TextView
android:id="@+id/tv_minute"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0分" />

</LinearLayout>

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

<SeekBar
android:id="@+id/seek_second"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:max="58"
android:progress="0" />

<TextView
android:id="@+id/tv_second"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="1秒" />

</LinearLayout>

<TextView
android:id="@+id/tv_timing_0"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:gravity="center"
android:text="编号0计时:" />

<TextView
android:id="@+id/tv_timing_1"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:gravity="center"
android:text="编号1计时:" />

<Button
android:id="@+id/btn_get"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="APP获取剩余充电时间" />

<Button
android:id="@+id/btn_switch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="APP切换开关" />

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

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

<RadioButton
android:id="@+id/rb_close"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="关" />

</RadioGroup>

<Button
android:id="@+id/btn_version"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="APP获取设备版本号" />

<Button
android:id="@+id/btn_test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="开始性能测试" />

<TextView
android:id="@+id/tv_test"
android:layout_width="match_parent"
android:layout_height="350dp" />

</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>

+ 48
- 35
app/src/main/res/layout/activity_show_ble.xml Bestand weergeven

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

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp">
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp">

<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/search"
/>
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/search" />

<Button
android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/stop"
/>
android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/stop" />

<Button
android:id="@+id/clear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/clear"
/>
android:id="@+id/clear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/clear"
/>


</LinearLayout>
@@ -40,28 +37,44 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp">
android:padding="5dp">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="名字:" />

<EditText
android:id="@+id/et_filter_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:padding="5dp"
android:text="AiLink" />

<Button
android:id="@+id/filter"
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/filter"
/>
android:text="mac:" />

<EditText
android:id="@+id/et_filter_mac"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1.5"
android:digits="0123456789abcdefABCDEF"
android:padding="5dp"
android:text="" />

</LinearLayout>

</LinearLayout>


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


</ListView>

+ 648
- 0
app/src/main/res/layout/activity_skateboard_data.xml Bestand weergeven

@@ -0,0 +1,648 @@
<?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"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
tools:context=".MainActivity">

<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:id="@+id/ll_one"
android:layout_width="match_parent"
android:layout_height="wrap_content">


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

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

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

</LinearLayout>

<LinearLayout
android:id="@+id/ll_two"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btn_heartbeat"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="心跳" />

<Button
android:id="@+id/btn_open_light"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开灯" />

<Button
android:id="@+id/btn_close_light"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="关灯" />

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


</LinearLayout>

<LinearLayout
android:id="@+id/ll_three"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btn_start_boost"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="助力" />

<Button
android:id="@+id/btn_start_no_boost"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="非助力" />

<Button
android:id="@+id/btn_set_unit_km"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="公里" />

<Button
android:id="@+id/btn_set_unit_mi"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="英里" />


</LinearLayout>

<LinearLayout
android:id="@+id/ll_four"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btn_zero_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0启动" />

<Button
android:id="@+id/btn_no_zero_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="非0启动" />

<Button
android:id="@+id/btn_constant_speed"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="定速" />

<Button
android:id="@+id/btn_no_constant_speed"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="不定速" />

<Button
android:id="@+id/btn_reset"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
android:text="清空所有数据" />


</LinearLayout>

<LinearLayout
android:id="@+id/ll_five"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btn_reset_device"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="恢复出厂设置" />

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

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

<Button
android:id="@+id/btn_set_auto_shutdown_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="自动关机时间" />
</LinearLayout>

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

<EditText
android:id="@+id/et_old_pwd"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:digits="0123456789"
android:hint="oldPwd"
android:maxLength="6"
android:text="123456" />

<EditText
android:id="@+id/et_new_pwd"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:digits="0123456789"
android:hint="newPwd"
android:maxLength="6"
android:text="123456" />

<Button
android:id="@+id/btn_setLockCarPassword"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="修改密码" />


</LinearLayout>

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

<Button
android:id="@+id/btn_read_auto_shutdown_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读自动关机时间" />

<Button
android:id="@+id/btn_gear_speed"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="设置档位速度" />

<Button
android:id="@+id/btn_setMeterBackLight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="设置背光" />


</LinearLayout>

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

<Button
android:id="@+id/btn_setControllerTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="设置控制器的实时时间" />

<Button
android:id="@+id/btn_readControllerTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读取控制器的时间" />


</LinearLayout>

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

<Button
android:id="@+id/btn_readControllerSingleMileage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读取控制器单次行驶里程" />

<Button
android:id="@+id/btn_readControllerAllMileage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读取控制器总行驶里程" />


</LinearLayout>

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

<Button
android:id="@+id/btn_readControllerTemp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读取控制器温度" />

<Button
android:id="@+id/btn_readControllerDrivingCurrent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读取控制器行驶电流" />

<Button
android:id="@+id/btn_readControllerVoltage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读电压" />


</LinearLayout>

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

<Button
android:id="@+id/btn_readAllPower"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读总容量" />

<Button
android:id="@+id/btn_readLastPower"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读剩余容量" />

<Button
android:id="@+id/btn_readBatteryDischargeNumber"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读充放电次数" />

<Button
android:id="@+id/btn_readBatteryCode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读电池信息" />


</LinearLayout>

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

<Button
android:id="@+id/btn_readCompanyVersion"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读版本" />

<Button
android:id="@+id/btn_readMotorPulse"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读电机脉冲" />

<Button
android:id="@+id/btn_readMotorPulseInterval"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读电机脉冲间隔" />

<Button
android:id="@+id/btn_readMotorParameter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读电机参数" />


</LinearLayout>

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

<Button
android:id="@+id/btn_readWheelSize"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读车轮尺寸" />

<Button
android:id="@+id/btn_readFlashDataVersion"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读FLASH版本" />

<Button
android:id="@+id/btn_readBootloaderVersion"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读Boot版本" />

<Button
android:id="@+id/btn_readMeterBackLight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读背光亮度" />


</LinearLayout>

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

<Button
android:id="@+id/btn_setAutoNightMode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="夜间模式" />

<Button
android:id="@+id/btn_readNightMode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读夜间模式" />

<Button
android:id="@+id/btn_setCallPhone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="来电" />

<Button
android:id="@+id/btn_setSMSData"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="短信" />


</LinearLayout>

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

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

<Button
android:id="@+id/btn_readBlePassword"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="密码查询" />

<Button
android:id="@+id/btn_setNavigationMessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="导航推送" />

<Button
android:id="@+id/btn_setResetCmd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="重置指令" />


</LinearLayout>


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

<Button
android:id="@+id/btn_setLockCar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="锁车/解锁" />


<Button
android:id="@+id/btn_readServicePassword"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="售后密码" />

<Button
android:id="@+id/btn_setWeather"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="天气信息推送" />

<Button
android:id="@+id/btn_update_conditions"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="升级条件" />

</LinearLayout>

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

<Button
android:id="@+id/btn_setDeviceLanguage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="设置语言" />

<Button
android:id="@+id/btn_getDeviceImageFontVersion"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读字库版本" />

<Button
android:id="@+id/btn_getControllerVersion"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读控制器版本" />

<Button
android:id="@+id/btn_getTpVersion"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读TP版本" />

</LinearLayout>

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

<Button
android:id="@+id/btn_setPair"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="配对" />

<Button
android:id="@+id/btn_checkPwd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="验证密码" />
</LinearLayout>

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

<Button
android:id="@+id/btn_ota_boot"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="表头boot" />

<Button
android:id="@+id/btn_ota_app"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="表头APP" />


<Button
android:id="@+id/btn_ota_flash"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="表头flash" />


</LinearLayout>


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

<Button
android:id="@+id/btn_ota_app_controller"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="控制器APP" />




</LinearLayout>


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

<Button
android:id="@+id/btn_ota_type"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="静默升级" />

<Button
android:id="@+id/btn_ble"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="BLE_OTA" />

<Button
android:id="@+id/btn_ble_version"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Ble_V" />

<EditText
android:id="@+id/et_ble_ota_step"
android:layout_width="50dp"
android:layout_height="wrap_content"
android:text="" />

</LinearLayout>


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

<Button
android:id="@+id/btn_get_test_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读测试状态" />

<Button
android:id="@+id/btn_go_setProductionTest"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="进入整机测试" />

<Button
android:id="@+id/btn_exit_setProductionTest"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="退出整机测试" />

</LinearLayout>

</LinearLayout>
</ScrollView>

<ListView
android:id="@+id/listviewData"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:padding="10dp"
android:stackFromBottom="true"
android:transcriptMode="alwaysScroll">

</ListView>

</androidx.appcompat.widget.LinearLayoutCompat>

+ 104
- 0
app/src/main/res/layout/activity_skateboard_data_user.xml Bestand weergeven

@@ -0,0 +1,104 @@
<?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"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
tools:context=".MainActivity">

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

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

<LinearLayout
android:id="@+id/ll_two"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical"
>


<Button
android:id="@+id/btn_open_light"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/open_light" />

<Button
android:id="@+id/btn_close_light"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/close_light" />

<TextView
android:id="@+id/tv_ota_version"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="v"
/>

</LinearLayout>

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

<Button
android:id="@+id/btn_ota_app"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_weight="1"
android:text="@string/upgrade_watch" />

<Button
android:id="@+id/btn_check_version"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginTop="10dp"
/>

</LinearLayout>

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

<Button
android:id="@+id/btn_ota_app_controller"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_weight="1"
android:text="@string/upgrade_controller" />



</LinearLayout>

</LinearLayout>
</ScrollView>

<ListView
android:id="@+id/listviewData"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:padding="10dp"
android:stackFromBottom="true"
android:transcriptMode="alwaysScroll">

</ListView>

</androidx.appcompat.widget.LinearLayoutCompat>

+ 36
- 5
app/src/main/res/layout/activity_smart_mask.xml Bestand weergeven

@@ -7,7 +7,7 @@
<ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="0.5">
android:layout_weight="0.39">

<LinearLayout
android:layout_width="match_parent"
@@ -18,7 +18,7 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp">
>

<Button
android:id="@+id/clear"
@@ -33,15 +33,25 @@
android:layout_height="wrap_content"
android:text="获取版本"
android:textAllCaps="false" />


<Button
android:id="@+id/get_AIQ"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="IAQ数据"
android:textAllCaps="false" />
<Button
android:id="@+id/close_power"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="关闭电源"
android:textAllCaps="false" />

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp">
>


<Button
@@ -64,6 +74,27 @@
android:layout_height="wrap_content"
android:text="风扇控制"
android:textAllCaps="false" />
<Button
android:id="@+id/set_mode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="测试模式"
android:textAllCaps="false" />

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


<Button
android:id="@+id/set_payload"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="显示payload"
android:textAllCaps="false" />


</LinearLayout>


+ 15
- 1
app/src/main/res/layout/activity_sphy.xml Bestand weergeven

@@ -25,12 +25,26 @@
android:layout_height="wrap_content"
android:padding="10dp">

<EditText
android:id="@+id/et_type"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:hint="透传数据"
android:text="4"
/>

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

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


+ 13
- 0
app/src/main/res/layout/activity_temp.xml Bestand weergeven

@@ -25,7 +25,20 @@
android:layout_height="wrap_content"
android:padding="10dp">

<EditText
android:id="@+id/et_type"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:hint="透传数据"
android:text="4"
/>

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

<Button
android:id="@+id/clear"

+ 15
- 0
app/src/main/res/layout/activity_temp_gun.xml Bestand weergeven

@@ -25,6 +25,21 @@
android:layout_height="wrap_content"
android:padding="10dp">

<EditText
android:id="@+id/et_type"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:hint="透传数据"
android:text="4"
/>

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

<Button
android:id="@+id/clear"
android:layout_width="wrap_content"

+ 0
- 0
app/src/main/res/layout/activity_temp_humidity.xml Bestand weergeven


Some files were not shown because too many files changed in this diff

Laden…
Annuleren
Opslaan