| apply plugin: 'com.android.application' | apply plugin: 'com.android.application' | ||||
| apply plugin: 'com.jakewharton.butterknife' | |||||
| apply plugin: 'org.jetbrains.kotlin.android' | |||||
| android { | android { | ||||
| compileSdkVersion 34 | |||||
| namespace 'aicare.net.cn.sdk.ailinksdkdemoandroid' | |||||
| buildFeatures { buildConfig true } | |||||
| compileSdkVersion app_compileSdk | |||||
| defaultConfig { | defaultConfig { | ||||
| applicationId "aicare.net.cn.sdk.ailinksdkdemoandroid" | applicationId "aicare.net.cn.sdk.ailinksdkdemoandroid" | ||||
| minSdkVersion 24 | |||||
| targetSdkVersion 34 | |||||
| versionName "1.15.06" | |||||
| minSdkVersion app_minSdk | |||||
| targetSdkVersion app_targetSdk | |||||
| versionName "1.16.21" | |||||
| versionCode getVersionCodeNumber(versionName) | versionCode getVersionCodeNumber(versionName) | ||||
| testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" | ||||
| } | } | ||||
| } | } | ||||
| compileOptions { | compileOptions { | ||||
| sourceCompatibility JavaVersion.VERSION_1_8 | |||||
| targetCompatibility JavaVersion.VERSION_1_8 | |||||
| sourceCompatibility JavaVersion.VERSION_11 | |||||
| targetCompatibility JavaVersion.VERSION_11 | |||||
| } | } | ||||
| repositories { | repositories { | ||||
| } | } | ||||
| } | } | ||||
| kotlinOptions { | |||||
| jvmTarget = '11' | |||||
| } | |||||
| buildFeatures { | |||||
| viewBinding true | |||||
| } | |||||
| } | } | ||||
| static def getVersionCodeNumber(String versionName) { | static def getVersionCodeNumber(String versionName) { | ||||
| //1.49.13_beta05 | //1.49.13_beta05 | ||||
| dependencies { | dependencies { | ||||
| implementation fileTree(dir: 'libs', include: ['*.jar']) | implementation fileTree(dir: 'libs', include: ['*.jar']) | ||||
| implementation 'androidx.appcompat:appcompat:1.4.2' | |||||
| implementation 'androidx.constraintlayout:constraintlayout:2.0.4' | |||||
| implementation 'androidx.cardview:cardview:1.0.0' | |||||
| implementation "androidx.appcompat:appcompat:$appcompat_version" | |||||
| implementation "androidx.core:core-ktx:$core_ktx_version" | |||||
| implementation "androidx.activity:activity:1.8.0" | |||||
| testImplementation 'junit:junit:4.12' | testImplementation 'junit:junit:4.12' | ||||
| implementation 'androidx.cardview:cardview:1.0.0' | |||||
| //https://jitpack.io/#elinkthings/AILinkSDKRepositoryAndroid | //https://jitpack.io/#elinkthings/AILinkSDKRepositoryAndroid | ||||
| implementation 'com.github.elinkthings:AILinkSDKRepositoryAndroid:1.14.21'//蓝牙核心库 | |||||
| implementation 'com.github.elinkthings:AILinkSDKRepositoryAndroid:1.15.04'//蓝牙核心库 | |||||
| //https://jitpack.io/#elinkthings/AILinkSDKParsingLibraryAndroid | //https://jitpack.io/#elinkthings/AILinkSDKParsingLibraryAndroid | ||||
| implementation 'com.github.elinkthings:AILinkSDKParsingLibraryAndroid:1.9.7'//蓝牙解析库,需要依赖核心库 | |||||
| //https://jitpack.io/#elinkthings/AILinkMqttRepositoryAndroid | |||||
| implementation 'com.github.elinkthings:AILinkMqttRepositoryAndroid:1.3.2'//MQTT库,不需要的可以不用依赖 | |||||
| implementation project(path: ':otalibrary') | |||||
| implementation 'com.github.elinkthings:AILinkSDKParsingLibraryAndroid:1.9.13'//蓝牙解析库,需要依赖核心库 | |||||
| implementation 'androidx.recyclerview:recyclerview:1.3.2' | |||||
| implementation 'androidx.constraintlayout:constraintlayout:1.1.3' | |||||
| // implementation project(path: ':otalibrary') | |||||
| implementation 'androidx.recyclerview:recyclerview:1.3.2' | implementation 'androidx.recyclerview:recyclerview:1.3.2' | ||||
| implementation 'com.jakewharton:butterknife:10.2.3' | |||||
| annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.3' | |||||
| api 'com.squareup.retrofit2:converter-gson:2.7.2' | api 'com.squareup.retrofit2:converter-gson:2.7.2' | ||||
| // implementation (name: 'modulelibrary-release', ext: 'aar') | // implementation (name: 'modulelibrary-release', ext: 'aar') | ||||
| } | } |
| </activity> | </activity> | ||||
| <activity android:name=".ClearShakeHandsActivity" /> | |||||
| <activity | |||||
| android:name=".ClearShakeHandsActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity android:name=".ShowBleActivity" /> | |||||
| <activity android:name=".BabyCmdActivity" /> | |||||
| <activity android:name=".TempGunCmdActivity" /> | |||||
| <activity android:name=".SphyCmdActivity" /> | |||||
| <activity android:name=".TempCmdActivity" /> | |||||
| <activity android:name=".HeightCmdActivity" /> | |||||
| <activity android:name=".BleCmdActivity" /> | |||||
| <activity android:name=".TestCmdActivity" /> | |||||
| <activity android:name=".TpmsConnectCmdActivity" /> | |||||
| <activity android:name=".ConnectBleTestActivity" /> | |||||
| <activity android:name=".ADWeightScaleCmdActivity" /> | |||||
| <activity android:name=".ADWeightScaleUserActivity" /> | |||||
| <activity android:name=".modules.wifi_ble_scale.WeightScaleWifiBleActivity" /> | |||||
| <activity android:name=".WeightScaleBleActivity" /> | |||||
| <activity android:name=".WifiConfigActivity" /> | |||||
| <activity android:name=".modules.eight_bodyfat.EightBodyfatActivity" /> | |||||
| <activity android:name=".modules.blood_glucose.BloodGlucoseActivity" /> | |||||
| <activity android:name=".BabyBodyFatCmdActivity" /> | |||||
| <activity android:name=".BroadcastScaleActivity" /> | |||||
| <activity android:name=".TransmissionActivity" /> | |||||
| <activity android:name=".BroadcastBloodOxygenActivity" /> | |||||
| <activity android:name=".SmartMaskActivity" /> | |||||
| <activity android:name=".modules.toothbrush.ToothBrushWifiBleActivity" /> | |||||
| <activity android:name=".BLDWeightScaleBleActivity" /> | |||||
| <activity android:name=".BloodOxygenActivity" /> | |||||
| <activity android:name=".modules.blood_glucose.BloodGlucoseTestActivity" /> | |||||
| <activity android:name=".modules.share_charger.ShareChargerActivity" /> | |||||
| <activity android:name=".modules.broadcast_height.BroadcastHeightActivity" /> | |||||
| <activity android:name=".modules.coffee_scale.CoffeeScaleActivity" /> | |||||
| <activity android:name=".HeightWeightScaleActivity" /> | |||||
| <activity android:name=".find.FindDeviceActivity" /> | |||||
| <activity android:name=".TempHumidityActivity" /> | |||||
| <activity android:name=".modules.ropeskipping.RopeSkippingActivity" /> | |||||
| <activity android:name=".modules.airdetector.AirDetectorActivity" /> | |||||
| <activity android:name=".modules.airdetector_test.AirDetectorActivityTest" /> | |||||
| <activity | |||||
| android:name=".ShowBleActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".BabyCmdActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".TempGunCmdActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".SphyCmdActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".TempCmdActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".HeightCmdActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".BleCmdActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".TestCmdActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".TpmsConnectCmdActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".ConnectBleTestActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".ADWeightScaleCmdActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".ADWeightScaleUserActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".modules.wifi_ble_scale.WeightScaleWifiBleActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".WeightScaleBleActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".WifiConfigActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".modules.eight_bodyfat.EightBodyfatActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".TestOtaActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".modules.blood_glucose.BloodGlucoseActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".BabyBodyFatCmdActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".BroadcastScaleActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".TransmissionActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".BroadcastBloodOxygenActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".modules.toothbrush.ToothBrushWifiOnOnBleActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".BLDWeightScaleBleActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".BloodOxygenActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".modules.blood_glucose.BloodGlucoseTestActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".modules.share_charger.ShareChargerActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".modules.broadcast_height.BroadcastHeightActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".modules.coffee_scale.CoffeeScaleActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".HeightWeightScaleActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".find.FindDeviceActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".TempHumidityActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".modules.ropeskipping.RopeSkippingActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".modules.airdetector.AirDetectorActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".modules.airdetector_test.AirDetectorActivityTest" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | <activity | ||||
| android:name=".modules.food_temp.FoodTempActivity" | android:name=".modules.food_temp.FoodTempActivity" | ||||
| android:screenOrientation="portrait" | |||||
| android:windowSoftInputMode="adjustPan|stateHidden" /> | android:windowSoftInputMode="adjustPan|stateHidden" /> | ||||
| <activity android:name=".find.FindDeviceNewActivity" /> | |||||
| <activity android:name=".BloodSugar4GActivity" /> | |||||
| <activity android:name=".modules.share_socket.ShareSocketActivity" /> | |||||
| <activity android:name=".modules.share_condom.ShareCondomActivity" /> | |||||
| <activity android:name=".modules.broadcast_nutrition.BroadNutritionActivity" /> | |||||
| <activity android:name=".modules.ble_nutrition.BleNutritionActivity" /> | |||||
| <activity android:name=".modules.toothbrush_test.ToothbrushTestActivity" /> | |||||
| <activity android:name=".modules.leaone_broadcast.LeaOneBroadcastActivity" /> | |||||
| <activity android:name=".modules.fascia_gun.FasciaGunActivity" /> | |||||
| <activity android:name=".modules.blood_pressure_tc.BloodPressureTcActivity" /> | |||||
| <activity android:name=".modules.ropeskipping.RopeSkippingSetActivity" /> | |||||
| <activity android:name=".modules.body_scale_4g.BodyScale4GActivity" /> | |||||
| <activity android:name=".AiLinkScooterActivity" /> | |||||
| <activity android:name=".modules.TempInstrument.TempInstrumentActivity" /> | |||||
| <activity android:name=".AboutActivity" /> | |||||
| <activity android:name=".modules.PublicBleNetworkCmdActivity" /> | |||||
| <activity android:name=".modules.noise_meter.WifiBleNoiseMeterActivity" /> | |||||
| <activity android:name=".modules.noise_meter.BleNoiseMeterActivity" /> | |||||
| <activity | |||||
| android:name=".find.FindDeviceNewActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".BloodSugar4GActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".modules.share_socket.ShareSocketActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".modules.share_condom.ShareCondomActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".modules.broadcast_nutrition.BroadNutritionActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".modules.ble_nutrition.BleNutritionActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".modules.toothbrush_test.ToothbrushTestActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".modules.leaone_broadcast.LeaOneBroadcastActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".modules.fascia_gun.FasciaGunActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".modules.blood_pressure_tc.BloodPressureTcActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".modules.ropeskipping.RopeSkippingSetActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".modules.body_scale_4g.BodyScale4GActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".AiLinkScooterActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".modules.TempInstrument.TempInstrumentActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".AboutActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".modules.PublicBleNetworkCmdActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".modules.noise_meter.WifiBleNoiseMeterActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".modules.noise_meter.BleNoiseMeterActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | <activity | ||||
| android:name=".modules.meat_probe_charger.MeatProbeChargerActivity" | android:name=".modules.meat_probe_charger.MeatProbeChargerActivity" | ||||
| android:screenOrientation="portrait" /> | android:screenOrientation="portrait" /> | ||||
| <activity | <activity | ||||
| android:name=".modules.barometric_temp_humidity.BarometricTempHygrometerActivity" | android:name=".modules.barometric_temp_humidity.BarometricTempHygrometerActivity" | ||||
| android:screenOrientation="portrait" /> | android:screenOrientation="portrait" /> | ||||
| <activity android:name=".modules.wifible_sphy.WifiBleSphyActivity" /> | |||||
| <activity android:name=".modules.PublicWifiBleOtaActivity" /> | |||||
| <activity android:name=".modules.eight_bodyfat.dual_band.EightDoubleBodyfatActivity" /> | |||||
| <activity android:name=".modules.PublicMqttActivity" /> | |||||
| <activity | |||||
| android:name=".modules.wifible_sphy.WifiBleSphyActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".modules.PublicWifiBleOtaActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".modules.eight_bodyfat.dual_band.EightDoubleBodyfatActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | <activity | ||||
| android:name=".modules.bw05watch.Bw05WatchActivity" | android:name=".modules.bw05watch.Bw05WatchActivity" | ||||
| android:screenOrientation="portrait" /> | android:screenOrientation="portrait" /> | ||||
| <activity android:name=".modules.ble_nutrition.BleNutritionNutrientActivity" /> | |||||
| <activity android:name=".modules.eight_bodyfat.EightBodyFatMcuActivity" /> | |||||
| <activity android:name=".modules.gasDetector.GasDetectorActivity" /> | |||||
| <activity | |||||
| android:name=".modules.ble_nutrition.BleNutritionNutrientActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".modules.eight_bodyfat.EightBodyFatMcuActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".modules.gasDetector.GasDetectorActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".modules.gasDetectorPlus.GasDetectorPlusActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".modules.hmiBodyFat.HmiBodyFatScaleBleActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".modules.ble_0020_hu_infrared_temp.Ble0020HpInfraredTempActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity | |||||
| android:name=".modules.toothbrush.ToothBrushWifiNewBleActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <provider | <provider | ||||
| android:name="androidx.core.content.FileProvider" | android:name="androidx.core.content.FileProvider" | ||||
| android:name="org.eclipse.paho.android.service.MqttService" | android:name="org.eclipse.paho.android.service.MqttService" | ||||
| android:enabled="true" | android:enabled="true" | ||||
| android:exported="true"></service> | android:exported="true"></service> | ||||
| <service android:name="com.pingwang.bluetoothlib.server.ELinkBleServer" | |||||
| android:foregroundServiceType="connectedDevice" | |||||
| > | |||||
| </service> | |||||
| </application> | </application> | ||||
| </manifest> | </manifest> |
| private Handler mHandler = new Handler(Looper.getMainLooper()) { | private Handler mHandler = new Handler(Looper.getMainLooper()) { | ||||
| @Override | @Override | ||||
| public void handleMessage(Message msg) { | public void handleMessage(Message msg) { | ||||
| switch (msg.what) { | |||||
| case REFRESH_DATA: | |||||
| if (listAdapter != null) | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| if (msg.what == REFRESH_DATA) { | |||||
| if (listAdapter != null) | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } | } | ||||
| } | } | ||||
| }; | }; | ||||
| listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | ||||
| listView.setAdapter(listAdapter); | listView.setAdapter(listAdapter); | ||||
| findViewById(R.id.user).setOnClickListener(this); | |||||
| findViewById(R.id.btnUser).setOnClickListener(this); | |||||
| findViewById(R.id.btnVersion).setOnClickListener(this); | findViewById(R.id.btnVersion).setOnClickListener(this); | ||||
| findViewById(R.id.Undressing).setOnClickListener(this); | findViewById(R.id.Undressing).setOnClickListener(this); | ||||
| findViewById(R.id.clear).setOnClickListener(this); | findViewById(R.id.clear).setOnClickListener(this); | ||||
| public void onCheckedChanged(RadioGroup group, int checkedId) { | public void onCheckedChanged(RadioGroup group, int checkedId) { | ||||
| if (checkedId == -1) | if (checkedId == -1) | ||||
| return;//不是人为点击不触发 | return;//不是人为点击不触发 | ||||
| switch (group.getCheckedRadioButtonId()) { | |||||
| case R.id.radio_weight_kg: | |||||
| weightUnit = ADWeightScaleBleConfig.WEIGHT_KG; | |||||
| break; | |||||
| case R.id.radio_weight_lb_lb: | |||||
| weightUnit = ADWeightScaleBleConfig.WEIGHT_LB_LB; | |||||
| break; | |||||
| case R.id.radio_weight_st_lb: | |||||
| weightUnit = ADWeightScaleBleConfig.WEIGHT_ST; | |||||
| break; | |||||
| case R.id.radio_weight_jin: | |||||
| weightUnit = ADWeightScaleBleConfig.WEIGHT_JIN; | |||||
| break; | |||||
| int checkedRadioButtonId = group.getCheckedRadioButtonId(); | |||||
| if (checkedRadioButtonId == R.id.radio_weight_kg) { | |||||
| weightUnit = ADWeightScaleBleConfig.WEIGHT_KG; | |||||
| } else if (checkedRadioButtonId == R.id.radio_weight_lb_lb) { | |||||
| weightUnit = ADWeightScaleBleConfig.WEIGHT_LB_LB; | |||||
| } else if (checkedRadioButtonId == R.id.radio_weight_st_lb) { | |||||
| weightUnit = ADWeightScaleBleConfig.WEIGHT_ST; | |||||
| } else if (checkedRadioButtonId == R.id.radio_weight_jin) { | |||||
| weightUnit = ADWeightScaleBleConfig.WEIGHT_JIN; | |||||
| } | } | ||||
| BleLog.i(TAG, "weightUnit:" + weightUnit); | BleLog.i(TAG, "weightUnit:" + weightUnit); | ||||
| mDevice.setUnit(weightUnit); | mDevice.setUnit(weightUnit); | ||||
| @Override | @Override | ||||
| public void onClick(View v) { | public void onClick(View v) { | ||||
| SendBleBean sendBleBean = new SendBleBean(); | SendBleBean sendBleBean = new SendBleBean(); | ||||
| switch (v.getId()) { | |||||
| case R.id.btnVersion: | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||||
| mDevice.sendData(sendBleBean); | |||||
| break; | |||||
| case R.id.Undressing: | |||||
| mUndressing = !mUndressing; | |||||
| mDevice.setUndressing(mUndressing); | |||||
| break; | |||||
| case R.id.Impedance: | |||||
| mImpedance = !mImpedance; | |||||
| mDevice.setBleImpedanceDiscern(mImpedance, 50); | |||||
| break; | |||||
| case R.id.clear: | |||||
| if (mList != null) | |||||
| mList.clear(); | |||||
| int id = v.getId(); | |||||
| if (id == R.id.btnVersion) { | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||||
| mDevice.sendData(sendBleBean); | |||||
| } else if (id == R.id.Undressing) { | |||||
| mUndressing = !mUndressing; | |||||
| mDevice.setUndressing(mUndressing); | |||||
| } else if (id == R.id.Impedance) { | |||||
| mImpedance = !mImpedance; | |||||
| mDevice.setBleImpedanceDiscern(mImpedance, 50); | |||||
| } else if (id == R.id.clear) { | |||||
| if (mList != null) | |||||
| mList.clear(); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } else if (id == R.id.getRecord) { | |||||
| List<Integer> list = new ArrayList<>(); | |||||
| for (ADWeightScaleUserData adWeightScaleUserData : sADWeightScaleUserDataList) { | |||||
| list.add(adWeightScaleUserData.getUserId()); | |||||
| } | |||||
| mDevice.setBleSynUserHistoryRecord(list); | |||||
| } else if (id == R.id.synUserAll) { | |||||
| synUserAll(); | |||||
| } else if (id == R.id.synUser) { | |||||
| mDevice.setBleUpdateUser(mADWeightScaleUserData); | |||||
| } else if (id == R.id.btnUser) { | |||||
| startActivityForResult(new Intent(mContext, ADWeightScaleUserActivity.class), 1); | |||||
| } else if (id == R.id.synTime) { | |||||
| if (mDevice != null) { | |||||
| mDevice.setSynTime(); | |||||
| mList.add(TimeUtils.getTime() + "同步时间"); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | mHandler.sendEmptyMessage(REFRESH_DATA); | ||||
| break; | |||||
| case R.id.getRecord: | |||||
| List<Integer> list = new ArrayList<>(); | |||||
| for (ADWeightScaleUserData adWeightScaleUserData : sADWeightScaleUserDataList) { | |||||
| list.add(adWeightScaleUserData.getUserId()); | |||||
| } | |||||
| mDevice.setBleSynUserHistoryRecord(list); | |||||
| break; | |||||
| case R.id.synUserAll: | |||||
| synUserAll(); | |||||
| break; | |||||
| case R.id.synUser: | |||||
| mDevice.setBleUpdateUser(mADWeightScaleUserData); | |||||
| break; | |||||
| case R.id.user: | |||||
| startActivityForResult(new Intent(mContext, ADWeightScaleUserActivity.class), 1); | |||||
| break; | |||||
| case R.id.synTime: | |||||
| if (mDevice != null) { | |||||
| mDevice.setSynTime(); | |||||
| mList.add(TimeUtils.getTime() + "同步时间"); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| break; | |||||
| case R.id.btnDis: | |||||
| if (mDevice != null) { | |||||
| mDevice.disconnect(); | |||||
| } | |||||
| break; | |||||
| case R.id.btnConnect: | |||||
| startScanBle(0); | |||||
| break; | |||||
| } | |||||
| } else if (id == R.id.btnDis) { | |||||
| if (mDevice != null) { | |||||
| mDevice.disconnect(); | |||||
| } | |||||
| } else if (id == R.id.btnConnect) { | |||||
| startScanBle(0); | |||||
| } | } | ||||
| } | } | ||||
| @Override | @Override | ||||
| public void onClick(View v) { | public void onClick(View v) { | ||||
| switch (v.getId()) { | |||||
| case R.id.back_btn: | |||||
| finish(); | |||||
| break; | |||||
| case R.id.add_user_btn: | |||||
| if (ADWeightScaleCmdActivity.sADWeightScaleUserDataList.size() < 8) { | |||||
| ADWeightScaleCmdActivity.mUserId++; | |||||
| ADWeightScaleUserData adWeightScaleUserData = new ADWeightScaleUserData(); | |||||
| adWeightScaleUserData.setUserId(ADWeightScaleCmdActivity.mUserId); | |||||
| adWeightScaleUserData.setSex(ADWeightScaleBleConfig.SEX.MALE); | |||||
| adWeightScaleUserData.setAge(20); | |||||
| adWeightScaleUserData.setHeight(170); | |||||
| adWeightScaleUserData.setWeight(50); | |||||
| adWeightScaleUserData.setAdc(500); | |||||
| ADWeightScaleCmdActivity.sADWeightScaleUserDataList.add(adWeightScaleUserData); | |||||
| mAdapter.notifyDataSetChanged(); | |||||
| } else { | |||||
| Toast.makeText(mContext, "最多只允许添加8个用户", Toast.LENGTH_SHORT).show(); | |||||
| } | |||||
| break; | |||||
| int id = v.getId(); | |||||
| if (id == R.id.back_btn) { | |||||
| finish(); | |||||
| } else if (id == R.id.add_user_btn) { | |||||
| if (ADWeightScaleCmdActivity.sADWeightScaleUserDataList.size() < 8) { | |||||
| ADWeightScaleCmdActivity.mUserId++; | |||||
| ADWeightScaleUserData adWeightScaleUserData = new ADWeightScaleUserData(); | |||||
| adWeightScaleUserData.setUserId(ADWeightScaleCmdActivity.mUserId); | |||||
| adWeightScaleUserData.setSex(ADWeightScaleBleConfig.SEX.MALE); | |||||
| adWeightScaleUserData.setAge(20); | |||||
| adWeightScaleUserData.setHeight(170); | |||||
| adWeightScaleUserData.setWeight(50); | |||||
| adWeightScaleUserData.setAdc(500); | |||||
| ADWeightScaleCmdActivity.sADWeightScaleUserDataList.add(adWeightScaleUserData); | |||||
| mAdapter.notifyDataSetChanged(); | |||||
| } else { | |||||
| Toast.makeText(mContext, "最多只允许添加8个用户", Toast.LENGTH_SHORT).show(); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| ADWeightScaleUserData adWeightScaleUserData = | ADWeightScaleUserData adWeightScaleUserData = | ||||
| ADWeightScaleCmdActivity.sADWeightScaleUserDataList | ADWeightScaleCmdActivity.sADWeightScaleUserDataList | ||||
| .get(po); | .get(po); | ||||
| switch (seekBar.getId()) { | |||||
| case R.id.sb_item_age: | |||||
| adWeightScaleUserData.setAge(progress); | |||||
| break; | |||||
| case R.id.sb_item_height: | |||||
| adWeightScaleUserData.setHeight(progress); | |||||
| break; | |||||
| case R.id.sb_item_weight: | |||||
| adWeightScaleUserData.setWeight(progress); | |||||
| break; | |||||
| case R.id.sb_item_adc: | |||||
| adWeightScaleUserData.setAdc(progress); | |||||
| break; | |||||
| int id = seekBar.getId(); | |||||
| if (id == R.id.sb_item_age) { | |||||
| adWeightScaleUserData.setAge(progress); | |||||
| } else if (id == R.id.sb_item_height) { | |||||
| adWeightScaleUserData.setHeight(progress); | |||||
| } else if (id == R.id.sb_item_weight) { | |||||
| adWeightScaleUserData.setWeight(progress); | |||||
| } else if (id == R.id.sb_item_adc) { | |||||
| adWeightScaleUserData.setAdc(progress); | |||||
| } | } | ||||
| textView.setText(progress + ""); | textView.setText(progress + ""); | ||||
| ADWeightScaleCmdActivity.sADWeightScaleUserDataList.set(po, adWeightScaleUserData); | ADWeightScaleCmdActivity.sADWeightScaleUserDataList.set(po, adWeightScaleUserData); |
| @Override | @Override | ||||
| public void onClick(View v) { | public void onClick(View v) { | ||||
| if(AilinkScooterBleData.getInstance()==null)return; | if(AilinkScooterBleData.getInstance()==null)return; | ||||
| switch (v.getId()) { | |||||
| case R.id.btn_support_function: | |||||
| logList.add(0,"查询支持的功能"); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| AilinkScooterBleData.getInstance().getSupportedFunction(); | |||||
| break; | |||||
| case R.id.btn_hear: | |||||
| logList.add(0,"心跳数据交互"); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| AilinkScooterBleData.getInstance().sendHearData(); | |||||
| break; | |||||
| case R.id.btn_unit_kg: | |||||
| logList.add(0,"设置公制单位(结果在心跳包中看)"); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| AilinkScooterBleData.getInstance().sendUnitData(0); | |||||
| break; | |||||
| case R.id.btn_unit_mi: | |||||
| logList.add(0,"设置英制单位(结果在心跳包中看)"); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| AilinkScooterBleData.getInstance().sendUnitData(1); | |||||
| break; | |||||
| case R.id.btn_add_gear: | |||||
| currentGear++; | |||||
| if (currentGear > 7) currentGear = 7; | |||||
| logList.add(0,"设置档位(结果在心跳包中看):" + currentGear); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| AilinkScooterBleData.getInstance().sendGearData(currentGear); | |||||
| break; | |||||
| case R.id.btn_cut_gear: | |||||
| currentGear--; | |||||
| if (currentGear < 0) currentGear = 0; | |||||
| logList.add(0,"设置档位(结果在心跳包中看):" + currentGear); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| AilinkScooterBleData.getInstance().sendGearData(currentGear); | |||||
| break; | |||||
| case R.id.btn_zero_start: | |||||
| logList.add(0,"零启动(结果在心跳包中看)"); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| AilinkScooterBleData.getInstance().sendStartModeData(0); | |||||
| break; | |||||
| case R.id.btn_un_zero_start: | |||||
| logList.add(0,"非零启动(结果在心跳包中看)"); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| AilinkScooterBleData.getInstance().sendStartModeData(1); | |||||
| break; | |||||
| case R.id.btn_cruise_open: | |||||
| logList.add(0,"开启巡航(结果在心跳包中看)"); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| AilinkScooterBleData.getInstance().sendCruiseControlFunctionData(1); | |||||
| break; | |||||
| case R.id.btn_cruise_close: | |||||
| logList.add(0,"关闭巡航(结果在心跳包中看)"); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| AilinkScooterBleData.getInstance().sendCruiseControlFunctionData(0); | |||||
| break; | |||||
| case R.id.btn_clear_total_mileage: | |||||
| logList.add(0,"清除总里程(结果在心跳包中看)"); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| AilinkScooterBleData.getInstance().sendClearData(0x02); | |||||
| break; | |||||
| case R.id.btn_clear_single_mileage_time: | |||||
| logList.add(0,"清除单次里程时间(结果在心跳包中看)"); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| AilinkScooterBleData.getInstance().sendClearData(0x01); | |||||
| break; | |||||
| case R.id.btn_reset: | |||||
| logList.add(0,"清除单次里程时间(结果在心跳包中看)"); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| AilinkScooterBleData.getInstance().sendClearData(0x80); | |||||
| break; | |||||
| case R.id.btn_clear_other: | |||||
| logList.add(0,"清除除里程和时间外的其它控制器及仪表参数"); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| AilinkScooterBleData.getInstance().sendClearData(0x04); | |||||
| break; | |||||
| case R.id.btn_left_light: | |||||
| if (isOpenR) { | |||||
| isOpenR = false; | |||||
| logList.add(0,"右转灯开"); | |||||
| AilinkScooterBleData.getInstance().sendLightOpenData(0x20); | |||||
| } else { | |||||
| isOpenR = true; | |||||
| logList.add(0,"右转灯关"); | |||||
| AilinkScooterBleData.getInstance().sendLightCloseData(0x20); | |||||
| } | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_right_light: | |||||
| if (isOpenL) { | |||||
| isOpenL = false; | |||||
| logList.add(0,"左转灯开"); | |||||
| AilinkScooterBleData.getInstance().sendLightOpenData(0x10); | |||||
| } else { | |||||
| isOpenL = true; | |||||
| logList.add(0,"左转灯关"); | |||||
| AilinkScooterBleData.getInstance().sendLightCloseData(0x10); | |||||
| } | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_atmosphere_light: | |||||
| if (isAtmosphere) { | |||||
| isAtmosphere = false; | |||||
| logList.add(0,"氛围灯开"); | |||||
| AilinkScooterBleData.getInstance().sendLightOpenData(0x08); | |||||
| } else { | |||||
| isAtmosphere = true; | |||||
| logList.add(0,"氛围灯关"); | |||||
| AilinkScooterBleData.getInstance().sendLightCloseData(0x08); | |||||
| } | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_day_light: | |||||
| if (isDay) { | |||||
| isDay = false; | |||||
| logList.add(0,"日行灯开"); | |||||
| AilinkScooterBleData.getInstance().sendLightOpenData(0x04); | |||||
| } else { | |||||
| isDay = true; | |||||
| logList.add(0,"日行灯关"); | |||||
| AilinkScooterBleData.getInstance().sendLightCloseData(0x04); | |||||
| } | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_brake_light: | |||||
| if (isBrake) { | |||||
| isBrake = false; | |||||
| logList.add(0,"刹车灯开"); | |||||
| AilinkScooterBleData.getInstance().sendLightOpenData(0x02); | |||||
| } else { | |||||
| isBrake = true; | |||||
| logList.add(0,"刹车灯关"); | |||||
| AilinkScooterBleData.getInstance().sendLightCloseData(0x02); | |||||
| } | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_head_light: | |||||
| if (isHead) { | |||||
| isHead = false; | |||||
| logList.add(0,"前车灯开"); | |||||
| AilinkScooterBleData.getInstance().sendLightOpenData(0x01); | |||||
| } else { | |||||
| isHead = true; | |||||
| logList.add(0,"前车灯关"); | |||||
| AilinkScooterBleData.getInstance().sendLightCloseData(0x01); | |||||
| } | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_set_password: | |||||
| String oldPassword = et_password.getText().toString(); | |||||
| if (oldPassword.isEmpty()) { | |||||
| logList.add(0,"请输入原始密码"); | |||||
| } else { | |||||
| logList.add(0,"修改密码"); | |||||
| AilinkScooterBleData.getInstance().changeLockCarPassword(oldPassword, "123456"); | |||||
| } | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_unlock: | |||||
| String password = et_password.getText().toString(); | |||||
| if (password.isEmpty()) { | |||||
| logList.add(0,"请输入密码"); | |||||
| } else { | |||||
| logList.add(0,"解锁"); | |||||
| AilinkScooterBleData.getInstance().setLockCarPassword(0, password); | |||||
| } | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_lock: | |||||
| logList.add(0,"锁车"); | |||||
| AilinkScooterBleData.getInstance().setLockCarPassword(1, "000000"); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_check_password: | |||||
| String checkPassword = et_password.getText().toString(); | |||||
| if (checkPassword.isEmpty()) { | |||||
| logList.add(0,"请输入密码"); | |||||
| } else { | |||||
| logList.add(0,"验证密码"); | |||||
| AilinkScooterBleData.getInstance().setLockCarPassword(2, checkPassword); | |||||
| } | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_boot: | |||||
| String boot = et_password.getText().toString(); | |||||
| if (boot.isEmpty()) { | |||||
| logList.add(0,"请输入密码"); | |||||
| } else { | |||||
| logList.add(0,"验证密码"); | |||||
| AilinkScooterBleData.getInstance().setLockCarPassword(3, boot); | |||||
| } | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_shutdown: | |||||
| logList.add(0,"锁车"); | |||||
| AilinkScooterBleData.getInstance().setLockCarPassword(4, "000000"); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_after_password: | |||||
| logList.add(0,"获取售后密码"); | |||||
| AilinkScooterBleData.getInstance().readServicePassword(); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_auto_bg_light: | |||||
| logList.add(0,"开启自动背光"); | |||||
| AilinkScooterBleData.getInstance().sendBgAuto(); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_bg_light_100: | |||||
| logList.add(0,"开启手动背光:100"); | |||||
| AilinkScooterBleData.getInstance().sendBgUnAuto(100); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_bg_light_0: | |||||
| logList.add(0,"开启手动背光:0"); | |||||
| AilinkScooterBleData.getInstance().sendBgUnAuto(0); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_shutdown_unlock: | |||||
| logList.add(0,"设置自动关机"); | |||||
| AilinkScooterBleData.getInstance().sendAutoShutDownTime(unlockShutTime, lockShutTime); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_check_shutdown_time: | |||||
| logList.add(0,"查询自动关机时间"); | |||||
| AilinkScooterBleData.getInstance().sendGetShutDownTime(); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_check_single_use_time: | |||||
| logList.add(0,"查询单次行驶里程时间"); | |||||
| AilinkScooterBleData.getInstance().sendSingleMileageTime(); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_check_battery_info: | |||||
| logList.add(0,"查询总里程"); | |||||
| AilinkScooterBleData.getInstance().sendTotalMileage(); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_check_total_mileage: | |||||
| logList.add(0,"查询电池信息"); | |||||
| AilinkScooterBleData.getInstance().sendBatteryInfo(); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_check_battery_no: | |||||
| logList.add(0,"查询电池厂商代码及编号"); | |||||
| AilinkScooterBleData.getInstance().sendBatteryNo(); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_check_controller_no: | |||||
| logList.add(0,"查询控制器厂商代码及编号"); | |||||
| AilinkScooterBleData.getInstance().sendControllerNo(); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_check_meter_version: | |||||
| logList.add(0,"查询仪表固件版本"); | |||||
| AilinkScooterBleData.getInstance().sendMeterVersion(); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_check_charge_time: | |||||
| logList.add(0,"读取充电时间"); | |||||
| AilinkScooterBleData.getInstance().sendCheckChargeTime(); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_set_charge_time: | |||||
| String startTime = et_charge_start_time.getText().toString().trim(); | |||||
| String endTime = et_charge_end_time.getText().toString().trim(); | |||||
| if (startTime.isEmpty() || endTime.isEmpty() || startTime.contains(":") || endTime.contains(":")) { | |||||
| logList.add(0,"输入正确的时间和格式"); | |||||
| return; | |||||
| } | |||||
| int monday = cb_monday.isChecked() ? 1 : 0; | |||||
| int tuesday = cb_tuesday.isChecked() ? 1 : 0; | |||||
| int wednesday = cb_wednesday.isChecked() ? 1 : 0; | |||||
| int thursday = cb_thursday.isChecked() ? 1 : 0; | |||||
| int friday = cb_friday.isChecked() ? 1 : 0; | |||||
| int saturday = cb_saturday.isChecked() ? 1 : 0; | |||||
| int sunday = cb_sunday.isChecked() ? 1 : 0; | |||||
| int repeat = 1; | |||||
| StringBuffer stringBuffer = new StringBuffer(); | |||||
| if (monday == 1 || tuesday == 1 || wednesday == 1 || thursday == 1 || friday == 1 || saturday == 1 || sunday == 1) { | |||||
| repeat = 0; | |||||
| stringBuffer.append("设置充电时间:重复:"); | |||||
| stringBuffer.append(monday == 1 ? "周一 " : ""); | |||||
| stringBuffer.append(tuesday == 1 ? "周二 " : ""); | |||||
| stringBuffer.append(wednesday == 1 ? "周三 " : ""); | |||||
| stringBuffer.append(thursday == 1 ? "周四 " : ""); | |||||
| stringBuffer.append(friday == 1 ? "周五 " : ""); | |||||
| stringBuffer.append(saturday == 1 ? "周六 " : ""); | |||||
| stringBuffer.append(sunday == 1 ? "周日 " : ""); | |||||
| } else { | |||||
| stringBuffer.append("设置充电时间:不重复"); | |||||
| } | |||||
| String[] startTimes = startTime.split(":"); | |||||
| String[] endTimes = startTime.split(":"); | |||||
| logList.add(0,stringBuffer.toString()); | |||||
| try { | |||||
| AilinkScooterBleData.getInstance().sendChargeTime(repeat, monday, tuesday, wednesday, thursday, friday, saturday, sunday, | |||||
| Integer.parseInt(startTimes[0]), Integer.parseInt(startTimes[1]), Integer.parseInt(endTimes[0]), Integer.parseInt(endTimes[1])); | |||||
| } catch (NumberFormatException e) { | |||||
| logList.add(0,"出现异常。时间格式解析错误"); | |||||
| e.printStackTrace(); | |||||
| } | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_set_charge_capacity: | |||||
| String capacity = et_charge_capacity.getText().toString().trim(); | |||||
| if (capacity.isEmpty()) { | |||||
| logList.add(0,"请填写容量"); | |||||
| return; | |||||
| } | |||||
| int percentage = 0; | |||||
| try { | |||||
| percentage = Integer.parseInt(capacity); | |||||
| logList.add(0,"充电容量:" + percentage); | |||||
| } catch (NumberFormatException e) { | |||||
| e.printStackTrace(); | |||||
| logList.add(0,"请填数据啊"); | |||||
| } | |||||
| AilinkScooterBleData.getInstance().sendSetChargeCapacity(percentage); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_read_charge_capacity: | |||||
| logList.add(0,"读取充电容量"); | |||||
| AilinkScooterBleData.getInstance().sendGetChargeCapacity(); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_find_car_open: | |||||
| logList.add(0,"打开寻车功能"); | |||||
| AilinkScooterBleData.getInstance().sendFindCarFunction(1); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_find_car_close: | |||||
| logList.add(0,"关闭寻车功能"); | |||||
| AilinkScooterBleData.getInstance().sendFindCarFunction(0); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_auto_lock_open: | |||||
| logList.add(0,"打开自动锁车"); | |||||
| AilinkScooterBleData.getInstance().sendAutoLockCar(1); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_auto_lock_close: | |||||
| logList.add(0,"关闭自动锁车"); | |||||
| AilinkScooterBleData.getInstance().sendAutoLockCar(0); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_auto_unlock_open: | |||||
| logList.add(0,"打开自动解锁"); | |||||
| AilinkScooterBleData.getInstance().sendAutoUnLockCar(1); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_auto_unlock_close: | |||||
| logList.add(0,"关闭自动解锁"); | |||||
| AilinkScooterBleData.getInstance().sendAutoUnLockCar(0); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_move_warm_open: | |||||
| logList.add(0,"打开移位报警"); | |||||
| AilinkScooterBleData.getInstance().sendMoveWarm(1); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_move_warm_close: | |||||
| logList.add(0,"关闭移位报警"); | |||||
| AilinkScooterBleData.getInstance().sendMoveWarm(0); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_collision_warm_open: | |||||
| logList.add(0,"打开碰撞报警"); | |||||
| AilinkScooterBleData.getInstance().sendCollisionWarm(1); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_collision_warm_close: | |||||
| logList.add(0,"关闭碰撞报警"); | |||||
| AilinkScooterBleData.getInstance().sendCollisionWarm(0); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_read_warm_auto_lock: | |||||
| logList.add(0,"读取车辆报警、自动锁"); | |||||
| AilinkScooterBleData.getInstance().sendCarWarmAndLock(); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_find_car: | |||||
| logList.add(0,"寻车"); | |||||
| AilinkScooterBleData.getInstance().sendFindCar(); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_navigation_open: | |||||
| logList.add(0,"导航:向左转弯,当前方向剩余500米,总剩余路程1000米"); | |||||
| AilinkScooterBleData.getInstance().sendNavigation(1,2,500,1000); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_navigation_close: | |||||
| logList.add(0,"关闭导航"); | |||||
| AilinkScooterBleData.getInstance().sendNavigation(0,0,0,0); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| int id = v.getId(); | |||||
| if (id == R.id.btn_support_function) { | |||||
| logList.add(0, "查询支持的功能"); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| AilinkScooterBleData.getInstance().getSupportedFunction(); | |||||
| } else if (id == R.id.btn_hear) { | |||||
| logList.add(0, "心跳数据交互"); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| AilinkScooterBleData.getInstance().sendHearData(); | |||||
| } else if (id == R.id.btn_unit_kg) { | |||||
| logList.add(0, "设置公制单位(结果在心跳包中看)"); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| AilinkScooterBleData.getInstance().sendUnitData(0); | |||||
| } else if (id == R.id.btn_unit_mi) { | |||||
| logList.add(0, "设置英制单位(结果在心跳包中看)"); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| AilinkScooterBleData.getInstance().sendUnitData(1); | |||||
| } else if (id == R.id.btn_add_gear) { | |||||
| currentGear++; | |||||
| if (currentGear > 7) currentGear = 7; | |||||
| logList.add(0, "设置档位(结果在心跳包中看):" + currentGear); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| AilinkScooterBleData.getInstance().sendGearData(currentGear); | |||||
| } else if (id == R.id.btn_cut_gear) { | |||||
| currentGear--; | |||||
| if (currentGear < 0) currentGear = 0; | |||||
| logList.add(0, "设置档位(结果在心跳包中看):" + currentGear); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| AilinkScooterBleData.getInstance().sendGearData(currentGear); | |||||
| } else if (id == R.id.btn_zero_start) { | |||||
| logList.add(0, "零启动(结果在心跳包中看)"); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| AilinkScooterBleData.getInstance().sendStartModeData(0); | |||||
| } else if (id == R.id.btn_un_zero_start) { | |||||
| logList.add(0, "非零启动(结果在心跳包中看)"); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| AilinkScooterBleData.getInstance().sendStartModeData(1); | |||||
| } else if (id == R.id.btn_cruise_open) { | |||||
| logList.add(0, "开启巡航(结果在心跳包中看)"); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| AilinkScooterBleData.getInstance().sendCruiseControlFunctionData(1); | |||||
| } else if (id == R.id.btn_cruise_close) { | |||||
| logList.add(0, "关闭巡航(结果在心跳包中看)"); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| AilinkScooterBleData.getInstance().sendCruiseControlFunctionData(0); | |||||
| } else if (id == R.id.btn_clear_total_mileage) { | |||||
| logList.add(0, "清除总里程(结果在心跳包中看)"); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| AilinkScooterBleData.getInstance().sendClearData(0x02); | |||||
| } else if (id == R.id.btn_clear_single_mileage_time) { | |||||
| logList.add(0, "清除单次里程时间(结果在心跳包中看)"); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| AilinkScooterBleData.getInstance().sendClearData(0x01); | |||||
| } else if (id == R.id.btn_reset) { | |||||
| logList.add(0, "清除单次里程时间(结果在心跳包中看)"); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| AilinkScooterBleData.getInstance().sendClearData(0x80); | |||||
| } else if (id == R.id.btn_clear_other) { | |||||
| logList.add(0, "清除除里程和时间外的其它控制器及仪表参数"); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| AilinkScooterBleData.getInstance().sendClearData(0x04); | |||||
| } else if (id == R.id.btn_left_light) { | |||||
| if (isOpenR) { | |||||
| isOpenR = false; | |||||
| logList.add(0, "右转灯开"); | |||||
| AilinkScooterBleData.getInstance().sendLightOpenData(0x20); | |||||
| } else { | |||||
| isOpenR = true; | |||||
| logList.add(0, "右转灯关"); | |||||
| AilinkScooterBleData.getInstance().sendLightCloseData(0x20); | |||||
| } | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_right_light) { | |||||
| if (isOpenL) { | |||||
| isOpenL = false; | |||||
| logList.add(0, "左转灯开"); | |||||
| AilinkScooterBleData.getInstance().sendLightOpenData(0x10); | |||||
| } else { | |||||
| isOpenL = true; | |||||
| logList.add(0, "左转灯关"); | |||||
| AilinkScooterBleData.getInstance().sendLightCloseData(0x10); | |||||
| } | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_atmosphere_light) { | |||||
| if (isAtmosphere) { | |||||
| isAtmosphere = false; | |||||
| logList.add(0, "氛围灯开"); | |||||
| AilinkScooterBleData.getInstance().sendLightOpenData(0x08); | |||||
| } else { | |||||
| isAtmosphere = true; | |||||
| logList.add(0, "氛围灯关"); | |||||
| AilinkScooterBleData.getInstance().sendLightCloseData(0x08); | |||||
| } | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_day_light) { | |||||
| if (isDay) { | |||||
| isDay = false; | |||||
| logList.add(0, "日行灯开"); | |||||
| AilinkScooterBleData.getInstance().sendLightOpenData(0x04); | |||||
| } else { | |||||
| isDay = true; | |||||
| logList.add(0, "日行灯关"); | |||||
| AilinkScooterBleData.getInstance().sendLightCloseData(0x04); | |||||
| } | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_brake_light) { | |||||
| if (isBrake) { | |||||
| isBrake = false; | |||||
| logList.add(0, "刹车灯开"); | |||||
| AilinkScooterBleData.getInstance().sendLightOpenData(0x02); | |||||
| } else { | |||||
| isBrake = true; | |||||
| logList.add(0, "刹车灯关"); | |||||
| AilinkScooterBleData.getInstance().sendLightCloseData(0x02); | |||||
| } | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_head_light) { | |||||
| if (isHead) { | |||||
| isHead = false; | |||||
| logList.add(0, "前车灯开"); | |||||
| AilinkScooterBleData.getInstance().sendLightOpenData(0x01); | |||||
| } else { | |||||
| isHead = true; | |||||
| logList.add(0, "前车灯关"); | |||||
| AilinkScooterBleData.getInstance().sendLightCloseData(0x01); | |||||
| } | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_set_password) { | |||||
| String oldPassword = et_password.getText().toString(); | |||||
| if (oldPassword.isEmpty()) { | |||||
| logList.add(0, "请输入原始密码"); | |||||
| } else { | |||||
| logList.add(0, "修改密码"); | |||||
| AilinkScooterBleData.getInstance().changeLockCarPassword(oldPassword, "123456"); | |||||
| } | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_unlock) { | |||||
| String password = et_password.getText().toString(); | |||||
| if (password.isEmpty()) { | |||||
| logList.add(0, "请输入密码"); | |||||
| } else { | |||||
| logList.add(0, "解锁"); | |||||
| AilinkScooterBleData.getInstance().setLockCarPassword(0, password); | |||||
| } | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_lock) { | |||||
| logList.add(0, "锁车"); | |||||
| AilinkScooterBleData.getInstance().setLockCarPassword(1, "000000"); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_check_password) { | |||||
| String checkPassword = et_password.getText().toString(); | |||||
| if (checkPassword.isEmpty()) { | |||||
| logList.add(0, "请输入密码"); | |||||
| } else { | |||||
| logList.add(0, "验证密码"); | |||||
| AilinkScooterBleData.getInstance().setLockCarPassword(2, checkPassword); | |||||
| } | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_boot) { | |||||
| String boot = et_password.getText().toString(); | |||||
| if (boot.isEmpty()) { | |||||
| logList.add(0, "请输入密码"); | |||||
| } else { | |||||
| logList.add(0, "验证密码"); | |||||
| AilinkScooterBleData.getInstance().setLockCarPassword(3, boot); | |||||
| } | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_shutdown) { | |||||
| logList.add(0, "锁车"); | |||||
| AilinkScooterBleData.getInstance().setLockCarPassword(4, "000000"); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_after_password) { | |||||
| logList.add(0, "获取售后密码"); | |||||
| AilinkScooterBleData.getInstance().readServicePassword(); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_auto_bg_light) { | |||||
| logList.add(0, "开启自动背光"); | |||||
| AilinkScooterBleData.getInstance().sendBgAuto(); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_bg_light_100) { | |||||
| logList.add(0, "开启手动背光:100"); | |||||
| AilinkScooterBleData.getInstance().sendBgUnAuto(100); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_bg_light_0) { | |||||
| logList.add(0, "开启手动背光:0"); | |||||
| AilinkScooterBleData.getInstance().sendBgUnAuto(0); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_shutdown_unlock) { | |||||
| logList.add(0, "设置自动关机"); | |||||
| AilinkScooterBleData.getInstance().sendAutoShutDownTime(unlockShutTime, lockShutTime); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_check_shutdown_time) { | |||||
| logList.add(0, "查询自动关机时间"); | |||||
| AilinkScooterBleData.getInstance().sendGetShutDownTime(); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_check_single_use_time) { | |||||
| logList.add(0, "查询单次行驶里程时间"); | |||||
| AilinkScooterBleData.getInstance().sendSingleMileageTime(); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_check_battery_info) { | |||||
| logList.add(0, "查询总里程"); | |||||
| AilinkScooterBleData.getInstance().sendTotalMileage(); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_check_total_mileage) { | |||||
| logList.add(0, "查询电池信息"); | |||||
| AilinkScooterBleData.getInstance().sendBatteryInfo(); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_check_battery_no) { | |||||
| logList.add(0, "查询电池厂商代码及编号"); | |||||
| AilinkScooterBleData.getInstance().sendBatteryNo(); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_check_controller_no) { | |||||
| logList.add(0, "查询控制器厂商代码及编号"); | |||||
| AilinkScooterBleData.getInstance().sendControllerNo(); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_check_meter_version) { | |||||
| logList.add(0, "查询仪表固件版本"); | |||||
| AilinkScooterBleData.getInstance().sendMeterVersion(); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_check_charge_time) { | |||||
| logList.add(0, "读取充电时间"); | |||||
| AilinkScooterBleData.getInstance().sendCheckChargeTime(); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_set_charge_time) { | |||||
| String startTime = et_charge_start_time.getText().toString().trim(); | |||||
| String endTime = et_charge_end_time.getText().toString().trim(); | |||||
| if (startTime.isEmpty() || endTime.isEmpty() || startTime.contains(":") || endTime.contains(":")) { | |||||
| logList.add(0, "输入正确的时间和格式"); | |||||
| return; | |||||
| } | |||||
| int monday = cb_monday.isChecked() ? 1 : 0; | |||||
| int tuesday = cb_tuesday.isChecked() ? 1 : 0; | |||||
| int wednesday = cb_wednesday.isChecked() ? 1 : 0; | |||||
| int thursday = cb_thursday.isChecked() ? 1 : 0; | |||||
| int friday = cb_friday.isChecked() ? 1 : 0; | |||||
| int saturday = cb_saturday.isChecked() ? 1 : 0; | |||||
| int sunday = cb_sunday.isChecked() ? 1 : 0; | |||||
| int repeat = 1; | |||||
| StringBuffer stringBuffer = new StringBuffer(); | |||||
| if (monday == 1 || tuesday == 1 || wednesday == 1 || thursday == 1 || friday == 1 || saturday == 1 || sunday == 1) { | |||||
| repeat = 0; | |||||
| stringBuffer.append("设置充电时间:重复:"); | |||||
| stringBuffer.append(monday == 1 ? "周一 " : ""); | |||||
| stringBuffer.append(tuesday == 1 ? "周二 " : ""); | |||||
| stringBuffer.append(wednesday == 1 ? "周三 " : ""); | |||||
| stringBuffer.append(thursday == 1 ? "周四 " : ""); | |||||
| stringBuffer.append(friday == 1 ? "周五 " : ""); | |||||
| stringBuffer.append(saturday == 1 ? "周六 " : ""); | |||||
| stringBuffer.append(sunday == 1 ? "周日 " : ""); | |||||
| } else { | |||||
| stringBuffer.append("设置充电时间:不重复"); | |||||
| } | |||||
| String[] startTimes = startTime.split(":"); | |||||
| String[] endTimes = startTime.split(":"); | |||||
| logList.add(0, stringBuffer.toString()); | |||||
| try { | |||||
| AilinkScooterBleData.getInstance().sendChargeTime(repeat, monday, tuesday, wednesday, thursday, friday, saturday, sunday, | |||||
| Integer.parseInt(startTimes[0]), Integer.parseInt(startTimes[1]), Integer.parseInt(endTimes[0]), Integer.parseInt(endTimes[1])); | |||||
| } catch (NumberFormatException e) { | |||||
| logList.add(0, "出现异常。时间格式解析错误"); | |||||
| e.printStackTrace(); | |||||
| } | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_set_charge_capacity) { | |||||
| String capacity = et_charge_capacity.getText().toString().trim(); | |||||
| if (capacity.isEmpty()) { | |||||
| logList.add(0, "请填写容量"); | |||||
| return; | |||||
| } | |||||
| int percentage = 0; | |||||
| try { | |||||
| percentage = Integer.parseInt(capacity); | |||||
| logList.add(0, "充电容量:" + percentage); | |||||
| } catch (NumberFormatException e) { | |||||
| e.printStackTrace(); | |||||
| logList.add(0, "请填数据啊"); | |||||
| } | |||||
| AilinkScooterBleData.getInstance().sendSetChargeCapacity(percentage); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_read_charge_capacity) { | |||||
| logList.add(0, "读取充电容量"); | |||||
| AilinkScooterBleData.getInstance().sendGetChargeCapacity(); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_find_car_open) { | |||||
| logList.add(0, "打开寻车功能"); | |||||
| AilinkScooterBleData.getInstance().sendFindCarFunction(1); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_find_car_close) { | |||||
| logList.add(0, "关闭寻车功能"); | |||||
| AilinkScooterBleData.getInstance().sendFindCarFunction(0); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_auto_lock_open) { | |||||
| logList.add(0, "打开自动锁车"); | |||||
| AilinkScooterBleData.getInstance().sendAutoLockCar(1); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_auto_lock_close) { | |||||
| logList.add(0, "关闭自动锁车"); | |||||
| AilinkScooterBleData.getInstance().sendAutoLockCar(0); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_auto_unlock_open) { | |||||
| logList.add(0, "打开自动解锁"); | |||||
| AilinkScooterBleData.getInstance().sendAutoUnLockCar(1); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_auto_unlock_close) { | |||||
| logList.add(0, "关闭自动解锁"); | |||||
| AilinkScooterBleData.getInstance().sendAutoUnLockCar(0); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_move_warm_open) { | |||||
| logList.add(0, "打开移位报警"); | |||||
| AilinkScooterBleData.getInstance().sendMoveWarm(1); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_move_warm_close) { | |||||
| logList.add(0, "关闭移位报警"); | |||||
| AilinkScooterBleData.getInstance().sendMoveWarm(0); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_collision_warm_open) { | |||||
| logList.add(0, "打开碰撞报警"); | |||||
| AilinkScooterBleData.getInstance().sendCollisionWarm(1); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_collision_warm_close) { | |||||
| logList.add(0, "关闭碰撞报警"); | |||||
| AilinkScooterBleData.getInstance().sendCollisionWarm(0); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_read_warm_auto_lock) { | |||||
| logList.add(0, "读取车辆报警、自动锁"); | |||||
| AilinkScooterBleData.getInstance().sendCarWarmAndLock(); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_find_car) { | |||||
| logList.add(0, "寻车"); | |||||
| AilinkScooterBleData.getInstance().sendFindCar(); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_navigation_open) { | |||||
| logList.add(0, "导航:向左转弯,当前方向剩余500米,总剩余路程1000米"); | |||||
| AilinkScooterBleData.getInstance().sendNavigation(1, 2, 500, 1000); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_navigation_close) { | |||||
| logList.add(0, "关闭导航"); | |||||
| AilinkScooterBleData.getInstance().sendNavigation(0, 0, 0, 0); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } | } | ||||
| } | } | ||||
| public void onCheckedChanged(RadioGroup group, int checkedId) { | public void onCheckedChanged(RadioGroup group, int checkedId) { | ||||
| if (checkedId == -1) | if (checkedId == -1) | ||||
| return;//不是人为点击不触发 | return;//不是人为点击不触发 | ||||
| switch (group.getCheckedRadioButtonId()) { | |||||
| case R.id.radio_weight_kg: | |||||
| weightUnit = BabyBleConfig.BABY_KG; | |||||
| break; | |||||
| case R.id.radio_weight_jin: | |||||
| weightUnit = BabyBleConfig.BABY_FG; | |||||
| break; | |||||
| case R.id.radio_weight_lb: | |||||
| weightUnit = BabyBleConfig.BABY_LB; | |||||
| break; | |||||
| case R.id.radio_weight_oz: | |||||
| weightUnit = BabyBleConfig.BABY_OZ; | |||||
| break; | |||||
| case R.id.radio_weight_st_lb: | |||||
| weightUnit = BabyBleConfig.BABY_ST; | |||||
| break; | |||||
| case R.id.radio_weight_g: | |||||
| weightUnit = BabyBleConfig.BABY_G; | |||||
| break; | |||||
| case R.id.radio_weight_lb_lb: | |||||
| weightUnit = BabyBleConfig.BABY_LB_LB; | |||||
| break; | |||||
| case R.id.radio_height_cm: | |||||
| heightUnit = BabyBleConfig.BABY_CM; | |||||
| break; | |||||
| case R.id.radio_height_inch: | |||||
| heightUnit = BabyBleConfig.BABY_INCH; | |||||
| break; | |||||
| case R.id.radio_height_foot: | |||||
| heightUnit = BabyBleConfig.BABY_FEET; | |||||
| break; | |||||
| int checkedRadioButtonId = group.getCheckedRadioButtonId(); | |||||
| if (checkedRadioButtonId == R.id.radio_weight_kg) { | |||||
| weightUnit = BabyBleConfig.BABY_KG; | |||||
| } else if (checkedRadioButtonId == R.id.radio_weight_jin) { | |||||
| weightUnit = BabyBleConfig.BABY_FG; | |||||
| } else if (checkedRadioButtonId == R.id.radio_weight_lb) { | |||||
| weightUnit = BabyBleConfig.BABY_LB; | |||||
| } else if (checkedRadioButtonId == R.id.radio_weight_oz) { | |||||
| weightUnit = BabyBleConfig.BABY_OZ; | |||||
| } else if (checkedRadioButtonId == R.id.radio_weight_st_lb) { | |||||
| weightUnit = BabyBleConfig.BABY_ST; | |||||
| } else if (checkedRadioButtonId == R.id.radio_weight_g) { | |||||
| weightUnit = BabyBleConfig.BABY_G; | |||||
| } else if (checkedRadioButtonId == R.id.radio_weight_lb_lb) { | |||||
| weightUnit = BabyBleConfig.BABY_LB_LB; | |||||
| } else if (checkedRadioButtonId == R.id.radio_height_cm) { | |||||
| heightUnit = BabyBleConfig.BABY_CM; | |||||
| } else if (checkedRadioButtonId == R.id.radio_height_inch) { | |||||
| heightUnit = BabyBleConfig.BABY_INCH; | |||||
| } else if (checkedRadioButtonId == R.id.radio_height_foot) { | |||||
| heightUnit = BabyBleConfig.BABY_FEET; | |||||
| } | } | ||||
| BleLog.i(TAG, "weightUnit:" + weightUnit + " ,||heightUnit:" + heightUnit); | BleLog.i(TAG, "weightUnit:" + weightUnit + " ,||heightUnit:" + heightUnit); | ||||
| mDevice.setUnit(weightUnit, heightUnit); | mDevice.setUnit(weightUnit, heightUnit); | ||||
| @Override | @Override | ||||
| public void onClick(View v) { | public void onClick(View v) { | ||||
| SendBleBean sendBleBean = new SendBleBean(); | SendBleBean sendBleBean = new SendBleBean(); | ||||
| switch (v.getId()) { | |||||
| case R.id.btnVersion: | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||||
| mDevice.sendData(sendBleBean); | |||||
| break; | |||||
| case R.id.clear: | |||||
| if (mList != null) | |||||
| mList.clear(); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| break; | |||||
| case R.id.btnDis: | |||||
| if (mDevice != null) { | |||||
| mDevice.disconnect(); | |||||
| } | |||||
| break; | |||||
| case R.id.btnConnect: | |||||
| startScanBle(0); | |||||
| break; | |||||
| case R.id.btn_set_tare: | |||||
| if (mDevice != null) { | |||||
| mDevice.setTare(); | |||||
| } | |||||
| break; | |||||
| case R.id.btn_set_hold: | |||||
| if (mDevice != null) { | |||||
| mDevice.setHold(); | |||||
| } | |||||
| break; | |||||
| int id = v.getId(); | |||||
| if (id == R.id.btnVersion) { | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||||
| mDevice.sendData(sendBleBean); | |||||
| } else if (id == R.id.clear) { | |||||
| if (mList != null) | |||||
| mList.clear(); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } else if (id == R.id.btnDis) { | |||||
| if (mDevice != null) { | |||||
| mDevice.disconnect(); | |||||
| } | |||||
| } else if (id == R.id.btnConnect) { | |||||
| startScanBle(0); | |||||
| } else if (id == R.id.btn_set_tare) { | |||||
| if (mDevice != null) { | |||||
| mDevice.setTare(); | |||||
| } | |||||
| } else if (id == R.id.btn_set_hold) { | |||||
| if (mDevice != null) { | |||||
| mDevice.setHold(); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| import cn.net.aicare.modulelibrary.module.babyscale.BabyDeviceData; | import cn.net.aicare.modulelibrary.module.babyscale.BabyDeviceData; | ||||
| /** | /** | ||||
| * xing<br> | * xing<br> | ||||
| * 2019/4/25<br> | * 2019/4/25<br> | ||||
| private Handler mHandler = new Handler(Looper.getMainLooper()) { | private Handler mHandler = new Handler(Looper.getMainLooper()) { | ||||
| @Override | @Override | ||||
| public void handleMessage(Message msg) { | public void handleMessage(Message msg) { | ||||
| switch (msg.what) { | |||||
| case REFRESH_DATA: | |||||
| if (listAdapter != null) | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| if (msg.what == REFRESH_DATA) { | |||||
| if (listAdapter != null) | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } | } | ||||
| } | } | ||||
| }; | }; | ||||
| @Override | @Override | ||||
| public void onCheckedChanged(RadioGroup group, int checkedId) { | public void onCheckedChanged(RadioGroup group, int checkedId) { | ||||
| switch (group.getCheckedRadioButtonId()) { | |||||
| case R.id.radio_weight_kg: | |||||
| weightUnit = BabyBleConfig.BABY_KG; | |||||
| break; | |||||
| case R.id.radio_weight_lb: | |||||
| weightUnit = BabyBleConfig.BABY_LB; | |||||
| break; | |||||
| case R.id.radio_weight_lb_lb: | |||||
| weightUnit = BabyBleConfig.BABY_LB_LB; | |||||
| break; | |||||
| case R.id.radio_weight_oz: | |||||
| weightUnit = BabyBleConfig.BABY_OZ; | |||||
| break; | |||||
| case R.id.radio_weight_g: | |||||
| weightUnit = BabyBleConfig.BABY_G; | |||||
| break; | |||||
| case R.id.radio_height_cm: | |||||
| heightUnit = BabyBleConfig.BABY_CM; | |||||
| break; | |||||
| case R.id.radio_height_foot: | |||||
| heightUnit = BabyBleConfig.BABY_FEET; | |||||
| break; | |||||
| int checkedRadioButtonId = group.getCheckedRadioButtonId(); | |||||
| if (checkedRadioButtonId == R.id.radio_weight_kg) { | |||||
| weightUnit = BabyBleConfig.BABY_KG; | |||||
| } else if (checkedRadioButtonId == R.id.radio_weight_lb) { | |||||
| weightUnit = BabyBleConfig.BABY_LB; | |||||
| } else if (checkedRadioButtonId == R.id.radio_weight_lb_lb) { | |||||
| weightUnit = BabyBleConfig.BABY_LB_LB; | |||||
| } else if (checkedRadioButtonId == R.id.radio_weight_oz) { | |||||
| weightUnit = BabyBleConfig.BABY_OZ; | |||||
| } else if (checkedRadioButtonId == R.id.radio_weight_g) { | |||||
| weightUnit = BabyBleConfig.BABY_G; | |||||
| } else if (checkedRadioButtonId == R.id.radio_height_cm) { | |||||
| heightUnit = BabyBleConfig.BABY_CM; | |||||
| } else if (checkedRadioButtonId == R.id.radio_height_foot) { | |||||
| heightUnit = BabyBleConfig.BABY_FEET; | |||||
| } | } | ||||
| } | } | ||||
| @Override | @Override | ||||
| public void onClick(View v) { | public void onClick(View v) { | ||||
| switch (v.getId()) { | |||||
| case R.id.btnVersion: | |||||
| babyDevice.sendData(new SendBleBean(BleSendCmdUtil.getInstance().getBleVersion())); | |||||
| break; | |||||
| case R.id.btnBattery: | |||||
| babyDevice.sendData(new SendBleBean(BleSendCmdUtil.getInstance().getMcuBatteryStatus())); | |||||
| break; | |||||
| case R.id.btn_get_did: | |||||
| babyDevice.sendData(new SendBleBean(BleSendCmdUtil.getInstance().getDid())); | |||||
| break; | |||||
| case R.id.clear: | |||||
| if (mList != null) | |||||
| mList.clear(); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| break; | |||||
| case R.id.btn_set_unit: | |||||
| //cm=0,inch=1 | |||||
| //kg=0,斤=1,lb=2,oz=3,st=4,g=5 | |||||
| babyDevice.setUnit(weightUnit, weightUnit); | |||||
| break; | |||||
| case R.id.btn_set_tare: | |||||
| babyDevice.setTare(); | |||||
| break; | |||||
| case R.id.btn_set_hold: | |||||
| babyDevice.setHold(); | |||||
| break; | |||||
| case R.id.getUnit: | |||||
| babyDevice.sendData(new SendBleBean(BleSendCmdUtil.getInstance().getSupportUnit())); | |||||
| break; | |||||
| int id = v.getId(); | |||||
| if (id == R.id.btnVersion) { | |||||
| babyDevice.sendData(new SendBleBean(BleSendCmdUtil.getInstance().getBleVersion())); | |||||
| } else if (id == R.id.btnBattery) { | |||||
| babyDevice.sendData(new SendBleBean(BleSendCmdUtil.getInstance().getMcuBatteryStatus())); | |||||
| } else if (id == R.id.btn_get_did) { | |||||
| babyDevice.sendData(new SendBleBean(BleSendCmdUtil.getInstance().getDid())); | |||||
| } else if (id == R.id.clear) { | |||||
| if (mList != null) | |||||
| mList.clear(); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } else if (id == R.id.btn_set_unit) {//cm=0,inch=1 | |||||
| //kg=0,斤=1,lb=2,oz=3,st=4,g=5 | |||||
| babyDevice.setUnit(weightUnit, weightUnit); | |||||
| } else if (id == R.id.btn_set_tare) { | |||||
| babyDevice.setTare(); | |||||
| } else if (id == R.id.btn_set_hold) { | |||||
| babyDevice.setHold(); | |||||
| } else if (id == R.id.getUnit) { | |||||
| babyDevice.sendData(new SendBleBean(BleSendCmdUtil.getInstance().getSupportUnit())); | |||||
| } | } | ||||
| } | } | ||||
| import androidx.annotation.NonNull; | import androidx.annotation.NonNull; | ||||
| import androidx.annotation.Nullable; | import androidx.annotation.Nullable; | ||||
| import androidx.core.view.MenuProvider; | |||||
| import androidx.lifecycle.Lifecycle; | |||||
| import androidx.lifecycle.LifecycleOwner; | |||||
| import com.pingwang.bluetoothlib.AILinkSDK; | |||||
| import com.pingwang.bluetoothlib.bean.BleHandshakeBean; | |||||
| import com.pingwang.bluetoothlib.bean.BleValueBean; | import com.pingwang.bluetoothlib.bean.BleValueBean; | ||||
| import com.pingwang.bluetoothlib.bean.SupportUnitBean; | import com.pingwang.bluetoothlib.bean.SupportUnitBean; | ||||
| import com.pingwang.bluetoothlib.config.BleConfig; | import com.pingwang.bluetoothlib.config.BleConfig; | ||||
| * 2019/4/25<br> | * 2019/4/25<br> | ||||
| * 基础指令信息数据显示 | * 基础指令信息数据显示 | ||||
| */ | */ | ||||
| public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, OnBleDeviceDataListener, OnBleVersionListener, OnMcuParameterListener, OnBleErrListener, OnBleInfoListener, OnBleParameterListener, OnBleCompanyListener, OnBleSettingListener, OnBleHandshakeListener, View.OnClickListener, OnBleOtherDataListener, OnBleRssiListener { | |||||
| public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, OnBleDeviceDataListener, OnBleVersionListener, OnMcuParameterListener, | |||||
| OnBleErrListener, OnBleInfoListener, OnBleParameterListener, OnBleCompanyListener, OnBleSettingListener, OnBleHandshakeListener, | |||||
| View.OnClickListener, OnBleOtherDataListener, OnBleRssiListener { | |||||
| private static String TAG = BleCmdActivity.class.getName(); | private static String TAG = BleCmdActivity.class.getName(); | ||||
| private final int REFRESH_DATA = 3; | private final int REFRESH_DATA = 3; | ||||
| private int mVid; | private int mVid; | ||||
| private int mPid; | private int mPid; | ||||
| private String mDeviceVersion; | private String mDeviceVersion; | ||||
| private String mDeviceVersion46; | |||||
| /** | /** | ||||
| * 是否暂停显示数据 | * 是否暂停显示数据 | ||||
| */ | */ | ||||
| private Handler mHandler = new Handler(Looper.getMainLooper()) { | private Handler mHandler = new Handler(Looper.getMainLooper()) { | ||||
| @Override | @Override | ||||
| public void handleMessage(Message msg) { | public void handleMessage(Message msg) { | ||||
| switch (msg.what) { | |||||
| case REFRESH_DATA: | |||||
| if (listAdapter != null) | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| if (msg.what == REFRESH_DATA) { | |||||
| if (listAdapter != null) | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } | } | ||||
| } | } | ||||
| }; | }; | ||||
| mBleSendCmdUtil = BleSendCmdUtil.getInstance(); | mBleSendCmdUtil = BleSendCmdUtil.getInstance(); | ||||
| init(); | init(); | ||||
| BleConfig.setHandshakeStatus((int[]) null, mAddress, true); | BleConfig.setHandshakeStatus((int[]) null, mAddress, true); | ||||
| BleHandshakeBean licenseDevice = AILinkSDK.getInstance().isLicenseDevice(mCid, mVid, mPid); | |||||
| String msg = "license:" + licenseDevice + "\n cid:" + mCid + "\n vid:" + mVid + "\n pid:" + mPid; | |||||
| addShowData(msg); | |||||
| BleLog.iw(msg); | |||||
| } | } | ||||
| private void init() { | private void init() { | ||||
| findViewById(R.id.btnDis).setOnClickListener(this); | findViewById(R.id.btnDis).setOnClickListener(this); | ||||
| findViewById(R.id.btnConnect).setOnClickListener(this); | findViewById(R.id.btnConnect).setOnClickListener(this); | ||||
| findViewById(R.id.btnSnRead).setOnClickListener(this); | findViewById(R.id.btnSnRead).setOnClickListener(this); | ||||
| findViewById(R.id.btnGetVersion46).setOnClickListener(this); | |||||
| etName = findViewById(R.id.etName); | etName = findViewById(R.id.etName); | ||||
| etMacType = findViewById(R.id.etMacType); | etMacType = findViewById(R.id.etMacType); | ||||
| etBroadcastTime = findViewById(R.id.etBroadcastTime); | etBroadcastTime = findViewById(R.id.etBroadcastTime); | ||||
| @Override | @Override | ||||
| public void onClick(View v) { | public void onClick(View v) { | ||||
| SendBleBean sendBleBean; | SendBleBean sendBleBean; | ||||
| switch (v.getId()) { | |||||
| case R.id.btnDis: | |||||
| if (mBleDevice != null) { | |||||
| mBleDevice.disconnect(); | |||||
| } | |||||
| addShowData("断开连接"); | |||||
| break; | |||||
| case R.id.btnConnect: | |||||
| mAILinkBleManager.connectDevice(new BleValueBean(mAddress, mCid, mVid, mPid)); | |||||
| addShowData("连接设备"); | |||||
| break; | |||||
| case R.id.btnClearShakeHands: | |||||
| if (mList != null) | |||||
| mList.clear(); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| break; | |||||
| case R.id.btnPause: | |||||
| mPauseShowCmd = !mPauseShowCmd; | |||||
| break; | |||||
| case R.id.btnHandshake: | |||||
| if (mBleDevice != null) { | |||||
| mBleDevice.setHandshake(true); | |||||
| // mBleDevice.sendHandshake(); | |||||
| addShowData("发送握手"); | |||||
| } | |||||
| break; | |||||
| case R.id.btnVersion: | |||||
| if (mBleDevice != null) { | |||||
| sendBleBean = new SendBleBean(); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||||
| sendData(sendBleBean); | |||||
| addShowData("正在获取版本号."); | |||||
| } | |||||
| break; | |||||
| case R.id.btnBattery: | |||||
| sendBleBean = new SendBleBean(); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus()); | |||||
| sendData(sendBleBean); | |||||
| addShowData("读取电量"); | |||||
| break; | |||||
| case R.id.btnTimeRead: | |||||
| sendBleBean = new SendBleBean(); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getSysTime()); | |||||
| sendData(sendBleBean); | |||||
| break; | |||||
| case R.id.btnTimeWrite: | |||||
| sendBleBean = new SendBleBean(); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.setSysTime(bleDataUtils.getCurrentTime(), true)); | |||||
| sendData(sendBleBean); | |||||
| break; | |||||
| case R.id.btnNameRead: | |||||
| sendBleBean = new SendBleBean(); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getBleName()); | |||||
| sendData(sendBleBean); | |||||
| break; | |||||
| case R.id.btnMacRead: | |||||
| sendBleBean = new SendBleBean(); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getBleMac()); | |||||
| sendData(sendBleBean); | |||||
| break; | |||||
| case R.id.btnMacTypeRead: | |||||
| sendBleBean = new SendBleBean(); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getBroadcastDataType()); | |||||
| sendData(sendBleBean); | |||||
| break; | |||||
| case R.id.btnMacTypeWrite: | |||||
| byte macType = Byte.valueOf(etMacType.getText().toString().trim()); | |||||
| sendBleBean = new SendBleBean(); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.setBroadcastDataType(macType)); | |||||
| sendData(sendBleBean); | |||||
| break; | |||||
| case R.id.btnNameWrite: | |||||
| byte[] names = bleDataUtils.getBleName(etName.getText().toString().trim()); | |||||
| sendBleBean = new SendBleBean(); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.setBleName(names)); | |||||
| sendData(sendBleBean); | |||||
| break; | |||||
| case R.id.btnBroadcastTimeRead: | |||||
| sendBleBean = new SendBleBean(); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getBleBroadcastTime()); | |||||
| sendData(sendBleBean); | |||||
| break; | |||||
| case R.id.btnBroadcastTimeWrite: | |||||
| try { | |||||
| int time = Integer.parseInt(etBroadcastTime.getText().toString().trim()); | |||||
| byte[] broadcastTime = bleDataUtils.getBroadcastTime(time); | |||||
| sendBleBean = new SendBleBean(); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.setBleBroadcastTime(broadcastTime)); | |||||
| sendData(sendBleBean); | |||||
| } catch (NumberFormatException e) { | |||||
| e.printStackTrace(); | |||||
| Toast.makeText(this, "请输入正确的广播时间", Toast.LENGTH_SHORT).show(); | |||||
| } | |||||
| break; | |||||
| int id = v.getId(); | |||||
| if (id == R.id.btnDis) { | |||||
| if (mBleDevice != null) { | |||||
| mBleDevice.disconnect(); | |||||
| } | |||||
| addShowData("断开连接"); | |||||
| } else if (id == R.id.btnConnect) { | |||||
| mAILinkBleManager.connectDevice(new BleValueBean(mAddress, mCid, mVid, mPid)); | |||||
| addShowData("连接设备"); | |||||
| } else if (id == R.id.btnClearShakeHands) { | |||||
| if (mList != null) | |||||
| mList.clear(); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } else if (id == R.id.btnPause) { | |||||
| mPauseShowCmd = !mPauseShowCmd; | |||||
| } else if (id == R.id.btnHandshake) { | |||||
| if (mBleDevice != null) { | |||||
| mBleDevice.setHandshake(true); | |||||
| // mBleDevice.sendHandshake(); | |||||
| addShowData("发送握手"); | |||||
| case R.id.btnDidRead: | |||||
| sendBleBean = new SendBleBean(); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getDid()); | |||||
| sendData(sendBleBean); | |||||
| break; | |||||
| case R.id.btnBmRestart: | |||||
| sendBleBean = new SendBleBean(); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.setBleRestart()); | |||||
| sendData(sendBleBean); | |||||
| break; | |||||
| case R.id.btnBmReset: | |||||
| sendBleBean = new SendBleBean(); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.setBleReset()); | |||||
| sendData(sendBleBean); | |||||
| break; | |||||
| case R.id.btnMcuType: | |||||
| byte mode = (byte) Integer.parseInt(etMcuType.getText().toString().trim()); | |||||
| } | |||||
| } else if (id == R.id.btnVersion) { | |||||
| if (mBleDevice != null) { | |||||
| sendBleBean = new SendBleBean(); | sendBleBean = new SendBleBean(); | ||||
| sendBleBean.setHex(mBleSendCmdUtil.setPortI2cSpiMode(mode)); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||||
| sendData(sendBleBean); | sendData(sendBleBean); | ||||
| break; | |||||
| addShowData("正在获取版本号."); | |||||
| case R.id.btnUnits: | |||||
| } | |||||
| } else if (id == R.id.btnBattery) { | |||||
| sendBleBean = new SendBleBean(); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus()); | |||||
| sendData(sendBleBean); | |||||
| addShowData("读取电量"); | |||||
| } else if (id == R.id.btnTimeRead) { | |||||
| sendBleBean = new SendBleBean(); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getSysTime()); | |||||
| sendData(sendBleBean); | |||||
| } else if (id == R.id.btnTimeWrite) { | |||||
| sendBleBean = new SendBleBean(); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.setSysTime(bleDataUtils.getCurrentTime(), true)); | |||||
| sendData(sendBleBean); | |||||
| } else if (id == R.id.btnNameRead) { | |||||
| sendBleBean = new SendBleBean(); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getBleName()); | |||||
| sendData(sendBleBean); | |||||
| } else if (id == R.id.btnMacRead) { | |||||
| sendBleBean = new SendBleBean(); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getBleMac()); | |||||
| sendData(sendBleBean); | |||||
| } else if (id == R.id.btnMacTypeRead) { | |||||
| sendBleBean = new SendBleBean(); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getBroadcastDataType()); | |||||
| sendData(sendBleBean); | |||||
| } else if (id == R.id.btnMacTypeWrite) { | |||||
| byte macType = Byte.valueOf(etMacType.getText().toString().trim()); | |||||
| sendBleBean = new SendBleBean(); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.setBroadcastDataType(macType)); | |||||
| sendData(sendBleBean); | |||||
| } else if (id == R.id.btnNameWrite) { | |||||
| byte[] names = bleDataUtils.getBleName(etName.getText().toString().trim()); | |||||
| sendBleBean = new SendBleBean(); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.setBleName(names)); | |||||
| sendData(sendBleBean); | |||||
| } else if (id == R.id.btnBroadcastTimeRead) { | |||||
| sendBleBean = new SendBleBean(); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getBleBroadcastTime()); | |||||
| sendData(sendBleBean); | |||||
| } else if (id == R.id.btnBroadcastTimeWrite) { | |||||
| try { | |||||
| int time = Integer.parseInt(etBroadcastTime.getText().toString().trim()); | |||||
| byte[] broadcastTime = bleDataUtils.getBroadcastTime(time); | |||||
| sendBleBean = new SendBleBean(); | sendBleBean = new SendBleBean(); | ||||
| sendBleBean.setHex(mBleSendCmdUtil.getSupportUnit()); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.setBleBroadcastTime(broadcastTime)); | |||||
| sendData(sendBleBean); | sendData(sendBleBean); | ||||
| break; | |||||
| } catch (NumberFormatException e) { | |||||
| e.printStackTrace(); | |||||
| Toast.makeText(this, "请输入正确的广播时间", Toast.LENGTH_SHORT).show(); | |||||
| } | |||||
| } else if (id == R.id.btnDidRead) { | |||||
| sendBleBean = new SendBleBean(); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getDid()); | |||||
| sendData(sendBleBean); | |||||
| } else if (id == R.id.btnBmRestart) { | |||||
| sendBleBean = new SendBleBean(); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.setBleRestart()); | |||||
| sendData(sendBleBean); | |||||
| } else if (id == R.id.btnBmReset) { | |||||
| sendBleBean = new SendBleBean(); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.setBleReset()); | |||||
| sendData(sendBleBean); | |||||
| } else if (id == R.id.btnMcuType) { | |||||
| byte mode = (byte) Integer.parseInt(etMcuType.getText().toString().trim()); | |||||
| sendBleBean = new SendBleBean(); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.setPortI2cSpiMode(mode)); | |||||
| sendData(sendBleBean); | |||||
| } else if (id == R.id.btnUnits) { | |||||
| sendBleBean = new SendBleBean(); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getSupportUnit()); | |||||
| sendData(sendBleBean); | |||||
| //写自动休眠 | //写自动休眠 | ||||
| case R.id.btnSleepTimeWrite: | |||||
| String sleepStr = etSleepTime.getText().toString().trim().toLowerCase(Locale.US); | |||||
| if (sleepStr.contains(",")) { | |||||
| String[] didStrS = sleepStr.split(","); | |||||
| if (didStrS.length > 3) { | |||||
| int switchStatus = Integer.parseInt(didStrS[0]); | |||||
| int toSleepTimeS = Integer.parseInt(didStrS[1]); | |||||
| int sleepSwitchCmd = Integer.parseInt(didStrS[2]); | |||||
| int broadcastTimeMS = Integer.parseInt(didStrS[3]); | |||||
| sendBleBean = new SendBleBean(); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.setNoConnectSleep(switchStatus, toSleepTimeS, sleepSwitchCmd, broadcastTimeMS)); | |||||
| sendData(sendBleBean); | |||||
| } | |||||
| } | |||||
| break; | |||||
| case R.id.btnSleepTimeRead: | |||||
| sendBleBean = new SendBleBean(); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getNoConnectSleep()); | |||||
| sendData(sendBleBean); | |||||
| break; | |||||
| case R.id.btn_start_ble: | |||||
| sendBleBean = new SendBleBean(); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.setToWake()); | |||||
| sendData(sendBleBean); | |||||
| break; | |||||
| case R.id.btnNameRssi: | |||||
| if (mBleDevice != null) { | |||||
| mBleDevice.readRssi(); | |||||
| } | |||||
| break; | |||||
| case R.id.btn_set_device: | |||||
| // 设置设备信息 | |||||
| String setDevice = et_set_device.getText().toString(); | |||||
| setDevice = setDevice.replace(" ", ""); | |||||
| setDevice = setDevice.replace(",", ""); | |||||
| if (TextUtils.isEmpty(setDevice)) { | |||||
| return; | |||||
| } else if (id == R.id.btnSleepTimeWrite) { | |||||
| String sleepStr = etSleepTime.getText().toString().trim().toLowerCase(Locale.US); | |||||
| if (sleepStr.contains(",")) { | |||||
| String[] didStrS = sleepStr.split(","); | |||||
| if (didStrS.length > 3) { | |||||
| int switchStatus = Integer.parseInt(didStrS[0]); | |||||
| int toSleepTimeS = Integer.parseInt(didStrS[1]); | |||||
| int sleepSwitchCmd = Integer.parseInt(didStrS[2]); | |||||
| int broadcastTimeMS = Integer.parseInt(didStrS[3]); | |||||
| sendBleBean = new SendBleBean(); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.setNoConnectSleep(switchStatus, toSleepTimeS, sleepSwitchCmd, broadcastTimeMS)); | |||||
| sendData(sendBleBean); | |||||
| } | } | ||||
| byte[] data = BleStrUtils.stringToByte(setDevice); | |||||
| sendBleBean = new SendBleBean(); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.setDeviceInfo(data)); | |||||
| sendData(sendBleBean); | |||||
| addShowData("设置设备信息:" + BleStrUtils.byte2HexStr(data)); | |||||
| break; | |||||
| case R.id.btn_get_device: | |||||
| // 获取设备信息 | |||||
| sendBleBean = new SendBleBean(); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getDeviceInfo()); | |||||
| sendData(sendBleBean); | |||||
| addShowData("读取设备信息"); | |||||
| break; | |||||
| case R.id.btnSnRead: | |||||
| // 获取设备信息 | |||||
| } | |||||
| } else if (id == R.id.btnSleepTimeRead) { | |||||
| sendBleBean = new SendBleBean(); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getNoConnectSleep()); | |||||
| sendData(sendBleBean); | |||||
| } else if (id == R.id.btn_start_ble) { | |||||
| sendBleBean = new SendBleBean(); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.setToWake()); | |||||
| sendData(sendBleBean); | |||||
| } else if (id == R.id.btnNameRssi) { | |||||
| if (mBleDevice != null) { | |||||
| mBleDevice.readRssi(); | |||||
| } | |||||
| } else if (id == R.id.btn_set_device) {// 设置设备信息 | |||||
| String setDevice = et_set_device.getText().toString(); | |||||
| setDevice = setDevice.replace(" ", ""); | |||||
| setDevice = setDevice.replace(",", ""); | |||||
| if (TextUtils.isEmpty(setDevice)) { | |||||
| return; | |||||
| } | |||||
| byte[] data = BleStrUtils.stringToByte(setDevice); | |||||
| sendBleBean = new SendBleBean(); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.setDeviceInfo(data)); | |||||
| sendData(sendBleBean); | |||||
| addShowData("设置设备信息:" + BleStrUtils.byte2HexStr(data)); | |||||
| } else if (id == R.id.btn_get_device) {// 获取设备信息 | |||||
| sendBleBean = new SendBleBean(); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getDeviceInfo()); | |||||
| sendData(sendBleBean); | |||||
| addShowData("读取设备信息"); | |||||
| } else if (id == R.id.btnSnRead) {// 获取设备信息 | |||||
| sendBleBean = new SendBleBean(); | |||||
| byte[] sendData = new byte[1]; | |||||
| sendData[0] = (byte) 0x95; | |||||
| sendBleBean.setHex(sendData); | |||||
| sendData(sendBleBean); | |||||
| addShowData("读取SN号"); | |||||
| } else if (id == R.id.btnGetVersion46) {// 获取设备版本号(0x46) | |||||
| if (mBleDevice != null) { | |||||
| sendBleBean = new SendBleBean(); | sendBleBean = new SendBleBean(); | ||||
| byte[] sendData = new byte[1]; | |||||
| sendData[0] = (byte) 0x95; | |||||
| sendBleBean.setHex(sendData); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion46()); | |||||
| sendData(sendBleBean); | sendData(sendBleBean); | ||||
| addShowData("读取SN号"); | |||||
| addShowData("正在获取版本号(0x46)."); | |||||
| break; | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @Override | @Override | ||||
| public void onDisConnected(@NonNull String mac, int code) { | public void onDisConnected(@NonNull String mac, int code) { | ||||
| //TODO 连接断开 | //TODO 连接断开 | ||||
| L.i( "连接断开"); | |||||
| L.i("连接断开"); | |||||
| if (mAddress.equals(mac)) { | if (mAddress.equals(mac)) { | ||||
| Toast.makeText(mContext, "连接断开:" + code, Toast.LENGTH_SHORT).show(); | Toast.makeText(mContext, "连接断开:" + code, Toast.LENGTH_SHORT).show(); | ||||
| mBleDevice = null; | mBleDevice = null; | ||||
| } | } | ||||
| @Override | |||||
| public void onBmVersion46(String version) { | |||||
| mDeviceVersion46 = version; | |||||
| addShowData("版本号(0x46):" + version); | |||||
| } | |||||
| @Override | @Override | ||||
| public void onSupportUnit(List<SupportUnitBean> list) { | public void onSupportUnit(List<SupportUnitBean> list) { | ||||
| StringBuilder unitStr = new StringBuilder(); | StringBuilder unitStr = new StringBuilder(); | ||||
| int systemBattery = AppPhoneInfoUtils.getSystemBattery(mContext); | int systemBattery = AppPhoneInfoUtils.getSystemBattery(mContext); | ||||
| String appData = "包名:" + BuildConfig.APPLICATION_ID + | String appData = "包名:" + BuildConfig.APPLICATION_ID + | ||||
| "\nApp版本:" + AppPhoneInfoUtils.getVersionName(mContext) + | "\nApp版本:" + AppPhoneInfoUtils.getVersionName(mContext) + | ||||
| "\n设备版本:" + mDeviceVersion + | |||||
| "\n设备版本:" + mDeviceVersion + " 0x46=" + mDeviceVersion46 + | |||||
| "\n设备:CID=0x" + Integer.toHexString(mCid) + " VID=0x" + Integer.toHexString(mVid) + " PID=0x" + Integer.toHexString(mPid) + | "\n设备:CID=0x" + Integer.toHexString(mCid) + " VID=0x" + Integer.toHexString(mVid) + " PID=0x" + Integer.toHexString(mPid) + | ||||
| "\n手机型号:" + AppPhoneInfoUtils.getPhoneInfo() + " " + AppPhoneInfoUtils.getBrand() + | "\n手机型号:" + AppPhoneInfoUtils.getPhoneInfo() + " " + AppPhoneInfoUtils.getBrand() + | ||||
| "\n手机系统:" + AppPhoneInfoUtils.getSystemVersionString() + | "\n手机系统:" + AppPhoneInfoUtils.getSystemVersionString() + | ||||
| startActivity(sendIntent); | startActivity(sendIntent); | ||||
| } | } | ||||
| @Override | |||||
| public void addMenuProvider(@NonNull MenuProvider provider, @NonNull LifecycleOwner owner, @NonNull Lifecycle.State state) { | |||||
| } | |||||
| } | } |
| private Handler mHandler = new Handler(Looper.getMainLooper()) { | private Handler mHandler = new Handler(Looper.getMainLooper()) { | ||||
| @Override | @Override | ||||
| public void handleMessage(Message msg) { | public void handleMessage(Message msg) { | ||||
| switch (msg.what) { | |||||
| case REFRESH_DATA: | |||||
| if (listAdapter != null) | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| if (msg.what == REFRESH_DATA) { | |||||
| if (listAdapter != null) | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } | } | ||||
| } | } | ||||
| }; | }; | ||||
| @Override | @Override | ||||
| public void onClick(View v) { | public void onClick(View v) { | ||||
| switch (v.getId()) { | |||||
| case R.id.clear: | |||||
| if (mList != null) | |||||
| mList.clear(); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| break; | |||||
| case R.id.open: | |||||
| if (mAILinkBleManager != null) { | |||||
| mAILinkBleManager.startScan(0, UUID.fromString("0000F0A0-0000-1000-8000-00805F9B34FB")); | |||||
| } | |||||
| break; | |||||
| case R.id.stop: | |||||
| if (mAILinkBleManager != null) { | |||||
| mAILinkBleManager.stopScan(); | |||||
| } | |||||
| break; | |||||
| int id = v.getId(); | |||||
| if (id == R.id.clear) { | |||||
| if (mList != null) | |||||
| mList.clear(); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } else if (id == R.id.open) { | |||||
| if (mAILinkBleManager != null) { | |||||
| mAILinkBleManager.startScan(0, UUID.fromString("0000F0A0-0000-1000-8000-00805F9B34FB")); | |||||
| } | |||||
| } else if (id == R.id.stop) { | |||||
| if (mAILinkBleManager != null) { | |||||
| mAILinkBleManager.stopScan(); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| private Handler mHandler = new Handler(Looper.getMainLooper()) { | private Handler mHandler = new Handler(Looper.getMainLooper()) { | ||||
| @Override | @Override | ||||
| public void handleMessage(Message msg) { | public void handleMessage(Message msg) { | ||||
| switch (msg.what) { | |||||
| case REFRESH_DATA: | |||||
| if (listAdapter != null) | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| if (msg.what == REFRESH_DATA) { | |||||
| if (listAdapter != null) | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } | } | ||||
| } | } | ||||
| }; | }; | ||||
| public void onCheckedChanged(RadioGroup group, int checkedId) { | public void onCheckedChanged(RadioGroup group, int checkedId) { | ||||
| if (checkedId == -1) | if (checkedId == -1) | ||||
| return;//不是人为点击不触发 | return;//不是人为点击不触发 | ||||
| switch (group.getCheckedRadioButtonId()) { | |||||
| case R.id.radio_weight_kg: | |||||
| mWeightUnit = BabyBleConfig.BABY_KG; | |||||
| break; | |||||
| case R.id.radio_weight_jin: | |||||
| mWeightUnit = BabyBleConfig.BABY_FG; | |||||
| break; | |||||
| case R.id.radio_weight_lb: | |||||
| mWeightUnit = BabyBleConfig.BABY_LB; | |||||
| break; | |||||
| case R.id.radio_weight_oz: | |||||
| mWeightUnit = BabyBleConfig.BABY_OZ; | |||||
| break; | |||||
| case R.id.radio_weight_st_lb: | |||||
| mWeightUnit = BabyBleConfig.BABY_ST; | |||||
| break; | |||||
| case R.id.radio_weight_g: | |||||
| mWeightUnit = BabyBleConfig.BABY_G; | |||||
| break; | |||||
| case R.id.radio_weight_lb_lb: | |||||
| mWeightUnit = BabyBleConfig.BABY_LB_LB; | |||||
| break; | |||||
| int checkedRadioButtonId = group.getCheckedRadioButtonId(); | |||||
| if (checkedRadioButtonId == R.id.radio_weight_kg) { | |||||
| mWeightUnit = BabyBleConfig.BABY_KG; | |||||
| } else if (checkedRadioButtonId == R.id.radio_weight_jin) { | |||||
| mWeightUnit = BabyBleConfig.BABY_FG; | |||||
| } else if (checkedRadioButtonId == R.id.radio_weight_lb) { | |||||
| mWeightUnit = BabyBleConfig.BABY_LB; | |||||
| } else if (checkedRadioButtonId == R.id.radio_weight_oz) { | |||||
| mWeightUnit = BabyBleConfig.BABY_OZ; | |||||
| } else if (checkedRadioButtonId == R.id.radio_weight_st_lb) { | |||||
| mWeightUnit = BabyBleConfig.BABY_ST; | |||||
| } else if (checkedRadioButtonId == R.id.radio_weight_g) { | |||||
| mWeightUnit = BabyBleConfig.BABY_G; | |||||
| } else if (checkedRadioButtonId == R.id.radio_weight_lb_lb) { | |||||
| mWeightUnit = BabyBleConfig.BABY_LB_LB; | |||||
| } | } | ||||
| BleLog.i(TAG, "weightUnit:" + mWeightUnit); | BleLog.i(TAG, "weightUnit:" + mWeightUnit); | ||||
| } | } | ||||
| @Override | @Override | ||||
| public void onClick(View v) { | public void onClick(View v) { | ||||
| switch (v.getId()) { | |||||
| case R.id.clear: | |||||
| if (mList != null) | |||||
| mList.clear(); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| break; | |||||
| case R.id.open: | |||||
| AILinkBleManager.getInstance().startScan(0, BleConfig.UUID_SERVER_BROADCAST_AILINK); | |||||
| break; | |||||
| case R.id.stop: | |||||
| AILinkBleManager.getInstance().stopScan(); | |||||
| break; | |||||
| int id = v.getId(); | |||||
| if (id == R.id.clear) { | |||||
| if (mList != null) | |||||
| mList.clear(); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } else if (id == R.id.open) { | |||||
| AILinkBleManager.getInstance().startScan(0, BleConfig.UUID_SERVER_BROADCAST_AILINK); | |||||
| } else if (id == R.id.stop) { | |||||
| AILinkBleManager.getInstance().stopScan(); | |||||
| } | } | ||||
| } | } | ||||
| package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||||
| import android.content.Context; | |||||
| import android.os.Bundle; | |||||
| import android.os.Handler; | |||||
| import android.os.Looper; | |||||
| import android.os.Message; | |||||
| import android.view.View; | |||||
| import android.widget.ArrayAdapter; | |||||
| import android.widget.EditText; | |||||
| import android.widget.ListView; | |||||
| import androidx.annotation.NonNull; | |||||
| import androidx.annotation.Nullable; | |||||
| import com.pingwang.bluetoothlib.device.BleDevice; | |||||
| import com.pingwang.bluetoothlib.device.BleSendCmdUtil; | |||||
| import com.pingwang.bluetoothlib.device.SendBleBean; | |||||
| import com.pingwang.bluetoothlib.device.SendMcuBean; | |||||
| import com.pingwang.bluetoothlib.listener.CallbackDisIm; | |||||
| import com.pingwang.bluetoothlib.listener.OnBleDeviceDataListener; | |||||
| import com.pingwang.bluetoothlib.listener.OnBleOtherDataListener; | |||||
| import com.pingwang.bluetoothlib.listener.OnBleVersionListener; | |||||
| import com.pingwang.bluetoothlib.listener.OnCallbackDis; | |||||
| import com.pingwang.bluetoothlib.listener.OnMcuParameterListener; | |||||
| import com.pingwang.bluetoothlib.utils.BleLog; | |||||
| import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||||
| import java.util.ArrayList; | |||||
| import java.util.List; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||||
| import cn.net.aicare.modulelibrary.module.sphygmomanometer.SphyBleConfig; | |||||
| /** | |||||
| * xing<br> | |||||
| * 2019/4/25<br> | |||||
| * 验证不握手不加密模块 | |||||
| */ | |||||
| public class ClearShakeHandsActivity extends BleBaseActivity implements OnCallbackDis, OnBleVersionListener, OnMcuParameterListener, | |||||
| View.OnClickListener, OnBleOtherDataListener, OnBleDeviceDataListener { | |||||
| private static String TAG = ClearShakeHandsActivity.class.getName(); | |||||
| private final int REFRESH_DATA = 3; | |||||
| private List<String> mList; | |||||
| private ArrayAdapter listAdapter; | |||||
| private Context mContext; | |||||
| private EditText et_type; | |||||
| private BleDevice mBleDevice; | |||||
| private String mAddress; | |||||
| private BleSendCmdUtil mBleSendCmdUtil; | |||||
| private int mCid = 0x01; | |||||
| private byte unit = 0; | |||||
| private boolean mPauseRefresh = false; | |||||
| private Handler mHandler = new Handler(Looper.getMainLooper()) { | |||||
| @Override | |||||
| public void handleMessage(Message msg) { | |||||
| switch (msg.what) { | |||||
| case REFRESH_DATA: | |||||
| if (listAdapter != null) | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| } | |||||
| } | |||||
| }; | |||||
| @Override | |||||
| protected void onCreate(@Nullable Bundle savedInstanceState) { | |||||
| super.onCreate(savedInstanceState); | |||||
| setContentView(R.layout.activity_clear_shake_hands); | |||||
| mContext = this; | |||||
| mAddress = getIntent().getStringExtra("mac"); | |||||
| mCid = getIntent().getIntExtra("cid", -1); | |||||
| mBleSendCmdUtil = BleSendCmdUtil.getInstance(); | |||||
| init(); | |||||
| } | |||||
| private void init() { | |||||
| mList = new ArrayList<>(); | |||||
| ListView listView = findViewById(R.id.listview); | |||||
| listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | |||||
| listView.setAdapter(listAdapter); | |||||
| findViewById(R.id.btnPause).setOnClickListener(this); | |||||
| findViewById(R.id.btn_set_unit).setOnClickListener(this); | |||||
| findViewById(R.id.btn1).setOnClickListener(this); | |||||
| findViewById(R.id.clear).setOnClickListener(this); | |||||
| findViewById(R.id.btnClearShakeHands).setOnClickListener(this); | |||||
| et_type = findViewById(R.id.et_type); | |||||
| } | |||||
| @Override | |||||
| public void onClick(View v) { | |||||
| switch (v.getId()) { | |||||
| case R.id.btn_set_unit: | |||||
| if (unit == SphyBleConfig.SPHY_UNIT_MMHG) { | |||||
| unit = SphyBleConfig.SPHY_UNIT_KPA; | |||||
| setUnit(unit); | |||||
| } else { | |||||
| unit = SphyBleConfig.SPHY_UNIT_MMHG; | |||||
| setUnit(unit); | |||||
| } | |||||
| break; | |||||
| case R.id.btnPause: | |||||
| mPauseRefresh = !mPauseRefresh; | |||||
| break; | |||||
| case R.id.btn1: | |||||
| String cmd = et_type.getText().toString().trim(); | |||||
| byte[] bytes = new byte[cmd.length() / 2]; | |||||
| for (int i = 0; i <= cmd.length() - 2; i += 2) { | |||||
| int i1 = Integer.parseInt(cmd.substring(i, i + 2), 16); | |||||
| bytes[i >> 1] = (byte) i1; | |||||
| } | |||||
| SendMcuBean sendDataBean = new SendMcuBean(); | |||||
| sendDataBean.setHex(mCid, bytes); | |||||
| mBleDevice.sendData(sendDataBean); | |||||
| mList.add(TimeUtils.getTime() + "发送(A7)->" + BleStrUtils.byte2HexStr(bytes)); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| break; | |||||
| case R.id.clear: | |||||
| if (mList != null) | |||||
| mList.clear(); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| break; | |||||
| case R.id.btnClearShakeHands: | |||||
| byte[] send = mBleSendCmdUtil.setClearShakeHands(); | |||||
| SendBleBean sendBleBean = new SendBleBean(); | |||||
| sendBleBean.setHex(send); | |||||
| mBleDevice.sendData(sendBleBean); | |||||
| mList.add(TimeUtils.getTime() + "发送(A6)->" + BleStrUtils.byte2HexStr(send)); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| break; | |||||
| } | |||||
| } | |||||
| /** | |||||
| * 设置单位(Set unit) | |||||
| * | |||||
| * @param unit | |||||
| */ | |||||
| public void setUnit(byte unit) { | |||||
| SendMcuBean sendMcuBean = new SendMcuBean(); | |||||
| byte[] data = new byte[2]; | |||||
| data[0] = SphyBleConfig.SET_UNIT; | |||||
| data[1] = unit; | |||||
| sendMcuBean.setHex(0x01, data); | |||||
| mBleDevice.sendData(sendMcuBean); | |||||
| mList.add(TimeUtils.getTime() + "发送(A7)->" + BleStrUtils.byte2HexStr(data)); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| //---------------------------------服务--------------------------------------------------- | |||||
| @Override | |||||
| public void onServiceSuccess() { | |||||
| CallbackDisIm.getInstance().addListListener(this); | |||||
| BleLog.i(TAG, "服务与界面建立连接成功"); | |||||
| //与服务建立连接 | |||||
| if (mAILinkBleManager != null) { | |||||
| mBleDevice = mAILinkBleManager.getBleDevice(mAddress); | |||||
| //设置不加密 | |||||
| mBleDevice.setA7Encryption(false); | |||||
| mBleDevice.setOnBleDeviceDataListener(ClearShakeHandsActivity.this); | |||||
| mBleDevice.setOnBleVersionListener(ClearShakeHandsActivity.this); | |||||
| mBleDevice.setOnBleOtherDataListener(ClearShakeHandsActivity.this); | |||||
| mBleDevice.sendData(new SendBleBean(mBleSendCmdUtil.getBleVersion())); | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public void onServiceErr() { | |||||
| BleLog.i(TAG, "服务与界面连接断开"); | |||||
| //与服务断开连接 | |||||
| mAILinkBleManager = null; | |||||
| } | |||||
| @Override | |||||
| public void unbindServices() { | |||||
| CallbackDisIm.getInstance().removeListener(this); | |||||
| if (mBleDevice != null) { | |||||
| mBleDevice.disconnect(); | |||||
| mBleDevice = null; | |||||
| } | |||||
| } | |||||
| //-----------------状态------------------- | |||||
| @Override | |||||
| public void onConnecting(@NonNull String mac) { | |||||
| //TODO 连接中 | |||||
| if (mAddress.equals(mac)) | |||||
| BleLog.i(TAG, "连接中"); | |||||
| } | |||||
| @Override | |||||
| public void onDisConnected(@NonNull String mac, int code) { | |||||
| //TODO 连接断开 | |||||
| if (mAddress.equals(mac)) { | |||||
| BleLog.i(TAG, "连接断开"); | |||||
| finish(); | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public void onServicesDiscovered(@NonNull String mac) { | |||||
| //TODO 连接成功(获取服务成功) | |||||
| if (mAddress.equals(mac)) | |||||
| BleLog.i(TAG, "连接成功(获取服务成功)"); | |||||
| } | |||||
| @Override | |||||
| public void bleOpen() { | |||||
| } | |||||
| @Override | |||||
| public void bleClose() { | |||||
| BleLog.i(TAG, "蓝牙未开启,可请求开启"); | |||||
| finish(); | |||||
| } | |||||
| //-----------------通知------------------- | |||||
| @Override | |||||
| public void onNotifyData(String uuid, byte[] hex, int type) { | |||||
| addData("notify(A7)->" + BleStrUtils.byte2HexStr(hex)); | |||||
| } | |||||
| @Override | |||||
| public void onNotifyDataA6(String uuid, byte[] hex) { | |||||
| addData("notify(A6)->" + BleStrUtils.byte2HexStr(hex)); | |||||
| } | |||||
| @Override | |||||
| public void onNotifyOtherData(String uuid, byte[] data) { | |||||
| addData("notify(透传)->" + BleStrUtils.byte2HexStr(data)); | |||||
| } | |||||
| @Override | |||||
| public void onBmVersion(String version) { | |||||
| addData("版本号:" + version); | |||||
| } | |||||
| private void addData(String data) { | |||||
| if (mPauseRefresh) | |||||
| return; | |||||
| mList.add(TimeUtils.getTime() + "->" + data); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| @Override | |||||
| protected void onDestroy() { | |||||
| super.onDestroy(); | |||||
| BleLog.i(TAG, "onDestroy"); | |||||
| } | |||||
| } |
| } | } | ||||
| } | } | ||||
| }); | }); | ||||
| findViewById(R.id.跳过).setOnClickListener(new View.OnClickListener() { | |||||
| @Override | |||||
| public void onClick(View v) { | |||||
| Toast.makeText(mContext, "跳过", Toast.LENGTH_SHORT).show(); | |||||
| } | |||||
| }); | |||||
| } | } | ||||
| //---------------------------------服务--------------------------------------------------- | //---------------------------------服务--------------------------------------------------- |
| import cn.net.aicare.modulelibrary.module.height.HeightDeviceData; | import cn.net.aicare.modulelibrary.module.height.HeightDeviceData; | ||||
| /** | /** | ||||
| * xing<br> | * xing<br> | ||||
| * 2019/4/25<br> | * 2019/4/25<br> | ||||
| private Handler mHandler = new Handler(Looper.getMainLooper()) { | private Handler mHandler = new Handler(Looper.getMainLooper()) { | ||||
| @Override | @Override | ||||
| public void handleMessage(Message msg) { | public void handleMessage(Message msg) { | ||||
| switch (msg.what) { | |||||
| case REFRESH_DATA: | |||||
| if (listAdapter != null) | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| if (msg.what == REFRESH_DATA) { | |||||
| if (listAdapter != null) | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } | } | ||||
| } | } | ||||
| }; | }; | ||||
| @Override | @Override | ||||
| public void onClick(View v) { | public void onClick(View v) { | ||||
| SendBleBean sendBleBean = new SendBleBean(); | SendBleBean sendBleBean = new SendBleBean(); | ||||
| switch (v.getId()){ | |||||
| case R.id.btnVersion: | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||||
| mBleDevice.sendData(sendBleBean); | |||||
| break; | |||||
| case R.id.btnBattery: | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus()); | |||||
| mBleDevice.sendData(sendBleBean); | |||||
| break; | |||||
| case R.id.btn_get_did: | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getDid()); | |||||
| mBleDevice.sendData(sendBleBean); | |||||
| break; | |||||
| case R.id.btn1: | |||||
| String cmd = et_type.getText().toString().trim(); | |||||
| SendMcuBean sendDataBean = new SendMcuBean(); | |||||
| sendDataBean.setHex(type,cmd.getBytes()); | |||||
| mBleDevice.sendData(sendDataBean); | |||||
| break; | |||||
| case R.id.clear: | |||||
| if (mList != null) | |||||
| mList.clear(); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| break; | |||||
| int id = v.getId(); | |||||
| if (id == R.id.btnVersion) { | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||||
| mBleDevice.sendData(sendBleBean); | |||||
| } else if (id == R.id.btnBattery) { | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus()); | |||||
| mBleDevice.sendData(sendBleBean); | |||||
| } else if (id == R.id.btn_get_did) { | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getDid()); | |||||
| mBleDevice.sendData(sendBleBean); | |||||
| } else if (id == R.id.btn1) { | |||||
| String cmd = et_type.getText().toString().trim(); | |||||
| SendMcuBean sendDataBean = new SendMcuBean(); | |||||
| sendDataBean.setHex(type, cmd.getBytes()); | |||||
| mBleDevice.sendData(sendDataBean); | |||||
| } else if (id == R.id.clear) { | |||||
| if (mList != null) | |||||
| mList.clear(); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | } | ||||
| } | } | ||||
| import com.pingwang.bluetoothlib.bean.SupportUnitBean; | import com.pingwang.bluetoothlib.bean.SupportUnitBean; | ||||
| import com.pingwang.bluetoothlib.device.BleDevice; | import com.pingwang.bluetoothlib.device.BleDevice; | ||||
| import com.pingwang.bluetoothlib.listener.OnCallbackBle; | import com.pingwang.bluetoothlib.listener.OnCallbackBle; | ||||
| import com.pingwang.bluetoothlib.utils.BleDensityUtil; | |||||
| import java.lang.ref.WeakReference; | import java.lang.ref.WeakReference; | ||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||
| @Override | @Override | ||||
| public void onWeightBodyFat(int workMode, int weightMode, int weight, int decimals, int unit) { | public void onWeightBodyFat(int workMode, int weightMode, int weight, int decimals, int unit) { | ||||
| addText(0, "体重体脂 模式:" + workMode + " 测量状态: " + weightMode + "\n 体重: " + weight | |||||
| + " 小数位: " + decimals + " 单位: " + getWeightUnitStr(unit)); | |||||
| String dataStr = BleDensityUtil.getInstance().holdDecimals(weight, decimals); | |||||
| addText(0, "体重体脂 模式:" + workMode + " 测量状态: " + weightMode + "\n 体重: " + dataStr + getWeightUnitStr(unit)); | |||||
| if (weightMode == 2) { | if (weightMode == 2) { | ||||
| mMHandler.removeMessages(ADC); | mMHandler.removeMessages(ADC); | ||||
| mMHandler.removeMessages(FINISH); | mMHandler.removeMessages(FINISH); | ||||
| @Override | @Override | ||||
| public void onWeight(int workMode, int weightMode, int weight, int decimals, int unit) { | public void onWeight(int workMode, int weightMode, int weight, int decimals, int unit) { | ||||
| addText(0, "体重 模式:" + workMode + " 测量状态: " + weightMode + "\n 体重: " + weight | |||||
| + " 小数位: " + decimals + " 单位: " + getWeightUnitStr(unit)); | |||||
| String dataStr = BleDensityUtil.getInstance().holdDecimals(weight, decimals); | |||||
| addText(0, "体重 模式:" + workMode + " 测量状态: " + weightMode + "\n 体重: " + dataStr + getWeightUnitStr(unit)); | |||||
| if (weightMode == 2) { | if (weightMode == 2) { | ||||
| mMHandler.removeMessages(FINISH); | mMHandler.removeMessages(FINISH); | ||||
| mMHandler.sendEmptyMessageDelayed(FINISH, 40000); | mMHandler.sendEmptyMessageDelayed(FINISH, 40000); | ||||
| @Override | @Override | ||||
| public void onTEMP(int workMode, int sign, int temp, int decimals, int unit) { | public void onTEMP(int workMode, int sign, int temp, int decimals, int unit) { | ||||
| addText(0, "温度数据 模式:" + workMode + " 温度: " + temp + " 正负: " + sign + "小数 : " + decimals + " 单位 : " + unit); | |||||
| String dataStr = BleDensityUtil.getInstance().holdDecimals(temp, decimals); | |||||
| if (sign==1) { | |||||
| dataStr = "-" + dataStr; | |||||
| } | |||||
| addText(0, "温度数据 模式:" + workMode + " 温度: " + dataStr + getTempUnitStr(unit)); | |||||
| } | } | ||||
| @Override | @Override | ||||
| public void onHeight(int workMode, int height, int decimals, int unit) { | public void onHeight(int workMode, int height, int decimals, int unit) { | ||||
| addText(0, "身高数据 模式:" + workMode + " 身高: " + height + " 小数位: " + decimals + "单位 : " + getHeightUnitStr(unit)); | |||||
| String dataStr = BleDensityUtil.getInstance().holdDecimals(height, decimals); | |||||
| addText(0, "身高数据 模式:" + workMode + " 身高: " + dataStr + getHeightUnitStr(unit)); | |||||
| // addText(0, "身高数据 模式:" + workMode + " 身高: " + height + " 小数位: " + decimals + "单位 : " + getHeightUnitStr(unit)); | |||||
| } | } | ||||
| public void onClick(View v) { | public void onClick(View v) { | ||||
| if (HeightBodyFatBleData.getInstance() != null) { | if (HeightBodyFatBleData.getInstance() != null) { | ||||
| switch (v.getId()) { | |||||
| case R.id.kg: | |||||
| selectWUnit = 0; | |||||
| addText(0, "下发体重单位 :" + getHeightUnitStr(currentHUnit)+","+getWeightUnitStr(selectWUnit)); | |||||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(currentHUnit, selectWUnit)); | |||||
| mMHandler.removeMessages(SETUNIT); | |||||
| mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000); | |||||
| break; | |||||
| case R.id.jin: | |||||
| selectWUnit = 1; | |||||
| addText(0, "下发体重单位 :" + getHeightUnitStr(currentHUnit)+","+getWeightUnitStr(selectWUnit)); | |||||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(currentHUnit, selectWUnit)); | |||||
| mMHandler.removeMessages(SETUNIT); | |||||
| mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000); | |||||
| break; | |||||
| case R.id.st_lb: | |||||
| selectWUnit = 4; | |||||
| addText(0, "下发体重单位 :" + getHeightUnitStr(currentHUnit)+","+getWeightUnitStr(selectWUnit)); | |||||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(currentHUnit, selectWUnit)); | |||||
| mMHandler.removeMessages(SETUNIT); | |||||
| mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000); | |||||
| break; | |||||
| case R.id.lb: | |||||
| selectWUnit = 6; | |||||
| addText(0, "下发体重单位 :" + getHeightUnitStr(currentHUnit)+","+getWeightUnitStr(selectWUnit)); | |||||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(currentHUnit, currentHUnit)); | |||||
| mMHandler.removeMessages(SETUNIT); | |||||
| mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000); | |||||
| break; | |||||
| case R.id.girl: | |||||
| addText(0, "下用户 女 18岁 165cm :" + selectWUnit); | |||||
| mHeightBodyFatUser = new HeightBodyFatUser(0, 18, 165, 0, 0); | |||||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUser(mHeightBodyFatUser.getSex(), mHeightBodyFatUser.getAge(), mHeightBodyFatUser.getHeight())); | |||||
| mMHandler.removeMessages(SETUSER); | |||||
| mMHandler.sendEmptyMessageDelayed(SETUSER, 3000); | |||||
| break; | |||||
| case R.id.man: | |||||
| addText(0, "下用户 男 28岁 170cm :" + selectWUnit); | |||||
| mHeightBodyFatUser = new HeightBodyFatUser(1, 28, 170, 0, 0); | |||||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUser(mHeightBodyFatUser.getSex(), mHeightBodyFatUser.getAge(), mHeightBodyFatUser.getHeight())); | |||||
| mMHandler.removeMessages(SETUSER); | |||||
| mMHandler.sendEmptyMessageDelayed(SETUSER, 3000); | |||||
| break; | |||||
| case R.id.cm: | |||||
| selectHUnit = 0; | |||||
| addText(0, "下发身高单位 :" + getHeightUnitStr(selectHUnit)+","+getWeightUnitStr(currentWUnit)); | |||||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(selectHUnit, currentWUnit)); | |||||
| mMHandler.removeMessages(SETUNIT); | |||||
| mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000); | |||||
| break; | |||||
| case R.id.inch: | |||||
| selectHUnit = 1; | |||||
| addText(0, "下发身高单位 :" + getHeightUnitStr(selectHUnit)+","+getWeightUnitStr(currentWUnit)); | |||||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(selectHUnit, currentWUnit)); | |||||
| mMHandler.removeMessages(SETUNIT); | |||||
| mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000); | |||||
| break; | |||||
| case R.id.ft_in: | |||||
| selectHUnit = 2; | |||||
| addText(0, "下发身高单位 :" + getHeightUnitStr(selectHUnit)+","+getWeightUnitStr(currentWUnit)); | |||||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(selectHUnit, currentWUnit)); | |||||
| mMHandler.removeMessages(SETUNIT); | |||||
| mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000); | |||||
| break; | |||||
| case R.id.baby: | |||||
| selectMode = 2; | |||||
| addText(0, "下发工作模式 :" + selectMode); | |||||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setWorkMode(selectMode)); | |||||
| mMHandler.removeMessages(SETMODE); | |||||
| mMHandler.sendEmptyMessageDelayed(SETMODE, 3000); | |||||
| break; | |||||
| case R.id.bodyfat: | |||||
| selectMode = 1; | |||||
| addText(0, "下发工作模式 :" + selectMode); | |||||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setWorkMode(selectMode)); | |||||
| mMHandler.removeMessages(SETMODE); | |||||
| mMHandler.sendEmptyMessageDelayed(SETMODE, 3000); | |||||
| break; | |||||
| case R.id.weight: | |||||
| selectMode = 3; | |||||
| addText(0, "下发工作模式 :" + selectMode); | |||||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setWorkMode(selectMode)); | |||||
| mMHandler.removeMessages(SETMODE); | |||||
| mMHandler.sendEmptyMessageDelayed(SETMODE, 3000); | |||||
| break; | |||||
| case R.id.height_weight: | |||||
| selectMode = 4; | |||||
| addText(0, "下发工作模式 :" + selectMode); | |||||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setWorkMode(selectMode)); | |||||
| mMHandler.removeMessages(SETMODE); | |||||
| mMHandler.sendEmptyMessageDelayed(SETMODE, 3000); | |||||
| break; | |||||
| case R.id.deviceStatus: | |||||
| addText(0, "请求设备状态 :"); | |||||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.getDeviceStatus()); | |||||
| mMHandler.removeMessages(DEVICESTATUS); | |||||
| mMHandler.sendEmptyMessageDelayed(DEVICESTATUS, 3000); | |||||
| break; | |||||
| case R.id.voice_open: | |||||
| selectVoice = 1; | |||||
| addText(0, "设置声音 :" + selectMode); | |||||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setVoiceStatus(selectVoice)); | |||||
| mMHandler.removeMessages(VOICE); | |||||
| mMHandler.sendEmptyMessageDelayed(VOICE, 3000); | |||||
| break; | |||||
| case R.id.voice_close: | |||||
| selectVoice = 2; | |||||
| addText(0, "设置声音 :" + selectMode); | |||||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setVoiceStatus(selectVoice)); | |||||
| mMHandler.removeMessages(VOICE); | |||||
| mMHandler.sendEmptyMessageDelayed(VOICE, 3000); | |||||
| break; | |||||
| case R.id.voice_status: | |||||
| addText(0, "获取声音状态"); | |||||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.getVoiceStatus()); | |||||
| mMHandler.removeMessages(VOICESTATUS); | |||||
| mMHandler.sendEmptyMessageDelayed(VOICESTATUS, 3000); | |||||
| break; | |||||
| case R.id.finish: | |||||
| addText(0, "回复测量完成"); | |||||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.replyTestFinish()); | |||||
| break; | |||||
| case R.id.btnPause: | |||||
| pauseRefresh = !pauseRefresh; | |||||
| if (pauseRefresh) { | |||||
| addText(0, "暂停刷新"); | |||||
| } else { | |||||
| addText(0, "继续刷新"); | |||||
| } | |||||
| break; | |||||
| int id = v.getId(); | |||||
| if (id == R.id.kg) { | |||||
| selectWUnit = 0; | |||||
| addText(0, "下发体重单位 :" + getHeightUnitStr(currentHUnit) + "," + getWeightUnitStr(selectWUnit)); | |||||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(currentHUnit, selectWUnit)); | |||||
| mMHandler.removeMessages(SETUNIT); | |||||
| mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000); | |||||
| } else if (id == R.id.jin) { | |||||
| selectWUnit = 1; | |||||
| addText(0, "下发体重单位 :" + getHeightUnitStr(currentHUnit) + "," + getWeightUnitStr(selectWUnit)); | |||||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(currentHUnit, selectWUnit)); | |||||
| mMHandler.removeMessages(SETUNIT); | |||||
| mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000); | |||||
| } else if (id == R.id.st_lb) { | |||||
| selectWUnit = 4; | |||||
| addText(0, "下发体重单位 :" + getHeightUnitStr(currentHUnit) + "," + getWeightUnitStr(selectWUnit)); | |||||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(currentHUnit, selectWUnit)); | |||||
| mMHandler.removeMessages(SETUNIT); | |||||
| mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000); | |||||
| } else if (id == R.id.lb) { | |||||
| selectWUnit = 6; | |||||
| addText(0, "下发体重单位 :" + getHeightUnitStr(currentHUnit) + "," + getWeightUnitStr(selectWUnit)); | |||||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(currentHUnit, currentHUnit)); | |||||
| mMHandler.removeMessages(SETUNIT); | |||||
| mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000); | |||||
| } else if (id == R.id.girl) { | |||||
| addText(0, "下用户 女 18岁 165cm :" + selectWUnit); | |||||
| mHeightBodyFatUser = new HeightBodyFatUser(0, 18, 165, 0, 0); | |||||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUser(mHeightBodyFatUser.getSex(), mHeightBodyFatUser.getAge(), mHeightBodyFatUser.getHeight())); | |||||
| mMHandler.removeMessages(SETUSER); | |||||
| mMHandler.sendEmptyMessageDelayed(SETUSER, 3000); | |||||
| } else if (id == R.id.man) { | |||||
| addText(0, "下用户 男 28岁 170cm :" + selectWUnit); | |||||
| mHeightBodyFatUser = new HeightBodyFatUser(1, 28, 170, 0, 0); | |||||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUser(mHeightBodyFatUser.getSex(), mHeightBodyFatUser.getAge(), mHeightBodyFatUser.getHeight())); | |||||
| mMHandler.removeMessages(SETUSER); | |||||
| mMHandler.sendEmptyMessageDelayed(SETUSER, 3000); | |||||
| } else if (id == R.id.cm) { | |||||
| selectHUnit = 0; | |||||
| addText(0, "下发身高单位 :" + getHeightUnitStr(selectHUnit) + "," + getWeightUnitStr(currentWUnit)); | |||||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(selectHUnit, currentWUnit)); | |||||
| mMHandler.removeMessages(SETUNIT); | |||||
| mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000); | |||||
| } else if (id == R.id.inch) { | |||||
| selectHUnit = 1; | |||||
| addText(0, "下发身高单位 :" + getHeightUnitStr(selectHUnit) + "," + getWeightUnitStr(currentWUnit)); | |||||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(selectHUnit, currentWUnit)); | |||||
| mMHandler.removeMessages(SETUNIT); | |||||
| mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000); | |||||
| } else if (id == R.id.ft_in) { | |||||
| selectHUnit = 2; | |||||
| addText(0, "下发身高单位 :" + getHeightUnitStr(selectHUnit) + "," + getWeightUnitStr(currentWUnit)); | |||||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(selectHUnit, currentWUnit)); | |||||
| mMHandler.removeMessages(SETUNIT); | |||||
| mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000); | |||||
| } else if (id == R.id.baby) { | |||||
| selectMode = 2; | |||||
| addText(0, "下发工作模式 :" + selectMode); | |||||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setWorkMode(selectMode)); | |||||
| mMHandler.removeMessages(SETMODE); | |||||
| mMHandler.sendEmptyMessageDelayed(SETMODE, 3000); | |||||
| } else if (id == R.id.bodyfat) { | |||||
| selectMode = 1; | |||||
| addText(0, "下发工作模式 :" + selectMode); | |||||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setWorkMode(selectMode)); | |||||
| mMHandler.removeMessages(SETMODE); | |||||
| mMHandler.sendEmptyMessageDelayed(SETMODE, 3000); | |||||
| } else if (id == R.id.weight) { | |||||
| selectMode = 3; | |||||
| addText(0, "下发工作模式 :" + selectMode); | |||||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setWorkMode(selectMode)); | |||||
| mMHandler.removeMessages(SETMODE); | |||||
| mMHandler.sendEmptyMessageDelayed(SETMODE, 3000); | |||||
| } else if (id == R.id.height_weight) { | |||||
| selectMode = 4; | |||||
| addText(0, "下发工作模式 :" + selectMode); | |||||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setWorkMode(selectMode)); | |||||
| mMHandler.removeMessages(SETMODE); | |||||
| mMHandler.sendEmptyMessageDelayed(SETMODE, 3000); | |||||
| } else if (id == R.id.deviceStatus) { | |||||
| addText(0, "请求设备状态 :"); | |||||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.getDeviceStatus()); | |||||
| mMHandler.removeMessages(DEVICESTATUS); | |||||
| mMHandler.sendEmptyMessageDelayed(DEVICESTATUS, 3000); | |||||
| } else if (id == R.id.voice_open) { | |||||
| selectVoice = 1; | |||||
| addText(0, "设置声音 :" + selectMode); | |||||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setVoiceStatus(selectVoice)); | |||||
| mMHandler.removeMessages(VOICE); | |||||
| mMHandler.sendEmptyMessageDelayed(VOICE, 3000); | |||||
| } else if (id == R.id.voice_close) { | |||||
| selectVoice = 2; | |||||
| addText(0, "设置声音 :" + selectMode); | |||||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setVoiceStatus(selectVoice)); | |||||
| mMHandler.removeMessages(VOICE); | |||||
| mMHandler.sendEmptyMessageDelayed(VOICE, 3000); | |||||
| } else if (id == R.id.voice_status) { | |||||
| addText(0, "获取声音状态"); | |||||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.getVoiceStatus()); | |||||
| mMHandler.removeMessages(VOICESTATUS); | |||||
| mMHandler.sendEmptyMessageDelayed(VOICESTATUS, 3000); | |||||
| } else if (id == R.id.finish) { | |||||
| addText(0, "回复测量完成"); | |||||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.replyTestFinish()); | |||||
| } else if (id == R.id.btnPause) { | |||||
| pauseRefresh = !pauseRefresh; | |||||
| if (pauseRefresh) { | |||||
| addText(0, "暂停刷新"); | |||||
| } else { | |||||
| addText(0, "继续刷新"); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| return ""; | return ""; | ||||
| } | } | ||||
| private String getTempUnitStr(int unit) { | |||||
| switch (unit) { | |||||
| case 0: | |||||
| return "℃"; | |||||
| case 1: | |||||
| return "℉"; | |||||
| } | |||||
| return ""; | |||||
| } | |||||
| private boolean pauseRefresh = false; | private boolean pauseRefresh = false; |
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.HintDataDialogFragment; | import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.HintDataDialogFragment; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.LoadingIosDialogFragment; | import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.LoadingIosDialogFragment; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.home.HomeDataManager; | import aicare.net.cn.sdk.ailinksdkdemoandroid.home.HomeDataManager; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.home.MainActivity; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.toothbrush.ToothBrushWifiBleActivity; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.CheckPermissionUtils; | import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.CheckPermissionUtils; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.MyBleStrUtils; | import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.MyBleStrUtils; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.view.MyItemDecoration; | import aicare.net.cn.sdk.ailinksdkdemoandroid.view.MyItemDecoration; | ||||
| private final int BIND_SERVER_ERR = 2; | private final int BIND_SERVER_ERR = 2; | ||||
| private final int REFRESH_DATA = 3; | private final int REFRESH_DATA = 3; | ||||
| private EditText et_cid; | private EditText et_cid; | ||||
| private EditText et_filter_name; | |||||
| private List<BleValueBean> mBleValueList; | private List<BleValueBean> mBleValueList; | ||||
| private StringAdapter listAdapter; | private StringAdapter listAdapter; | ||||
| } | } | ||||
| init(); | init(); | ||||
| initData(); | initData(); | ||||
| // 如果是蓝牙牙刷,就弹个框提醒 | |||||
| if (mCid == BleDeviceConfig.TOOTHBRUSH_TEST) { | if (mCid == BleDeviceConfig.TOOTHBRUSH_TEST) { | ||||
| // 如果是蓝牙牙刷,就弹个框提醒 | |||||
| new AlertDialog.Builder(mContext).setMessage("启动牙刷,工作10秒钟,然后关闭牙刷(让牙刷处于广播状态),然后点击搜索,选中列表中的牙刷,开始测试") | new AlertDialog.Builder(mContext).setMessage("启动牙刷,工作10秒钟,然后关闭牙刷(让牙刷处于广播状态),然后点击搜索,选中列表中的牙刷,开始测试") | ||||
| .setPositiveButton("确认", null) | .setPositiveButton("确认", null) | ||||
| .show(); | .show(); | ||||
| Button btn = findViewById(R.id.btn); | Button btn = findViewById(R.id.btn); | ||||
| Button btn1 = findViewById(R.id.btn1); | Button btn1 = findViewById(R.id.btn1); | ||||
| Button clear = findViewById(R.id.clear); | Button clear = findViewById(R.id.clear); | ||||
| EditText et_filter_name = findViewById(R.id.et_filter_name); | |||||
| et_filter_name = findViewById(R.id.et_filter_name); | |||||
| EditText et_filter_mac = findViewById(R.id.et_filter_mac); | EditText et_filter_mac = findViewById(R.id.et_filter_mac); | ||||
| EditText et_cid = findViewById(R.id.et_cid); | |||||
| et_cid = findViewById(R.id.et_cid); | |||||
| if (mScanCid > 0) { | if (mScanCid > 0) { | ||||
| et_cid.setText(MyBleStrUtils.getHexString(mScanCid)); | et_cid.setText(MyBleStrUtils.getHexString(mScanCid)); | ||||
| } else { | } else { | ||||
| List<BleScanAddAilinkBean> list = new ArrayList<>(); | List<BleScanAddAilinkBean> list = new ArrayList<>(); | ||||
| list.add(new BleScanAddAilinkBean(0x37, 0x03, 0x01, SkateboardBleConfig.UUID_BROADCAST)); | list.add(new BleScanAddAilinkBean(0x37, 0x03, 0x01, SkateboardBleConfig.UUID_BROADCAST)); | ||||
| mAILinkBleManager.startScan(scanOut, list, BleConfig.UUID_SERVER_AILINK, SkateboardBleConfig.UUID_BROADCAST); | mAILinkBleManager.startScan(scanOut, list, BleConfig.UUID_SERVER_AILINK, SkateboardBleConfig.UUID_BROADCAST); | ||||
| } else if (mType == BleDeviceConfig.BLE_SMART_CYCLING_TABLE) { | |||||
| mAILinkBleManager.startScan(scanOut); | |||||
| } else { | } else { | ||||
| //0000FEE7=手表 | |||||
| // 0000FEE7=手表 | |||||
| mAILinkBleManager.startScan(scanOut, BleConfig.UUID_BROADCAST_AILINK, BleConfig.UUID_SERVER_BROADCAST_AILINK, UUID.fromString("0000FEE7-0000-1000-8000-00805F9B34FB"), SkateboardBleConfig.UUID_BROADCAST); | mAILinkBleManager.startScan(scanOut, BleConfig.UUID_BROADCAST_AILINK, BleConfig.UUID_SERVER_BROADCAST_AILINK, UUID.fromString("0000FEE7-0000-1000-8000-00805F9B34FB"), SkateboardBleConfig.UUID_BROADCAST); | ||||
| // BleScanUtil.scanLeDevice(AILinkBleManager.getInstance(), scanOut); | |||||
| // BleScanUtil.scanLeDevice(AILinkBleManager.getInstance(), scanOut,BleConfig.UUID_BROADCAST_AILINK, BleConfig.UUID_SERVER_BROADCAST_AILINK); | |||||
| } | } | ||||
| mBleValueList.clear(); | mBleValueList.clear(); | ||||
| listAdapter.notifyDataSetChanged(); | listAdapter.notifyDataSetChanged(); | ||||
| mPid = bleValueBean.getPid(); | mPid = bleValueBean.getPid(); | ||||
| mBleName = bleValueBean.getName(); | mBleName = bleValueBean.getName(); | ||||
| // if (mType == BleDeviceConfig.CLEAR_SHAKE_HANDS || mType == BleDeviceConfig.BLE_SEND_SPEED_TEST) { | |||||
| if (mType == BleDeviceConfig.CLEAR_SHAKE_HANDS) { | if (mType == BleDeviceConfig.CLEAR_SHAKE_HANDS) { | ||||
| //验证不握手,不加密的界面使用 | //验证不握手,不加密的界面使用 | ||||
| //设置不握手 | //设置不握手 | ||||
| mAILinkBleManager.connectDevice(new BleValueBean(mac, mCid, mVid, mPid)); | mAILinkBleManager.connectDevice(new BleValueBean(mac, mCid, mVid, mPid)); | ||||
| showLoading(); | showLoading(); | ||||
| } | } | ||||
| } else if (BleDeviceConfig.TOOTHBRUSH_WIFI_BLE == mType) { | |||||
| Intent intent = new Intent(); | |||||
| intent.setClass(ShowBleActivity.this, ToothBrushWifiBleActivity.class); | |||||
| intent.putExtra("type", mType); | |||||
| intent.putExtra("cid", mCid); | |||||
| intent.putExtra("mac", mac); | |||||
| startActivity(intent); | |||||
| } else { | } else { | ||||
| if (mCid == BleDeviceConfig.BLE_BOOLD_OXYGEN && mVid == 0x0012) { | if (mCid == BleDeviceConfig.BLE_BOOLD_OXYGEN && mVid == 0x0012) { | ||||
| //vid=12的不用握手校验,不加密 | //vid=12的不用握手校验,不加密 | ||||
| if (mAILinkBleManager != null) { | if (mAILinkBleManager != null) { | ||||
| mAILinkBleManager.setOnCallbackBle(ShowBleActivity.this); | mAILinkBleManager.setOnCallbackBle(ShowBleActivity.this); | ||||
| mAILinkBleManager.setOnScanFilterListener(ShowBleActivity.this); | mAILinkBleManager.setOnScanFilterListener(ShowBleActivity.this); | ||||
| mAILinkBleManager.initForegroundService(1, R.mipmap.ic_launcher, "前台服务", MainActivity.class); | |||||
| mAILinkBleManager.startForegroundService();//启动前台服务 | |||||
| // mAILinkBleManager.initForegroundService(1, R.mipmap.ic_launcher, "前台服务", MainActivity.class); | |||||
| // mAILinkBleManager.startForegroundService();//启动前台服务 | |||||
| mHandler.sendEmptyMessage(BIND_SERVER_OK); | mHandler.sendEmptyMessage(BIND_SERVER_OK); | ||||
| } | } | ||||
| } | } |
| package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||||
| import android.content.Context; | |||||
| import android.os.Bundle; | |||||
| import android.os.Handler; | |||||
| import android.os.Looper; | |||||
| import android.os.Message; | |||||
| import android.view.View; | |||||
| import android.widget.ArrayAdapter; | |||||
| import android.widget.Button; | |||||
| import android.widget.ListView; | |||||
| import android.widget.Toast; | |||||
| import androidx.annotation.NonNull; | |||||
| import androidx.annotation.Nullable; | |||||
| import com.pingwang.bluetoothlib.device.BleDevice; | |||||
| import com.pingwang.bluetoothlib.device.BleSendCmdUtil; | |||||
| import com.pingwang.bluetoothlib.device.SendBleBean; | |||||
| import com.pingwang.bluetoothlib.listener.OnBleVersionListener; | |||||
| import com.pingwang.bluetoothlib.listener.OnCallbackDis; | |||||
| import com.pingwang.bluetoothlib.listener.OnScanFilterListener; | |||||
| import com.pingwang.bluetoothlib.utils.BleLog; | |||||
| import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||||
| import java.util.ArrayList; | |||||
| import java.util.List; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||||
| import butterknife.BindView; | |||||
| import butterknife.ButterKnife; | |||||
| import cn.net.aicare.modulelibrary.module.SmartMask.SmartMaskBleConfig; | |||||
| import cn.net.aicare.modulelibrary.module.SmartMask.SmartMaskDeviceData; | |||||
| /** | |||||
| * xing<br> | |||||
| * 2020/09/15<br> | |||||
| * 智能口罩 | |||||
| */ | |||||
| public class SmartMaskActivity extends BleBaseActivity implements OnCallbackDis, SmartMaskDeviceData.onNotifyData, OnBleVersionListener, OnScanFilterListener, View.OnClickListener { | |||||
| private static String TAG = SmartMaskActivity.class.getName(); | |||||
| private final int REFRESH_DATA = 3; | |||||
| @BindView(R.id.clear) | |||||
| Button mClear; | |||||
| @BindView(R.id.set_status) | |||||
| Button mSetStatus; | |||||
| @BindView(R.id.set_filter) | |||||
| Button mSetFilter; | |||||
| @BindView(R.id.set_fan) | |||||
| Button mSetFan; | |||||
| @BindView(R.id.listview) | |||||
| ListView mListview; | |||||
| @BindView(R.id.get_version) | |||||
| Button mGetVersion; | |||||
| @BindView(R.id.get_AIQ) | |||||
| Button mGetAIQ; | |||||
| @BindView(R.id.close_power) | |||||
| Button closePower; | |||||
| @BindView(R.id.set_mode) | |||||
| Button setMode; | |||||
| @BindView(R.id.set_payload) | |||||
| Button setPayload; | |||||
| private List<String> mList; | |||||
| private ArrayAdapter listAdapter; | |||||
| private Context mContext; | |||||
| private SmartMaskDeviceData mDevice; | |||||
| private String mAddress = ""; | |||||
| private BleSendCmdUtil mBleSendCmdUtil; | |||||
| private int type = SmartMaskBleConfig.SMART_MASK; | |||||
| private int mFanStatus = 0; | |||||
| private boolean showPayload; | |||||
| private Handler mHandler = new Handler(Looper.getMainLooper()) { | |||||
| @Override | |||||
| public void handleMessage(Message msg) { | |||||
| switch (msg.what) { | |||||
| case REFRESH_DATA: | |||||
| if (listAdapter != null) | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| } | |||||
| } | |||||
| }; | |||||
| @Override | |||||
| protected void onCreate(@Nullable Bundle savedInstanceState) { | |||||
| super.onCreate(savedInstanceState); | |||||
| setContentView(R.layout.activity_smart_mask); | |||||
| ButterKnife.bind(this); | |||||
| mContext = this; | |||||
| mAddress = getIntent().getStringExtra("mac"); | |||||
| type = getIntent().getIntExtra("type", -1); | |||||
| mBleSendCmdUtil = BleSendCmdUtil.getInstance(); | |||||
| init(); | |||||
| } | |||||
| private void init() { | |||||
| mList = new ArrayList<>(); | |||||
| listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | |||||
| mListview.setAdapter(listAdapter); | |||||
| mClear.setOnClickListener(this); | |||||
| mSetStatus.setOnClickListener(this); | |||||
| mSetFilter.setOnClickListener(this); | |||||
| mSetFan.setOnClickListener(this); | |||||
| mGetVersion.setOnClickListener(this); | |||||
| setPayload.setOnClickListener(this); | |||||
| setMode.setOnClickListener(this); | |||||
| closePower.setOnClickListener(this); | |||||
| mGetAIQ.setOnClickListener(this); | |||||
| } | |||||
| @Override | |||||
| public void onClick(View v) { | |||||
| switch (v.getId()) { | |||||
| case R.id.clear: | |||||
| if (mList != null) | |||||
| mList.clear(); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| break; | |||||
| case R.id.get_version: | |||||
| if (mDevice != null) { | |||||
| SendBleBean sendBleBean = new SendBleBean(); | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||||
| mDevice.sendData(sendBleBean); | |||||
| } | |||||
| break; | |||||
| case R.id.set_status: | |||||
| if (mDevice != null) { | |||||
| mDevice.setStatus(); | |||||
| } | |||||
| break; | |||||
| case R.id.set_filter: | |||||
| if (mDevice != null) { | |||||
| mDevice.setReplaceFilter(); | |||||
| } | |||||
| break; | |||||
| case R.id.set_fan: | |||||
| if (mDevice != null) { | |||||
| if (mFanStatus < 2) { | |||||
| mFanStatus++; | |||||
| } else if (mFanStatus == 2) { | |||||
| mFanStatus = 0; | |||||
| } | |||||
| mDevice.setFanStatus(mFanStatus); | |||||
| } | |||||
| break; | |||||
| case R.id.get_AIQ: | |||||
| if (mDevice != null) mDevice.getIAQData(); | |||||
| break; | |||||
| case R.id.set_mode: | |||||
| if (mDevice != null) mDevice.setTestMode(); | |||||
| break; | |||||
| case R.id.close_power: | |||||
| if (mDevice != null) mDevice.closePower(); | |||||
| break; | |||||
| case R.id.set_payload: | |||||
| showPayload = true; | |||||
| break; | |||||
| } | |||||
| } | |||||
| //---------------------------------服务--------------------------------------------------- | |||||
| @Override | |||||
| public void onServiceSuccess() { | |||||
| BleLog.i(TAG, "服务与界面建立连接成功"); | |||||
| //与服务建立连接 | |||||
| if (mAILinkBleManager != null) { | |||||
| BleDevice bleDevice = mAILinkBleManager.getBleDevice(mAddress); | |||||
| if (bleDevice != null) { | |||||
| mDevice = SmartMaskDeviceData.getInstance(bleDevice); | |||||
| mDevice.setOnNotifyData(this); | |||||
| mDevice.setOnBleVersionListener(this); | |||||
| } | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public void onServiceErr() { | |||||
| BleLog.i(TAG, "服务与界面连接断开"); | |||||
| //与服务断开连接 | |||||
| mAILinkBleManager = null; | |||||
| } | |||||
| @Override | |||||
| public void unbindServices() { | |||||
| if (mDevice != null) { | |||||
| mDevice.disconnect(); | |||||
| mDevice.clear(); | |||||
| mDevice = null; | |||||
| } | |||||
| } | |||||
| //-----------------通知------------------- | |||||
| @Override | |||||
| public void onData(byte[] hex, int type) { | |||||
| String data = ""; | |||||
| if (hex != null) | |||||
| data = BleStrUtils.byte2HexStr(hex); | |||||
| if (type == 100) { | |||||
| mList.add(TimeUtils.getTime() + "send->" + data); | |||||
| } else { | |||||
| mList.add(TimeUtils.getTime() + "notify->" + data); | |||||
| } | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| @Override | |||||
| public void onConnecting(@NonNull String mac) { | |||||
| //TODO 连接中 | |||||
| BleLog.i(TAG, "连接中"); | |||||
| } | |||||
| @Override | |||||
| public void onDisConnected(@NonNull String mac, int code) { | |||||
| //TODO 连接断开 | |||||
| BleLog.i(TAG, "连接断开"); | |||||
| finish(); | |||||
| Toast.makeText(mContext, "连接断开", Toast.LENGTH_SHORT).show(); | |||||
| } | |||||
| @Override | |||||
| public void onServicesDiscovered(@NonNull String mac) { | |||||
| //TODO 连接成功(获取服务成功) | |||||
| BleLog.i(TAG, "连接成功(获取服务成功)"); | |||||
| } | |||||
| @Override | |||||
| public void bleOpen() { | |||||
| } | |||||
| @Override | |||||
| public void bleClose() { | |||||
| BleLog.i(TAG, "蓝牙未开启,可请求开启"); | |||||
| } | |||||
| //-----------------通知------------------- | |||||
| @Override | |||||
| public void onPayloadData(byte[] data) { | |||||
| if (showPayload) { | |||||
| mList.add(BleStrUtils.byte2HexStr(data)); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public void onSetStatus(int type,int status) { | |||||
| String data = ""; | |||||
| if (type==SmartMaskBleConfig.GET_TEST_MODE){ | |||||
| data="进入测试模式:"; | |||||
| }else if (type==SmartMaskBleConfig.GET_POWER){ | |||||
| data="关机:"; | |||||
| } | |||||
| switch (status) { | |||||
| case 0: | |||||
| data += "成功"; | |||||
| break; | |||||
| case 1: | |||||
| data += "失败"; | |||||
| break; | |||||
| } | |||||
| mList.add(TimeUtils.getTime() + data); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| @Override | |||||
| public void onStatus(int airIndex, int fanStatus, int power, int powerStatus, int batteryRemaining, int breathRate, int breathState, int filterDuration) { | |||||
| String data = "口罩状态:"; | |||||
| String fanStatusStr = "风扇状态:"; | |||||
| switch (fanStatus) { | |||||
| case 0: | |||||
| fanStatusStr += "关闭"; | |||||
| break; | |||||
| case 1: | |||||
| fanStatusStr += "1 档"; | |||||
| break; | |||||
| case 2: | |||||
| fanStatusStr += "2 档"; | |||||
| break; | |||||
| } | |||||
| String powerStatusStr = "电池状态:"; | |||||
| switch (powerStatus) { | |||||
| case 0: | |||||
| powerStatusStr += "充电"; | |||||
| break; | |||||
| case 1: | |||||
| powerStatusStr += "非充电"; | |||||
| break; | |||||
| } | |||||
| String breathStateStr = "呼吸状态:"; | |||||
| switch (breathState) { | |||||
| case 1: | |||||
| breathStateStr += "呼气"; | |||||
| break; | |||||
| case 2: | |||||
| breathStateStr += "吸气"; | |||||
| break; | |||||
| } | |||||
| data += "空气指数:" + airIndex + ";" + fanStatusStr + "\n"; | |||||
| data += "电量:" + power + "%;" + powerStatusStr + "\n"; | |||||
| data += "呼吸频率:" + breathRate + "次/min;" + breathStateStr + "\n"; | |||||
| data += "电池续航:" + batteryRemaining + "min;滤网的总工作时长:" + filterDuration; | |||||
| mList.add(TimeUtils.getTime() + data); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| @Override | |||||
| public void onFilter(int status) { | |||||
| String data = "更换滤网:"; | |||||
| switch (status) { | |||||
| case 0: | |||||
| data += "成功"; | |||||
| break; | |||||
| case 1: | |||||
| data += "失败"; | |||||
| break; | |||||
| } | |||||
| mList.add(TimeUtils.getTime() + data); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| @Override | |||||
| public void onFan(int status) { | |||||
| String data = ""; | |||||
| switch (status) { | |||||
| case 0: | |||||
| data = "关闭风扇"; | |||||
| break; | |||||
| case 1: | |||||
| data = "1 档风扇"; | |||||
| break; | |||||
| case 2: | |||||
| data = "2 档风扇"; | |||||
| break; | |||||
| } | |||||
| mList.add(TimeUtils.getTime() + data); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| @Override | |||||
| public void onIAQData(int status, int eCo2, int TvOc, int hcho) { | |||||
| String data = ""; | |||||
| switch (status) { | |||||
| case 0: | |||||
| data = "OK"; | |||||
| break; | |||||
| case 1: | |||||
| data = "Heating"; | |||||
| break; | |||||
| case 2: | |||||
| data = "Error"; | |||||
| break; | |||||
| } | |||||
| mList.add(TimeUtils.getTime() + data + "\n ECO2:" + eCo2 + "\n TVOC:" + TvOc + "\n HCHO:" + hcho); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| @Override | |||||
| public void onBmVersion(String version) { | |||||
| mList.add(TimeUtils.getTime() + "版本号:" + version); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| @Override | |||||
| protected void onDestroy() { | |||||
| super.onDestroy(); | |||||
| BleLog.i(TAG, "onDestroy"); | |||||
| } | |||||
| } |
| private Handler mHandler = new Handler(Looper.getMainLooper()) { | private Handler mHandler = new Handler(Looper.getMainLooper()) { | ||||
| @Override | @Override | ||||
| public void handleMessage(Message msg) { | public void handleMessage(Message msg) { | ||||
| switch (msg.what) { | |||||
| case REFRESH_DATA: | |||||
| if (listAdapter != null) | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| if (msg.what == REFRESH_DATA) { | |||||
| if (listAdapter != null) | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } | } | ||||
| } | } | ||||
| }; | }; | ||||
| @Override | @Override | ||||
| public void onClick(View v) { | public void onClick(View v) { | ||||
| SendBleBean sendBleBean = new SendBleBean(); | SendBleBean sendBleBean = new SendBleBean(); | ||||
| switch (v.getId()) { | |||||
| case R.id.btnVersion: | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||||
| mBleDevice.sendData(sendBleBean); | |||||
| break; | |||||
| case R.id.btnBattery: | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus()); | |||||
| mBleDevice.sendData(sendBleBean); | |||||
| break; | |||||
| case R.id.btn_get_did: | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getDid()); | |||||
| mBleDevice.sendData(sendBleBean); | |||||
| break; | |||||
| case R.id.btn_voice: | |||||
| if (mVoiceStatus == 0) { | |||||
| mVoiceStatus = 1; | |||||
| }else { | |||||
| mVoiceStatus=0; | |||||
| } | |||||
| mBleDevice.setSphyVoice(mVoiceStatus); | |||||
| break; | |||||
| int id = v.getId(); | |||||
| if (id == R.id.btnVersion) { | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||||
| mBleDevice.sendData(sendBleBean); | |||||
| } else if (id == R.id.btnBattery) { | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus()); | |||||
| mBleDevice.sendData(sendBleBean); | |||||
| } else if (id == R.id.btn_get_did) { | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getDid()); | |||||
| mBleDevice.sendData(sendBleBean); | |||||
| } else if (id == R.id.btn_voice) { | |||||
| if (mVoiceStatus == 0) { | |||||
| mVoiceStatus = 1; | |||||
| } else { | |||||
| mVoiceStatus = 0; | |||||
| case R.id.clear: | |||||
| if (mList != null) | |||||
| mList.clear(); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| break; | |||||
| } | |||||
| mBleDevice.setSphyVoice(mVoiceStatus); | |||||
| } else if (id == R.id.clear) { | |||||
| if (mList != null) | |||||
| mList.clear(); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | } | ||||
| } | } | ||||
| private Handler mHandler = new Handler(Looper.getMainLooper()) { | private Handler mHandler = new Handler(Looper.getMainLooper()) { | ||||
| @Override | @Override | ||||
| public void handleMessage(Message msg) { | public void handleMessage(Message msg) { | ||||
| switch (msg.what) { | |||||
| case REFRESH_DATA: | |||||
| if (listAdapter != null) | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| if (msg.what == REFRESH_DATA) { | |||||
| if (listAdapter != null) | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } | } | ||||
| } | } | ||||
| }; | }; | ||||
| @Override | @Override | ||||
| public void onClick(View v) { | public void onClick(View v) { | ||||
| SendBleBean sendBleBean = new SendBleBean(); | SendBleBean sendBleBean = new SendBleBean(); | ||||
| switch (v.getId()) { | |||||
| case R.id.btnVersion: | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||||
| mBleDevice.sendData(sendBleBean); | |||||
| break; | |||||
| case R.id.btnBattery: | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus()); | |||||
| mBleDevice.sendData(sendBleBean); | |||||
| break; | |||||
| case R.id.btn_get_did: | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getDid()); | |||||
| mBleDevice.sendData(sendBleBean); | |||||
| break; | |||||
| case R.id.btn1: | |||||
| String cmd = et_type.getText().toString().trim(); | |||||
| SendMcuBean sendDataBean = new SendMcuBean(); | |||||
| sendDataBean.setHex(type, cmd.getBytes()); | |||||
| mBleDevice.sendData(sendDataBean); | |||||
| break; | |||||
| case R.id.clear: | |||||
| if (mList != null) | |||||
| mList.clear(); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| break; | |||||
| case R.id.btn_get_history: | |||||
| // 读取历史记录 | |||||
| mBleDevice.getHistoryNew(0); | |||||
| break; | |||||
| case R.id.btn_get_mode: | |||||
| // 获取设备测温模式 | |||||
| mBleDevice.getMode(); | |||||
| break; | |||||
| case R.id.btn_get_temp: | |||||
| // 获取高温报警值 | |||||
| mBleDevice.getTemp(); | |||||
| break; | |||||
| case R.id.btn_set_mode: | |||||
| // 设置设备测温模式 | |||||
| if (rb_single.isChecked()) { | |||||
| mBleDevice.setMode(0); | |||||
| int id = v.getId(); | |||||
| if (id == R.id.btnVersion) { | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||||
| mBleDevice.sendData(sendBleBean); | |||||
| } else if (id == R.id.btnBattery) { | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus()); | |||||
| mBleDevice.sendData(sendBleBean); | |||||
| } else if (id == R.id.btn_get_did) { | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getDid()); | |||||
| mBleDevice.sendData(sendBleBean); | |||||
| } else if (id == R.id.btn1) { | |||||
| String cmd = et_type.getText().toString().trim(); | |||||
| SendMcuBean sendDataBean = new SendMcuBean(); | |||||
| sendDataBean.setHex(type, cmd.getBytes()); | |||||
| mBleDevice.sendData(sendDataBean); | |||||
| } else if (id == R.id.clear) { | |||||
| if (mList != null) | |||||
| mList.clear(); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } else if (id == R.id.btn_get_history) {// 读取历史记录 | |||||
| mBleDevice.getHistoryNew(0); | |||||
| } else if (id == R.id.btn_get_mode) {// 获取设备测温模式 | |||||
| mBleDevice.getMode(); | |||||
| } else if (id == R.id.btn_get_temp) {// 获取高温报警值 | |||||
| mBleDevice.getTemp(); | |||||
| } else if (id == R.id.btn_set_mode) {// 设置设备测温模式 | |||||
| if (rb_single.isChecked()) { | |||||
| mBleDevice.setMode(0); | |||||
| } else { | |||||
| mBleDevice.setMode(1); | |||||
| } | |||||
| } else if (id == R.id.btn_set_temp) {// 设置高温报警值 | |||||
| String tempStr = et_temp.getText().toString(); | |||||
| if (!tempStr.isEmpty()) { | |||||
| if (rb_c.isChecked()) { | |||||
| mBleDevice.setTemp(tempStr, 0); | |||||
| } else { | } else { | ||||
| mBleDevice.setMode(1); | |||||
| } | |||||
| break; | |||||
| case R.id.btn_set_temp: | |||||
| // 设置高温报警值 | |||||
| String tempStr = et_temp.getText().toString(); | |||||
| if (!tempStr.isEmpty()) { | |||||
| if (rb_c.isChecked()) { | |||||
| mBleDevice.setTemp(tempStr, 0); | |||||
| } else { | |||||
| mBleDevice.setTemp(tempStr, 1); | |||||
| } | |||||
| mBleDevice.setTemp(tempStr, 1); | |||||
| } | } | ||||
| break; | |||||
| case R.id.btn_del_history: | |||||
| mBleDevice.getHistoryNew(3); | |||||
| break; | |||||
| case R.id.btnSetTime: | |||||
| mBleDevice.setUnixStampNew(System.currentTimeMillis()); | |||||
| break; | |||||
| } | |||||
| } else if (id == R.id.btn_del_history) { | |||||
| mBleDevice.getHistoryNew(3); | |||||
| } else if (id == R.id.btnSetTime) { | |||||
| mBleDevice.setUnixStampNew(System.currentTimeMillis()); | |||||
| } | } | ||||
| } | } | ||||
| import cn.net.aicare.modulelibrary.module.foreheadgun.TempGunDeviceData; | import cn.net.aicare.modulelibrary.module.foreheadgun.TempGunDeviceData; | ||||
| /** | /** | ||||
| * xing<br> | * xing<br> | ||||
| * 2019/4/25<br> | * 2019/4/25<br> | ||||
| private Handler mHandler = new Handler(Looper.getMainLooper()) { | private Handler mHandler = new Handler(Looper.getMainLooper()) { | ||||
| @Override | @Override | ||||
| public void handleMessage(Message msg) { | public void handleMessage(Message msg) { | ||||
| switch (msg.what) { | |||||
| case REFRESH_DATA: | |||||
| if (listAdapter != null) | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| if (msg.what == REFRESH_DATA) { | |||||
| if (listAdapter != null) | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } | } | ||||
| } | } | ||||
| }; | }; | ||||
| @Override | @Override | ||||
| public void onClick(View v) { | public void onClick(View v) { | ||||
| SendBleBean sendBleBean = new SendBleBean(); | SendBleBean sendBleBean = new SendBleBean(); | ||||
| switch (v.getId()){ | |||||
| case R.id.btnVersion: | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||||
| mBleDevice.sendData(sendBleBean); | |||||
| break; | |||||
| case R.id.btnBattery: | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus()); | |||||
| mBleDevice.sendData(sendBleBean); | |||||
| break; | |||||
| case R.id.btn_get_did: | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getDid()); | |||||
| mBleDevice.sendData(sendBleBean); | |||||
| break; | |||||
| case R.id.btn1: | |||||
| String cmd = et_type.getText().toString().trim(); | |||||
| SendMcuBean sendDataBean = new SendMcuBean(); | |||||
| sendDataBean.setHex(type,cmd.getBytes()); | |||||
| mBleDevice.sendData(sendDataBean); | |||||
| break; | |||||
| case R.id.clear: | |||||
| if (mList != null) | |||||
| mList.clear(); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| break; | |||||
| int id = v.getId(); | |||||
| if (id == R.id.btnVersion) { | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||||
| mBleDevice.sendData(sendBleBean); | |||||
| } else if (id == R.id.btnBattery) { | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus()); | |||||
| mBleDevice.sendData(sendBleBean); | |||||
| } else if (id == R.id.btn_get_did) { | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getDid()); | |||||
| mBleDevice.sendData(sendBleBean); | |||||
| } else if (id == R.id.btn1) { | |||||
| String cmd = et_type.getText().toString().trim(); | |||||
| SendMcuBean sendDataBean = new SendMcuBean(); | |||||
| sendDataBean.setHex(type, cmd.getBytes()); | |||||
| mBleDevice.sendData(sendDataBean); | |||||
| } else if (id == R.id.clear) { | |||||
| if (mList != null) | |||||
| mList.clear(); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | } | ||||
| } | } | ||||
| public void onClick(View v) { | public void onClick(View v) { | ||||
| if (TempHumidityBleUtils.getInstance() != null) { | if (TempHumidityBleUtils.getInstance() != null) { | ||||
| switch (v.getId()) { | |||||
| case R.id.btn_slow: | |||||
| if (TempHumidityBleUtils.getInstance() != null) { | |||||
| TempHumidityBleUtils.getInstance().sendSlowData(); | |||||
| logList.add(0, "慢速保存数据"); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } | |||||
| break; | |||||
| case R.id.btn_fat: | |||||
| if (TempHumidityBleUtils.getInstance() != null) { | |||||
| TempHumidityBleUtils.getInstance().sendFatData(); | |||||
| logList.add(0, "快速速保存数据"); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } | |||||
| break; | |||||
| case R.id.btn_history: | |||||
| if (TempHumidityBleUtils.getInstance() != null) { | |||||
| String s = et_history.getText().toString().trim(); | |||||
| long maxId = 0; | |||||
| if (!s.isEmpty()) { | |||||
| maxId = Long.parseLong(s); | |||||
| } | |||||
| TempHumidityBleUtils.getInstance().getOffLineRecord(maxId); | |||||
| logList.add(0, "获取历史记录 时间Id" + maxId); | |||||
| tv_result.setText(""); | |||||
| historyLogListId.clear(); | |||||
| historyLogList.clear(); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } | |||||
| break; | |||||
| case R.id.btn_show_history: | |||||
| if (listView.getVisibility() == View.VISIBLE) { | |||||
| historyListAdapter.notifyDataSetChanged(); | |||||
| listView.setVisibility(View.GONE); | |||||
| list_view_history.setVisibility(View.VISIBLE); | |||||
| } else { | |||||
| listView.setVisibility(View.VISIBLE); | |||||
| list_view_history.setVisibility(View.GONE); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } | |||||
| case R.id.btn_hear: | |||||
| if (!isHeart) { | |||||
| isHeart = true; | |||||
| mMHandler.sendEmptyMessage(HEART); | |||||
| logList.add(0, "开启心跳"); | |||||
| } else { | |||||
| isHeart = false; | |||||
| mMHandler.removeMessages(HEART); | |||||
| logList.add(0, "关闭心跳"); | |||||
| } | |||||
| int id = v.getId(); | |||||
| if (id == R.id.btn_slow) { | |||||
| if (TempHumidityBleUtils.getInstance() != null) { | |||||
| TempHumidityBleUtils.getInstance().sendSlowData(); | |||||
| logList.add(0, "慢速保存数据"); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } | |||||
| } else if (id == R.id.btn_fat) { | |||||
| if (TempHumidityBleUtils.getInstance() != null) { | |||||
| TempHumidityBleUtils.getInstance().sendFatData(); | |||||
| logList.add(0, "快速速保存数据"); | |||||
| listAdapter.notifyDataSetChanged(); | listAdapter.notifyDataSetChanged(); | ||||
| break; | |||||
| case R.id.btn_clear: | |||||
| logList.clear(); | |||||
| } | |||||
| } else if (id == R.id.btn_history) { | |||||
| if (TempHumidityBleUtils.getInstance() != null) { | |||||
| String s = et_history.getText().toString().trim(); | |||||
| long maxId = 0; | |||||
| if (!s.isEmpty()) { | |||||
| maxId = Long.parseLong(s); | |||||
| } | |||||
| TempHumidityBleUtils.getInstance().getOffLineRecord(maxId); | |||||
| logList.add(0, "获取历史记录 时间Id" + maxId); | |||||
| tv_result.setText(""); | |||||
| historyLogListId.clear(); | historyLogListId.clear(); | ||||
| historyLogList.clear(); | historyLogList.clear(); | ||||
| listAdapter.notifyDataSetChanged(); | listAdapter.notifyDataSetChanged(); | ||||
| } | |||||
| } else if (id == R.id.btn_show_history) { | |||||
| if (listView.getVisibility() == View.VISIBLE) { | |||||
| historyListAdapter.notifyDataSetChanged(); | historyListAdapter.notifyDataSetChanged(); | ||||
| break; | |||||
| case R.id.btn_interval_one: | |||||
| logList.add(0, "上报间隔1分钟"); | |||||
| TempHumidityBleUtils.getInstance().setReportTime(60); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_interval_three: | |||||
| logList.add(0, "上报间隔3分钟"); | |||||
| TempHumidityBleUtils.getInstance().setReportTime(180); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_interval_five: | |||||
| logList.add(0, "上报间隔5分钟"); | |||||
| TempHumidityBleUtils.getInstance().setReportTime(300); | |||||
| listView.setVisibility(View.GONE); | |||||
| list_view_history.setVisibility(View.VISIBLE); | |||||
| } else { | |||||
| listView.setVisibility(View.VISIBLE); | |||||
| list_view_history.setVisibility(View.GONE); | |||||
| listAdapter.notifyDataSetChanged(); | listAdapter.notifyDataSetChanged(); | ||||
| break; | |||||
| case R.id.btn_ota: | |||||
| logList.add(0, "请求ota"); | |||||
| TempHumidityBleUtils.getInstance().ota(); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| } | |||||
| if (!isHeart) { | |||||
| isHeart = true; | |||||
| mMHandler.sendEmptyMessage(HEART); | |||||
| logList.add(0, "开启心跳"); | |||||
| } else { | |||||
| isHeart = false; | |||||
| mMHandler.removeMessages(HEART); | |||||
| logList.add(0, "关闭心跳"); | |||||
| } | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_hear) { | |||||
| if (!isHeart) { | |||||
| isHeart = true; | |||||
| mMHandler.sendEmptyMessage(HEART); | |||||
| logList.add(0, "开启心跳"); | |||||
| } else { | |||||
| isHeart = false; | |||||
| mMHandler.removeMessages(HEART); | |||||
| logList.add(0, "关闭心跳"); | |||||
| } | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_clear) { | |||||
| logList.clear(); | |||||
| historyLogListId.clear(); | |||||
| historyLogList.clear(); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| historyListAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_interval_one) { | |||||
| logList.add(0, "上报间隔1分钟"); | |||||
| TempHumidityBleUtils.getInstance().setReportTime(60); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_interval_three) { | |||||
| logList.add(0, "上报间隔3分钟"); | |||||
| TempHumidityBleUtils.getInstance().setReportTime(180); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_interval_five) { | |||||
| logList.add(0, "上报间隔5分钟"); | |||||
| TempHumidityBleUtils.getInstance().setReportTime(300); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_ota) { | |||||
| logList.add(0, "请求ota"); | |||||
| TempHumidityBleUtils.getInstance().ota(); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @Override | @Override | ||||
| public void handleMessage(@NonNull Message msg) { | public void handleMessage(@NonNull Message msg) { | ||||
| super.handleMessage(msg); | super.handleMessage(msg); | ||||
| switch (msg.what) { | |||||
| case HEART: | |||||
| if (TempHumidityBleUtils.getInstance() != null) { | |||||
| TempHumidityBleUtils.getInstance().getDeviceStatus(); | |||||
| mMHandler.sendEmptyMessageDelayed(HEART, 5000); | |||||
| } | |||||
| break; | |||||
| if (msg.what == HEART) { | |||||
| if (TempHumidityBleUtils.getInstance() != null) { | |||||
| TempHumidityBleUtils.getInstance().getDeviceStatus(); | |||||
| mMHandler.sendEmptyMessageDelayed(HEART, 5000); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| } | } |
| package aicare.net.cn.sdk.ailinksdkdemoandroid; | package aicare.net.cn.sdk.ailinksdkdemoandroid; | ||||
| import android.bluetooth.BluetoothGatt; | |||||
| import android.content.Context; | import android.content.Context; | ||||
| import android.os.Bundle; | import android.os.Bundle; | ||||
| import android.os.Handler; | import android.os.Handler; | ||||
| addLog("发送数据量:" + mNum); | addLog("发送数据量:" + mNum); | ||||
| } | } | ||||
| SendDataBean sendDataBean = new SendDataBean(sendData, sendUuid, BleConfig.WRITE_DATA, sendUuidServer); | SendDataBean sendDataBean = new SendDataBean(sendData, sendUuid, BleConfig.WRITE_DATA, sendUuidServer); | ||||
| mBleDevice.sendDataNow(sendDataBean); | |||||
| mBleDevice.sendData(sendDataBean); | |||||
| if (intervalTime > 0) { | if (intervalTime > 0) { | ||||
| mHandler.sendEmptyMessageDelayed(SEND_DATA, intervalTime); | mHandler.sendEmptyMessageDelayed(SEND_DATA, intervalTime); | ||||
| } | } | ||||
| findViewById(R.id.btn_uuid_server).setOnClickListener(this); | findViewById(R.id.btn_uuid_server).setOnClickListener(this); | ||||
| findViewById(R.id.btn_log).setOnClickListener(this); | findViewById(R.id.btn_log).setOnClickListener(this); | ||||
| findViewById(R.id.btnIncrementSend).setOnClickListener(this); | findViewById(R.id.btnIncrementSend).setOnClickListener(this); | ||||
| findViewById(R.id.btnSendNow).setOnClickListener(this); | |||||
| etIncrementNumber = findViewById(R.id.etIncrementNumber); | etIncrementNumber = findViewById(R.id.etIncrementNumber); | ||||
| et_cmd = findViewById(R.id.et_cmd); | et_cmd = findViewById(R.id.et_cmd); | ||||
| @Override | @Override | ||||
| public void onClick(View v) { | public void onClick(View v) { | ||||
| switch (v.getId()) { | |||||
| case R.id.btn1: | |||||
| try { | |||||
| mNumMax = Integer.parseInt(etIncrementNumber.getText().toString().trim()); | |||||
| } catch (NumberFormatException e) { | |||||
| e.printStackTrace(); | |||||
| mNumMax = 514; | |||||
| } | |||||
| sendCmd = et_cmd.getText().toString().trim(); | |||||
| sendCmdB = BleDensityUtil.getInstance().toBytes(sendCmd); | |||||
| mHandler.removeMessages(SEND_DATA); | |||||
| mHandler.sendEmptyMessage(SEND_DATA); | |||||
| break; | |||||
| case R.id.btn_stop: | |||||
| mHandler.removeMessages(SEND_DATA); | |||||
| break; | |||||
| case R.id.clear: | |||||
| if (mList != null) | |||||
| mList.clear(); | |||||
| mSendNumber = 0; | |||||
| mReceiveNumber = 0; | |||||
| tv_receive_number.setText("0"); | |||||
| tv_send_number.setText("0"); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| break; | |||||
| case R.id.btn_uuid: | |||||
| String uuid = et_uuid.getText().toString().trim().toUpperCase(Locale.ENGLISH); | |||||
| sendUuid = UuidUtils.getUuid(uuid); | |||||
| addLog("设置特征UUID"); | |||||
| break; | |||||
| case R.id.btn_uuid_server: | |||||
| String uuidServer = et_uuid_server.getText().toString().trim().toUpperCase(Locale.ENGLISH); | |||||
| sendUuidServer = UuidUtils.getUuid(uuidServer); | |||||
| addLog("设置服务UUID"); | |||||
| break; | |||||
| case R.id.btn_time: | |||||
| String time = et_time.getText().toString().trim().toUpperCase(Locale.ENGLISH); | |||||
| sendTime = Integer.parseInt(time); | |||||
| addLog("设置时间间隔(ms):" + sendTime); | |||||
| break; | |||||
| case R.id.btn_notify: | |||||
| String notify = et_notify.getText().toString().trim().toUpperCase(Locale.ENGLISH); | |||||
| readNotify(notify, mNotify); | |||||
| addLog("设置Notify UUID"); | |||||
| break; | |||||
| case R.id.btn_notify_status: | |||||
| mNotify = !mNotify; | |||||
| ((Button) v).setText("" + mNotify); | |||||
| break; | |||||
| case R.id.btn_log: | |||||
| mShowLog = !mShowLog; | |||||
| ((Button) v).setText("log:" + (mShowLog ? "Y" : "N")); | |||||
| break; | |||||
| case R.id.btnIncrementSend: | |||||
| mIncrementSend = !mIncrementSend; | |||||
| int id = v.getId(); | |||||
| if (id == R.id.btn1) { | |||||
| try { | |||||
| mNumMax = Integer.parseInt(etIncrementNumber.getText().toString().trim()); | |||||
| } catch (NumberFormatException e) { | |||||
| e.printStackTrace(); | |||||
| mNumMax = 514; | |||||
| } | |||||
| sendCmd = et_cmd.getText().toString().trim(); | |||||
| sendCmdB = BleDensityUtil.getInstance().toBytes(sendCmd); | |||||
| mHandler.removeMessages(SEND_DATA); | |||||
| mHandler.sendEmptyMessage(SEND_DATA); | |||||
| } else if (id == R.id.btn_stop) { | |||||
| mHandler.removeMessages(SEND_DATA); | |||||
| } else if (id == R.id.clear) { | |||||
| if (mList != null) | |||||
| mList.clear(); | |||||
| mSendNumber = 0; | |||||
| mReceiveNumber = 0; | |||||
| tv_receive_number.setText("0"); | |||||
| tv_send_number.setText("0"); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } else if (id == R.id.btn_uuid) { | |||||
| String uuid = et_uuid.getText().toString().trim().toUpperCase(Locale.ENGLISH); | |||||
| sendUuid = UuidUtils.getUuid(uuid); | |||||
| addLog("设置特征UUID"); | |||||
| } else if (id == R.id.btn_uuid_server) { | |||||
| String uuidServer = et_uuid_server.getText().toString().trim().toUpperCase(Locale.ENGLISH); | |||||
| sendUuidServer = UuidUtils.getUuid(uuidServer); | |||||
| addLog("设置服务UUID"); | |||||
| } else if (id == R.id.btn_time) { | |||||
| String time = et_time.getText().toString().trim().toUpperCase(Locale.ENGLISH); | |||||
| sendTime = Integer.parseInt(time); | |||||
| addLog("设置时间间隔(ms):" + sendTime); | |||||
| if (mBleDevice != null) { | |||||
| mBleDevice.setSendDataInterval(sendTime); | |||||
| } | |||||
| } else if (id == R.id.btn_notify) { | |||||
| String notify = et_notify.getText().toString().trim().toUpperCase(Locale.ENGLISH); | |||||
| readNotify(notify, mNotify); | |||||
| addLog("设置Notify UUID"); | |||||
| } else if (id == R.id.btn_notify_status) { | |||||
| mNotify = !mNotify; | |||||
| ((Button) v).setText("" + mNotify); | |||||
| } else if (id == R.id.btn_log) { | |||||
| mShowLog = !mShowLog; | |||||
| ((Button) v).setText("log:" + (mShowLog ? "Y" : "N")); | |||||
| } else if (id == R.id.btnIncrementSend) { | |||||
| mIncrementSend = !mIncrementSend; | |||||
| // mBleDevice.setMtu(mNumMax); | // mBleDevice.setMtu(mNumMax); | ||||
| ((Button) v).setText("递增发送:" + (mIncrementSend ? "Y" : "N")); | |||||
| break; | |||||
| ((Button) v).setText("递增发送:" + (mIncrementSend ? "Y" : "N")); | |||||
| } else if (id == R.id.btnSendNow) { | |||||
| byte[] bytes = BleDensityUtil.getInstance().toBytes(et_cmd.getText().toString().trim()); | |||||
| SendDataBean sendDataBean = new SendDataBean(bytes, sendUuid, BleConfig.WRITE_DATA, sendUuidServer); | |||||
| mBleDevice.sendDataNow(sendDataBean); | |||||
| } | } | ||||
| } | } | ||||
| mBleDevice = mAILinkBleManager.getBleDevice(mAddress); | mBleDevice = mAILinkBleManager.getBleDevice(mAddress); | ||||
| CallbackDisIm.getInstance().addListListener(this); | CallbackDisIm.getInstance().addListListener(this); | ||||
| if (mBleDevice != null) { | if (mBleDevice != null) { | ||||
| mBleDevice.setConnectPriority(BluetoothGatt.CONNECTION_PRIORITY_HIGH); | |||||
| mBleDevice.setOnBleOtherDataListener(this); | mBleDevice.setOnBleOtherDataListener(this); | ||||
| mBleDevice.setOnBleDeviceDataListener(this); | mBleDevice.setOnBleDeviceDataListener(this); | ||||
| mBleDevice.setOnBleMtuListener(new OnBleMtuListener() { | mBleDevice.setOnBleMtuListener(new OnBleMtuListener() { |
| package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||||
| import android.Manifest; | |||||
| import android.app.AlertDialog; | |||||
| import android.content.Context; | |||||
| import android.content.DialogInterface; | |||||
| import android.content.Intent; | |||||
| import android.content.pm.PackageManager; | |||||
| import android.net.Uri; | |||||
| import android.os.Build; | |||||
| import android.os.Bundle; | |||||
| import android.os.Environment; | |||||
| import android.os.Handler; | |||||
| import android.os.Looper; | |||||
| import android.os.Message; | |||||
| import android.provider.Settings; | |||||
| import android.text.TextUtils; | |||||
| import android.view.View; | |||||
| import android.widget.AdapterView; | |||||
| import android.widget.ArrayAdapter; | |||||
| import android.widget.Button; | |||||
| import android.widget.ListView; | |||||
| import android.widget.TextView; | |||||
| import android.widget.Toast; | |||||
| import androidx.activity.result.ActivityResultLauncher; | |||||
| import androidx.annotation.NonNull; | |||||
| import androidx.annotation.Nullable; | |||||
| import androidx.core.app.ActivityCompat; | |||||
| import com.elinkthings.bleotalibrary.bk.BKOtaManager; | |||||
| import com.elinkthings.bleotalibrary.dialog.DialogOtaManager; | |||||
| import com.elinkthings.bleotalibrary.jl.FileBean; | |||||
| import com.elinkthings.bleotalibrary.jl.JLManager; | |||||
| import com.elinkthings.bleotalibrary.listener.OnBleFlashListener; | |||||
| import com.elinkthings.bleotalibrary.listener.OnBleOTAListener; | |||||
| import com.elinkthings.bleotalibrary.netstrap.OPLOtaManager; | |||||
| import com.pingwang.bluetoothlib.config.BleConfig; | |||||
| import com.pingwang.bluetoothlib.device.BleDevice; | |||||
| import com.pingwang.bluetoothlib.listener.OnBleDeviceDataListener; | |||||
| import com.pingwang.bluetoothlib.listener.OnCallbackBle; | |||||
| import com.pingwang.bluetoothlib.utils.BleLog; | |||||
| import java.io.File; | |||||
| import java.util.ArrayList; | |||||
| import java.util.List; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.DialogStringImageBean; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.ShowListDialogFragment; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.FileUtils; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.ResultContact; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.SP; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||||
| /** | |||||
| * xing<br> | |||||
| * 2019/4/25<br> | |||||
| * OTA测试界面 | |||||
| */ | |||||
| public class TestOtaActivity extends BleBaseActivity implements OnCallbackBle, OnBleDeviceDataListener, View.OnClickListener, OnBleOTAListener, OnBleFlashListener, | |||||
| ShowListDialogFragment.onDialogListener { | |||||
| private static String TAG = TestOtaActivity.class.getName(); | |||||
| private final int REFRESH_DATA = 3; | |||||
| private final int SEND_DATA = 4; | |||||
| private TextView mTvVersion; | |||||
| private TextView tvPath; | |||||
| private Button btn_shake_hands; | |||||
| private List<String> mList; | |||||
| private ArrayAdapter listAdapter; | |||||
| private Context mContext; | |||||
| private BleDevice mBleDevice; | |||||
| private String mAddress; | |||||
| private ArrayList<DialogStringImageBean> mDialogList; | |||||
| private String mOTAFileName; | |||||
| private DialogOtaManager mDialogOtaManager; | |||||
| private BKOtaManager mBKOtaManager; | |||||
| private OPLOtaManager mOPLOtaManager; | |||||
| private JLManager mJLManager; | |||||
| private String mPath=""; | |||||
| private ActivityResultLauncher<Boolean> launcher; | |||||
| private Handler mHandler = new Handler(Looper.getMainLooper()) { | |||||
| @Override | |||||
| public void handleMessage(Message msg) { | |||||
| switch (msg.what) { | |||||
| case REFRESH_DATA: | |||||
| if (listAdapter != null) | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case SEND_DATA: | |||||
| break; | |||||
| } | |||||
| } | |||||
| }; | |||||
| @Override | |||||
| protected void onCreate(@Nullable Bundle savedInstanceState) { | |||||
| super.onCreate(savedInstanceState); | |||||
| setContentView(R.layout.activity_test_ota); | |||||
| mContext = this; | |||||
| mAddress = getIntent().getStringExtra("mac"); | |||||
| initPermissions(); | |||||
| init(); | |||||
| FileUtils.init(); | |||||
| initLauncher(); | |||||
| } | |||||
| private void initLauncher() { | |||||
| launcher = registerForActivityResult(new ResultContact(), result -> { | |||||
| if (!TextUtils.isEmpty(mOTAFileName)) { | |||||
| mOTAFileName = result; | |||||
| L.d("fileName : " + mOTAFileName); | |||||
| SP.getInstance().putOtaFileName(mOTAFileName); | |||||
| mTvVersion.setText(mOTAFileName); | |||||
| } | |||||
| }); | |||||
| } | |||||
| private void init() { | |||||
| mList = new ArrayList<>(); | |||||
| ListView listView = findViewById(R.id.listview); | |||||
| listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | |||||
| listView.setAdapter(listAdapter); | |||||
| mTvVersion = findViewById(R.id.tv_version); | |||||
| tvPath = findViewById(R.id.tv_path); | |||||
| btn_shake_hands = findViewById(R.id.btn_shake_hands); | |||||
| btn_shake_hands.setTag(false); | |||||
| findViewById(R.id.btn_ota_connect).setOnClickListener(this); | |||||
| findViewById(R.id.btn_ota_dis).setOnClickListener(this); | |||||
| findViewById(R.id.btn_ota_file).setOnClickListener(this); | |||||
| findViewById(R.id.btn_ota_start_585).setOnClickListener(this); | |||||
| findViewById(R.id.btn_ota_start_531).setOnClickListener(this); | |||||
| findViewById(R.id.btn_ota_start_580).setOnClickListener(this); | |||||
| findViewById(R.id.btn_ota_bk).setOnClickListener(this); | |||||
| findViewById(R.id.btn_start_ota).setOnClickListener(this); | |||||
| findViewById(R.id.btn_ota_opl).setOnClickListener(this); | |||||
| findViewById(R.id.btn_ota_jl).setOnClickListener(this); | |||||
| findViewById(R.id.btn_watch_jl).setOnClickListener(this); | |||||
| findViewById(R.id.btn_file_list).setOnClickListener(this); | |||||
| findViewById(R.id.btn_file_watch_name).setOnClickListener(this); | |||||
| findViewById(R.id.btn_file_watch_delete).setOnClickListener(this); | |||||
| btn_shake_hands.setOnClickListener(this); | |||||
| tvPath.setText("文件路径:手机" + File.separator + Environment.DIRECTORY_DOCUMENTS + File.separator + FileUtils.FILE_DIR + "\n"); | |||||
| mOTAFileName = SP.getInstance().getOtaFileName(); | |||||
| if (mOTAFileName.isEmpty()) | |||||
| mTvVersion.setText("xxxxxxxx"); | |||||
| else | |||||
| mTvVersion.setText(mOTAFileName); | |||||
| mDialogList = new ArrayList<>(); | |||||
| listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { | |||||
| @Override | |||||
| public void onItemClick(AdapterView<?> parent, View view, int position, long id) { | |||||
| String s = mList.get(position); | |||||
| if (s.contains("path")){ | |||||
| mPath=s.substring(s.indexOf("/"),s.lastIndexOf('}')-1); | |||||
| L.i("选择的path:"+mPath); | |||||
| } | |||||
| } | |||||
| }); | |||||
| } | |||||
| @Override | |||||
| public void onItemListener(int position) { | |||||
| if (mDialogList.size() > position) { | |||||
| DialogStringImageBean dialogStringImageBean = mDialogList.get(position); | |||||
| String name = dialogStringImageBean.getName(); | |||||
| mOTAFileName = name; | |||||
| SP.getInstance().putOtaFileName(name); | |||||
| mTvVersion.setText(mOTAFileName); | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public void onClick(View v) { | |||||
| switch (v.getId()) { | |||||
| case R.id.btn_ota_connect: | |||||
| if (mBleDevice == null && !TextUtils.isEmpty(mAddress)) { | |||||
| BleConfig.setHandshakeStatus(mAddress, ((Boolean) btn_shake_hands.getTag())); | |||||
| connectBle(mAddress); | |||||
| } | |||||
| break; | |||||
| case R.id.btn_ota_dis: | |||||
| if (mBleDevice != null) { | |||||
| mBleDevice.disconnect(); | |||||
| mBleDevice = null; | |||||
| } | |||||
| break; | |||||
| case R.id.btn_ota_file: | |||||
| if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { | |||||
| launcher.launch(true); | |||||
| } else { | |||||
| mDialogList.clear(); | |||||
| ArrayList<String> list = FileUtils.list(); | |||||
| for (String s : list) { | |||||
| mDialogList.add(new DialogStringImageBean(s, 0)); | |||||
| } | |||||
| ShowListDialogFragment.newInstance().setTitle("").setCancel("", 0).setCancelBlank(true).setBackground(true).setBottom(false).setList(mDialogList).setOnDialogListener(this) | |||||
| .show(getSupportFragmentManager()); | |||||
| } | |||||
| break; | |||||
| case R.id.btn_ota_start_585: | |||||
| startOta(DialogOtaManager.IC_TYPE_585); | |||||
| break; | |||||
| case R.id.btn_ota_start_531: | |||||
| startOta(DialogOtaManager.IC_TYPE_531); | |||||
| break; | |||||
| case R.id.btn_ota_start_580: | |||||
| startOta(DialogOtaManager.IC_TYPE_580); | |||||
| break; | |||||
| case R.id.btn_ota_bk: | |||||
| startOtaBK(); | |||||
| break; | |||||
| case R.id.btn_ota_opl: | |||||
| startOtaOPL(); | |||||
| break; | |||||
| case R.id.btn_ota_jl: | |||||
| startOtaJL(); | |||||
| break; | |||||
| case R.id.btn_watch_jl: | |||||
| startWatchJL(); | |||||
| break; | |||||
| case R.id.btn_file_list: | |||||
| if (mJLManager != null) { | |||||
| mJLManager.getWatchList(new JLManager.OnWatchFileListener<ArrayList<FileBean>>() { | |||||
| @Override | |||||
| public void onSuccess(ArrayList<FileBean> list) { | |||||
| for (FileBean fileBean : list) { | |||||
| mList.add(TimeUtils.getTime() + "文件信息:" + fileBean.toString()); | |||||
| } | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| @Override | |||||
| public void onFailed(int code, String message) { | |||||
| mList.add(TimeUtils.getTime() + "读取文件列表失败:" + message); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| }); | |||||
| }else { | |||||
| mList.add(TimeUtils.getTime() + "请先初始化加载WATCH" ); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| break; | |||||
| case R.id.btn_file_watch_name: | |||||
| if (mJLManager != null) { | |||||
| if (TextUtils.isEmpty(mPath)) { | |||||
| mList.add(TimeUtils.getTime() + "请先选择表盘:" + mPath); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| return; | |||||
| } | |||||
| mJLManager.setCurrentWatch(mPath, new JLManager.OnWatchFileListener<FileBean>() { | |||||
| @Override | |||||
| public void onSuccess(FileBean fileBean) { | |||||
| mList.add(TimeUtils.getTime() + "当前表盘:" + (fileBean==null?"":fileBean.toString())); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| @Override | |||||
| public void onFailed(int code, String message) { | |||||
| mList.add(TimeUtils.getTime() + "读取文件列表失败:" + message); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| }); | |||||
| }else { | |||||
| mList.add(TimeUtils.getTime() + "请先初始化加载WATCH" ); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| break; | |||||
| case R.id.btn_file_watch_delete: | |||||
| if (mJLManager != null) { | |||||
| if (TextUtils.isEmpty(mPath)) { | |||||
| mList.add(TimeUtils.getTime() + "请先选择表盘:" + mPath); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| return; | |||||
| } | |||||
| mJLManager.deleteWatchFile(mPath, new JLManager.OnWatchFileListener<Boolean>() { | |||||
| @Override | |||||
| public void onSuccess(Boolean list) { | |||||
| mList.add(TimeUtils.getTime() + "删除表盘成功:" + mPath); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| @Override | |||||
| public void onFailed(int code, String message) { | |||||
| mList.add(TimeUtils.getTime() + "删除表盘失败:" + mPath); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| }); | |||||
| }else { | |||||
| mList.add(TimeUtils.getTime() + "请先初始化加载WATCH" ); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| break; | |||||
| case R.id.btn_start_ota: | |||||
| startOta(); | |||||
| break; | |||||
| case R.id.btn_shake_hands: | |||||
| boolean status = (boolean) btn_shake_hands.getTag(); | |||||
| btn_shake_hands.setTag(!status); | |||||
| btn_shake_hands.setText("握手:" + !status); | |||||
| break; | |||||
| default: | |||||
| break; | |||||
| } | |||||
| } | |||||
| private void startOta(int icType) { | |||||
| if (mOTAFileName.isEmpty()) { | |||||
| Toast.makeText(mContext, "请先选择文件", Toast.LENGTH_SHORT).show(); | |||||
| return; | |||||
| } | |||||
| String byFileName = FileUtils.getByFileName() + mOTAFileName; | |||||
| mDialogOtaManager = DialogOtaManager.newBuilder().setOnBleOTAListener(this).setFilePath(byFileName).setIcType(icType).build(mBleDevice); | |||||
| if (mDialogOtaManager != null) { | |||||
| mList.add(TimeUtils.getTime() + "加载OTA包成功,点击开始OTA即可开始"); | |||||
| } else { | |||||
| mList.add(TimeUtils.getTime() + "连接断开"); | |||||
| } | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| // mBleDevice.setOnDialogOTAListener(this); | |||||
| // mBleDevice.startDialogOta(byFileName, icType,((Boolean) btn_shake_hands.getTag())); | |||||
| } | |||||
| private String mOTAVersionAll = ""; | |||||
| private void startOtaBK() { | |||||
| if (mOTAFileName.isEmpty()) { | |||||
| Toast.makeText(mContext, "请先选择文件", Toast.LENGTH_SHORT).show(); | |||||
| return; | |||||
| } | |||||
| String byFileName = FileUtils.getByFileName() + mOTAFileName; | |||||
| mBKOtaManager = BKOtaManager.newBuilder().setOnBleOTAListener(this).setFilePath(byFileName).build(mBleDevice); | |||||
| mOTAVersionAll = ""; | |||||
| mDeviceVersionAll = ""; | |||||
| if (mBKOtaManager != null) { | |||||
| long deviceVersion = mBKOtaManager.getDeviceVersion(); | |||||
| long romVersion = mBKOtaManager.getRomVersion(); | |||||
| mOTAVersionAll = deviceVersion + "_" + romVersion; | |||||
| mList.add(TimeUtils.getTime() + "加载OTA包成功,点击开始OTA即可开始"); | |||||
| mList.add(TimeUtils.getTime() + "OTA包版本:" + mOTAVersionAll); | |||||
| } else { | |||||
| mList.add(TimeUtils.getTime() + "连接断开"); | |||||
| } | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| private void startOtaOPL() { | |||||
| if (mOTAFileName.isEmpty()) { | |||||
| Toast.makeText(mContext, "请先选择文件", Toast.LENGTH_SHORT).show(); | |||||
| return; | |||||
| } | |||||
| String byFileName = FileUtils.getByFileName() + mOTAFileName; | |||||
| mOPLOtaManager = OPLOtaManager.newBuilder(mContext).setFilePath(byFileName).setOnBleOTAListener(this).build(mBleDevice); | |||||
| mList.add(TimeUtils.getTime() + "加载OTA包成功,点击开始OTA即可开始"); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| private void startOtaJL() { | |||||
| if (mOTAFileName.isEmpty()) { | |||||
| Toast.makeText(mContext, "请先选择文件", Toast.LENGTH_SHORT).show(); | |||||
| return; | |||||
| } | |||||
| String byFileName = FileUtils.getByFileName() + mOTAFileName; | |||||
| mJLManager = JLManager.newBuilder(mContext).setType(JLManager.TYPE_OTA).setFilePath(byFileName).setOnBleOTAListener(this).build(mBleDevice); | |||||
| mList.add(TimeUtils.getTime() + "加载OTA包成功,点击开始OTA即可开始"); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| private void startWatchJL() { | |||||
| if (mOTAFileName.isEmpty()) { | |||||
| Toast.makeText(mContext, "请先选择文件", Toast.LENGTH_SHORT).show(); | |||||
| return; | |||||
| } | |||||
| String byFileName = FileUtils.getByFileName() + mOTAFileName; | |||||
| mJLManager = JLManager.newBuilder(mContext).setType(JLManager.TYPE_WATCH).setFilePath(byFileName).setOnBleFlashListener(this).build(mBleDevice); | |||||
| mList.add(TimeUtils.getTime() + "加载WATCH包成功,可以进行相关操作了"); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| private void startOta() { | |||||
| if (mDialogOtaManager != null) { | |||||
| mDialogOtaManager.startOta(); | |||||
| } else if (mBKOtaManager != null) { | |||||
| if (!TextUtils.isEmpty(mOTAVersionAll)) { | |||||
| if (mOTAVersionAll.equals(mDeviceVersionAll)) { | |||||
| mList.add(TimeUtils.getTime() + "OTA版本与设备版本相同"); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| return; | |||||
| } | |||||
| } | |||||
| mBKOtaManager.startOta(); | |||||
| mBKOtaManager = null; | |||||
| } else if (mOPLOtaManager != null) { | |||||
| mOPLOtaManager.startOta(); | |||||
| } else if (mJLManager != null) { | |||||
| if (mJLManager.getType() == JLManager.TYPE_OTA) { | |||||
| mJLManager.startOta(); | |||||
| mList.add(TimeUtils.getTime() + "开始OTA:"); | |||||
| } else { | |||||
| mJLManager.startFlash(); | |||||
| mList.add(TimeUtils.getTime() + "开始表盘:"); | |||||
| } | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| return; | |||||
| } else { | |||||
| mList.add(TimeUtils.getTime() + "请先选择OTA类型"); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| return; | |||||
| } | |||||
| mList.add(TimeUtils.getTime() + "OTA已开始,请耐心等待"); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| /** | |||||
| * 初始化请求权限 | |||||
| */ | |||||
| private void initPermissions() { | |||||
| if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { | |||||
| ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { | |||||
| super.onRequestPermissionsResult(requestCode, permissions, grantResults); | |||||
| if (requestCode != 1) { | |||||
| return; | |||||
| } | |||||
| if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { | |||||
| } else { | |||||
| if (ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[0])) { | |||||
| //权限请求失败,但未选中“不再提示”选项 | |||||
| new AlertDialog.Builder(this).setTitle("提示").setMessage("请求使用定位权限搜索蓝牙设备").setPositiveButton("确定", new DialogInterface.OnClickListener() { | |||||
| @Override | |||||
| public void onClick(DialogInterface dialog, int which) { | |||||
| //引导用户至设置页手动授权 | |||||
| Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); | |||||
| Uri uri = Uri.fromParts("package", getApplicationContext().getPackageName(), null); | |||||
| intent.setData(uri); | |||||
| startActivity(intent); | |||||
| } | |||||
| }).setNegativeButton("取消", new DialogInterface.OnClickListener() { | |||||
| @Override | |||||
| public void onClick(DialogInterface dialog, int which) { | |||||
| if (dialog != null) { | |||||
| dialog.cancel(); | |||||
| } | |||||
| } | |||||
| }).show(); | |||||
| } else { | |||||
| //权限请求失败,选中“不再提示”选项 | |||||
| // T.showShort(MainActivity.this, "获取权限失败"); | |||||
| new AlertDialog.Builder(this).setTitle("提示").setMessage("请求使用定位权限搜索蓝牙设备").setPositiveButton("确定", new DialogInterface.OnClickListener() { | |||||
| @Override | |||||
| public void onClick(DialogInterface dialog, int which) { | |||||
| //引导用户至设置页手动授权 | |||||
| Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); | |||||
| Uri uri = Uri.fromParts("package", getApplicationContext().getPackageName(), null); | |||||
| intent.setData(uri); | |||||
| startActivity(intent); | |||||
| } | |||||
| }).setNegativeButton("取消", new DialogInterface.OnClickListener() { | |||||
| @Override | |||||
| public void onClick(DialogInterface dialog, int which) { | |||||
| if (dialog != null) { | |||||
| dialog.cancel(); | |||||
| } | |||||
| } | |||||
| }).show(); | |||||
| } | |||||
| } | |||||
| } | |||||
| //---------------------------------服务--------------------------------------------------- | |||||
| @Override | |||||
| public void onServiceSuccess() { | |||||
| BleLog.i(TAG, "服务与界面建立连接成功"); | |||||
| //与服务建立连接 | |||||
| if (mAILinkBleManager != null) { | |||||
| mBleDevice = mAILinkBleManager.getBleDevice(mAddress); | |||||
| mAILinkBleManager.setOnCallbackBle(this); | |||||
| if (mDialogOtaManager != null) { | |||||
| mDialogOtaManager.setOnBleOTAListener(this); | |||||
| } | |||||
| if (mJLManager != null) { | |||||
| //在OTA状态 | |||||
| mJLManager.setOnBleOTAListener(this); | |||||
| mJLManager.onBtDeviceConnection(mBleDevice); | |||||
| } | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public void onServiceErr() { | |||||
| BleLog.i(TAG, "服务与界面连接断开"); | |||||
| //与服务断开连接 | |||||
| mAILinkBleManager = null; | |||||
| } | |||||
| @Override | |||||
| public void unbindServices() { | |||||
| if (mBleDevice != null) { | |||||
| if (mJLManager != null) | |||||
| mJLManager.release(); | |||||
| mBleDevice.disconnect(); | |||||
| mBleDevice = null; | |||||
| } | |||||
| if (mAILinkBleManager !=null) { | |||||
| mAILinkBleManager.removeOnCallbackBle(this); | |||||
| } | |||||
| } | |||||
| //-----------------状态------------------- | |||||
| @Override | |||||
| public void onConnecting(@NonNull String mac) { | |||||
| //TODO 连接中 | |||||
| if (!mac.equalsIgnoreCase(mAddress)) { | |||||
| return; | |||||
| } | |||||
| BleLog.i(TAG, "连接中"); | |||||
| mList.add(TimeUtils.getTime() + "连接中"); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| @Override | |||||
| public void onDisConnected(@NonNull String mac, int code) { | |||||
| // 连接断开 | |||||
| if (!mac.equalsIgnoreCase(mAddress)) { | |||||
| return; | |||||
| } | |||||
| BleLog.i(TAG, "连接断开:" + code); | |||||
| mBleDevice = null; | |||||
| mList.add(TimeUtils.getTime() + "连接断开:" + code); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| @Override | |||||
| public void onServicesDiscovered(@NonNull String mac) { | |||||
| // 连接成功(获取服务成功) | |||||
| if (!mac.equalsIgnoreCase(mAddress)) { | |||||
| return; | |||||
| } | |||||
| BleLog.i(TAG, "连接成功(获取服务成功)"); | |||||
| mList.add(TimeUtils.getTime() + "连接成功"); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| onServiceSuccess(); | |||||
| } | |||||
| @Override | |||||
| public void bleOpen() { | |||||
| } | |||||
| @Override | |||||
| public void bleClose() { | |||||
| BleLog.i(TAG, "蓝牙未开启,可请求开启"); | |||||
| } | |||||
| //-----------------通知------------------- | |||||
| @Override | |||||
| protected void onDestroy() { | |||||
| super.onDestroy(); | |||||
| if (mHandler != null) { | |||||
| mHandler.removeCallbacksAndMessages(null); | |||||
| } | |||||
| BleLog.i(TAG, "onDestroy"); | |||||
| } | |||||
| @Override | |||||
| public void onOtaSuccess() { | |||||
| mList.add(TimeUtils.getTime() + "OTA成功"); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| @Override | |||||
| public void onOtaFailure(int cmd, String err) { | |||||
| mList.add(TimeUtils.getTime() + "OTA失败:" + err); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| // if (mBleDevice != null) { | |||||
| // mBleDevice.disconnect(); | |||||
| // } | |||||
| } | |||||
| private int progressOld; | |||||
| @Override | |||||
| public void onOtaProgress(float progress, int currentCount, int maxCount) { | |||||
| int progressInt = (int) progress; | |||||
| if (progressInt == -1) { | |||||
| mList.add(TimeUtils.getTime() + "OTA进度:正在校验升级文件"); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| return; | |||||
| } | |||||
| String showProgress = "OTA进度:" + progressInt + "%"; | |||||
| if (maxCount > 1) { | |||||
| showProgress = "OTA进度:" + progressInt + "%" + " 总共:" + maxCount + " 当前进行:" + currentCount; | |||||
| } | |||||
| if (progressOld != progressInt) { | |||||
| progressOld = progressInt; | |||||
| mList.add(TimeUtils.getTime() + showProgress); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public void onReconnect(String mac) { | |||||
| mList.add(TimeUtils.getTime() + "OTA回连:" + mac); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| mHandler.postDelayed(() -> { | |||||
| BleConfig.setHandshakeStatus(mAddress, ((Boolean) btn_shake_hands.getTag())); | |||||
| connectBle(mAddress); | |||||
| }, 2000); | |||||
| } | |||||
| private String mDeviceVersionAll = ""; | |||||
| // @Override | |||||
| // public void onDeviceVersion(String deviceVersion, String romVersion) { | |||||
| // mDeviceVersionAll = deviceVersion + "_" + romVersion; | |||||
| // mList.add(TimeUtils.getTime() + "设备版本:" + mDeviceVersionAll); | |||||
| // mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| // } | |||||
| @Override | |||||
| public void onFlashSuccess() { | |||||
| mList.add(TimeUtils.getTime() + "表盘成功"); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| @Override | |||||
| public void onFlashFailure(int cmd, String err) { | |||||
| mList.add(TimeUtils.getTime() + "表盘失败:" + err); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| @Override | |||||
| public void onFlashProgress(float progress, int currentCount, int maxCount) { | |||||
| int progressInt = (int) progress; | |||||
| if (progressInt == -1) { | |||||
| mList.add(TimeUtils.getTime() + "表盘进度:正在校验升级文件"); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| return; | |||||
| } | |||||
| String showProgress = "表盘进度:" + progressInt + "%"; | |||||
| if (maxCount > 1) { | |||||
| showProgress = "表盘进度:" + progressInt + "%" + " 总共:" + maxCount + " 当前进行:" + currentCount; | |||||
| } | |||||
| if (progressOld != progressInt) { | |||||
| progressOld = progressInt; | |||||
| mList.add(TimeUtils.getTime() + showProgress); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public void onFlashStatus(int status) { | |||||
| } | |||||
| } |
| import cn.net.aicare.modulelibrary.module.tpms.TpmsDeviceData; | import cn.net.aicare.modulelibrary.module.tpms.TpmsDeviceData; | ||||
| /** | /** | ||||
| * xing<br> | * xing<br> | ||||
| * 2019/9/2<br> | * 2019/9/2<br> | ||||
| private Handler mHandler = new Handler(Looper.getMainLooper()) { | private Handler mHandler = new Handler(Looper.getMainLooper()) { | ||||
| @Override | @Override | ||||
| public void handleMessage(Message msg) { | public void handleMessage(Message msg) { | ||||
| switch (msg.what) { | |||||
| case REFRESH_DATA: | |||||
| if (listAdapter != null) | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| if (msg.what == REFRESH_DATA) { | |||||
| if (listAdapter != null) | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } | } | ||||
| } | } | ||||
| }; | }; | ||||
| @Override | @Override | ||||
| public void onClick(View v) { | public void onClick(View v) { | ||||
| SendBleBean sendBleBean = new SendBleBean(); | SendBleBean sendBleBean = new SendBleBean(); | ||||
| switch (v.getId()) { | |||||
| case R.id.btnVersion: | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||||
| mBleDevice.sendData(sendBleBean); | |||||
| break; | |||||
| case R.id.btnBattery: | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus()); | |||||
| mBleDevice.sendData(sendBleBean); | |||||
| break; | |||||
| case R.id.btn_get_did: | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getDid()); | |||||
| mBleDevice.sendData(sendBleBean); | |||||
| break; | |||||
| case R.id.btn1: | |||||
| String cmd = et_type.getText().toString().trim(); | |||||
| SendMcuBean sendDataBean = new SendMcuBean(); | |||||
| sendDataBean.setHex(type,cmd.getBytes()); | |||||
| mBleDevice.sendData(sendDataBean); | |||||
| break; | |||||
| case R.id.clear: | |||||
| if (mList != null) | |||||
| mList.clear(); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| break; | |||||
| int id = v.getId(); | |||||
| if (id == R.id.btnVersion) { | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||||
| mBleDevice.sendData(sendBleBean); | |||||
| } else if (id == R.id.btnBattery) { | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus()); | |||||
| mBleDevice.sendData(sendBleBean); | |||||
| } else if (id == R.id.btn_get_did) { | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getDid()); | |||||
| mBleDevice.sendData(sendBleBean); | |||||
| } else if (id == R.id.btn1) { | |||||
| String cmd = et_type.getText().toString().trim(); | |||||
| SendMcuBean sendDataBean = new SendMcuBean(); | |||||
| sendDataBean.setHex(type, cmd.getBytes()); | |||||
| mBleDevice.sendData(sendDataBean); | |||||
| } else if (id == R.id.clear) { | |||||
| if (mList != null) | |||||
| mList.clear(); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | } | ||||
| } | } | ||||
| import androidx.annotation.Nullable; | import androidx.annotation.Nullable; | ||||
| import com.google.gson.Gson; | |||||
| import com.pingwang.bluetoothlib.AILinkBleManager; | |||||
| import com.pingwang.bluetoothlib.bean.SupportUnitBean; | import com.pingwang.bluetoothlib.bean.SupportUnitBean; | ||||
| import com.pingwang.bluetoothlib.device.BleDevice; | import com.pingwang.bluetoothlib.device.BleDevice; | ||||
| import com.pingwang.bluetoothlib.device.BleSendCmdUtil; | |||||
| import com.pingwang.bluetoothlib.listener.OnCallbackBle; | import com.pingwang.bluetoothlib.listener.OnCallbackBle; | ||||
| import com.pingwang.bluetoothlib.utils.BleDataUtils; | |||||
| import com.pingwang.bluetoothlib.utils.BleStrUtils; | import com.pingwang.bluetoothlib.utils.BleStrUtils; | ||||
| import java.lang.ref.WeakReference; | import java.lang.ref.WeakReference; | ||||
| import java.util.List; | import java.util.List; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.SP; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | ||||
| import cn.net.aicare.modulelibrary.module.Transmission.TransmissionDeviceData; | import cn.net.aicare.modulelibrary.module.Transmission.TransmissionDeviceData; | ||||
| */ | */ | ||||
| public class TransmissionActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, TransmissionDeviceData.MyBleCallback { | public class TransmissionActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, TransmissionDeviceData.MyBleCallback { | ||||
| private final String TRANSMISSION_DATA_KEY = "TRANSMISSION_DATA_KEY"; | |||||
| private TextView tv_device_info; | private TextView tv_device_info; | ||||
| private EditText et, et_cid, et_a6, et_customize, et_name; | |||||
| private Button send, send_a6, bt_clear, bt_clear_log, bt_cid, send_customize; | |||||
| private EditText et, et_cid, et_a6, et_customize, etReceive, etSend; | |||||
| private Button send, send_a6, bt_clear, bt_clear_log, btnSetAutoSend, send_customize; | |||||
| private Button btDis, btConnect; | |||||
| private ListView mListView; | private ListView mListView; | ||||
| private List<String> mlogList; | private List<String> mlogList; | ||||
| private final int ToRefreUi = 1; | private final int ToRefreUi = 1; | ||||
| private String mAddress; | private String mAddress; | ||||
| private TransmissionDeviceData mTransmissionDeviceData; | private TransmissionDeviceData mTransmissionDeviceData; | ||||
| private boolean isPause = false; | private boolean isPause = false; | ||||
| private Gson mGson = new Gson(); | |||||
| private SaveDataBean mSaveDataBean; | |||||
| @Override | @Override | ||||
| public void onServiceSuccess() { | public void onServiceSuccess() { | ||||
| et = findViewById(R.id.et); | et = findViewById(R.id.et); | ||||
| et_a6 = findViewById(R.id.et_a6); | et_a6 = findViewById(R.id.et_a6); | ||||
| et_cid = findViewById(R.id.et_cid); | et_cid = findViewById(R.id.et_cid); | ||||
| bt_cid = findViewById(R.id.bt_cid); | |||||
| btnSetAutoSend = findViewById(R.id.btnSetAutoSend); | |||||
| send = findViewById(R.id.send); | send = findViewById(R.id.send); | ||||
| send_a6 = findViewById(R.id.send_a6); | send_a6 = findViewById(R.id.send_a6); | ||||
| et_customize = findViewById(R.id.et_customize); | et_customize = findViewById(R.id.et_customize); | ||||
| send_customize = findViewById(R.id.send_customize); | send_customize = findViewById(R.id.send_customize); | ||||
| et_name = findViewById(R.id.et_name); | |||||
| etReceive = findViewById(R.id.etReceive); | |||||
| etSend = findViewById(R.id.etSend); | |||||
| bt_clear = findViewById(R.id.bt_clear); | bt_clear = findViewById(R.id.bt_clear); | ||||
| bt_clear_log = findViewById(R.id.bt_clear_log); | bt_clear_log = findViewById(R.id.bt_clear_log); | ||||
| mListView = findViewById(R.id.listview); | mListView = findViewById(R.id.listview); | ||||
| btDis = findViewById(R.id.btDis); | |||||
| btConnect = findViewById(R.id.btConnect); | |||||
| send.setOnClickListener(this); | send.setOnClickListener(this); | ||||
| send_a6.setOnClickListener(this); | send_a6.setOnClickListener(this); | ||||
| send_customize.setOnClickListener(this); | send_customize.setOnClickListener(this); | ||||
| findViewById(R.id.send_name).setOnClickListener(this); | |||||
| findViewById(R.id.btPause).setOnClickListener(this); | findViewById(R.id.btPause).setOnClickListener(this); | ||||
| bt_clear.setOnClickListener(this); | bt_clear.setOnClickListener(this); | ||||
| bt_cid.setOnClickListener(this); | |||||
| bt_clear_log.setOnClickListener(this); | bt_clear_log.setOnClickListener(this); | ||||
| btDis.setOnClickListener(this); | |||||
| btConnect.setOnClickListener(this); | |||||
| btnSetAutoSend.setOnClickListener(this); | |||||
| mAddress = getIntent().getStringExtra("mac"); | mAddress = getIntent().getStringExtra("mac"); | ||||
| mlogList = new ArrayList<>(); | mlogList = new ArrayList<>(); | ||||
| listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mlogList); | listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mlogList); | ||||
| mListView.setAdapter(listAdapter); | mListView.setAdapter(listAdapter); | ||||
| mGson = new Gson(); | |||||
| String json = (String) SP.getInstance().get(TRANSMISSION_DATA_KEY, ""); | |||||
| if (!TextUtils.isEmpty(json)) { | |||||
| mSaveDataBean = mGson.fromJson(json, SaveDataBean.class); | |||||
| et_cid.setText(mSaveDataBean.cid); | |||||
| et.setText(mSaveDataBean.a7Data); | |||||
| et_a6.setText(mSaveDataBean.a6Data); | |||||
| et_customize.setText(mSaveDataBean.customizeData); | |||||
| } | |||||
| } | } | ||||
| @Override | @Override | ||||
| } else if (id == R.id.bt_clear_log) { | } else if (id == R.id.bt_clear_log) { | ||||
| mlogList.clear(); | mlogList.clear(); | ||||
| mMHandler.sendEmptyMessage(ToRefreUi); | mMHandler.sendEmptyMessage(ToRefreUi); | ||||
| } else if (id == R.id.bt_cid) { | |||||
| if (mTransmissionDeviceData != null) { | |||||
| mTransmissionDeviceData.getCid(); | |||||
| } | |||||
| } else if (id == R.id.send_a6) { | } else if (id == R.id.send_a6) { | ||||
| String hex = et_a6.getText().toString().toUpperCase().trim(); | String hex = et_a6.getText().toString().toUpperCase().trim(); | ||||
| if (!TextUtils.isEmpty(hex)) { | if (!TextUtils.isEmpty(hex)) { | ||||
| mTransmissionDeviceData.setSendDataCustomize(hexStr); | mTransmissionDeviceData.setSendDataCustomize(hexStr); | ||||
| } | } | ||||
| } | } | ||||
| } else if (id == R.id.send_name) { | |||||
| String name = et_name.getText().toString().trim(); | |||||
| if (!TextUtils.isEmpty(name)) { | |||||
| byte[] names = BleDataUtils.getInstance().getBleName(name); | |||||
| mTransmissionDeviceData.setSendDataA6(BleSendCmdUtil.getInstance().setBleName(names)); | |||||
| } | |||||
| }else if (id == R.id.btPause){ | |||||
| } else if (id == R.id.btnSetAutoSend) { | |||||
| mReceiveStr = etReceive.getText().toString().trim(); | |||||
| mSendStr = etSend.getText().toString().trim(); | |||||
| addLog("设置成功:发送的数据通过A7通道发送"); | |||||
| } else if (id == R.id.btPause) { | |||||
| isPause = !isPause; | isPause = !isPause; | ||||
| } else if (id == R.id.btDis) { | |||||
| AILinkBleManager.getInstance().disconnectAll(); | |||||
| } else if (id == R.id.btConnect) { | |||||
| AILinkBleManager.getInstance().connectDevice(mAddress); | |||||
| } | |||||
| } | |||||
| private String mReceiveStr = ""; | |||||
| private String mSendStr = ""; | |||||
| /** | |||||
| * 检查数据自动发送 | |||||
| * | |||||
| * @param data 数据 | |||||
| */ | |||||
| public void checkDataAutoSend(String data) { | |||||
| data = data.replace(" ",""); | |||||
| if (TextUtils.isEmpty(mReceiveStr) || TextUtils.isEmpty(mSendStr) || TextUtils.isEmpty(data)) { | |||||
| return; | |||||
| } | |||||
| if (data.startsWith(mReceiveStr)) { | |||||
| byte[] hexStr = BleStrUtils.stringToByte(mSendStr); | |||||
| String cid = et_cid.getText().toString().toUpperCase().trim(); | |||||
| int hexStrCid = Integer.parseInt(cid, 16); | |||||
| if (mTransmissionDeviceData != null) { | |||||
| mTransmissionDeviceData.setSendData(hexStrCid, hexStr); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @Override | @Override | ||||
| public void onVersion(String version) { | public void onVersion(String version) { | ||||
| @Override | @Override | ||||
| public void showData(String data, int type) { | public void showData(String data, int type) { | ||||
| addLog( "收A7 payload数据" + TimeUtils.getTimeSSS() + "cid=" + type + "\n" + data); | |||||
| addLog("收A7 payload数据" + TimeUtils.getTimeSSS() + "cid=" + type + "\n" + data); | |||||
| checkDataAutoSend(data); | |||||
| } | } | ||||
| @Override | @Override | ||||
| @Override | @Override | ||||
| public void otherData(byte[] hex, String data) { | public void otherData(byte[] hex, String data) { | ||||
| addLog("收 透传数据" + TimeUtils.getTime() + data); | addLog("收 透传数据" + TimeUtils.getTime() + data); | ||||
| checkDataAutoSend(data); | |||||
| } | } | ||||
| @Override | @Override | ||||
| public void a6Data(byte[] hex, String data) { | public void a6Data(byte[] hex, String data) { | ||||
| addLog("收A6 payload数据" + TimeUtils.getTime() + data); | addLog("收A6 payload数据" + TimeUtils.getTime() + data); | ||||
| checkDataAutoSend(data); | |||||
| } | } | ||||
| @Override | @Override | ||||
| addLog("发 " + TimeUtils.getTimeSSS() + data); | addLog("发 " + TimeUtils.getTimeSSS() + data); | ||||
| } | } | ||||
| @Override | |||||
| public void onServicesDiscovered(String mac) { | |||||
| onServiceSuccess(); | |||||
| mlogList.add(0, "连接成功: " + mac); | |||||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||||
| } | |||||
| @Override | @Override | ||||
| public void onDisConnected(String mac, int code) { | public void onDisConnected(String mac, int code) { | ||||
| @Override | @Override | ||||
| public void handleMessage(Message msg) { | public void handleMessage(Message msg) { | ||||
| super.handleMessage(msg); | super.handleMessage(msg); | ||||
| switch (msg.what) { | |||||
| case ToRefreUi: | |||||
| if (listAdapter != null) { | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } | |||||
| break; | |||||
| default: | |||||
| break; | |||||
| if (msg.what == ToRefreUi) { | |||||
| if (listAdapter != null) { | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| if (mAILinkBleManager != null) { | if (mAILinkBleManager != null) { | ||||
| mAILinkBleManager.disconnectAll(); | mAILinkBleManager.disconnectAll(); | ||||
| } | } | ||||
| if (mSaveDataBean == null) { | |||||
| mSaveDataBean = new SaveDataBean(); | |||||
| } | |||||
| mSaveDataBean.cid = et_cid.getText().toString().trim(); | |||||
| mSaveDataBean.a7Data = et.getText().toString().trim(); | |||||
| mSaveDataBean.a6Data = et_a6.getText().toString().trim(); | |||||
| mSaveDataBean.customizeData = et_customize.getText().toString().trim(); | |||||
| String json = mGson.toJson(mSaveDataBean); | |||||
| SP.getInstance().put(TRANSMISSION_DATA_KEY, json); | |||||
| } | } | ||||
| private void addLog(String log) { | private void addLog(String log) { | ||||
| if (isPause){ | |||||
| if (isPause) { | |||||
| return; | return; | ||||
| } | } | ||||
| mlogList.add(0, log); | mlogList.add(0, log); | ||||
| mMHandler.sendEmptyMessage(ToRefreUi); | mMHandler.sendEmptyMessage(ToRefreUi); | ||||
| } | } | ||||
| class SaveDataBean { | |||||
| String cid = ""; | |||||
| String a7Data = ""; | |||||
| String a6Data = ""; | |||||
| String customizeData = ""; | |||||
| } | |||||
| } | } |
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig; | import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.AddUserDialog; | import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.AddUserDialog; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.bean.UserBean; | |||||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.AppHistoryRecordBean; | import cn.net.aicare.modulelibrary.module.BodyFatScale.AppHistoryRecordBean; | ||||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatBleUtilsData; | import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatBleUtilsData; | ||||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatDataUtil; | import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatDataUtil; | ||||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatRecord; | import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatRecord; | ||||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatUserBean; | |||||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.McuHistoryRecordBean; | import cn.net.aicare.modulelibrary.module.BodyFatScale.McuHistoryRecordBean; | ||||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.User; | |||||
| /** | /** | ||||
| * Ble体脂秤 | * Ble体脂秤 | ||||
| private MHandler mMHandler; | private MHandler mMHandler; | ||||
| private EditText mEditText; | private EditText mEditText; | ||||
| private RadioButton kg, jing, stlb, lb; | private RadioButton kg, jing, stlb, lb; | ||||
| private List<User> mUsers; | |||||
| private User selectUser; | |||||
| private List<BodyFatUserBean> mBodyFatUserBeans; | |||||
| private BodyFatUserBean mSelectBodyFatUserBean; | |||||
| private int weighunit = BodyFatDataUtil.KG; | private int weighunit = BodyFatDataUtil.KG; | ||||
| private ListView loglistView; | private ListView loglistView; | ||||
| private ListView userlistView; | private ListView userlistView; | ||||
| private void initView() { | private void initView() { | ||||
| findViewById(R.id.history).setOnClickListener(this); | findViewById(R.id.history).setOnClickListener(this); | ||||
| findViewById(R.id.userlist).setOnClickListener(this); | findViewById(R.id.userlist).setOnClickListener(this); | ||||
| findViewById(R.id.user).setOnClickListener(this); | |||||
| findViewById(R.id.btnUser).setOnClickListener(this); | |||||
| findViewById(R.id.adduser).setOnClickListener(this); | findViewById(R.id.adduser).setOnClickListener(this); | ||||
| findViewById(R.id.syntime).setOnClickListener(this); | findViewById(R.id.syntime).setOnClickListener(this); | ||||
| kg = findViewById(R.id.kg); | kg = findViewById(R.id.kg); | ||||
| listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mlogList); | listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mlogList); | ||||
| loglistView.setAdapter(listAdapter); | loglistView.setAdapter(listAdapter); | ||||
| User defaultUser = getdefault(); | |||||
| selectUser = defaultUser; | |||||
| BodyFatUserBean defaultBodyFatUserBean = getdefault(); | |||||
| mSelectBodyFatUserBean = defaultBodyFatUserBean; | |||||
| mUsers = new ArrayList<>(); | |||||
| mUsers.add(defaultUser); | |||||
| mBodyFatUserBeans = new ArrayList<>(); | |||||
| mBodyFatUserBeans.add(defaultBodyFatUserBean); | |||||
| mUserlogList = new ArrayList<>(); | mUserlogList = new ArrayList<>(); | ||||
| mUserlogList.add(defaultUser.toString()); | |||||
| mUserlogList.add(defaultBodyFatUserBean.toString()); | |||||
| userAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mUserlogList); | userAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mUserlogList); | ||||
| userlistView.setAdapter(userAdapter); | userlistView.setAdapter(userAdapter); | ||||
| } | } | ||||
| private User getdefault() { | |||||
| User user = new User(); | |||||
| user.setModeType(BodyFatDataUtil.MODE_ORDINARY); | |||||
| user.setSex(BodyFatDataUtil.SEX_MAN); | |||||
| user.setAge(18); | |||||
| user.setHeight(170); | |||||
| user.setAdc(560); | |||||
| user.setWeight(50); | |||||
| user.setId(1); | |||||
| return user; | |||||
| private BodyFatUserBean getdefault() { | |||||
| BodyFatUserBean bodyFatUserBean = new BodyFatUserBean(); | |||||
| bodyFatUserBean.setModeType(BodyFatDataUtil.MODE_ORDINARY); | |||||
| bodyFatUserBean.setSex(BodyFatDataUtil.SEX_MAN); | |||||
| bodyFatUserBean.setAge(18); | |||||
| bodyFatUserBean.setHeight(170); | |||||
| bodyFatUserBean.setAdc(560); | |||||
| bodyFatUserBean.setWeight(50); | |||||
| bodyFatUserBean.setId(1); | |||||
| return bodyFatUserBean; | |||||
| } | } | ||||
| private void setUnitinit() { | private void setUnitinit() { | ||||
| if (status == BodyFatDataUtil.WEIGHT_RESULT) { | if (status == BodyFatDataUtil.WEIGHT_RESULT) { | ||||
| //稳定体重 | //稳定体重 | ||||
| selectUser.setWeight(weight); | |||||
| mSelectBodyFatUserBean.setWeight(weight); | |||||
| mMHandler.sendEmptyMessage(TO_REFRE_USER); | mMHandler.sendEmptyMessage(TO_REFRE_USER); | ||||
| } | } | ||||
| case BodyFatDataUtil.TEST_FINISH: | case BodyFatDataUtil.TEST_FINISH: | ||||
| mlogList.add(0, "测量状态:" + status + " 测量完成"); | mlogList.add(0, "测量状态:" + status + " 测量完成"); | ||||
| if (bodyFatBleUtilsData != null) { | if (bodyFatBleUtilsData != null) { | ||||
| bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().updataPresentUser(selectUser)); | |||||
| bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().updataPresentUser(mSelectBodyFatUserBean)); | |||||
| } | } | ||||
| break; | break; | ||||
| case BodyFatDataUtil.MUC_REQUEST_USER_INFO: | case BodyFatDataUtil.MUC_REQUEST_USER_INFO: | ||||
| mlogList.add(0, "测量状态:" + status + "请求用户信息"); | mlogList.add(0, "测量状态:" + status + "请求用户信息"); | ||||
| if (bodyFatBleUtilsData != null) { | if (bodyFatBleUtilsData != null) { | ||||
| bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().setUserInfo(selectUser, BleDeviceConfig.WEIGHT_BODY_FAT_SCALE)); | |||||
| bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().setUserInfo(mSelectBodyFatUserBean, BleDeviceConfig.WEIGHT_BODY_FAT_SCALE)); | |||||
| } | } | ||||
| break; | break; | ||||
| default: | default: | ||||
| @Override | @Override | ||||
| public void onAdc(int adc, int algorithmic) { | public void onAdc(int adc, int algorithmic) { | ||||
| mlogList.add(0, "阻抗:" + adc + " 算法位:" + algorithmic); | mlogList.add(0, "阻抗:" + adc + " 算法位:" + algorithmic); | ||||
| selectUser.setAdc(adc); | |||||
| mSelectBodyFatUserBean.setAdc(adc); | |||||
| mMHandler.sendEmptyMessage(TO_REFRE_USER); | mMHandler.sendEmptyMessage(TO_REFRE_USER); | ||||
| mMHandler.sendEmptyMessage(ToRefreUi); | mMHandler.sendEmptyMessage(ToRefreUi); | ||||
| } | } | ||||
| @Override | @Override | ||||
| public void onClick(View v) { | public void onClick(View v) { | ||||
| int id = v.getId(); | int id = v.getId(); | ||||
| switch (id) { | |||||
| case R.id.history: | |||||
| if (bodyFatBleUtilsData != null) | |||||
| bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().requestSynHistory()); | |||||
| break; | |||||
| case R.id.user: | |||||
| if (!mEditText.getText().toString().trim().isEmpty()) { | |||||
| int userid = Integer.parseInt(mEditText.getText().toString().trim()); | |||||
| if (mUsers.size() >= userid) { | |||||
| selectUser = mUsers.get(userid - 1); | |||||
| if (bodyFatBleUtilsData != null) { | |||||
| bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().updataPresentUser(selectUser)); | |||||
| } | |||||
| if (id == R.id.history) { | |||||
| if (bodyFatBleUtilsData != null) | |||||
| bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().requestSynHistory()); | |||||
| } else if (id == R.id.btnUser) { | |||||
| if (!mEditText.getText().toString().trim().isEmpty()) { | |||||
| int userid = Integer.parseInt(mEditText.getText().toString().trim()); | |||||
| if (mBodyFatUserBeans.size() >= userid) { | |||||
| mSelectBodyFatUserBean = mBodyFatUserBeans.get(userid - 1); | |||||
| if (bodyFatBleUtilsData != null) { | |||||
| bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().updataPresentUser(mSelectBodyFatUserBean)); | |||||
| } | } | ||||
| } | } | ||||
| break; | |||||
| case R.id.userlist: | |||||
| for (User mUser : mUsers) { | |||||
| if (bodyFatBleUtilsData != null) | |||||
| bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().setUserInfoList(mUser)); | |||||
| } | |||||
| } | |||||
| } else if (id == R.id.userlist) { | |||||
| for (BodyFatUserBean mBodyFatUserBean : mBodyFatUserBeans) { | |||||
| if (bodyFatBleUtilsData != null) | if (bodyFatBleUtilsData != null) | ||||
| bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().updateUsersComplete()); | |||||
| break; | |||||
| case R.id.adduser: | |||||
| AddUserDialog addUserDialog = new AddUserDialog(new AddUserDialog.OnDialogListener() { | |||||
| @Override | |||||
| public void tvSucceedListener(User user) { | |||||
| user.setId(mUsers.size() + 1); | |||||
| mUsers.add(user); | |||||
| mUserlogList.add(user.toString()); | |||||
| userAdapter.notifyDataSetChanged(); | |||||
| } | |||||
| }); | |||||
| addUserDialog.show(getSupportFragmentManager()); | |||||
| break; | |||||
| case R.id.syntime: | |||||
| if (bodyFatBleUtilsData != null) { | |||||
| SendBleBean sendBleBean = BodyFatDataUtil.getInstance().synSysTime(); | |||||
| Log.e("time", BleStrUtils.byte2HexStr(sendBleBean.getHex())); | |||||
| bodyFatBleUtilsData.sendData(sendBleBean); | |||||
| bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().setUserInfoList(mBodyFatUserBean)); | |||||
| } | |||||
| if (bodyFatBleUtilsData != null) | |||||
| bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().updateUsersComplete()); | |||||
| } else if (id == R.id.adduser) { | |||||
| AddUserDialog addUserDialog = new AddUserDialog(new AddUserDialog.OnDialogListener() { | |||||
| @Override | |||||
| public void tvSucceedListener(UserBean user) { | |||||
| user.setId(mBodyFatUserBeans.size() + 1); | |||||
| mBodyFatUserBeans.add(getBodyFatUserBean(user)); | |||||
| mUserlogList.add(user.toString()); | |||||
| userAdapter.notifyDataSetChanged(); | |||||
| } | } | ||||
| break; | |||||
| }); | |||||
| addUserDialog.show(getSupportFragmentManager()); | |||||
| } else if (id == R.id.syntime) { | |||||
| if (bodyFatBleUtilsData != null) { | |||||
| SendBleBean sendBleBean = BodyFatDataUtil.getInstance().synSysTime(); | |||||
| Log.e("time", BleStrUtils.byte2HexStr(sendBleBean.getHex())); | |||||
| bodyFatBleUtilsData.sendData(sendBleBean); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| private BodyFatUserBean getBodyFatUserBean(UserBean userBean) { | |||||
| BodyFatUserBean bean = new BodyFatUserBean(); | |||||
| if (userBean.getSex() == UserBean.SEX_MAN) { | |||||
| bean.setSex(BodyFatDataUtil.SEX_MAN); | |||||
| } else { | |||||
| bean.setSex(BodyFatDataUtil.SEX_FEMAN); | |||||
| } | |||||
| if (userBean.getModeType() == UserBean.MODE_ATHLETE) { | |||||
| bean.setModeType(BodyFatDataUtil.MODE_ATHLETE); | |||||
| } else if (userBean.getModeType() == UserBean.MODE_PREGNANT) { | |||||
| bean.setModeType(BodyFatDataUtil.MODE_PREGNANT); | |||||
| } else { | |||||
| bean.setModeType(BodyFatDataUtil.MODE_ORDINARY); | |||||
| } | |||||
| bean.setId(userBean.getId()); | |||||
| bean.setAge(userBean.getAge()); | |||||
| bean.setHeight(userBean.getHeight()); | |||||
| bean.setWeight(userBean.getWeight()); | |||||
| bean.setAdc(userBean.getAdc()); | |||||
| return bean; | |||||
| } | |||||
| private final int ToRefreUi = 300; | private final int ToRefreUi = 300; | ||||
| private final int TO_REFRE_USER = 301; | private final int TO_REFRE_USER = 301; | ||||
| case TO_REFRE_USER: | case TO_REFRE_USER: | ||||
| if (userAdapter != null) { | if (userAdapter != null) { | ||||
| mUserlogList.clear(); | mUserlogList.clear(); | ||||
| if (mUsers!=null) { | |||||
| for (User user : mUsers) { | |||||
| mUserlogList.add(user.toString()); | |||||
| if (mBodyFatUserBeans !=null) { | |||||
| for (BodyFatUserBean bodyFatUserBean : mBodyFatUserBeans) { | |||||
| mUserlogList.add(bodyFatUserBean.toString()); | |||||
| } | } | ||||
| } | } | ||||
| userAdapter.notifyDataSetChanged(); | userAdapter.notifyDataSetChanged(); |
| package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||||
| import android.app.AlertDialog; | |||||
| import android.content.DialogInterface; | |||||
| import android.content.Intent; | |||||
| import android.content.pm.ActivityInfo; | |||||
| import android.content.pm.PackageManager; | |||||
| import android.location.LocationManager; | |||||
| import android.os.Build; | |||||
| import android.os.Bundle; | |||||
| import android.provider.Settings; | |||||
| import android.util.Log; | |||||
| import android.view.View; | |||||
| import android.widget.ArrayAdapter; | |||||
| import android.widget.Button; | |||||
| import android.widget.CompoundButton; | |||||
| import android.widget.EditText; | |||||
| import android.widget.ListView; | |||||
| import android.widget.RadioButton; | |||||
| import androidx.annotation.Nullable; | |||||
| import androidx.appcompat.app.AppCompatActivity; | |||||
| import androidx.core.app.ActivityCompat; | |||||
| import androidx.core.content.ContextCompat; | |||||
| import org.json.JSONArray; | |||||
| import org.json.JSONException; | |||||
| import org.json.JSONObject; | |||||
| import java.io.ByteArrayOutputStream; | |||||
| import java.io.IOException; | |||||
| import java.io.InputStream; | |||||
| import java.net.HttpURLConnection; | |||||
| import java.net.URL; | |||||
| import java.text.SimpleDateFormat; | |||||
| import java.util.ArrayList; | |||||
| import java.util.List; | |||||
| import java.util.Locale; | |||||
| import cn.net.aicare.modulelibrary.module.wifi.WifiConfig; | |||||
| import cn.net.aicare.modulelibrary.module.wifi.WifiUtils; | |||||
| /** | |||||
| * wifi配置界面 | |||||
| */ | |||||
| public class WifiConfigActivity extends AppCompatActivity implements View.OnClickListener, WifiUtils.OnWifiEventListener { | |||||
| private String TAG = WifiConfigActivity.class.getName(); | |||||
| private EditText ssid, paw, key, sn, devicename; | |||||
| private ListView mListView; | |||||
| private ArrayAdapter logadapter; | |||||
| private List<String> loglist; | |||||
| private Button btn_connect; | |||||
| private Button btn_weight_result; | |||||
| private WifiUtils mWifiUtils; | |||||
| private Button btn_getdeviceid; | |||||
| private Button btn_login; | |||||
| private Button get_record; | |||||
| private String SN; | |||||
| private String myDeviceId; | |||||
| private String token; | |||||
| private long appid; | |||||
| private List<Long> bodyId; | |||||
| private RadioButton kg, jing, stlb, lb; | |||||
| private String mDeviceName; | |||||
| @Override | |||||
| protected void onCreate(@Nullable Bundle savedInstanceState) { | |||||
| super.onCreate(savedInstanceState); | |||||
| setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//禁止横屏 | |||||
| setContentView(R.layout.activity_wifi_config); | |||||
| ssid = findViewById(R.id.ssid); | |||||
| paw = findViewById(R.id.password); | |||||
| key = findViewById(R.id.key); | |||||
| btn_getdeviceid = findViewById(R.id.deviceid); | |||||
| btn_weight_result = findViewById(R.id.weight_result); | |||||
| get_record = findViewById(R.id.get_record); | |||||
| mListView = findViewById(R.id.log_list); | |||||
| btn_connect = findViewById(R.id.btn_connect); | |||||
| btn_login = findViewById(R.id.btn_login); | |||||
| sn = findViewById(R.id.sn); | |||||
| devicename = findViewById(R.id.device_name); | |||||
| btn_login.setOnClickListener(this); | |||||
| btn_weight_result.setOnClickListener(this); | |||||
| btn_connect.setOnClickListener(this); | |||||
| btn_getdeviceid.setOnClickListener(this); | |||||
| get_record.setOnClickListener(this); | |||||
| findViewById(R.id.clear_log).setOnClickListener(this); | |||||
| findViewById(R.id.clear_record).setOnClickListener(this); | |||||
| loglist = new ArrayList<>(); | |||||
| logadapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, loglist); | |||||
| mListView.setAdapter(logadapter); | |||||
| mWifiUtils = new WifiUtils(this, this); | |||||
| mWifiUtils.setLoopSendEnable(false); | |||||
| mWifiUtils.setInterval(5); | |||||
| ssid.setText(mWifiUtils.getSsidstring() == null ? "Elink-wif" : mWifiUtils.getSsidstring().replace("\"", "")); | |||||
| paw.setText("elink1234567890"); | |||||
| key.setText("1234567812345678"); | |||||
| sn.setText("574d0868174f882078a5784b1f8d48"); | |||||
| devicename.setText("wifi秤"); | |||||
| bodyId = new ArrayList<>(); | |||||
| kg = findViewById(R.id.kg); | |||||
| jing = findViewById(R.id.jin); | |||||
| stlb = findViewById(R.id.st_lb); | |||||
| lb = findViewById(R.id.lb); | |||||
| kg.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||||
| @Override | |||||
| public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | |||||
| if (isChecked) { | |||||
| new Thread(new Runnable() { | |||||
| @Override | |||||
| public void run() { | |||||
| try { | |||||
| setUnit(WifiConfig.KG); | |||||
| } catch (Throwable throwable) { | |||||
| throwable.printStackTrace(); | |||||
| } | |||||
| } | |||||
| }).start(); | |||||
| } | |||||
| } | |||||
| }); | |||||
| jing.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||||
| @Override | |||||
| public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | |||||
| if (isChecked) { | |||||
| new Thread(new Runnable() { | |||||
| @Override | |||||
| public void run() { | |||||
| try { | |||||
| setUnit(WifiConfig.JIN); | |||||
| } catch (Throwable throwable) { | |||||
| throwable.printStackTrace(); | |||||
| } | |||||
| } | |||||
| }).start(); | |||||
| } | |||||
| } | |||||
| }); | |||||
| stlb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||||
| @Override | |||||
| public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | |||||
| if (isChecked) { | |||||
| new Thread(new Runnable() { | |||||
| @Override | |||||
| public void run() { | |||||
| try { | |||||
| setUnit(WifiConfig.ST); | |||||
| } catch (Throwable throwable) { | |||||
| throwable.printStackTrace(); | |||||
| } | |||||
| } | |||||
| }).start(); | |||||
| } | |||||
| } | |||||
| }); | |||||
| lb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||||
| @Override | |||||
| public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | |||||
| if (isChecked) { | |||||
| new Thread(new Runnable() { | |||||
| @Override | |||||
| public void run() { | |||||
| try { | |||||
| setUnit(WifiConfig.LB); | |||||
| } catch (Throwable throwable) { | |||||
| throwable.printStackTrace(); | |||||
| } | |||||
| } | |||||
| }).start(); | |||||
| } | |||||
| } | |||||
| }); | |||||
| } | |||||
| @Override | |||||
| public void onClick(View v) { | |||||
| if (v.getId() == R.id.btn_connect) { | |||||
| if (mWifiUtils.getRunning() == 0) { | |||||
| btn_connect.setText("停止"); | |||||
| mWifiUtils.startSendData(ssid.getText().toString().trim(), paw.getText().toString().trim(), key.getText().toString().trim()); | |||||
| } else { | |||||
| mWifiUtils.end(); | |||||
| btn_connect.setText("开始配网"); | |||||
| } | |||||
| } else if (v.getId() == R.id.deviceid) { | |||||
| SN = sn.getText().toString().trim(); | |||||
| mDeviceName = devicename.getText().toString().trim(); | |||||
| if (appid != 0 && token != null && !SN.isEmpty() && !mDeviceName.isEmpty()) { | |||||
| new Thread(new Runnable() { | |||||
| @Override | |||||
| public void run() { | |||||
| try { | |||||
| getDeviceid(); | |||||
| } catch (Throwable throwable) { | |||||
| throwable.printStackTrace(); | |||||
| } | |||||
| } | |||||
| }).start(); | |||||
| } else { | |||||
| if (appid == 0 || token == null) { | |||||
| loglist.add(0, "未登录"); | |||||
| } | |||||
| if (SN.isEmpty()) { | |||||
| loglist.add(0, "没有SN号"); | |||||
| } | |||||
| if (mDeviceName.isEmpty()) { | |||||
| loglist.add(0, "没有设备名称"); | |||||
| } | |||||
| } | |||||
| logadapter.notifyDataSetChanged(); | |||||
| } else if (v.getId() == R.id.weight_result) { | |||||
| if (appid != 0 && token != null && myDeviceId != null) { | |||||
| new Thread(new Runnable() { | |||||
| @Override | |||||
| public void run() { | |||||
| try { | |||||
| getWeight(appid, token, myDeviceId); | |||||
| } catch (Throwable throwable) { | |||||
| throwable.printStackTrace(); | |||||
| } | |||||
| } | |||||
| }).start(); | |||||
| } else { | |||||
| if (appid == 0 || token == null) { | |||||
| loglist.add(0, "未登录"); | |||||
| } | |||||
| if (myDeviceId == null) { | |||||
| loglist.add(0, "没有得到设备Id"); | |||||
| } | |||||
| } | |||||
| logadapter.notifyDataSetChanged(); | |||||
| } else if (v.getId() == R.id.btn_login) { | |||||
| new Thread(new Runnable() { | |||||
| @Override | |||||
| public void run() { | |||||
| try { | |||||
| login(); | |||||
| } catch (Throwable throwable) { | |||||
| throwable.printStackTrace(); | |||||
| } | |||||
| } | |||||
| }).start(); | |||||
| } else if (v.getId() == R.id.clear_log) { | |||||
| loglist.clear(); | |||||
| logadapter.notifyDataSetChanged(); | |||||
| } else if (v.getId() == R.id.clear_record) { | |||||
| if (bodyId.size() != 0) { | |||||
| new Thread(new Runnable() { | |||||
| @Override | |||||
| public void run() { | |||||
| for (int i = 0; i < bodyId.size(); i++) { | |||||
| try { | |||||
| delRecord(bodyId.get(i)); | |||||
| } catch (Throwable throwable) { | |||||
| throwable.printStackTrace(); | |||||
| } | |||||
| } | |||||
| } | |||||
| }).start(); | |||||
| } else { | |||||
| loglist.add(0, "没有BodyFatId"); | |||||
| logadapter.notifyDataSetChanged(); | |||||
| } | |||||
| } else if (v.getId() == R.id.get_record) { | |||||
| new Thread(new Runnable() { | |||||
| @Override | |||||
| public void run() { | |||||
| try { | |||||
| getTestRecord(); | |||||
| } catch (Throwable throwable) { | |||||
| throwable.printStackTrace(); | |||||
| } | |||||
| } | |||||
| }).start(); | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public void onEvent(int code) { | |||||
| runOnUiThread(new Runnable() { | |||||
| @Override | |||||
| public void run() { | |||||
| switch (code) { | |||||
| case WifiConfig.KEY_ILLEGAL: | |||||
| loglist.add(0, "加密key非法"); | |||||
| break; | |||||
| case WifiConfig.ERROR_EXCEPTIONAL: | |||||
| loglist.add(0, "异常"); | |||||
| break; | |||||
| case WifiConfig.INFORMATION_SUCCESSFUL: | |||||
| loglist.add(0, "生成数据类info 成功"); | |||||
| break; | |||||
| case WifiConfig.DEVICE_CONNECTION_SUCCESSFUL: | |||||
| mWifiUtils.end(); | |||||
| loglist.add(0, "设备联网成功成功"); | |||||
| btn_connect.setText("开始配网"); | |||||
| //调取登录 通过SN号去获取deviceId | |||||
| break; | |||||
| case WifiConfig.START_SEND_DATA: | |||||
| loglist.add(0, "开始发送加密包"); | |||||
| break; | |||||
| case WifiConfig.ERROR_START_SEND_DATA: | |||||
| loglist.add(0, "开始发送加密包,出错"); | |||||
| break; | |||||
| case WifiConfig.START_RECEIVE_DATA: | |||||
| loglist.add(0, "开始接收设备数据"); | |||||
| break; | |||||
| case WifiConfig.ERROR_START_RECEIVE_DATA: | |||||
| loglist.add(0, "开始接收设备数据,出错"); | |||||
| break; | |||||
| case WifiConfig.SSID_KEY_NULL: | |||||
| loglist.add(0, "ssid为空或key为空"); | |||||
| break; | |||||
| } | |||||
| logadapter.notifyDataSetChanged(); | |||||
| } | |||||
| }); | |||||
| } | |||||
| @Override | |||||
| protected void onDestroy() { | |||||
| super.onDestroy(); | |||||
| mWifiUtils.onDestory(); | |||||
| } | |||||
| public void login() throws Throwable { | |||||
| URL uri = new URL("http://test.ailink.app.aicare.net.cn/api/user/login?key=inet_elink&username=dhls@qq.com&password=dc483e80a7a0bd9ef71d8cf973673924"); | |||||
| HttpURLConnection httpURLConnection = (HttpURLConnection) uri.openConnection(); | |||||
| // Post请求必须设置允许输出 | |||||
| httpURLConnection.setDoOutput(true); | |||||
| // Post请求不能使用缓存 | |||||
| httpURLConnection.setUseCaches(false); | |||||
| // 设置为Post请求 | |||||
| httpURLConnection.setRequestMethod("POST"); | |||||
| httpURLConnection.setInstanceFollowRedirects(true); | |||||
| // 配置请求Content-Type | |||||
| httpURLConnection.setRequestProperty("Content-Type", | |||||
| "application/x-www-form-urlencode"); | |||||
| // 设置连接超时时间 | |||||
| httpURLConnection.setConnectTimeout(6 * 1000); | |||||
| // 开始连接 | |||||
| httpURLConnection.connect(); | |||||
| // DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream()); | |||||
| // dos.write(map.toString().getBytes()); | |||||
| // dos.flush(); | |||||
| // dos.close(); | |||||
| // 判断请求是否成功 | |||||
| if (httpURLConnection.getResponseCode() == 200) { | |||||
| // 获取返回的数据 | |||||
| byte[] data = readInputStream(httpURLConnection.getInputStream()); | |||||
| String result = new String(data, "UTF-8"); | |||||
| Log.i(TAG, result); | |||||
| JSONObject jsonObject = new JSONObject(result); | |||||
| JSONObject datajson = jsonObject.getJSONObject("data"); | |||||
| runOnUiThread(new Runnable() { | |||||
| @Override | |||||
| public void run() { | |||||
| try { | |||||
| token = jsonObject.getString("token"); | |||||
| appid = datajson.getLong("appUserId"); | |||||
| loglist.add(0, "登录成功"); | |||||
| logadapter.notifyDataSetChanged(); | |||||
| } catch (JSONException e) { | |||||
| e.printStackTrace(); | |||||
| } | |||||
| } | |||||
| }); | |||||
| } else { | |||||
| Log.i(TAG, "Post方式请求失败"); | |||||
| runOnUiThread(new Runnable() { | |||||
| @Override | |||||
| public void run() { | |||||
| loglist.add(0, "登录失败"); | |||||
| } | |||||
| }); | |||||
| } | |||||
| } | |||||
| public void getWeight(long appid, String token, String deviceId) throws Throwable { | |||||
| StringBuilder stringBuilder = new StringBuilder(); | |||||
| stringBuilder.append("http://test.ailink.app.aicare.net.cn/api/BFScale/list?key=inet_elink&appUserId="); | |||||
| stringBuilder.append(appid); | |||||
| stringBuilder.append("&token="); | |||||
| stringBuilder.append(token); | |||||
| stringBuilder.append("&deviceId="); | |||||
| stringBuilder.append(deviceId); | |||||
| stringBuilder.append("&subUserId=1&maxId=0"); | |||||
| URL uri = new URL(stringBuilder.toString()); | |||||
| HttpURLConnection httpURLConnection = (HttpURLConnection) uri.openConnection(); | |||||
| // // Post请求必须设置允许输出 | |||||
| // httpURLConnection.setDoOutput(true); | |||||
| // // Post请求不能使用缓存 | |||||
| // httpURLConnection.setUseCaches(false); | |||||
| // 设置为Post请求 | |||||
| // httpURLConnection.setRequestMethod("GET"); | |||||
| // httpURLConnection.setInstanceFollowRedirects(true); | |||||
| // // 配置请求Content-Type | |||||
| // httpURLConnection.setRequestProperty("Content-Type", | |||||
| // "application/x-www-form-urlencode"); | |||||
| // 设置连接超时时间 | |||||
| httpURLConnection.setConnectTimeout(6 * 1000); | |||||
| // 开始连接 | |||||
| httpURLConnection.connect(); | |||||
| // DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream()); | |||||
| // dos.write(map.toString().getBytes()); | |||||
| // dos.flush(); | |||||
| // dos.close(); | |||||
| // 判断请求是否成功 | |||||
| if (httpURLConnection.getResponseCode() == 200) { | |||||
| // 获取返回的数据 | |||||
| byte[] data = readInputStream(httpURLConnection.getInputStream()); | |||||
| String result = new String(data, "UTF-8"); | |||||
| JSONObject jsonObject = new JSONObject(result); | |||||
| JSONArray datajson = jsonObject.getJSONArray("data"); | |||||
| bodyId.clear(); | |||||
| for (int i = 0; i < datajson.length(); i++) { | |||||
| bodyId.add(datajson.getJSONObject(i).getLong("bodyFatId")); | |||||
| } | |||||
| Log.i(TAG, result); | |||||
| runOnUiThread(new Runnable() { | |||||
| @Override | |||||
| public void run() { | |||||
| loglist.add(0, result); | |||||
| logadapter.notifyDataSetChanged(); | |||||
| loglist.add(0, "总共有:" + bodyId.size()); | |||||
| logadapter.notifyDataSetChanged(); | |||||
| } | |||||
| }); | |||||
| } else { | |||||
| runOnUiThread(new Runnable() { | |||||
| @Override | |||||
| public void run() { | |||||
| loglist.add(0, "请求失败"); | |||||
| logadapter.notifyDataSetChanged(); | |||||
| } | |||||
| }); | |||||
| } | |||||
| } | |||||
| public void getDeviceid() throws Throwable { | |||||
| StringBuilder stringBuilder = new StringBuilder(); | |||||
| stringBuilder.append("http://test.ailink.app.aicare.net.cn/api/device/getDeviceBySN?key=inet_elink&appUserId="); | |||||
| stringBuilder.append(appid); | |||||
| stringBuilder.append("&token="); | |||||
| stringBuilder.append(token); | |||||
| stringBuilder.append("&deviceSN="); | |||||
| stringBuilder.append(SN); | |||||
| Log.e(TAG, stringBuilder.toString()); | |||||
| URL uri = new URL(stringBuilder.toString()); | |||||
| HttpURLConnection httpURLConnection = (HttpURLConnection) uri.openConnection(); | |||||
| // Post请求必须设置允许输出 | |||||
| httpURLConnection.setDoOutput(true); | |||||
| // Post请求不能使用缓存 | |||||
| httpURLConnection.setUseCaches(false); | |||||
| // 设置为Post请求 | |||||
| httpURLConnection.setRequestMethod("POST"); | |||||
| httpURLConnection.setInstanceFollowRedirects(true); | |||||
| // 配置请求Content-Type | |||||
| httpURLConnection.setRequestProperty("Content-Type", | |||||
| "application/x-www-form-urlencode"); | |||||
| // 设置连接超时时间 | |||||
| httpURLConnection.setConnectTimeout(6 * 1000); | |||||
| // 开始连接 | |||||
| httpURLConnection.connect(); | |||||
| // DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream()); | |||||
| // dos.write(map.toString().getBytes()); | |||||
| // dos.flush(); | |||||
| // dos.close(); | |||||
| // 判断请求是否成功 | |||||
| if (httpURLConnection.getResponseCode() == 200) { | |||||
| // 获取返回的数据 | |||||
| byte[] data = readInputStream(httpURLConnection.getInputStream()); | |||||
| String result = new String(data, "UTF-8"); | |||||
| Log.i(TAG, result); | |||||
| JSONObject jsonObject = new JSONObject(result); | |||||
| JSONArray datajson = jsonObject.getJSONArray("data"); | |||||
| runOnUiThread(new Runnable() { | |||||
| @Override | |||||
| public void run() { | |||||
| try { | |||||
| if (datajson.length() > 0) | |||||
| myDeviceId = datajson.getJSONObject(0).getString("deviceId"); | |||||
| loglist.add(0, "设备信息" + result); | |||||
| logadapter.notifyDataSetChanged(); | |||||
| } catch (JSONException e) { | |||||
| e.printStackTrace(); | |||||
| } | |||||
| } | |||||
| }); | |||||
| bindDevice(); | |||||
| } else { | |||||
| Log.i(TAG, "Post方式请求失败"); | |||||
| } | |||||
| } | |||||
| public void bindDevice() throws Throwable { | |||||
| StringBuilder stringBuilder = new StringBuilder(); | |||||
| stringBuilder.append("http://test.ailink.app.aicare.net.cn/api/device/update?key=inet_elink&appUserId="); | |||||
| stringBuilder.append(appid); | |||||
| stringBuilder.append("&token="); | |||||
| stringBuilder.append(token); | |||||
| stringBuilder.append("&deviceId="); | |||||
| stringBuilder.append(myDeviceId); | |||||
| stringBuilder.append("&roomId=4326&deviceName="); | |||||
| stringBuilder.append(mDeviceName); | |||||
| URL uri = new URL(stringBuilder.toString()); | |||||
| HttpURLConnection httpURLConnection = (HttpURLConnection) uri.openConnection(); | |||||
| // Post请求必须设置允许输出 | |||||
| httpURLConnection.setDoOutput(true); | |||||
| // Post请求不能使用缓存 | |||||
| httpURLConnection.setUseCaches(false); | |||||
| // 设置为Post请求 | |||||
| httpURLConnection.setRequestMethod("POST"); | |||||
| httpURLConnection.setInstanceFollowRedirects(true); | |||||
| // 配置请求Content-Type | |||||
| httpURLConnection.setRequestProperty("Content-Type", | |||||
| "application/x-www-form-urlencode"); | |||||
| // 设置连接超时时间 | |||||
| httpURLConnection.setConnectTimeout(6 * 1000); | |||||
| // 开始连接 | |||||
| httpURLConnection.connect(); | |||||
| // DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream()); | |||||
| // dos.write(map.toString().getBytes()); | |||||
| // dos.flush(); | |||||
| // dos.close(); | |||||
| // 判断请求是否成功 | |||||
| if (httpURLConnection.getResponseCode() == 200) { | |||||
| // 获取返回的数据 | |||||
| byte[] data = readInputStream(httpURLConnection.getInputStream()); | |||||
| String result = new String(data, "UTF-8"); | |||||
| Log.i(TAG, result); | |||||
| runOnUiThread(new Runnable() { | |||||
| @Override | |||||
| public void run() { | |||||
| loglist.add(0, "绑定设备" + result); | |||||
| logadapter.notifyDataSetChanged(); | |||||
| } | |||||
| }); | |||||
| } else { | |||||
| runOnUiThread(new Runnable() { | |||||
| @Override | |||||
| public void run() { | |||||
| loglist.add(0, "绑定设备失败"); | |||||
| logadapter.notifyDataSetChanged(); | |||||
| } | |||||
| }); | |||||
| } | |||||
| } | |||||
| public void delRecord(Long bodyid) throws Throwable { | |||||
| StringBuilder stringBuilder = new StringBuilder(); | |||||
| stringBuilder.append("http://test.ailink.app.aicare.net.cn/api/BFScale/delete?key=inet_elink&appUserId="); | |||||
| stringBuilder.append(appid); | |||||
| stringBuilder.append("&token="); | |||||
| stringBuilder.append(token); | |||||
| stringBuilder.append("&bodyFatId="); | |||||
| stringBuilder.append(bodyid); | |||||
| stringBuilder.append(""); | |||||
| URL uri = new URL(stringBuilder.toString()); | |||||
| HttpURLConnection httpURLConnection = (HttpURLConnection) uri.openConnection(); | |||||
| // Post请求必须设置允许输出 | |||||
| httpURLConnection.setDoOutput(true); | |||||
| // Post请求不能使用缓存 | |||||
| httpURLConnection.setUseCaches(false); | |||||
| // 设置为Post请求 | |||||
| httpURLConnection.setRequestMethod("POST"); | |||||
| httpURLConnection.setInstanceFollowRedirects(true); | |||||
| // 配置请求Content-Type | |||||
| httpURLConnection.setRequestProperty("Content-Type", | |||||
| "application/x-www-form-urlencode"); | |||||
| // 设置连接超时时间 | |||||
| httpURLConnection.setConnectTimeout(6 * 1000); | |||||
| // 开始连接 | |||||
| httpURLConnection.connect(); | |||||
| // DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream()); | |||||
| // dos.write(map.toString().getBytes()); | |||||
| // dos.flush(); | |||||
| // dos.close(); | |||||
| // 判断请求是否成功 | |||||
| if (httpURLConnection.getResponseCode() == 200) { | |||||
| // 获取返回的数据 | |||||
| byte[] data = readInputStream(httpURLConnection.getInputStream()); | |||||
| String result = new String(data, "UTF-8"); | |||||
| Log.i(TAG, result); | |||||
| runOnUiThread(new Runnable() { | |||||
| @Override | |||||
| public void run() { | |||||
| loglist.add(0, result); | |||||
| logadapter.notifyDataSetChanged(); | |||||
| } | |||||
| }); | |||||
| } else { | |||||
| runOnUiThread(new Runnable() { | |||||
| @Override | |||||
| public void run() { | |||||
| loglist.add(0, "请求失败"); | |||||
| logadapter.notifyDataSetChanged(); | |||||
| } | |||||
| }); | |||||
| } | |||||
| } | |||||
| public byte[] readInputStream(InputStream inputStream) throws IOException { | |||||
| byte[] buffer = new byte[1024]; | |||||
| int len = 0; | |||||
| ByteArrayOutputStream bos = new ByteArrayOutputStream(); | |||||
| while ((len = inputStream.read(buffer)) != -1) { | |||||
| bos.write(buffer, 0, len); | |||||
| } | |||||
| bos.close(); | |||||
| return bos.toByteArray(); | |||||
| } | |||||
| public void setUnit(int unit) throws Throwable { | |||||
| if (appid == 0 || token == null || SN == null || SN.isEmpty() || mDeviceName == null || mDeviceName.isEmpty()) { | |||||
| runOnUiThread(new Runnable() { | |||||
| @Override | |||||
| public void run() { | |||||
| loglist.add(0, "请先登录,然后获取设备id"); | |||||
| logadapter.notifyDataSetChanged(); | |||||
| } | |||||
| }); | |||||
| return; | |||||
| } | |||||
| StringBuilder stringBuilder = new StringBuilder(); | |||||
| // http://test.ailink.app.aicare.net.cn/api/device/update?key=inet_elink&appUserId=10429&token=57dce920-8521-42e9-9040-157d08c7d922&deviceId=3001&roomId=4326&deviceName=WIFI秤测试&deviceUnit=1 | |||||
| stringBuilder.append("http://test.ailink.app.aicare.net.cn/api/device/update?key=inet_elink&appUserId="); | |||||
| stringBuilder.append(appid); | |||||
| stringBuilder.append("&token="); | |||||
| stringBuilder.append(token); | |||||
| stringBuilder.append("&deviceId="); | |||||
| stringBuilder.append(myDeviceId); | |||||
| stringBuilder.append("&roomId=4326&deviceName="); | |||||
| stringBuilder.append(mDeviceName); | |||||
| stringBuilder.append("&deviceUnit="); | |||||
| stringBuilder.append(unit); | |||||
| Log.e("设置单位", stringBuilder.toString()); | |||||
| URL uri = new URL(stringBuilder.toString()); | |||||
| HttpURLConnection httpURLConnection = (HttpURLConnection) uri.openConnection(); | |||||
| // Post请求必须设置允许输出 | |||||
| httpURLConnection.setDoOutput(true); | |||||
| // Post请求不能使用缓存 | |||||
| httpURLConnection.setUseCaches(false); | |||||
| // 设置为Post请求 | |||||
| httpURLConnection.setRequestMethod("POST"); | |||||
| httpURLConnection.setInstanceFollowRedirects(true); | |||||
| // 配置请求Content-Type | |||||
| httpURLConnection.setRequestProperty("Content-Type", | |||||
| "application/x-www-form-urlencode"); | |||||
| // 设置连接超时时间 | |||||
| httpURLConnection.setConnectTimeout(6 * 1000); | |||||
| // 开始连接 | |||||
| httpURLConnection.connect(); | |||||
| // DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream()); | |||||
| // dos.write(map.toString().getBytes()); | |||||
| // dos.flush(); | |||||
| // dos.close(); | |||||
| // 判断请求是否成功 | |||||
| if (httpURLConnection.getResponseCode() == 200) { | |||||
| // 获取返回的数据 | |||||
| byte[] data = readInputStream(httpURLConnection.getInputStream()); | |||||
| String result = new String(data, "UTF-8"); | |||||
| Log.i(TAG, result); | |||||
| runOnUiThread(new Runnable() { | |||||
| @Override | |||||
| public void run() { | |||||
| loglist.add(0, result); | |||||
| logadapter.notifyDataSetChanged(); | |||||
| } | |||||
| }); | |||||
| } else { | |||||
| runOnUiThread(new Runnable() { | |||||
| @Override | |||||
| public void run() { | |||||
| loglist.add(0, "请求失败"); | |||||
| logadapter.notifyDataSetChanged(); | |||||
| } | |||||
| }); | |||||
| } | |||||
| } | |||||
| public void getTestRecord() throws Throwable { | |||||
| StringBuilder stringBuilder = new StringBuilder(); | |||||
| stringBuilder.append("http://test.ailink.app.aicare.net.cn/api/deDataTest/getDeDataTestPage?key=inet_elink&appUserId="); | |||||
| stringBuilder.append(appid); | |||||
| stringBuilder.append("&token="); | |||||
| stringBuilder.append(token); | |||||
| stringBuilder.append("&maxId=0"); | |||||
| stringBuilder.append("&sortColumns="); | |||||
| stringBuilder.append("id desc"); | |||||
| Log.e(TAG, stringBuilder.toString()); | |||||
| URL uri = new URL(stringBuilder.toString()); | |||||
| HttpURLConnection httpURLConnection = (HttpURLConnection) uri.openConnection(); | |||||
| // // Post请求必须设置允许输出 | |||||
| // httpURLConnection.setDoOutput(true); | |||||
| // // Post请求不能使用缓存 | |||||
| // httpURLConnection.setUseCaches(false); | |||||
| // // 设置为Post请求 | |||||
| // httpURLConnection.setRequestMethod("POST"); | |||||
| // httpURLConnection.setInstanceFollowRedirects(true); | |||||
| // // 配置请求Content-Type | |||||
| // httpURLConnection.setRequestProperty("Content-Type", | |||||
| // "application/x-www-form-urlencode"); | |||||
| // 设置连接超时时间 | |||||
| httpURLConnection.setConnectTimeout(6 * 1000); | |||||
| // 开始连接 | |||||
| httpURLConnection.connect(); | |||||
| // DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream()); | |||||
| // dos.write(map.toString().getBytes()); | |||||
| // dos.flush(); | |||||
| // dos.close(); | |||||
| // 判断请求是否成功 | |||||
| if (httpURLConnection.getResponseCode() == 200) { | |||||
| // 获取返回的数据 | |||||
| byte[] data = readInputStream(httpURLConnection.getInputStream()); | |||||
| String result = new String(data, "UTF-8"); | |||||
| Log.i(TAG, result); | |||||
| JSONObject jsonObject = new JSONObject(result); | |||||
| JSONObject datajson = jsonObject.getJSONObject("data"); | |||||
| JSONArray listjson = datajson.getJSONArray("list"); | |||||
| StringBuffer stringBuffer = new StringBuffer(); | |||||
| for (int i = 0; i < listjson.length(); i++) { | |||||
| long id = listjson.getJSONObject(i).getLong("id"); | |||||
| // String createTime="数据时间 "+getDateDefault(listjson.getJSONObject(i).getLong("createTime")); | |||||
| String encryptData = "请求的加密值: " + listjson.getJSONObject(i).getString("encryptData"); | |||||
| // String decryptData = "解密结果: " + listjson.getJSONObject(i).getString("decryptData"); | |||||
| stringBuffer.append("id: "); | |||||
| stringBuffer.append(id); | |||||
| stringBuffer.append("\n"); | |||||
| stringBuffer.append(encryptData); | |||||
| stringBuffer.append("\n=================\n"); | |||||
| } | |||||
| runOnUiThread(new Runnable() { | |||||
| @Override | |||||
| public void run() { | |||||
| loglist.add(0, "测试数据\n" + stringBuffer.toString()); | |||||
| logadapter.notifyDataSetChanged(); | |||||
| } | |||||
| }); | |||||
| } else { | |||||
| } | |||||
| } | |||||
| public static String getDateDefault(Long time) { | |||||
| SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US); | |||||
| return simpleDateFormat.format(time); | |||||
| } | |||||
| public void getPermission() { | |||||
| String[] permissions = {android.Manifest.permission.ACCESS_COARSE_LOCATION,}; | |||||
| if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { | |||||
| //当前系统大于等于6.0 | |||||
| for (String perssion : permissions) { | |||||
| int isGranted = ContextCompat.checkSelfPermission(this, perssion); | |||||
| if (isGranted != PackageManager.PERMISSION_GRANTED) { | |||||
| ActivityCompat.requestPermissions(this, new String[]{perssion}, 1); | |||||
| } | |||||
| } | |||||
| LocationManager lm = (LocationManager) this.getSystemService(this.LOCATION_SERVICE); | |||||
| if (!lm.isProviderEnabled(LocationManager.GPS_PROVIDER)) { | |||||
| /*Toast.makeText(this, "检测到未开启GPS定位服务,需要开启才能扫描到附件WiFi信息,请开启", Toast.LENGTH_SHORT).show(); | |||||
| new Thread(new Runnable() { | |||||
| @Override | |||||
| public void run() { | |||||
| try { | |||||
| Thread.sleep(3 * 1000); //sleep s | |||||
| } catch (InterruptedException e) { | |||||
| e.printStackTrace(); | |||||
| } | |||||
| } | |||||
| }).start();*/ | |||||
| AlertDialog dialog = new AlertDialog.Builder(this) | |||||
| .setTitle("警告!") | |||||
| .setMessage("检测到未开启GPS定位服务,需要开启才能扫描到附件WiFi信息,请开启") | |||||
| .setPositiveButton("确定", new DialogInterface.OnClickListener() { | |||||
| @Override | |||||
| public void onClick(DialogInterface dialog, int which) { | |||||
| Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); | |||||
| startActivityForResult(intent, 1); | |||||
| } | |||||
| }).show(); | |||||
| } | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { | |||||
| switch (requestCode) { | |||||
| case 1: { | |||||
| // If request is cancelled, the result arrays are empty. | |||||
| if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { | |||||
| Log.d("Mainactivity", "onRequestPermissionsResult granted"); | |||||
| } else { | |||||
| Log.d("Mainactivity", "onRequestPermissionsResult denied"); | |||||
| AlertDialog dialog = new AlertDialog.Builder(this) | |||||
| .setTitle("警告!") | |||||
| .setMessage("需要授予定位权限才能扫描到附件WiFi信息") | |||||
| .setPositiveButton("确定", new DialogInterface.OnClickListener() { | |||||
| @Override | |||||
| public void onClick(DialogInterface dialog, int which) { | |||||
| //一般情况下如果用户不授权的话,功能是无法运行的,做退出处理 | |||||
| finish(); | |||||
| } | |||||
| }).show(); | |||||
| } | |||||
| break; | |||||
| } | |||||
| default: | |||||
| break; | |||||
| } | |||||
| super.onRequestPermissionsResult(requestCode, permissions, grantResults); | |||||
| } | |||||
| } |
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.HintDataDialogFragment; | import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.HintDataDialogFragment; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.AppStart; | import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.AppStart; | ||||
| import butterknife.ButterKnife; | |||||
| import butterknife.Unbinder; | |||||
| /** | /** | ||||
| protected TextView mTvTopTitle; | protected TextView mTvTopTitle; | ||||
| @Nullable | @Nullable | ||||
| protected Toolbar mToolbar; | protected Toolbar mToolbar; | ||||
| private Unbinder bind; | |||||
| //--------------ble--------------- | //--------------ble--------------- | ||||
| /** | /** | ||||
| * 需要申请的权限 | * 需要申请的权限 | ||||
| * 初始化 | * 初始化 | ||||
| */ | */ | ||||
| protected final void init() { | protected final void init() { | ||||
| bind = ButterKnife.bind(this); | |||||
| addInit(); | addInit(); | ||||
| initView(); | initView(); | ||||
| initData(); | initData(); | ||||
| if (mHandler != null) { | if (mHandler != null) { | ||||
| mHandler.removeCallbacksAndMessages(null); | mHandler.removeCallbacksAndMessages(null); | ||||
| } | } | ||||
| if (bind != null) | |||||
| bind.unbind(); | |||||
| } | } | ||||
| } | } |
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.HintDataDialogFragment; | import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.HintDataDialogFragment; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.CheckPermissionUtils; | import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.CheckPermissionUtils; | ||||
| import butterknife.ButterKnife; | |||||
| import butterknife.Unbinder; | |||||
| /** | /** | ||||
| protected TextView mTvTopTitle; | protected TextView mTvTopTitle; | ||||
| @Nullable | @Nullable | ||||
| protected Toolbar mToolbar; | protected Toolbar mToolbar; | ||||
| private Unbinder bind; | |||||
| //--------------ble--------------- | //--------------ble--------------- | ||||
| /** | /** | ||||
| * 需要申请的权限 | * 需要申请的权限 | ||||
| * 初始化 | * 初始化 | ||||
| */ | */ | ||||
| protected final void init() { | protected final void init() { | ||||
| bind = ButterKnife.bind(this); | |||||
| addInit(); | addInit(); | ||||
| initView(); | initView(); | ||||
| initData(); | initData(); | ||||
| if (mHandler != null) { | if (mHandler != null) { | ||||
| mHandler.removeCallbacksAndMessages(null); | mHandler.removeCallbacksAndMessages(null); | ||||
| } | } | ||||
| if (bind != null) | |||||
| bind.unbind(); | |||||
| } | } | ||||
| } | } |
| protected void onCreate(@Nullable Bundle savedInstanceState) { | protected void onCreate(@Nullable Bundle savedInstanceState) { | ||||
| super.onCreate(savedInstanceState); | super.onCreate(savedInstanceState); | ||||
| ActionBar supportActionBar = getSupportActionBar(); | ActionBar supportActionBar = getSupportActionBar(); | ||||
| if (supportActionBar != null) | |||||
| if (supportActionBar != null) { | |||||
| supportActionBar.setTitle(getString(R.string.app_name) + BuildConfig.VERSION_NAME); | supportActionBar.setTitle(getString(R.string.app_name) + BuildConfig.VERSION_NAME); | ||||
| } | |||||
| init(); | init(); | ||||
| } | } | ||||
| } | } | ||||
| /** | /** | ||||
| * 搜索蓝牙(默认通过uuid过滤) | |||||
| * @param timeOut 超时,小于等于0代表永不超时 | |||||
| * 设置标题 | |||||
| * | |||||
| * @param title 标题 | |||||
| */ | */ | ||||
| protected void startScanBle(long timeOut){ | |||||
| if (AILinkBleManager.getInstance().isInitOk()){ | |||||
| AILinkBleManager.getInstance().startScan(timeOut,BleConfig.UUID_SERVER_AILINK); | |||||
| public void setTitleData(String title) { | |||||
| ActionBar supportActionBar = getSupportActionBar(); | |||||
| if (supportActionBar != null) { | |||||
| supportActionBar.setTitle(title); | |||||
| } | } | ||||
| } | } | ||||
| /** | /** | ||||
| * 主动停止搜索 | |||||
| * 搜索蓝牙(默认通过uuid过滤) | |||||
| * | |||||
| * @param timeOut 超时,小于等于0代表永不超时 | |||||
| */ | */ | ||||
| protected void stopScanBle(){ | |||||
| if (AILinkBleManager.getInstance().isInitOk()){ | |||||
| AILinkBleManager.getInstance().stopScan(); | |||||
| protected void startScanBle(long timeOut) { | |||||
| if (AILinkBleManager.getInstance().isInitOk()) { | |||||
| AILinkBleManager.getInstance().startScan(timeOut, BleConfig.UUID_SERVER_AILINK); | |||||
| } | } | ||||
| } | } | ||||
| /** | /** | ||||
| * 设置标题 | |||||
| * | |||||
| * @param title 标题 | |||||
| * 主动停止搜索 | |||||
| */ | */ | ||||
| public void setTitleData(String title) { | |||||
| ActionBar supportActionBar = getSupportActionBar(); | |||||
| if (supportActionBar != null) { | |||||
| supportActionBar.setTitle(title); | |||||
| protected void stopScanBle() { | |||||
| if (AILinkBleManager.getInstance().isInitOk()) { | |||||
| AILinkBleManager.getInstance().stopScan(); | |||||
| } | } | ||||
| } | } | ||||
| /** | /** | ||||
| * 连接设备 | * 连接设备 | ||||
| * | |||||
| * @param bleValueBean 搜索到的地址 | * @param bleValueBean 搜索到的地址 | ||||
| */ | */ | ||||
| protected void connectBle(BleValueBean bleValueBean){ | |||||
| if (AILinkBleManager.getInstance().isInitOk()){ | |||||
| protected void connectBle(BleValueBean bleValueBean) { | |||||
| if (AILinkBleManager.getInstance().isInitOk()) { | |||||
| AILinkBleManager.getInstance().stopScan(); | AILinkBleManager.getInstance().stopScan(); | ||||
| AILinkBleManager.getInstance().connectDevice(bleValueBean); | AILinkBleManager.getInstance().connectDevice(bleValueBean); | ||||
| } | } | ||||
| /** | /** | ||||
| * 连接设备 | * 连接设备 | ||||
| * | |||||
| * @param mac 设备的地址 | * @param mac 设备的地址 | ||||
| */ | */ | ||||
| protected void connectBle(String mac){ | |||||
| if (AILinkBleManager.getInstance().isInitOk()){ | |||||
| protected void connectBle(String mac) { | |||||
| if (AILinkBleManager.getInstance().isInitOk()) { | |||||
| AILinkBleManager.getInstance().stopScan(); | AILinkBleManager.getInstance().stopScan(); | ||||
| AILinkBleManager.getInstance().connectDevice(mac); | AILinkBleManager.getInstance().connectDevice(mac); | ||||
| } | } | ||||
| onServiceErr(); | onServiceErr(); | ||||
| } | } | ||||
| }); | }); | ||||
| }else { | |||||
| mHandler.postDelayed(()->{ | |||||
| } else { | |||||
| mHandler.postDelayed(() -> { | |||||
| mAILinkBleManager = AILinkBleManager.getInstance(); | mAILinkBleManager = AILinkBleManager.getInstance(); | ||||
| onServiceSuccess(); | onServiceSuccess(); | ||||
| },500); | |||||
| }, 500); | |||||
| } | } | ||||
| } | } |
| public abstract class BleNewBaseActivity extends AppCompatActivity { | public abstract class BleNewBaseActivity extends AppCompatActivity { | ||||
| private static String TAG = BleNewBaseActivity.class.getName(); | private static String TAG = BleNewBaseActivity.class.getName(); | ||||
| protected AILinkBleManager mBleManager; | |||||
| @Override | @Override | ||||
| protected void onCreate(@Nullable Bundle savedInstanceState) { | protected void onCreate(@Nullable Bundle savedInstanceState) { | ||||
| super.onCreate(savedInstanceState); | super.onCreate(savedInstanceState); | ||||
| ActionBar supportActionBar = getSupportActionBar(); | ActionBar supportActionBar = getSupportActionBar(); | ||||
| if (supportActionBar != null) | |||||
| if (supportActionBar != null) { | |||||
| supportActionBar.setTitle(getString(R.string.app_name) + BuildConfig.VERSION_NAME); | supportActionBar.setTitle(getString(R.string.app_name) + BuildConfig.VERSION_NAME); | ||||
| } | |||||
| init(); | init(); | ||||
| } | } | ||||
| /** | /** | ||||
| * 搜索蓝牙(默认通过uuid过滤) | * 搜索蓝牙(默认通过uuid过滤) | ||||
| * | |||||
| * @param timeOut 超时,小于等于0代表永不超时 | * @param timeOut 超时,小于等于0代表永不超时 | ||||
| */ | */ | ||||
| protected void startScanBle(long timeOut){ | |||||
| if (AILinkBleManager.getInstance()!=null){ | |||||
| AILinkBleManager.getInstance().startScan(timeOut,BleConfig.UUID_SERVER_AILINK); | |||||
| protected void startScanBle(long timeOut) { | |||||
| if (AILinkBleManager.getInstance() != null) { | |||||
| AILinkBleManager.getInstance().startScan(timeOut, BleConfig.UUID_SERVER_AILINK); | |||||
| } | } | ||||
| } | } | ||||
| /** | /** | ||||
| * 主动停止搜索 | * 主动停止搜索 | ||||
| */ | */ | ||||
| protected void stopScanBle(){ | |||||
| if (AILinkBleManager.getInstance()!=null){ | |||||
| protected void stopScanBle() { | |||||
| if (AILinkBleManager.getInstance() != null) { | |||||
| AILinkBleManager.getInstance().stopScan(); | AILinkBleManager.getInstance().stopScan(); | ||||
| } | } | ||||
| } | } | ||||
| /** | /** | ||||
| * 连接设备 | * 连接设备 | ||||
| * | |||||
| * @param bleValueBean 搜索到的地址 | * @param bleValueBean 搜索到的地址 | ||||
| */ | */ | ||||
| protected void connectBle(BleValueBean bleValueBean){ | |||||
| if (AILinkBleManager.getInstance()!=null){ | |||||
| protected void connectBle(BleValueBean bleValueBean) { | |||||
| if (AILinkBleManager.getInstance() != null) { | |||||
| AILinkBleManager.getInstance().stopScan(); | AILinkBleManager.getInstance().stopScan(); | ||||
| AILinkBleManager.getInstance().connectDevice(bleValueBean.getMac()); | AILinkBleManager.getInstance().connectDevice(bleValueBean.getMac()); | ||||
| } | } | ||||
| /** | /** | ||||
| * 连接设备 | * 连接设备 | ||||
| * | |||||
| * @param mac 设备的地址 | * @param mac 设备的地址 | ||||
| */ | */ | ||||
| protected void connectBle(String mac){ | |||||
| if (AILinkBleManager.getInstance()!=null){ | |||||
| protected void connectBle(String mac) { | |||||
| if (AILinkBleManager.getInstance() != null) { | |||||
| AILinkBleManager.getInstance().stopScan(); | AILinkBleManager.getInstance().stopScan(); | ||||
| AILinkBleManager.getInstance().connectDevice(mac); | AILinkBleManager.getInstance().connectDevice(mac); | ||||
| } | } | ||||
| AILinkBleManager.getInstance().init(this, new AILinkBleManager.onInitListener() { | AILinkBleManager.getInstance().init(this, new AILinkBleManager.onInitListener() { | ||||
| @Override | @Override | ||||
| public void onInitSuccess() { | public void onInitSuccess() { | ||||
| mBleManager = AILinkBleManager.getInstance(); | |||||
| onServiceSuccess(); | onServiceSuccess(); | ||||
| } | } | ||||
| onServiceErr(); | onServiceErr(); | ||||
| } | } | ||||
| }); | }); | ||||
| }else { | |||||
| } else { | |||||
| mBleManager = AILinkBleManager.getInstance(); | |||||
| onServiceSuccess(); | onServiceSuccess(); | ||||
| } | } | ||||
| package aicare.net.cn.sdk.ailinksdkdemoandroid.base | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.LoadingIosDialogFragment | |||||
| import android.R | |||||
| import android.app.Activity | |||||
| import android.content.Context | |||||
| import android.content.pm.ActivityInfo | |||||
| import android.os.Build | |||||
| import android.os.Bundle | |||||
| import android.view.KeyEvent | |||||
| import android.view.MenuItem | |||||
| import android.view.MotionEvent | |||||
| import android.view.View | |||||
| import android.view.WindowManager | |||||
| import android.view.inputmethod.InputMethodManager | |||||
| import androidx.annotation.ColorRes | |||||
| import androidx.appcompat.widget.Toolbar | |||||
| import androidx.core.content.ContextCompat | |||||
| import androidx.viewbinding.ViewBinding | |||||
| abstract class KBleBaseNewActivity<T : ViewBinding> : BleNewBaseActivity() { | |||||
| val TAG = this.javaClass.name | |||||
| lateinit var mContext: Context | |||||
| @ColorRes | |||||
| var mStatusBarColor: Int = 0 | |||||
| lateinit var binding: T | |||||
| override fun onCreate(savedInstanceState: Bundle?) { | |||||
| super.onCreate(savedInstanceState) | |||||
| binding = getLayoutView() | |||||
| // initWindow() | |||||
| setContentView(binding.root) | |||||
| mContext = this | |||||
| init() | |||||
| } | |||||
| /** | |||||
| * 初始化 | |||||
| */ | |||||
| private fun init() { | |||||
| findTopView() | |||||
| initData() | |||||
| initListener() | |||||
| } | |||||
| private fun findTopView() { | |||||
| binding.root.findViewWithTag<View>("tbPublicTitle")?.let { | |||||
| if (it is Toolbar) { | |||||
| it.title = "" | |||||
| setSupportActionBar(it) | |||||
| } | |||||
| } | |||||
| } | |||||
| /** | |||||
| * 获取当前activity的布局 | |||||
| * | |||||
| * @return int | |||||
| */ | |||||
| protected abstract fun getLayoutView(): T | |||||
| open fun initWindow() { | |||||
| //禁止横屏 | |||||
| requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT | |||||
| //设置状态栏文字为黑色 | |||||
| if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { | |||||
| window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR | |||||
| } | |||||
| setStatusBarColor(mStatusBarColor) | |||||
| } | |||||
| fun setStatusBarColor(color: Int) { | |||||
| if (color != 0) { | |||||
| this.window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) | |||||
| this.window.statusBarColor = ContextCompat.getColor(this, color) | |||||
| } | |||||
| } | |||||
| /** | |||||
| * 返回键 | |||||
| */ | |||||
| override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean { | |||||
| if (keyCode == KeyEvent.KEYCODE_BACK && event.repeatCount == 0) { | |||||
| myFinish() | |||||
| return true | |||||
| } | |||||
| return super.onKeyDown(keyCode, event) | |||||
| } | |||||
| /** | |||||
| * 返回 | |||||
| */ | |||||
| protected open fun myFinish() { | |||||
| finish() | |||||
| } | |||||
| /** | |||||
| * 初始化事件 | |||||
| */ | |||||
| protected abstract fun initListener() | |||||
| /** | |||||
| * 初始化数据 | |||||
| */ | |||||
| protected abstract fun initData() | |||||
| override fun onOptionsItemSelected(item: MenuItem): Boolean { | |||||
| val id = item.itemId | |||||
| if (id == R.id.home) { | |||||
| myFinish() | |||||
| return true | |||||
| } | |||||
| return super.onOptionsItemSelected(item) | |||||
| } | |||||
| //--------------------------start Loading-------------------------- | |||||
| private var mDialogFragment: LoadingIosDialogFragment? = null | |||||
| /** | |||||
| * 显示加载 | |||||
| */ | |||||
| fun showLoading() { | |||||
| if (mDialogFragment == null) { | |||||
| mDialogFragment = LoadingIosDialogFragment() | |||||
| } | |||||
| mDialogFragment!!.show(supportFragmentManager) | |||||
| } | |||||
| /** | |||||
| * 关闭加载 | |||||
| */ | |||||
| fun dismissLoading() { | |||||
| if (mDialogFragment != null) { | |||||
| mDialogFragment!!.dismiss() | |||||
| } | |||||
| } | |||||
| //--------------------------end Loading-------------------------- | |||||
| } |
| public final static int TEMP_INSTRUMENT = 0x003D; | public final static int TEMP_INSTRUMENT = 0x003D; | ||||
| /** | /** | ||||
| * wifi+ble血压计 | * wifi+ble血压计 | ||||
| */ | */ | ||||
| */ | */ | ||||
| public static final int BLE_GAS_DETECTOR = 0x006F; | public static final int BLE_GAS_DETECTOR = 0x006F; | ||||
| /** | |||||
| * 恶魔之眼(BLE) | |||||
| */ | |||||
| public static final int BLE_DEMON_EYES = 0x0071; | |||||
| /** | |||||
| * 气体检测仪(Ailink ) | |||||
| */ | |||||
| public static final int WIFI_BLE_GAS_DETECTOR = 0x0074; | |||||
| /** | |||||
| * BLE HMI体脂秤 | |||||
| */ | |||||
| public static final int BLE_HMI_BODY_FAT_SCALE = 0x0076; | |||||
| /** | |||||
| * 智能码表 | |||||
| */ | |||||
| public final static int BLE_SMART_CYCLING_TABLE = 0x0077; | |||||
| /** | |||||
| * 华普红外测温枪 | |||||
| */ | |||||
| public final static int BLE_HP_INFRARED_TEMPERATURE = 0x0020; | |||||
| /** | |||||
| * 热线式风速计 | |||||
| */ | |||||
| public static final int CID_0072_HOTLINE_ANE = 0x0072; | |||||
| /** | |||||
| * 病例宝 | |||||
| */ | |||||
| public final static int BLE_CASE_TREASURE = 0x0080; | |||||
| //------------------特殊 | //------------------特殊 | ||||
| /** | /** | ||||
| * wifi_ble_OTA | * wifi_ble_OTA | ||||
| */ | */ | ||||
| public final static int WIFI_BLE_OTA = -11; | public final static int WIFI_BLE_OTA = -11; | ||||
| /** | |||||
| * Ble发送速度测试 | |||||
| */ | |||||
| public static final int BLE_SEND_SPEED_TEST = -12; | |||||
| } | } |
| import androidx.fragment.app.FragmentManager; | import androidx.fragment.app.FragmentManager; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | ||||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatDataUtil; | |||||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.User; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.bean.UserBean; | |||||
| public class AddUserDialog extends DialogFragment implements View.OnClickListener , SeekBar.OnSeekBarChangeListener, RadioGroup.OnCheckedChangeListener { | public class AddUserDialog extends DialogFragment implements View.OnClickListener , SeekBar.OnSeekBarChangeListener, RadioGroup.OnCheckedChangeListener { | ||||
| private boolean mCancelBlank; | private boolean mCancelBlank; | ||||
| private TextView id; | private TextView id; | ||||
| private SeekBar agesb, heightsb, weightsb, adcsb; | private SeekBar agesb, heightsb, weightsb, adcsb; | ||||
| private RadioGroup sexRG, modeRG; | private RadioGroup sexRG, modeRG; | ||||
| private User user; | |||||
| private UserBean user; | |||||
| private TextView tv_move_data_ok, tv_move_data_cancel; | private TextView tv_move_data_ok, tv_move_data_cancel; | ||||
| private OnDialogListener mOnDialogListener; | private OnDialogListener mOnDialogListener; | ||||
| public AddUserDialog( OnDialogListener onDialogListener) { | public AddUserDialog( OnDialogListener onDialogListener) { | ||||
| user=new User(); | |||||
| user.setModeType(BodyFatDataUtil.MODE_ORDINARY); | |||||
| user.setSex(BodyFatDataUtil.SEX_MAN); | |||||
| user=new UserBean(); | |||||
| user.setModeType(UserBean.MODE_ORDINARY); | |||||
| user.setSex(UserBean.SEX_MAN); | |||||
| user.setAge(0); | user.setAge(0); | ||||
| user.setHeight(0); | user.setHeight(0); | ||||
| user.setAdc(0); | user.setAdc(0); | ||||
| @Override | @Override | ||||
| public void onCheckedChanged(RadioGroup group, int checkedId) { | public void onCheckedChanged(RadioGroup group, int checkedId) { | ||||
| if (checkedId == R.id.man) { | if (checkedId == R.id.man) { | ||||
| user.setSex(BodyFatDataUtil.SEX_MAN); | |||||
| user.setSex(UserBean.SEX_MAN); | |||||
| } else if (checkedId == R.id.female) { | } else if (checkedId == R.id.female) { | ||||
| user.setSex(BodyFatDataUtil.SEX_FEMAN); | |||||
| user.setSex(UserBean.SEX_FEMAN); | |||||
| } else if (checkedId == R.id.ordinary) { | } else if (checkedId == R.id.ordinary) { | ||||
| user.setModeType(BodyFatDataUtil.MODE_ORDINARY); | |||||
| user.setModeType(UserBean.MODE_ORDINARY); | |||||
| } else if (checkedId == R.id.athlete) { | } else if (checkedId == R.id.athlete) { | ||||
| user.setModeType(BodyFatDataUtil.MODE_ATHLETE); | |||||
| user.setModeType(UserBean.MODE_ATHLETE); | |||||
| } else if (checkedId == R.id.pregnant) { | } else if (checkedId == R.id.pregnant) { | ||||
| user.setModeType(BodyFatDataUtil.MODE_PREGNANT); | |||||
| user.setModeType(UserBean.MODE_PREGNANT); | |||||
| } | } | ||||
| settext(); | settext(); | ||||
| } | } | ||||
| /** | /** | ||||
| * 成功的点击事件 | * 成功的点击事件 | ||||
| */ | */ | ||||
| default void tvSucceedListener(User user) { | |||||
| default void tvSucceedListener(UserBean user) { | |||||
| } | } | ||||
| } | } |
| return show; | return show; | ||||
| } | } | ||||
| public static LoadingIosDialogFragment newInstance() { | |||||
| return new LoadingIosDialogFragment(); | |||||
| } | |||||
| private Handler mHandler = new Handler(Looper.getMainLooper()) { | private Handler mHandler = new Handler(Looper.getMainLooper()) { | ||||
| @Override | @Override | ||||
| public void handleMessage(Message msg) { | public void handleMessage(Message msg) { |
| private int mCancelColor; | private int mCancelColor; | ||||
| private CharSequence mCancel = ""; | private CharSequence mCancel = ""; | ||||
| private CharSequence mTitle = ""; | private CharSequence mTitle = ""; | ||||
| private ArrayList<DialogStringImageBean> mList; | |||||
| private ArrayList<DialogStringImageBean> mList = new ArrayList<>(); | |||||
| private boolean mBottom; | private boolean mBottom; | ||||
| /** | /** | ||||
| * 是否显示灰色背景 | * 是否显示灰色背景 | ||||
| tv_dialog_list_data_hint = view.findViewById(R.id.tv_dialog_list_data_hint); | tv_dialog_list_data_hint = view.findViewById(R.id.tv_dialog_list_data_hint); | ||||
| rv_dialog_list.setLayoutManager(new LinearLayoutManager(mContext)); | rv_dialog_list.setLayoutManager(new LinearLayoutManager(mContext)); | ||||
| rv_dialog_list.addItemDecoration(new MyItemDecoration(mContext, LinearLayoutManager.VERTICAL, 1, mContext.getResources() | rv_dialog_list.addItemDecoration(new MyItemDecoration(mContext, LinearLayoutManager.VERTICAL, 1, mContext.getResources() | ||||
| .getColor(R.color.public_press_bg))); | |||||
| .getColor(R.color.public_press_bg))); | |||||
| } | } | ||||
| */ | */ | ||||
| private void initData(ArrayList<DialogStringImageBean> list, CharSequence title, CharSequence cancel, int cancelColor) { | private void initData(ArrayList<DialogStringImageBean> list, CharSequence title, CharSequence cancel, int cancelColor) { | ||||
| if (mList == null) { | |||||
| mList = new ArrayList<>(); | |||||
| } | |||||
| mAdapter = new DialogStringImageAdapter(mContext, mList, position -> { | |||||
| mAdapter = new DialogStringImageAdapter(mContext, list, position -> { | |||||
| if (mOnDialogListener != null) { | if (mOnDialogListener != null) { | ||||
| //item点击事件 | //item点击事件 | ||||
| mOnDialogListener.onItemListener(position); | mOnDialogListener.onItemListener(position); | ||||
| }); | }); | ||||
| rv_dialog_list.setAdapter(mAdapter); | rv_dialog_list.setAdapter(mAdapter); | ||||
| setList(list); | |||||
| setList(new ArrayList<DialogStringImageBean>(list)); | |||||
| setTitle(title); | setTitle(title); | ||||
| setCancel(cancel, cancelColor); | setCancel(cancel, cancelColor); | ||||
| mTvCancel.setOnClickListener(this); | mTvCancel.setOnClickListener(this); | ||||
| * 修改列表中的内容 | * 修改列表中的内容 | ||||
| */ | */ | ||||
| public ShowListDialogFragment setList(List<DialogStringImageBean> list) { | public ShowListDialogFragment setList(List<DialogStringImageBean> list) { | ||||
| if (mList == null) { | |||||
| mList = new ArrayList<>(); | |||||
| } | |||||
| mList.clear(); | mList.clear(); | ||||
| mList.addAll(list); | mList.addAll(list); | ||||
| if (tv_dialog_list_data_hint != null) { | if (tv_dialog_list_data_hint != null) { | ||||
| if (mList.size() == 0) { | |||||
| if (mList.isEmpty()) { | |||||
| tv_dialog_list_data_hint.setVisibility(View.VISIBLE); | tv_dialog_list_data_hint.setVisibility(View.VISIBLE); | ||||
| } else { | } else { | ||||
| tv_dialog_list_data_hint.setVisibility(View.GONE); | tv_dialog_list_data_hint.setVisibility(View.GONE); |
| package aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.bean; | |||||
| public class UserBean { | |||||
| /** | |||||
| * 普通模式 Normal mode | |||||
| */ | |||||
| public final static int MODE_ORDINARY = 0; | |||||
| /** | |||||
| * 运动员模式 Athlete mode | |||||
| */ | |||||
| public final static int MODE_ATHLETE = 1; | |||||
| /** | |||||
| * 孕妇模式 Maternity mode | |||||
| */ | |||||
| public final static int MODE_PREGNANT = 2; | |||||
| /** | |||||
| * 男 Male | |||||
| */ | |||||
| public final static int SEX_MAN = 1; | |||||
| /** | |||||
| * 女 Female | |||||
| */ | |||||
| public final static int SEX_FEMAN = 0; | |||||
| /** | |||||
| * 性别,0女,1男 | |||||
| * Gender, 0 female, 1 male | |||||
| */ | |||||
| private int sex; | |||||
| /** | |||||
| * 年龄 0~120 | |||||
| * Age 0 ~ 120 | |||||
| */ | |||||
| private int age; | |||||
| /** | |||||
| * 身高cm 0~269 | |||||
| * Height cm 0 ~ 269 | |||||
| */ | |||||
| private int height; | |||||
| /** | |||||
| * 体重kg 1位小数 0~250 | |||||
| * Weight kg 1 decimal place 0 ~ 250 | |||||
| */ | |||||
| private float weight; | |||||
| /** | |||||
| * 模式,0普通,1运动员 | |||||
| * Mode, 0 Normal, 1 Athlete | |||||
| */ | |||||
| private int modeType; | |||||
| /** | |||||
| * 1到8 | |||||
| */ | |||||
| private int id; | |||||
| /** | |||||
| * 阻抗值,正常0~1000 | |||||
| * Impedance value, normal 0 ~ 1000 | |||||
| */ | |||||
| private int adc; | |||||
| public int getAdc() { | |||||
| return adc; | |||||
| } | |||||
| public void setAdc(int adc) { | |||||
| this.adc = adc; | |||||
| } | |||||
| public int getId() { | |||||
| return id; | |||||
| } | |||||
| public void setId(int id) { | |||||
| this.id = id; | |||||
| } | |||||
| public int getSex() { | |||||
| return sex; | |||||
| } | |||||
| public void setSex(int sex) { | |||||
| this.sex = sex; | |||||
| } | |||||
| public int getAge() { | |||||
| return age; | |||||
| } | |||||
| public void setAge(int age) { | |||||
| this.age = age; | |||||
| } | |||||
| public int getHeight() { | |||||
| return height; | |||||
| } | |||||
| public void setHeight(int height) { | |||||
| this.height = height; | |||||
| } | |||||
| public float getWeight() { | |||||
| return weight; | |||||
| } | |||||
| public void setWeight(float weight) { | |||||
| this.weight = weight; | |||||
| } | |||||
| public int getModeType() { | |||||
| return modeType; | |||||
| } | |||||
| public void setModeType(int modeType) { | |||||
| this.modeType = modeType; | |||||
| } | |||||
| @Override | |||||
| public String toString() { | |||||
| return "BodyFatUserBean{" + | |||||
| "sex=" + sex + | |||||
| ", age=" + age + | |||||
| ", height=" + height + | |||||
| ", weight=" + weight + | |||||
| ", modeType=" + modeType + | |||||
| ", id=" + id + | |||||
| ", adc=" + adc + | |||||
| '}'; | |||||
| } | |||||
| } |
| @Override | @Override | ||||
| public void onClick(View v) { | public void onClick(View v) { | ||||
| switch (v.getId()) { | |||||
| case R.id.btn_connect_info_list: | |||||
| if (mFindDeviceData!=null) { | |||||
| mFindDeviceData.getConnectInfoList(); | |||||
| } | |||||
| break; | |||||
| case R.id.btn_get_connect_number: | |||||
| if (mFindDeviceData!=null) { | |||||
| mFindDeviceData.getConnectDeviceNumber(); | |||||
| } | |||||
| break; | |||||
| case R.id.btn_device_id_0: | |||||
| sendCmd(0); | |||||
| break; | |||||
| case R.id.btn_device_id_1: | |||||
| sendCmd(1); | |||||
| break; | |||||
| case R.id.btn_device_id_2: | |||||
| sendCmd(2); | |||||
| break; | |||||
| case R.id.btn_device_id_3: | |||||
| sendCmd(3); | |||||
| break; | |||||
| case R.id.btn_device_id_4: | |||||
| sendCmd(4); | |||||
| break; | |||||
| case R.id.btn_device_id_5: | |||||
| sendCmd(5); | |||||
| break; | |||||
| case R.id.btn_device_id_6: | |||||
| sendCmd(6); | |||||
| break; | |||||
| case R.id.btn_clear: | |||||
| mList.clear(); | |||||
| if (mListAdapter != null) { | |||||
| mListAdapter.notifyDataSetChanged(); | |||||
| } | |||||
| break; | |||||
| int id = v.getId(); | |||||
| if (id == R.id.btn_connect_info_list) { | |||||
| if (mFindDeviceData != null) { | |||||
| mFindDeviceData.getConnectInfoList(); | |||||
| } | |||||
| } else if (id == R.id.btn_get_connect_number) { | |||||
| if (mFindDeviceData != null) { | |||||
| mFindDeviceData.getConnectDeviceNumber(); | |||||
| } | |||||
| } else if (id == R.id.btn_device_id_0) { | |||||
| sendCmd(0); | |||||
| } else if (id == R.id.btn_device_id_1) { | |||||
| sendCmd(1); | |||||
| } else if (id == R.id.btn_device_id_2) { | |||||
| sendCmd(2); | |||||
| } else if (id == R.id.btn_device_id_3) { | |||||
| sendCmd(3); | |||||
| } else if (id == R.id.btn_device_id_4) { | |||||
| sendCmd(4); | |||||
| } else if (id == R.id.btn_device_id_5) { | |||||
| sendCmd(5); | |||||
| } else if (id == R.id.btn_device_id_6) { | |||||
| sendCmd(6); | |||||
| } else if (id == R.id.btn_clear) { | |||||
| mList.clear(); | |||||
| if (mListAdapter != null) { | |||||
| mListAdapter.notifyDataSetChanged(); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @Override | @Override | ||||
| public void onClick(View v) { | public void onClick(View v) { | ||||
| switch (v.getId()) { | |||||
| case R.id.btn_scan_ble: | |||||
| if (mFindDeviceData != null) { | |||||
| int id = v.getId(); | |||||
| if (id == R.id.btn_scan_ble) { | |||||
| if (mFindDeviceData != null) { | |||||
| // mFindDeviceData.setNearbyDevice(1, 10, new byte[]{}); | // mFindDeviceData.setNearbyDevice(1, 10, new byte[]{}); | ||||
| // if (rv_device.getVisibility() != View.VISIBLE) { | // if (rv_device.getVisibility() != View.VISIBLE) { | ||||
| // rv_device.setVisibility(View.VISIBLE); | // rv_device.setVisibility(View.VISIBLE); | ||||
| // } | // } | ||||
| mFindDeviceBeanList.clear(); | |||||
| if (mFindDeviceAdapter != null) { | |||||
| mFindDeviceAdapter.notifyDataSetChanged(); | |||||
| } | |||||
| mFindDeviceData.getConnectInfoList(); | |||||
| mAILinkBleManager.startScan(30 * 1000); | |||||
| mFindDeviceBeanList.clear(); | |||||
| if (mFindDeviceAdapter != null) { | |||||
| mFindDeviceAdapter.notifyDataSetChanged(); | |||||
| } | } | ||||
| break; | |||||
| case R.id.btn_clear: | |||||
| mList.clear(); | |||||
| if (mListAdapter != null) { | |||||
| mListAdapter.notifyDataSetChanged(); | |||||
| } | |||||
| break; | |||||
| mFindDeviceData.getConnectInfoList(); | |||||
| mAILinkBleManager.startScan(30 * 1000); | |||||
| } | |||||
| } else if (id == R.id.btn_clear) { | |||||
| mList.clear(); | |||||
| if (mListAdapter != null) { | |||||
| mListAdapter.notifyDataSetChanged(); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| package aicare.net.cn.sdk.ailinksdkdemoandroid.home; | package aicare.net.cn.sdk.ailinksdkdemoandroid.home; | ||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.ADWeightScaleCmdActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.ADWeightScaleCmdActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.BloodSugar4GActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.BloodSugar4GActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.BroadcastBloodOxygenActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.BroadcastBloodOxygenActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.BroadcastScaleActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.BroadcastScaleActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.ClearShakeHandsActivity; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.ConnectBleTestActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.ConnectBleTestActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.HeightCmdActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.HeightCmdActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.HeightWeightScaleActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.HeightWeightScaleActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.ShowBleActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.ShowBleActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.SmartMaskActivity; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.SphyCmdActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.SphyCmdActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.TempCmdActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.TempCmdActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.TempGunCmdActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.TempGunCmdActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.TestCmdActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.TestCmdActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.TransmissionActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.TransmissionActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.WeightScaleBleActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.WeightScaleBleActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.WifiConfigActivity; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig; | import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.find.FindDeviceNewActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.find.FindDeviceNewActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.PublicBleNetworkCmdActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.PublicBleNetworkCmdActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.PublicMqttActivity; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.PublicWifiBleOtaActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.PublicWifiBleOtaActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.TempInstrument.TempInstrumentActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.TempInstrument.TempInstrumentActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.airdetector.AirDetectorActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.airdetector.AirDetectorActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.barometric_temp_humidity.BarometricTempHygrometerActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.barometric_temp_humidity.BarometricTempHygrometerActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_0020_hu_infrared_temp.Ble0020HpInfraredTempActivity; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_nutrition.BleNutritionActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_nutrition.BleNutritionActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_nutrition.BleNutritionNutrientActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_nutrition.BleNutritionNutrientActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_speed_test.BleSpeedTestActivity; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.blood_glucose.BloodGlucoseActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.blood_glucose.BloodGlucoseActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.blood_pressure_tc.BloodPressureTcActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.blood_pressure_tc.BloodPressureTcActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.body_scale_4g.BodyScale4GActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.body_scale_4g.BodyScale4GActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.broadcast_nutrition.BroadNutritionActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.broadcast_nutrition.BroadNutritionActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.broadcast_weight_sacle.BroadcastWeightScaleActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.broadcast_weight_sacle.BroadcastWeightScaleActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.bw05watch.Bw05WatchActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.bw05watch.Bw05WatchActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.caseTreasure.BleCaseTreasureActivity; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.coffee_scale.CoffeeScaleActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.coffee_scale.CoffeeScaleActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.eight_bodyfat.EightBodyFatMcuActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.eight_bodyfat.EightBodyFatMcuActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.eight_bodyfat.EightBodyfatActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.eight_bodyfat.EightBodyfatActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.fascia_gun.FasciaGunActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.fascia_gun.FasciaGunActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.food_temp.FoodTempActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.food_temp.FoodTempActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.gasDetector.GasDetectorActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.gasDetector.GasDetectorActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.gasDetectorPlus.GasDetectorPlusActivity; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.hmiBodyFat.HmiBodyFatScaleBleActivity; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.leaone_broadcast.LeaOneBroadcastActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.leaone_broadcast.LeaOneBroadcastActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.meat_probe.MeatProbeActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.meat_probe.MeatProbeActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.meat_probe_charger.MeatProbeChargerActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.meat_probe_charger.MeatProbeChargerActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.share_charger.ShareChargerActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.share_charger.ShareChargerActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.share_condom.ShareCondomActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.share_condom.ShareCondomActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.share_socket.ShareSocketActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.share_socket.ShareSocketActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.toothbrush.ToothBrushWifiBleActivity; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.smart_cycling_table.SmartCyclingTableActivity; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.toothbrush.ToothBrushWifiNewBleActivity; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.toothbrush_test.ToothbrushTestActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.toothbrush_test.ToothbrushTestActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.weight_scale.WeightScaleActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.weight_scale.WeightScaleActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.wifi_ble_scale.WeightScaleWifiBleActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.wifi_ble_scale.WeightScaleWifiBleActivity; | ||||
| beanList.add(new JumpBean(BleDeviceConfig.PUBLIC_BLE_NETWORK, R.string.item_ble_universal_distribution_network, publicJumpActivity, PublicBleNetworkCmdActivity.class)); | beanList.add(new JumpBean(BleDeviceConfig.PUBLIC_BLE_NETWORK, R.string.item_ble_universal_distribution_network, publicJumpActivity, PublicBleNetworkCmdActivity.class)); | ||||
| // Ble test | // Ble test | ||||
| beanList.add(new JumpBean(BleDeviceConfig.BLE_TEST, R.string.item_ble_test, publicJumpActivity, TestCmdActivity.class)); | beanList.add(new JumpBean(BleDeviceConfig.BLE_TEST, R.string.item_ble_test, publicJumpActivity, TestCmdActivity.class)); | ||||
| // Ble send speed test | |||||
| beanList.add(new JumpBean(BleDeviceConfig.BLE_SEND_SPEED_TEST, R.string.ble_send_speed_test, publicJumpActivity, BleSpeedTestActivity.class)); | |||||
| // Ble connect test | // Ble connect test | ||||
| beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_ble_connect_test, null, ConnectBleTestActivity.class)); | beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_ble_connect_test, null, ConnectBleTestActivity.class)); | ||||
| // OTA通用 | |||||
| // OTA通用 | |||||
| // beanList.add(new JumpBean(BleDeviceConfig.OTA, R.string.item_ota, publicJumpActivity, TestOtaActivity.class)); | // beanList.add(new JumpBean(BleDeviceConfig.OTA, R.string.item_ota, publicJumpActivity, TestOtaActivity.class)); | ||||
| //MQTT通用 | |||||
| beanList.add(new JumpBean(BleDeviceConfig.OTA, R.string.item_mqtt, null, PublicMqttActivity.class)); | |||||
| // 透传 | // 透传 | ||||
| beanList.add(new JumpBean(BleDeviceConfig.PENETRATE, R.string.item_penetrate, publicJumpActivity, TransmissionActivity.class)); | beanList.add(new JumpBean(BleDeviceConfig.PENETRATE, R.string.item_penetrate, publicJumpActivity, TransmissionActivity.class)); | ||||
| //HMI四电极体脂秤 | |||||
| beanList.add(new JumpBean(BleDeviceConfig.BLE_HMI_BODY_FAT_SCALE, R.string.item_hmi_body_fat_scale, publicJumpActivity, HmiBodyFatScaleBleActivity.class)); | |||||
| //气体检测仪(Ailink ) | |||||
| beanList.add(new JumpBean(BleDeviceConfig.WIFI_BLE_GAS_DETECTOR, R.string.gas_detector_puls, publicJumpActivity, GasDetectorPlusActivity.class)); | |||||
| //气体检测仪 | //气体检测仪 | ||||
| beanList.add(new JumpBean(BleDeviceConfig.BLE_GAS_DETECTOR, R.string.gas_detector, publicJumpActivity, GasDetectorActivity.class)); | beanList.add(new JumpBean(BleDeviceConfig.BLE_GAS_DETECTOR, R.string.gas_detector, publicJumpActivity, GasDetectorActivity.class)); | ||||
| // 广播秤 | // 广播秤 | ||||
| // 探针充电盒 | // 探针充电盒 | ||||
| beanList.add(new JumpBean(BleDeviceConfig.MEAT_PROBE_CHARGER, R.string.item_probe_charging_box, publicJumpActivity, MeatProbeChargerActivity.class)); | beanList.add(new JumpBean(BleDeviceConfig.MEAT_PROBE_CHARGER, R.string.item_probe_charging_box, publicJumpActivity, MeatProbeChargerActivity.class)); | ||||
| // 牙刷(wifi+ble) | // 牙刷(wifi+ble) | ||||
| beanList.add(new JumpBean(BleDeviceConfig.TOOTHBRUSH_WIFI_BLE, R.string.item_toothbrush_wifi_ble, publicJumpActivity, ToothBrushWifiBleActivity.class)); | |||||
| // beanList.add(new JumpBean(BleDeviceConfig.TOOTHBRUSH_WIFI_BLE, R.string.item_toothbrush_wifi_ble, publicJumpActivity, ToothBrushWifiOnOnBleActivity.class)); | |||||
| beanList.add(new JumpBean(BleDeviceConfig.TOOTHBRUSH_WIFI_BLE, R.string.item_toothbrush_wifi_ble, publicJumpActivity, ToothBrushWifiNewBleActivity.class)); | |||||
| // 牙刷测试 | // 牙刷测试 | ||||
| beanList.add(new JumpBean(BleDeviceConfig.TOOTHBRUSH_TEST, R.string.item_toothbrush_test, publicJumpActivity, ToothbrushTestActivity.class)); | beanList.add(new JumpBean(BleDeviceConfig.TOOTHBRUSH_TEST, R.string.item_toothbrush_test, publicJumpActivity, ToothbrushTestActivity.class)); | ||||
| // 口罩 | |||||
| beanList.add(new JumpBean(BleDeviceConfig.SMART_MASK, R.string.item_smart_mask, publicJumpActivity, SmartMaskActivity.class)); | |||||
| // 筋膜枪 | // 筋膜枪 | ||||
| beanList.add(new JumpBean(BleDeviceConfig.FASCIA_GUN, R.string.item_fascia_gun, publicJumpActivity, FasciaGunActivity.class)); | beanList.add(new JumpBean(BleDeviceConfig.FASCIA_GUN, R.string.item_fascia_gun, publicJumpActivity, FasciaGunActivity.class)); | ||||
| // 跳绳 | // 跳绳 | ||||
| beanList.add(new JumpBean(BleDeviceConfig.WIFI_BLE_OTA, BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_WIFI_BLE, R.string.wifi_ble_ota_tool, publicJumpActivity, PublicWifiBleOtaActivity.class)); | beanList.add(new JumpBean(BleDeviceConfig.WIFI_BLE_OTA, BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_WIFI_BLE, R.string.wifi_ble_ota_tool, publicJumpActivity, PublicWifiBleOtaActivity.class)); | ||||
| //bw05暨芯手表 | //bw05暨芯手表 | ||||
| beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_bw05_watch, null, Bw05WatchActivity.class)); | beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_bw05_watch, null, Bw05WatchActivity.class)); | ||||
| // 智能码表 | |||||
| beanList.add(new JumpBean(BleDeviceConfig.BLE_SMART_CYCLING_TABLE, R.string.ble_smart_cycling_table, publicJumpActivity, SmartCyclingTableActivity.class)); | |||||
| // 华普红外测温枪 | |||||
| beanList.add(new JumpBean(BleDeviceConfig.BLE_HP_INFRARED_TEMPERATURE, R.string.ble_0020_hu_temp, publicJumpActivity, Ble0020HpInfraredTempActivity.class)); | |||||
| //病例宝 | |||||
| beanList.add(new JumpBean(BleDeviceConfig.BLE_CASE_TREASURE, R.string.ble_case_treasure, publicJumpActivity, BleCaseTreasureActivity.class)); | |||||
| return beanList; | return beanList; | ||||
| } | } | ||||
| public static ArrayList<JumpBean> getHideDataList() { | |||||
| ArrayList<JumpBean> hideList = new ArrayList<>(); | |||||
| Class<?> publicJumpActivity = ShowBleActivity.class; | |||||
| // 不握手不加密 | |||||
| hideList.add(new JumpBean(BleDeviceConfig.CLEAR_SHAKE_HANDS, R.string.item_no_handshake_encryption, publicJumpActivity, ClearShakeHandsActivity.class)); | |||||
| // wifi 配置 | |||||
| hideList.add(new JumpBean(IGNORE_TYPE, R.string.item_wifi_config, null, WifiConfigActivity.class)); | |||||
| return hideList; | |||||
| } | |||||
| /** | /** | ||||
| * 要跳转的目标Activity | * 要跳转的目标Activity |
| @Override | @Override | ||||
| public void onBindViewHolder(@NonNull MyHolder holder, int position) { | public void onBindViewHolder(@NonNull MyHolder holder, int position) { | ||||
| holder.tvContent.setText(context.getString(list.get(position).getItemNameResId())); | |||||
| JumpBean jumpBean = list.get(position); | |||||
| String cidStr = ""; | |||||
| if (jumpBean.getCid() > 0) { | |||||
| cidStr = "(" + jumpBean.getCidStr() + ")"; | |||||
| } | |||||
| holder.tvContent.setText(context.getString(jumpBean.getItemNameResId()) + cidStr); | |||||
| } | } | ||||
| @Override | @Override |
| package aicare.net.cn.sdk.ailinksdkdemoandroid.home; | package aicare.net.cn.sdk.ailinksdkdemoandroid.home; | ||||
| import java.util.List; | import java.util.List; | ||||
| import java.util.Locale; | |||||
| /** | /** | ||||
| * 说明: | * 说明: | ||||
| return cid; | return cid; | ||||
| } | } | ||||
| public String getCidStr() { | |||||
| String format = String.format(Locale.US, "0x%02X", cid); | |||||
| return format; | |||||
| } | |||||
| public void setCid(int cid) { | public void setCid(int cid) { | ||||
| this.cid = cid; | this.cid = cid; | ||||
| } | } |
| import android.view.MenuItem; | import android.view.MenuItem; | ||||
| import android.view.View; | import android.view.View; | ||||
| import android.widget.EditText; | import android.widget.EditText; | ||||
| import android.widget.TextView; | |||||
| import androidx.annotation.NonNull; | import androidx.annotation.NonNull; | ||||
| import androidx.annotation.Nullable; | import androidx.annotation.Nullable; | ||||
| import androidx.recyclerview.widget.LinearLayoutManager; | import androidx.recyclerview.widget.LinearLayoutManager; | ||||
| import androidx.recyclerview.widget.RecyclerView; | import androidx.recyclerview.widget.RecyclerView; | ||||
| import com.besthealth.bhBodyComposition120.BhBodyComposition; | |||||
| import com.elinkthings.httplibrary.OnHttpListener; | |||||
| import com.elinkthings.httplibrary.license.LicenseHttpBean; | |||||
| import com.elinkthings.httplibrary.license.LicenseHttpUtils; | |||||
| import com.pingwang.bluetoothlib.AILinkBleManager; | import com.pingwang.bluetoothlib.AILinkBleManager; | ||||
| import com.pingwang.bluetoothlib.AILinkSDK; | import com.pingwang.bluetoothlib.AILinkSDK; | ||||
| import com.pingwang.bluetoothlib.bean.AilinkLicenseBean; | import com.pingwang.bluetoothlib.bean.AilinkLicenseBean; | ||||
| import com.pingwang.bluetoothlib.bean.BleValueBean; | import com.pingwang.bluetoothlib.bean.BleValueBean; | ||||
| import com.pingwang.bluetoothlib.device.AiLinkBleCheckUtil; | |||||
| import com.pingwang.bluetoothlib.listener.OnCallbackBle; | import com.pingwang.bluetoothlib.listener.OnCallbackBle; | ||||
| import com.pingwang.bluetoothlib.utils.BleLog; | import com.pingwang.bluetoothlib.utils.BleLog; | ||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||
| import java.util.Arrays; | |||||
| import java.util.List; | import java.util.List; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.AboutActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.AboutActivity; | ||||
| private Context mContext; | private Context mContext; | ||||
| private RecyclerView rvList; | private RecyclerView rvList; | ||||
| private TextView tvLog; | |||||
| private ArrayList<JumpBean> mList = new ArrayList<>(); | private ArrayList<JumpBean> mList = new ArrayList<>(); | ||||
| private ArrayList<JumpBean> homeDataList = HomeDataManager.getHomeDataList(); | private ArrayList<JumpBean> homeDataList = HomeDataManager.getHomeDataList(); | ||||
| private CharSequence inputData = ""; | private CharSequence inputData = ""; | ||||
| initView(); | initView(); | ||||
| initData(); | initData(); | ||||
| initListener(); | initListener(); | ||||
| int bodyComposition = new BhBodyComposition().getBodyComposition(); | |||||
| L.i("bodyComposition:" + bodyComposition); | |||||
| EditText etSearch = findViewById(R.id.etSearch); | EditText etSearch = findViewById(R.id.etSearch); | ||||
| etSearch.addTextChangedListener(new TextWatcher() { | etSearch.addTextChangedListener(new TextWatcher() { | ||||
| } | } | ||||
| }); | }); | ||||
| } | } | ||||
| protected void initData() { | protected void initData() { | ||||
| initPermissions(); | initPermissions(); | ||||
| List<AilinkLicenseBean> list = new ArrayList<>(); | |||||
| list.add(new AilinkLicenseBean(0x2F, 0x03, 0x09)); | |||||
| list.add(new AilinkLicenseBean(0x2F, 0x03, 0x01)); | |||||
| list.add(new AilinkLicenseBean(65544, 103, 0)); | |||||
| list.add(new AilinkLicenseBean(65544, 21, 0)); | |||||
| list.add(new AilinkLicenseBean(0x02, 0x99, 0x01)); | |||||
| AILinkSDK.getInstance().initLicense(list); | |||||
| refreshLicenseData(); | |||||
| byte[] data = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06}; | |||||
| int crc16 = AiLinkBleCheckUtil.getCrc16(data); | |||||
| L.i("crc16:" + crc16); | |||||
| // AiLinkPwdUtil | |||||
| // List<AilinkLicenseBean> list = new ArrayList<>(); | |||||
| // list.add(new AilinkLicenseBean(0x2F, 0x03, 0x09)); | |||||
| // list.add(new AilinkLicenseBean(0x2F, 0x03, 0x01)); | |||||
| // list.add(new AilinkLicenseBean(65544, 103, 0)); | |||||
| // list.add(new AilinkLicenseBean(65544, 21, 0)); | |||||
| // list.add(new AilinkLicenseBean(0x02, 0x99, 0x01)); | |||||
| // | |||||
| // AILinkSDK.getInstance().initLicense(list); | |||||
| } | } | ||||
| private List<AilinkLicenseBean> mLicenseBeans; | |||||
| /** | |||||
| * 刷新许可数据 | |||||
| */ | |||||
| private void refreshLicenseData() { | |||||
| if (mLicenseBeans == null) { | |||||
| mLicenseBeans = new ArrayList<>(); | |||||
| } | |||||
| new LicenseHttpUtils().getLicenseList(new OnHttpListener<List<LicenseHttpBean>>() { | |||||
| @Override | |||||
| public void onSuccess(List<LicenseHttpBean> data) { | |||||
| if (data != null) { | |||||
| L.iw("License:" + Arrays.toString(data.toArray())); | |||||
| // tvLog.setText("License成功:" + data.size()); | |||||
| for (LicenseHttpBean datum : data) { | |||||
| //最好做一下判断,免得后端抽风改了就寄了 | |||||
| if (datum != null) { | |||||
| AilinkLicenseBean ailinkLicenseBean = new AilinkLicenseBean(); | |||||
| ailinkLicenseBean.setCid(datum.getCid()); | |||||
| ailinkLicenseBean.setVid(datum.getVid()); | |||||
| ailinkLicenseBean.setPid(datum.getPid()); | |||||
| mLicenseBeans.add(ailinkLicenseBean); | |||||
| } | |||||
| } | |||||
| //还是判断一下初始化有没有完成吧 | |||||
| if (AILinkSDK.getInstance().isInitOk() && mLicenseBeans != null && !mLicenseBeans.isEmpty()) { | |||||
| AILinkSDK.getInstance().initLicense(mLicenseBeans); | |||||
| } | |||||
| } else { | |||||
| tvLog.setText("License失败:null"); | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public void onFailed(List<LicenseHttpBean> data) { | |||||
| tvLog.setText("License失败:网络问题"); | |||||
| } | |||||
| }); | |||||
| } | |||||
| private int count = 0; | private int count = 0; | ||||
| private OnCallbackBle mOnCallbackBle = new OnCallbackBle() { | private OnCallbackBle mOnCallbackBle = new OnCallbackBle() { | ||||
| @Override | @Override | ||||
| protected void initView() { | protected void initView() { | ||||
| BleLog.init(true); | |||||
| //connectDevice(BleValueBean bleValueBean);连接的时候需要传广播对象,否则返回的cid,vid,pid始终都是0 | //connectDevice(BleValueBean bleValueBean);连接的时候需要传广播对象,否则返回的cid,vid,pid始终都是0 | ||||
| //sdk | //sdk | ||||
| AILinkSDK.getInstance().init(mContext); | AILinkSDK.getInstance().init(mContext); | ||||
| AILinkBleManager.getInstance().init(mContext, new AILinkBleManager.onInitListener() { | AILinkBleManager.getInstance().init(mContext, new AILinkBleManager.onInitListener() { | ||||
| @Override | @Override | ||||
| public void onInitSuccess() { | public void onInitSuccess() { | ||||
| L.i("初始化成功"); | |||||
| // AILinkBleManager.getInstance().setOnCallbackBle(mOnCallbackBle); | // AILinkBleManager.getInstance().setOnCallbackBle(mOnCallbackBle); | ||||
| } | } | ||||
| SP.init(this); | SP.init(this); | ||||
| rvList = findViewById(R.id.rv_list); | rvList = findViewById(R.id.rv_list); | ||||
| tvLog = findViewById(R.id.tvLog); | |||||
| rvList.setLayoutManager(new LinearLayoutManager(this)); | rvList.setLayoutManager(new LinearLayoutManager(this)); | ||||
| mList.clear(); | mList.clear(); | ||||
| mList.addAll(homeDataList); | mList.addAll(homeDataList); |
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | ||||
| /** | /** | ||||
| * 噪音计(ble) | |||||
| * demo参考界面 | |||||
| * | * | ||||
| * @author xing | * @author xing | ||||
| */ | */ |
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.WifiDialog; | import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.WifiDialog; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.SP; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | ||||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatDataUtil; | import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatDataUtil; | ||||
| , OnMcuParameterListener, OnBleCompanyListener, View.OnClickListener, OnBleDeviceDataListener, OnBleConnectStatus { | , OnMcuParameterListener, OnBleCompanyListener, View.OnClickListener, OnBleDeviceDataListener, OnBleConnectStatus { | ||||
| private static String TAG = PublicBleNetworkCmdActivity.class.getName(); | private static String TAG = PublicBleNetworkCmdActivity.class.getName(); | ||||
| private final static String WIFI_IP_KEY = "WIFI_IP_KEY"; | |||||
| private final static String WIFI_PORT_KEY = "WIFI_PORT_KEY"; | |||||
| private final static String WIFI_URL_KEY = "WIFI_URL_KEY"; | |||||
| private final int REFRESH_DATA = 3; | private final int REFRESH_DATA = 3; | ||||
| private List<String> mList; | private List<String> mList; | ||||
| private ArrayAdapter listAdapter; | private ArrayAdapter listAdapter; | ||||
| mList = new ArrayList<>(); | mList = new ArrayList<>(); | ||||
| listView = findViewById(R.id.listview); | listView = findViewById(R.id.listview); | ||||
| select_wifi_et = findViewById(R.id.select_wifi_et); | select_wifi_et = findViewById(R.id.select_wifi_et); | ||||
| String ip = (String) SP.getInstance().get(WIFI_IP_KEY, ""); | |||||
| et_ip = findViewById(R.id.et_ip); | et_ip = findViewById(R.id.et_ip); | ||||
| et_ip.setText(ip); | |||||
| String port = (String) SP.getInstance().get(WIFI_PORT_KEY, ""); | |||||
| et_port = findViewById(R.id.et_port); | et_port = findViewById(R.id.et_port); | ||||
| et_port.setText(port); | |||||
| String url = (String) SP.getInstance().get(WIFI_URL_KEY, ""); | |||||
| et_url = findViewById(R.id.et_url); | et_url = findViewById(R.id.et_url); | ||||
| et_url.setText(url); | |||||
| listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | ||||
| listView.setAdapter(listAdapter); | listView.setAdapter(listAdapter); | ||||
| findViewById(R.id.clear).setOnClickListener(this); | findViewById(R.id.clear).setOnClickListener(this); | ||||
| findViewById(R.id.scan_wifi).setOnClickListener(this); | |||||
| findViewById(R.id.scanWifi).setOnClickListener(this); | |||||
| findViewById(R.id.check_wifi_state).setOnClickListener(this); | findViewById(R.id.check_wifi_state).setOnClickListener(this); | ||||
| findViewById(R.id.check_device_id).setOnClickListener(this); | findViewById(R.id.check_device_id).setOnClickListener(this); | ||||
| findViewById(R.id.connect_wifi).setOnClickListener(this); | |||||
| findViewById(R.id.disconnect).setOnClickListener(this); | |||||
| findViewById(R.id.connectWifi).setOnClickListener(this); | |||||
| findViewById(R.id.disconnectWifi).setOnClickListener(this); | |||||
| findViewById(R.id.get_set_name).setOnClickListener(this); | findViewById(R.id.get_set_name).setOnClickListener(this); | ||||
| findViewById(R.id.get_set_paw).setOnClickListener(this); | findViewById(R.id.get_set_paw).setOnClickListener(this); | ||||
| findViewById(R.id.reset).setOnClickListener(this); | findViewById(R.id.reset).setOnClickListener(this); | ||||
| @Override | @Override | ||||
| public void onClick(View v) { | public void onClick(View v) { | ||||
| switch (v.getId()) { | |||||
| int id = v.getId(); | |||||
| if (id == R.id.clear) { | |||||
| if (mList != null) | |||||
| mList.clear(); | |||||
| wifiMap.clear(); | |||||
| mMapWifiName.clear(); | |||||
| mList.add("扫描热点"); | |||||
| if (mBleDevice != null) mBleDevice.sendData(scanWifi()); | |||||
| } else if (id == R.id.scanWifi) { | |||||
| wifiMap.clear(); | |||||
| mMapWifiName.clear(); | |||||
| mList.add("扫描热点"); | |||||
| if (mBleDevice != null) mBleDevice.sendData(scanWifi()); | |||||
| } else if (id == R.id.check_wifi_state) { | |||||
| mList.add("查看wifi当前状态"); | |||||
| if (mBleDevice != null) mBleDevice.sendData(checkWiFiState()); | |||||
| } else if (id == R.id.check_device_id) { | |||||
| mList.add("查看设备的ID"); | |||||
| if (mBleDevice != null) mBleDevice.sendData(getSnDeviceId()); | |||||
| } else if (id == R.id.connectWifi) { | |||||
| try { | |||||
| no = Integer.parseInt(select_wifi_et.getText().toString()); | |||||
| String wifiMac = wifiMap.get(no); | |||||
| String wifiName = mMapWifiName.get(no); | |||||
| WifiDialog.newInstance().setTitle(wifiName, wifiMac).setOnDialogListener(new WifiDialog.OnDialogListener() { | |||||
| @Override | |||||
| public void tvCancelListener(View v) { | |||||
| case R.id.clear: | |||||
| if (mList != null) | |||||
| mList.clear(); | |||||
| case R.id.scan_wifi: | |||||
| wifiMap.clear(); | |||||
| mMapWifiName.clear(); | |||||
| mList.add("扫描热点"); | |||||
| if (mBleDevice != null) mBleDevice.sendData(scanWifi()); | |||||
| break; | |||||
| case R.id.check_wifi_state: | |||||
| mList.add("查看wifi当前状态"); | |||||
| if (mBleDevice != null) mBleDevice.sendData(checkWiFiState()); | |||||
| break; | |||||
| case R.id.check_device_id: | |||||
| mList.add("查看设备的ID"); | |||||
| if (mBleDevice != null) mBleDevice.sendData(getSnDeviceId()); | |||||
| break; | |||||
| case R.id.connect_wifi: | |||||
| try { | |||||
| no = Integer.parseInt(select_wifi_et.getText().toString()); | |||||
| String wifiMac = wifiMap.get(no); | |||||
| String wifiName = mMapWifiName.get(no); | |||||
| WifiDialog.newInstance().setTitle(wifiName, wifiMac).setOnDialogListener(new WifiDialog.OnDialogListener() { | |||||
| @Override | |||||
| public void tvCancelListener(View v) { | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public void tvSucceedListener(View v, String data) { | |||||
| mBleDevice.sendData(setWifiMac(wifiMac)); | |||||
| if (data.equals("") || data.length() >= 8) { | |||||
| setPaw(data); | |||||
| } else { | |||||
| mList.add("按照操作规则来,输入密码。"); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| @Override | |||||
| public void tvSucceedListener(View v, String data) { | |||||
| mBleDevice.sendData(setWifiMac(wifiMac)); | |||||
| if (data.equals("") || data.length() >= 8) { | |||||
| setPaw(data); | |||||
| } else { | |||||
| mList.add("按照操作规则来,输入密码。"); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | } | ||||
| }).show(getSupportFragmentManager()); | |||||
| } catch (Exception e) { | |||||
| e.printStackTrace(); | |||||
| //不输入编号,不输入数字,瞎搞的人。呸 | |||||
| mList.add("按照操作规则来,输入热点编号。"); | |||||
| } | |||||
| break; | |||||
| case R.id.disconnect: | |||||
| mList.add("断开连接"); | |||||
| if (mBleDevice != null) mBleDevice.sendData(setDisconnectWifi()); | |||||
| break; | |||||
| case R.id.get_set_paw: | |||||
| mList.add("获取到设置的密码"); | |||||
| if (mBleDevice != null) mBleDevice.sendData(getConnectWifiPwd()); | |||||
| break; | |||||
| case R.id.get_set_name: | |||||
| mList.add("获取到设置的热点"); | |||||
| if (mBleDevice != null) mBleDevice.sendData(getConnectWifiName()); | |||||
| break; | |||||
| case R.id.reset: | |||||
| mList.add("回复出厂设置"); | |||||
| if (mBleDevice != null) mBleDevice.sendData(reset()); | |||||
| break; | |||||
| case R.id.check_ip: | |||||
| mList.add("查看Ip"); | |||||
| if (mBleDevice != null) mBleDevice.sendData(checkIp()); | |||||
| break; | |||||
| case R.id.check_port: | |||||
| mList.add("查看端口号"); | |||||
| if (mBleDevice != null) mBleDevice.sendData(checkPort()); | |||||
| break; | |||||
| case R.id.check_url: | |||||
| mList.add("查看URL"); | |||||
| if (mBleDevice != null) mBleDevice.sendData(checkUrl()); | |||||
| break; | |||||
| case R.id.set_ip: | |||||
| String ipStr = et_ip.getText().toString(); | |||||
| if (!ipStr.isEmpty()) { | |||||
| mList.add("设置Ip地址"); | |||||
| setIp(convertToASCII(ipStr)); | |||||
| } else { | |||||
| mList.add("最起码把Ip地址填一下吧"); | |||||
| } | |||||
| break; | |||||
| case R.id.set_url: | |||||
| String urlStr = et_url.getText().toString(); | |||||
| mList.add("设置路径地址"); | |||||
| setIpUrl(convertToASCII(urlStr)); | |||||
| break; | |||||
| case R.id.set_port: | |||||
| try { | |||||
| int port = Integer.parseInt(et_port.getText().toString()); | |||||
| mList.add("设置Ip地址"); | |||||
| setPort(port); | |||||
| } catch (Exception e) { | |||||
| e.printStackTrace(); | |||||
| mList.add("输入的数字"); | |||||
| } | |||||
| break; | |||||
| } | |||||
| }).show(getSupportFragmentManager()); | |||||
| } catch (Exception e) { | |||||
| e.printStackTrace(); | |||||
| //不输入编号,不输入数字,瞎搞的人。呸 | |||||
| mList.add("按照操作规则来,输入热点编号。"); | |||||
| } | |||||
| } else if (id == R.id.disconnectWifi) { | |||||
| mList.add("断开连接"); | |||||
| if (mBleDevice != null) mBleDevice.sendData(setDisconnectWifi()); | |||||
| } else if (id == R.id.get_set_paw) { | |||||
| mList.add("获取到设置的密码"); | |||||
| if (mBleDevice != null) mBleDevice.sendData(getConnectWifiPwd()); | |||||
| } else if (id == R.id.get_set_name) { | |||||
| mList.add("获取到设置的热点"); | |||||
| if (mBleDevice != null) mBleDevice.sendData(getConnectWifiName()); | |||||
| } else if (id == R.id.reset) { | |||||
| mList.add("回复出厂设置"); | |||||
| if (mBleDevice != null) mBleDevice.sendData(reset()); | |||||
| } else if (id == R.id.check_ip) { | |||||
| mList.add("查看Ip"); | |||||
| if (mBleDevice != null) { | |||||
| mBleDevice.sendData(checkIp()); | |||||
| } | |||||
| } else if (id == R.id.check_port) { | |||||
| mList.add("查看端口号"); | |||||
| if (mBleDevice != null) { | |||||
| mBleDevice.sendData(checkPort()); | |||||
| } | |||||
| } else if (id == R.id.check_url) { | |||||
| mList.add("查看URL"); | |||||
| if (mBleDevice != null) { | |||||
| mBleDevice.sendData(checkUrl()); | |||||
| } | |||||
| } else if (id == R.id.set_ip) { | |||||
| String ipStr = et_ip.getText().toString(); | |||||
| if (!ipStr.isEmpty()) { | |||||
| mList.add("设置Ip地址"); | |||||
| setIp(convertToASCII(ipStr)); | |||||
| SP.getInstance().put(WIFI_IP_KEY, ipStr); | |||||
| } else { | |||||
| mList.add("请输入Ip地址"); | |||||
| } | |||||
| } else if (id == R.id.set_url) { | |||||
| String urlStr = et_url.getText().toString(); | |||||
| mList.add("设置路径地址"); | |||||
| setIpUrl(convertToASCII(urlStr)); | |||||
| SP.getInstance().put(WIFI_URL_KEY, urlStr); | |||||
| } else if (id == R.id.set_port) { | |||||
| try { | |||||
| int port = Integer.parseInt(et_port.getText().toString()); | |||||
| mList.add("设置Ip地址"); | |||||
| setPort(port); | |||||
| SP.getInstance().put(WIFI_PORT_KEY, String.valueOf(port)); | |||||
| } catch (Exception e) { | |||||
| e.printStackTrace(); | |||||
| mList.add("输入的数字"); | |||||
| } | |||||
| } | } | ||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | mHandler.sendEmptyMessage(REFRESH_DATA); | ||||
| public void onDisConnected(@NonNull String mac, int code) { | public void onDisConnected(@NonNull String mac, int code) { | ||||
| //TODO 连接断开 | //TODO 连接断开 | ||||
| if (mAddress.equals(mac)) { | if (mAddress.equals(mac)) { | ||||
| finish(); | finish(); | ||||
| } | } | ||||
| } | } | ||||
| @Override | @Override | ||||
| public void onBleConnectStatus(int bleStatus, int wifiStatus, int workStatus) { | public void onBleConnectStatus(int bleStatus, int wifiStatus, int workStatus) { | ||||
| String wifiStatusStr = ""; | |||||
| String bleStatusStr = bleStatus + "_"; | |||||
| //蓝牙状态 0:无连接 1:已连接 | |||||
| if (bleStatus == 0) { | |||||
| bleStatusStr += "无连接"; | |||||
| } else if (bleStatus == 1) { | |||||
| bleStatusStr += "已连接"; | |||||
| } | |||||
| String wifiStatusStr = wifiStatus + "_"; | |||||
| //wifi状态 0:未配置 AP; 1:连接 AP 失败,连接时密码错误、AP 信号不好、主动断开都会是这个状态; 2:连接的 AP 信号不好; 3:成功连接上 AP; 4:正在连接 AP; | |||||
| switch (wifiStatus) { | switch (wifiStatus) { | ||||
| case 0: | case 0: | ||||
| wifiStatusStr = "未配置AP"; | |||||
| wifiStatusStr += "未配置AP"; | |||||
| break; | break; | ||||
| case 1: | case 1: | ||||
| wifiStatusStr = "连接AP失败"; | |||||
| wifiStatusStr += "连接AP失败"; | |||||
| break; | break; | ||||
| case 2: | case 2: | ||||
| wifiStatusStr = "连接的AP信号不好"; | |||||
| wifiStatusStr += "连接的AP信号不好"; | |||||
| break; | break; | ||||
| case 3: | case 3: | ||||
| wifiStatusStr = "成功连接上AP"; | |||||
| wifiStatusStr += "成功连接上AP"; | |||||
| break; | break; | ||||
| case 4: | case 4: | ||||
| wifiStatusStr = "正在连接AP"; | |||||
| wifiStatusStr += "正在连接AP"; | |||||
| break; | break; | ||||
| } | } | ||||
| mList.add("蓝牙状态:" + bleStatus + "\nwifi状态:" + wifiStatusStr + "\n工作状态:" + workStatus); | |||||
| String workStatusStr = workStatus + "_"; | |||||
| //工作状态 0:唤醒 1:进入休眠 2:模块准备就绪 | |||||
| switch (workStatus) { | |||||
| case 0: | |||||
| workStatusStr += "唤醒"; | |||||
| break; | |||||
| case 1: | |||||
| workStatusStr += "进入休眠"; | |||||
| break; | |||||
| case 2: | |||||
| workStatusStr += "模块准备就绪"; | |||||
| break; | |||||
| } | |||||
| mList.add("蓝牙状态:" + bleStatusStr + "\nwifi状态:" + wifiStatusStr + "\n工作状态:" + workStatusStr); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | mHandler.sendEmptyMessage(REFRESH_DATA); | ||||
| } | } | ||||
| bytes[0] = (byte) CmdConfig.SET_WIFI_MAC; | bytes[0] = (byte) CmdConfig.SET_WIFI_MAC; | ||||
| String[] s = mac.split(":"); | String[] s = mac.split(":"); | ||||
| for (int i = 0; i < s.length; i++) { | for (int i = 0; i < s.length; i++) { | ||||
| bytes[i + 1] = (byte) Integer.parseInt(s[s.length -1 - i], 16); | |||||
| bytes[i + 1] = (byte) Integer.parseInt(s[s.length - 1 - i], 16); | |||||
| } | } | ||||
| return getSendBleBean(bytes); | return getSendBleBean(bytes); | ||||
| package aicare.net.cn.sdk.ailinksdkdemoandroid.modules; | |||||
| import android.os.Message; | |||||
| import android.text.TextUtils; | |||||
| import android.view.View; | |||||
| import android.widget.ArrayAdapter; | |||||
| import android.widget.EditText; | |||||
| import android.widget.ListView; | |||||
| import android.widget.TextView; | |||||
| import com.elinkthings.elinkmqttlib.listener.OnMqttConnectListener; | |||||
| import com.elinkthings.elinkmqttlib.listener.OnMqttMessageListener; | |||||
| import com.elinkthings.elinkmqttlib.listener.OnMqttOtherMessageListener; | |||||
| import com.elinkthings.elinkmqttlib.mqtt.MqttDevice; | |||||
| import com.elinkthings.elinkmqttlib.mqtt.MqttManager; | |||||
| import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||||
| import java.util.ArrayList; | |||||
| import java.util.Arrays; | |||||
| import java.util.List; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.AppBaseActivity; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||||
| /** | |||||
| * 公共mqtt界面 | |||||
| * | |||||
| * @author xing | |||||
| * @date 2024/04/19 | |||||
| */ | |||||
| public class PublicMqttActivity extends AppBaseActivity implements View.OnClickListener, OnMqttMessageListener, OnMqttOtherMessageListener { | |||||
| private final int REFRESH_DATA = 1; | |||||
| private EditText etAppUserId; | |||||
| private EditText etDeviceId; | |||||
| private EditText etSendData; | |||||
| private EditText etSendDataDeviceId; | |||||
| private TextView tvDeviceList; | |||||
| private List<String> mList; | |||||
| private ArrayAdapter listAdapter; | |||||
| private ListView lv_log; | |||||
| /** | |||||
| * _mac地址用于加解密,这里随便写一个,实际使用时需要替换 | |||||
| */ | |||||
| private String mMac = "00:00:00:00:00:00"; | |||||
| @Override | |||||
| protected void uiHandlerMessage(Message msg) { | |||||
| if (msg.what == REFRESH_DATA) { | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } | |||||
| } | |||||
| @Override | |||||
| protected int getLayoutId() { | |||||
| return R.layout.activity_public_mqtt; | |||||
| } | |||||
| @Override | |||||
| protected void initListener() { | |||||
| MqttManager.getInstance().addOnMqttConnectListener(new OnMqttConnectListener() { | |||||
| @Override | |||||
| public void onConnected() { | |||||
| addLog("Mqtt连接成功"); | |||||
| } | |||||
| @Override | |||||
| public void onConnecting() { | |||||
| addLog("Mqtt正在连接中"); | |||||
| } | |||||
| @Override | |||||
| public void onDisconnect(int errCode) { | |||||
| addLog("Mqtt断开连接,错误码:" + errCode); | |||||
| } | |||||
| @Override | |||||
| public void onSubscribeSuccess(String... topics) { | |||||
| addLog("订阅成功:\n" + Arrays.toString(topics)); | |||||
| for (String topic : topics) { | |||||
| MqttDevice device = MqttManager.getInstance().getDeviceForTopic(topic); | |||||
| device.setOnMqttMessageListener(PublicMqttActivity.this); | |||||
| device.setOnMqttOtherMessageListener(PublicMqttActivity.this); | |||||
| device.setOnA7EncryptionListener(new MqttDevice.OnA7EncryptionListener() { | |||||
| @Override | |||||
| public byte[] onA7Encryption(int cid, byte[] cidBytes, byte[] payload) { | |||||
| // return AiLinkPwdUtil.mcuEncrypt(cidBytes, getMacByte(mMac), payload); | |||||
| return payload; | |||||
| } | |||||
| }); | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public void onSubscribeFail(String... topics) { | |||||
| addLog("订阅失败:\n" + Arrays.toString(topics)); | |||||
| } | |||||
| }); | |||||
| } | |||||
| @Override | |||||
| public void onMessage(String topic, String deviceId, int cid, byte[] payload) { | |||||
| addLog("设备ID:" + deviceId + " 接收到消息:" + BleStrUtils.byte2HexStr(payload)); | |||||
| } | |||||
| @Override | |||||
| public void onSendSuccess(String topic, String deviceId, byte[] payload) { | |||||
| addLog("设备ID:" + deviceId + " 发送消息成功:" + BleStrUtils.byte2HexStr(payload)); | |||||
| } | |||||
| @Override | |||||
| public void onSendFailure(String topic, String deviceId, byte[] payload, int errCode, int retryCount) { | |||||
| addLog("设备ID:" + deviceId + " 发送消息失败:" + BleStrUtils.byte2HexStr(payload)); | |||||
| } | |||||
| @Override | |||||
| public void onOtherMessage(String topic, String deviceId, byte[] hex) { | |||||
| addLog("设备ID:" + deviceId + " 接收到透传消息:" + BleStrUtils.byte2HexStr(hex)); | |||||
| } | |||||
| @Override | |||||
| public void onClick(View v) { | |||||
| int id = v.getId(); | |||||
| if (id == R.id.btnClearShakeHands) { | |||||
| mList.clear(); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } else if (id == R.id.btnConnectMqtt) { | |||||
| String appId = etAppUserId.getText().toString(); | |||||
| if (TextUtils.isEmpty(appId)) { | |||||
| addLog("App Id不能为空"); | |||||
| return; | |||||
| } | |||||
| //禁止etAppUserId编辑 | |||||
| etAppUserId.setEnabled(false); | |||||
| MqttManager.getInstance().init(this, appId); | |||||
| addLog("正在连接Mqtt:" + appId); | |||||
| MqttManager.getInstance().connectMqtt(); | |||||
| } else if (id == R.id.btnDisconnectMqtt) { | |||||
| etAppUserId.setEnabled(true); | |||||
| addLog("正在断开Mqtt连接"); | |||||
| MqttManager.getInstance().disconnect(); | |||||
| } else if (id == R.id.btnAddDevice) { | |||||
| String deviceId = etDeviceId.getText().toString(); | |||||
| MqttManager.getInstance().addDevice(deviceId); | |||||
| addLog("添加设备:" + deviceId); | |||||
| etDeviceId.setText(""); | |||||
| refreshDeviceList(); | |||||
| } else if (id == R.id.btnRemoveDevice) { | |||||
| String deviceId = etDeviceId.getText().toString(); | |||||
| MqttManager.getInstance().removeDevice(deviceId); | |||||
| addLog("移除设备:" + deviceId); | |||||
| etDeviceId.setText(""); | |||||
| refreshDeviceList(); | |||||
| } else if (id == R.id.btnSendData) { | |||||
| String data = etSendData.getText().toString().trim(); | |||||
| data = data.replaceAll(" ", ""); | |||||
| if (TextUtils.isEmpty(data)) { | |||||
| addLog("发送数据不能为空"); | |||||
| return; | |||||
| } | |||||
| String deviceId = etSendDataDeviceId.getText().toString(); | |||||
| if (TextUtils.isEmpty(deviceId)) { | |||||
| addLog("设备Id不能为空"); | |||||
| return; | |||||
| } | |||||
| byte[] bytes = new byte[0]; | |||||
| try { | |||||
| bytes = BleStrUtils.stringToByte(data); | |||||
| } catch (Exception e) { | |||||
| e.printStackTrace(); | |||||
| } | |||||
| MqttDevice device = MqttManager.getInstance().getDevice(deviceId); | |||||
| if (device != null) { | |||||
| if (bytes.length == 0) { | |||||
| addLog("发送数据不能为空"); | |||||
| return; | |||||
| } | |||||
| device.sendData(bytes); | |||||
| addLog("发送数据:" + data + " 设备:" + deviceId); | |||||
| } else { | |||||
| addLog("设备不存在或者未连接:" + deviceId); | |||||
| } | |||||
| } | |||||
| } | |||||
| @Override | |||||
| protected void initData() { | |||||
| mList = new ArrayList<>(); | |||||
| listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | |||||
| lv_log.setAdapter(listAdapter); | |||||
| } | |||||
| @Override | |||||
| protected void initView() { | |||||
| findViewById(R.id.btnClearShakeHands).setOnClickListener(this); | |||||
| findViewById(R.id.btnConnectMqtt).setOnClickListener(this); | |||||
| findViewById(R.id.btnDisconnectMqtt).setOnClickListener(this); | |||||
| etAppUserId = (EditText) findViewById(R.id.etAppUserId); | |||||
| etDeviceId = (EditText) findViewById(R.id.etDeviceId); | |||||
| findViewById(R.id.btnAddDevice).setOnClickListener(this); | |||||
| findViewById(R.id.btnRemoveDevice).setOnClickListener(this); | |||||
| tvDeviceList = (TextView) findViewById(R.id.tvDeviceList); | |||||
| lv_log = findViewById(R.id.lv_log); | |||||
| etSendData = (EditText) findViewById(R.id.etSendData); | |||||
| etSendDataDeviceId = (EditText) findViewById(R.id.etSendDataDeviceId); | |||||
| findViewById(R.id.btnSendData).setOnClickListener(this); | |||||
| } | |||||
| private void refreshDeviceList() { | |||||
| List<String> deviceList = MqttManager.getInstance().getDeviceList(); | |||||
| String deviceListStr = TextUtils.join(",", deviceList); | |||||
| tvDeviceList.setText(deviceListStr); | |||||
| } | |||||
| /** | |||||
| * 添加日志 | |||||
| * | |||||
| * @param log 日志 | |||||
| */ | |||||
| private void addLog(String log) { | |||||
| log = TimeUtils.getTimeSSS() + log; | |||||
| mList.add(0, log); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| /** | |||||
| * 获取mac字节 | |||||
| * | |||||
| * @param mac mac | |||||
| * @return {@link byte[]} | |||||
| */ | |||||
| private byte[] getMacByte(String mac) { | |||||
| byte[] macByte = new byte[6]; | |||||
| if (mac.contains(":")) { | |||||
| String[] macArr = mac.split(":"); | |||||
| for (int i = 0; i < macArr.length; i++) { | |||||
| macByte[macArr.length - i - 1] = (byte) Integer.parseInt(macArr[i], 16); | |||||
| } | |||||
| } | |||||
| return macByte; | |||||
| } | |||||
| } |
| import com.pingwang.bluetoothlib.device.BleDevice; | import com.pingwang.bluetoothlib.device.BleDevice; | ||||
| import com.pingwang.bluetoothlib.device.BleSendCmdUtil; | import com.pingwang.bluetoothlib.device.BleSendCmdUtil; | ||||
| import com.pingwang.bluetoothlib.device.SendBleBean; | import com.pingwang.bluetoothlib.device.SendBleBean; | ||||
| import com.pingwang.bluetoothlib.device.wifibleDevice.WifiBleDeviceData; | |||||
| import com.pingwang.bluetoothlib.device.wifibleDevice.WifiBleInfoBean; | |||||
| import com.pingwang.bluetoothlib.listener.CallbackDisIm; | import com.pingwang.bluetoothlib.listener.CallbackDisIm; | ||||
| import com.pingwang.bluetoothlib.listener.OnBleCompanyListener; | import com.pingwang.bluetoothlib.listener.OnBleCompanyListener; | ||||
| import com.pingwang.bluetoothlib.listener.OnBleDeviceDataListener; | import com.pingwang.bluetoothlib.listener.OnBleDeviceDataListener; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L; | import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.SP; | import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.SP; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | ||||
| import cn.net.aicare.modulelibrary.module.wifibleDevice.WifiBleDeviceData; | |||||
| import cn.net.aicare.modulelibrary.module.wifibleDevice.WifiBleInfoBean; | |||||
| /** | /** | ||||
| @Override | @Override | ||||
| public void onClick(View v) { | public void onClick(View v) { | ||||
| switch (v.getId()) { | |||||
| case R.id.clear: | |||||
| if (mList != null) | |||||
| mList.clear(); | |||||
| int id = v.getId(); | |||||
| if (id == R.id.clear) { | |||||
| if (mList != null) | |||||
| mList.clear(); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| SP.getInstance().put(WIFI_BLE_SSID, ""); | |||||
| SP.getInstance().put(WIFI_BLE_SSID_MAC, ""); | |||||
| SP.getInstance().put(WIFI_BLE_PWD, ""); | |||||
| mSsid = ""; | |||||
| mMac = ""; | |||||
| mPwd = ""; | |||||
| if (tv_wifi_info != null) { | |||||
| tv_wifi_info.setText(""); | |||||
| } | |||||
| } else if (id == R.id.btn_read_wifi_status) { | |||||
| if (mWifiBleDeviceData != null) { | |||||
| mWifiBleDeviceData.getWifiCurrentState(); | |||||
| } | |||||
| } else if (id == R.id.btn_start_ota) { | |||||
| if (mWifiBleDeviceData != null) { | |||||
| setConnectWifi(mMac, mPwd); | |||||
| } | |||||
| } else if (id == R.id.btn_wifi) { | |||||
| if (mWifiBleDeviceData != null) { | |||||
| mWifiBleDeviceData.getWifiList(); | |||||
| mList.add(TimeUtils.getTime() + "正在扫描附近可用的wifi..."); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | mHandler.sendEmptyMessage(REFRESH_DATA); | ||||
| SP.getInstance().put(WIFI_BLE_SSID, ""); | |||||
| SP.getInstance().put(WIFI_BLE_SSID_MAC, ""); | |||||
| SP.getInstance().put(WIFI_BLE_PWD, ""); | |||||
| mSsid = ""; | |||||
| mMac = ""; | |||||
| mPwd = ""; | |||||
| if (tv_wifi_info != null) { | |||||
| tv_wifi_info.setText(""); | |||||
| } | |||||
| break; | |||||
| case R.id.btn_read_wifi_status: | |||||
| if (mWifiBleDeviceData != null) { | |||||
| mWifiBleDeviceData.getWifiCurrentState(); | |||||
| } | |||||
| break; | |||||
| case R.id.btn_start_ota: | |||||
| if (mWifiBleDeviceData != null) { | |||||
| setConnectWifi(mMac, mPwd); | |||||
| } | |||||
| break; | |||||
| case R.id.btn_wifi: | |||||
| if (mWifiBleDeviceData != null) { | |||||
| mWifiBleDeviceData.getWifiList(); | |||||
| mList.add(TimeUtils.getTime() + "正在扫描附近可用的wifi..."); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| showWifiList(); | |||||
| break; | |||||
| default: | |||||
| break; | |||||
| } | |||||
| showWifiList(); | |||||
| } | } | ||||
| } | } | ||||
| if (mBleDevice == null) | if (mBleDevice == null) | ||||
| return; | return; | ||||
| SendBleBean sendBleBean = new SendBleBean(); | SendBleBean sendBleBean = new SendBleBean(); | ||||
| switch (v.getId()) { | |||||
| case R.id.btnVersion: | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||||
| mBleDevice.sendData(sendBleBean); | |||||
| break; | |||||
| case R.id.btnBattery: | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus()); | |||||
| mBleDevice.sendData(sendBleBean); | |||||
| break; | |||||
| case R.id.btn_get_did: | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getDid()); | |||||
| mBleDevice.sendData(sendBleBean); | |||||
| break; | |||||
| case R.id.btnClearShakeHands: | |||||
| if (mList != null) | |||||
| mList.clear(); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| break; | |||||
| case R.id.btnGetConfig: | |||||
| if (mBleDevice != null) { | |||||
| mBleDevice.getDeviceConfig(); | |||||
| int vId = v.getId(); | |||||
| if (vId == R.id.btnVersion) { | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||||
| mBleDevice.sendData(sendBleBean); | |||||
| } else if (vId == R.id.btnBattery) { | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus()); | |||||
| mBleDevice.sendData(sendBleBean); | |||||
| } else if (vId == R.id.btn_get_did) { | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getDid()); | |||||
| mBleDevice.sendData(sendBleBean); | |||||
| } else if (vId == R.id.btnClearShakeHands) { | |||||
| if (mList != null) | |||||
| mList.clear(); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } else if (vId == R.id.btnGetConfig) { | |||||
| if (mBleDevice != null) { | |||||
| mBleDevice.getDeviceConfig(); | |||||
| } | |||||
| } else if (vId == R.id.btnSetUnit) { | |||||
| if (mBleDevice != null) { | |||||
| if (mTempUnit == TempInstrumentBleConfig.UnitType.TEMP_UNIT_C) { | |||||
| mTempUnit = TempInstrumentBleConfig.UnitType.TEMP_UNIT_F; | |||||
| } else { | |||||
| mTempUnit = TempInstrumentBleConfig.UnitType.TEMP_UNIT_C; | |||||
| } | } | ||||
| break; | |||||
| case R.id.btnSetUnit: | |||||
| if (mBleDevice != null) { | |||||
| if (mTempUnit == TempInstrumentBleConfig.UnitType.TEMP_UNIT_C) { | |||||
| mTempUnit = TempInstrumentBleConfig.UnitType.TEMP_UNIT_F; | |||||
| mBleDevice.synUnit(mTempUnit); | |||||
| } | |||||
| } else if (vId == R.id.btnSetVolume) { | |||||
| if (!mConfigInfoStatus) | |||||
| return; | |||||
| for (int i = 0; i < mVolumeList.size(); i++) { | |||||
| int id = mVolumeList.get(i); | |||||
| if (id == mCurrentVolumeLevel) { | |||||
| if (mVolumeList.size() - 1 == i) { | |||||
| mCurrentVolumeLevel = mVolumeList.get(0); | |||||
| } else { | } else { | ||||
| mTempUnit = TempInstrumentBleConfig.UnitType.TEMP_UNIT_C; | |||||
| } | |||||
| mBleDevice.synUnit(mTempUnit); | |||||
| } | |||||
| break; | |||||
| case R.id.btnSetVolume: | |||||
| if (!mConfigInfoStatus) | |||||
| return; | |||||
| for (int i = 0; i < mVolumeList.size(); i++) { | |||||
| int id = mVolumeList.get(i); | |||||
| if (id == mCurrentVolumeLevel) { | |||||
| if (mVolumeList.size() - 1 == i) { | |||||
| mCurrentVolumeLevel = mVolumeList.get(0); | |||||
| } else { | |||||
| mCurrentVolumeLevel = mVolumeList.get(++i); | |||||
| } | |||||
| break; | |||||
| mCurrentVolumeLevel = mVolumeList.get(++i); | |||||
| } | } | ||||
| break; | |||||
| } | } | ||||
| mBleDevice.synVolume(mCurrentVolumeLevel); | |||||
| break; | |||||
| case R.id.btnSetLanguage: | |||||
| if (!mConfigInfoStatus) | |||||
| return; | |||||
| List<Long> languageIdTypeListAll = TempInstrumentDeviceData.LANGUAGE_ID_ALL_TYPE_LIST;//协议支持的全部语言ID,按照顺序保存的 | |||||
| long currentLanguageId = languageIdTypeListAll.get(mCurrentLanguageIndex);//获取当前的语言ID | |||||
| int languageIndex = 0;//下一个语言的下标,在支持的语言ID表中 | |||||
| for (int i = 0; i < mLanguageList.size(); i++) { | |||||
| long id = mLanguageList.get(i); | |||||
| //循环获得当前语言ID的下标 | |||||
| if (id == currentLanguageId) { | |||||
| //获取下一个语言下标 | |||||
| if (i == mLanguageList.size() - 1) { | |||||
| languageIndex = 0; | |||||
| } else { | |||||
| languageIndex = ++i; | |||||
| } | |||||
| break; | |||||
| } | |||||
| mBleDevice.synVolume(mCurrentVolumeLevel); | |||||
| } else if (vId == R.id.btnSetLanguage) { | |||||
| if (!mConfigInfoStatus) | |||||
| return; | |||||
| List<Long> languageIdTypeListAll = TempInstrumentDeviceData.LANGUAGE_ID_ALL_TYPE_LIST;//协议支持的全部语言ID,按照顺序保存的 | |||||
| long currentLanguageId = languageIdTypeListAll.get(mCurrentLanguageIndex);//获取当前的语言ID | |||||
| int languageIndex = 0;//下一个语言的下标,在支持的语言ID表中 | |||||
| for (int i = 0; i < mLanguageList.size(); i++) { | |||||
| long id = mLanguageList.get(i); | |||||
| //循环获得当前语言ID的下标 | |||||
| if (id == currentLanguageId) { | |||||
| //获取下一个语言下标 | |||||
| if (i == mLanguageList.size() - 1) { | |||||
| languageIndex = 0; | |||||
| } else { | |||||
| languageIndex = ++i; | |||||
| } | } | ||||
| break; | |||||
| } | } | ||||
| long languageId = mLanguageList.get(languageIndex);//下一个语言要发送的语言ID | |||||
| for (int i = 0; i < languageIdTypeListAll.size(); i++) { | |||||
| long aLong = languageIdTypeListAll.get(i); | |||||
| if (aLong == languageId) { | |||||
| mCurrentLanguageIndex = i;//当前要发送的语言下标 | |||||
| break; | |||||
| } | |||||
| } | |||||
| long languageId = mLanguageList.get(languageIndex);//下一个语言要发送的语言ID | |||||
| for (int i = 0; i < languageIdTypeListAll.size(); i++) { | |||||
| long aLong = languageIdTypeListAll.get(i); | |||||
| if (aLong == languageId) { | |||||
| mCurrentLanguageIndex = i;//当前要发送的语言下标 | |||||
| break; | |||||
| } | } | ||||
| } | |||||
| mBleDevice.synLanguage(mCurrentLanguageIndex); | |||||
| break; | |||||
| case R.id.btnAutoOpen: | |||||
| if (mCurrentAutoOpen == 1) { | |||||
| mCurrentAutoOpen = 0; | |||||
| } else { | |||||
| mCurrentAutoOpen = 1; | |||||
| } | |||||
| mBleDevice.synAutoOpen(mCurrentAutoOpen); | |||||
| break; | |||||
| case R.id.btnTempBroadcast: | |||||
| if (mCurrentTempBroadcast == 1) { | |||||
| mCurrentTempBroadcast = 0; | |||||
| } else { | |||||
| mCurrentTempBroadcast = 1; | |||||
| } | |||||
| mBleDevice.synTempBroadcast(mCurrentTempBroadcast); | |||||
| break; | |||||
| case R.id.btnTestTempDistance: | |||||
| if (!mConfigInfoStatus) | |||||
| return; | |||||
| for (int i = 0; i < mDistanceList.size(); i++) { | |||||
| int id = mDistanceList.get(i); | |||||
| if (id == mCurrentTestTempDistanceId) { | |||||
| if (mDistanceList.size() - 1 == i) { | |||||
| mCurrentTestTempDistanceId = mDistanceList.get(0); | |||||
| } else { | |||||
| mCurrentTestTempDistanceId = mDistanceList.get(++i); | |||||
| } | |||||
| break; | |||||
| mBleDevice.synLanguage(mCurrentLanguageIndex); | |||||
| } else if (vId == R.id.btnAutoOpen) { | |||||
| if (mCurrentAutoOpen == 1) { | |||||
| mCurrentAutoOpen = 0; | |||||
| } else { | |||||
| mCurrentAutoOpen = 1; | |||||
| } | |||||
| mBleDevice.synAutoOpen(mCurrentAutoOpen); | |||||
| } else if (vId == R.id.btnTempBroadcast) { | |||||
| if (mCurrentTempBroadcast == 1) { | |||||
| mCurrentTempBroadcast = 0; | |||||
| } else { | |||||
| mCurrentTempBroadcast = 1; | |||||
| } | |||||
| mBleDevice.synTempBroadcast(mCurrentTempBroadcast); | |||||
| } else if (vId == R.id.btnTestTempDistance) { | |||||
| if (!mConfigInfoStatus) | |||||
| return; | |||||
| for (int i = 0; i < mDistanceList.size(); i++) { | |||||
| int id = mDistanceList.get(i); | |||||
| if (id == mCurrentTestTempDistanceId) { | |||||
| if (mDistanceList.size() - 1 == i) { | |||||
| mCurrentTestTempDistanceId = mDistanceList.get(0); | |||||
| } else { | |||||
| mCurrentTestTempDistanceId = mDistanceList.get(++i); | |||||
| } | } | ||||
| break; | |||||
| } | } | ||||
| mBleDevice.synTestTempDistance(mCurrentTestTempDistanceId); | |||||
| break; | |||||
| case R.id.btnBeep: | |||||
| if (!mConfigInfoStatus) | |||||
| return; | |||||
| for (int i = 0; i < mBeepList.size(); i++) { | |||||
| int id = mBeepList.get(i); | |||||
| if (id == mCurrentBeepId) { | |||||
| if (mBeepList.size() - 1 == i) { | |||||
| mCurrentBeepId = mBeepList.get(0); | |||||
| } else { | |||||
| mCurrentBeepId = mBeepList.get(++i); | |||||
| } | |||||
| break; | |||||
| } | |||||
| mBleDevice.synTestTempDistance(mCurrentTestTempDistanceId); | |||||
| } else if (vId == R.id.btnBeep) { | |||||
| if (!mConfigInfoStatus) | |||||
| return; | |||||
| for (int i = 0; i < mBeepList.size(); i++) { | |||||
| int id = mBeepList.get(i); | |||||
| if (id == mCurrentBeepId) { | |||||
| if (mBeepList.size() - 1 == i) { | |||||
| mCurrentBeepId = mBeepList.get(0); | |||||
| } else { | |||||
| mCurrentBeepId = mBeepList.get(++i); | |||||
| } | } | ||||
| break; | |||||
| } | } | ||||
| mBleDevice.synBeepType(mCurrentBeepId); | |||||
| break; | |||||
| case R.id.btnAlarmSound: | |||||
| if (!mConfigInfoStatus) | |||||
| return; | |||||
| for (int i = 0; i < mAlarmSoundList.size(); i++) { | |||||
| int id = mAlarmSoundList.get(i); | |||||
| if (id == mCurrentAlarmSoundId) { | |||||
| if (mAlarmSoundList.size() - 1 == i) { | |||||
| mCurrentAlarmSoundId = mAlarmSoundList.get(0); | |||||
| } else { | |||||
| mCurrentAlarmSoundId = mAlarmSoundList.get(++i); | |||||
| } | |||||
| break; | |||||
| } | |||||
| mBleDevice.synBeepType(mCurrentBeepId); | |||||
| } else if (vId == R.id.btnAlarmSound) { | |||||
| if (!mConfigInfoStatus) | |||||
| return; | |||||
| for (int i = 0; i < mAlarmSoundList.size(); i++) { | |||||
| int id = mAlarmSoundList.get(i); | |||||
| if (id == mCurrentAlarmSoundId) { | |||||
| if (mAlarmSoundList.size() - 1 == i) { | |||||
| mCurrentAlarmSoundId = mAlarmSoundList.get(0); | |||||
| } else { | |||||
| mCurrentAlarmSoundId = mAlarmSoundList.get(++i); | |||||
| } | } | ||||
| break; | |||||
| } | } | ||||
| mBleDevice.synAlarmSoundType(mCurrentAlarmSoundId); | |||||
| break; | |||||
| case R.id.btnTempBodyAdd: | |||||
| mBleDevice.synBodyTempAdd(0x00); | |||||
| break; | |||||
| case R.id.btnTempBodyLess: | |||||
| mBleDevice.synBodyTempAdd(0x01); | |||||
| break; | |||||
| case R.id.btnTempObjectAdd: | |||||
| mBleDevice.synObjectTempAdd(0x00); | |||||
| break; | |||||
| case R.id.btnTempObjectLess: | |||||
| mBleDevice.synObjectTempAdd(0x01); | |||||
| break; | |||||
| case R.id.btnTempErr: | |||||
| if (mBleDevice != null) { | |||||
| int tempC = Integer.parseInt(etAlarmTempC.getText().toString().trim()); | |||||
| int tempF = Integer.parseInt(etAlarmTempF.getText().toString().trim()); | |||||
| mBleDevice.synAlarmTemp(tempC, tempF); | |||||
| } | |||||
| break; | |||||
| case R.id.btnSetSensitivity://设置灵敏度 | |||||
| if (!mConfigInfoStatus) | |||||
| return; | |||||
| for (int i = 0; i < mSensitivityList.size(); i++) { | |||||
| int id = mSensitivityList.get(i); | |||||
| if (id == mCurrentSensitivityLevel) { | |||||
| if (mSensitivityList.size() - 1 == i) { | |||||
| mCurrentSensitivityLevel = mSensitivityList.get(0); | |||||
| } else { | |||||
| mCurrentSensitivityLevel = mSensitivityList.get(++i); | |||||
| } | |||||
| break; | |||||
| } | |||||
| mBleDevice.synAlarmSoundType(mCurrentAlarmSoundId); | |||||
| } else if (vId == R.id.btnTempBodyAdd) { | |||||
| mBleDevice.synBodyTempAdd(0x00); | |||||
| } else if (vId == R.id.btnTempBodyLess) { | |||||
| mBleDevice.synBodyTempAdd(0x01); | |||||
| } else if (vId == R.id.btnTempObjectAdd) { | |||||
| mBleDevice.synObjectTempAdd(0x00); | |||||
| } else if (vId == R.id.btnTempObjectLess) { | |||||
| mBleDevice.synObjectTempAdd(0x01); | |||||
| } else if (vId == R.id.btnTempErr) { | |||||
| if (mBleDevice != null) { | |||||
| int tempC = Integer.parseInt(etAlarmTempC.getText().toString().trim()); | |||||
| int tempF = Integer.parseInt(etAlarmTempF.getText().toString().trim()); | |||||
| mBleDevice.synAlarmTemp(tempC, tempF); | |||||
| } | |||||
| } else if (vId == R.id.btnSetSensitivity) {//设置灵敏度 | |||||
| if (!mConfigInfoStatus) | |||||
| return; | |||||
| for (int i = 0; i < mSensitivityList.size(); i++) { | |||||
| int id = mSensitivityList.get(i); | |||||
| if (id == mCurrentSensitivityLevel) { | |||||
| if (mSensitivityList.size() - 1 == i) { | |||||
| mCurrentSensitivityLevel = mSensitivityList.get(0); | |||||
| } else { | |||||
| mCurrentSensitivityLevel = mSensitivityList.get(++i); | |||||
| } | } | ||||
| break; | |||||
| } | } | ||||
| mBleDevice.synSensitivity(mCurrentSensitivityLevel); | |||||
| break; | |||||
| case R.id.btnAutoClose://自动关机 | |||||
| if (!mConfigInfoStatus) | |||||
| return; | |||||
| for (int i = 0; i < mAutoCloseList.size(); i++) { | |||||
| int id = mAutoCloseList.get(i); | |||||
| if (id == mCurrentAutoCloseId) { | |||||
| if (mAutoCloseList.size() - 1 == i) { | |||||
| mCurrentAutoCloseId = mAutoCloseList.get(0); | |||||
| } else { | |||||
| mCurrentAutoCloseId = mAutoCloseList.get(++i); | |||||
| } | |||||
| break; | |||||
| } | |||||
| mBleDevice.synSensitivity(mCurrentSensitivityLevel); | |||||
| } else if (vId == R.id.btnAutoClose) {//自动关机 | |||||
| if (!mConfigInfoStatus) | |||||
| return; | |||||
| for (int i = 0; i < mAutoCloseList.size(); i++) { | |||||
| int id = mAutoCloseList.get(i); | |||||
| if (id == mCurrentAutoCloseId) { | |||||
| if (mAutoCloseList.size() - 1 == i) { | |||||
| mCurrentAutoCloseId = mAutoCloseList.get(0); | |||||
| } else { | |||||
| mCurrentAutoCloseId = mAutoCloseList.get(++i); | |||||
| } | } | ||||
| break; | |||||
| } | } | ||||
| mBleDevice.synAutoClose(mCurrentAutoCloseId); | |||||
| break; | |||||
| case R.id.btnReset: | |||||
| if (mBleDevice != null) { | |||||
| mBleDevice.reset(); | |||||
| } | |||||
| break; | |||||
| } | |||||
| mBleDevice.synAutoClose(mCurrentAutoCloseId); | |||||
| } else if (vId == R.id.btnReset) { | |||||
| if (mBleDevice != null) { | |||||
| mBleDevice.reset(); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | ||||
| public class EditParamsDialog extends DialogFragment implements View.OnClickListener { | public class EditParamsDialog extends DialogFragment implements View.OnClickListener { | ||||
| /** | /** |
| package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_0020_hu_infrared_temp | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleAppNewBaseActivity | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_0020_hu_infrared_temp.viewmodel.Ble0020HpTempViewModel | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils | |||||
| import android.os.Message | |||||
| import android.view.View | |||||
| import android.widget.ArrayAdapter | |||||
| import android.widget.Button | |||||
| import android.widget.EditText | |||||
| import android.widget.ListView | |||||
| import androidx.lifecycle.ViewModelProvider | |||||
| import cn.net.aicare.modulelibrary.module.ble_0020_hu_infrared_temp.HpInfraredTempBleConfig | |||||
| /** | |||||
| * 华普红外测温枪 | |||||
| * @author xing | |||||
| * @date 2025/03/27 | |||||
| * @constructor 创建[Ble0020HpInfraredTempActivity] | |||||
| */ | |||||
| class Ble0020HpInfraredTempActivity : BleAppNewBaseActivity(), View.OnClickListener { | |||||
| private lateinit var btnPause: Button | |||||
| private lateinit var btnContinue: Button | |||||
| private lateinit var btnClear: Button | |||||
| private lateinit var btnWakeup: Button | |||||
| private lateinit var btnTest: Button | |||||
| private lateinit var btnStopTest: Button | |||||
| private lateinit var btnReset: Button | |||||
| private lateinit var btnEmissivity: Button | |||||
| private lateinit var btnAutoShutdown: Button | |||||
| private lateinit var btnHighOrLowTemp: Button | |||||
| private lateinit var btnGetDeviceStatus: Button | |||||
| private lateinit var btnGetDeviceParameter: Button | |||||
| private lateinit var etEmissivity: EditText | |||||
| private lateinit var etAutoShutdown: EditText | |||||
| private lateinit var etHighTemp: EditText | |||||
| private lateinit var etLowTemp: EditText | |||||
| private var mViewModel: Ble0020HpTempViewModel? = null | |||||
| private var mAddress: String = "" | |||||
| private val mList: ArrayList<String> = arrayListOf() | |||||
| private var listAdapter: ArrayAdapter<String>? = null | |||||
| private var mRefresh = true | |||||
| override fun uiHandlerMessage(msg: Message?) { | |||||
| } | |||||
| override fun getLayoutId(): Int { | |||||
| return R.layout.activity_ble_0020_hp_infrared_temp | |||||
| } | |||||
| override fun initView() { | |||||
| btnPause=findViewById(R.id.btnPause) | |||||
| btnContinue=findViewById(R.id.btnContinue) | |||||
| btnClear=findViewById(R.id.btnClear) | |||||
| btnWakeup=findViewById(R.id.btnWakeup) | |||||
| btnTest=findViewById(R.id.btnTest) | |||||
| btnStopTest=findViewById(R.id.btnStopTest) | |||||
| btnReset=findViewById(R.id.btnReset) | |||||
| btnEmissivity=findViewById(R.id.btnEmissivity) | |||||
| btnAutoShutdown=findViewById(R.id.btnAutoShutdown) | |||||
| btnHighOrLowTemp=findViewById(R.id.btnHighOrLowTemp) | |||||
| btnGetDeviceStatus=findViewById(R.id.btnGetDeviceStatus) | |||||
| btnGetDeviceParameter=findViewById(R.id.btnGetDeviceParameter) | |||||
| etEmissivity=findViewById(R.id.etEmissivity) | |||||
| etAutoShutdown=findViewById(R.id.etAutoShutdown) | |||||
| etHighTemp=findViewById(R.id.etHighTemp) | |||||
| etLowTemp=findViewById(R.id.etLowTemp) | |||||
| } | |||||
| override fun initListener() { | |||||
| btnPause.setOnClickListener(this) | |||||
| btnContinue.setOnClickListener(this) | |||||
| btnClear.setOnClickListener(this) | |||||
| btnWakeup.setOnClickListener(this) | |||||
| btnTest.setOnClickListener(this) | |||||
| btnStopTest.setOnClickListener(this) | |||||
| btnReset.setOnClickListener(this) | |||||
| btnEmissivity.setOnClickListener(this) | |||||
| btnAutoShutdown.setOnClickListener(this) | |||||
| btnHighOrLowTemp.setOnClickListener(this) | |||||
| btnGetDeviceStatus.setOnClickListener(this) | |||||
| btnGetDeviceParameter.setOnClickListener(this) | |||||
| mViewModel?.let { | |||||
| it.showLogLiveData.observe(this) { | |||||
| addLog(it) | |||||
| } | |||||
| } | |||||
| } | |||||
| override fun onClick(v: View?) { | |||||
| when (v?.id) { | |||||
| R.id.btnPause -> { | |||||
| mRefresh = false | |||||
| } | |||||
| R.id.btnContinue -> { | |||||
| mRefresh = true | |||||
| } | |||||
| R.id.btnClear -> { | |||||
| clear() | |||||
| } | |||||
| R.id.btnWakeup -> { | |||||
| mViewModel?.sendButtonCmd(HpInfraredTempBleConfig.CMD_WAKEUP) | |||||
| addLog("发送唤醒") | |||||
| } | |||||
| R.id.btnTest -> { | |||||
| mViewModel?.sendButtonCmd(HpInfraredTempBleConfig.CMD_TEST) | |||||
| addLog("发送测量") | |||||
| } | |||||
| R.id.btnStopTest -> { | |||||
| mViewModel?.sendButtonCmd(HpInfraredTempBleConfig.CMD_STOP_TEST) | |||||
| addLog("发送停止测量") | |||||
| } | |||||
| R.id.btnReset -> { | |||||
| mViewModel?.sendButtonCmd(HpInfraredTempBleConfig.CMD_RESET) | |||||
| addLog("发送重置") | |||||
| } | |||||
| R.id.btnEmissivity -> { | |||||
| val emissivity = etEmissivity.text.toString() | |||||
| if (emissivity.isNotBlank()) { | |||||
| val data = (emissivity.toFloat() * 100).toInt() | |||||
| mViewModel?.sendEmissivity(data) | |||||
| addLog("发送发射率:$data") | |||||
| } | |||||
| } | |||||
| R.id.btnAutoShutdown -> { | |||||
| val autoShutdown = etAutoShutdown.text.toString() | |||||
| if (autoShutdown.isNotBlank()) { | |||||
| mViewModel?.sendAutoShutdown(autoShutdown.toInt()) | |||||
| addLog("发送自动关机:$autoShutdown") | |||||
| } | |||||
| } | |||||
| R.id.btnHighOrLowTemp -> { | |||||
| val tempHStr = etHighTemp.text.toString() | |||||
| val tempLStr = etLowTemp.text.toString() | |||||
| if (tempHStr.isNotBlank() && tempLStr.isNotBlank()) { | |||||
| val tempH = tempHStr.toInt() | |||||
| val tempL = tempLStr.toInt() | |||||
| val signH = if (tempH > 0) { | |||||
| HpInfraredTempBleConfig.PLUS | |||||
| } else { | |||||
| HpInfraredTempBleConfig.MINUS | |||||
| } | |||||
| val signL = if (tempL > 0) { | |||||
| HpInfraredTempBleConfig.PLUS | |||||
| } else { | |||||
| HpInfraredTempBleConfig.MINUS | |||||
| } | |||||
| mViewModel?.sendWarmInfo(HpInfraredTempBleConfig.TEMP_C, signH, signL, tempH, tempL) | |||||
| addLog("发送高低温报警:高温=${tempHStr}℃,低温=${tempLStr}℉") | |||||
| } | |||||
| } | |||||
| R.id.btnGetDeviceStatus -> { | |||||
| mViewModel?.sendGetDeviceStatus() | |||||
| addLog("发送获取设备状态") | |||||
| } | |||||
| R.id.btnGetDeviceParameter -> { | |||||
| mViewModel?.sendGetDeviceParameter() | |||||
| addLog("发送获取设备参数") | |||||
| } | |||||
| else -> {} | |||||
| } | |||||
| } | |||||
| override fun initData() { | |||||
| mContext = this | |||||
| val mac = intent.getStringExtra("mac") | |||||
| if (mac.isNullOrBlank()) { | |||||
| finish() | |||||
| return | |||||
| } | |||||
| mAddress = mac | |||||
| mViewModel = ViewModelProvider(this)[Ble0020HpTempViewModel::class.java] | |||||
| if (isServiceBind) { | |||||
| onServiceSuccess() | |||||
| } | |||||
| val listView = findViewById<ListView>(R.id.listview) | |||||
| listAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, mList) | |||||
| listView.adapter = listAdapter | |||||
| } | |||||
| private fun addLog(msg: String) { | |||||
| if (!mRefresh) { | |||||
| return | |||||
| } | |||||
| mList.add(TimeUtils.getTimeSSS() + msg) | |||||
| listAdapter!!.notifyDataSetChanged() | |||||
| } | |||||
| private fun clear() { | |||||
| mList.clear() | |||||
| listAdapter!!.notifyDataSetChanged() | |||||
| } | |||||
| private var isServiceBind = false | |||||
| override fun onServiceSuccess() { | |||||
| isServiceBind = true | |||||
| if (mAddress.isNotBlank()) { | |||||
| val bleDevice = mBleManager?.getBleDevice(mAddress) | |||||
| bleDevice?.let { | |||||
| mViewModel?.initDevice(it) | |||||
| } | |||||
| } | |||||
| } | |||||
| override fun onServiceErr() { | |||||
| } | |||||
| override fun unbindServices() { | |||||
| } | |||||
| } |
| package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_0020_hu_infrared_temp.viewmodel | |||||
| import androidx.lifecycle.MutableLiveData | |||||
| import androidx.lifecycle.ViewModel | |||||
| import cn.net.aicare.modulelibrary.module.ble_0020_hu_infrared_temp.HpInfraredTempBleDataCmdUtils | |||||
| import cn.net.aicare.modulelibrary.module.ble_0020_hu_infrared_temp.HpInfraredTempBleDeviceData | |||||
| import com.pingwang.bluetoothlib.device.BleDevice | |||||
| /** | |||||
| * 华普红外测温枪视图模型 | |||||
| * @author xing | |||||
| * @date 2025/03/27 | |||||
| * @constructor 创建[Ble0020HpTempViewModel] | |||||
| */ | |||||
| class Ble0020HpTempViewModel : ViewModel(), HpInfraredTempBleDeviceData.OnBleDeviceInfoListener, HpInfraredTempBleDeviceData.OnBleSetStatusListener, | |||||
| HpInfraredTempBleDeviceData.OnBleAlarmResultListener { | |||||
| val showLogLiveData by lazy { MutableLiveData<String>() } | |||||
| var mHpInfraredTempBleDeviceData: HpInfraredTempBleDeviceData? = null | |||||
| fun initDevice(bleDevice: BleDevice) { | |||||
| HpInfraredTempBleDeviceData.init(bleDevice) | |||||
| mHpInfraredTempBleDeviceData = HpInfraredTempBleDeviceData.getInstance() | |||||
| } | |||||
| /** | |||||
| * 发送获取设备状态 | |||||
| */ | |||||
| fun sendGetDeviceStatus() { | |||||
| val checkDeviceStatus = HpInfraredTempBleDataCmdUtils.checkDeviceStatus() | |||||
| mHpInfraredTempBleDeviceData?.sendData(checkDeviceStatus) | |||||
| } | |||||
| /** | |||||
| * 发送按钮CMD | |||||
| * @param [type] 类型 {@link HpInfraredTempBleConfig#CMD_WAKEUP ...} | |||||
| */ | |||||
| fun sendButtonCmd(type: Int) { | |||||
| val setCmd = HpInfraredTempBleDataCmdUtils.setCmd(type) | |||||
| mHpInfraredTempBleDeviceData?.sendData(setCmd) | |||||
| } | |||||
| /** | |||||
| * 发送发射率 | |||||
| * @param [emissivity] 发射率 | |||||
| */ | |||||
| fun sendEmissivity(emissivity: Int) { | |||||
| val setEmissivity = HpInfraredTempBleDataCmdUtils.setEmissivity(emissivity) | |||||
| mHpInfraredTempBleDeviceData?.sendData(setEmissivity) | |||||
| } | |||||
| /** | |||||
| * 发送自动关机 | |||||
| * @param [time] 时间s | |||||
| */ | |||||
| fun sendAutoShutdown(time: Int) { | |||||
| val setAutoShutdown = HpInfraredTempBleDataCmdUtils.setAutoShutdown(time) | |||||
| mHpInfraredTempBleDeviceData?.sendData(setAutoShutdown) | |||||
| } | |||||
| /** | |||||
| * 发送报警信息 | |||||
| */ | |||||
| fun sendWarmInfo(unit: Int, signH: Int, signL: Int, tempH: Int, tempL: Int) { | |||||
| val setWarmInfo = HpInfraredTempBleDataCmdUtils.setWarm(unit, signH, signL, tempH, tempL) | |||||
| mHpInfraredTempBleDeviceData?.sendData(setWarmInfo) | |||||
| } | |||||
| /** | |||||
| * 发送获取设备参数 | |||||
| */ | |||||
| fun sendGetDeviceParameter() { | |||||
| val getDeviceParameter = HpInfraredTempBleDataCmdUtils.getDeviceParameter() | |||||
| mHpInfraredTempBleDeviceData?.sendData(getDeviceParameter) | |||||
| } | |||||
| /** | |||||
| * 设备状态1 | |||||
| * | |||||
| * @param scanOrHold 状态 0:SCAN。1:HOLD | |||||
| * @param tempUnit 单位 0:℃ 。 1:℉ | |||||
| * @param laser 激光灯 0:关闭 。1:打开 | |||||
| * @param backLamp 背光灯 0:关闭 。1:打开 | |||||
| * @param lowBattery 低电 0:不低电 。1:低电 | |||||
| * @param alarmH 高位报警 0:不报警 。 1:正在报警 | |||||
| * @param alarmL 低温报警 0:不报警 。 1:正在报警 | |||||
| * @param flashlight 手电筒灯 0:关闭 。1:打开 | |||||
| * @param mode 模式 0x00:REC(设备端查看历史记录时发送该模式,APP 不保存该模式的数据) | |||||
| * 0x01:MAX;0x02:AVG;0x03:MIN;0x04:DIF;0x05:LAL;0x06:HAL;0x07:EMS(设备端查看发射率);0x08:HAL—Warming—T;0x09:LAL—Warming—T | |||||
| * 0x0A:EMS(设备端设置发射率) | |||||
| * @param mainTag 主区数据标识:显示标识:0:不显示。1:显示 | |||||
| * @param mainSign 主区数据标识:数据正负:0:正值。 1:负值 | |||||
| * @param mainDecimal 主区数据标识:数据小数点:0:无小数点。1:带 1 位小数 | |||||
| * @param subTag 附区数据标识:显示标识:0:不显示。1:显示 | |||||
| * @param subSign 附区数据标识:数据正负:0:正值。 1:负值 | |||||
| * @param subDecimal 附区数据标识:数据小数点:0:无小数点。1:带 1 位小数 | |||||
| * @param mainValue 主区数值 | |||||
| * @param subValue 附区数值 | |||||
| * @param ems EMS 数值 10~100(显示0.10 ~1.00) | |||||
| * @param autoShutdown 自动睡眠时间 | |||||
| */ | |||||
| override fun onDeviceStatus1( | |||||
| scanOrHold: Int, tempUnit: Int, laser: Int, backLamp: Int, lowBattery: Int, alarmH: Int, alarmL: Int, | |||||
| flashlight: Int, mode: Int, mainTag: Int, mainSign: Int, mainDecimal: Int, subTag: Int, subSign: Int, subDecimal: Int, mainValue: Int, | |||||
| subValue: Int, ems: Int, autoShutdown: Int | |||||
| ) { | |||||
| var msg = "" | |||||
| msg += "状态:" + if (scanOrHold == 0) { | |||||
| "SCAN" | |||||
| } else { | |||||
| "HOLD" | |||||
| } + "\n" | |||||
| msg += " 单位:" + if (tempUnit == 0) { | |||||
| "℃" | |||||
| } else { | |||||
| "℉" | |||||
| } | |||||
| msg += " 激光灯:" + if (laser == 0) { | |||||
| "关闭" | |||||
| } else { | |||||
| "打开" | |||||
| } | |||||
| msg += "背光灯:" + if (backLamp == 0) { | |||||
| "关闭" | |||||
| } else { | |||||
| "打开" | |||||
| } + "\n" | |||||
| msg += " 低电:" + if (lowBattery == 0) { | |||||
| "不低电" | |||||
| } else { | |||||
| "低电" | |||||
| } | |||||
| msg += " 高温报警:" + if (alarmH == 0) { | |||||
| "不报警" | |||||
| } else { | |||||
| "正在报警" | |||||
| } + "\n" | |||||
| msg += " 低温报警:" + if (alarmL == 0) { | |||||
| "不报警" | |||||
| } else { | |||||
| "正在报警" | |||||
| } | |||||
| msg += " 手电筒灯:" + if (flashlight == 0) { | |||||
| "关闭" | |||||
| } else { | |||||
| "打开" | |||||
| } + "\n" | |||||
| msg += "模式:" + when (mode) { | |||||
| 0x00 -> { | |||||
| "REC" | |||||
| } | |||||
| 0x01 -> { | |||||
| "MAX" | |||||
| } | |||||
| 0x02 -> { | |||||
| "AVG" | |||||
| } | |||||
| 0x03 -> { | |||||
| "MIN" | |||||
| } | |||||
| 0x04 -> { | |||||
| "DIF" | |||||
| } | |||||
| 0x05 -> { | |||||
| "LAL" | |||||
| } | |||||
| 0x06 -> { | |||||
| "HAL" | |||||
| } | |||||
| 0x07 -> { | |||||
| "EMS" | |||||
| } | |||||
| 0x08 -> { | |||||
| "HAL—Warming—T" | |||||
| } | |||||
| 0x09 -> { | |||||
| "LAL—Warming—T" | |||||
| } | |||||
| 0x0A -> { | |||||
| "EMS" | |||||
| } | |||||
| else -> { | |||||
| "未知" | |||||
| } | |||||
| } + "\n" | |||||
| if (mainTag == 1) { | |||||
| var showMainValue = mainValue.toFloat() | |||||
| if (mainDecimal == 1) { | |||||
| showMainValue /= 10F | |||||
| } | |||||
| if (mainSign == 1) { | |||||
| showMainValue = -showMainValue | |||||
| } | |||||
| msg += "主区数值:${showMainValue}" | |||||
| } | |||||
| if (subTag == 1) { | |||||
| var showSubValue = subValue.toFloat() | |||||
| if (subDecimal == 1) { | |||||
| showSubValue /= 10F | |||||
| } | |||||
| if (subSign == 1) { | |||||
| showSubValue = -showSubValue | |||||
| } | |||||
| msg += "附区数值:${showSubValue}" | |||||
| } | |||||
| msg += "附区数值:${subValue}" | |||||
| msg += "EMS 数值:${ems / 100F}" | |||||
| msg += "自动睡眠时间:$autoShutdown" | |||||
| showLogLiveData.postValue(msg) | |||||
| } | |||||
| /** | |||||
| * 设备状态2 | |||||
| * | |||||
| * @param scanOrHold 状态 0:SCAN。1:HOLD | |||||
| * @param dewTempSign 露点温度标志:0:正数 , 1:负数 | |||||
| * @param dewTempDecimal 露点温度小数点: 0:无小数, 1: 1 个小数 | |||||
| * @param dewTemp 露点温度 | |||||
| * @param humidity 环境湿度:单位% | |||||
| * @param envTempSign 环境温度正负:0:正数 , 1:负数 | |||||
| * @param envTempDecimal 环境温度小数点: 0:无小数, 1: 1 个小数 | |||||
| * @param envTemp 环境温度 | |||||
| */ | |||||
| override fun onDeviceStatus2( | |||||
| scanOrHold: Int, dewTempSign: Int, dewTempDecimal: Int, dewTemp: Int, humidity: Int, envTempSign: Int, | |||||
| envTempDecimal: Int, envTemp: Int | |||||
| ) { | |||||
| var msg = "" | |||||
| msg += "状态:" + if (scanOrHold == 0) { | |||||
| "SCAN" | |||||
| } else { | |||||
| "HOLD" | |||||
| } + "\n" | |||||
| msg += "环境湿度:${humidity}%" | |||||
| var showDewTemp = dewTemp.toFloat() | |||||
| if (dewTempDecimal == 1) { | |||||
| showDewTemp /= 10F | |||||
| } | |||||
| if (dewTempSign == 1) { | |||||
| showDewTemp = -showDewTemp | |||||
| } | |||||
| msg += "露点温度:${showDewTemp}" | |||||
| var showEnvTemp = envTemp.toFloat() | |||||
| if (envTempDecimal == 1) { | |||||
| showEnvTemp /= 10F | |||||
| } | |||||
| if (envTempSign == 1) { | |||||
| showEnvTemp = -showEnvTemp | |||||
| } | |||||
| msg += "环境温度:${showEnvTemp}" | |||||
| showLogLiveData.postValue(msg) | |||||
| } | |||||
| /** | |||||
| * 设备参数 | |||||
| * | |||||
| * @param emissivity 发射率:2 个小数;范围 0.10 ~ 1.00 (对应的是 10-100) | |||||
| * @param autoShutdown 自动关机时间 | |||||
| * @param alarmHSign 数据标识:高温报警数据(正负值:0:正值 。1:负值) | |||||
| * @param alarmHUnit 数据标识:高温报警数据(单位:0:℃ 。1:℉) | |||||
| * @param alarmLSign 数据标识:低温报警数据(正负值:0:正值 。1:负值) | |||||
| * @param alarmLUnit 数据标识:低温报警数据(单位:0:℃ 。1:℉) | |||||
| * @param alarmH 高温报警数据 | |||||
| * @param alarmL 低温报警数据 | |||||
| */ | |||||
| override fun onDeviceParameter( | |||||
| emissivity: Int, autoShutdown: Int, alarmHSign: Int, alarmHUnit: Int, alarmLSign: Int, alarmLUnit: Int, alarmH: Int, alarmL: Int | |||||
| ) { | |||||
| var msg = "发射率:${emissivity / 100F} 自动关机时间:${autoShutdown}\n" | |||||
| var showAlarmHValue = alarmH.toFloat() | |||||
| if (alarmHSign == 1) { | |||||
| showAlarmHValue = -showAlarmHValue | |||||
| } | |||||
| msg += "高温报警数据:${showAlarmHValue}${ | |||||
| if (alarmHUnit == 0) { | |||||
| "℃" | |||||
| } else { | |||||
| "℉" | |||||
| } | |||||
| }\n" | |||||
| var showAlarmLValue = alarmH.toFloat() | |||||
| if (alarmLSign == 1) { | |||||
| showAlarmLValue = -showAlarmLValue | |||||
| } | |||||
| msg += "低温报警数据:${showAlarmLValue}${ | |||||
| if (alarmLUnit == 0) { | |||||
| "℃" | |||||
| } else { | |||||
| "℉" | |||||
| } | |||||
| }" | |||||
| showLogLiveData.postValue(msg) | |||||
| } | |||||
| /** | |||||
| * 关于发射率结果 | |||||
| * @param [status] 状态 | |||||
| */ | |||||
| override fun onEmissivityResult(status: Int) { | |||||
| showLogLiveData.postValue( | |||||
| "发射率设置:${ | |||||
| if (status == 0) { | |||||
| "成功" | |||||
| } else { | |||||
| "失败" | |||||
| } | |||||
| }" | |||||
| ) | |||||
| } | |||||
| /** | |||||
| * 自动关机结果 | |||||
| * @param [status] 状态 | |||||
| */ | |||||
| override fun onAutoShutDownResult(status: Int) { | |||||
| showLogLiveData.postValue( | |||||
| "自动关机时间设置:${ | |||||
| if (status == 0) { | |||||
| "成功" | |||||
| } else { | |||||
| "失败" | |||||
| } | |||||
| }" | |||||
| ) | |||||
| } | |||||
| /** | |||||
| * 报警结果 | |||||
| * @param [status] 状态 | |||||
| */ | |||||
| override fun onAlarmResult(status: Int) { | |||||
| showLogLiveData.postValue( | |||||
| "高低温报警值设置:${ | |||||
| if (status == 0) { | |||||
| "成功" | |||||
| } else { | |||||
| "失败" | |||||
| } | |||||
| }" | |||||
| ) | |||||
| } | |||||
| } |
| import cn.net.aicare.modulelibrary.module.BleNutrition.BleNutritionData; | import cn.net.aicare.modulelibrary.module.BleNutrition.BleNutritionData; | ||||
| import cn.net.aicare.modulelibrary.module.BleNutrition.BleNutritionHistoryBean; | import cn.net.aicare.modulelibrary.module.BleNutrition.BleNutritionHistoryBean; | ||||
| /** | |||||
| * ble营养界面 | |||||
| * | |||||
| * @author xing | |||||
| * @date 2024/10/28 | |||||
| */ | |||||
| public class BleNutritionActivity extends BleBaseActivity implements View.OnClickListener, BleNutritionData.BleNutritionCallback, OnBleSettingListener { | public class BleNutritionActivity extends BleBaseActivity implements View.OnClickListener, BleNutritionData.BleNutritionCallback, OnBleSettingListener { | ||||
| private static final String TAG = "Tag1"; | private static final String TAG = "Tag1"; | ||||
| // 小数点 | // 小数点 | ||||
| w = (float) (w / Math.pow(10, decimal)); | w = (float) (w / Math.pow(10, decimal)); | ||||
| // 保留小数位 | // 保留小数位 | ||||
| String weightStr = getPreFloatStr(w, decimal); | |||||
| String str = "MCU上发重量:" + weightStr + getUnitStr(unit) + "\n流水号:" + no + ",原始重量:" + weight + ",单位:" + unit + ",小数点:" + decimal + ",符号:" + symbol + ",重量类型:" + type; | |||||
| String weightStr = ""; | |||||
| if (unit == 2) { | |||||
| int lb = (int) (w / 16); | |||||
| float oz = w - (lb * 16); | |||||
| weightStr = lb + ":" + getPreFloatStr(oz, decimal); | |||||
| } else { | |||||
| weightStr = getPreFloatStr(w, decimal); | |||||
| } | |||||
| String str = "MCU上发重量:" + weightStr +" "+ getUnitStr(unit) + "\n流水号:" + no + ",原始重量:" + weight + ",单位:" + unit + ",小数点:" + decimal + ",符号:" + symbol + ",重量类型:" + type; | |||||
| addText(str); | addText(str); | ||||
| } | } | ||||
| // 小数点 | // 小数点 | ||||
| w = (float) (w / Math.pow(10, decimal)); | w = (float) (w / Math.pow(10, decimal)); | ||||
| // 保留小数位 | // 保留小数位 | ||||
| String weightStr = getPreFloatStr(w, decimal); | |||||
| String weightStr = ""; | |||||
| if (unit == 2) { | |||||
| int lb = (int) (w / 16); | |||||
| float oz = w - (lb * 16); | |||||
| weightStr = lb + ":" + getPreFloatStr(oz, decimal); | |||||
| } else { | |||||
| weightStr = getPreFloatStr(w, decimal); | |||||
| } | |||||
| String str = "MCU上发重量:" + weightStr + getUnitStr(unit) + "\n流水号:" + no + ",原始重量:" + weight + ",单位:" + unit + ",小数点:" + decimal + ",符号:" + symbol + ",重量类型:" + type; | |||||
| String str = "MCU上发重量:" + weightStr +" "+ getUnitStr(unit) + "\n流水号:" + no + ",原始重量:" + weight + ",单位:" + unit + ",小数点:" + decimal + ",符号:" + symbol + ",重量类型:" + type; | |||||
| addText(str); | addText(str); | ||||
| if (type == 2) { | if (type == 2) { | ||||
| if (foodNutrientBean != null ) { | if (foodNutrientBean != null ) { | ||||
| //稳定重量 | //稳定重量 | ||||
| if (unit == 0x04) { | |||||
| if (unit == 0x04) {//kg | |||||
| foodNutrientBean.setWeightToG(Double.parseDouble(weightStr)*1000); | foodNutrientBean.setWeightToG(Double.parseDouble(weightStr)*1000); | ||||
| }else if (unit == 0x05){ | |||||
| }else if (unit == 0x05){//斤 | |||||
| foodNutrientBean.setWeightToG(Double.parseDouble(weightStr)*500); | foodNutrientBean.setWeightToG(Double.parseDouble(weightStr)*500); | ||||
| }else if (unit == 0x00){ | |||||
| }else if (unit == 0x00){//G | |||||
| foodNutrientBean.setWeightToG(Double.parseDouble(weightStr)); | foodNutrientBean.setWeightToG(Double.parseDouble(weightStr)); | ||||
| }else if (unit == 0x03){ | |||||
| }else if (unit == 0x03){//oz | |||||
| foodNutrientBean.setWeightToG(UnitUtils.ozToG(Float.parseFloat(weightStr))); | foodNutrientBean.setWeightToG(UnitUtils.ozToG(Float.parseFloat(weightStr))); | ||||
| }else { | }else { | ||||
| addText("不支持的重量单位,当前只支持g,oz,kg,斤:" + unit); | addText("不支持的重量单位,当前只支持g,oz,kg,斤:" + unit); |
| package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_speed_test | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.KBleBaseNewActivity | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.databinding.ActivityBleSpeedTestBinding | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.CoroutineUtils | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.toUnsignedInt | |||||
| import android.bluetooth.BluetoothDevice | |||||
| import android.bluetooth.BluetoothGattCharacteristic | |||||
| import android.net.Uri | |||||
| import android.os.Build | |||||
| import android.os.Handler | |||||
| import android.os.Looper | |||||
| import android.os.Message | |||||
| import android.text.TextUtils | |||||
| import android.view.View | |||||
| import android.widget.ArrayAdapter | |||||
| import androidx.activity.result.contract.ActivityResultContracts | |||||
| import androidx.annotation.RequiresApi | |||||
| import com.pingwang.bluetoothlib.config.BleConfig | |||||
| import com.pingwang.bluetoothlib.device.AiLinkBleCheckUtil | |||||
| import com.pingwang.bluetoothlib.device.BleDevice | |||||
| import com.pingwang.bluetoothlib.device.SendDataBean | |||||
| import com.pingwang.bluetoothlib.listener.OnBleMtuListener | |||||
| import com.pingwang.bluetoothlib.listener.OnBleOtherDataListener | |||||
| import com.pingwang.bluetoothlib.listener.OnCallbackBle | |||||
| import com.pingwang.bluetoothlib.listener.OnCharacteristicListener | |||||
| import com.pingwang.bluetoothlib.utils.BleLog | |||||
| import com.pingwang.bluetoothlib.utils.UuidUtils | |||||
| import kotlinx.coroutines.CoroutineScope | |||||
| import kotlinx.coroutines.Dispatchers | |||||
| import kotlinx.coroutines.launch | |||||
| import kotlinx.coroutines.withContext | |||||
| import java.nio.charset.Charset | |||||
| import java.nio.charset.StandardCharsets | |||||
| import java.util.UUID | |||||
| /** | |||||
| * ble速度测试界面 | |||||
| * @author xing | |||||
| * @date 2025/09/12 | |||||
| * @constructor 创建[BleSpeedTestActivity] | |||||
| */ | |||||
| class BleSpeedTestActivity : KBleBaseNewActivity<ActivityBleSpeedTestBinding>(), View.OnClickListener, OnCallbackBle, OnBleOtherDataListener { | |||||
| private val REFRESH_DATA = 3 | |||||
| private var mList: MutableList<String> = mutableListOf() | |||||
| private var listAdapter: ArrayAdapter<String>? = null | |||||
| private var mBleDevice: BleDevice? = null | |||||
| private var sendUuid: UUID? = null | |||||
| private var sendUuidServer: UUID? = null | |||||
| private var sendUuidNotify: UUID? = null | |||||
| private var mCount = 0L | |||||
| // 指定每个分组的字节大小 | |||||
| private val headMax = 12 // 1KB | |||||
| private var mMtu = 514 // 1KB | |||||
| private var mSendDataMax = 514 - headMax // 1KB | |||||
| private val filePickerLauncher = registerForActivityResult(ActivityResultContracts.GetContent()) { uri -> | |||||
| uri?.let { readFileChunks(it) } | |||||
| } | |||||
| private var mSelectFilePath = "" | |||||
| private var mAddress: String? = "" | |||||
| private var mSendList: MutableList<ByteArray> = mutableListOf() | |||||
| private var mReadList: MutableList<ByteArray> = mutableListOf() | |||||
| private var mWriteBytes: Long = 0 | |||||
| private var mReadBytes: Long = 0 | |||||
| private var mStartTime: Long = 0 | |||||
| private var mStartWriteTime: Long = 0 | |||||
| private var mStartReadTime: Long = 0 | |||||
| private val mHandler = object : Handler(Looper.getMainLooper()) { | |||||
| override fun handleMessage(msg: Message) { | |||||
| super.handleMessage(msg) | |||||
| when (msg.what) { | |||||
| REFRESH_DATA -> { | |||||
| listAdapter?.notifyDataSetChanged() | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| override fun getLayoutView(): ActivityBleSpeedTestBinding { | |||||
| return ActivityBleSpeedTestBinding.inflate(layoutInflater) | |||||
| } | |||||
| override fun initListener() { | |||||
| binding.btnUuid.setOnClickListener(this) | |||||
| binding.btnUuidServer.setOnClickListener(this) | |||||
| binding.btnNotify.setOnClickListener(this) | |||||
| binding.btnSelectFile.setOnClickListener(this) | |||||
| binding.btnWriteTest.setOnClickListener(this) | |||||
| binding.btnReadTest.setOnClickListener(this) | |||||
| } | |||||
| override fun onClick(v: View) { | |||||
| when (v.id) { | |||||
| R.id.btn_uuid -> { | |||||
| val uuid = binding.etUuid.getText().toString().trim { it <= ' ' }.uppercase() | |||||
| sendUuid = UuidUtils.getUuid(uuid) | |||||
| addLog("设置特征UUID") | |||||
| } | |||||
| R.id.btn_uuid_server -> { | |||||
| val uuid = binding.etUuidServer.getText().toString().trim { it <= ' ' }.uppercase() | |||||
| sendUuidServer = UuidUtils.getUuid(uuid) | |||||
| addLog("设置服务UUID") | |||||
| } | |||||
| R.id.btn_notify -> { | |||||
| // val notifyStr = binding.etUuid.getText().toString().trim { it <= ' ' }.uppercase() | |||||
| sendUuidNotify = UuidUtils.getUuid("FFE2") | |||||
| readNotify(sendUuidNotify) | |||||
| readNotify(UuidUtils.getUuid("FFE3")) | |||||
| addLog("打开notify") | |||||
| } | |||||
| R.id.btnSelectFile -> { | |||||
| filePickerLauncher.launch("application/octet-stream") | |||||
| } | |||||
| R.id.btnWriteTest -> { | |||||
| if (TextUtils.isEmpty(mSelectFilePath)) { | |||||
| addLog("请选择文件") | |||||
| return | |||||
| } | |||||
| if (mBleDevice == null) { | |||||
| addLog("请先连接设备") | |||||
| return | |||||
| } | |||||
| if (sendUuid == null) { | |||||
| addLog("请先设置特征UUID") | |||||
| return | |||||
| } | |||||
| if (sendUuidServer == null) { | |||||
| addLog("请先设置服务UUID") | |||||
| return | |||||
| } | |||||
| // sendStartWriteFile() | |||||
| sendA5DataStart(mWriteBytes.toInt()) | |||||
| } | |||||
| R.id.btnReadTest -> { | |||||
| sendStartReadFile() | |||||
| } | |||||
| } | |||||
| } | |||||
| override fun initData() { | |||||
| mAddress = intent.getStringExtra("mac") | |||||
| if (mAddress.isNullOrEmpty()) { | |||||
| finish() | |||||
| return | |||||
| } | |||||
| if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { | |||||
| onServiceSuccess() | |||||
| } | |||||
| listAdapter = ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mList) | |||||
| binding.listview.setAdapter(listAdapter) | |||||
| } | |||||
| @RequiresApi(Build.VERSION_CODES.O) | |||||
| override fun onServiceSuccess() { | |||||
| if (mBleManager != null && !TextUtils.isEmpty(mAddress)) { | |||||
| mBleDevice = mBleManager.getBleDevice(mAddress) | |||||
| mBleManager.setOnCallbackBle(this) | |||||
| mBleDevice?.let { | |||||
| it.setPreferredPhy(BluetoothDevice.PHY_LE_2M, BluetoothDevice.PHY_LE_2M) | |||||
| it.setMtu(517) | |||||
| it.setOnBleMtuListener(object : OnBleMtuListener { | |||||
| override fun onMtuAvailable(mtu: Int) { | |||||
| mMtu = mtu | |||||
| mSendDataMax = mtu - headMax | |||||
| } | |||||
| }) | |||||
| it.setOnBleOtherDataListener(this) | |||||
| it.setOnCharacteristicListener(object : OnCharacteristicListener { | |||||
| override fun onCharacteristicWriteOK(characteristic: BluetoothGattCharacteristic) { | |||||
| BleLog.i("写入成功回调时间戳:${System.currentTimeMillis()}") | |||||
| if (characteristic.uuid.toString() == sendUuid.toString()) { | |||||
| val str = characteristic.value.toString(Charset.forName("UTF-8")) | |||||
| if (str.startsWith("rate")) { | |||||
| return | |||||
| } | |||||
| mCount += characteristic.value.size | |||||
| runOnUiThread { | |||||
| binding.tvSendNumber.text = (mCount).toString() | |||||
| //发送完成 | |||||
| val currentTimeMillis = System.currentTimeMillis() | |||||
| val caT = (currentTimeMillis - mStartTime) / 1000F | |||||
| val noCaT = (currentTimeMillis - mStartWriteTime) / 1000F | |||||
| val kb = mCount / 1024 | |||||
| binding.tvSpeedWrite.text = | |||||
| "写速度:${kb / (caT)}KB/s(擦) ${kb / (noCaT)}KB/s 时间差(擦):${currentTimeMillis - mStartTime}" | |||||
| } | |||||
| } | |||||
| } | |||||
| }) | |||||
| } | |||||
| } | |||||
| } | |||||
| override fun onNotifyOtherData(uuid: String, data: ByteArray) { | |||||
| val cmdStr = String(data, Charset.forName("UTF-8")) | |||||
| if (cmdStr.startsWith("rateTx_ready") || checkA5StartData(data)) { | |||||
| //写开始 | |||||
| binding.tvSendNumber.text = "0" | |||||
| mStartWriteTime = System.currentTimeMillis() | |||||
| addLog("开始发送:${mStartWriteTime - mStartTime}") | |||||
| val total = mSendList.size | |||||
| for ((index, bytes) in mSendList.withIndex()) { | |||||
| val a5Data = getA5Data(index, total, bytes) | |||||
| sendData(a5Data) | |||||
| } | |||||
| sendA5DataEnd() | |||||
| } else if (cmdStr.startsWith("rateRx_ready")) { | |||||
| //读开始 | |||||
| mStartReadTime = System.currentTimeMillis() | |||||
| mReadBytes = 0 | |||||
| binding.tvReceiveNumber.text = "0" | |||||
| } else { | |||||
| mReadBytes += data.size | |||||
| mReadList.add(data) | |||||
| CoroutineUtils.coroutineScopeIo { | |||||
| withContext(Dispatchers.Main) { | |||||
| if (mReadBytes >= mWriteBytes) { | |||||
| val equal = areByteArrayListsEqual(mReadList, mSendList) | |||||
| addLog("内容是否相等:$equal") | |||||
| } | |||||
| val currentTimeMillis = System.currentTimeMillis() | |||||
| val lng = currentTimeMillis - mStartReadTime | |||||
| val kb = mReadBytes / 1024 | |||||
| binding.tvSpeedRead.text = "读速度:${kb / ((lng / 1000).toFloat())}KB/s 时间差:${lng}" | |||||
| binding.tvReceiveNumber.text = (mReadBytes).toString() | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| fun areByteArrayListsEqual(list1: MutableList<ByteArray>, list2: MutableList<ByteArray>): Boolean { | |||||
| // 先比较列表大小 | |||||
| if (list1.size != list2.size) return false | |||||
| // 使用索引逐个比较字节数组 | |||||
| return list1.indices.all { index -> | |||||
| list1[index].contentEquals(list2[index]) | |||||
| } | |||||
| } | |||||
| override fun onServiceErr() { | |||||
| addLog("服务绑定失败") | |||||
| } | |||||
| override fun unbindServices() { | |||||
| addLog("服务解绑") | |||||
| } | |||||
| override fun onDisConnected(mac: String?, code: Int) { | |||||
| super.onDisConnected(mac, code) | |||||
| addLog("断开连接:$mac 错误码:$code") | |||||
| } | |||||
| private fun readFileChunks(uri: Uri) { | |||||
| CoroutineScope(Dispatchers.Main).launch { | |||||
| val path = uri.toString() | |||||
| addLog("正在读取文件:$path") | |||||
| mSelectFilePath = path | |||||
| // binding.tvFileName.text = path.substring(path.lastIndexOf("test")) | |||||
| val result = withContext(Dispatchers.IO) { | |||||
| try { | |||||
| contentResolver.openInputStream(uri)?.use { inputStream -> | |||||
| // 创建 MutableList<ByteArray> 来存储分块数据 | |||||
| mSendList.clear() | |||||
| // 使用缓冲区读取文件,避免一次性加载大文件到内存 | |||||
| val buffer = ByteArray(mSendDataMax) | |||||
| var bytesRead: Int | |||||
| mWriteBytes = 0 | |||||
| while (inputStream.read(buffer).also { bytesRead = it } != -1) { | |||||
| // 创建正确大小的字节数组副本 | |||||
| val chunk = if (bytesRead < mSendDataMax) { | |||||
| buffer.copyOf(bytesRead) | |||||
| } else { | |||||
| buffer.copyOf() // 创建副本,避免重用缓冲区 | |||||
| } | |||||
| mSendList.add(chunk) | |||||
| mWriteBytes += bytesRead | |||||
| } | |||||
| // 构建结果字符串 | |||||
| val stringBuilder = StringBuilder() | |||||
| stringBuilder.append("文件读取成功!共 $mWriteBytes 字节,分成 ${mSendList.size} 个组\n\n") | |||||
| stringBuilder.toString() | |||||
| } ?: "无法打开文件流" | |||||
| } catch (e: Exception) { | |||||
| "读取文件时出错: ${e.message}" | |||||
| } | |||||
| } | |||||
| addLog(result) | |||||
| } | |||||
| } | |||||
| private fun sendStartWriteFile() { | |||||
| binding.tvSendNumber.text = "" | |||||
| binding.tvReceiveNumber.text = "" | |||||
| mCount = 0 | |||||
| mStartTime = System.currentTimeMillis() | |||||
| val cmdStr = "rateTx_start:$mWriteBytes" | |||||
| sendData(cmdStr.toByteArray(StandardCharsets.US_ASCII)) | |||||
| mHandler.postDelayed({ | |||||
| //0x7261746554785F7265616479 | |||||
| val byteArray = byteArrayOf(0x72, 0x61, 0x74, 0x65, 0x54, 0x78, 0x5F, 0x72, 0x65, 0x61, 0x64, 0x79) | |||||
| onNotifyOtherData("FFE2", byteArray) | |||||
| }, 1000) | |||||
| } | |||||
| private fun sendStartReadFile() { | |||||
| binding.tvSendNumber.text = "" | |||||
| binding.tvReceiveNumber.text = "" | |||||
| mReadList.clear() | |||||
| val cmdStr = "rateRx_start:$mWriteBytes" | |||||
| sendData(cmdStr.toByteArray(StandardCharsets.US_ASCII)) | |||||
| } | |||||
| private fun sendData(hex: ByteArray) { | |||||
| val sendDataBean = SendDataBean(hex, sendUuid, BleConfig.WRITE_DATA, sendUuidServer) | |||||
| mBleDevice?.sendDataNow(sendDataBean) | |||||
| } | |||||
| private fun sendA5DataStart(fileSize: Int) { | |||||
| binding.tvSendNumber.text = "" | |||||
| binding.tvReceiveNumber.text = "" | |||||
| mCount = 0 | |||||
| mStartTime = System.currentTimeMillis() | |||||
| //包头+cid+长度+sum+包尾=7 | |||||
| val a5Data = ByteArray(12) | |||||
| val len = 0x07 | |||||
| a5Data[0] = 0xA5.toByte() | |||||
| a5Data[1] = 0x00 | |||||
| a5Data[2] = len.toByte() | |||||
| a5Data[3] = 0x01 | |||||
| a5Data[4] = 0x02 | |||||
| a5Data[5] = 0x00 | |||||
| a5Data[6] = (fileSize shr 24).toByte() | |||||
| a5Data[7] = (fileSize shr 16).toByte() | |||||
| a5Data[8] = (fileSize shr 8).toByte() | |||||
| a5Data[9] = fileSize.toByte() | |||||
| val crcData = ByteArray(9) | |||||
| System.arraycopy(a5Data, 1, crcData, 0, crcData.size) | |||||
| val crc16 = AiLinkBleCheckUtil.getCrc16(crcData) | |||||
| a5Data[a5Data.size - 2] = (crc16 shr 8).toByte() | |||||
| a5Data[a5Data.size - 1] = crc16.toByte() | |||||
| sendData(a5Data) | |||||
| } | |||||
| private fun checkA5StartData(data: ByteArray): Boolean { | |||||
| return data[0].toUnsignedInt() == 0xA5 && data[3].toUnsignedInt() == 0x01 | |||||
| } | |||||
| /** | |||||
| * 获取a5数据 | |||||
| * | |||||
| * @param cid cid | |||||
| * @param data 数据 | |||||
| * @return [byte[]] | |||||
| */ | |||||
| private fun getA5Data(count: Int, total: Int, data: ByteArray): ByteArray { | |||||
| //包头+cid+长度+sum+包尾=7 | |||||
| val a5Data = ByteArray(data.size + headMax) | |||||
| val len = data.size + (headMax - 5) | |||||
| a5Data[0] = 0xA5.toByte() | |||||
| a5Data[1] = (len shr 8).toByte() | |||||
| a5Data[2] = len.toByte() | |||||
| a5Data[3] = 0x02 | |||||
| a5Data[4] = 0x02 | |||||
| a5Data[5] = (count shr 8).toByte() | |||||
| a5Data[6] = count.toByte() | |||||
| a5Data[7] = (total shr 8).toByte() | |||||
| a5Data[8] = total.toByte() | |||||
| val crcData = ByteArray(a5Data.size -3) | |||||
| System.arraycopy(data, 0, a5Data, 9, data.size) | |||||
| System.arraycopy(a5Data, 1, crcData, 0, crcData.size) | |||||
| val crc16 = AiLinkBleCheckUtil.getCrc16(crcData) | |||||
| a5Data[a5Data.size - 2] = (crc16 shr 8).toByte() | |||||
| a5Data[a5Data.size - 1] = crc16.toByte() | |||||
| return a5Data | |||||
| } | |||||
| private fun sendA5DataEnd() { | |||||
| //包头+cid+长度+sum+包尾=7 | |||||
| val a5Data = ByteArray(8) | |||||
| val len = 0x03 | |||||
| a5Data[0] = 0xA5.toByte() | |||||
| a5Data[1] = 0x00 | |||||
| a5Data[2] = len.toByte() | |||||
| a5Data[3] = 0x03 | |||||
| a5Data[4] = 0x02 | |||||
| a5Data[5] = 0x00 | |||||
| val crcData = ByteArray(5) | |||||
| System.arraycopy(a5Data, 1, crcData, 0, crcData.size) | |||||
| val crc16 = AiLinkBleCheckUtil.getCrc16(crcData) | |||||
| a5Data[a5Data.size - 2] = (crc16 shr 8).toByte() | |||||
| a5Data[a5Data.size - 1] = crc16.toByte() | |||||
| sendData(a5Data) | |||||
| } | |||||
| /** | |||||
| * 设置通知 | |||||
| */ | |||||
| private fun readNotify(uuidNotify: UUID?, notifyOpen: Boolean = true) { | |||||
| if (uuidNotify == null) { | |||||
| return | |||||
| } | |||||
| if (mBleDevice != null && sendUuidServer != null) { | |||||
| if (notifyOpen) { | |||||
| mBleDevice!!.setNotify(sendUuidServer, uuidNotify) | |||||
| } else { | |||||
| mBleDevice!!.setCloseNotify(sendUuidServer, uuidNotify) | |||||
| } | |||||
| } else { | |||||
| mList.add(TimeUtils.getTime() + "请先设置特征UUID和服务UUID") | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA) | |||||
| } | |||||
| } | |||||
| private var mShowLog = true | |||||
| private fun addLog(log: String?) { | |||||
| if (mShowLog) { | |||||
| BleLog.i(log) | |||||
| mList.add(TimeUtils.getTimeSSS() + log) | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA) | |||||
| } | |||||
| } | |||||
| override fun onDestroy() { | |||||
| super.onDestroy() | |||||
| mBleDevice?.disconnect() | |||||
| } | |||||
| } |
| super.onCreate(savedInstanceState); | super.onCreate(savedInstanceState); | ||||
| setContentView(R.layout.activity_blood_glucose); | setContentView(R.layout.activity_blood_glucose); | ||||
| mAddress = getIntent().getStringExtra("mac"); | mAddress = getIntent().getStringExtra("mac"); | ||||
| support_unit = findViewById(R.id.support_unit); | |||||
| support_unit = findViewById(R.id.getSupportUnit); | |||||
| quest_status = findViewById(R.id.quest_status); | quest_status = findViewById(R.id.quest_status); | ||||
| showdata=findViewById(R.id.showdata); | showdata=findViewById(R.id.showdata); | ||||
| test = findViewById(R.id.test); | test = findViewById(R.id.test); |
| import com.pingwang.bluetoothlib.utils.BleLog; | import com.pingwang.bluetoothlib.utils.BleLog; | ||||
| import com.pingwang.bluetoothlib.utils.BleStrUtils; | import com.pingwang.bluetoothlib.utils.BleStrUtils; | ||||
| import java.text.SimpleDateFormat; | |||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||
| import java.util.List; | import java.util.List; | ||||
| import java.util.UUID; | |||||
| import java.util.Locale; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.BroadcastScaleActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.BroadcastScaleActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | ||||
| /** | /** | ||||
| * 广播体重秤 | * 广播体重秤 | ||||
| * | |||||
| * @auther ljl | * @auther ljl | ||||
| * on 2023/3/10 | * on 2023/3/10 | ||||
| */ | */ | ||||
| mContext = this; | mContext = this; | ||||
| // mAddress = getIntent().getStringExtra("mac"); | // mAddress = getIntent().getStringExtra("mac"); | ||||
| mBleSendCmdUtil = BleSendCmdUtil.getInstance(); | mBleSendCmdUtil = BleSendCmdUtil.getInstance(); | ||||
| init(); | |||||
| initView(); | |||||
| initData(); | |||||
| initListener(); | |||||
| } | } | ||||
| private void init() { | |||||
| private void initData() { | |||||
| mList = new ArrayList<>(); | mList = new ArrayList<>(); | ||||
| ListView listView = findViewById(R.id.listview_weight); | ListView listView = findViewById(R.id.listview_weight); | ||||
| listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | ||||
| listView.setAdapter(listAdapter); | listView.setAdapter(listAdapter); | ||||
| findViewById(R.id.clear_weight).setOnClickListener(this); | |||||
| findViewById(R.id.open_weight).setOnClickListener(this); | |||||
| findViewById(R.id.stop_weight).setOnClickListener(this); | |||||
| ((RadioGroup) findViewById(R.id.radio_weight_weight)).setOnCheckedChangeListener(this); | |||||
| } | |||||
| private void initView() { | |||||
| tv_broadcast_temp = findViewById(R.id.tv_broadcast_temp_weight); | tv_broadcast_temp = findViewById(R.id.tv_broadcast_temp_weight); | ||||
| mRadioButtonKg = findViewById(R.id.radio_weight_kg_weight); | mRadioButtonKg = findViewById(R.id.radio_weight_kg_weight); | ||||
| tv_broadcast_mac = findViewById(R.id.tv_broadcast_mac_weight); | tv_broadcast_mac = findViewById(R.id.tv_broadcast_mac_weight); | ||||
| tv_broadcast_did = findViewById(R.id.tv_broadcast_did_weight); | tv_broadcast_did = findViewById(R.id.tv_broadcast_did_weight); | ||||
| } | |||||
| private void initListener() { | |||||
| findViewById(R.id.clear_weight).setOnClickListener(this); | |||||
| findViewById(R.id.open_weight).setOnClickListener(this); | |||||
| findViewById(R.id.stop_weight).setOnClickListener(this); | |||||
| ((RadioGroup) findViewById(R.id.radio_weight_weight)).setOnCheckedChangeListener(this); | |||||
| } | } | ||||
| if (checkedId == -1) { | if (checkedId == -1) { | ||||
| return;//不是人为点击不触发 | return;//不是人为点击不触发 | ||||
| } | } | ||||
| switch (group.getCheckedRadioButtonId()) { | |||||
| case R.id.radio_weight_kg_weight: | |||||
| mWeightUnit = BroadcastWeightScaleBleConfig.UNIT_KG; | |||||
| break; | |||||
| case R.id.radio_weight_jin_weight: | |||||
| mWeightUnit = BroadcastWeightScaleBleConfig.UNIT_F; | |||||
| break; | |||||
| case R.id.radio_weight_st_lb_weight: | |||||
| mWeightUnit = BroadcastWeightScaleBleConfig.UNIT_ST; | |||||
| break; | |||||
| case R.id.radio_weight_lb_lb_weight: | |||||
| mWeightUnit = BroadcastWeightScaleBleConfig.UNIT_LB_LB; | |||||
| break; | |||||
| int checkedRadioButtonId = group.getCheckedRadioButtonId(); | |||||
| if (checkedRadioButtonId == R.id.radio_weight_kg_weight) { | |||||
| mWeightUnit = BroadcastWeightScaleBleConfig.UNIT_KG; | |||||
| } else if (checkedRadioButtonId == R.id.radio_weight_jin_weight) { | |||||
| mWeightUnit = BroadcastWeightScaleBleConfig.UNIT_F; | |||||
| } else if (checkedRadioButtonId == R.id.radio_weight_st_lb_weight) { | |||||
| mWeightUnit = BroadcastWeightScaleBleConfig.UNIT_ST; | |||||
| } else if (checkedRadioButtonId == R.id.radio_weight_lb_lb_weight) { | |||||
| mWeightUnit = BroadcastWeightScaleBleConfig.UNIT_LB_LB; | |||||
| } | } | ||||
| BleLog.i("ljl", "weightUnit:" + mWeightUnit); | BleLog.i("ljl", "weightUnit:" + mWeightUnit); | ||||
| } | } | ||||
| @Override | @Override | ||||
| public void onClick(View v) { | public void onClick(View v) { | ||||
| switch (v.getId()) { | |||||
| case R.id.clear_weight: | |||||
| if (mList != null) { | |||||
| mList.clear(); | |||||
| } | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| break; | |||||
| case R.id.open_weight: | |||||
| if (AILinkBleManager.getInstance() != null) { | |||||
| AILinkBleManager.getInstance().startScan(0, UUID.fromString("0000F0A0-0000-1000-8000-00805F9B34FB")); | |||||
| } | |||||
| break; | |||||
| case R.id.stop_weight: | |||||
| if (AILinkBleManager.getInstance() != null) { | |||||
| AILinkBleManager.getInstance().stopScan(); | |||||
| } | |||||
| break; | |||||
| default: | |||||
| break; | |||||
| int id = v.getId(); | |||||
| if (id == R.id.clear_weight) { | |||||
| if (mList != null) { | |||||
| mList.clear(); | |||||
| } | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } else if (id == R.id.open_weight) { | |||||
| if (AILinkBleManager.getInstance() != null) { | |||||
| AILinkBleManager.getInstance().startScan(0, BleConfig.UUID_SERVER_BROADCAST_AILINK); | |||||
| } | |||||
| } else if (id == R.id.stop_weight) { | |||||
| if (AILinkBleManager.getInstance() != null) { | |||||
| AILinkBleManager.getInstance().stopScan(); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @Override | @Override | ||||
| public void onServiceSuccess() { | public void onServiceSuccess() { | ||||
| BleLog.i("ljl", "服务与界面建立连接成功"); | |||||
| //与服务建立连接 | //与服务建立连接 | ||||
| if (AILinkBleManager.getInstance() != null) { | if (AILinkBleManager.getInstance() != null) { | ||||
| mDevice = BroadcastWeightScaleDeviceData.getInstance(); | mDevice = BroadcastWeightScaleDeviceData.getInstance(); | ||||
| @Override | @Override | ||||
| public void onServiceErr() { | public void onServiceErr() { | ||||
| BleLog.i("ljl", "服务与界面连接断开"); | |||||
| //与服务断开连接 | //与服务断开连接 | ||||
| AILinkBleManager.getInstance().removeOnBleBroadcastDataListener(this); | AILinkBleManager.getInstance().removeOnBleBroadcastDataListener(this); | ||||
| } | } | ||||
| @Override | @Override | ||||
| public void bleOpen() { | public void bleOpen() { | ||||
| mList.add(TimeUtils.getTime() + "蓝牙打开"); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| addLog("蓝牙打开"); | |||||
| } | } | ||||
| @Override | @Override | ||||
| public void bleClose() { | public void bleClose() { | ||||
| BleLog.i(TAG, "蓝牙未开启,可请求开启"); | BleLog.i(TAG, "蓝牙未开启,可请求开启"); | ||||
| mList.add(TimeUtils.getTime() + "蓝牙关闭"); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| addLog("蓝牙关闭"); | |||||
| } | } | ||||
| //-----------------通知------------------- | //-----------------通知------------------- | ||||
| return; | return; | ||||
| } | } | ||||
| mOldData = data; | mOldData = data; | ||||
| mList.add(TimeUtils.getTime() + "数据ID" + type + " ,||解密payload数据:" + data + " ,||原始厂商数据:" + BleStrUtils.byte2HexStr(dataOriginal)); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| addLog( "数据ID" + type + " ,||解密payload数据:" + data + " ,||原始厂商数据:" + BleStrUtils.byte2HexStr(dataOriginal)); | |||||
| } | } | ||||
| } | } | ||||
| mList.add(showData); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| addLog(showData); | |||||
| } | } | ||||
| @Override | @Override | ||||
| int vid = bleValueBean.getVid(); | int vid = bleValueBean.getVid(); | ||||
| int pid = bleValueBean.getPid(); | int pid = bleValueBean.getPid(); | ||||
| if (mDevice != null) { | if (mDevice != null) { | ||||
| mDevice.onNotifyData(bleValueBean.getManufacturerData(),payload, cid, vid, pid); | |||||
| mDevice.onNotifyData(bleValueBean.getManufacturerData(), payload, cid, vid, pid); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| private String mOldLog = ""; | |||||
| private SimpleDateFormat sdf; | |||||
| /** | |||||
| * 添加日志 | |||||
| * | |||||
| * @param log 日志 | |||||
| */ | |||||
| private void addLog(String log) { | |||||
| if (mOldLog.equalsIgnoreCase(log)) { | |||||
| return; | |||||
| } | |||||
| if (sdf == null) { | |||||
| sdf = new SimpleDateFormat("HH:mm:ss", Locale.US); | |||||
| } | |||||
| mOldLog = log; | |||||
| mList.add(0, sdf.format(System.currentTimeMillis()) + ":\n" + log); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| } | } |
| private Button btnSetTime, btnQueryInfo, btnQueryThreshold; | private Button btnSetTime, btnQueryInfo, btnQueryThreshold; | ||||
| private Button btnSetCheckTime, btnSetBleName, btnSetThreshold; | private Button btnSetCheckTime, btnSetBleName, btnSetThreshold; | ||||
| private Button btnConnect, btnClearLog; | |||||
| private Button btnConnect, btnClearLog, btnHisTime; | |||||
| private Button btnQueryTheme, btnSetThemeNum; | |||||
| private Button btnQueryVersion, btnSetBind, btnQueryHardware; | |||||
| private EditText etCheckTime, etBleName; | private EditText etCheckTime, etBleName; | ||||
| private EditText etHrMin, etHrMax; | private EditText etHrMin, etHrMax; | ||||
| private EditText etTempMin, etTempMax; | private EditText etTempMin, etTempMax; | ||||
| private EditText etSbpMin, etSbpMax; | private EditText etSbpMin, etSbpMax; | ||||
| private EditText etDbpMin, etDbpMax; | private EditText etDbpMin, etDbpMax; | ||||
| private EditText etMac; | |||||
| private EditText etMac, etThemeNum, etHisTime; | |||||
| private CheckBox cbCheckTime; | |||||
| private CheckBox cbCheckTime, cbHisTime; | |||||
| private ListView log_list; | private ListView log_list; | ||||
| private List<String> mList; | private List<String> mList; | ||||
| private ArrayAdapter mListAdapter; | private ArrayAdapter mListAdapter; | ||||
| private String checkTimeOp; | |||||
| private String checkTimeOp, hisTimeOp; | |||||
| private Bw05WatchBleDevice mBw05WatchBleDevice; | private Bw05WatchBleDevice mBw05WatchBleDevice; | ||||
| btnConnect.setOnClickListener(this); | btnConnect.setOnClickListener(this); | ||||
| btnClearLog = findViewById(R.id.btnClearLog); | btnClearLog = findViewById(R.id.btnClearLog); | ||||
| btnClearLog.setOnClickListener(this); | btnClearLog.setOnClickListener(this); | ||||
| btnQueryTheme = findViewById(R.id.btnQueryTheme); | |||||
| btnQueryTheme.setOnClickListener(this); | |||||
| btnSetThemeNum = findViewById(R.id.btnSetThemeNum); | |||||
| btnSetThemeNum.setOnClickListener(this); | |||||
| btnQueryVersion = findViewById(R.id.btnQueryVersion); | |||||
| btnQueryVersion.setOnClickListener(this); | |||||
| btnSetBind = findViewById(R.id.btnSetBind); | |||||
| btnSetBind.setOnClickListener(this); | |||||
| btnQueryHardware = findViewById(R.id.btnQueryHardware); | |||||
| btnQueryHardware.setOnClickListener(this); | |||||
| btnHisTime = findViewById(R.id.btnHisTime); | |||||
| btnHisTime.setOnClickListener(this); | |||||
| etCheckTime = findViewById(R.id.etCheckTime); | etCheckTime = findViewById(R.id.etCheckTime); | ||||
| etBleName = findViewById(R.id.etBleName); | etBleName = findViewById(R.id.etBleName); | ||||
| etDbpMin = findViewById(R.id.etDbpMin); | etDbpMin = findViewById(R.id.etDbpMin); | ||||
| etDbpMax = findViewById(R.id.etDbpMax); | etDbpMax = findViewById(R.id.etDbpMax); | ||||
| etMac = findViewById(R.id.etMac); | etMac = findViewById(R.id.etMac); | ||||
| etThemeNum = findViewById(R.id.etThemeNum); | |||||
| etHisTime = findViewById(R.id.etHisTime); | |||||
| cbCheckTime = findViewById(R.id.cbCheckTime); | cbCheckTime = findViewById(R.id.cbCheckTime); | ||||
| cbHisTime = findViewById(R.id.cbHisTime); | |||||
| checkTimeOp = cbCheckTime.isChecked() ? "1" : "0"; | checkTimeOp = cbCheckTime.isChecked() ? "1" : "0"; | ||||
| hisTimeOp = cbHisTime.isChecked() ? "1" : "0"; | |||||
| cbCheckTime.setOnCheckedChangeListener((buttonView, isChecked) -> { | cbCheckTime.setOnCheckedChangeListener((buttonView, isChecked) -> { | ||||
| if (isChecked) { | if (isChecked) { | ||||
| } | } | ||||
| }); | }); | ||||
| cbHisTime.setOnCheckedChangeListener((buttonView, isChecked) -> { | |||||
| if (isChecked) { | |||||
| hisTimeOp = "1"; | |||||
| } else { | |||||
| hisTimeOp = "0"; | |||||
| } | |||||
| }); | |||||
| etTempMin.addTextChangedListener(new TextWatcher() { | etTempMin.addTextChangedListener(new TextWatcher() { | ||||
| @Override | @Override | ||||
| public void beforeTextChanged(CharSequence s, int start, int count, int after) { | public void beforeTextChanged(CharSequence s, int start, int count, int after) { | ||||
| if (v == null) { | if (v == null) { | ||||
| return; | return; | ||||
| } | } | ||||
| switch (v.getId()) { | |||||
| case R.id.btnSetTime: | |||||
| //设置时间 | |||||
| if (mBw05WatchBleDevice != null) { | |||||
| mBw05WatchBleDevice.setTime(); | |||||
| int id = v.getId(); | |||||
| if (id == R.id.btnSetTime) {//设置时间 | |||||
| if (mBw05WatchBleDevice != null) { | |||||
| mBw05WatchBleDevice.setTime(); | |||||
| } | |||||
| } else if (id == R.id.btnQueryInfo) {//查询信息 | |||||
| if (mBw05WatchBleDevice != null) { | |||||
| mBw05WatchBleDevice.queryInfo(); | |||||
| } | |||||
| } else if (id == R.id.btnQueryThreshold) {//查询阈值 | |||||
| if (mBw05WatchBleDevice != null) { | |||||
| mBw05WatchBleDevice.queryThreshold(); | |||||
| } | |||||
| } else if (id == R.id.btnSetCheckTime) {//设置检测间隔时间 | |||||
| if (!TextUtils.isEmpty(etCheckTime.getText().toString())) { | |||||
| if (etCheckTime.getText().toString().length() < 4 && mBw05WatchBleDevice != null) { | |||||
| mBw05WatchBleDevice.setCheckTime(checkTimeOp + formatDataStr(etCheckTime.getText().toString(), 3)); | |||||
| } | } | ||||
| break; | |||||
| case R.id.btnQueryInfo: | |||||
| //查询信息 | |||||
| } | |||||
| } else if (id == R.id.btnSetBleName) {//设置蓝牙名称 | |||||
| if (!TextUtils.isEmpty(etBleName.getText().toString())) { | |||||
| if (mBw05WatchBleDevice != null) { | if (mBw05WatchBleDevice != null) { | ||||
| mBw05WatchBleDevice.queryInfo(); | |||||
| mBw05WatchBleDevice.setBleName(etBleName.getText().toString()); | |||||
| } | } | ||||
| break; | |||||
| case R.id.btnQueryThreshold: | |||||
| //查询阈值 | |||||
| } | |||||
| } else if (id == R.id.btnSetThreshold) {//设置阈值 | |||||
| if (!TextUtils.isEmpty(getFloatThresholdValue(etTempMin.getText().toString(), etTempMin.getHint().toString())) | |||||
| && !TextUtils.isEmpty(getFloatThresholdValue(etTempMax.getText().toString(), etTempMax.getHint().toString()))) { | |||||
| if (mBw05WatchBleDevice != null) { | if (mBw05WatchBleDevice != null) { | ||||
| mBw05WatchBleDevice.queryThreshold(); | |||||
| } | |||||
| break; | |||||
| case R.id.btnSetCheckTime: | |||||
| //设置检测间隔时间 | |||||
| if (!TextUtils.isEmpty(etCheckTime.getText().toString())) { | |||||
| if (etCheckTime.getText().toString().length() < 4 && mBw05WatchBleDevice != null) { | |||||
| mBw05WatchBleDevice.setCheckTime(checkTimeOp + formatDataStr(etCheckTime.getText().toString(), 3)); | |||||
| } | |||||
| } | |||||
| break; | |||||
| case R.id.btnSetBleName: | |||||
| //设置蓝牙名称 | |||||
| if (!TextUtils.isEmpty(etBleName.getText().toString())) { | |||||
| if (mBw05WatchBleDevice != null) { | |||||
| mBw05WatchBleDevice.setBleName(etBleName.getText().toString()); | |||||
| } | |||||
| } | |||||
| break; | |||||
| case R.id.btnSetThreshold: | |||||
| //设置阈值 | |||||
| if (!TextUtils.isEmpty(getFloatThresholdValue(etTempMin.getText().toString(), etTempMin.getHint().toString())) | |||||
| && !TextUtils.isEmpty(getFloatThresholdValue(etTempMax.getText().toString(), etTempMax.getHint().toString()))) { | |||||
| if (mBw05WatchBleDevice != null) { | |||||
| StringBuilder stringBuilder = new StringBuilder(); | |||||
| stringBuilder.append(getIntThresholdValue(etHrMin.getText().toString(), etHrMin.getHint().toString())); | |||||
| stringBuilder.append(getIntThresholdValue(etHrMax.getText().toString(), etHrMax.getHint().toString())); | |||||
| stringBuilder.append(getIntThresholdValue(etSpo2Min.getText().toString(), etSpo2Min.getHint().toString())); | |||||
| stringBuilder.append(getIntThresholdValue(etSpo2Max.getText().toString(), etSpo2Max.getHint().toString())); | |||||
| StringBuilder stringBuilder = new StringBuilder(); | |||||
| stringBuilder.append(getIntThresholdValue(etHrMin.getText().toString(), etHrMin.getHint().toString())); | |||||
| stringBuilder.append(getIntThresholdValue(etHrMax.getText().toString(), etHrMax.getHint().toString())); | |||||
| stringBuilder.append(getIntThresholdValue(etSpo2Min.getText().toString(), etSpo2Min.getHint().toString())); | |||||
| stringBuilder.append(getIntThresholdValue(etSpo2Max.getText().toString(), etSpo2Max.getHint().toString())); | |||||
| // stringBuilder.append(getIntThresholdValue(etSbpMin.getText().toString(), etSbpMin.getHint().toString())); | // stringBuilder.append(getIntThresholdValue(etSbpMin.getText().toString(), etSbpMin.getHint().toString())); | ||||
| // stringBuilder.append(getIntThresholdValue(etSbpMax.getText().toString(), etSbpMax.getHint().toString())); | // stringBuilder.append(getIntThresholdValue(etSbpMax.getText().toString(), etSbpMax.getHint().toString())); | ||||
| // stringBuilder.append(getIntThresholdValue(etDbpMin.getText().toString(), etDbpMin.getHint().toString())); | // stringBuilder.append(getIntThresholdValue(etDbpMin.getText().toString(), etDbpMin.getHint().toString())); | ||||
| // stringBuilder.append(getIntThresholdValue(etDbpMax.getText().toString(), etDbpMax.getHint().toString())); | // stringBuilder.append(getIntThresholdValue(etDbpMax.getText().toString(), etDbpMax.getHint().toString())); | ||||
| stringBuilder.append(getFloatThresholdValue(etTempMin.getText().toString(), etTempMin.getHint().toString())); | |||||
| stringBuilder.append(getFloatThresholdValue(etTempMax.getText().toString(), etTempMax.getHint().toString())); | |||||
| stringBuilder.append(getFloatThresholdValue(etTempMin.getText().toString(), etTempMin.getHint().toString())); | |||||
| stringBuilder.append(getFloatThresholdValue(etTempMax.getText().toString(), etTempMax.getHint().toString())); | |||||
| String payLoadStr = stringBuilder.toString(); | |||||
| mBw05WatchBleDevice.setRangeValue(payLoadStr); | |||||
| } | |||||
| String payLoadStr = stringBuilder.toString(); | |||||
| mBw05WatchBleDevice.setRangeValue(payLoadStr); | |||||
| } | } | ||||
| break; | |||||
| case R.id.btnConnect: | |||||
| //连接设备 | |||||
| if (btnConnect.getText().toString().equals("连接")) { | |||||
| if (!TextUtils.isEmpty(etMac.getText().toString()) && isValidMacAddress(etMac.getText().toString()) && mAILinkBleManager != null) { | |||||
| connectMac = etMac.getText().toString(); | |||||
| connectBle(connectMac.toUpperCase()); | |||||
| } else { | |||||
| Toast.makeText(this, "地址出错", Toast.LENGTH_SHORT).show(); | |||||
| } | |||||
| } | |||||
| } else if (id == R.id.btnConnect) {//连接设备 | |||||
| if (btnConnect.getText().toString().equals("连接")) { | |||||
| if (!TextUtils.isEmpty(etMac.getText().toString()) && isValidMacAddress(etMac.getText().toString()) && mAILinkBleManager != null) { | |||||
| connectMac = etMac.getText().toString(); | |||||
| connectBle(connectMac.toUpperCase()); | |||||
| } else { | } else { | ||||
| if (mAILinkBleManager != null && !TextUtils.isEmpty(connectMac)) { | |||||
| mAILinkBleManager.disconnect(connectMac.toUpperCase()); | |||||
| } | |||||
| Toast.makeText(this, "MAC地址出错", Toast.LENGTH_SHORT).show(); | |||||
| } | } | ||||
| break; | |||||
| case R.id.btnClearLog: | |||||
| clearText(); | |||||
| break; | |||||
| default: | |||||
| break; | |||||
| } else { | |||||
| if (mAILinkBleManager != null && !TextUtils.isEmpty(connectMac)) { | |||||
| mAILinkBleManager.disconnect(connectMac.toUpperCase()); | |||||
| } | |||||
| } | |||||
| } else if (id == R.id.btnQueryTheme) {//查询主题 | |||||
| if (mBw05WatchBleDevice != null) { | |||||
| mBw05WatchBleDevice.queryTheme(); | |||||
| } | |||||
| } else if (id == R.id.btnSetThemeNum) {//设置主题 | |||||
| if (!TextUtils.isEmpty(etThemeNum.getText().toString()) && ("1".equals(etThemeNum.getText().toString()) | |||||
| || "2".equals(etThemeNum.getText().toString()) || "3".equals(etThemeNum.getText().toString()))) { | |||||
| if (mBw05WatchBleDevice != null) { | |||||
| mBw05WatchBleDevice.setTheme(etThemeNum.getText().toString()); | |||||
| } | |||||
| } else { | |||||
| Toast.makeText(this, "只支持输入1,2,3", Toast.LENGTH_SHORT).show(); | |||||
| } | |||||
| } else if (id == R.id.btnQueryVersion) {//查询手环版本号 | |||||
| if (mBw05WatchBleDevice != null) { | |||||
| mBw05WatchBleDevice.queryVersion(); | |||||
| } | |||||
| } else if (id == R.id.btnSetBind) {//设置手环进入绑定模式 | |||||
| if (mBw05WatchBleDevice != null) { | |||||
| mBw05WatchBleDevice.setBindMode(); | |||||
| } | |||||
| } else if (id == R.id.btnQueryHardware) {//查询硬件状态 | |||||
| if (mBw05WatchBleDevice != null) { | |||||
| mBw05WatchBleDevice.queryHardware(); | |||||
| } | |||||
| } else if (id == R.id.btnHisTime) {//设置历史上传间隔 | |||||
| if (!TextUtils.isEmpty(etHisTime.getText().toString())) { | |||||
| if (etHisTime.getText().toString().length() < 5 && mBw05WatchBleDevice != null) { | |||||
| int time = Integer.parseInt(etHisTime.getText().toString()); | |||||
| mBw05WatchBleDevice.setHisTime(hisTimeOp + String.format(Locale.US, "%04d", time)); | |||||
| } | |||||
| } | |||||
| } else if (id == R.id.btnClearLog) { | |||||
| clearText(); | |||||
| } | } | ||||
| } | } | ||||
| package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.caseTreasure | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R | |||||
| import android.os.Handler | |||||
| import android.os.Looper | |||||
| import android.os.Message | |||||
| import android.view.View | |||||
| import android.view.WindowManager | |||||
| import android.widget.AdapterView | |||||
| import android.widget.ArrayAdapter | |||||
| import android.widget.Toast | |||||
| import cn.net.aicare.modulelibrary.module.bleCaseTreasure.BleCaseTreasureDevice | |||||
| import com.pingwang.bluetoothlib.listener.OnCallbackBle | |||||
| import com.pingwang.bluetoothlib.utils.BleStrUtils | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.KBleBaseNewActivity | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.databinding.ActivityBleCaseTreasureBinding | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L | |||||
| import java.text.SimpleDateFormat | |||||
| import java.util.Locale | |||||
| /** | |||||
| * 病例宝界面 | |||||
| * @author xing | |||||
| * @date 2025/06/03 | |||||
| * @constructor 创建[BleCaseTreasureActivity] | |||||
| */ | |||||
| class BleCaseTreasureActivity : KBleBaseNewActivity<ActivityBleCaseTreasureBinding>(), BleCaseTreasureDevice.OnBleCaseTreasureListener, | |||||
| View.OnClickListener, OnCallbackBle { | |||||
| private val REFRESH_DATA = 3 | |||||
| private val LOOPSEND_KEY = 4 | |||||
| private val mList: ArrayList<String> = arrayListOf() | |||||
| private var listAdapter: ArrayAdapter<*>? = null | |||||
| private var mMac = "" | |||||
| private var mBleCaseTreasureDevice: BleCaseTreasureDevice? = null | |||||
| private var spList = arrayOf("ASCII") | |||||
| private var mSelectPosition = 0 | |||||
| private var mSendIntervalMs = 1000L | |||||
| private var mSendCountAll = 0 | |||||
| private var mSendCount = 0 | |||||
| private var mSendData = "" | |||||
| private val mHandler: Handler = object : Handler(Looper.getMainLooper()) { | |||||
| override fun handleMessage(msg: Message) { | |||||
| when (msg.what) { | |||||
| REFRESH_DATA -> listAdapter?.notifyDataSetChanged() | |||||
| LOOPSEND_KEY -> { | |||||
| if (mSendCount >= mSendCountAll) { | |||||
| addLog("已循环发送完成:$mSendCount") | |||||
| removeMessages(LOOPSEND_KEY) | |||||
| return | |||||
| } | |||||
| val charsetName = spList[mSelectPosition] | |||||
| mBleCaseTreasureDevice?.sendString(charsetName, "$mSendCount:$mSendData") | |||||
| mSendCount++ | |||||
| binding.tvSendCount.text = "$mSendCount" | |||||
| sendEmptyMessageDelayed(LOOPSEND_KEY, mSendIntervalMs) | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| override fun getLayoutView(): ActivityBleCaseTreasureBinding { | |||||
| return ActivityBleCaseTreasureBinding.inflate(layoutInflater) | |||||
| } | |||||
| override fun initListener() { | |||||
| binding.btnConnect.setOnClickListener(this) | |||||
| binding.btnDisconnect.setOnClickListener(this) | |||||
| binding.btnClear.setOnClickListener(this) | |||||
| binding.btnGetVersion.setOnClickListener(this) | |||||
| binding.btnGetDeviceStatus.setOnClickListener(this) | |||||
| binding.btnSendData.setOnClickListener(this) | |||||
| binding.btnSendSpeed.setOnClickListener(this) | |||||
| binding.btnLoopSend.setOnClickListener(this) | |||||
| binding.btnStopSend.setOnClickListener(this) | |||||
| binding.btnResetCount.setOnClickListener(this) | |||||
| binding.spEncoding.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { | |||||
| override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { | |||||
| mSelectPosition = position | |||||
| addLog("选择的项:${spList[position]}") | |||||
| } | |||||
| override fun onNothingSelected(parent: AdapterView<*>?) { | |||||
| L.i("没有选择") | |||||
| } | |||||
| } | |||||
| } | |||||
| override fun onClick(v: View?) { | |||||
| when (v?.id) { | |||||
| R.id.btnConnect -> { | |||||
| mBleManager.connectDevice(mMac) | |||||
| } | |||||
| R.id.btnDisconnect -> { | |||||
| mBleManager.disconnect(mMac) | |||||
| } | |||||
| R.id.btnClear -> { | |||||
| mList.clear() | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA) | |||||
| } | |||||
| R.id.btnGetVersion -> { | |||||
| mBleCaseTreasureDevice?.getVersion() | |||||
| } | |||||
| R.id.btnGetDeviceStatus -> { | |||||
| mBleCaseTreasureDevice?.getDeviceStatus() | |||||
| } | |||||
| R.id.btnSendData -> { | |||||
| val data = binding.etData.text.toString() | |||||
| if (data.isEmpty()) { | |||||
| addLog("发送的内容不能为空") | |||||
| return | |||||
| } | |||||
| val charsetName = spList[mSelectPosition] | |||||
| mBleCaseTreasureDevice?.sendString(charsetName, data) | |||||
| } | |||||
| R.id.btnSendSpeed -> { | |||||
| val data = binding.etSpeedUs.text.toString() | |||||
| mBleCaseTreasureDevice?.setSpeed(data.toInt()) | |||||
| } | |||||
| R.id.btnLoopSend -> { | |||||
| mSendCountAll = binding.etCount.text.toString().toInt() | |||||
| mSendIntervalMs = binding.etIntervalMs.text.toString().toLong() | |||||
| mSendData = binding.etData.text.toString() | |||||
| if (mSendData.isEmpty()) { | |||||
| addLog("发送的内容不能为空") | |||||
| return | |||||
| } | |||||
| if (mSendIntervalMs<1000){ | |||||
| addLog("发送间隔不能小于1000") | |||||
| Toast.makeText(this,"发送间隔不能小于1000", Toast.LENGTH_LONG).show() | |||||
| return | |||||
| } | |||||
| mHandler.removeMessages(LOOPSEND_KEY) | |||||
| mHandler.sendEmptyMessage(LOOPSEND_KEY) | |||||
| } | |||||
| R.id.btnStopSend -> { | |||||
| mHandler.removeMessages(LOOPSEND_KEY) | |||||
| } | |||||
| R.id.btnResetCount -> { | |||||
| mSendCount = 0 | |||||
| binding.tvSendCount.text = "$mSendCount" | |||||
| mHandler.removeMessages(LOOPSEND_KEY) | |||||
| } | |||||
| else -> {} | |||||
| } | |||||
| } | |||||
| override fun initData() { | |||||
| //设置常亮 | |||||
| window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) | |||||
| mMac = intent.getStringExtra("mac") ?: "" | |||||
| if (mMac.isEmpty()) { | |||||
| finish() | |||||
| return | |||||
| } | |||||
| binding.tvMac.text = mMac | |||||
| listAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, mList) | |||||
| binding.listview.adapter = listAdapter | |||||
| spList = resources.getStringArray(R.array.spinner_encoding_format) | |||||
| val adapter = ArrayAdapter.createFromResource(this, R.array.spinner_encoding_format, android.R.layout.simple_spinner_item) | |||||
| adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) | |||||
| binding.spEncoding.adapter = adapter | |||||
| binding.spEncoding.setSelection(mSelectPosition) | |||||
| onServiceSuccess() | |||||
| } | |||||
| override fun onServiceSuccess() { | |||||
| if (mMac.isEmpty() || mBleManager == null) { | |||||
| return | |||||
| } | |||||
| val bleDevice = mBleManager.getBleDevice(mMac) | |||||
| bleDevice?.let { | |||||
| addLog("连接成功:${mMac}") | |||||
| mBleManager.setOnCallbackBle(this) | |||||
| mBleCaseTreasureDevice = BleCaseTreasureDevice(bleDevice) | |||||
| mBleCaseTreasureDevice?.addListener(this@BleCaseTreasureActivity) | |||||
| } | |||||
| } | |||||
| override fun onServiceErr() { | |||||
| } | |||||
| override fun unbindServices() { | |||||
| } | |||||
| override fun bleOpen() { | |||||
| addLog("蓝牙已打开") | |||||
| } | |||||
| override fun bleClose() { | |||||
| addLog("蓝牙已关闭") | |||||
| } | |||||
| override fun onServicesDiscovered(mac: String?) { | |||||
| onServiceSuccess() | |||||
| } | |||||
| override fun onDisConnected(mac: String?, code: Int) { | |||||
| addLog("断开连接:$mac 错误码:$code") | |||||
| mHandler.removeMessages(LOOPSEND_KEY) | |||||
| } | |||||
| override fun onVersion(version: String?) { | |||||
| addLog("版本号:$version") | |||||
| } | |||||
| override fun onDeviceStatus(status: Int, dataId: Int, sendId: Int) { | |||||
| addLog("设备状态:$status,病例ID:$dataId,已传帧ID:$sendId") | |||||
| } | |||||
| override fun onSendDataSchedule(cur: Int, size: Int) { | |||||
| addLog("已发送帧数:$cur,总帧数:${size}, 发送完成") | |||||
| } | |||||
| override fun onSendFail() { | |||||
| addLog("发送失败") | |||||
| } | |||||
| override fun onSendDataId(dataId: Int) { | |||||
| addLog("发送的数据ID:$dataId") | |||||
| } | |||||
| override fun onSendHex(hex: ByteArray?) { | |||||
| L.i("发送的数据:${BleStrUtils.byte2HexStr(hex)}") | |||||
| // addLog("发送的数据:${BleStrUtils.byte2HexStr(hex)}") | |||||
| } | |||||
| override fun onSetSpeed(status: Int) { | |||||
| addLog("设置打字速度:${if (status == 0) "成功" else "失败"}") | |||||
| } | |||||
| override fun onDestroy() { | |||||
| super.onDestroy() | |||||
| mHandler.removeMessages(LOOPSEND_KEY) | |||||
| } | |||||
| //-----------log--------------- | |||||
| private var mOldLog = "" | |||||
| private var sdf: SimpleDateFormat? = null | |||||
| /** | |||||
| * 添加日志 | |||||
| * | |||||
| * @param log 日志 | |||||
| */ | |||||
| private fun addLog(log: String) { | |||||
| if (mOldLog.equals(log, ignoreCase = true)) { | |||||
| return | |||||
| } | |||||
| if (sdf == null) { | |||||
| sdf = SimpleDateFormat("HH:mm:ss:SSS", Locale.US) | |||||
| } | |||||
| mOldLog = log | |||||
| mList.add( | |||||
| 0, """ | |||||
| ${sdf!!.format(System.currentTimeMillis())}: | |||||
| $log | |||||
| """.trimIndent() | |||||
| ) | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA) | |||||
| } | |||||
| } |
| @Override | @Override | ||||
| public void onClick(View v) { | public void onClick(View v) { | ||||
| switch (v.getId()) { | |||||
| case R.id.btn_clear: | |||||
| // 清空文本框 | |||||
| clearText(); | |||||
| break; | |||||
| case R.id.btnPause: | |||||
| // 清空文本框 | |||||
| mPauseRefresh = !mPauseRefresh; | |||||
| break; | |||||
| case R.id.btn_zero: | |||||
| // APP下发去皮功能(归零功能) | |||||
| //某些秤可能需要进入冲煮模式才能使用,并且设备上面的定时和归零可用 | |||||
| appSetZero(); | |||||
| break; | |||||
| case R.id.btn_set_weight_unit: | |||||
| // APP下发重量单位 | |||||
| appSetWeightUnit(); | |||||
| break; | |||||
| case R.id.btn_set_temp_unit: | |||||
| // APP下发温度单位 | |||||
| appSetTempUnit(); | |||||
| break; | |||||
| case R.id.btn_set_auto_shutdown: | |||||
| // APP下发自动关机 | |||||
| appSetAutoShutdown(); | |||||
| break; | |||||
| case R.id.btn_set_timing: | |||||
| // APP下发计时功能控制 | |||||
| appSetTiming(); | |||||
| break; | |||||
| case R.id.btn_callback_timing: | |||||
| // APP回复计时功能 | |||||
| appCallbackTiming(); | |||||
| break; | |||||
| case R.id.btn_set_alert: | |||||
| // APP下发报警设置 | |||||
| appSetAlert(); | |||||
| break; | |||||
| case R.id.btn_stop_alert: | |||||
| // APP停止报警指令 | |||||
| appStopAlert(); | |||||
| break; | |||||
| case R.id.btn_callback_alert: | |||||
| // APP回复报警设置 | |||||
| appCallbackAlert(); | |||||
| break; | |||||
| case R.id.btn_callback_stop_alert: | |||||
| // APP回复停止报警 | |||||
| appCallbackStopAlert(); | |||||
| break; | |||||
| case R.id.btn_brew_mode: | |||||
| // APP设置冲煮模式 | |||||
| appBrewMode(); | |||||
| break; | |||||
| int id = v.getId(); | |||||
| if (id == R.id.btn_clear) {// 清空文本框 | |||||
| clearText(); | |||||
| } else if (id == R.id.btnPause) {// 清空文本框 | |||||
| mPauseRefresh = !mPauseRefresh; | |||||
| } else if (id == R.id.btn_zero) {// APP下发去皮功能(归零功能) | |||||
| //某些秤可能需要进入冲煮模式才能使用,并且设备上面的定时和归零可用 | |||||
| appSetZero(); | |||||
| } else if (id == R.id.btn_set_weight_unit) {// APP下发重量单位 | |||||
| appSetWeightUnit(); | |||||
| } else if (id == R.id.btn_set_temp_unit) {// APP下发温度单位 | |||||
| appSetTempUnit(); | |||||
| } else if (id == R.id.btn_set_auto_shutdown) {// APP下发自动关机 | |||||
| appSetAutoShutdown(); | |||||
| } else if (id == R.id.btn_set_timing) {// APP下发计时功能控制 | |||||
| appSetTiming(); | |||||
| } else if (id == R.id.btn_callback_timing) {// APP回复计时功能 | |||||
| appCallbackTiming(); | |||||
| } else if (id == R.id.btn_set_alert) {// APP下发报警设置 | |||||
| appSetAlert(); | |||||
| } else if (id == R.id.btn_stop_alert) {// APP停止报警指令 | |||||
| appStopAlert(); | |||||
| } else if (id == R.id.btn_callback_alert) {// APP回复报警设置 | |||||
| appCallbackAlert(); | |||||
| } else if (id == R.id.btn_callback_stop_alert) {// APP回复停止报警 | |||||
| appCallbackStopAlert(); | |||||
| } else if (id == R.id.btn_brew_mode) {// APP设置冲煮模式 | |||||
| appBrewMode(); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| SimpleDateFormat sdf; | |||||
| private SimpleDateFormat sdf; | |||||
| // 添加一条文本 | // 添加一条文本 | ||||
| private void addText(String text) { | private void addText(String text) { | ||||
| if (mPauseRefresh) { | if (mPauseRefresh) { |
| package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.eight_bodyfat; | package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.eight_bodyfat; | ||||
| /** | |||||
| * 八电极阻抗信息 | |||||
| * | |||||
| * @author xing | |||||
| * @date 2024/11/29 | |||||
| */ | |||||
| public class EightBodyFatAdc { | public class EightBodyFatAdc { | ||||
| import android.view.View; | import android.view.View; | ||||
| import android.widget.ArrayAdapter; | import android.widget.ArrayAdapter; | ||||
| import android.widget.CompoundButton; | import android.widget.CompoundButton; | ||||
| import android.widget.EditText; | |||||
| import android.widget.ListView; | import android.widget.ListView; | ||||
| import android.widget.RadioButton; | import android.widget.RadioButton; | ||||
| import com.pingwang.bluetoothlib.device.BleDevice; | import com.pingwang.bluetoothlib.device.BleDevice; | ||||
| import com.pingwang.bluetoothlib.listener.OnCallbackBle; | import com.pingwang.bluetoothlib.listener.OnCallbackBle; | ||||
| import java.text.SimpleDateFormat; | |||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||
| import java.util.List; | import java.util.List; | ||||
| import java.util.Locale; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.UnitUtils; | |||||
| import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatMcuDeviceData; | import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatMcuDeviceData; | ||||
| import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatUtil; | import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatUtil; | ||||
| private String mAddress; | private String mAddress; | ||||
| private EightBodyFatMcuDeviceData mEightBodyFatDeviceData; | private EightBodyFatMcuDeviceData mEightBodyFatDeviceData; | ||||
| private RadioButton kg, jing, stlb, lb, C, F; | private RadioButton kg, jing, stlb, lb, C, F; | ||||
| private UserInfoBean mUserInfoBean; | |||||
| private EditText et_weight, et_height, et_age, et_sex; | |||||
| @Override | @Override | ||||
| protected void onCreate(@Nullable Bundle savedInstanceState) { | protected void onCreate(@Nullable Bundle savedInstanceState) { | ||||
| super.onCreate(savedInstanceState); | super.onCreate(savedInstanceState); | ||||
| setContentView(R.layout.activity_eight_body_fata); | setContentView(R.layout.activity_eight_body_fata); | ||||
| mAddress = getIntent().getStringExtra("mac"); | mAddress = getIntent().getStringExtra("mac"); | ||||
| init(); | |||||
| loglist = new ArrayList<>(); | |||||
| listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, loglist); | |||||
| log_list.setAdapter(listAdapter); | |||||
| initView(); | |||||
| initData(); | |||||
| initListener(); | |||||
| setTitleData("八电极秤 MCU算法:0x" + Integer.toHexString(EightBodyFatUtil.EIGHT_BODY_FAT_SCALE_MCU)); | |||||
| } | } | ||||
| private void init() { | |||||
| private void initView() { | |||||
| et_weight = findViewById(R.id.et_weight); | |||||
| et_height = findViewById(R.id.et_height); | |||||
| et_age = findViewById(R.id.et_age); | |||||
| et_sex = findViewById(R.id.et_sex); | |||||
| log_list = findViewById(R.id.log_list); | log_list = findViewById(R.id.log_list); | ||||
| kg = findViewById(R.id.kg); | kg = findViewById(R.id.kg); | ||||
| jing = findViewById(R.id.jin); | jing = findViewById(R.id.jin); | ||||
| lb = findViewById(R.id.lb); | lb = findViewById(R.id.lb); | ||||
| C = findViewById(R.id.c); | C = findViewById(R.id.c); | ||||
| F = findViewById(R.id.f); | F = findViewById(R.id.f); | ||||
| findViewById(R.id.support_unit).setOnClickListener(this); | |||||
| } | |||||
| private void initData() { | |||||
| initUserInfo(); | |||||
| loglist = new ArrayList<>(); | |||||
| listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, loglist); | |||||
| log_list.setAdapter(listAdapter); | |||||
| } | |||||
| /** | |||||
| * 初始化用户信息 | |||||
| */ | |||||
| private void initUserInfo() { | |||||
| String weightKg = et_weight.getText().toString().trim(); | |||||
| String height = et_height.getText().toString().trim(); | |||||
| String age = et_age.getText().toString().trim(); | |||||
| String sex = et_sex.getText().toString().trim(); | |||||
| if (mUserInfoBean == null) { | |||||
| mUserInfoBean = new UserInfoBean(); | |||||
| mUserInfoBean.setUserId(1); | |||||
| mUserInfoBean.setUserType(0); | |||||
| } | |||||
| mUserInfoBean.setAge(Integer.parseInt(age)); | |||||
| mUserInfoBean.setSex(Integer.parseInt(sex)); | |||||
| mUserInfoBean.setHeightCm(Integer.parseInt(height)); | |||||
| mUserInfoBean.setWeightKg(Float.parseFloat(weightKg)); | |||||
| } | |||||
| private void initListener() { | |||||
| findViewById(R.id.getSupportUnit).setOnClickListener(this); | |||||
| findViewById(R.id.btn_update).setOnClickListener(this); | |||||
| kg.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | kg.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | ||||
| @Override | @Override | ||||
| public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | ||||
| @Override | @Override | ||||
| public void onClick(View v) { | public void onClick(View v) { | ||||
| if (v.getId() == R.id.support_unit) { | |||||
| if (v.getId() == R.id.getSupportUnit) { | |||||
| if (mEightBodyFatDeviceData != null) | if (mEightBodyFatDeviceData != null) | ||||
| mEightBodyFatDeviceData.getUnitList(); | mEightBodyFatDeviceData.getUnitList(); | ||||
| }else if (v.getId() == R.id.btn_update) { | |||||
| initUserInfo(); | |||||
| addLog("更新用户信息"); | |||||
| } | } | ||||
| } | } | ||||
| addLog("设备返回操作指令:" + opCodeStr + " 结果:" + resultStr); | addLog("设备返回操作指令:" + opCodeStr + " 结果:" + resultStr); | ||||
| } | } | ||||
| private double weightValue; | |||||
| @Override | @Override | ||||
| public void onWeight(int status, int weight, int unit, int decimal) { | public void onWeight(int status, int weight, int unit, int decimal) { | ||||
| statusStr = "实时体重"; | statusStr = "实时体重"; | ||||
| } else if (status == 0x02) { | } else if (status == 0x02) { | ||||
| statusStr = "稳定体重"; | statusStr = "稳定体重"; | ||||
| mUserInfoBean.setWeightKg(Float.parseFloat(UnitUtils.getWeightToKg(unit,String.valueOf(weight),decimal))); | |||||
| } | } | ||||
| if (decimal == 0) { | |||||
| weightValue = weight; | |||||
| } else { | |||||
| weightValue = weight / (decimal * 10.0); | |||||
| } | |||||
| float weightF = Float.parseFloat(UnitUtils.getHoldDecimal(decimal, weight)); | |||||
| String unitStr = ""; | String unitStr = ""; | ||||
| if (unit == EightBodyFatUtil.KG) { | if (unit == EightBodyFatUtil.KG) { | ||||
| unitStr = "kg"; | unitStr = "kg"; | ||||
| mUserInfoBean.setWeightKg(weightF); | |||||
| } else if (unit == EightBodyFatUtil.JIN) { | } else if (unit == EightBodyFatUtil.JIN) { | ||||
| unitStr = "斤"; | unitStr = "斤"; | ||||
| mUserInfoBean.setWeightKg(weightF / 2); | |||||
| } else if (unit == EightBodyFatUtil.ST) { | } else if (unit == EightBodyFatUtil.ST) { | ||||
| unitStr = "lb(未转换为st:lb)"; | unitStr = "lb(未转换为st:lb)"; | ||||
| } else if (unit == EightBodyFatUtil.LB) { | } else if (unit == EightBodyFatUtil.LB) { | ||||
| unitStr = "lb"; | unitStr = "lb"; | ||||
| } | } | ||||
| addLog("体重:" + statusStr + " " + weightValue + unitStr); | |||||
| if (et_weight != null) { | |||||
| et_weight.setText(String.valueOf(weightF)); | |||||
| } | |||||
| addLog("体重:" + statusStr + " " + weightF + unitStr); | |||||
| } | } | ||||
| @Override | @Override | ||||
| addLog("身高:" + statusStr + " " + height + unitStr); | addLog("身高:" + statusStr + " " + height + unitStr); | ||||
| } | } | ||||
| private EightBodyFatAdc mEightBodyFatAdc; | |||||
| @Override | @Override | ||||
| public void onImpedance(int status, EightBodyFatMcuDeviceData.EightBodyFatAdc eightBodyFatAdc, int arithmetic) { | public void onImpedance(int status, EightBodyFatMcuDeviceData.EightBodyFatAdc eightBodyFatAdc, int arithmetic) { | ||||
| String statusStr = ""; | String statusStr = ""; | ||||
| if (status == EightBodyFatUtil.IMPEDANCE_MEASUREMENT) { | if (status == EightBodyFatUtil.IMPEDANCE_MEASUREMENT) { | ||||
| statusStr = "测量中"; | statusStr = "测量中"; | ||||
| mEightBodyFatAdc = new EightBodyFatAdc(); | |||||
| mEightBodyFatAdc.setAlgorithms(0x20); | |||||
| } else if (status == EightBodyFatUtil.IMPEDANCE_FAILED) { | } else if (status == EightBodyFatUtil.IMPEDANCE_FAILED) { | ||||
| statusStr = "测量失败"; | statusStr = "测量失败"; | ||||
| } else if (status == EightBodyFatUtil.IMPEDANCE_SUCCESS_MCU) { | } else if (status == EightBodyFatUtil.IMPEDANCE_SUCCESS_MCU) { | ||||
| statusStr = "测量完成"; | statusStr = "测量完成"; | ||||
| } | } | ||||
| String partStr = ""; | String partStr = ""; | ||||
| int part = eightBodyFatAdc.getPart(); | int part = eightBodyFatAdc.getPart(); | ||||
| int adc = eightBodyFatAdc.getAdc(); | int adc = eightBodyFatAdc.getAdc(); | ||||
| if (part == 0x00) { | if (part == 0x00) { | ||||
| partStr = "双脚阻抗"; | partStr = "双脚阻抗"; | ||||
| mEightBodyFatAdc.setAdcFoot(adc); | |||||
| } else if (part == 0x01) { | } else if (part == 0x01) { | ||||
| partStr = "双手阻抗"; | partStr = "双手阻抗"; | ||||
| mEightBodyFatAdc.setAdcHand(adc); | |||||
| } else if (part == 0x02) { | } else if (part == 0x02) { | ||||
| partStr = "左手阻抗"; | partStr = "左手阻抗"; | ||||
| mEightBodyFatAdc.setAdcLeftHand(adc); | |||||
| } else if (part == 0x03) { | } else if (part == 0x03) { | ||||
| partStr = "右手阻抗"; | partStr = "右手阻抗"; | ||||
| mEightBodyFatAdc.setAdcRightHand(adc); | |||||
| } else if (part == 0x04) { | } else if (part == 0x04) { | ||||
| partStr = "左脚阻抗"; | partStr = "左脚阻抗"; | ||||
| mEightBodyFatAdc.setAdcLeftFoot(adc); | |||||
| } else if (part == 0x05) { | } else if (part == 0x05) { | ||||
| partStr = "右脚阻抗"; | partStr = "右脚阻抗"; | ||||
| mEightBodyFatAdc.setAdcRightFoot(adc); | |||||
| } else if (part == 0x06) { | } else if (part == 0x06) { | ||||
| partStr = "左全身阻抗"; | partStr = "左全身阻抗"; | ||||
| mEightBodyFatAdc.setAdcLeftBody(adc); | |||||
| } else if (part == 0x07) { | } else if (part == 0x07) { | ||||
| partStr = "右全身阻抗"; | partStr = "右全身阻抗"; | ||||
| mEightBodyFatAdc.setAdcRightBody(adc); | |||||
| } else if (part == 0x08) { | } else if (part == 0x08) { | ||||
| partStr = "右手左脚阻抗"; | partStr = "右手左脚阻抗"; | ||||
| mEightBodyFatAdc.setAdcRightHandLeftFoot(adc); | |||||
| } else if (part == 0x09) { | } else if (part == 0x09) { | ||||
| partStr = "左手右脚阻抗"; | partStr = "左手右脚阻抗"; | ||||
| mEightBodyFatAdc.setAdcLeftHandRightFoot(adc); | |||||
| } else if (part == 0x0A) { | } else if (part == 0x0A) { | ||||
| partStr = "躯干阻抗"; | partStr = "躯干阻抗"; | ||||
| mEightBodyFatAdc.setAdcBody(adc); | |||||
| } | } | ||||
| addLog("阻抗:" + statusStr + " " + partStr + " : " + adc); | addLog("阻抗:" + statusStr + " " + partStr + " : " + adc); | ||||
| @Override | @Override | ||||
| public void onSyncUserInfo() { | public void onSyncUserInfo() { | ||||
| addLog("请求同步用户信息:" + "默认传入用户:用户ID:1, 普通人:0, 性别:男,身高:180,年龄27"); | |||||
| addLog("请求同步用户信息:" + "默认传入用户:" + mUserInfoBean.toString()); | |||||
| if (mEightBodyFatDeviceData != null) { | if (mEightBodyFatDeviceData != null) { | ||||
| mEightBodyFatDeviceData.setUserInfo(1, 0, 1, 27, 180); | |||||
| mEightBodyFatDeviceData.setUserInfo(mUserInfoBean.getUserId(), mUserInfoBean.getUserType(), mUserInfoBean.getSex(), mUserInfoBean.getAge(), mUserInfoBean.getHeightCm()); | |||||
| } | } | ||||
| } | } | ||||
| @Override | @Override | ||||
| public void onCompletionData() { | public void onCompletionData() { | ||||
| addLog("请求补充体脂数据"); | addLog("请求补充体脂数据"); | ||||
| if (mEightBodyFatAdc != null) { | |||||
| mEightBodyFatAdc.setAlgorithms(0xFFFF); | |||||
| } | |||||
| } | } | ||||
| @Override | @Override | ||||
| @Override | @Override | ||||
| public void onTestSuccess(EightBodyFatMcuDeviceData.EightBodyFatInfo bodyFat) { | public void onTestSuccess(EightBodyFatMcuDeviceData.EightBodyFatInfo bodyFat) { | ||||
| //测量完成 | |||||
| addLog("体脂数据:" + bodyFat.toString()); | addLog("体脂数据:" + bodyFat.toString()); | ||||
| } | } | ||||
| } | } | ||||
| private String mOldLog = ""; | private String mOldLog = ""; | ||||
| private SimpleDateFormat sdf; | |||||
| /** | /** | ||||
| * 添加日志 | * 添加日志 | ||||
| * | * | ||||
| if (mOldLog.equalsIgnoreCase(log)) { | if (mOldLog.equalsIgnoreCase(log)) { | ||||
| return; | return; | ||||
| } | } | ||||
| if (sdf == null) { | |||||
| sdf = new SimpleDateFormat("HH:mm:ss", Locale.US); | |||||
| } | |||||
| mOldLog = log; | mOldLog = log; | ||||
| loglist.add(0, log); | |||||
| loglist.add(0,sdf.format(System.currentTimeMillis()) + ":\n" + log); | |||||
| if (listAdapter != null) { | if (listAdapter != null) { | ||||
| listAdapter.notifyDataSetChanged(); | listAdapter.notifyDataSetChanged(); | ||||
| } | } | ||||
| } | } | ||||
| } | } |
| import androidx.annotation.Nullable; | import androidx.annotation.Nullable; | ||||
| import com.holtek.libHTBodyfat.HTBodyBasicInfo; | |||||
| import com.pingwang.bluetoothlib.AILinkBleManager; | |||||
| import com.pingwang.bluetoothlib.bean.BleValueBean; | |||||
| import com.pingwang.bluetoothlib.bean.SupportUnitBean; | import com.pingwang.bluetoothlib.bean.SupportUnitBean; | ||||
| import com.pingwang.bluetoothlib.device.BleDevice; | import com.pingwang.bluetoothlib.device.BleDevice; | ||||
| import com.pingwang.bluetoothlib.listener.OnCallbackBle; | import com.pingwang.bluetoothlib.listener.OnCallbackBle; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.eight_bodyfat.dual_band.UserInfoBean; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.EightBodyFatAlgorithms; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.EightBodyFatBean; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.UnitUtils; | |||||
| import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatBleDeviceData; | import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatBleDeviceData; | ||||
| import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatMcuDeviceData; | |||||
| import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatUtil; | import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatUtil; | ||||
| import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightOneBodyFatAdcBean; | |||||
| import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightOneDataBodyFatBean; | |||||
| /** | /** | ||||
| * 八电极秤 (单频APP算法) | * 八电极秤 (单频APP算法) | ||||
| private RadioButton kg, jing, stlb, lb, C, F; | private RadioButton kg, jing, stlb, lb, C, F; | ||||
| private UserInfoBean mUserInfoBean; | private UserInfoBean mUserInfoBean; | ||||
| private EditText et_weight, et_height, et_age, et_sex; | private EditText et_weight, et_height, et_age, et_sex; | ||||
| private EightOneBodyFatAdcBean mEightOneBodyFatAdcBean; | |||||
| @Override | @Override | ||||
| protected void onCreate(@Nullable Bundle savedInstanceState) { | protected void onCreate(@Nullable Bundle savedInstanceState) { | ||||
| private void test() { | private void test() { | ||||
| weight = 60; | weight = 60; | ||||
| if (mEightBodyFatAdc == null) { | |||||
| mEightBodyFatAdc = new EightBodyFatAdc(); | |||||
| mEightBodyFatAdc.setAlgorithms(0x20); | |||||
| if (mEightOneBodyFatAdcBean == null) { | |||||
| mEightOneBodyFatAdcBean = new EightOneBodyFatAdcBean(); | |||||
| } | |||||
| mEightOneBodyFatAdcBean.setAlgorithmsId(0x20); | |||||
| mEightOneBodyFatAdcBean.setAdcFoot(5784349); | |||||
| mEightOneBodyFatAdcBean.setAdcHand(5121114); | |||||
| mEightOneBodyFatAdcBean.setAdcLeftHand(12854746); | |||||
| mEightOneBodyFatAdcBean.setAdcRightHand(15738341); | |||||
| mEightOneBodyFatAdcBean.setAdcLeftFoot(1074604); | |||||
| mEightOneBodyFatAdcBean.setAdcRightFoot(13046299); | |||||
| mEightOneBodyFatAdcBean.setAdcLeftBody(7480094); | |||||
| mEightOneBodyFatAdcBean.setAdcRightBody(7480094); | |||||
| if (mEightBodyFatBleDeviceData != null) { | |||||
| mEightBodyFatBleDeviceData.getOneEightBodyData(mUserInfoBean.getSex(), mUserInfoBean.getAge(), mUserInfoBean.getWeightKg(), | |||||
| mUserInfoBean.getHeightCm(), mEightOneBodyFatAdcBean); | |||||
| } | } | ||||
| mEightBodyFatAdc.setAdcFoot(5784349); | |||||
| mEightBodyFatAdc.setAdcHand(5121114); | |||||
| mEightBodyFatAdc.setAdcLeftHand(12854746); | |||||
| mEightBodyFatAdc.setAdcRightHand(15738341); | |||||
| mEightBodyFatAdc.setAdcLeftFoot(1074604); | |||||
| mEightBodyFatAdc.setAdcRightFoot(13046299); | |||||
| mEightBodyFatAdc.setAdcLeftBody(7480094); | |||||
| mEightBodyFatAdc.setAdcRightBody(7480094); | |||||
| kaimengJieMi(mEightBodyFatAdc, mUserInfoBean); | |||||
| } | } | ||||
| private void initListener() { | private void initListener() { | ||||
| findViewById(R.id.support_unit).setOnClickListener(this); | |||||
| findViewById(R.id.getSupportUnit).setOnClickListener(this); | |||||
| findViewById(R.id.btn_update).setOnClickListener(this); | findViewById(R.id.btn_update).setOnClickListener(this); | ||||
| findViewById(R.id.btnConnect).setOnClickListener(this); | |||||
| kg.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | kg.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | ||||
| @Override | @Override | ||||
| public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | ||||
| } | } | ||||
| @Override | |||||
| public void onServicesDiscovered(String mac) { | |||||
| onServiceSuccess(); | |||||
| } | |||||
| @Override | @Override | ||||
| public void unbindServices() { | public void unbindServices() { | ||||
| if (mAILinkBleManager != null) { | if (mAILinkBleManager != null) { | ||||
| @Override | @Override | ||||
| public void onClick(View v) { | public void onClick(View v) { | ||||
| if (v.getId() == R.id.support_unit) { | |||||
| if (v.getId() == R.id.getSupportUnit) { | |||||
| if (mEightBodyFatBleDeviceData != null) | if (mEightBodyFatBleDeviceData != null) | ||||
| mEightBodyFatBleDeviceData.getUnitList(); | mEightBodyFatBleDeviceData.getUnitList(); | ||||
| } else if (v.getId() == R.id.btn_update) { | } else if (v.getId() == R.id.btn_update) { | ||||
| initUserInfo(); | initUserInfo(); | ||||
| addLog("更新用户信息"); | addLog("更新用户信息"); | ||||
| } else if (v.getId() == R.id.btnConnect) { | |||||
| if (mEightBodyFatBleDeviceData != null) { | |||||
| BleValueBean bleValueBean = mEightBodyFatBleDeviceData.getBleValueBean(); | |||||
| if (bleValueBean != null) { | |||||
| AILinkBleManager.getInstance().connectDevice(bleValueBean); | |||||
| }else { | |||||
| AILinkBleManager.getInstance().connectDevice(mAddress); | |||||
| } | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| adc = "阻抗测量完成"; | adc = "阻抗测量完成"; | ||||
| break; | break; | ||||
| } | } | ||||
| switch (result) { | |||||
| case EightBodyFatUtil.IMPEDANCE_FOOT: | |||||
| adc = adc + "双脚阻抗"; | |||||
| break; | |||||
| case EightBodyFatUtil.IMPEDANCE_HAND: | |||||
| adc = adc + "双手阻抗"; | |||||
| break; | |||||
| case EightBodyFatUtil.IMPEDANCE_BODY: | |||||
| adc = adc + "躯干阻抗"; | |||||
| break; | |||||
| case EightBodyFatUtil.IMPEDANCE_L_HAND: | |||||
| adc = adc + "左手阻抗"; | |||||
| break; | |||||
| case EightBodyFatUtil.IMPEDANCE_R_HAND: | |||||
| adc = adc + "右手阻抗"; | |||||
| break; | |||||
| case EightBodyFatUtil.IMPEDANCE_L_FOOT: | |||||
| adc = adc + "左脚阻抗"; | |||||
| break; | |||||
| case EightBodyFatUtil.IMPEDANCE_R_FOOT: | |||||
| adc = adc + "右脚阻抗"; | |||||
| break; | |||||
| case EightBodyFatUtil.IMPEDANCE_L_BODY: | |||||
| adc = adc + "左驱干"; | |||||
| break; | |||||
| case EightBodyFatUtil.IMPEDANCE_R_BODY: | |||||
| adc = adc + "右躯干"; | |||||
| break; | |||||
| case EightBodyFatUtil.IMPEDANCE_R_HAND_L_FOOT: | |||||
| adc = adc + "右手左脚"; | |||||
| break; | |||||
| case EightBodyFatUtil.IMPEDANCE_L_HAND_R_FOOT: | |||||
| adc = adc + "左手右脚"; | |||||
| break; | |||||
| default: | |||||
| } | |||||
| addLog(adc); | addLog(adc); | ||||
| break; | break; | ||||
| case EightBodyFatUtil.HEART_RATE: | case EightBodyFatUtil.HEART_RATE: | ||||
| case EightBodyFatUtil.MEASUREMENT_END: | case EightBodyFatUtil.MEASUREMENT_END: | ||||
| addLog("测量完成"); | addLog("测量完成"); | ||||
| //测量完成 | //测量完成 | ||||
| if (mEightBodyFatAdc != null) { | |||||
| kaimengJieMi(mEightBodyFatAdc, mUserInfoBean); | |||||
| if (mEightBodyFatBleDeviceData != null && mEightOneBodyFatAdcBean != null) { | |||||
| mEightBodyFatBleDeviceData.getOneEightBodyData(mUserInfoBean.getSex(), mUserInfoBean.getAge(), mUserInfoBean.getWeightKg(), | |||||
| mUserInfoBean.getHeightCm(), mEightOneBodyFatAdcBean); | |||||
| } | } | ||||
| break; | break; | ||||
| stateStr = "实时体重"; | stateStr = "实时体重"; | ||||
| } else if (state == EightBodyFatUtil.WEIGHT_STABILIZATION_WEIGHT) { | } else if (state == EightBodyFatUtil.WEIGHT_STABILIZATION_WEIGHT) { | ||||
| stateStr = "稳定体重"; | stateStr = "稳定体重"; | ||||
| mUserInfoBean.setWeightKg(Float.parseFloat(UnitUtils.getWeightToKg(unit, String.valueOf(weight), decimal))); | |||||
| } | } | ||||
| this.weight = weight; | this.weight = weight; | ||||
| if (unit == EightBodyFatUtil.ST) { | if (unit == EightBodyFatUtil.ST) { | ||||
| if (et_weight != null) { | if (et_weight != null) { | ||||
| et_weight.setText(String.valueOf(weight)); | et_weight.setText(String.valueOf(weight)); | ||||
| } | } | ||||
| } | } | ||||
| @Override | @Override | ||||
| public void onImpedance(int adc, int part, int arithmetic) { | |||||
| addLog("阻抗:" + adc + " 部位: " + part + " 算法" + arithmetic); | |||||
| kaimeng(part, adc, arithmetic); | |||||
| public void onImpedance(EightOneBodyFatAdcBean adcBean) { | |||||
| mEightOneBodyFatAdcBean = adcBean; | |||||
| addLog("阻抗测量完成:阻抗信息:" + adcBean); | |||||
| } | } | ||||
| @Override | @Override | ||||
| } | } | ||||
| @Override | @Override | ||||
| public void showData(String data) { | |||||
| // loglist.add(0, data); | |||||
| public void onBodyFatData(@Nullable EightOneDataBodyFatBean bodyFatBean) { | |||||
| addLog("获取体脂数据成功:\n" + bodyFatBean.toString()); | |||||
| } | } | ||||
| private EightBodyFatAdc mEightBodyFatAdc; | |||||
| private void kaimeng(int part, int adc, int algorithms) { | |||||
| if (mEightBodyFatAdc == null) { | |||||
| mEightBodyFatAdc = new EightBodyFatAdc(); | |||||
| } | |||||
| mEightBodyFatAdc.setAlgorithms(algorithms); | |||||
| switch (part) { | |||||
| case EightBodyFatUtil.IMPEDANCE_FOOT: | |||||
| //双脚阻抗 | |||||
| mEightBodyFatAdc.setAdcFoot(adc); | |||||
| break; | |||||
| case EightBodyFatUtil.IMPEDANCE_HAND: | |||||
| //双手阻抗 | |||||
| mEightBodyFatAdc.setAdcHand(adc); | |||||
| break; | |||||
| case EightBodyFatUtil.IMPEDANCE_BODY: | |||||
| //躯干阻抗 | |||||
| mEightBodyFatAdc.setAdcBody(adc); | |||||
| break; | |||||
| case EightBodyFatUtil.IMPEDANCE_L_HAND: | |||||
| //"左手阻抗"; | |||||
| mEightBodyFatAdc.setAdcLeftHand(adc); | |||||
| break; | |||||
| case EightBodyFatUtil.IMPEDANCE_R_HAND: | |||||
| // adc = adc + "右手阻抗"; | |||||
| mEightBodyFatAdc.setAdcRightHand(adc); | |||||
| break; | |||||
| case EightBodyFatUtil.IMPEDANCE_L_FOOT: | |||||
| // adc = adc + "左脚阻抗"; | |||||
| mEightBodyFatAdc.setAdcLeftFoot(adc); | |||||
| break; | |||||
| case EightBodyFatUtil.IMPEDANCE_R_FOOT: | |||||
| // adc = adc + "右脚阻抗"; | |||||
| mEightBodyFatAdc.setAdcRightFoot(adc); | |||||
| break; | |||||
| case EightBodyFatUtil.IMPEDANCE_L_BODY: | |||||
| // adc = adc + "左驱干"; | |||||
| mEightBodyFatAdc.setAdcLeftBody(adc); | |||||
| break; | |||||
| case EightBodyFatUtil.IMPEDANCE_R_BODY: | |||||
| // adc = adc + "右躯干"; | |||||
| mEightBodyFatAdc.setAdcRightBody(adc); | |||||
| break; | |||||
| case EightBodyFatUtil.IMPEDANCE_R_HAND_L_FOOT: | |||||
| // adc = adc + "右手左脚"; | |||||
| mEightBodyFatAdc.setAdcRightHandLeftFoot(adc); | |||||
| break; | |||||
| case EightBodyFatUtil.IMPEDANCE_L_HAND_R_FOOT: | |||||
| // adc = adc + "左手右脚"; | |||||
| mEightBodyFatAdc.setAdcLeftHandRightFoot(adc); | |||||
| break; | |||||
| default: | |||||
| } | |||||
| @Override | |||||
| public void onBodyFatDataError(int type, String msg) { | |||||
| addLog("获取体脂数据失败:" + type + " " + msg); | |||||
| } | } | ||||
| private void kaimengJieMi(EightBodyFatAdc eightBodyFatAdc, UserInfoBean userInfoBean) { | |||||
| loglist.add(0, "默认传入用户: " + userInfoBean.toString()); | |||||
| EightBodyFatBean algorithmsData = EightBodyFatAlgorithms.getInstance() | |||||
| .getAlgorithmsData(eightBodyFatAdc.getAlgorithms(), userInfoBean.getSex(), | |||||
| userInfoBean.getHeightCm(), userInfoBean.getWeightKg(), | |||||
| userInfoBean.getAge(), eightBodyFatAdc); | |||||
| if (algorithmsData.getBhErrorType() != null) { | |||||
| String type = algorithmsData.getBhErrorType(); | |||||
| int typeInt = -1; | |||||
| try { | |||||
| typeInt = Integer.parseInt(algorithmsData.getBhErrorType()); | |||||
| } catch (NumberFormatException e) { | |||||
| typeInt = -1; | |||||
| e.printStackTrace(); | |||||
| } | |||||
| if (typeInt != -1) { | |||||
| //新算法 | |||||
| switch (typeInt) { | |||||
| case HTBodyBasicInfo.ErrorAge: | |||||
| loglist.add(0, "年龄不符合要求:6~99"); | |||||
| break; | |||||
| case HTBodyBasicInfo.ErrorHeight: | |||||
| loglist.add(0, "身高不符合要求:90~220"); | |||||
| break; | |||||
| case HTBodyBasicInfo.ErrorWeight: | |||||
| loglist.add(0, "体重不符合要求:10.0~200.0"); | |||||
| break; | |||||
| case HTBodyBasicInfo.ErrorImpedance: | |||||
| loglist.add(0, "阻抗不符合要求100~600"); | |||||
| break; | |||||
| case HTBodyBasicInfo.ErrorImpedanceLeftLeg: | |||||
| loglist.add(0, "左手左脚阻抗不符合要求:100~600"); | |||||
| break; | |||||
| case HTBodyBasicInfo.ErrorImpedanceRightLeg: | |||||
| loglist.add(0, "右手左脚阻抗不符合要求:100~600"); | |||||
| break; | |||||
| case HTBodyBasicInfo.ErrorImpedanceLeftArm: | |||||
| loglist.add(0, "左手阻抗不符合要求:100~600"); | |||||
| break; | |||||
| case HTBodyBasicInfo.ErrorImpedanceRightArm: | |||||
| loglist.add(0, "右手阻抗不符合要求:100~600"); | |||||
| break; | |||||
| case HTBodyBasicInfo.ErrorNone: | |||||
| //正常 | |||||
| loglist.add(0, "算法计算结果:" + algorithmsData.toString()); | |||||
| break; | |||||
| default: | |||||
| loglist.add(0, "其他错误:" + algorithmsData.getBhErrorType()); | |||||
| break; | |||||
| } | |||||
| } else { | |||||
| switch (type) { | |||||
| case "AGE": | |||||
| loglist.add(0, "年龄不符合要求:6~99"); | |||||
| break; | |||||
| case "HEIGHT": | |||||
| loglist.add(0, "身高不符合要求:90~220"); | |||||
| break; | |||||
| case "WEIGHT": | |||||
| loglist.add(0, "体重不符合要求:10.0~200.0"); | |||||
| break; | |||||
| case "IMPEDANCE_LEFT_BODY": | |||||
| loglist.add(0, "左侧全身阻抗不符合要求:200~1200"); | |||||
| break; | |||||
| case "IMPEDANCE_LEFT_ARM": | |||||
| loglist.add(0, "左手阻抗不符合要求:100~600"); | |||||
| break; | |||||
| case "IMPEDANCE_RIGHT_ARM": | |||||
| loglist.add(0, "右手阻抗不符合要求:100~600"); | |||||
| break; | |||||
| case "IMPEDANCE_LEFT_LEG": | |||||
| loglist.add(0, "左脚阻抗不符合要求:100~600"); | |||||
| break; | |||||
| case "IMPEDANCE_RIGHT_LEG": | |||||
| loglist.add(0, "右脚阻抗不符合要求:100~600"); | |||||
| break; | |||||
| case "NONE": | |||||
| //正常 | |||||
| loglist.add(0, "算法计算结果:" + algorithmsData.toString()); | |||||
| break; | |||||
| default: | |||||
| loglist.add(0, "其他错误:" + algorithmsData.getBhErrorType()); | |||||
| break; | |||||
| } | |||||
| } | |||||
| } else { | |||||
| loglist.add(0, "其他错误:" + algorithmsData.getBhErrorType()); | |||||
| } | |||||
| if (listAdapter != null) { | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } | |||||
| // EightBodyFatBean algorithmsData = | |||||
| // EightBodyFatAlgorithms.getInstance().getAlgorithmsData(2, 0, 165, weight, 27, mEightBodyFatAdc); | |||||
| L.i("算法结果" + algorithmsData.toString()); | |||||
| @Override | |||||
| public void showData(String data) { | |||||
| // loglist.add(0, data); | |||||
| } | } | ||||
| package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.eight_bodyfat; | |||||
| public class UserInfoBean { | |||||
| private int userId; | |||||
| private int age; | |||||
| private int heightCm; | |||||
| private float weightKg; | |||||
| private int userType; | |||||
| private int sex; | |||||
| public int getUserId() { | |||||
| return userId; | |||||
| } | |||||
| public void setUserId(int userId) { | |||||
| this.userId = userId; | |||||
| } | |||||
| public int getAge() { | |||||
| return age; | |||||
| } | |||||
| public void setAge(int age) { | |||||
| this.age = age; | |||||
| } | |||||
| public int getHeightCm() { | |||||
| return heightCm; | |||||
| } | |||||
| public void setHeightCm(int heightCm) { | |||||
| this.heightCm = heightCm; | |||||
| } | |||||
| public float getWeightKg() { | |||||
| return weightKg; | |||||
| } | |||||
| public void setWeightKg(float weightKg) { | |||||
| this.weightKg = weightKg; | |||||
| } | |||||
| public int getSex() { | |||||
| return sex; | |||||
| } | |||||
| public void setSex(int sex) { | |||||
| this.sex = sex; | |||||
| } | |||||
| public int getUserType() { | |||||
| return userType; | |||||
| } | |||||
| public void setUserType(int userType) { | |||||
| this.userType = userType; | |||||
| } | |||||
| @Override | |||||
| public String toString() { | |||||
| return "UserInfoBean{" + "年龄=" + age + "用户类型=" + userType + ", 身高=" + heightCm + ", 体重=" + weightKg + ", 性别=" + (sex == 1 ? "男" : "女") + '}'; | |||||
| } | |||||
| } |
| import com.pingwang.bluetoothlib.device.BleDevice; | import com.pingwang.bluetoothlib.device.BleDevice; | ||||
| import com.pingwang.bluetoothlib.listener.OnCallbackBle; | import com.pingwang.bluetoothlib.listener.OnCallbackBle; | ||||
| import java.text.SimpleDateFormat; | |||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||
| import java.util.List; | import java.util.List; | ||||
| import java.util.Locale; | |||||
| import java.util.Map; | import java.util.Map; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | ||||
| import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatUtil; | import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatUtil; | ||||
| import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.BaseEightDoubleBodyFatData; | import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.BaseEightDoubleBodyFatData; | ||||
| import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.EightDoubleBodyFatAdcBean; | import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.EightDoubleBodyFatAdcBean; | ||||
| import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.EightDoubleBodyFatBean; | |||||
| import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.EightDoubleBodyFatBleConfig; | import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.EightDoubleBodyFatBleConfig; | ||||
| import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.EightDoubleBodyFatBleDeviceData; | import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.EightDoubleBodyFatBleDeviceData; | ||||
| import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.EightDoubleBodyFatBleMcuDeviceData; | import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.EightDoubleBodyFatBleMcuDeviceData; | ||||
| import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.EightDoubleDataBodyFatBean; | |||||
| import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.EightDoubleMcuBodyFatBean; | |||||
| import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.OnEightDoubleBodyFatCallback; | import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.OnEightDoubleBodyFatCallback; | ||||
| /** | /** | ||||
| * 双频八电极秤(mcu算法) | |||||
| * 双频八电极秤(app/mcu算法) | |||||
| * | * | ||||
| * @author xing | * @author xing | ||||
| * @date 2024/03/14 | * @date 2024/03/14 | ||||
| initView(); | initView(); | ||||
| initListener(); | initListener(); | ||||
| initData(); | initData(); | ||||
| setTitleData("双频八电极秤:0x" + Integer.toHexString(mCid)); | |||||
| } | } | ||||
| private void initData() { | private void initData() { | ||||
| public void onClick(View v) { | public void onClick(View v) { | ||||
| List<EightDoubleBodyFatAdcBean> list = new ArrayList<>(); | List<EightDoubleBodyFatAdcBean> list = new ArrayList<>(); | ||||
| EightDoubleBodyFatAdcBean adcBean = new EightDoubleBodyFatAdcBean(); | EightDoubleBodyFatAdcBean adcBean = new EightDoubleBodyFatAdcBean(); | ||||
| adcBean.setAdcRightHand(2433844368L); | |||||
| adcBean.setAdcLeftHand(3781622117L); | |||||
| adcBean.setAdcBody(1349958013L); | |||||
| adcBean.setAdcRightFoot(1365295937L); | |||||
| adcBean.setAdcLeftFoot(1903359127L); | |||||
| adcBean.setAdcRightHand(0x70CE5D91L); | |||||
| adcBean.setAdcLeftHand(0x61A2D714L); | |||||
| adcBean.setAdcBody(0x3013EEE0L); | |||||
| adcBean.setAdcRightFoot(0x50A93C9FL); | |||||
| adcBean.setAdcLeftFoot(0x10071D0CL); | |||||
| adcBean.setFrequencyId(0x01); | adcBean.setFrequencyId(0x01); | ||||
| adcBean.setAlgorithmsId(0x01); | adcBean.setAlgorithmsId(0x01); | ||||
| list.add(adcBean); | list.add(adcBean); | ||||
| EightDoubleBodyFatAdcBean adcBean100 = new EightDoubleBodyFatAdcBean(); | EightDoubleBodyFatAdcBean adcBean100 = new EightDoubleBodyFatAdcBean(); | ||||
| adcBean100.setAdcRightHand(2447381468L); | |||||
| adcBean100.setAdcLeftHand(1909750593L); | |||||
| adcBean100.setAdcBody(2954962439L); | |||||
| adcBean100.setAdcRightFoot(4036701847L); | |||||
| adcBean100.setAdcLeftFoot(2421978775L); | |||||
| adcBean100.setAdcRightHand(0x509A9A5FL); | |||||
| adcBean100.setAdcLeftHand(0x7037B559L); | |||||
| adcBean100.setAdcBody(0x3022CEC6L); | |||||
| adcBean100.setAdcRightFoot(0x60AA8F98L); | |||||
| adcBean100.setAdcLeftFoot(0x40F72698L); | |||||
| adcBean100.setFrequencyId(0x02); | adcBean100.setFrequencyId(0x02); | ||||
| adcBean100.setAlgorithmsId(0x01); | adcBean100.setAlgorithmsId(0x01); | ||||
| list.add(adcBean100); | list.add(adcBean100); | ||||
| mCid = EightDoubleBodyFatBleConfig.CID_APP; | |||||
| onTestCompleted(list); | onTestCompleted(list); | ||||
| } | } | ||||
| }); | }); | ||||
| String sex = et_sex.getText().toString().trim(); | String sex = et_sex.getText().toString().trim(); | ||||
| if (mUserInfoBean == null) { | if (mUserInfoBean == null) { | ||||
| mUserInfoBean = new UserInfoBean(); | mUserInfoBean = new UserInfoBean(); | ||||
| mUserInfoBean.setUserId(1); | |||||
| mUserInfoBean.setUserType(0); | |||||
| } | } | ||||
| mUserInfoBean.setAge(Integer.parseInt(age)); | mUserInfoBean.setAge(Integer.parseInt(age)); | ||||
| mUserInfoBean.setSex(Integer.parseInt(sex)); | mUserInfoBean.setSex(Integer.parseInt(sex)); | ||||
| private void initListener() { | private void initListener() { | ||||
| findViewById(R.id.support_unit).setOnClickListener(this); | |||||
| findViewById(R.id.getSupportUnit).setOnClickListener(this); | |||||
| findViewById(R.id.btn_update).setOnClickListener(this); | |||||
| findViewById(R.id.btn_clear_log).setOnClickListener(this); | findViewById(R.id.btn_clear_log).setOnClickListener(this); | ||||
| kg.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | kg.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | ||||
| @Override | @Override | ||||
| @Override | @Override | ||||
| public void onClick(View v) { | public void onClick(View v) { | ||||
| if (v.getId() == R.id.support_unit) { | |||||
| if (v.getId() == R.id.getSupportUnit) { | |||||
| if (mEightDoubleBodyFatData != null) { | if (mEightDoubleBodyFatData != null) { | ||||
| mEightDoubleBodyFatData.getUnitList(); | mEightDoubleBodyFatData.getUnitList(); | ||||
| } | } | ||||
| } else if (v.getId() == R.id.btn_clear_log) { | } else if (v.getId() == R.id.btn_clear_log) { | ||||
| mLoglist.clear(); | mLoglist.clear(); | ||||
| mHandler.sendEmptyMessage(REFRESH_KEY); | mHandler.sendEmptyMessage(REFRESH_KEY); | ||||
| } else if (v.getId() == R.id.btn_update) { | |||||
| initUserInfo(); | |||||
| showData("更新用户信息"); | |||||
| } | } | ||||
| } | } | ||||
| @Override | @Override | ||||
| public void onTestCompleted(List<EightDoubleBodyFatAdcBean> adcBeanList) { | public void onTestCompleted(List<EightDoubleBodyFatAdcBean> adcBeanList) { | ||||
| initUserInfo(); | initUserInfo(); | ||||
| mLoglist.add(0, "测试完成:" + adcBeanList.size()); | |||||
| mLoglist.add(0, "测试完成"); | |||||
| for (EightDoubleBodyFatAdcBean adcBean : adcBeanList) { | for (EightDoubleBodyFatAdcBean adcBean : adcBeanList) { | ||||
| String data = ""; | String data = ""; | ||||
| data += (adcBean.getFrequencyId() == 0x01) ? "频率:20kHz" : "频率:100kHz"; | data += (adcBean.getFrequencyId() == 0x01) ? "频率:20kHz" : "频率:100kHz"; | ||||
| mLoglist.add(0, data); | mLoglist.add(0, data); | ||||
| } | } | ||||
| mLoglist.add(0, "用户信息:" + mUserInfoBean.toString()); | mLoglist.add(0, "用户信息:" + mUserInfoBean.toString()); | ||||
| mHandler.sendEmptyMessage(REFRESH_KEY); | |||||
| getBodyFatData(adcBeanList); | getBodyFatData(adcBeanList); | ||||
| mHandler.sendEmptyMessage(REFRESH_KEY); | |||||
| } | } | ||||
| // private HetaiHttpUtils mHetaiHttpUtils; | |||||
| private void getBodyFatData(List<EightDoubleBodyFatAdcBean> adcBeanList) { | private void getBodyFatData(List<EightDoubleBodyFatAdcBean> adcBeanList) { | ||||
| if (mCid != EightDoubleBodyFatBleConfig.CID_APP) { | |||||
| if (mCid != EightDoubleBodyFatBleConfig.CID_APP || adcBeanList == null || adcBeanList.isEmpty()) { | |||||
| return; | return; | ||||
| } | } | ||||
| // ParamsHetaiBean paramsHetaiBean = new ParamsHetaiBean(); | |||||
| // paramsHetaiBean.setAge(String.valueOf(mUserInfoBean.getAge())); | |||||
| // paramsHetaiBean.setSex(String.valueOf(mUserInfoBean.getSex())); | |||||
| // paramsHetaiBean.setHeightCm(String.valueOf(mUserInfoBean.getHeightCm())); | |||||
| // paramsHetaiBean.setWeightKg(String.valueOf(mUserInfoBean.getWeightKg())); | |||||
| // for (EightDoubleBodyFatAdcBean adcBean : adcBeanList) { | |||||
| // if (adcBean.getFrequencyId() == 0x01) { | |||||
| // //20khz | |||||
| // paramsHetaiBean.setZ20KhzLeftArmEnCode(String.valueOf(adcBean.getAdcLeftHand())); | |||||
| // paramsHetaiBean.setZ20KhzRightArmEnCode(String.valueOf(adcBean.getAdcRightHand())); | |||||
| // paramsHetaiBean.setZ20KhzLeftLegEnCode(String.valueOf(adcBean.getAdcLeftFoot())); | |||||
| // paramsHetaiBean.setZ20KhzRightLegEnCode(String.valueOf(adcBean.getAdcRightFoot())); | |||||
| // paramsHetaiBean.setZ20KhzTrunkEnCode(String.valueOf(adcBean.getAdcBody())); | |||||
| // | |||||
| // } else if (adcBean.getFrequencyId() == 0x02) { | |||||
| // //100khz | |||||
| // paramsHetaiBean.setZ100KhzLeftArmEnCode(String.valueOf(adcBean.getAdcLeftHand())); | |||||
| // paramsHetaiBean.setZ100KhzRightArmEnCode(String.valueOf(adcBean.getAdcRightHand())); | |||||
| // paramsHetaiBean.setZ100KhzLeftLegEnCode(String.valueOf(adcBean.getAdcLeftFoot())); | |||||
| // paramsHetaiBean.setZ100KhzRightLegEnCode(String.valueOf(adcBean.getAdcRightFoot())); | |||||
| // paramsHetaiBean.setZ100KhzTrunkEnCode(String.valueOf(adcBean.getAdcBody())); | |||||
| // } | |||||
| // } | |||||
| // //获取数据 | |||||
| // if (mHetaiHttpUtils == null) { | |||||
| // mHetaiHttpUtils = new HetaiHttpUtils(); | |||||
| // } | |||||
| // mHetaiHttpUtils.postGetBody270(paramsHetaiBean, new OnHttpListener<HttpHetaiListBean>() { | |||||
| // @Override | |||||
| // public void onSuccess(HttpHetaiListBean data) { | |||||
| // List<HttpHetaiBean> httpHetaiBeans = data.getData(); | |||||
| // if (httpHetaiBeans != null) { | |||||
| // mLoglist.add(0, "获取数据成功:" + httpHetaiBeans.size()); | |||||
| // for (HttpHetaiBean httpHetaiBean : httpHetaiBeans) { | |||||
| // String show = mMap.get(httpHetaiBean.getName()) + ":" + httpHetaiBean.getValue() + " " + | |||||
| // (httpHetaiBean.getUnit() == null ? "" : httpHetaiBean.getUnit()) + | |||||
| // (httpHetaiBean.getLevel() == null ? "" : "\n" + httpHetaiBean.getLevel().toString()); | |||||
| // mLoglist.add(0, show); | |||||
| // L.i(httpHetaiBean.toString()); | |||||
| // } | |||||
| // mHandler.sendEmptyMessage(REFRESH_KEY); | |||||
| // } else { | |||||
| // showData("体脂数据为空:" + data.toString()); | |||||
| // } | |||||
| // | |||||
| // } | |||||
| // | |||||
| // @Override | |||||
| // public void onFailed(HttpHetaiListBean data) { | |||||
| // showData("获取数据失败"); | |||||
| // } | |||||
| // }); | |||||
| mEightDoubleBodyFatData.getDualEightBodyData(mUserInfoBean.getSex(), mUserInfoBean.getAge(), mUserInfoBean.getWeightKg(), | |||||
| mUserInfoBean.getHeightCm(), adcBeanList); | |||||
| } | } | ||||
| @Override | @Override | ||||
| stateStr = "实时体重"; | stateStr = "实时体重"; | ||||
| } else if (state == EightDoubleBodyFatBleConfig.STATUS_WEIGHT_STABILIZATION_WEIGHT) { | } else if (state == EightDoubleBodyFatBleConfig.STATUS_WEIGHT_STABILIZATION_WEIGHT) { | ||||
| stateStr = "稳定体重"; | stateStr = "稳定体重"; | ||||
| mUserInfoBean.setWeightKg(Float.parseFloat(UnitUtils.getWeightToKg(unit, String.valueOf(weightF), decimal))); | |||||
| mWeightKg = String.valueOf(weightF); | mWeightKg = String.valueOf(weightF); | ||||
| if (et_weight != null) { | if (et_weight != null) { | ||||
| et_weight.setText(mWeightKg); | et_weight.setText(mWeightKg); | ||||
| } | } | ||||
| @Override | @Override | ||||
| public void onBodyFat(EightDoubleBodyFatBean bodyFatBean) { | |||||
| public void onBodyFatMcu(EightDoubleMcuBodyFatBean bodyFatBean) { | |||||
| if (bodyFatBean == null) { | if (bodyFatBean == null) { | ||||
| showData("体脂数据为空"); | showData("体脂数据为空"); | ||||
| return; | return; | ||||
| } | } | ||||
| showData("体脂数据:" + bodyFatBean); | |||||
| showData("体脂数据(MCU):" + bodyFatBean); | |||||
| } | } | ||||
| @Override | @Override | ||||
| showData("设备请求同步用户信息"); | showData("设备请求同步用户信息"); | ||||
| } | } | ||||
| private String mOldData = ""; | |||||
| @Override | |||||
| public void onBodyFatDataError(int type, String msg) { | |||||
| L.i("体脂数据计算错误:type=" + type + " msg=" + msg); | |||||
| showData("体脂数据计算错误:type=" + type + " msg=" + msg); | |||||
| } | |||||
| @Override | @Override | ||||
| public void showData(String data) { | |||||
| if (mOldData.equals(data)) { | |||||
| public void onBodyFatData(@Nullable EightDoubleDataBodyFatBean bodyFatBean) { | |||||
| if (bodyFatBean != null) { | |||||
| L.i("体脂数据计算成功:" + bodyFatBean.toString()); | |||||
| showData("体脂数据(服务器):\n" + bodyFatBean); | |||||
| } | |||||
| } | |||||
| private String mOldLog = ""; | |||||
| private SimpleDateFormat sdf; | |||||
| /** | |||||
| * 添加日志 | |||||
| * | |||||
| * @param log 日志 | |||||
| */ | |||||
| @Override | |||||
| public void showData(String log) { | |||||
| if (mOldLog.equalsIgnoreCase(log)) { | |||||
| return; | return; | ||||
| } | } | ||||
| mOldData = data; | |||||
| mLoglist.add(0, data); | |||||
| if (sdf == null) { | |||||
| sdf = new SimpleDateFormat("HH:mm:ss", Locale.US); | |||||
| } | |||||
| mOldLog = log; | |||||
| mLoglist.add(0, sdf.format(System.currentTimeMillis()) + ":\n" + log); | |||||
| mHandler.sendEmptyMessage(REFRESH_KEY); | mHandler.sendEmptyMessage(REFRESH_KEY); | ||||
| } | } | ||||
| @Override | @Override | ||||
| protected void onDestroy() { | protected void onDestroy() { | ||||
| super.onDestroy(); | super.onDestroy(); | ||||
| if (mAILinkBleManager!=null) { | |||||
| if (mAILinkBleManager != null) { | |||||
| mAILinkBleManager.disconnectAll(); | mAILinkBleManager.disconnectAll(); | ||||
| } | } | ||||
| } | } |
| import android.widget.EditText; | import android.widget.EditText; | ||||
| import android.widget.ListView; | import android.widget.ListView; | ||||
| import androidx.appcompat.app.ActionBar; | |||||
| import com.pingwang.bluetoothlib.AILinkBleManager; | import com.pingwang.bluetoothlib.AILinkBleManager; | ||||
| import com.pingwang.bluetoothlib.device.BleDevice; | import com.pingwang.bluetoothlib.device.BleDevice; | ||||
| import com.pingwang.bluetoothlib.listener.OnCallbackBle; | import com.pingwang.bluetoothlib.listener.OnCallbackBle; | ||||
| @Override | @Override | ||||
| protected void initListener() { | protected void initListener() { | ||||
| ActionBar supportActionBar = getSupportActionBar(); | |||||
| if (supportActionBar != null) { | |||||
| supportActionBar.setTitle("气体检测仪"); | |||||
| } | |||||
| } | } | ||||
| @Override | @Override | ||||
| public void onClick(View v) { | public void onClick(View v) { | ||||
| switch (v.getId()) { | |||||
| case R.id.btnGetCurInfo: | |||||
| //实时信息 | |||||
| mGasDetectorDevice.getCurrentInfo(); | |||||
| addText("获取实时信息"); | |||||
| break; | |||||
| case R.id.btnSyncTime: | |||||
| //同步时间 | |||||
| mGasDetectorDevice.setSyncTime(); | |||||
| addText("同步时间"); | |||||
| break; | |||||
| case R.id.btnGetCO2Density: | |||||
| //CO2报警浓度 | |||||
| mGasDetectorDevice.getCo2Alarm(); | |||||
| addText("获取CO2报警浓度"); | |||||
| break; | |||||
| case R.id.btnGetCODensity: | |||||
| //CO报警浓度 | |||||
| mGasDetectorDevice.getCoAlarm(); | |||||
| addText("获取CO报警浓度"); | |||||
| break; | |||||
| case R.id.btnGetO2Density: | |||||
| //O2报警浓度 | |||||
| mGasDetectorDevice.getO2Alarm(); | |||||
| addText("获取O2报警浓度"); | |||||
| break; | |||||
| case R.id.btnGetCO2Interval: | |||||
| //CO2间隔 | |||||
| mGasDetectorDevice.getCo2Interval(); | |||||
| addText("获取CO2间隔"); | |||||
| break; | |||||
| case R.id.btnGetCOInterval: | |||||
| //CO间隔 | |||||
| mGasDetectorDevice.getCoInterval(); | |||||
| addText("获取CO间隔"); | |||||
| break; | |||||
| case R.id.btnGetHistoryInterval: | |||||
| //历史记录间隔 | |||||
| mGasDetectorDevice.getOfflineHistoryInterval(); | |||||
| addText("获取历史记录间隔"); | |||||
| break; | |||||
| case R.id.btnGetCO2Switch: | |||||
| //CO2开关 | |||||
| mGasDetectorDevice.getCo2Switch(); | |||||
| addText("获取CO2开关"); | |||||
| break; | |||||
| case R.id.btnGetCOSwitch: | |||||
| //CO开关 | |||||
| mGasDetectorDevice.getCoSwitch(); | |||||
| addText("获取CO开关"); | |||||
| break; | |||||
| case R.id.btnGetSoundSwitch: | |||||
| //声音开关 | |||||
| mGasDetectorDevice.getSoundSwitch(); | |||||
| addText("获取声音开关"); | |||||
| break; | |||||
| case R.id.btnGetShakeSwitch: | |||||
| //震动开关 | |||||
| mGasDetectorDevice.getShockSwitch(); | |||||
| addText("获取震动开关"); | |||||
| break; | |||||
| case R.id.btnGetTempUnit: | |||||
| //温度单位 | |||||
| mGasDetectorDevice.getTempUnit(); | |||||
| addText("获取温度单位"); | |||||
| break; | |||||
| case R.id.btnGetPressureUnit: | |||||
| //气压单位 | |||||
| mGasDetectorDevice.getAirPressureUnit(); | |||||
| addText("获取气压单位"); | |||||
| break; | |||||
| case R.id.btnGetScreenOffTime: | |||||
| //息屏时间 | |||||
| mGasDetectorDevice.getScreenOffTime(); | |||||
| addText("获取息屏时间"); | |||||
| break; | |||||
| case R.id.btnGetShutdownTime: | |||||
| //关机时间 | |||||
| mGasDetectorDevice.getShutdownTime(); | |||||
| addText("获取关机时间"); | |||||
| break; | |||||
| case R.id.btnGetHistory: | |||||
| //历史记录 | |||||
| mGasDetectorDevice.getOfflineHistory(0); | |||||
| addText("获取历史记录"); | |||||
| break; | |||||
| case R.id.btnClearHistory: | |||||
| //清空历史记录 | |||||
| mGasDetectorDevice.setClearOfflineHistory(); | |||||
| addText("清空历史记录"); | |||||
| break; | |||||
| case R.id.btnSetCo2Density: | |||||
| //设置Co2浓度 | |||||
| try { | |||||
| int densityCo2 = Integer.parseInt(etDensity.getText().toString()); | |||||
| mGasDetectorDevice.setCo2Alarm(densityCo2); | |||||
| addText("设置CO2报警浓度:" + densityCo2); | |||||
| } catch (NumberFormatException e) { | |||||
| addText("请输入正确的数字"); | |||||
| } | |||||
| break; | |||||
| case R.id.btnSetO2Density: | |||||
| //设置O2浓度 | |||||
| try { | |||||
| int densityO2 = Integer.parseInt(etDensity.getText().toString()); | |||||
| mGasDetectorDevice.setO2Alarm(densityO2); | |||||
| addText("设置O2报警浓度:" + densityO2); | |||||
| } catch (NumberFormatException e) { | |||||
| addText("请输入正确的数字"); | |||||
| } | |||||
| break; | |||||
| case R.id.btnSetCo2Interval: | |||||
| //设置CO2间隔 | |||||
| try { | |||||
| int intervalCo2 = Integer.parseInt(etInterval.getText().toString()); | |||||
| mGasDetectorDevice.setCo2Interval(intervalCo2); | |||||
| addText("设置CO2间隔:" + intervalCo2); | |||||
| } catch (NumberFormatException e) { | |||||
| addText("请输入正确的数字"); | |||||
| } | |||||
| break; | |||||
| case R.id.btnSetCoInterval: | |||||
| //设置CO间隔 | |||||
| try { | |||||
| int intervalCo = Integer.parseInt(etInterval.getText().toString()); | |||||
| mGasDetectorDevice.setCoInterval(intervalCo); | |||||
| addText("设置CO间隔:" + intervalCo); | |||||
| } catch (NumberFormatException e) { | |||||
| addText("请输入正确的数字"); | |||||
| } | |||||
| break; | |||||
| case R.id.btnSetPressureCali: | |||||
| //气压校准 | |||||
| try { | |||||
| int hpa = Integer.parseInt(etHpa.getText().toString()); | |||||
| int inHg = Integer.parseInt(etInHg.getText().toString()); | |||||
| mGasDetectorDevice.setAirPressureCalibration(hpa, inHg); | |||||
| addText("设置气压校准:hpa=" + hpa + " inHg=" + inHg); | |||||
| } catch (NumberFormatException e) { | |||||
| addText("请输入正确的数字"); | |||||
| } | |||||
| break; | |||||
| int id = v.getId(); | |||||
| if (id == R.id.btnClearLog) {//清除日志 | |||||
| mList.clear(); | |||||
| addText("清除日志"); | |||||
| } else if (id == R.id.btnPauseLog) {//暂停日志 | |||||
| isPause = !isPause; | |||||
| addText("暂停日志:" + isPause); | |||||
| } else if (id == R.id.btnGetCurInfo) {//实时信息 | |||||
| mGasDetectorDevice.getCurrentInfo(); | |||||
| addText("获取实时信息"); | |||||
| } else if (id == R.id.btnSyncTime) {//同步时间 | |||||
| mGasDetectorDevice.setSyncTime(); | |||||
| addText("同步时间"); | |||||
| } else if (id == R.id.btnGetCO2Density) {//CO2报警浓度 | |||||
| mGasDetectorDevice.getCo2Alarm(); | |||||
| addText("获取CO2报警浓度"); | |||||
| } else if (id == R.id.btnGetCODensity) {//CO报警浓度 | |||||
| mGasDetectorDevice.getCoAlarm(); | |||||
| addText("获取CO报警浓度"); | |||||
| } else if (id == R.id.btnGetO2Density) {//O2报警浓度 | |||||
| mGasDetectorDevice.getO2Alarm(); | |||||
| addText("获取O2报警浓度"); | |||||
| } else if (id == R.id.btnGetCO2Interval) {//CO2间隔 | |||||
| mGasDetectorDevice.getCo2Interval(); | |||||
| addText("获取CO2间隔"); | |||||
| } else if (id == R.id.btnGetCOInterval) {//CO间隔 | |||||
| mGasDetectorDevice.getCoInterval(); | |||||
| addText("获取CO间隔"); | |||||
| } else if (id == R.id.btnGetHistoryInterval) {//历史记录间隔 | |||||
| mGasDetectorDevice.getOfflineHistoryInterval(); | |||||
| addText("获取历史记录间隔"); | |||||
| } else if (id == R.id.btnGetCO2Switch) {//CO2开关 | |||||
| mGasDetectorDevice.getCo2Switch(); | |||||
| addText("获取CO2开关"); | |||||
| } else if (id == R.id.btnGetCOSwitch) {//CO开关 | |||||
| mGasDetectorDevice.getCoSwitch(); | |||||
| addText("获取CO开关"); | |||||
| } else if (id == R.id.btnGetSoundSwitch) {//声音开关 | |||||
| mGasDetectorDevice.getSoundSwitch(); | |||||
| addText("获取声音开关"); | |||||
| } else if (id == R.id.btnGetShakeSwitch) {//震动开关 | |||||
| mGasDetectorDevice.getShockSwitch(); | |||||
| addText("获取震动开关"); | |||||
| } else if (id == R.id.btnGetTempUnit) {//温度单位 | |||||
| mGasDetectorDevice.getTempUnit(); | |||||
| addText("获取温度单位"); | |||||
| } else if (id == R.id.btnGetPressureUnit) {//气压单位 | |||||
| mGasDetectorDevice.getAirPressureUnit(); | |||||
| addText("获取气压单位"); | |||||
| } else if (id == R.id.btnGetScreenOffTime) {//息屏时间 | |||||
| mGasDetectorDevice.getScreenOffTime(); | |||||
| addText("获取息屏时间"); | |||||
| } else if (id == R.id.btnGetShutdownTime) {//关机时间 | |||||
| mGasDetectorDevice.getShutdownTime(); | |||||
| addText("获取关机时间"); | |||||
| } else if (id == R.id.btnGetHistory) {//历史记录 | |||||
| mGasDetectorDevice.getOfflineHistory(0); | |||||
| addText("获取历史记录"); | |||||
| } else if (id == R.id.btnClearHistory) {//清空历史记录 | |||||
| mGasDetectorDevice.setClearOfflineHistory(); | |||||
| addText("清空历史记录"); | |||||
| } else if (id == R.id.btnSetCo2Density) {//设置Co2浓度 | |||||
| try { | |||||
| int densityCo2 = Integer.parseInt(etDensity.getText().toString()); | |||||
| mGasDetectorDevice.setCo2Alarm(densityCo2); | |||||
| addText("设置CO2报警浓度:" + densityCo2); | |||||
| } catch (NumberFormatException e) { | |||||
| addText("请输入正确的数字"); | |||||
| } | |||||
| } else if (id == R.id.btnSetO2Density) {//设置O2浓度 | |||||
| try { | |||||
| int densityO2 = Integer.parseInt(etDensity.getText().toString()); | |||||
| mGasDetectorDevice.setO2Alarm(densityO2); | |||||
| addText("设置O2报警浓度:" + densityO2); | |||||
| } catch (NumberFormatException e) { | |||||
| addText("请输入正确的数字"); | |||||
| } | |||||
| } else if (id == R.id.btnSetCo2Interval) {//设置CO2间隔 | |||||
| try { | |||||
| int intervalCo2 = Integer.parseInt(etInterval.getText().toString()); | |||||
| mGasDetectorDevice.setCo2Interval(intervalCo2); | |||||
| addText("设置CO2间隔:" + intervalCo2); | |||||
| } catch (NumberFormatException e) { | |||||
| addText("请输入正确的数字"); | |||||
| } | |||||
| } else if (id == R.id.btnSetCoInterval) {//设置CO间隔 | |||||
| try { | |||||
| int intervalCo = Integer.parseInt(etInterval.getText().toString()); | |||||
| mGasDetectorDevice.setCoInterval(intervalCo); | |||||
| addText("设置CO间隔:" + intervalCo); | |||||
| } catch (NumberFormatException e) { | |||||
| addText("请输入正确的数字"); | |||||
| } | |||||
| } else if (id == R.id.btnSetPressureCali) {//气压校准 | |||||
| try { | |||||
| int hpa = Integer.parseInt(etHpa.getText().toString()); | |||||
| int inHg = Integer.parseInt(etInHg.getText().toString()); | |||||
| mGasDetectorDevice.setAirPressureCalibration(hpa, inHg); | |||||
| addText("设置气压校准:hpa=" + hpa + " inHg=" + inHg); | |||||
| } catch (NumberFormatException e) { | |||||
| addText("请输入正确的数字"); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| private SimpleDateFormat sdf; | private SimpleDateFormat sdf; | ||||
| private String mOldText = ""; | private String mOldText = ""; | ||||
| private boolean isPause = false; | |||||
| private void addText(String text) { | private void addText(String text) { | ||||
| if (isPause && !mList.isEmpty()) { | |||||
| return; | |||||
| } | |||||
| if (mOldText.equals(text)) { | if (mOldText.equals(text)) { | ||||
| return; | return; | ||||
| } | } |
| package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.gasDetectorPlus; | |||||
| import android.os.Message; | |||||
| import android.text.TextUtils; | |||||
| import android.view.View; | |||||
| import android.widget.ArrayAdapter; | |||||
| import android.widget.EditText; | |||||
| import android.widget.ListView; | |||||
| import androidx.appcompat.app.ActionBar; | |||||
| import com.pingwang.bluetoothlib.AILinkBleManager; | |||||
| import com.pingwang.bluetoothlib.device.BleDevice; | |||||
| import com.pingwang.bluetoothlib.listener.OnCallbackBle; | |||||
| import java.text.SimpleDateFormat; | |||||
| import java.util.ArrayList; | |||||
| import java.util.Arrays; | |||||
| import java.util.List; | |||||
| import java.util.Locale; | |||||
| import java.util.Map; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleAppNewBaseActivity; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.UnitUtils; | |||||
| import cn.net.aicare.modulelibrary.module.gasDetectorPlus.GasDetectorPlusBleDevice; | |||||
| import cn.net.aicare.modulelibrary.module.gasDetectorPlus.OnGasDetectorPlusInfoListener; | |||||
| import cn.net.aicare.modulelibrary.module.gasDetectorPlus.bean.GasAlarmInfoBean; | |||||
| import cn.net.aicare.modulelibrary.module.gasDetectorPlus.bean.GasDetectorPlusCurrentInfoBean; | |||||
| /** | |||||
| * 气体检测仪界面(华普) | |||||
| * | |||||
| * @author xing | |||||
| * @date 2024/09/05 | |||||
| */ | |||||
| public class GasDetectorPlusActivity extends BleAppNewBaseActivity implements View.OnClickListener, OnCallbackBle, OnGasDetectorPlusInfoListener { | |||||
| private String mMac = ""; | |||||
| private EditText et1, et2; | |||||
| private GasDetectorPlusBleDevice mGasDetectorPlusBleDevice; | |||||
| private ListView list_view; | |||||
| private List<String> mList; | |||||
| private ArrayAdapter mListAdapter; | |||||
| private List<String> mGasList = new ArrayList<>(Arrays.asList( | |||||
| "O2", "CO2", "TVOC(PID)", "TVOC", "CO", "H2S", "NO", "NO2", "SO2", "H2", "O3", "NH3", "HCN", "HCI", "H2O2", "CH2O", | |||||
| "C2H4", "Cl2", "ClO2", "C2H4O", "PH3", "HF", "F2", "C4H8S", "ASH3", "SIH4", "CH3SH", "CH4O", "C2H6O", "C4H", "C3H8O", "COF2", | |||||
| "BF3", "CH4", "C3H6O", "C2H2", "C6H6", "C6H14", "C3H8", "温度", "湿度" | |||||
| )); | |||||
| @Override | |||||
| protected void uiHandlerMessage(Message msg) { | |||||
| } | |||||
| @Override | |||||
| protected int getLayoutId() { | |||||
| return R.layout.activity_gas_detector_plus; | |||||
| } | |||||
| @Override | |||||
| protected void initListener() { | |||||
| ActionBar supportActionBar = getSupportActionBar(); | |||||
| if (supportActionBar != null) { | |||||
| supportActionBar.setTitle("气体检测仪(BLE+WIFI)"); | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public void onClick(View v) { | |||||
| int id = v.getId(); | |||||
| if (id == R.id.btnClearLog) {//清除日志 | |||||
| mList.clear(); | |||||
| addText("清除日志"); | |||||
| } else if (id == R.id.btnPauseLog) {//暂停日志 | |||||
| isPause = !isPause; | |||||
| addText("暂停日志:" + isPause); | |||||
| } else if (id == R.id.btnGetSupportGas) {//支持的气体类型(0x01) | |||||
| mGasDetectorPlusBleDevice.getSupportedGas(); | |||||
| addText("获取支持的气体类型(0x01)"); | |||||
| } else if (id == R.id.btnGetSupportFun) {//获取支持的功能列表 | |||||
| mGasDetectorPlusBleDevice.getSupportedFun(); | |||||
| addText("获取支持的功能列表(0x02)"); | |||||
| } else if (id == R.id.btnGetAlarmSwitch) {//警报推送开关(0x03) | |||||
| mGasDetectorPlusBleDevice.getAlarmSwitch(); | |||||
| addText("获取警报推送开关(0x03)"); | |||||
| } else if (id == R.id.btnSetAlarmSwitch) {//警报推送开关(0x03) | |||||
| alarmSwitch = alarmSwitch == 1 ? 0 : 1; | |||||
| mGasDetectorPlusBleDevice.setAlarmSwitch(alarmSwitch); | |||||
| addText("设置警报推送开关(0x03):" + alarmSwitch); | |||||
| } else if (id == R.id.btnGetAlarmTime) {//报警时长设置(0x04) | |||||
| mGasDetectorPlusBleDevice.getAlarmTime(); | |||||
| addText("获取报警时长设置(0x04)"); | |||||
| } else if (id == R.id.btnGetAlarmFrequency) {//报警频率(0x0A) | |||||
| mGasDetectorPlusBleDevice.getAlarmFrequency(); | |||||
| addText("获取报警频率(0x0A)"); | |||||
| } else if (id == R.id.btnGetGasInfo) {//气体信息(0x09) | |||||
| mGasDetectorPlusBleDevice.getGasInfo(); | |||||
| addText("获取气体信息(0x09)"); | |||||
| } else if (id == R.id.btnSaveFrequency) {//离线数据存储频率(0x07) | |||||
| int frequency = 0; | |||||
| try { | |||||
| frequency = Integer.parseInt(et1.getText().toString().trim()); | |||||
| } catch (NumberFormatException e) { | |||||
| e.printStackTrace(); | |||||
| } | |||||
| mGasDetectorPlusBleDevice.setHistorySaveFrequency(frequency); | |||||
| addText("设置离线数据存储频率(0x07):" + frequency); | |||||
| } else if (id == R.id.btnReportInterval) {//数据上报间隔(0x08) | |||||
| int interval = 0; | |||||
| try { | |||||
| interval = Integer.parseInt(et1.getText().toString().trim()); | |||||
| } catch (NumberFormatException e) { | |||||
| e.printStackTrace(); | |||||
| } | |||||
| mGasDetectorPlusBleDevice.setDataReportInterval(interval); | |||||
| addText("设置数据上报间隔(0x08):" + interval); | |||||
| } else if (id == R.id.btnGetAlarmRing) { | |||||
| int ring = 0; | |||||
| try { | |||||
| ring = Integer.parseInt(et2.getText().toString().trim()); | |||||
| } catch (NumberFormatException e) { | |||||
| e.printStackTrace(); | |||||
| } | |||||
| mGasDetectorPlusBleDevice.setAlarmRing(ring); | |||||
| addText("报警铃声设置(0x05):" + ring); | |||||
| } else if (id == R.id.btnAlarmRingTest) { | |||||
| int ringTest = 0; | |||||
| try { | |||||
| ringTest = Integer.parseInt(et2.getText().toString().trim()); | |||||
| } catch (NumberFormatException e) { | |||||
| e.printStackTrace(); | |||||
| } | |||||
| mGasDetectorPlusBleDevice.setAlarmRingTest(ringTest); | |||||
| addText("报警铃声试听(0x06):" + ringTest); | |||||
| } else if (id == R.id.btnGetPowerInfo) {//请求获取设备电量信息(0x0C) | |||||
| mGasDetectorPlusBleDevice.getPowerInfo(); | |||||
| addText("请求获取设备电量信息(0x0C)"); | |||||
| } else if (id == R.id.btnSetTime) { | |||||
| long second = System.currentTimeMillis() / 1000; | |||||
| mGasDetectorPlusBleDevice.setSyncTime(second); | |||||
| addText("下发同步时间(0x0E):\n" + second + "秒"); | |||||
| } | |||||
| } | |||||
| @Override | |||||
| protected void initData() { | |||||
| mMac = getIntent().getStringExtra("mac"); | |||||
| mList = new ArrayList<>(); | |||||
| mListAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | |||||
| list_view.setAdapter(mListAdapter); | |||||
| addText("连接成功:" + mMac); | |||||
| onServiceSuccess(); | |||||
| } | |||||
| @Override | |||||
| protected void initView() { | |||||
| et1 = (EditText) findViewById(R.id.et1); | |||||
| et2 = (EditText) findViewById(R.id.et2); | |||||
| list_view = findViewById(R.id.list_view); | |||||
| } | |||||
| @Override | |||||
| public void onServiceSuccess() { | |||||
| if (TextUtils.isEmpty(mMac)) { | |||||
| return; | |||||
| } | |||||
| if (mGasDetectorPlusBleDevice != null) { | |||||
| return; | |||||
| } | |||||
| AILinkBleManager.getInstance().setOnCallbackBle(this); | |||||
| BleDevice bleDevice = AILinkBleManager.getInstance().getBleDevice(mMac); | |||||
| mGasDetectorPlusBleDevice = GasDetectorPlusBleDevice.init(bleDevice); | |||||
| mGasDetectorPlusBleDevice.addOnGasDetectorInfoListener(this); | |||||
| mGasDetectorPlusBleDevice.setOnShowData(new GasDetectorPlusBleDevice.OnShowData() { | |||||
| @Override | |||||
| public void showData(String data) { | |||||
| addText("收到的vlaue数据:" + data); | |||||
| } | |||||
| }); | |||||
| } | |||||
| @Override | |||||
| public void onServiceErr() { | |||||
| } | |||||
| @Override | |||||
| public void unbindServices() { | |||||
| } | |||||
| @Override | |||||
| public void onDisConnected(String mac, int code) { | |||||
| if (mac.equals(this.mMac)) { | |||||
| if (mGasDetectorPlusBleDevice != null) { | |||||
| mGasDetectorPlusBleDevice.removeOnGasDetectorInfoListener(this); | |||||
| mGasDetectorPlusBleDevice = null; | |||||
| } | |||||
| addText("断开连接:" + mac + " code:" + code); | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public void onSupportedGas(Map<Integer, Boolean> map) { | |||||
| StringBuilder showData = new StringBuilder(); | |||||
| for (Integer key : map.keySet()) { | |||||
| if (map.get(key)) { | |||||
| if (key >= mGasList.size()) { | |||||
| break; | |||||
| } | |||||
| String name = mGasList.get(key); | |||||
| showData.append(name).append("\n"); | |||||
| } | |||||
| } | |||||
| addText("支持的气体类型(0x01):\n" + showData); | |||||
| } | |||||
| @Override | |||||
| public void onSupportedFun(Map<Integer, Boolean> map) { | |||||
| StringBuilder data = new StringBuilder(); | |||||
| for (Integer key : map.keySet()) { | |||||
| String str = map.get(key) ? "支持" : "不支持"; | |||||
| switch (key) { | |||||
| case 0: | |||||
| data.append("报警推送:").append(str).append("\n"); | |||||
| break; | |||||
| case 1: | |||||
| data.append("报警时长:").append(str).append("\n"); | |||||
| break; | |||||
| case 2: | |||||
| data.append("报警铃声:").append(str).append("\n"); | |||||
| break; | |||||
| case 3: | |||||
| data.append("报警推送频率:").append(str).append("\n"); | |||||
| break; | |||||
| } | |||||
| } | |||||
| addText("支持的功能列表(0x02):" + data); | |||||
| } | |||||
| int alarmSwitch = 0; | |||||
| @Override | |||||
| public void onAlarmSwitch(int switchStatus) { | |||||
| alarmSwitch = switchStatus; | |||||
| addText("警报推送开关(0x03):" + (switchStatus == 1 ? "打开" : "关闭")); | |||||
| } | |||||
| @Override | |||||
| public void onAlarmTime(int current, int[] supportTimes) { | |||||
| String min; | |||||
| switch (current) { | |||||
| case 0: | |||||
| min = "一直报警"; | |||||
| break; | |||||
| case 1: | |||||
| min = "15S报警"; | |||||
| break; | |||||
| case 2: | |||||
| min = "30S报警"; | |||||
| break; | |||||
| case 3: | |||||
| min = "45S报警"; | |||||
| break; | |||||
| case 4: | |||||
| min = "1分钟报警"; | |||||
| break; | |||||
| case 5: | |||||
| min = "2分钟报警"; | |||||
| break; | |||||
| case 6: | |||||
| min = "3分钟报警"; | |||||
| break; | |||||
| default: | |||||
| min = "未知"; | |||||
| break; | |||||
| } | |||||
| addText("报警时长设置(0x04):选中" + current + "项," + min + "分钟" + " 支持的时长选项:" + Arrays.toString(supportTimes)); | |||||
| } | |||||
| @Override | |||||
| public void onAlarmRing(int current, int[] supportedRing) { | |||||
| String str; | |||||
| switch (current) { | |||||
| case 1: | |||||
| str = "铃声1"; | |||||
| break; | |||||
| case 2: | |||||
| str = "铃声2"; | |||||
| break; | |||||
| case 3: | |||||
| str = "铃声3"; | |||||
| break; | |||||
| case 4: | |||||
| str = "铃声4"; | |||||
| break; | |||||
| case 5: | |||||
| str = "铃声5"; | |||||
| break; | |||||
| case 6: | |||||
| str = "铃声6"; | |||||
| break; | |||||
| default: | |||||
| str = "未知"; | |||||
| break; | |||||
| } | |||||
| addText("报警铃声设置(0x05):选中" + current + "项," + str + " 支持的时长:" + Arrays.toString(supportedRing)); | |||||
| } | |||||
| @Override | |||||
| public void onAlarmRingTest(int position) { | |||||
| addText("报警铃声试听(0x06):选中" + position + "项"); | |||||
| } | |||||
| @Override | |||||
| public void onHistorySaveFrequency(int frequency) { | |||||
| addText("离线数据存储频率(0x07):频率" + frequency + "分钟"); | |||||
| } | |||||
| @Override | |||||
| public void onDataReportInterval(int interval) { | |||||
| addText("数据上报间隔(0x08):间隔" + interval + "分钟"); | |||||
| } | |||||
| @Override | |||||
| public void onAlarmFrequency(int frequency) { | |||||
| addText("报警频率(0x0A):频率" + frequency + "秒"); | |||||
| } | |||||
| @Override | |||||
| public void onAlarmGasInfo(List<GasAlarmInfoBean> list) { | |||||
| StringBuilder showData = new StringBuilder(); | |||||
| for (GasAlarmInfoBean gasAlarmInfoBean : list) { | |||||
| showData.append(mGasList.get(gasAlarmInfoBean.getType())).append(" ").append(gasAlarmInfoBean.getStatus() == 1 ? "报警" : "正常").append("\n"); | |||||
| } | |||||
| addText("报警的气体信息(0x0B):\n" + showData); | |||||
| } | |||||
| @Override | |||||
| public void onPowerInfo(int status, int power) { | |||||
| addText("设备电量信息(0x0C):\n" + power + "%"); | |||||
| } | |||||
| @Override | |||||
| public void onUnitInfo(int type, int unit) { | |||||
| String unitStr = "ppm"; | |||||
| switch (unit) { | |||||
| case 0: | |||||
| unitStr = "ppm"; | |||||
| break; | |||||
| case 1: | |||||
| unitStr = "%"; | |||||
| break; | |||||
| case 2: | |||||
| unitStr = "mg/m³"; | |||||
| break; | |||||
| case 3: | |||||
| unitStr = "℃"; | |||||
| break; | |||||
| case 4: | |||||
| unitStr = "℉"; | |||||
| break; | |||||
| } | |||||
| addText("单位设置(0x0D):\n类型:" + mGasList.get(type) + " 单位:" + unitStr); | |||||
| } | |||||
| @Override | |||||
| public void onSyncTime() { | |||||
| long second = System.currentTimeMillis() / 1000; | |||||
| mGasDetectorPlusBleDevice.setSyncTime(second); | |||||
| addText("同步时间(0x0E):\n" + second + "秒"); | |||||
| } | |||||
| @Override | |||||
| public void onGasInfo(GasDetectorPlusCurrentInfoBean bean) { | |||||
| SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US); | |||||
| String time = simpleDateFormat.format(bean.getTimeSeconds() * 1000); | |||||
| StringBuilder showData = new StringBuilder(time + ":\n"); | |||||
| for (GasDetectorPlusCurrentInfoBean.GasInfo gasInfo : bean.getGasInfoList()) { | |||||
| String unitStr = "ppm"; | |||||
| switch (gasInfo.getUnit()) { | |||||
| case 0: | |||||
| unitStr = "ppm"; | |||||
| break; | |||||
| case 1: | |||||
| unitStr = "%"; | |||||
| break; | |||||
| case 2: | |||||
| unitStr = "mg/m³"; | |||||
| break; | |||||
| case 3: | |||||
| unitStr = "℃"; | |||||
| break; | |||||
| case 4: | |||||
| unitStr = "℉"; | |||||
| break; | |||||
| } | |||||
| String valueStr = UnitUtils.getHoldDecimal(gasInfo.getDecimal(), gasInfo.getValue()); | |||||
| showData.append(mGasList.get(gasInfo.getType())).append(" ").append(valueStr).append(unitStr).append("\n"); | |||||
| } | |||||
| addText("气体信息(0x09):\n" + showData); | |||||
| } | |||||
| private SimpleDateFormat sdf; | |||||
| private String mOldText = ""; | |||||
| private boolean isPause = false; | |||||
| private void addText(String text) { | |||||
| if (isPause && !mList.isEmpty()) { | |||||
| return; | |||||
| } | |||||
| if (mOldText.equals(text)) { | |||||
| return; | |||||
| } | |||||
| if (sdf == null) { | |||||
| sdf = new SimpleDateFormat("HH:mm:ss", Locale.US); | |||||
| } | |||||
| mList.add(0, sdf.format(System.currentTimeMillis()) + ":\n" + text); | |||||
| mListAdapter.notifyDataSetChanged(); | |||||
| } | |||||
| @Override | |||||
| protected void onDestroy() { | |||||
| super.onDestroy(); | |||||
| AILinkBleManager.getInstance().removeOnCallbackBle(this); | |||||
| if (mGasDetectorPlusBleDevice != null) { | |||||
| mGasDetectorPlusBleDevice.clear(); | |||||
| } | |||||
| } | |||||
| } |
| package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.hmiBodyFat; | |||||
| import android.content.pm.ActivityInfo; | |||||
| import android.os.Bundle; | |||||
| import android.os.Handler; | |||||
| import android.os.Message; | |||||
| import android.view.View; | |||||
| import android.widget.ArrayAdapter; | |||||
| import android.widget.EditText; | |||||
| import android.widget.ListView; | |||||
| import android.widget.RadioButton; | |||||
| import androidx.annotation.Nullable; | |||||
| import com.pingwang.bluetoothlib.bean.BleValueBean; | |||||
| import com.pingwang.bluetoothlib.config.CmdConfig; | |||||
| import com.pingwang.bluetoothlib.device.BleDevice; | |||||
| import com.pingwang.bluetoothlib.listener.OnCallbackBle; | |||||
| import java.lang.ref.WeakReference; | |||||
| import java.util.ArrayList; | |||||
| import java.util.List; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.AddUserDialog; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.bean.UserBean; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.HmiAppHistoryRecordBean; | |||||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.HmiBodyFatBleUtilsData; | |||||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.HmiBodyFatDataUtil; | |||||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.HmiBodyFatRecordBean; | |||||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.HmiBodyFatUserBean; | |||||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.HmiMcuHistoryRecordBean; | |||||
| /** | |||||
| * HMI蓝牙体脂秤 | |||||
| */ | |||||
| public class HmiBodyFatScaleBleActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, HmiBodyFatBleUtilsData.BleBodyFatCallback { | |||||
| private String TAG = HmiBodyFatScaleBleActivity.class.getName(); | |||||
| private String mAddress; | |||||
| private List<String> mlogList; | |||||
| private List<String> mUserlogList; | |||||
| private ArrayAdapter listAdapter; | |||||
| private ArrayAdapter userAdapter; | |||||
| private HmiBodyFatBleUtilsData bodyFatBleUtilsData; | |||||
| private MHandler mMHandler; | |||||
| private EditText mEditText; | |||||
| private RadioButton kg, jing, stlb, lb; | |||||
| private List<HmiBodyFatUserBean> mUsers; | |||||
| private HmiBodyFatUserBean selectUser; | |||||
| private int weighunit = HmiBodyFatDataUtil.KG; | |||||
| private ListView loglistView; | |||||
| private ListView userlistView; | |||||
| @Override | |||||
| protected void onCreate(@Nullable Bundle savedInstanceState) { | |||||
| super.onCreate(savedInstanceState); | |||||
| setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//禁止横屏 | |||||
| setContentView(R.layout.activity_hmi_body_fat_scale_ble); | |||||
| initView(); | |||||
| setUnitInit(); | |||||
| initdata(); | |||||
| } | |||||
| private void initView() { | |||||
| findViewById(R.id.history).setOnClickListener(this); | |||||
| findViewById(R.id.userlist).setOnClickListener(this); | |||||
| findViewById(R.id.btnUser).setOnClickListener(this); | |||||
| findViewById(R.id.adduser).setOnClickListener(this); | |||||
| findViewById(R.id.syntime).setOnClickListener(this); | |||||
| kg = findViewById(R.id.kg); | |||||
| jing = findViewById(R.id.jin); | |||||
| stlb = findViewById(R.id.st_lb); | |||||
| lb = findViewById(R.id.lb); | |||||
| mEditText = findViewById(R.id.edit_Userid); | |||||
| kg.setChecked(true); | |||||
| loglistView = findViewById(R.id.log_list); | |||||
| userlistView = findViewById(R.id.user_list); | |||||
| } | |||||
| private void initdata() { | |||||
| mAddress = getIntent().getStringExtra("mac"); | |||||
| WeakReference weakReference = new WeakReference(new MHandler()); | |||||
| mMHandler = (MHandler) weakReference.get(); | |||||
| mlogList = new ArrayList<>(); | |||||
| listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mlogList); | |||||
| loglistView.setAdapter(listAdapter); | |||||
| HmiBodyFatUserBean defaultUser = getdefault(); | |||||
| selectUser = defaultUser; | |||||
| mUsers = new ArrayList<>(); | |||||
| mUsers.add(defaultUser); | |||||
| mUserlogList = new ArrayList<>(); | |||||
| mUserlogList.add(defaultUser.toString()); | |||||
| userAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mUserlogList); | |||||
| userlistView.setAdapter(userAdapter); | |||||
| } | |||||
| private HmiBodyFatUserBean getdefault() { | |||||
| HmiBodyFatUserBean user = new HmiBodyFatUserBean(); | |||||
| user.setModeType(HmiBodyFatDataUtil.MODE_ORDINARY); | |||||
| user.setSex(HmiBodyFatDataUtil.SEX_MAN); | |||||
| user.setAge(18); | |||||
| user.setHeight(170); | |||||
| user.setAdc(560); | |||||
| user.setWeight(50); | |||||
| user.setId(1); | |||||
| return user; | |||||
| } | |||||
| private void setUnitInit() { | |||||
| kg.setOnCheckedChangeListener((buttonView, isChecked) -> { | |||||
| if (isChecked) { | |||||
| weighunit = HmiBodyFatDataUtil.KG; | |||||
| if (bodyFatBleUtilsData != null) { | |||||
| bodyFatBleUtilsData.setWeightUnit(weighunit); | |||||
| } | |||||
| } | |||||
| }); | |||||
| jing.setOnCheckedChangeListener((buttonView, isChecked) -> { | |||||
| if (isChecked) { | |||||
| weighunit = HmiBodyFatDataUtil.JIN; | |||||
| if (bodyFatBleUtilsData != null) { | |||||
| bodyFatBleUtilsData.setWeightUnit(weighunit); | |||||
| } | |||||
| } | |||||
| }); | |||||
| stlb.setOnCheckedChangeListener((buttonView, isChecked) -> { | |||||
| if (isChecked) { | |||||
| weighunit = HmiBodyFatDataUtil.ST; | |||||
| if (bodyFatBleUtilsData != null) { | |||||
| bodyFatBleUtilsData.setWeightUnit(weighunit); | |||||
| } | |||||
| } | |||||
| }); | |||||
| lb.setOnCheckedChangeListener((buttonView, isChecked) -> { | |||||
| if (isChecked) { | |||||
| weighunit = HmiBodyFatDataUtil.LB; | |||||
| if (bodyFatBleUtilsData != null) { | |||||
| bodyFatBleUtilsData.setWeightUnit(weighunit); | |||||
| } | |||||
| } | |||||
| }); | |||||
| } | |||||
| @Override | |||||
| public void onServiceSuccess() { | |||||
| mlogList.add(0, "服务与界面建立连接成功"); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| // BleLog.i(TAG, "服务与界面建立连接成功"); | |||||
| //与服务建立连接 | |||||
| if (mAILinkBleManager != null) { | |||||
| mAILinkBleManager.setOnCallbackBle(this); | |||||
| BleDevice bleDevice = mAILinkBleManager.getBleDevice(mAddress); | |||||
| if (bleDevice != null) { | |||||
| HmiBodyFatBleUtilsData.init(bleDevice, this); | |||||
| bodyFatBleUtilsData = HmiBodyFatBleUtilsData.getInstance(); | |||||
| if (bodyFatBleUtilsData != null) { | |||||
| bodyFatBleUtilsData.setWeightUnit(weighunit); | |||||
| bodyFatBleUtilsData.synSysTime(); | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public void onServiceErr() { | |||||
| mlogList.add(0, "服务与界面建立连接出错"); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void unbindServices() { | |||||
| mlogList.add(0, "服务与界面建立断开连接成功"); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| if (mAILinkBleManager != null) { | |||||
| mAILinkBleManager.removeOnCallbackBle(this); | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public void onStartScan() { | |||||
| mlogList.add(0, "开始扫描"); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void onScanning(BleValueBean data) { | |||||
| mlogList.add(0, "扫描中"); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void onScanTimeOut() { | |||||
| mlogList.add(0, "扫描超时"); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void onConnecting(String mac) { | |||||
| mlogList.add(0, "正在连接" + mac); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void onDisConnected(String mac, int code) { | |||||
| mlogList.add(0, "断开连接" + mac); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void onServicesDiscovered(String mac) { | |||||
| mlogList.add(0, "发现蓝牙服务" + mac); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void bleOpen() { | |||||
| mlogList.add(0, "蓝牙打开"); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void bleClose() { | |||||
| mlogList.add(0, "蓝牙关闭"); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| private String mOldData = ""; | |||||
| @Override | |||||
| public void onWeightData(int status, float weight, int weightUnit, int decimals) { | |||||
| String data = "体重数据类型:" + (status == HmiBodyFatDataUtil.WEIGHT_TESTING ? "实时" : "稳定") + "\n体重: " + weight + " 单位:" + weightUnit + " 小数点位: " + decimals; | |||||
| if (mOldData.equals(data)) { | |||||
| return; | |||||
| } | |||||
| if (status == HmiBodyFatDataUtil.WEIGHT_RESULT) { | |||||
| //稳定体重 | |||||
| selectUser.setWeight(weight); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_USER); | |||||
| } | |||||
| mOldData = data; | |||||
| mlogList.add(0, data); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| private int mOldStatus = -1; | |||||
| @Override | |||||
| public void onStatus(int status) { | |||||
| if (mOldStatus == status) { | |||||
| return; | |||||
| } | |||||
| mOldStatus = status; | |||||
| switch (status) { | |||||
| case HmiBodyFatDataUtil.WEIGHT_TESTING: | |||||
| mlogList.add(0, "测量状态:" + status + " 测量实时体重"); | |||||
| break; | |||||
| case HmiBodyFatDataUtil.WEIGHT_RESULT: | |||||
| mlogList.add(0, "测量状态:" + status + " 稳定体重"); | |||||
| break; | |||||
| case HmiBodyFatDataUtil.IMPEDANCE_TESTING: | |||||
| mlogList.add(0, "测量状态:" + status + " 阻抗测量中"); | |||||
| break; | |||||
| case HmiBodyFatDataUtil.IMPEDANCE_SUCCESS: | |||||
| case HmiBodyFatDataUtil.IMPEDANCE_SUCCESS_DATA: | |||||
| mlogList.add(0, "测量状态:" + status + " 阻抗测量成功"); | |||||
| break; | |||||
| case HmiBodyFatDataUtil.IMPEDANCE_FAIL: | |||||
| mlogList.add(0, "测量状态:" + status + " 阻抗测量失败"); | |||||
| break; | |||||
| case HmiBodyFatDataUtil.HEART_TESTING: | |||||
| mlogList.add(0, "测量状态:" + status + " 心率测量中"); | |||||
| break; | |||||
| case HmiBodyFatDataUtil.HEART_SUCCESS: | |||||
| mlogList.add(0, "测量状态:" + status + " 心率测量成功"); | |||||
| break; | |||||
| case HmiBodyFatDataUtil.HEART_FAIL: | |||||
| mlogList.add(0, "测量状态:" + status + " 心率测量失败"); | |||||
| break; | |||||
| case HmiBodyFatDataUtil.TEST_FINISH: | |||||
| mlogList.add(0, "测量状态:" + status + " 测量完成"); | |||||
| if (bodyFatBleUtilsData != null) { | |||||
| bodyFatBleUtilsData.updateUserInfo(selectUser); | |||||
| } | |||||
| break; | |||||
| case HmiBodyFatDataUtil.MUC_REQUEST_USER_INFO: | |||||
| mlogList.add(0, "测量状态:" + status + "请求用户信息"); | |||||
| if (bodyFatBleUtilsData != null) { | |||||
| bodyFatBleUtilsData.setUserInfo(selectUser); | |||||
| } | |||||
| break; | |||||
| default: | |||||
| mlogList.add(0, "测量状态:" + status); | |||||
| } | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void onAdc(int adc, int algorithmic) { | |||||
| mlogList.add(0, "阻抗:" + adc + " 算法位:" + algorithmic); | |||||
| selectUser.setAdc(adc); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_USER); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void onHeartRate(int heartrate) { | |||||
| mlogList.add(0, "心率:" + heartrate); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void onBodyFat(HmiBodyFatRecordBean bodyFatRecord) { | |||||
| mlogList.add(0, "体脂数:" + bodyFatRecord.toString()); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void onError(int code) { | |||||
| mlogList.add(0, "错误码:" + code); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void onHistoryMcu(HmiMcuHistoryRecordBean mcuHistoryRecordBean) { | |||||
| mlogList.add(0, "历史记录Mcu:" + mcuHistoryRecordBean.toString()); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void onHistoryApp(HmiAppHistoryRecordBean appHistoryRecordBean) { | |||||
| mlogList.add(0, "历史记录app:" + appHistoryRecordBean.toString()); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void onVersion(String version) { | |||||
| mlogList.add(0, "版本号:" + version); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void onMcuBatteryStatus(int status, int battery) { | |||||
| mlogList.add(0, "电量状态" + status + " 电量:" + battery); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void onSysTime(int status, int[] times) { | |||||
| mlogList.add(0, "时间状态" + status); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void requestSynTime() { | |||||
| mlogList.add(0, "同步时间"); | |||||
| if (bodyFatBleUtilsData != null) | |||||
| bodyFatBleUtilsData.synMcuTime(); | |||||
| } | |||||
| @Override | |||||
| public void setTimeCallback(int type, int status) { | |||||
| String msg = ""; | |||||
| if (type == CmdConfig.SET_SYS_TIME) { | |||||
| msg = "设置系统当前时间:"; | |||||
| } else if (type == CmdConfig.SET_DEVICE_TIME) { | |||||
| msg = "同步时间"; | |||||
| } | |||||
| if (status == HmiBodyFatDataUtil.STATUS_SUCCESS) { | |||||
| msg = msg + status + " 成功"; | |||||
| } else if (status == HmiBodyFatDataUtil.STATUS_FAIL) { | |||||
| msg = msg + status + " 失败"; | |||||
| } else if (status == HmiBodyFatDataUtil.STATUS_NOT_SUPPORT) { | |||||
| msg = msg + status + " 不支持"; | |||||
| } | |||||
| mlogList.add(0, msg); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void requestSynHistoryCallback(int status) { | |||||
| if (status == 0) { | |||||
| mlogList.add(0, "请求历史记录:" + status + " 无历史记录"); | |||||
| } else if (status == 1) { | |||||
| mlogList.add(0, "请求历史记录:" + status + " 开始发送历史记录"); | |||||
| } else { | |||||
| mlogList.add(0, "请求历史记录:" + status + " 发送历史记录结束"); | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public void updateUserCallback(int status) { | |||||
| if (status == 0) { | |||||
| mlogList.add(0, "更新用户或列表回调" + status + " 更新列表成功"); | |||||
| } else if (status == 1) { | |||||
| mlogList.add(0, "更新用户或列表回调" + status + " 更新个人用户成功"); | |||||
| } else if (status == 2) { | |||||
| mlogList.add(0, "更新用户或列表回调" + status + " 更新列表失败"); | |||||
| } else { | |||||
| mlogList.add(0, "更新用户或列表回调" + status + " 更新个人用户失败"); | |||||
| } | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| /** | |||||
| * @param status {@link#Bod} | |||||
| */ | |||||
| @Override | |||||
| public void setUnitCallback(int status) { | |||||
| if (status == 0) { | |||||
| mlogList.add(0, "下发单位回调" + status + " 成功"); | |||||
| } else if (status == 1) { | |||||
| mlogList.add(0, "下发单位回调" + status + " 失败"); | |||||
| } else { | |||||
| mlogList.add(0, "下发单位回调" + status + " 不支持"); | |||||
| } | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void requestUserData(int status) { | |||||
| if (status == 0x01) { | |||||
| mlogList.add(0, "下发用户信息 " + status); | |||||
| } else if (status == 0x03) { | |||||
| mlogList.add(0, "下发用户信息成功 " + status); | |||||
| } else { | |||||
| mlogList.add(0, "下发用户信息失败 " + status); | |||||
| } | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void onOtaCallback(int status) { | |||||
| } | |||||
| @Override | |||||
| public void onIpData(String ip) { | |||||
| } | |||||
| @Override | |||||
| public void onPortData(int port) { | |||||
| } | |||||
| @Override | |||||
| public void onUrlData(String url) { | |||||
| } | |||||
| @Override | |||||
| public void onClick(View v) { | |||||
| int id = v.getId(); | |||||
| if (id == R.id.history) { | |||||
| if (bodyFatBleUtilsData != null) | |||||
| bodyFatBleUtilsData.requestSynHistory(); | |||||
| } else if (id == R.id.btnUser) { | |||||
| if (!mEditText.getText().toString().trim().isEmpty()) { | |||||
| int userid = Integer.parseInt(mEditText.getText().toString().trim()); | |||||
| if (mUsers.size() >= userid) { | |||||
| selectUser = mUsers.get(userid - 1); | |||||
| if (bodyFatBleUtilsData != null) { | |||||
| bodyFatBleUtilsData.updateUserInfo(selectUser); | |||||
| } | |||||
| } | |||||
| } else { | |||||
| addLog("请输入正确的用户ID"); | |||||
| } | |||||
| } else if (id == R.id.userlist) { | |||||
| bodyFatBleUtilsData.setUserInfoList(mUsers); | |||||
| if (bodyFatBleUtilsData != null) | |||||
| bodyFatBleUtilsData.updateUsersComplete(); | |||||
| } else if (id == R.id.adduser) { | |||||
| AddUserDialog addUserDialog = new AddUserDialog(new AddUserDialog.OnDialogListener() { | |||||
| @Override | |||||
| public void tvSucceedListener(UserBean user) { | |||||
| user.setId(mUsers.size() + 1); | |||||
| mUsers.add(getHmiBodyFatUserBean(user)); | |||||
| mUserlogList.add(user.toString()); | |||||
| userAdapter.notifyDataSetChanged(); | |||||
| } | |||||
| }); | |||||
| addUserDialog.show(getSupportFragmentManager()); | |||||
| } else if (id == R.id.syntime) { | |||||
| if (bodyFatBleUtilsData != null) { | |||||
| bodyFatBleUtilsData.synSysTime(); | |||||
| } | |||||
| } | |||||
| } | |||||
| private HmiBodyFatUserBean getHmiBodyFatUserBean(UserBean userBean) { | |||||
| HmiBodyFatUserBean hmiBodyFatUserBean = new HmiBodyFatUserBean(); | |||||
| if (userBean.getSex() == UserBean.SEX_MAN) { | |||||
| hmiBodyFatUserBean.setSex(HmiBodyFatDataUtil.SEX_MAN); | |||||
| } else { | |||||
| hmiBodyFatUserBean.setSex(HmiBodyFatDataUtil.SEX_FEMAN); | |||||
| } | |||||
| if (userBean.getModeType() == UserBean.MODE_ATHLETE) { | |||||
| hmiBodyFatUserBean.setModeType(HmiBodyFatDataUtil.MODE_ATHLETE); | |||||
| } else if (userBean.getModeType() == UserBean.MODE_PREGNANT) { | |||||
| hmiBodyFatUserBean.setModeType(HmiBodyFatDataUtil.MODE_PREGNANT); | |||||
| } else { | |||||
| hmiBodyFatUserBean.setModeType(HmiBodyFatDataUtil.MODE_ORDINARY); | |||||
| } | |||||
| hmiBodyFatUserBean.setId(userBean.getId()); | |||||
| hmiBodyFatUserBean.setAge(userBean.getAge()); | |||||
| hmiBodyFatUserBean.setHeight(userBean.getHeight()); | |||||
| hmiBodyFatUserBean.setWeight(userBean.getWeight()); | |||||
| hmiBodyFatUserBean.setAdc(userBean.getAdc()); | |||||
| return hmiBodyFatUserBean; | |||||
| } | |||||
| private void addLog(String log) { | |||||
| mlogList.add(0, TimeUtils.getTimeSSS() + log); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| private final int TO_REFRESH_UI = 300; | |||||
| private final int TO_REFRESH_USER = 301; | |||||
| private class MHandler extends Handler { | |||||
| @Override | |||||
| public void handleMessage(Message msg) { | |||||
| super.handleMessage(msg); | |||||
| switch (msg.what) { | |||||
| case TO_REFRESH_UI: | |||||
| if (listAdapter != null) { | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } | |||||
| break; | |||||
| case TO_REFRESH_USER: | |||||
| if (userAdapter != null) { | |||||
| mUserlogList.clear(); | |||||
| if (mUsers != null) { | |||||
| for (HmiBodyFatUserBean user : mUsers) { | |||||
| mUserlogList.add(user.toString()); | |||||
| } | |||||
| } | |||||
| userAdapter.notifyDataSetChanged(); | |||||
| } | |||||
| break; | |||||
| } | |||||
| } | |||||
| } | |||||
| } |
| @Override | @Override | ||||
| public void onClick(View v) { | public void onClick(View v) { | ||||
| switch (v.getId()) { | |||||
| case R.id.btn_meat_probe_connect: | |||||
| if (mAILinkBleManager != null) { | |||||
| mAILinkBleManager.connectDevice(mMac); | |||||
| int id = v.getId(); | |||||
| if (id == R.id.btn_meat_probe_connect) { | |||||
| if (mAILinkBleManager != null) { | |||||
| mAILinkBleManager.connectDevice(mMac); | |||||
| } | |||||
| } else if (id == R.id.btn_meat_probe_disconnect) { | |||||
| if (mAILinkBleManager != null) { | |||||
| mAILinkBleManager.disconnect(mMac); | |||||
| } | |||||
| } else if (id == R.id.btn_meat_probe_version) { | |||||
| if (mMeatProbeBleData != null) { | |||||
| mMeatProbeBleData.getVersionInfo(); | |||||
| } | |||||
| } else if (id == R.id.btn_meat_probe_battery) { | |||||
| if (mMeatProbeBleData != null) { | |||||
| mMeatProbeBleData.getBattery(); | |||||
| } | |||||
| } else if (id == R.id.btn_meat_probe_switch_unit) { | |||||
| if (mMeatProbeBleData != null) { | |||||
| //0-摄氏度 1-华氏度 | |||||
| if (unit == 0) { | |||||
| mMeatProbeBleData.sendSwitchUnit(1); | |||||
| } else { | |||||
| mMeatProbeBleData.sendSwitchUnit(0); | |||||
| } | } | ||||
| break; | |||||
| case R.id.btn_meat_probe_disconnect: | |||||
| if (mAILinkBleManager != null) { | |||||
| mAILinkBleManager.disconnect(mMac); | |||||
| } | |||||
| break; | |||||
| case R.id.btn_meat_probe_version: | |||||
| if (mMeatProbeBleData != null) { | |||||
| mMeatProbeBleData.getVersionInfo(); | |||||
| } | |||||
| break; | |||||
| case R.id.btn_meat_probe_battery: | |||||
| if (mMeatProbeBleData != null) { | |||||
| mMeatProbeBleData.getBattery(); | |||||
| } | |||||
| break; | |||||
| case R.id.btn_meat_probe_switch_unit: | |||||
| if (mMeatProbeBleData != null) { | |||||
| //0-摄氏度 1-华氏度 | |||||
| if (unit == 0) { | |||||
| mMeatProbeBleData.sendSwitchUnit(1); | |||||
| } else { | |||||
| mMeatProbeBleData.sendSwitchUnit(0); | |||||
| } | |||||
| } | |||||
| break; | |||||
| case R.id.btn_meat_probe_get_info: | |||||
| if (mMeatProbeBleData != null) { | |||||
| mMeatProbeBleData.appGetDeviceInfo(); | |||||
| } | |||||
| break; | |||||
| case R.id.btn_meat_probe_start: | |||||
| if (mMeatProbeBleData != null) { | |||||
| mProbeBean.setCookingId(System.currentTimeMillis()); | |||||
| mProbeBean.setCurrentUnit(unit); | |||||
| mMeatProbeBleData.appSetDeviceInfo(mProbeBean); | |||||
| } | |||||
| break; | |||||
| case R.id.btn_meat_probe_end: | |||||
| if (mMeatProbeBleData != null) { | |||||
| mMeatProbeBleData.endWork(); | |||||
| } | |||||
| break; | |||||
| default: | |||||
| break; | |||||
| } | |||||
| } else if (id == R.id.btn_meat_probe_get_info) { | |||||
| if (mMeatProbeBleData != null) { | |||||
| mMeatProbeBleData.appGetDeviceInfo(); | |||||
| } | |||||
| } else if (id == R.id.btn_meat_probe_start) { | |||||
| if (mMeatProbeBleData != null) { | |||||
| mProbeBean.setCookingId(System.currentTimeMillis()); | |||||
| mProbeBean.setCurrentUnit(unit); | |||||
| mMeatProbeBleData.appSetDeviceInfo(mProbeBean); | |||||
| } | |||||
| } else if (id == R.id.btn_meat_probe_end) { | |||||
| if (mMeatProbeBleData != null) { | |||||
| mMeatProbeBleData.endWork(); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @Override | @Override | ||||
| public void onClick(View view) { | public void onClick(View view) { | ||||
| switch (view.getId()) { | |||||
| case R.id.btn_probe_version: | |||||
| //获取版本号 | |||||
| mMeatProbeChargerBleDevice.getVersion(); | |||||
| break; | |||||
| case R.id.btn_probe_sync_time: | |||||
| //同步时间 | |||||
| mMeatProbeChargerBleDevice.appSyncTime(); | |||||
| break; | |||||
| case R.id.btn_probe_info: | |||||
| //获取设备状态 | |||||
| mMeatProbeChargerBleDevice.getDeviceInfo(); | |||||
| break; | |||||
| case R.id.btn_probe_set: | |||||
| //设置探针参数,需要选择探针 | |||||
| if (mDialogMacList.size() > 0) { | |||||
| setProbeDataDialog(); | |||||
| } else { | |||||
| Toast.makeText(MeatProbeChargerActivity.this, "请确认充电盒当前是否有连接的探针,点击获取设备状态按钮试试", Toast.LENGTH_SHORT).show(); | |||||
| } | |||||
| break; | |||||
| case R.id.btn_probe_get: | |||||
| //获取探针参数,先判断是否有探针再选择探针获取数据,需要选择探针 | |||||
| if (mDialogMacList.size() > 0) { | |||||
| getProbeDataDialog(); | |||||
| } else { | |||||
| Toast.makeText(MeatProbeChargerActivity.this, "请确认充电盒当前是否有连接的探针,点击获取设备状态按钮试试", Toast.LENGTH_SHORT).show(); | |||||
| } | |||||
| break; | |||||
| case R.id.btn_probe_clear: | |||||
| //清除探针数据,需要选择探针 | |||||
| if (mDialogMacList.size() > 0) { | |||||
| clearProbeDataDialog(); | |||||
| } else { | |||||
| Toast.makeText(MeatProbeChargerActivity.this, "请确认充电盒当前是否有连接的探针,点击获取设备状态按钮试试", Toast.LENGTH_SHORT).show(); | |||||
| } | |||||
| break; | |||||
| case R.id.btn_probe_unit: | |||||
| //切换盒子单位 | |||||
| if (("切换成℃").equals(btn_probe_unit.getText().toString())) { | |||||
| btn_probe_unit.setText("切换成℉"); | |||||
| mMeatProbeChargerBleDevice.switchUnit(true); | |||||
| } else { | |||||
| btn_probe_unit.setText("切换成℃"); | |||||
| mMeatProbeChargerBleDevice.switchUnit(false); | |||||
| } | |||||
| break; | |||||
| case R.id.btn_probe_set_alarm: | |||||
| //发送报警设置,需要选择探针 | |||||
| if (mDialogMacList.size() > 0) { | |||||
| setAlarmDialog(); | |||||
| } else { | |||||
| Toast.makeText(MeatProbeChargerActivity.this, "请确认充电盒当前是否有连接的探针,点击获取设备状态按钮试试", Toast.LENGTH_SHORT).show(); | |||||
| } | |||||
| break; | |||||
| case R.id.btn_probe_clear_alarm: | |||||
| //清除报警设置,需要选择探针 | |||||
| if (mDialogMacList.size() > 0) { | |||||
| cancelDialog(); | |||||
| } else { | |||||
| Toast.makeText(MeatProbeChargerActivity.this, "请确认充电盒当前是否有连接的探针,点击获取设备状态按钮试试", Toast.LENGTH_SHORT).show(); | |||||
| } | |||||
| break; | |||||
| case R.id.btn_probe_set_hand: | |||||
| //发送握手命令进行握手 | |||||
| if (!TextUtils.isEmpty(et_probe_set_hand.getText().toString())) { | |||||
| String cidvidpid = et_probe_set_hand.getText().toString().replaceAll(",", ","); | |||||
| if (cidvidpid.contains(",")) { | |||||
| String[] split = cidvidpid.split(","); | |||||
| int cid = 0, vid = 0, pid = 0; | |||||
| cid = Integer.parseInt(split[0], 16); | |||||
| if (split.length > 1) { | |||||
| vid = Integer.parseInt(split[1], 16); | |||||
| } | |||||
| if (split.length > 2) { | |||||
| pid = Integer.parseInt(split[2], 16); | |||||
| } | |||||
| BleConfig.setHandshakeStatus(mMac, true, cid, vid, pid); | |||||
| int id = view.getId(); | |||||
| if (id == R.id.btn_probe_version) {//获取版本号 | |||||
| mMeatProbeChargerBleDevice.getVersion(); | |||||
| } else if (id == R.id.btn_probe_sync_time) {//同步时间 | |||||
| mMeatProbeChargerBleDevice.appSyncTime(); | |||||
| } else if (id == R.id.btn_probe_info) {//获取设备状态 | |||||
| mMeatProbeChargerBleDevice.getDeviceInfo(); | |||||
| } else if (id == R.id.btn_probe_set) {//设置探针参数,需要选择探针 | |||||
| if (mDialogMacList.size() > 0) { | |||||
| setProbeDataDialog(); | |||||
| } else { | |||||
| Toast.makeText(MeatProbeChargerActivity.this, "请确认充电盒当前是否有连接的探针,点击获取设备状态按钮试试", Toast.LENGTH_SHORT).show(); | |||||
| } | |||||
| } else if (id == R.id.btn_probe_get) {//获取探针参数,先判断是否有探针再选择探针获取数据,需要选择探针 | |||||
| if (mDialogMacList.size() > 0) { | |||||
| getProbeDataDialog(); | |||||
| } else { | |||||
| Toast.makeText(MeatProbeChargerActivity.this, "请确认充电盒当前是否有连接的探针,点击获取设备状态按钮试试", Toast.LENGTH_SHORT).show(); | |||||
| } | |||||
| } else if (id == R.id.btn_probe_clear) {//清除探针数据,需要选择探针 | |||||
| if (mDialogMacList.size() > 0) { | |||||
| clearProbeDataDialog(); | |||||
| } else { | |||||
| Toast.makeText(MeatProbeChargerActivity.this, "请确认充电盒当前是否有连接的探针,点击获取设备状态按钮试试", Toast.LENGTH_SHORT).show(); | |||||
| } | |||||
| } else if (id == R.id.btn_probe_unit) {//切换盒子单位 | |||||
| if (("切换成℃").equals(btn_probe_unit.getText().toString())) { | |||||
| btn_probe_unit.setText("切换成℉"); | |||||
| mMeatProbeChargerBleDevice.switchUnit(true); | |||||
| } else { | |||||
| btn_probe_unit.setText("切换成℃"); | |||||
| mMeatProbeChargerBleDevice.switchUnit(false); | |||||
| } | |||||
| } else if (id == R.id.btn_probe_set_alarm) {//发送报警设置,需要选择探针 | |||||
| if (mDialogMacList.size() > 0) { | |||||
| setAlarmDialog(); | |||||
| } else { | |||||
| Toast.makeText(MeatProbeChargerActivity.this, "请确认充电盒当前是否有连接的探针,点击获取设备状态按钮试试", Toast.LENGTH_SHORT).show(); | |||||
| } | |||||
| } else if (id == R.id.btn_probe_clear_alarm) {//清除报警设置,需要选择探针 | |||||
| if (mDialogMacList.size() > 0) { | |||||
| cancelDialog(); | |||||
| } else { | |||||
| Toast.makeText(MeatProbeChargerActivity.this, "请确认充电盒当前是否有连接的探针,点击获取设备状态按钮试试", Toast.LENGTH_SHORT).show(); | |||||
| } | |||||
| } else if (id == R.id.btn_probe_set_hand) {//发送握手命令进行握手 | |||||
| if (!TextUtils.isEmpty(et_probe_set_hand.getText().toString())) { | |||||
| String cidvidpid = et_probe_set_hand.getText().toString().replaceAll(",", ","); | |||||
| if (cidvidpid.contains(",")) { | |||||
| String[] split = cidvidpid.split(","); | |||||
| int cid = 0, vid = 0, pid = 0; | |||||
| cid = Integer.parseInt(split[0], 16); | |||||
| if (split.length > 1) { | |||||
| vid = Integer.parseInt(split[1], 16); | |||||
| } | } | ||||
| } else { | |||||
| Toast.makeText(MeatProbeChargerActivity.this, "请先输入CID,VID,PID", Toast.LENGTH_SHORT).show(); | |||||
| if (split.length > 2) { | |||||
| pid = Integer.parseInt(split[2], 16); | |||||
| } | |||||
| BleConfig.setHandshakeStatus(mMac, true, cid, vid, pid); | |||||
| } | } | ||||
| break; | |||||
| default: | |||||
| break; | |||||
| } else { | |||||
| Toast.makeText(MeatProbeChargerActivity.this, "请先输入CID,VID,PID", Toast.LENGTH_SHORT).show(); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @Override | @Override | ||||
| public void onClick(View v) { | public void onClick(View v) { | ||||
| switch (v.getId()) { | |||||
| case R.id.btn_noise_ble_ac: | |||||
| //A/C键功能 | |||||
| if (mNoiseMeterBle != null) { | |||||
| mNoiseMeterBle.sendAC(); | |||||
| } | |||||
| break; | |||||
| case R.id.btn_noise_ble_light: | |||||
| //LIGHT键 | |||||
| if (mNoiseMeterBle != null) { | |||||
| mNoiseMeterBle.sendLight(); | |||||
| } | |||||
| break; | |||||
| case R.id.btn_noise_ble_fs: | |||||
| //F/S键 | |||||
| if (mNoiseMeterBle != null) { | |||||
| mNoiseMeterBle.sendFS(); | |||||
| } | |||||
| break; | |||||
| case R.id.btn_noise_ble_max: | |||||
| //MAX键 | |||||
| if (mNoiseMeterBle != null) { | |||||
| mNoiseMeterBle.sendMax(); | |||||
| } | |||||
| break; | |||||
| case R.id.btn_noise_ble_up: | |||||
| //UP键 | |||||
| if (mNoiseMeterBle != null) { | |||||
| mNoiseMeterBle.sendUp(); | |||||
| } | |||||
| break; | |||||
| case R.id.btn_noise_ble_down: | |||||
| //DOWN键 | |||||
| if (mNoiseMeterBle != null) { | |||||
| mNoiseMeterBle.sendDown(); | |||||
| } | |||||
| break; | |||||
| default: | |||||
| break; | |||||
| int id = v.getId(); | |||||
| if (id == R.id.btn_noise_ble_ac) {//A/C键功能 | |||||
| if (mNoiseMeterBle != null) { | |||||
| mNoiseMeterBle.sendAC(); | |||||
| } | |||||
| } else if (id == R.id.btn_noise_ble_light) {//LIGHT键 | |||||
| if (mNoiseMeterBle != null) { | |||||
| mNoiseMeterBle.sendLight(); | |||||
| } | |||||
| } else if (id == R.id.btn_noise_ble_fs) {//F/S键 | |||||
| if (mNoiseMeterBle != null) { | |||||
| mNoiseMeterBle.sendFS(); | |||||
| } | |||||
| } else if (id == R.id.btn_noise_ble_max) {//MAX键 | |||||
| if (mNoiseMeterBle != null) { | |||||
| mNoiseMeterBle.sendMax(); | |||||
| } | |||||
| } else if (id == R.id.btn_noise_ble_up) {//UP键 | |||||
| if (mNoiseMeterBle != null) { | |||||
| mNoiseMeterBle.sendUp(); | |||||
| } | |||||
| } else if (id == R.id.btn_noise_ble_down) {//DOWN键 | |||||
| if (mNoiseMeterBle != null) { | |||||
| mNoiseMeterBle.sendDown(); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @Override | @Override | ||||
| public void onClick(View v) { | public void onClick(View v) { | ||||
| int id = v.getId(); | int id = v.getId(); | ||||
| switch (id) { | |||||
| case R.id.btn_get_device_state: | |||||
| sendData(mNoiseSendUtils.sendSetDeviceState()); | |||||
| addText("获取设备状态"); | |||||
| break; | |||||
| case R.id.btn_get_support_list: | |||||
| sendData(mNoiseSendUtils.sendSetSupportList()); | |||||
| addText("获取设备支持的功能列表"); | |||||
| break; | |||||
| case R.id.btn_noise_ac: | |||||
| if (deviceAc == 1) { | |||||
| deviceAc++; | |||||
| } else { | |||||
| deviceAc--; | |||||
| } | |||||
| sendData(mNoiseSendUtils.sendAc(deviceAc)); | |||||
| break; | |||||
| case R.id.btn_noise_min_max: | |||||
| deviceMinMax++; | |||||
| sendData(mNoiseSendUtils.sendMinMaxMode(deviceMinMax%3)); | |||||
| break; | |||||
| case R.id.btn_noise_hold: | |||||
| if (deviceHold == 0) { | |||||
| deviceHold++; | |||||
| } else { | |||||
| deviceHold--; | |||||
| } | |||||
| sendData(mNoiseSendUtils.sendHoldMode(deviceHold,100)); | |||||
| break; | |||||
| case R.id.btn_noise_log: | |||||
| sendData(mNoiseSendUtils.sendGetHistory(mTime)); | |||||
| addText("获取历史记录:时间="+mTime); | |||||
| break; | |||||
| default: | |||||
| break; | |||||
| if (id == R.id.btn_get_device_state) { | |||||
| sendData(mNoiseSendUtils.sendSetDeviceState()); | |||||
| addText("获取设备状态"); | |||||
| } else if (id == R.id.btn_get_support_list) { | |||||
| sendData(mNoiseSendUtils.sendSetSupportList()); | |||||
| addText("获取设备支持的功能列表"); | |||||
| } else if (id == R.id.btn_noise_ac) { | |||||
| if (deviceAc == 1) { | |||||
| deviceAc++; | |||||
| } else { | |||||
| deviceAc--; | |||||
| } | |||||
| sendData(mNoiseSendUtils.sendAc(deviceAc)); | |||||
| } else if (id == R.id.btn_noise_min_max) { | |||||
| deviceMinMax++; | |||||
| sendData(mNoiseSendUtils.sendMinMaxMode(deviceMinMax % 3)); | |||||
| } else if (id == R.id.btn_noise_hold) { | |||||
| if (deviceHold == 0) { | |||||
| deviceHold++; | |||||
| } else { | |||||
| deviceHold--; | |||||
| } | |||||
| sendData(mNoiseSendUtils.sendHoldMode(deviceHold, 100)); | |||||
| } else if (id == R.id.btn_noise_log) { | |||||
| sendData(mNoiseSendUtils.sendGetHistory(mTime)); | |||||
| addText("获取历史记录:时间=" + mTime); | |||||
| } | } | ||||
| @Override | @Override | ||||
| public void onClick(View v) { | public void onClick(View v) { | ||||
| switch (v.getId()) { | |||||
| case R.id.btn_set: | |||||
| int hour = seek_hour.getProgress(); | |||||
| int minute = seek_minute.getProgress(); | |||||
| int second = seek_second.getProgress() + 1; | |||||
| if (mShareChargerData != null) { | |||||
| addText("APP设置充电时间:" + getTimeStr(hour, minute, second)); | |||||
| mShareChargerData.appSetChargerTime(hour, minute, second); | |||||
| } | |||||
| break; | |||||
| case R.id.btn_get: | |||||
| if (mShareChargerData != null) { | |||||
| addText("APP获取剩余充电时间"); | |||||
| mShareChargerData.appGetChargerTime(); | |||||
| } | |||||
| break; | |||||
| case R.id.btn_switch: | |||||
| boolean isOpen = rb_open.isChecked(); | |||||
| if (mShareChargerData != null) { | |||||
| addText("APP切换开关:" + isOpen); | |||||
| mShareChargerData.appSwitch(isOpen); | |||||
| } | |||||
| break; | |||||
| int id = v.getId(); | |||||
| if (id == R.id.btn_set) { | |||||
| int hour = seek_hour.getProgress(); | |||||
| int minute = seek_minute.getProgress(); | |||||
| int second = seek_second.getProgress() + 1; | |||||
| if (mShareChargerData != null) { | |||||
| addText("APP设置充电时间:" + getTimeStr(hour, minute, second)); | |||||
| mShareChargerData.appSetChargerTime(hour, minute, second); | |||||
| } | |||||
| } else if (id == R.id.btn_get) { | |||||
| if (mShareChargerData != null) { | |||||
| addText("APP获取剩余充电时间"); | |||||
| mShareChargerData.appGetChargerTime(); | |||||
| } | |||||
| } else if (id == R.id.btn_switch) { | |||||
| boolean isOpen = rb_open.isChecked(); | |||||
| if (mShareChargerData != null) { | |||||
| addText("APP切换开关:" + isOpen); | |||||
| mShareChargerData.appSwitch(isOpen); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.smart_cycling_table | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L | |||||
| import com.pinwang.ailinkblesdk.modules.smart_cycling_table.SatelliteBean | |||||
| /** | |||||
| * 卫星豆(合计) | |||||
| * @author xing | |||||
| * @date 2025/03/08 | |||||
| * @constructor 创建[SatelliteAllBean] | |||||
| */ | |||||
| class SatelliteAllBean { | |||||
| var type = "" | |||||
| var size = 0 | |||||
| var list: MutableList<SatelliteBean> = mutableListOf() | |||||
| fun parseStr(msgs: Array<String>) { | |||||
| type = msgs[0].substring(1) | |||||
| size = msgs[3].toInt() | |||||
| val group = msgs.size - 5 | |||||
| val start = 4 | |||||
| //group从4开始,步进是4 | |||||
| for (i in 0 until group step 4) { | |||||
| val index = i + start | |||||
| val newArray = if (index + 4 < msgs.size) { | |||||
| msgs.sliceArray(index until index + 4) | |||||
| } else { | |||||
| emptyArray() // 如果 startIndex 超出范围,返回空数组 | |||||
| } | |||||
| if (newArray.isEmpty()) { | |||||
| continue | |||||
| } | |||||
| val bean = SatelliteBean().also { | |||||
| it.init(newArray) | |||||
| } | |||||
| L.i("卫星信息:$bean") | |||||
| list.add(bean) | |||||
| } | |||||
| } | |||||
| fun checkData(): Boolean { | |||||
| return list.size >= size | |||||
| } | |||||
| //复制对象 | |||||
| fun copy(): SatelliteAllBean { | |||||
| return SatelliteAllBean().also { | |||||
| it.type = this.type | |||||
| it.size = this.size | |||||
| it.list = this.list.map { it.copy() }.toMutableList() | |||||
| } | |||||
| } | |||||
| } |
| package com.pinwang.ailinkblesdk.modules.smart_cycling_table | |||||
| /** | |||||
| * 卫星豆 | |||||
| * @author xing | |||||
| * @date 2025/03/08 | |||||
| * @constructor 创建[SatelliteBean] | |||||
| */ | |||||
| class SatelliteBean { | |||||
| var id = "" | |||||
| /** 仰角 */ | |||||
| var llevation = "" | |||||
| var azimuth = "" | |||||
| var rssi = "" | |||||
| fun init(msg: Array<String>) { | |||||
| id = msg[0] | |||||
| llevation = msg[1] | |||||
| azimuth = msg[2] | |||||
| rssi = msg[3] | |||||
| } | |||||
| //复制对象 | |||||
| fun copy(): SatelliteBean { | |||||
| val bean = SatelliteBean().also { | |||||
| it.id = id | |||||
| it.llevation = llevation | |||||
| it.azimuth = azimuth | |||||
| it.rssi = rssi | |||||
| } | |||||
| return bean | |||||
| } | |||||
| override fun toString(): String { | |||||
| return "SatelliteBean(id='$id', llevation='$llevation', azimuth='$azimuth', rssi='$rssi')" | |||||
| } | |||||
| } |
| package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.smart_cycling_table; | |||||
| import android.content.Context; | |||||
| import android.os.Bundle; | |||||
| import android.view.View; | |||||
| import android.widget.ArrayAdapter; | |||||
| import android.widget.Button; | |||||
| import android.widget.ListView; | |||||
| import android.widget.TextView; | |||||
| import androidx.annotation.Nullable; | |||||
| import androidx.lifecycle.ViewModelProvider; | |||||
| import com.pinwang.ailinkblesdk.modules.smart_cycling_table.SmartCyclingTableViewModel; | |||||
| import java.util.ArrayList; | |||||
| import java.util.List; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleNewBaseActivity; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||||
| /** | |||||
| * 智能码表界面 | |||||
| * | |||||
| * @author xing | |||||
| * @date 2025/12/11 | |||||
| */ | |||||
| public class SmartCyclingTableActivity extends BleNewBaseActivity implements View.OnClickListener { | |||||
| private Button btnGetGps, btnPause, btnContinue, btnClear; | |||||
| private TextView tvLastData; | |||||
| private List<String> mList; | |||||
| private ArrayAdapter listAdapter; | |||||
| private Context mContext; | |||||
| private String mAddress; | |||||
| private int mCid; | |||||
| private int mVid; | |||||
| private int mPid; | |||||
| private SmartCyclingTableViewModel mViewModel; | |||||
| @Override | |||||
| protected void onCreate(@Nullable Bundle savedInstanceState) { | |||||
| super.onCreate(savedInstanceState); | |||||
| setContentView(R.layout.activity_smart_cycling_table); | |||||
| initView(); | |||||
| initData(); | |||||
| initListener(); | |||||
| } | |||||
| private void initListener() { | |||||
| btnGetGps.setOnClickListener(this); | |||||
| btnPause.setOnClickListener(this); | |||||
| btnContinue.setOnClickListener(this); | |||||
| btnClear.setOnClickListener(this); | |||||
| if (mViewModel != null) { | |||||
| mViewModel.getMGpsLogLiveData().observe(this, s -> { | |||||
| addLog(s); | |||||
| }); | |||||
| // mViewModel.getMGpsNumberLiveData().observe(this, map -> { | |||||
| // String msg = ""; | |||||
| // msg += map.get("GPGSV") + "\n"; | |||||
| // msg += map.get("GBGSV") + "\n"; | |||||
| // msg += map.get("GAGSV") + "\n"; | |||||
| // msg += map.get("GLGSV") + "\n"; | |||||
| // tvLastData.setText(msg); | |||||
| // }); | |||||
| mViewModel.getConnectStatusData().observe(this, status -> { | |||||
| switch (status) { | |||||
| case 1: | |||||
| addLog("扫描中"); | |||||
| break; | |||||
| case 2: | |||||
| addLog("连接断开"); | |||||
| break; | |||||
| case 3: | |||||
| addLog("连接成功"); | |||||
| break; | |||||
| } | |||||
| }); | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public void onClick(View v) { | |||||
| int id = v.getId(); | |||||
| if (id == R.id.btnGetGps) { | |||||
| mViewModel.getGpsInfo(); | |||||
| } else if (id == R.id.btnPause) { | |||||
| mViewModel.refreshDataPause(); | |||||
| } else if (id == R.id.btnContinue) { | |||||
| mViewModel.refreshDataContinue(); | |||||
| } else if (id == R.id.btnClear) { | |||||
| clear(); | |||||
| } | |||||
| } | |||||
| private void initData() { | |||||
| mViewModel = new ViewModelProvider(this).get(SmartCyclingTableViewModel.class); | |||||
| mContext = this; | |||||
| mAddress = getIntent().getStringExtra("mac"); | |||||
| mCid = getIntent().getIntExtra("cid", -1); | |||||
| mVid = getIntent().getIntExtra("vid", -1); | |||||
| mPid = getIntent().getIntExtra("pid", -1); | |||||
| if (isServiceBinded) { | |||||
| onServiceSuccess(); | |||||
| } | |||||
| } | |||||
| private void initView() { | |||||
| tvLastData = findViewById(R.id.tvLastData); | |||||
| btnGetGps = findViewById(R.id.btnGetGps); | |||||
| btnPause = findViewById(R.id.btnPause); | |||||
| btnContinue = findViewById(R.id.btnContinue); | |||||
| btnClear = findViewById(R.id.btnClear); | |||||
| mList = new ArrayList<>(); | |||||
| ListView listView = findViewById(R.id.listview); | |||||
| listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | |||||
| listView.setAdapter(listAdapter); | |||||
| } | |||||
| private boolean isServiceBinded = false; | |||||
| @Override | |||||
| public void onServiceSuccess() { | |||||
| isServiceBinded = true; | |||||
| if (mViewModel != null) { | |||||
| mViewModel.init(mAddress, mCid, mVid, mPid); | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public void onServiceErr() { | |||||
| } | |||||
| @Override | |||||
| public void unbindServices() { | |||||
| } | |||||
| private void addLog(String msg) { | |||||
| mList.add(TimeUtils.getTimeSSS() + msg); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } | |||||
| private void clear() { | |||||
| mList.clear(); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } | |||||
| } |
| package com.pinwang.ailinkblesdk.modules.smart_cycling_table | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.smart_cycling_table.SatelliteAllBean | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L | |||||
| import androidx.lifecycle.MutableLiveData | |||||
| import androidx.lifecycle.ViewModel | |||||
| import com.pingwang.bluetoothlib.AILinkBleManager | |||||
| import com.pingwang.bluetoothlib.bean.BleValueBean | |||||
| import com.pingwang.bluetoothlib.device.BleDevice | |||||
| import com.pingwang.bluetoothlib.listener.OnBleOtherDataListener | |||||
| import com.pingwang.bluetoothlib.listener.OnCallbackBle | |||||
| import com.pingwang.bluetoothlib.utils.UuidUtils | |||||
| /** | |||||
| * 智能码表视图模型 | |||||
| * @author xing | |||||
| * @date 2025/03/07 | |||||
| * @constructor 创建[SmartCyclingTableViewModel] | |||||
| */ | |||||
| class SmartCyclingTableViewModel : ViewModel(), OnCallbackBle, OnBleOtherDataListener { | |||||
| /** ble状态数据 | |||||
| * true-打开 | |||||
| * false-关闭 | |||||
| * */ | |||||
| val bleStatusData by lazy { MutableLiveData<Boolean>() } | |||||
| /** 连接状态数据 | |||||
| * 1-扫描中 | |||||
| * 2-连接断开 | |||||
| * 3-连接成功 | |||||
| * | |||||
| * */ | |||||
| val connectStatusData by lazy { MutableLiveData<Int>() } | |||||
| val mGpsLogLiveData by lazy { MutableLiveData<String>() } | |||||
| val mGpsInfoLiveData by lazy { MutableLiveData<MutableMap<String, SatelliteAllBean>>() } | |||||
| /** 缓存Map */ | |||||
| var cacheMap: MutableMap<String, SatelliteAllBean> = mutableMapOf() | |||||
| var mRefreshData: Boolean = true | |||||
| var mMac: String = "" | |||||
| var mBleDevice: BleDevice? = null | |||||
| fun init(mac: String, cid: Int, vid: Int, pid: Int) { | |||||
| mMac = mac | |||||
| AILinkBleManager.getInstance().setOnCallbackBle(this) | |||||
| mBleDevice = AILinkBleManager.getInstance().getBleDevice(mac) | |||||
| mBleDevice?.let { | |||||
| connectStatusData.postValue(3) | |||||
| it.setA7Encryption(false) | |||||
| it.setOnBleOtherDataListener(this) | |||||
| } ?: run { | |||||
| connectDevice(mac, cid, vid, pid) | |||||
| } | |||||
| } | |||||
| fun getGpsInfo() { | |||||
| mBleDevice?.setNotify(UuidUtils.getUuid("FFE0"), UuidUtils.getUuid("FFE3")) | |||||
| refreshDataContinue() | |||||
| } | |||||
| fun refreshDataPause() { | |||||
| mRefreshData = false | |||||
| mGpsLogLiveData.value = "暂停刷新" | |||||
| } | |||||
| fun refreshDataContinue() { | |||||
| mRefreshData = true | |||||
| mGpsLogLiveData.value = "继续刷新" | |||||
| } | |||||
| override fun onNotifyOtherData(uuid: String?, data: ByteArray?) { | |||||
| super.onNotifyOtherData(uuid, data) | |||||
| data?.let { | |||||
| if (mRefreshData) { | |||||
| parseData(String(data)) | |||||
| } | |||||
| } | |||||
| } | |||||
| /** | |||||
| * 解析数据 | |||||
| * @param [msg] 味精 | |||||
| */ | |||||
| fun parseData(msg: String) { | |||||
| if (msg.contains(",")) { | |||||
| val split = msg.split(",") | |||||
| if (split[0].isEmpty()) { | |||||
| return | |||||
| } | |||||
| val type = split[0].substring(1) | |||||
| var message: String | |||||
| when (type) { | |||||
| "GPGSV" -> { | |||||
| message = "GPS卫星数:" | |||||
| } | |||||
| "GBGSV" -> { | |||||
| message = "北斗卫星数:" | |||||
| } | |||||
| "GAGSV" -> { | |||||
| message = "伽利略卫星数:" | |||||
| } | |||||
| "GLGSV" -> { | |||||
| message = "俄罗斯卫星数:" | |||||
| } | |||||
| "GIGSV" -> { | |||||
| message = "印度卫星数:" | |||||
| } | |||||
| "GQGSV" -> { | |||||
| message = "日本卫星数:" | |||||
| } | |||||
| else -> { | |||||
| return | |||||
| } | |||||
| } | |||||
| L.i("msg:$msg") | |||||
| var bean = cacheMap[type] | |||||
| if (bean == null) { | |||||
| bean = SatelliteAllBean() | |||||
| } | |||||
| bean.parseStr(split.toTypedArray()) | |||||
| cacheMap[type] = bean | |||||
| if (bean.checkData()) { | |||||
| message += "${bean.size}\n" | |||||
| val newBean = bean.copy() | |||||
| cacheMap.remove(bean.type) | |||||
| if (newBean.size > 0) { | |||||
| mGpsLogLiveData.value = message + getSatelliteAllBeanString(newBean) | |||||
| } | |||||
| // mGpsInfoLiveData.value = mutableMapOf<String, SatelliteAllBean>().also { it.putAll(cacheMap) } | |||||
| } | |||||
| } | |||||
| } | |||||
| /** | |||||
| * 获取卫星所有豆字符串 | |||||
| * @param [bean] 豆 | |||||
| * @return [String] | |||||
| */ | |||||
| private fun getSatelliteAllBeanString(bean: SatelliteAllBean): String { | |||||
| var message = "" | |||||
| for ((index, satelliteBean) in bean.list.withIndex()) { | |||||
| message += "编号:${satelliteBean.id};信号:${satelliteBean.rssi}dB" | |||||
| message += if (index % 2 == 1) { | |||||
| "\n" | |||||
| } else { | |||||
| "; " | |||||
| } | |||||
| } | |||||
| return message | |||||
| } | |||||
| /** | |||||
| * 连接设备 | |||||
| * @param [mac] mac | |||||
| * @param [cid] cid | |||||
| * @param [vid] vid | |||||
| * @param [pid] pid | |||||
| */ | |||||
| private fun connectDevice(mac: String, cid: Int, vid: Int, pid: Int) { | |||||
| AILinkBleManager.getInstance().connectDevice(BleValueBean(mac, cid, vid, pid)) | |||||
| } | |||||
| override fun bleOpen() { | |||||
| bleStatusData.postValue(true) | |||||
| } | |||||
| override fun bleClose() { | |||||
| bleStatusData.postValue(false) | |||||
| } | |||||
| override fun onDisConnected(mac: String?, code: Int) { | |||||
| super.onDisConnected(mac, code) | |||||
| if (mac == mMac) { | |||||
| connectStatusData.postValue(2) | |||||
| } | |||||
| } | |||||
| override fun onServicesDiscovered(mac: String?) { | |||||
| super.onServicesDiscovered(mac) | |||||
| if (mac == mMac) { | |||||
| connectStatusData.postValue(3) | |||||
| } | |||||
| } | |||||
| override fun onStartScan() { | |||||
| super.onStartScan() | |||||
| connectStatusData.postValue(1) | |||||
| } | |||||
| override fun onScanning(data: BleValueBean?) { | |||||
| super.onScanning(data) | |||||
| data?.let { | |||||
| if (it.mac == mMac) { | |||||
| AILinkBleManager.getInstance().connectDevice(data) | |||||
| } | |||||
| } | |||||
| } | |||||
| override fun onCleared() { | |||||
| super.onCleared() | |||||
| mBleDevice?.disconnect() | |||||
| AILinkBleManager.getInstance().disconnectAll() | |||||
| } | |||||
| } |
| package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.toothbrush; | |||||
| import android.content.Intent; | |||||
| import android.content.pm.ActivityInfo; | |||||
| import android.net.Uri; | |||||
| import android.os.Bundle; | |||||
| import android.os.Handler; | |||||
| import android.os.Message; | |||||
| import android.text.TextUtils; | |||||
| import android.view.View; | |||||
| import android.widget.ArrayAdapter; | |||||
| import android.widget.EditText; | |||||
| import android.widget.ListView; | |||||
| import android.widget.Toast; | |||||
| import androidx.annotation.Nullable; | |||||
| import com.pingwang.bluetoothlib.bean.BleValueBean; | |||||
| import com.pingwang.bluetoothlib.config.CmdConfig; | |||||
| import com.pingwang.bluetoothlib.device.BleDevice; | |||||
| import com.pingwang.bluetoothlib.device.wifibleDevice.WifiBleDeviceData; | |||||
| import com.pingwang.bluetoothlib.device.wifibleDevice.WifiBleInfoBean; | |||||
| import com.pingwang.bluetoothlib.listener.OnCallbackBle; | |||||
| import com.pingwang.bluetoothlib.utils.BleLog; | |||||
| import java.lang.ref.WeakReference; | |||||
| import java.text.SimpleDateFormat; | |||||
| import java.util.ArrayList; | |||||
| import java.util.Arrays; | |||||
| import java.util.List; | |||||
| import java.util.Locale; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.DialogStringImageBean; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.MoveDataDialogFragment; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.ShowListDialogFragment; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.ToothBrushUtils; | |||||
| import cn.net.aicare.modulelibrary.module.ToothBrush.ToothBrushBleCmd; | |||||
| import cn.net.aicare.modulelibrary.module.ToothBrush.ToothBrushWiFiBleUtilsData; | |||||
| /** | |||||
| * Wifi+ble 牙刷(new), 客户定制版本,增加api key读取和设置 | |||||
| */ | |||||
| public class ToothBrushWifiNewBleActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, WifiBleDeviceData.OnWiFiBleCallback, ToothBrushWiFiBleUtilsData.OnBleToothBrushCallback { | |||||
| private final int TO_REFRESH_UI = 300; | |||||
| private final int TO_REQUEST_TOKEN = 500; | |||||
| private final int GET_BATTERY = 600; | |||||
| private String TAG = ToothBrushWifiNewBleActivity.class.getName(); | |||||
| private String mAddress; | |||||
| private List<String> mList; | |||||
| private ArrayAdapter listAdapter; | |||||
| private ToothBrushWiFiBleUtilsData mToothBrushWiFiBleUtilsData; | |||||
| private MHandler mMHandler; | |||||
| private EditText etApiKey, select_gears_et, ed_score, etIp, etPort, etPath; | |||||
| private List<DialogStringImageBean> mWifiList = new ArrayList<>(); | |||||
| private List<WifiBleInfoBean> mWifiBleInfoBeanList = new ArrayList<>(); | |||||
| @Override | |||||
| protected void onCreate(@Nullable Bundle savedInstanceState) { | |||||
| super.onCreate(savedInstanceState); | |||||
| setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//禁止横屏 | |||||
| setContentView(R.layout.activity_tooth_brush_wifi_ble_new); | |||||
| findViewById(R.id.getWifiStatus).setOnClickListener(this); | |||||
| findViewById(R.id.getSn).setOnClickListener(this); | |||||
| findViewById(R.id.scanWifi).setOnClickListener(this); | |||||
| findViewById(R.id.disconnectWifi).setOnClickListener(this); | |||||
| findViewById(R.id.getWifiName).setOnClickListener(this); | |||||
| findViewById(R.id.getSupportUnit).setOnClickListener(this); | |||||
| findViewById(R.id.defaultTryOut).setOnClickListener(this); | |||||
| findViewById(R.id.getTimeMode).setOnClickListener(this); | |||||
| findViewById(R.id.defaultMode).setOnClickListener(this); | |||||
| findViewById(R.id.ota).setOnClickListener(this); | |||||
| findViewById(R.id.btnScore).setOnClickListener(this); | |||||
| findViewById(R.id.btnGetApiKey).setOnClickListener(this); | |||||
| findViewById(R.id.btnSetApiKey).setOnClickListener(this); | |||||
| findViewById(R.id.btnSetUrl).setOnClickListener(this); | |||||
| findViewById(R.id.btnGetUrl).setOnClickListener(this); | |||||
| etApiKey = findViewById(R.id.etApiKey); | |||||
| select_gears_et = findViewById(R.id.etSelectGears); | |||||
| ed_score = findViewById(R.id.etScore); | |||||
| etIp = findViewById(R.id.etIp); | |||||
| etPort = findViewById(R.id.etPort); | |||||
| etPath = findViewById(R.id.etPath); | |||||
| mAddress = getIntent().getStringExtra("mac"); | |||||
| mList = new ArrayList<>(); | |||||
| ListView listView = findViewById(R.id.log_list); | |||||
| listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | |||||
| listView.setAdapter(listAdapter); | |||||
| WeakReference weakReference = new WeakReference(new MHandler()); | |||||
| mMHandler = (MHandler) weakReference.get(); | |||||
| } | |||||
| @Override | |||||
| public void onClick(View v) { | |||||
| int id = v.getId(); | |||||
| if (mToothBrushWiFiBleUtilsData != null) { | |||||
| if (id == R.id.getWifiStatus) { | |||||
| mToothBrushWiFiBleUtilsData.getWifiCurrentState(); | |||||
| } else if (id == R.id.getSn) { | |||||
| mToothBrushWiFiBleUtilsData.getDeviceId(); | |||||
| } else if (id == R.id.scanWifi) { | |||||
| mToothBrushWiFiBleUtilsData.scanWifi(); | |||||
| mList.add(TimeUtils.getTime() + "正在扫描附近可用的wifi..."); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| showWifiList(); | |||||
| } else if (id == R.id.getWifiName) { | |||||
| mToothBrushWiFiBleUtilsData.getConnectWifiName(); | |||||
| } else if (id == R.id.disconnectWifi) { | |||||
| mToothBrushWiFiBleUtilsData.disconnectWifi(); | |||||
| } else if (id == R.id.getSupportUnit) { | |||||
| mToothBrushWiFiBleUtilsData.getSupportGears(); | |||||
| } else if (id == R.id.defaultMode) { | |||||
| String gear = select_gears_et.getText().toString().trim(); | |||||
| if (!gear.isEmpty()) { | |||||
| String[] gears = null; | |||||
| if (gear.contains(",")) { | |||||
| gears = gear.split(","); | |||||
| } else if (gear.contains(",")) { | |||||
| gears = gear.split(","); | |||||
| } else { | |||||
| Toast.makeText(this, "请输入时长,档位,档位级别(数字加符号)", Toast.LENGTH_SHORT).show(); | |||||
| } | |||||
| if (gears != null) { | |||||
| try { | |||||
| mToothBrushWiFiBleUtilsData.setDefault(Integer.parseInt(gears[0]), Integer.parseInt(gears[1]), Integer.parseInt(gears[2])); | |||||
| } catch (NumberFormatException e) { | |||||
| e.printStackTrace(); | |||||
| Toast.makeText(this, "请输入时长,档位,档位级别(数字加符号)", Toast.LENGTH_SHORT).show(); | |||||
| } | |||||
| } | |||||
| } | |||||
| } else if (id == R.id.defaultTryOut) { | |||||
| String gear1 = select_gears_et.getText().toString().trim(); | |||||
| if (!gear1.isEmpty()) { | |||||
| String[] gears = null; | |||||
| if (gear1.contains(",")) { | |||||
| gears = gear1.split(","); | |||||
| } else if (gear1.contains(",")) { | |||||
| gears = gear1.split(","); | |||||
| } else { | |||||
| Toast.makeText(this, "请输入时长,档位,档位级别(数字加符号)", Toast.LENGTH_SHORT).show(); | |||||
| } | |||||
| if (gears != null) { | |||||
| try { | |||||
| mToothBrushWiFiBleUtilsData.setTryOut(Integer.parseInt(gears[1]), Integer.parseInt(gears[2]), 0, 0); | |||||
| } catch (NumberFormatException e) { | |||||
| e.printStackTrace(); | |||||
| Toast.makeText(this, "请输入时长,档位,档位级别(数字加符号)", Toast.LENGTH_SHORT).show(); | |||||
| } | |||||
| } | |||||
| } | |||||
| } else if (id == R.id.getTimeMode) { | |||||
| mToothBrushWiFiBleUtilsData.getDefaultGearAndDuration(); | |||||
| } else if (id == R.id.ota) { | |||||
| showFileChooser(); | |||||
| // mToothBrushWiFiBleUtilsData.setOta(); | |||||
| } else if (id == R.id.btnGetApiKey) { | |||||
| mToothBrushWiFiBleUtilsData.getApiKey(); | |||||
| } else if (id == R.id.btnSetApiKey) { | |||||
| String apiKey = etApiKey.getText().toString().trim(); | |||||
| if (!apiKey.isEmpty()) { | |||||
| mToothBrushWiFiBleUtilsData.setApiKey(apiKey); | |||||
| } | |||||
| } else if (id == R.id.btnSetUrl) { | |||||
| String ip = etIp.getText().toString().trim(); | |||||
| String port = etPort.getText().toString().trim(); | |||||
| String path = etPath.getText().toString().trim(); | |||||
| mToothBrushWiFiBleUtilsData.setServiceInfo(ip, Integer.parseInt(port), path); | |||||
| } else if (id == R.id.btnGetUrl) { | |||||
| mToothBrushWiFiBleUtilsData.getServiceInfo(); | |||||
| } | |||||
| } | |||||
| if (v.getId() == R.id.btnScore) { | |||||
| try { | |||||
| String[] time = ed_score.getText().toString().trim().split(","); | |||||
| int defaultTime = Integer.parseInt(time[0]); | |||||
| int useTime = Integer.parseInt(time[1]); | |||||
| int lTime = Integer.parseInt(time[2]); | |||||
| int rTime = Integer.parseInt(time[3]); | |||||
| ToothBrushUtils toothBrushUtils = new ToothBrushUtils(); | |||||
| int grade = toothBrushUtils.getGrade(defaultTime, useTime, lTime, rTime); | |||||
| int avg = toothBrushUtils.getAvgGrade(defaultTime, lTime, rTime); | |||||
| int rang = toothBrushUtils.getRangeGrade(defaultTime, lTime, rTime); | |||||
| int duration = toothBrushUtils.getDurationGrade(defaultTime, useTime); | |||||
| mList.add(0, grade + " 均匀度: " + avg + " 范围:" + rang + " 刷牙时长:" + duration); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } catch (Exception e) { | |||||
| mList.add(0, "出错了 请按 默认时长,刷牙时长,左时长,右时长.输入单位是秒"); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| e.printStackTrace(); | |||||
| } | |||||
| } | |||||
| } | |||||
| private ShowListDialogFragment mShowListDialogFragment; | |||||
| private void showWifiList() { | |||||
| if (mShowListDialogFragment == null) { | |||||
| mShowListDialogFragment = ShowListDialogFragment.newInstance(); | |||||
| mShowListDialogFragment.setList(mWifiList); | |||||
| mShowListDialogFragment.setTitle("选择WIFI"); | |||||
| mShowListDialogFragment.setCancel("取消", 0); | |||||
| mShowListDialogFragment.setOnDialogListener(new ShowListDialogFragment.onDialogListener() { | |||||
| @Override | |||||
| public void onItemListener(int position) { | |||||
| WifiBleInfoBean wifiBleInfoBean = mWifiBleInfoBeanList.get(position); | |||||
| String ssid = wifiBleInfoBean.getSsid(); | |||||
| MoveDataDialogFragment.newInstance() | |||||
| .setTitle(ssid, "") | |||||
| .setContent("", "请输入密码", MoveDataDialogFragment.NAME) | |||||
| .setOk("OK", 0) | |||||
| .setCancel("取消", 0) | |||||
| .setOnDialogListener(new MoveDataDialogFragment.OnDialogListener() { | |||||
| @Override | |||||
| public void onSucceedListener(View v, String data) { | |||||
| String pwd = data.trim(); | |||||
| setConnectWifi(wifiBleInfoBean.getMac(), pwd); | |||||
| } | |||||
| }) | |||||
| .show(getSupportFragmentManager()); | |||||
| } | |||||
| @Override | |||||
| public void onCancelListener(View v) { | |||||
| } | |||||
| }); | |||||
| } | |||||
| mShowListDialogFragment.show(getSupportFragmentManager()); | |||||
| } | |||||
| /** | |||||
| * 设置连接wifi | |||||
| * | |||||
| * @param mac mac | |||||
| * @param pwd 密码 | |||||
| */ | |||||
| private void setConnectWifi(String mac, String pwd) { | |||||
| if (mToothBrushWiFiBleUtilsData != null) { | |||||
| mToothBrushWiFiBleUtilsData.setConnectWifiMac(mac, pwd); | |||||
| mList.add(TimeUtils.getTime() + "正在连接wifi..."); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public void onServiceSuccess() { | |||||
| //与服务建立连接 | |||||
| mList.add(0, "服务与界面建立连接成功"); | |||||
| // mList.add(0, "搜索设备"); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| mAILinkBleManager.setOnCallbackBle(this); | |||||
| onServicesDiscovered(mAddress); | |||||
| } | |||||
| @Override | |||||
| public void onServiceErr() { | |||||
| } | |||||
| @Override | |||||
| public void unbindServices() { | |||||
| if (mAILinkBleManager != null) { | |||||
| mAILinkBleManager.removeOnCallbackBle(this); | |||||
| mAILinkBleManager.disconnectAll(); | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public void onScanning(BleValueBean data) { | |||||
| BleLog.i(TAG, "MAC=" + mAddress + "||CID=" + data.getCid() + "||VID=" + data.getVid() + "||PID=" + data.getPid()); | |||||
| if (data.getMac().equalsIgnoreCase(mAddress)) { | |||||
| if (mAILinkBleManager != null) { | |||||
| mAILinkBleManager.stopScan(); | |||||
| mAILinkBleManager.connectDevice(data); | |||||
| } | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public void onDisConnected(String mac, int code) { | |||||
| if (mAddress.equalsIgnoreCase(mac)) { | |||||
| mList.add(0, "蓝牙已断开:" + mac); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public void onServicesDiscovered(String mac) { | |||||
| if (mAILinkBleManager == null) { | |||||
| return; | |||||
| } | |||||
| if (mAddress.equalsIgnoreCase(mac)) { | |||||
| mList.add(0, "蓝牙已连接"); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| mAILinkBleManager.setOnCallbackBle(this); | |||||
| BleDevice bleDevice = mAILinkBleManager.getBleDevice(mAddress); | |||||
| if (bleDevice != null) { | |||||
| ToothBrushWiFiBleUtilsData.init(bleDevice, this, this); | |||||
| mToothBrushWiFiBleUtilsData = ToothBrushWiFiBleUtilsData.getInstance(); | |||||
| mMHandler.sendEmptyMessageDelayed(TO_REQUEST_TOKEN, 600); | |||||
| mMHandler.sendEmptyMessageDelayed(GET_BATTERY, 800); | |||||
| } | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public void bleOpen() { | |||||
| if (mAILinkBleManager != null) { | |||||
| mAILinkBleManager.startScan(30000L); | |||||
| } | |||||
| mList.add(0, "蓝牙已开启,开始搜索连接"); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void bleClose() { | |||||
| mList.add(0, "蓝牙已关闭"); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void onBleAndWifiStatus(int bleStatus, int wifiStatus, int workStatus) { | |||||
| String show = "蓝牙状态:"; | |||||
| switch (wifiStatus) { | |||||
| case 0: | |||||
| show += "无连接"; | |||||
| break; | |||||
| case 1: | |||||
| show += "已连接"; | |||||
| break; | |||||
| case 2: | |||||
| show += "配对完成"; | |||||
| break; | |||||
| } | |||||
| show += " wifi状态:"; | |||||
| switch (wifiStatus) { | |||||
| case 0: | |||||
| show += "没连接热点"; | |||||
| break; | |||||
| case 1: | |||||
| show += "尝试连接热点,但是失败了"; | |||||
| break; | |||||
| case 2: | |||||
| show += "连接的热点无网络或者信号不好"; | |||||
| break; | |||||
| case 3: | |||||
| show += "成功连接上热点"; | |||||
| break; | |||||
| case 4: | |||||
| show += "有热点信息,还没连接"; | |||||
| break; | |||||
| } | |||||
| show += " 工作状态:"; | |||||
| switch (workStatus) { | |||||
| case 0: | |||||
| show += "唤醒"; | |||||
| break; | |||||
| case 1: | |||||
| show += "进入休眠"; | |||||
| break; | |||||
| case 2: | |||||
| show += "模块准备就绪"; | |||||
| break; | |||||
| } | |||||
| mList.add(0, show); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void onWifiScanStatus(int status) { | |||||
| mList.add(0, "扫描wifi状态: " + status); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void onConnectWifiName(String name) { | |||||
| mList.add(0, "当前连接wifi名称: " + name); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void onWifiScanBean(WifiBleInfoBean wifiBleInfoBean) { | |||||
| mList.add(0, "扫描到wifi: " + wifiBleInfoBean.toString()); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void onWifiScanFinish(List<WifiBleInfoBean> list) { | |||||
| mList.add(0, "扫描结束 扫描的wifi个数 " + list.size()); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| if (mWifiBleInfoBeanList == null) { | |||||
| mWifiBleInfoBeanList = new ArrayList<>(); | |||||
| } | |||||
| mWifiBleInfoBeanList.clear(); | |||||
| mWifiList.clear(); | |||||
| for (WifiBleInfoBean wifiBleInfoBean : list) { | |||||
| String ssid = wifiBleInfoBean.getSsid(); | |||||
| if (TextUtils.isEmpty(ssid)) { | |||||
| continue; | |||||
| } | |||||
| mWifiList.add(new DialogStringImageBean(ssid, wifiBleInfoBean.getType())); | |||||
| mWifiBleInfoBeanList.add(wifiBleInfoBean); | |||||
| } | |||||
| if (mShowListDialogFragment != null) { | |||||
| mShowListDialogFragment.setList(mWifiList); | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public void onSetWifiNameOrPwdOrConnectCallback(int type, int status) { | |||||
| if (type == CmdConfig.SET_WIFI_MAC) { | |||||
| mList.add(0, "获取到设置的mac地址状态 " + status); | |||||
| } | |||||
| if (type == CmdConfig.SET_WIFI_PWD) { | |||||
| mList.add(0, "获取到设置的密码状态 " + status); | |||||
| } | |||||
| if (type == CmdConfig.DIS_OR_CON_WIFI) { | |||||
| mList.add(0, "发起连接 " + status); | |||||
| } | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void onWifiConnecting(int status) { | |||||
| WifiBleDeviceData.OnWiFiBleCallback.super.onWifiConnecting(status); | |||||
| } | |||||
| @Override | |||||
| public void onConnectWifiMac(String mac) { | |||||
| mList.add(0, "获取到设置的wifi的mac地址 " + mac); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void onConnectWifiPwd(String pwd) { | |||||
| mList.add(0, "获取到设置的wifi的密码 " + pwd); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void onDeviceSn(long sn) { | |||||
| mList.add(0, "sn: " + sn); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void onServerIp(String ip) { | |||||
| mList.add(0, "ip: " + ip); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void onServerPort(int port) { | |||||
| mList.add(0, "port: " + port); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void onServerPath(String path) { | |||||
| mList.add(0, "path: " + path); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| /** | |||||
| * 关于服务器设置信息 | |||||
| * | |||||
| * @param status 状态 true 配置完成, false 配置失败 | |||||
| */ | |||||
| @Override | |||||
| public void onServerSettingInfo(boolean status) { | |||||
| mList.add(0, "服务器设置信息: " + (status ? "配置完成" : "配置失败")); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void onVersion(String version) { | |||||
| mList.add(0, "版本号:" + version); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void onGetSupportGears(List<Integer> staif, List<Integer> secondLevel) { | |||||
| mList.add(0, "牙刷支持的一级档位:" + Arrays.toString(staif.toArray()) + " 二级档位:" + Arrays.toString(secondLevel.toArray())); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void onGetBattery(int batteryStatus, int batteryQuantity) { | |||||
| mList.add(0, "电池状态:" + batteryStatus + " 电量:" + batteryQuantity); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void onGetDefaultGearAndDuration(int time, int gear, int gearFrom) { | |||||
| mList.add(0, "获得到默认的刷牙档位和时长:" + time + " 档位:" + gear + " 档位级别" + gearFrom); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void onGetTokenResult(int result) { | |||||
| String s = ""; | |||||
| if (result == ToothBrushBleCmd.NO_TOKEN) { | |||||
| s = "没有"; | |||||
| } else if (result == ToothBrushBleCmd.HAS_TOKEN) { | |||||
| s = "已经授权"; | |||||
| } else if (result == ToothBrushBleCmd.WITHOUT_TOKEN) { | |||||
| s = "不需要授权"; | |||||
| } else if (result == ToothBrushBleCmd.SUCCESSTOKEN) { | |||||
| s = "授权成功"; | |||||
| } | |||||
| mList.add(0, "请求授权结果" + result + " " + s); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void onGetManualParameter(int time, int hz, int duty) { | |||||
| mList.add(0, " 获取手动档位的参数: 时长" + time + " 频率" + hz + " 占空比" + duty); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void onSetDefaultModeAndManualModeResult(byte type, int result) { | |||||
| String s = ""; | |||||
| if (result == 0) { | |||||
| s = "设置成功"; | |||||
| } else if (result == 1) { | |||||
| s = "设置失败"; | |||||
| } else if (result == 2) { | |||||
| s = "不支持设置"; | |||||
| } | |||||
| if (type == ToothBrushBleCmd.SET_TOOTHBRUSH_TIME_GEARS) { | |||||
| mList.add(0, " 设置默认刷牙时长和工作档位: 结果" + result + " " + s); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } else { | |||||
| mList.add(0, " 设置手动设置(自定义)档位: 结果" + result + " " + s); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public void onTestFinish(int totalTime, int leftTime, int rightTime, int mode, int battery) { | |||||
| mList.add(0, "刷牙完成: 总时长:" + totalTime + " 左时长:" + leftTime + " 右时长:" + rightTime + " 模式:" + mode + " 电量:" + battery); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void onTryOutResult(int result) { | |||||
| mList.add(0, "设置使用结果:" + result + " ( 0:设置成功 1:设置失败,原因未知 2:不支持设置)"); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void onTwoLevelModeDefault(int mode) { | |||||
| mList.add(0, "获取二级档位默认值:" + mode); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void onOTA(int status) { | |||||
| String s = " "; | |||||
| switch (status) { | |||||
| case 0x00: | |||||
| s = "wifiOTA 成功"; | |||||
| break; | |||||
| case 0x01: | |||||
| s = "wifiOTA 失败"; | |||||
| break; | |||||
| case 0x02: | |||||
| s = "不支持 wifiOTA"; | |||||
| break; | |||||
| case 0x03: | |||||
| s = "模块主动开始 wifiOTA(MCU 收到该指 令后不能断电,需要等待 OTA 成功或者失败)"; | |||||
| break; | |||||
| } | |||||
| mList.add(0, s); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void onSetApiKey(boolean result) { | |||||
| addText("设置apikey结果:" + result); | |||||
| } | |||||
| @Override | |||||
| public void onGetApiKey(String apiKey) { | |||||
| addText("读取到API KEY:" + apiKey); | |||||
| } | |||||
| @Override | |||||
| public void onShowData(String data) { | |||||
| L.i(data); | |||||
| } | |||||
| private class MHandler extends Handler { | |||||
| @Override | |||||
| public void handleMessage(Message msg) { | |||||
| super.handleMessage(msg); | |||||
| switch (msg.what) { | |||||
| case TO_REFRESH_UI: | |||||
| if (listAdapter != null) { | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } | |||||
| break; | |||||
| case TO_REQUEST_TOKEN: | |||||
| mList.add(0, "请求授权"); | |||||
| mToothBrushWiFiBleUtilsData.requestToken(System.currentTimeMillis()); | |||||
| if (listAdapter != null) { | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } | |||||
| mToothBrushWiFiBleUtilsData.getDefaultGearAndDuration(); | |||||
| break; | |||||
| case GET_BATTERY: | |||||
| mToothBrushWiFiBleUtilsData.getBattery(); | |||||
| break; | |||||
| } | |||||
| } | |||||
| } | |||||
| // 添加一条文本 | |||||
| private void addText(String text) { | |||||
| SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss:SSS", Locale.US); | |||||
| mList.add(0, sdf.format(System.currentTimeMillis()) + ":\n" + text); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| private static final int FILE_SELECT_CODE = 0x1002; | |||||
| private void showFileChooser() { | |||||
| Intent intent = new Intent(Intent.ACTION_GET_CONTENT); | |||||
| intent.setType("*/*"); | |||||
| intent.addCategory(Intent.CATEGORY_OPENABLE); | |||||
| try { | |||||
| startActivityForResult(Intent.createChooser(intent, "Select a File to Upload"), FILE_SELECT_CODE); | |||||
| } catch (android.content.ActivityNotFoundException ex) { | |||||
| Toast.makeText(this, "Please install a File Manager.", Toast.LENGTH_SHORT).show(); | |||||
| } | |||||
| } | |||||
| @Override | |||||
| protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { | |||||
| super.onActivityResult(requestCode, resultCode, data); | |||||
| if (resultCode == RESULT_OK) { | |||||
| Uri uri = data.getData(); | |||||
| String path = uri.getPath(); | |||||
| mList.add(0, "ota准备就绪,请勿操作"); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| // initOtaUtil(this, uri, new OnBleOTAListener() { | |||||
| // @Override | |||||
| // public void onOtaSuccess() { | |||||
| // mList.add(0, "ota成功"); | |||||
| // listAdapter.notifyDataSetChanged(); | |||||
| // | |||||
| // } | |||||
| // | |||||
| // @Override | |||||
| // public void onOtaFailure(int cmd, String err) { | |||||
| // mList.add(0, "失败"); | |||||
| // listAdapter.notifyDataSetChanged(); | |||||
| // } | |||||
| // | |||||
| // private int mOldProgress = -1; | |||||
| // | |||||
| // @Override | |||||
| // public void onOtaProgress(float progress, int currentCount, int maxCount) { | |||||
| // if (mOldProgress != progress) { | |||||
| // mOldProgress = (int) progress; | |||||
| // mList.add(0, "otaProgress:" + progress); | |||||
| // listAdapter.notifyDataSetChanged(); | |||||
| // } | |||||
| // } | |||||
| // }, mToothBrushWiFiBleUtilsData.getBleDevice()); | |||||
| } else { | |||||
| } | |||||
| } | |||||
| // private OPLOtaManager mOPLOtaManager; | |||||
| // | |||||
| // public void initOtaUtil(Context context, Uri url, OnBleOTAListener listener, BleDevice bleDevice) { | |||||
| // mOPLOtaManager = null; | |||||
| // mOPLOtaManager = OPLOtaManager.newBuilder(context).setFileUri(url).setOnBleOTAListener(listener).build(bleDevice); | |||||
| // mOPLOtaManager.startOta(); | |||||
| // } | |||||
| } |
| import android.os.Bundle; | import android.os.Bundle; | ||||
| import android.os.Handler; | import android.os.Handler; | ||||
| import android.os.Message; | import android.os.Message; | ||||
| import android.text.TextUtils; | |||||
| import android.view.View; | import android.view.View; | ||||
| import android.widget.ArrayAdapter; | import android.widget.ArrayAdapter; | ||||
| import android.widget.EditText; | import android.widget.EditText; | ||||
| import com.pingwang.bluetoothlib.bean.BleValueBean; | import com.pingwang.bluetoothlib.bean.BleValueBean; | ||||
| import com.pingwang.bluetoothlib.config.CmdConfig; | import com.pingwang.bluetoothlib.config.CmdConfig; | ||||
| import com.pingwang.bluetoothlib.device.BleDevice; | import com.pingwang.bluetoothlib.device.BleDevice; | ||||
| import com.pingwang.bluetoothlib.device.wifibleDevice.WifiBleDeviceData; | |||||
| import com.pingwang.bluetoothlib.device.wifibleDevice.WifiBleInfoBean; | |||||
| import com.pingwang.bluetoothlib.listener.OnCallbackBle; | import com.pingwang.bluetoothlib.listener.OnCallbackBle; | ||||
| import com.pingwang.bluetoothlib.utils.BleLog; | import com.pingwang.bluetoothlib.utils.BleLog; | ||||
| import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||||
| import java.lang.ref.WeakReference; | import java.lang.ref.WeakReference; | ||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||
| import java.util.Arrays; | import java.util.Arrays; | ||||
| import java.util.HashMap; | |||||
| import java.util.List; | import java.util.List; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.WifiDialog; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.DialogStringImageBean; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.MoveDataDialogFragment; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.ShowListDialogFragment; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L; | import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.ToothBrushUtils; | import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.ToothBrushUtils; | ||||
| import cn.net.aicare.modulelibrary.module.ToothBrush.ToothBrushBleCmd; | import cn.net.aicare.modulelibrary.module.ToothBrush.ToothBrushBleCmd; | ||||
| import cn.net.aicare.modulelibrary.module.ToothBrush.ToothBrushWiFiBleUtilsData; | import cn.net.aicare.modulelibrary.module.ToothBrush.ToothBrushWiFiBleUtilsData; | ||||
| /** | /** | ||||
| * Wifi+ble 牙刷 | * Wifi+ble 牙刷 | ||||
| */ | */ | ||||
| public class ToothBrushWifiBleActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, ToothBrushWiFiBleUtilsData.BleToothBrushWiFiCallback, ToothBrushWiFiBleUtilsData.BleToothBrushCallback { | |||||
| private String TAG = ToothBrushWifiBleActivity.class.getName(); | |||||
| public class ToothBrushWifiOnOnBleActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, WifiBleDeviceData.OnWiFiBleCallback, ToothBrushWiFiBleUtilsData.OnBleToothBrushCallback { | |||||
| private String TAG = ToothBrushWifiOnOnBleActivity.class.getName(); | |||||
| private String mAddress; | private String mAddress; | ||||
| private List<String> mList; | private List<String> mList; | ||||
| private ArrayAdapter listAdapter; | private ArrayAdapter listAdapter; | ||||
| private ToothBrushWiFiBleUtilsData mToothBrushWiFiBleUtilsData; | private ToothBrushWiFiBleUtilsData mToothBrushWiFiBleUtilsData; | ||||
| private MHandler mMHandler; | private MHandler mMHandler; | ||||
| private EditText mEditText, select_gears_et, ed_score; | |||||
| private String dataPaw; | |||||
| private EditText select_gears_et, ed_score; | |||||
| private List<DialogStringImageBean> mWifiList = new ArrayList<>(); | |||||
| private List<WifiBleInfoBean> mWifiBleInfoBeanList = new ArrayList<>(); | |||||
| @Override | @Override | ||||
| protected void onCreate(@Nullable Bundle savedInstanceState) { | protected void onCreate(@Nullable Bundle savedInstanceState) { | ||||
| super.onCreate(savedInstanceState); | super.onCreate(savedInstanceState); | ||||
| setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//禁止横屏 | setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//禁止横屏 | ||||
| setContentView(R.layout.activity_tooth_brush_wifi_ble); | setContentView(R.layout.activity_tooth_brush_wifi_ble); | ||||
| findViewById(R.id.wifistatus).setOnClickListener(this); | |||||
| findViewById(R.id.sn).setOnClickListener(this); | |||||
| findViewById(R.id.scan_wifi).setOnClickListener(this); | |||||
| findViewById(R.id.connect_wifi).setOnClickListener(this); | |||||
| findViewById(R.id.disconnect).setOnClickListener(this); | |||||
| findViewById(R.id.setedname).setOnClickListener(this); | |||||
| findViewById(R.id.support_unit).setOnClickListener(this); | |||||
| findViewById(R.id.default_try_out).setOnClickListener(this); | |||||
| findViewById(R.id.default_time_mode).setOnClickListener(this); | |||||
| findViewById(R.id.default_mode).setOnClickListener(this); | |||||
| findViewById(R.id.getWifiStatus).setOnClickListener(this); | |||||
| findViewById(R.id.getSn).setOnClickListener(this); | |||||
| findViewById(R.id.scanWifi).setOnClickListener(this); | |||||
| findViewById(R.id.disconnectWifi).setOnClickListener(this); | |||||
| findViewById(R.id.getWifiName).setOnClickListener(this); | |||||
| findViewById(R.id.getSupportUnit).setOnClickListener(this); | |||||
| findViewById(R.id.defaultTryOut).setOnClickListener(this); | |||||
| findViewById(R.id.getTimeMode).setOnClickListener(this); | |||||
| findViewById(R.id.defaultMode).setOnClickListener(this); | |||||
| findViewById(R.id.ota).setOnClickListener(this); | findViewById(R.id.ota).setOnClickListener(this); | ||||
| findViewById(R.id.btn_score).setOnClickListener(this); | |||||
| findViewById(R.id.btnScore).setOnClickListener(this); | |||||
| mEditText = findViewById(R.id.select_wifi_et); | |||||
| select_gears_et = findViewById(R.id.select_gears_et); | |||||
| ed_score = findViewById(R.id.ed_score); | |||||
| select_gears_et = findViewById(R.id.etSelectGears); | |||||
| ed_score = findViewById(R.id.etScore); | |||||
| mAddress = getIntent().getStringExtra("mac"); | mAddress = getIntent().getStringExtra("mac"); | ||||
| mList = new ArrayList<>(); | mList = new ArrayList<>(); | ||||
| } | } | ||||
| @Override | |||||
| public void onClick(View v) { | |||||
| int id = v.getId(); | |||||
| if (mToothBrushWiFiBleUtilsData != null) { | |||||
| if (id == R.id.getWifiStatus) { | |||||
| mToothBrushWiFiBleUtilsData.getWifiCurrentState(); | |||||
| } else if (id == R.id.getSn) { | |||||
| mToothBrushWiFiBleUtilsData.getDeviceId(); | |||||
| } else if (id == R.id.scanWifi) { | |||||
| mToothBrushWiFiBleUtilsData.scanWifi(); | |||||
| mList.add(TimeUtils.getTime() + "正在扫描附近可用的wifi..."); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| showWifiList(); | |||||
| } else if (id == R.id.getWifiName) { | |||||
| mToothBrushWiFiBleUtilsData.getConnectWifiName(); | |||||
| } else if (id == R.id.disconnectWifi) { | |||||
| mToothBrushWiFiBleUtilsData.disconnectWifi(); | |||||
| } else if (id == R.id.getSupportUnit) { | |||||
| mToothBrushWiFiBleUtilsData.getSupportGears(); | |||||
| } else if (id == R.id.defaultMode) { | |||||
| String gear = select_gears_et.getText().toString().trim(); | |||||
| if (!gear.isEmpty()) { | |||||
| String[] gears = null; | |||||
| if (gear.contains(",")) { | |||||
| gears = gear.split(","); | |||||
| } else if (gear.contains(",")) { | |||||
| gears = gear.split(","); | |||||
| } else { | |||||
| Toast.makeText(this, "请输入时长,档位,档位级别(数字加符号)", Toast.LENGTH_SHORT).show(); | |||||
| } | |||||
| if (gears != null) { | |||||
| try { | |||||
| mToothBrushWiFiBleUtilsData.setDefault(Integer.parseInt(gears[0]), Integer.parseInt(gears[1]), Integer.parseInt(gears[2])); | |||||
| } catch (NumberFormatException e) { | |||||
| e.printStackTrace(); | |||||
| Toast.makeText(this, "请输入时长,档位,档位级别(数字加符号)", Toast.LENGTH_SHORT).show(); | |||||
| } | |||||
| } | |||||
| } | |||||
| } else if (id == R.id.defaultTryOut) { | |||||
| String gear1 = select_gears_et.getText().toString().trim(); | |||||
| if (!gear1.isEmpty()) { | |||||
| String[] gears = null; | |||||
| if (gear1.contains(",")) { | |||||
| gears = gear1.split(","); | |||||
| } else if (gear1.contains(",")) { | |||||
| gears = gear1.split(","); | |||||
| } else { | |||||
| Toast.makeText(this, "请输入时长,档位,档位级别(数字加符号)", Toast.LENGTH_SHORT).show(); | |||||
| } | |||||
| if (gears != null) { | |||||
| try { | |||||
| mToothBrushWiFiBleUtilsData.setTryOut(Integer.parseInt(gears[1]), Integer.parseInt(gears[2]), 0, 0); | |||||
| } catch (NumberFormatException e) { | |||||
| e.printStackTrace(); | |||||
| Toast.makeText(this, "请输入时长,档位,档位级别(数字加符号)", Toast.LENGTH_SHORT).show(); | |||||
| } | |||||
| } | |||||
| } | |||||
| } else if (id == R.id.getTimeMode) { | |||||
| mToothBrushWiFiBleUtilsData.getDefaultGearAndDuration(); | |||||
| } else if (id == R.id.ota) { | |||||
| showFileChooser(); | |||||
| // mToothBrushWiFiBleUtilsData.setOta(); | |||||
| } | |||||
| } | |||||
| if (v.getId() == R.id.btnScore) { | |||||
| try { | |||||
| String[] time = ed_score.getText().toString().trim().split(","); | |||||
| int defaultTime = Integer.parseInt(time[0]); | |||||
| int useTime = Integer.parseInt(time[1]); | |||||
| int lTime = Integer.parseInt(time[2]); | |||||
| int rTime = Integer.parseInt(time[3]); | |||||
| ToothBrushUtils toothBrushUtils = new ToothBrushUtils(); | |||||
| int grade = toothBrushUtils.getGrade(defaultTime, useTime, lTime, rTime); | |||||
| int avg = toothBrushUtils.getAvgGrade(defaultTime, lTime, rTime); | |||||
| int rang = toothBrushUtils.getRangeGrade(defaultTime, lTime, rTime); | |||||
| int duration = toothBrushUtils.getDurationGrade(defaultTime, useTime); | |||||
| mList.add(0, grade + " 均匀度: " + avg + " 范围:" + rang + " 刷牙时长:" + duration); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } catch (Exception e) { | |||||
| mList.add(0, "出错了 请按 默认时长,刷牙时长,左时长,右时长.输入单位是秒"); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| e.printStackTrace(); | |||||
| } | |||||
| } | |||||
| } | |||||
| private ShowListDialogFragment mShowListDialogFragment; | |||||
| private void showWifiList() { | |||||
| if (mShowListDialogFragment == null) { | |||||
| mShowListDialogFragment = ShowListDialogFragment.newInstance(); | |||||
| mShowListDialogFragment.setList(mWifiList); | |||||
| mShowListDialogFragment.setTitle("选择WIFI"); | |||||
| mShowListDialogFragment.setCancel("取消", 0); | |||||
| mShowListDialogFragment.setOnDialogListener(new ShowListDialogFragment.onDialogListener() { | |||||
| @Override | |||||
| public void onItemListener(int position) { | |||||
| WifiBleInfoBean wifiBleInfoBean = mWifiBleInfoBeanList.get(position); | |||||
| String ssid = wifiBleInfoBean.getSsid(); | |||||
| MoveDataDialogFragment.newInstance() | |||||
| .setTitle(ssid, "") | |||||
| .setContent("", "请输入密码", MoveDataDialogFragment.NAME) | |||||
| .setOk("OK", 0) | |||||
| .setCancel("取消", 0) | |||||
| .setOnDialogListener(new MoveDataDialogFragment.OnDialogListener() { | |||||
| @Override | |||||
| public void onSucceedListener(View v, String data) { | |||||
| String pwd = data.trim(); | |||||
| setConnectWifi(wifiBleInfoBean.getMac(), pwd); | |||||
| } | |||||
| }) | |||||
| .show(getSupportFragmentManager()); | |||||
| } | |||||
| @Override | |||||
| public void onCancelListener(View v) { | |||||
| } | |||||
| }); | |||||
| } | |||||
| mShowListDialogFragment.show(getSupportFragmentManager()); | |||||
| } | |||||
| /** | |||||
| * 设置连接wifi | |||||
| * | |||||
| * @param mac mac | |||||
| * @param pwd 密码 | |||||
| */ | |||||
| private void setConnectWifi(String mac, String pwd) { | |||||
| if (mToothBrushWiFiBleUtilsData != null) { | |||||
| mToothBrushWiFiBleUtilsData.setConnectWifiMac(mac, pwd); | |||||
| mList.add(TimeUtils.getTime() + "正在连接wifi..."); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| } | |||||
| @Override | @Override | ||||
| public void onServiceSuccess() { | public void onServiceSuccess() { | ||||
| //与服务建立连接 | //与服务建立连接 | ||||
| mList.add(0, "服务与界面建立连接成功"); | mList.add(0, "服务与界面建立连接成功"); | ||||
| // mList.add(0, "搜索设备"); | // mList.add(0, "搜索设备"); | ||||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| mAILinkBleManager.setOnCallbackBle(this); | mAILinkBleManager.setOnCallbackBle(this); | ||||
| mAILinkBleManager.startScan(30 * 1000); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @Override | |||||
| public void onStartScan() { | |||||
| } | |||||
| @Override | @Override | ||||
| public void onScanning(BleValueBean data) { | public void onScanning(BleValueBean data) { | ||||
| if (data.getMac().equalsIgnoreCase(mAddress)) { | if (data.getMac().equalsIgnoreCase(mAddress)) { | ||||
| if (mAILinkBleManager != null) { | if (mAILinkBleManager != null) { | ||||
| mAILinkBleManager.stopScan(); | mAILinkBleManager.stopScan(); | ||||
| mAILinkBleManager.connectDevice(data.getMac()); | |||||
| mAILinkBleManager.connectDevice(data); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @Override | |||||
| public void onScanTimeOut() { | |||||
| } | |||||
| @Override | |||||
| public void onConnecting(String mac) { | |||||
| } | |||||
| @Override | @Override | ||||
| public void onDisConnected(String mac, int code) { | public void onDisConnected(String mac, int code) { | ||||
| mList.add(0, "蓝牙已断开"); | |||||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||||
| if (mAddress.equalsIgnoreCase(mac)) { | |||||
| mList.add(0, "蓝牙已断开:" + mac); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| } | } | ||||
| @Override | @Override | ||||
| public void onServicesDiscovered(String mac) { | public void onServicesDiscovered(String mac) { | ||||
| mList.add(0, "蓝牙已连接"); | |||||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||||
| mAILinkBleManager.setOnCallbackBle(this); | |||||
| BleDevice bleDevice = mAILinkBleManager.getBleDevice(mAddress); | |||||
| if (bleDevice != null) { | |||||
| ToothBrushWiFiBleUtilsData.init(bleDevice, this, this); | |||||
| mToothBrushWiFiBleUtilsData = ToothBrushWiFiBleUtilsData.getInstance(); | |||||
| mMHandler.sendEmptyMessageDelayed(ToRequestToken, 600); | |||||
| mMHandler.sendEmptyMessageDelayed(GETBATTERY, 800); | |||||
| if (mAddress.equalsIgnoreCase(mac)) { | |||||
| mList.add(0, "蓝牙已连接"); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| BleDevice bleDevice = mAILinkBleManager.getBleDevice(mAddress); | |||||
| if (bleDevice != null) { | |||||
| ToothBrushWiFiBleUtilsData.init(bleDevice, this, this); | |||||
| mToothBrushWiFiBleUtilsData = ToothBrushWiFiBleUtilsData.getInstance(); | |||||
| mMHandler.sendEmptyMessageDelayed(TO_REQUEST_TOKEN, 600); | |||||
| mMHandler.sendEmptyMessageDelayed(GET_BATTERY, 800); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @Override | @Override | ||||
| public void bleOpen() { | public void bleOpen() { | ||||
| if (mAILinkBleManager != null) { | |||||
| mAILinkBleManager.startScan(30000L); | |||||
| } | |||||
| mList.add(0, "蓝牙已开启,开始搜索连接"); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | } | ||||
| @Override | @Override | ||||
| public void bleClose() { | public void bleClose() { | ||||
| mList.add(0, "蓝牙已关闭"); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | } | ||||
| @Override | @Override | ||||
| public void OnBleAndWifiStatus(int blestatus, int wifistatus, int workstatus) { | |||||
| BleLog.e(TAG, "蓝牙状态:" + blestatus + " wifi状态:" + " 工作状态:" + workstatus); | |||||
| mList.add(0, "蓝牙状态:" + blestatus + " wifi状态:" + wifistatus + " 工作状态:" + workstatus); | |||||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||||
| public void onBleAndWifiStatus(int bleStatus, int wifiStatus, int workStatus) { | |||||
| BleLog.e(TAG, "蓝牙状态:" + bleStatus + " wifi状态:" + wifiStatus + " 工作状态:" + workStatus); | |||||
| mList.add(0, "蓝牙状态:" + bleStatus + " wifi状态:" + wifiStatus + " 工作状态:" + workStatus); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | } | ||||
| @Override | @Override | ||||
| public void OnWifiScanStatus(int Status) { | |||||
| mList.add(0, "扫描wifi状态: " + Status); | |||||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||||
| public void onWifiScanStatus(int status) { | |||||
| mList.add(0, "扫描wifi状态: " + status); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | } | ||||
| private HashMap<Integer, String> mHashMap = new HashMap(); | |||||
| @Override | @Override | ||||
| public void OnWifiListName(int no, String name) { | |||||
| mHashMap.put(no, name); | |||||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||||
| public void onConnectWifiName(String name) { | |||||
| mList.add(0, "当前连接wifi名称: " + name); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | } | ||||
| private HashMap<Integer, String> wifimacMap = new HashMap(); | |||||
| @Override | |||||
| public void OnWifiListInfo(int no, String mac, int db, int type, int wifistatus) { | |||||
| wifimacMap.put(no, mac); | |||||
| mList.add(0, "WIFI序号: " + no + " WIFI名称:" + mHashMap.get(no) + " WIFImac: " + mac + " db: " + db + " type: " + type + " wifistata" + wifistatus); | |||||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||||
| } | |||||
| @Override | @Override | ||||
| public void OnWifiCurrentConnect(String name) { | |||||
| mList.add(0, "当前连接wifi名称: " + name); | |||||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||||
| public void onWifiScanBean(WifiBleInfoBean wifiBleInfoBean) { | |||||
| mList.add(0, "扫描到wifi: " + wifiBleInfoBean.toString()); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | } | ||||
| @Override | @Override | ||||
| public void OnWifiScanFinish(int wifiNum) { | |||||
| mList.add(0, "扫描结束 扫描的wifi个数 " + wifiNum); | |||||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||||
| public void onWifiScanFinish(List<WifiBleInfoBean> list) { | |||||
| mList.add(0, "扫描结束 扫描的wifi个数 " + list.size()); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| if (mWifiBleInfoBeanList == null) { | |||||
| mWifiBleInfoBeanList = new ArrayList<>(); | |||||
| } | |||||
| mWifiBleInfoBeanList.clear(); | |||||
| mWifiList.clear(); | |||||
| for (WifiBleInfoBean wifiBleInfoBean : list) { | |||||
| String ssid = wifiBleInfoBean.getSsid(); | |||||
| if (TextUtils.isEmpty(ssid)) { | |||||
| continue; | |||||
| } | |||||
| mWifiList.add(new DialogStringImageBean(ssid, wifiBleInfoBean.getType())); | |||||
| mWifiBleInfoBeanList.add(wifiBleInfoBean); | |||||
| } | |||||
| if (mShowListDialogFragment != null) { | |||||
| mShowListDialogFragment.setList(mWifiList); | |||||
| } | |||||
| } | } | ||||
| private boolean issetMac = false; | |||||
| /** | |||||
| * @param type {@link CmdConfig#SET_WIFI_MAC} | |||||
| * @param status {@link ToothBrushBleCmd#STATUS_SUCCESS} | |||||
| */ | |||||
| @Override | @Override | ||||
| public void OnSetWifiNameOrPwdOrConnectCallback(int type, int status) { | |||||
| public void onSetWifiNameOrPwdOrConnectCallback(int type, int status) { | |||||
| if (type == CmdConfig.SET_WIFI_MAC) { | if (type == CmdConfig.SET_WIFI_MAC) { | ||||
| mList.add(0, "获取到设置的mac地址状态 " + status); | mList.add(0, "获取到设置的mac地址状态 " + status); | ||||
| if (status == ToothBrushBleCmd.STATUS_SUCCESS) { | |||||
| issetMac = true; | |||||
| setPaw(dataPaw); | |||||
| } | |||||
| } | } | ||||
| if (type == CmdConfig.SET_WIFI_PWD) { | if (type == CmdConfig.SET_WIFI_PWD) { | ||||
| mList.add(0, "获取到设置的密码状态 " + status); | mList.add(0, "获取到设置的密码状态 " + status); | ||||
| if (status == ToothBrushBleCmd.STATUS_SUCCESS && issetMac) { | |||||
| mMHandler.sendEmptyMessage(ConnectWifi); | |||||
| } | |||||
| } | } | ||||
| if (type == CmdConfig.DIS_OR_CON_WIFI) { | if (type == CmdConfig.DIS_OR_CON_WIFI) { | ||||
| mList.add(0, "发起连接 " + status); | mList.add(0, "发起连接 " + status); | ||||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||||
| } | } | ||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void onWifiConnecting(int status) { | |||||
| WifiBleDeviceData.OnWiFiBleCallback.super.onWifiConnecting(status); | |||||
| } | } | ||||
| @Override | @Override | ||||
| public void getSelectWifiMac(String mac) { | |||||
| public void onConnectWifiMac(String mac) { | |||||
| mList.add(0, "获取到设置的wifi的mac地址 " + mac); | mList.add(0, "获取到设置的wifi的mac地址 " + mac); | ||||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | } | ||||
| @Override | @Override | ||||
| public void getSelectWifiPaw(String paw) { | |||||
| mList.add(0, "获取到设置的wifi的密码 " + paw); | |||||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||||
| public void onConnectWifiPwd(String pwd) { | |||||
| mList.add(0, "获取到设置的wifi的密码 " + pwd); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | } | ||||
| @Override | @Override | ||||
| public void getDid(long sn) { | |||||
| public void onDeviceSn(long sn) { | |||||
| mList.add(0, "sn: " + sn); | mList.add(0, "sn: " + sn); | ||||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | } | ||||
| @Override | @Override | ||||
| public void onClick(View v) { | |||||
| int id = v.getId(); | |||||
| if (mToothBrushWiFiBleUtilsData != null) { | |||||
| switch (id) { | |||||
| case R.id.wifistatus: | |||||
| mToothBrushWiFiBleUtilsData.queryBleStatus(); | |||||
| break; | |||||
| case R.id.sn: | |||||
| mToothBrushWiFiBleUtilsData.getDevicedid(); | |||||
| break; | |||||
| case R.id.scan_wifi: | |||||
| mToothBrushWiFiBleUtilsData.scanWifi(); | |||||
| break; | |||||
| case R.id.connect_wifi: | |||||
| try { | |||||
| int selectWifi = Integer.valueOf(mEditText.getText().toString().trim()); | |||||
| if (mHashMap.get(selectWifi) != null && wifimacMap.get(selectWifi) != null) { | |||||
| WifiDialog.newInstance().setTitle(mHashMap.get(selectWifi), wifimacMap.get(selectWifi)).setOnDialogListener(new WifiDialog.OnDialogListener() { | |||||
| @Override | |||||
| public void tvCancelListener(View v) { | |||||
| } | |||||
| @Override | |||||
| public void tvSucceedListener(View v, String data) { | |||||
| if (data.equals("") || data.length() > 8) { | |||||
| dataPaw = data.trim(); | |||||
| mToothBrushWiFiBleUtilsData.setWifiMac(wifimacMap.get(selectWifi)); | |||||
| } else { | |||||
| Toast.makeText(ToothBrushWifiBleActivity.this, "密码格式不对", Toast.LENGTH_SHORT).show(); | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public void etModifyName(EditText v) { | |||||
| } | |||||
| }).show(getSupportFragmentManager()); | |||||
| } | |||||
| } catch (NumberFormatException e) { | |||||
| e.printStackTrace(); | |||||
| mMHandler.sendEmptyMessage(ConnectWifi); | |||||
| } | |||||
| break; | |||||
| case R.id.setedname: | |||||
| mToothBrushWiFiBleUtilsData.getConnectWifiName(); | |||||
| break; | |||||
| case R.id.disconnect: | |||||
| mToothBrushWiFiBleUtilsData.disconnectWifi(); | |||||
| break; | |||||
| case R.id.support_unit: | |||||
| mToothBrushWiFiBleUtilsData.getSupportGears(); | |||||
| break; | |||||
| case R.id.default_mode: | |||||
| String gear = select_gears_et.getText().toString().trim(); | |||||
| if (!gear.isEmpty()) { | |||||
| String[] gears = null; | |||||
| if (gear.contains(",")) { | |||||
| gears = gear.split(","); | |||||
| } else if (gear.contains(",")) { | |||||
| gears = gear.split(","); | |||||
| } else { | |||||
| Toast.makeText(this, "请输入时长,档位,档位级别(数字加符号)", Toast.LENGTH_SHORT).show(); | |||||
| } | |||||
| if (gears != null) { | |||||
| try { | |||||
| mToothBrushWiFiBleUtilsData.setDefault(Integer.parseInt(gears[0]), Integer.parseInt(gears[1]), Integer.parseInt(gears[2])); | |||||
| } catch (NumberFormatException e) { | |||||
| e.printStackTrace(); | |||||
| Toast.makeText(this, "请输入时长,档位,档位级别(数字加符号)", Toast.LENGTH_SHORT).show(); | |||||
| } | |||||
| } | |||||
| } | |||||
| break; | |||||
| case R.id.default_try_out: | |||||
| String gear1 = select_gears_et.getText().toString().trim(); | |||||
| if (!gear1.isEmpty()) { | |||||
| String[] gears = null; | |||||
| if (gear1.contains(",")) { | |||||
| gears = gear1.split(","); | |||||
| } else if (gear1.contains(",")) { | |||||
| gears = gear1.split(","); | |||||
| } else { | |||||
| Toast.makeText(this, "请输入时长,档位,档位级别(数字加符号)", Toast.LENGTH_SHORT).show(); | |||||
| } | |||||
| if (gears != null) { | |||||
| try { | |||||
| mToothBrushWiFiBleUtilsData.setTryOut(Integer.parseInt(gears[1]), Integer.parseInt(gears[2]), 0, 0); | |||||
| } catch (NumberFormatException e) { | |||||
| e.printStackTrace(); | |||||
| Toast.makeText(this, "请输入时长,档位,档位级别(数字加符号)", Toast.LENGTH_SHORT).show(); | |||||
| } | |||||
| } | |||||
| } | |||||
| break; | |||||
| case R.id.default_time_mode: | |||||
| mToothBrushWiFiBleUtilsData.getDefaultGearAndDuration(); | |||||
| break; | |||||
| case R.id.ota: | |||||
| showFileChooser(); | |||||
| // mToothBrushWiFiBleUtilsData.setOta(); | |||||
| break; | |||||
| default: | |||||
| public void onServerIp(String ip) { | |||||
| mList.add(0, "ip: " + ip); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| break; | |||||
| } | |||||
| } | |||||
| if (v.getId() == R.id.btn_score) { | |||||
| try { | |||||
| String[] time = ed_score.getText().toString().trim().split(","); | |||||
| int defaultTime = Integer.parseInt(time[0]); | |||||
| int useTime = Integer.parseInt(time[1]); | |||||
| int lTime = Integer.parseInt(time[2]); | |||||
| int rTime = Integer.parseInt(time[3]); | |||||
| ToothBrushUtils toothBrushUtils = new ToothBrushUtils(); | |||||
| int grade = toothBrushUtils.getGrade(defaultTime, useTime, lTime, rTime); | |||||
| int avg = toothBrushUtils.getAvgGrade(defaultTime, lTime, rTime); | |||||
| int rang = toothBrushUtils.getRangeGrade(defaultTime, lTime, rTime); | |||||
| int duration = toothBrushUtils.getDurationGrade(defaultTime, useTime); | |||||
| mList.add(0, grade + " 均匀度: " + avg + " 范围:" + rang + " 刷牙时长:" + duration); | |||||
| @Override | |||||
| public void onServerPort(int port) { | |||||
| mList.add(0, "port: " + port); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||||
| } catch (Exception e) { | |||||
| @Override | |||||
| public void onServerPath(String path) { | |||||
| mList.add(0, "path: " + path); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| mList.add(0, "出错了 请按 默认时长,刷牙时长,左时长,右时长.输入单位是秒"); | |||||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||||
| e.printStackTrace(); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * 关于服务器设置信息 | |||||
| * | |||||
| * @param status 状态 true 配置完成, false 配置失败 | |||||
| */ | |||||
| @Override | |||||
| public void onServerSettingInfo(boolean status) { | |||||
| mList.add(0, "服务器设置信息: " + (status ? "配置完成" : "配置失败")); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | } | ||||
| private final int ToRefreUi = 300; | |||||
| private final int ConnectWifi = 400; | |||||
| private final int ToRequestToken = 500; | |||||
| private final int GETBATTERY = 600; | |||||
| private final int TO_REFRESH_UI = 300; | |||||
| private final int CONNECT_WIFI = 400; | |||||
| private final int TO_REQUEST_TOKEN = 500; | |||||
| private final int GET_BATTERY = 600; | |||||
| @Override | @Override | ||||
| public void onVersion(String version) { | public void onVersion(String version) { | ||||
| mList.add(0, "版本号:" + version); | mList.add(0, "版本号:" + version); | ||||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | } | ||||
| @Override | @Override | ||||
| public void onGetSupportGears(List<Integer> staif, List<Integer> secondLevel) { | public void onGetSupportGears(List<Integer> staif, List<Integer> secondLevel) { | ||||
| mList.add(0, "牙刷支持的一级档位:" + Arrays.toString(staif.toArray()) + " 二级档位:" + Arrays.toString(secondLevel.toArray())); | mList.add(0, "牙刷支持的一级档位:" + Arrays.toString(staif.toArray()) + " 二级档位:" + Arrays.toString(secondLevel.toArray())); | ||||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | } | ||||
| @Override | @Override | ||||
| public void onGetBattery(int batteryStatus, int batteryQuantity) { | public void onGetBattery(int batteryStatus, int batteryQuantity) { | ||||
| mList.add(0, "电池状态:" + batteryStatus + " 电量:" + batteryQuantity); | mList.add(0, "电池状态:" + batteryStatus + " 电量:" + batteryQuantity); | ||||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | } | ||||
| @Override | @Override | ||||
| public void onGetDefaultGearAndDuration(int time, int gear, int gearFrom) { | public void onGetDefaultGearAndDuration(int time, int gear, int gearFrom) { | ||||
| mList.add(0, "获得到默认的刷牙档位和时长:" + time + " 档位:" + gear + " 档位级别" + gearFrom); | mList.add(0, "获得到默认的刷牙档位和时长:" + time + " 档位:" + gear + " 档位级别" + gearFrom); | ||||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | } | ||||
| @Override | @Override | ||||
| s = "授权成功"; | s = "授权成功"; | ||||
| } | } | ||||
| mList.add(0, "请求授权结果" + result + " " + s); | mList.add(0, "请求授权结果" + result + " " + s); | ||||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | } | ||||
| @Override | @Override | ||||
| public void onGetManualParameter(int time, int hz, int duty) { | public void onGetManualParameter(int time, int hz, int duty) { | ||||
| mList.add(0, " 获取手动档位的参数: 时长" + time + " 频率" + hz + " 占空比" + duty); | mList.add(0, " 获取手动档位的参数: 时长" + time + " 频率" + hz + " 占空比" + duty); | ||||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | } | ||||
| @Override | @Override | ||||
| } | } | ||||
| if (type == ToothBrushBleCmd.SET_TOOTHBRUSH_TIME_GEARS) { | if (type == ToothBrushBleCmd.SET_TOOTHBRUSH_TIME_GEARS) { | ||||
| mList.add(0, " 设置默认刷牙时长和工作档位: 结果" + result + " " + s); | mList.add(0, " 设置默认刷牙时长和工作档位: 结果" + result + " " + s); | ||||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } else { | } else { | ||||
| mList.add(0, " 设置手动设置(自定义)档位: 结果" + result + " " + s); | mList.add(0, " 设置手动设置(自定义)档位: 结果" + result + " " + s); | ||||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | } | ||||
| } | } | ||||
| @Override | @Override | ||||
| public void onTestFinish(int totalTime, int leftTime, int rightTime, int mode, int battery) { | public void onTestFinish(int totalTime, int leftTime, int rightTime, int mode, int battery) { | ||||
| mList.add(0, "刷牙完成: 总时长:" + totalTime + " 左时长:" + leftTime + " 右时长:" + rightTime + " 模式:" + mode + " 电量:" + battery); | mList.add(0, "刷牙完成: 总时长:" + totalTime + " 左时长:" + leftTime + " 右时长:" + rightTime + " 模式:" + mode + " 电量:" + battery); | ||||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | } | ||||
| @Override | @Override | ||||
| public void onTryOutResult(int result) { | public void onTryOutResult(int result) { | ||||
| mList.add(0, "设置使用结果:" + result + " ( 0:设置成功 1:设置失败,原因未知 2:不支持设置)"); | mList.add(0, "设置使用结果:" + result + " ( 0:设置成功 1:设置失败,原因未知 2:不支持设置)"); | ||||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | } | ||||
| @Override | @Override | ||||
| public void onTwoLevelModeDefault(int mode) { | public void onTwoLevelModeDefault(int mode) { | ||||
| mList.add(0, "获取二级档位默认值:" + mode); | mList.add(0, "获取二级档位默认值:" + mode); | ||||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | } | ||||
| break; | break; | ||||
| } | } | ||||
| mList.add(0, s); | mList.add(0, s); | ||||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||||
| } | |||||
| @Override | |||||
| public void onGetApiKey(String apiKey) { | |||||
| ToothBrushWiFiBleUtilsData.OnBleToothBrushCallback.super.onGetApiKey(apiKey); | |||||
| } | |||||
| @Override | |||||
| public void onSetApiKey(boolean result) { | |||||
| ToothBrushWiFiBleUtilsData.OnBleToothBrushCallback.super.onSetApiKey(result); | |||||
| } | } | ||||
| @Override | @Override | ||||
| public void handleMessage(Message msg) { | public void handleMessage(Message msg) { | ||||
| super.handleMessage(msg); | super.handleMessage(msg); | ||||
| switch (msg.what) { | switch (msg.what) { | ||||
| case ToRefreUi: | |||||
| case TO_REFRESH_UI: | |||||
| if (listAdapter != null) { | if (listAdapter != null) { | ||||
| listAdapter.notifyDataSetChanged(); | listAdapter.notifyDataSetChanged(); | ||||
| } | } | ||||
| break; | break; | ||||
| case ConnectWifi: | |||||
| mToothBrushWiFiBleUtilsData.connectWifi(); | |||||
| case CONNECT_WIFI: | |||||
| mToothBrushWiFiBleUtilsData.setConnectWifi(); | |||||
| break; | break; | ||||
| case ToRequestToken: | |||||
| case TO_REQUEST_TOKEN: | |||||
| mList.add(0, "请求授权"); | mList.add(0, "请求授权"); | ||||
| mToothBrushWiFiBleUtilsData.requestToken(System.currentTimeMillis()); | mToothBrushWiFiBleUtilsData.requestToken(System.currentTimeMillis()); | ||||
| if (listAdapter != null) { | if (listAdapter != null) { | ||||
| } | } | ||||
| mToothBrushWiFiBleUtilsData.getDefaultGearAndDuration(); | mToothBrushWiFiBleUtilsData.getDefaultGearAndDuration(); | ||||
| break; | break; | ||||
| case GETBATTERY: | |||||
| case GET_BATTERY: | |||||
| mToothBrushWiFiBleUtilsData.getBattery(); | mToothBrushWiFiBleUtilsData.getBattery(); | ||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| /** | |||||
| * wifi密码一次只能传14个byte | |||||
| * 如果密码长度超过14个byte 就需要分包传送 | |||||
| * subpackage 为0 时,表示后面还有数据 | |||||
| * subpackage 为1 时,表示数据小于或等于14个byte,后面没有数据 | |||||
| * | |||||
| * @param paw | |||||
| */ | |||||
| private void setPaw(String paw) { | |||||
| if (paw.isEmpty()) { | |||||
| byte[] bytes = new byte[0]; | |||||
| mToothBrushWiFiBleUtilsData.setWifiPwd(0, bytes); | |||||
| } else { | |||||
| byte[] password = BleStrUtils.stringToBytes(paw); | |||||
| if (password != null) { | |||||
| if (password.length < 14) { | |||||
| mToothBrushWiFiBleUtilsData.setWifiPwd(0, password); | |||||
| } else { | |||||
| boolean isend = false; | |||||
| int i = 0; | |||||
| byte[] byte1 = password; | |||||
| while (!isend) { | |||||
| if (byte1.length > 14) { | |||||
| byte[] bytes = new byte[14]; | |||||
| System.arraycopy(password, i, bytes, 0, bytes.length); | |||||
| mToothBrushWiFiBleUtilsData.setWifiPwd(1, bytes); | |||||
| i = i + 14; | |||||
| byte1 = Arrays.copyOf(password, password.length - i); | |||||
| } else { | |||||
| isend = true; | |||||
| byte[] bytes = new byte[password.length - i]; | |||||
| System.arraycopy(password, i, bytes, 0, bytes.length); | |||||
| mToothBrushWiFiBleUtilsData.setWifiPwd(1, bytes); | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| private static final int FILE_SELECT_CODE = 0x1002; | private static final int FILE_SELECT_CODE = 0x1002; | ||||
| private void showFileChooser() { | private void showFileChooser() { | ||||
| // | // | ||||
| // public void initOtaUtil(Context context, Uri url, OnBleOTAListener listener, BleDevice bleDevice) { | // public void initOtaUtil(Context context, Uri url, OnBleOTAListener listener, BleDevice bleDevice) { | ||||
| // mOPLOtaManager = null; | // mOPLOtaManager = null; | ||||
| // mOPLOtaManager = OPLOtaManager.newBuilder(context).setFilePath(url).setOnBleOTAListener(listener).build(bleDevice); | |||||
| // mOPLOtaManager = OPLOtaManager.newBuilder(context).setFileUri(url).setOnBleOTAListener(listener).build(bleDevice); | |||||
| // mOPLOtaManager.startOta(); | // mOPLOtaManager.startOta(); | ||||
| // } | // } | ||||
| addText("版本号:" + version); | addText("版本号:" + version); | ||||
| } | } | ||||
| // /** | |||||
| // * 请求同步时间 | |||||
| // * | |||||
| // * @param quest 1-请求同步时间 | |||||
| // */ | |||||
| /** | |||||
| * 请求同步时间 | |||||
| * | |||||
| * @param quest 1-请求同步时间 | |||||
| */ | |||||
| // @Override | // @Override | ||||
| // public void onSyncTime(int quest) { | // public void onSyncTime(int quest) { | ||||
| // if (quest == 1) { | // if (quest == 1) { |
| import com.pingwang.bluetoothlib.config.CmdConfig; | import com.pingwang.bluetoothlib.config.CmdConfig; | ||||
| import com.pingwang.bluetoothlib.device.BleDevice; | import com.pingwang.bluetoothlib.device.BleDevice; | ||||
| import com.pingwang.bluetoothlib.device.wifibleDevice.WifiBleDeviceData; | |||||
| import com.pingwang.bluetoothlib.device.wifibleDevice.WifiBleInfoBean; | |||||
| import com.pingwang.bluetoothlib.listener.OnCallbackBle; | import com.pingwang.bluetoothlib.listener.OnCallbackBle; | ||||
| import com.pingwang.bluetoothlib.utils.BleLog; | import com.pingwang.bluetoothlib.utils.BleLog; | ||||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatBleUtilsData; | import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatBleUtilsData; | ||||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatDataUtil; | import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatDataUtil; | ||||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatRecord; | import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatRecord; | ||||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatUserBean; | |||||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.McuHistoryRecordBean; | import cn.net.aicare.modulelibrary.module.BodyFatScale.McuHistoryRecordBean; | ||||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.User; | |||||
| import cn.net.aicare.modulelibrary.module.wifibleDevice.WifiBleDeviceData; | |||||
| import cn.net.aicare.modulelibrary.module.wifibleDevice.WifiBleInfoBean; | |||||
| /** | /** | ||||
| * wifi+ble体脂秤 | * wifi+ble体脂秤 | ||||
| private ActivityResultLauncher<Boolean> launcher; | private ActivityResultLauncher<Boolean> launcher; | ||||
| private WifiBleDeviceData mWifiBleDeviceData; | private WifiBleDeviceData mWifiBleDeviceData; | ||||
| private User selectUser; | |||||
| private BodyFatUserBean mSelectBodyFatUserBean; | |||||
| @Override | @Override | ||||
| protected void onCreate(@Nullable Bundle savedInstanceState) { | protected void onCreate(@Nullable Bundle savedInstanceState) { | ||||
| super.onCreate(savedInstanceState); | super.onCreate(savedInstanceState); | ||||
| setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//禁止横屏 | setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//禁止横屏 | ||||
| setContentView(R.layout.activity_weight_scale_wifi_ble); | setContentView(R.layout.activity_weight_scale_wifi_ble); | ||||
| findViewById(R.id.wifistatus).setOnClickListener(this); | |||||
| findViewById(R.id.sn).setOnClickListener(this); | |||||
| findViewById(R.id.scan_wifi).setOnClickListener(this); | |||||
| findViewById(R.id.connect_wifi).setOnClickListener(this); | |||||
| findViewById(R.id.disconnect).setOnClickListener(this); | |||||
| findViewById(R.id.setedname).setOnClickListener(this); | |||||
| findViewById(R.id.getWifiStatus).setOnClickListener(this); | |||||
| findViewById(R.id.getSn).setOnClickListener(this); | |||||
| findViewById(R.id.scanWifi).setOnClickListener(this); | |||||
| findViewById(R.id.connectWifi).setOnClickListener(this); | |||||
| findViewById(R.id.disconnectWifi).setOnClickListener(this); | |||||
| findViewById(R.id.getWifiName).setOnClickListener(this); | |||||
| findViewById(R.id.setedpaw).setOnClickListener(this); | findViewById(R.id.setedpaw).setOnClickListener(this); | ||||
| findViewById(R.id.setedmac).setOnClickListener(this); | findViewById(R.id.setedmac).setOnClickListener(this); | ||||
| findViewById(R.id.ota).setOnClickListener(this); | findViewById(R.id.ota).setOnClickListener(this); | ||||
| FileUtils.init(); | FileUtils.init(); | ||||
| mDialogList = new ArrayList<>(); | mDialogList = new ArrayList<>(); | ||||
| initLauncher(); | initLauncher(); | ||||
| selectUser = getDefault(); | |||||
| mSelectBodyFatUserBean = getDefault(); | |||||
| } | } | ||||
| @Override | @Override | ||||
| public void onClick(View v) { | public void onClick(View v) { | ||||
| int id = v.getId(); | int id = v.getId(); | ||||
| switch (id) { | |||||
| case R.id.reset: | |||||
| mList.add(0, getString(R.string.reset)); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| if (mWifiBleDeviceData != null) { | |||||
| mWifiBleDeviceData.setReset(); | |||||
| } | |||||
| break; | |||||
| case R.id.wifistatus: | |||||
| if (mWifiBleDeviceData != null) { | |||||
| mWifiBleDeviceData.getWifiCurrentState(); | |||||
| } | |||||
| break; | |||||
| case R.id.sn: | |||||
| if (mWifiBleDeviceData != null) { | |||||
| mWifiBleDeviceData.getDeviceSn(); | |||||
| } | |||||
| break; | |||||
| case R.id.scan_wifi: | |||||
| if (mWifiBleDeviceData != null) { | |||||
| mWifiBleDeviceData.getWifiList(); | |||||
| mList.add(TimeUtils.getTime() + "sacn wifi..."); | |||||
| mMHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| showWifiList(); | |||||
| break; | |||||
| case R.id.setedmac: | |||||
| if (mWifiBleDeviceData != null) { | |||||
| mWifiBleDeviceData.getConnectWifiMac(); | |||||
| } | |||||
| break; | |||||
| case R.id.setedpaw: | |||||
| if (mWifiBleDeviceData != null) { | |||||
| mWifiBleDeviceData.getConnectWifiPwd(); | |||||
| } | |||||
| break; | |||||
| case R.id.setedname: | |||||
| if (mWifiBleDeviceData != null) { | |||||
| mWifiBleDeviceData.getConnectWifiSsid(); | |||||
| } | |||||
| break; | |||||
| case R.id.disconnect: | |||||
| if (mWifiBleDeviceData != null) { | |||||
| mWifiBleDeviceData.setDisconnectWifi(); | |||||
| } | |||||
| break; | |||||
| case R.id.ota: | |||||
| showFileChooser(); | |||||
| break; | |||||
| case R.id.surroundings: | |||||
| String ipStr = et_ip.getText().toString(); | |||||
| String port = et_port.getText().toString(); | |||||
| String path = et_path.getText().toString(); | |||||
| if (mWifiBleDeviceData != null) { | |||||
| mWifiBleDeviceData.setServiceInfo(ipStr, Integer.parseInt(port), path); | |||||
| } | |||||
| mList.add(0, getString(R.string.set_environment) + ipStr + ":" + port + path); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.check_ip: | |||||
| if (mWifiBleDeviceData != null) { | |||||
| mWifiBleDeviceData.getIp(); | |||||
| } | |||||
| mList.add(0, getString(R.string.view_environment_ip)); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.check_port: | |||||
| if (mWifiBleDeviceData != null) { | |||||
| mWifiBleDeviceData.getPort(); | |||||
| } | |||||
| mList.add(0, getString(R.string.view_environment_port)); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.check_path: | |||||
| if (mWifiBleDeviceData != null) { | |||||
| mWifiBleDeviceData.getPath(); | |||||
| } | |||||
| mList.add(0, getString(R.string.view_environment_path)); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.btn_select_file: | |||||
| if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { | |||||
| launcher.launch(true); | |||||
| } else { | |||||
| mDialogList.clear(); | |||||
| ArrayList<String> list = FileUtils.list(); | |||||
| for (String s : list) { | |||||
| mDialogList.add(new DialogStringImageBean(s, 0)); | |||||
| } | |||||
| ShowListDialogFragment.newInstance() | |||||
| .setTitle("") | |||||
| .setCancel("", 0) | |||||
| .setCancelBlank(true) | |||||
| .setBackground(true) | |||||
| .setBottom(false) | |||||
| .setList(mDialogList) | |||||
| .setOnDialogListener(new ShowListDialogFragment.onDialogListener() { | |||||
| @Override | |||||
| public void onItemListener(int position) { | |||||
| if (mDialogList.size() > position) { | |||||
| DialogStringImageBean dialogStringImageBean = mDialogList.get(position); | |||||
| String name = dialogStringImageBean.getName(); | |||||
| SP.getInstance().putOtaFileName(name); | |||||
| } | |||||
| } | |||||
| }) | |||||
| .show(getSupportFragmentManager()); | |||||
| if (id == R.id.reset) { | |||||
| mList.add(0, getString(R.string.reset)); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| if (mWifiBleDeviceData != null) { | |||||
| mWifiBleDeviceData.setReset(); | |||||
| } | |||||
| } else if (id == R.id.getWifiStatus) { | |||||
| if (mWifiBleDeviceData != null) { | |||||
| mWifiBleDeviceData.getWifiCurrentState(); | |||||
| } | |||||
| } else if (id == R.id.getSn) { | |||||
| if (mWifiBleDeviceData != null) { | |||||
| mWifiBleDeviceData.getDeviceSn(); | |||||
| } | |||||
| } else if (id == R.id.scanWifi) { | |||||
| if (mWifiBleDeviceData != null) { | |||||
| mWifiBleDeviceData.getWifiList(); | |||||
| mList.add(TimeUtils.getTime() + "sacn wifi..."); | |||||
| mMHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| showWifiList(); | |||||
| } else if (id == R.id.setedmac) { | |||||
| if (mWifiBleDeviceData != null) { | |||||
| mWifiBleDeviceData.getConnectWifiMac(); | |||||
| } | |||||
| } else if (id == R.id.setedpaw) { | |||||
| if (mWifiBleDeviceData != null) { | |||||
| mWifiBleDeviceData.getConnectWifiPwd(); | |||||
| } | |||||
| } else if (id == R.id.getWifiName) { | |||||
| if (mWifiBleDeviceData != null) { | |||||
| mWifiBleDeviceData.getConnectWifiSsid(); | |||||
| } | |||||
| } else if (id == R.id.disconnectWifi) { | |||||
| if (mWifiBleDeviceData != null) { | |||||
| mWifiBleDeviceData.setDisconnectWifi(); | |||||
| } | |||||
| } else if (id == R.id.ota) { | |||||
| showFileChooser(); | |||||
| } else if (id == R.id.surroundings) { | |||||
| String ipStr = et_ip.getText().toString(); | |||||
| String port = et_port.getText().toString(); | |||||
| String path = et_path.getText().toString(); | |||||
| if (mWifiBleDeviceData != null) { | |||||
| mWifiBleDeviceData.setServiceInfo(ipStr, Integer.parseInt(port), path); | |||||
| } | |||||
| mList.add(0, getString(R.string.set_environment) + ipStr + ":" + port + path); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.check_ip) { | |||||
| if (mWifiBleDeviceData != null) { | |||||
| mWifiBleDeviceData.getIp(); | |||||
| } | |||||
| mList.add(0, getString(R.string.view_environment_ip)); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.check_port) { | |||||
| if (mWifiBleDeviceData != null) { | |||||
| mWifiBleDeviceData.getPort(); | |||||
| } | |||||
| mList.add(0, getString(R.string.view_environment_port)); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.check_path) { | |||||
| if (mWifiBleDeviceData != null) { | |||||
| mWifiBleDeviceData.getPath(); | |||||
| } | |||||
| mList.add(0, getString(R.string.view_environment_path)); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } else if (id == R.id.btn_select_file) { | |||||
| if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { | |||||
| launcher.launch(true); | |||||
| } else { | |||||
| mDialogList.clear(); | |||||
| ArrayList<String> list = FileUtils.list(); | |||||
| for (String s : list) { | |||||
| mDialogList.add(new DialogStringImageBean(s, 0)); | |||||
| } | } | ||||
| break; | |||||
| ShowListDialogFragment.newInstance() | |||||
| .setTitle("") | |||||
| .setCancel("", 0) | |||||
| .setCancelBlank(true) | |||||
| .setBackground(true) | |||||
| .setBottom(false) | |||||
| .setList(mDialogList) | |||||
| .setOnDialogListener(new ShowListDialogFragment.onDialogListener() { | |||||
| @Override | |||||
| public void onItemListener(int position) { | |||||
| if (mDialogList.size() > position) { | |||||
| DialogStringImageBean dialogStringImageBean = mDialogList.get(position); | |||||
| String name = dialogStringImageBean.getName(); | |||||
| SP.getInstance().putOtaFileName(name); | |||||
| } | |||||
| } | |||||
| }) | |||||
| .show(getSupportFragmentManager()); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| private User getDefault() { | |||||
| User user = new User(); | |||||
| user.setModeType(BodyFatDataUtil.MODE_ORDINARY); | |||||
| user.setSex(BodyFatDataUtil.SEX_MAN); | |||||
| user.setAge(18); | |||||
| user.setHeight(170); | |||||
| user.setAdc(560); | |||||
| user.setWeight(50); | |||||
| user.setId(1); | |||||
| return user; | |||||
| private BodyFatUserBean getDefault() { | |||||
| BodyFatUserBean bodyFatUserBean = new BodyFatUserBean(); | |||||
| bodyFatUserBean.setModeType(BodyFatDataUtil.MODE_ORDINARY); | |||||
| bodyFatUserBean.setSex(BodyFatDataUtil.SEX_MAN); | |||||
| bodyFatUserBean.setAge(18); | |||||
| bodyFatUserBean.setHeight(170); | |||||
| bodyFatUserBean.setAdc(560); | |||||
| bodyFatUserBean.setWeight(50); | |||||
| bodyFatUserBean.setId(1); | |||||
| return bodyFatUserBean; | |||||
| } | } | ||||
| private void initLauncher() { | private void initLauncher() { | ||||
| case BodyFatDataUtil.MUC_REQUEST_USER_INFO: | case BodyFatDataUtil.MUC_REQUEST_USER_INFO: | ||||
| mList.add(0, getString(R.string.measurement_status) + status + "\n" + getString(R.string.request_user_information)); | mList.add(0, getString(R.string.measurement_status) + status + "\n" + getString(R.string.request_user_information)); | ||||
| if (bodyFatBleUtilsData != null) { | if (bodyFatBleUtilsData != null) { | ||||
| bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().setUserInfo(selectUser, BleDeviceConfig.WEIGHT_BODY_FAT_SCALE)); | |||||
| bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().setUserInfo(mSelectBodyFatUserBean, BleDeviceConfig.WEIGHT_BODY_FAT_SCALE)); | |||||
| } | } | ||||
| break; | break; | ||||
| default: | default: |
| import com.pingwang.bluetoothlib.device.BleDevice; | import com.pingwang.bluetoothlib.device.BleDevice; | ||||
| import com.pingwang.bluetoothlib.device.BleSendCmdUtil; | import com.pingwang.bluetoothlib.device.BleSendCmdUtil; | ||||
| import com.pingwang.bluetoothlib.device.SendBleBean; | import com.pingwang.bluetoothlib.device.SendBleBean; | ||||
| import com.pingwang.bluetoothlib.device.wifibleDevice.WifiBleDeviceData; | |||||
| import com.pingwang.bluetoothlib.device.wifibleDevice.WifiBleInfoBean; | |||||
| import com.pingwang.bluetoothlib.listener.CallbackDisIm; | import com.pingwang.bluetoothlib.listener.CallbackDisIm; | ||||
| import com.pingwang.bluetoothlib.listener.OnBleCompanyListener; | import com.pingwang.bluetoothlib.listener.OnBleCompanyListener; | ||||
| import com.pingwang.bluetoothlib.listener.OnBleVersionListener; | import com.pingwang.bluetoothlib.listener.OnBleVersionListener; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | ||||
| import cn.net.aicare.modulelibrary.module.sphygmomanometer.SphyBleConfig; | import cn.net.aicare.modulelibrary.module.sphygmomanometer.SphyBleConfig; | ||||
| import cn.net.aicare.modulelibrary.module.sphygmomanometer.SphyWifiBleDeviceData; | import cn.net.aicare.modulelibrary.module.sphygmomanometer.SphyWifiBleDeviceData; | ||||
| import cn.net.aicare.modulelibrary.module.wifibleDevice.WifiBleDeviceData; | |||||
| import cn.net.aicare.modulelibrary.module.wifibleDevice.WifiBleInfoBean; | |||||
| /** | /** | ||||
| @Override | @Override | ||||
| public void onClick(View v) { | public void onClick(View v) { | ||||
| SendBleBean sendBleBean = new SendBleBean(); | SendBleBean sendBleBean = new SendBleBean(); | ||||
| switch (v.getId()) { | |||||
| case R.id.btnVersion: | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||||
| mSphyWifiBleDeviceData.sendData(sendBleBean); | |||||
| break; | |||||
| case R.id.btnBattery: | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus()); | |||||
| mSphyWifiBleDeviceData.sendData(sendBleBean); | |||||
| break; | |||||
| case R.id.btn_get_did: | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getDid()); | |||||
| mSphyWifiBleDeviceData.sendData(sendBleBean); | |||||
| break; | |||||
| case R.id.btn_voice: | |||||
| if (mVoiceStatus == 0) { | |||||
| mVoiceStatus = 1; | |||||
| } else { | |||||
| mVoiceStatus = 0; | |||||
| } | |||||
| mSphyWifiBleDeviceData.setSphyVoice(mVoiceStatus); | |||||
| break; | |||||
| int id = v.getId(); | |||||
| if (id == R.id.btnVersion) { | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||||
| mSphyWifiBleDeviceData.sendData(sendBleBean); | |||||
| } else if (id == R.id.btnBattery) { | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus()); | |||||
| mSphyWifiBleDeviceData.sendData(sendBleBean); | |||||
| } else if (id == R.id.btn_get_did) { | |||||
| sendBleBean.setHex(mBleSendCmdUtil.getDid()); | |||||
| mSphyWifiBleDeviceData.sendData(sendBleBean); | |||||
| } else if (id == R.id.btn_voice) { | |||||
| if (mVoiceStatus == 0) { | |||||
| mVoiceStatus = 1; | |||||
| } else { | |||||
| mVoiceStatus = 0; | |||||
| case R.id.clear: | |||||
| if (mList != null) | |||||
| mList.clear(); | |||||
| } | |||||
| mSphyWifiBleDeviceData.setSphyVoice(mVoiceStatus); | |||||
| } else if (id == R.id.clear) { | |||||
| if (mList != null) | |||||
| mList.clear(); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } else if (id == R.id.btn_config) { | |||||
| String ip = et_url.getText().toString().trim(); | |||||
| String port = et_port.getText().toString().trim(); | |||||
| String path = et_path.getText().toString().trim(); | |||||
| if (ip.length() == 0 || port.length() == 0) { | |||||
| mList.add(TimeUtils.getTime() + "配置失败:ip或端口为空"); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | mHandler.sendEmptyMessage(REFRESH_DATA); | ||||
| break; | |||||
| case R.id.btn_config: | |||||
| String ip = et_url.getText().toString().trim(); | |||||
| String port = et_port.getText().toString().trim(); | |||||
| String path = et_path.getText().toString().trim(); | |||||
| if (ip.length() == 0 || port.length() == 0) { | |||||
| mList.add(TimeUtils.getTime() + "配置失败:ip或端口为空"); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| return; | |||||
| } | |||||
| setServiceInfo(ip, Integer.parseInt(port), path); | |||||
| mList.add(TimeUtils.getTime() + "配置服务器信息中..."); | |||||
| return; | |||||
| } | |||||
| setServiceInfo(ip, Integer.parseInt(port), path); | |||||
| mList.add(TimeUtils.getTime() + "配置服务器信息中..."); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } else if (id == R.id.btn_read_config) { | |||||
| getWifiConnectInfo(); | |||||
| } else if (id == R.id.btn_read_wifi_status) { | |||||
| if (mWifiBleDeviceData != null) { | |||||
| mWifiBleDeviceData.getWifiCurrentState(); | |||||
| } | |||||
| } else if (id == R.id.btn_wifi) { | |||||
| if (mWifiBleDeviceData != null) { | |||||
| mWifiBleDeviceData.getWifiList(); | |||||
| mList.add(TimeUtils.getTime() + "正在扫描附近可用的wifi..."); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | mHandler.sendEmptyMessage(REFRESH_DATA); | ||||
| break; | |||||
| case R.id.btn_read_config: | |||||
| getWifiConnectInfo(); | |||||
| break; | |||||
| case R.id.btn_read_wifi_status: | |||||
| if (mWifiBleDeviceData != null) { | |||||
| mWifiBleDeviceData.getWifiCurrentState(); | |||||
| } | |||||
| break; | |||||
| case R.id.btn_wifi: | |||||
| if (mWifiBleDeviceData != null) { | |||||
| mWifiBleDeviceData.getWifiList(); | |||||
| mList.add(TimeUtils.getTime() + "正在扫描附近可用的wifi..."); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| showWifiList(); | |||||
| break; | |||||
| default: | |||||
| break; | |||||
| } | |||||
| showWifiList(); | |||||
| } | } | ||||
| } | } | ||||
| package aicare.net.cn.sdk.ailinksdkdemoandroid.utils; | |||||
| import com.pingwang.bluetoothlib.AILinkBleManager; | |||||
| import com.pingwang.bluetoothlib.bean.BleScanAddAilinkBean; | |||||
| import com.pingwang.bluetoothlib.config.BleConfig; | |||||
| import com.pingwang.bluetoothlib.server.ELinkBleServer; | |||||
| import com.pingwang.bluetoothlib.utils.UuidUtils; | |||||
| import java.util.ArrayList; | |||||
| import java.util.List; | |||||
| import java.util.UUID; | |||||
| /** | |||||
| * 蓝牙扫描设备工具 | |||||
| * 因为 AILink 现在接了不是 AILink 协议的设备,比如旧的营养秤 UUID 不同 | |||||
| */ | |||||
| public class BleScanUtil { | |||||
| /** | |||||
| * 开始扫描设备 | |||||
| * | |||||
| * @param blueToothService 蓝牙服务 | |||||
| * @param timeout 延迟 ms | |||||
| */ | |||||
| public static void scanLeDevice(ELinkBleServer blueToothService, long timeout) { | |||||
| blueToothService.scanLeDevice(timeout, getScanLeDeviceMap()); | |||||
| } | |||||
| public static void scanLeDevice(AILinkBleManager aiLinkBleManager, long timeout) { | |||||
| aiLinkBleManager.startScan(timeout, getScanLeDeviceMap()); | |||||
| } | |||||
| public static List<BleScanAddAilinkBean> getScanLeDeviceMap() { | |||||
| List<BleScanAddAilinkBean> list = new ArrayList<>(); | |||||
| list.add(getAifresh()); | |||||
| list.add(getAifit02()); | |||||
| list.add(getAifit03()); | |||||
| list.add(getOkOk()); | |||||
| return list; | |||||
| } | |||||
| public static UUID[] getScanLeDeviceUUID() { | |||||
| UUID[] uuids = new UUID[]{UUID.fromString("0000FFB0-0000-1000-8000-00805F9B34FB"),// 旧的营养秤 AC05 | |||||
| // UUID.fromString("0000FEE7-0000-1000-8000-00805F9B34FB"),// 华盛达手表 | |||||
| BleConfig.UUID_SERVER_AILINK, BleConfig.UUID_SERVER_BROADCAST_AILINK}; | |||||
| return uuids; | |||||
| } | |||||
| /** | |||||
| * 好营养AC05的设备 | |||||
| * | |||||
| * @return {@link BleScanAddAilinkBean} | |||||
| */ | |||||
| private static BleScanAddAilinkBean getAifresh() { | |||||
| // 旧的营养秤 | |||||
| BleScanAddAilinkBean bleScanAddAilinkBean = new BleScanAddAilinkBean(); | |||||
| bleScanAddAilinkBean.setDeviceServiceUUID(new UUID[]{UuidUtils.getUuid("0000FFB0-0000-1000-8000-00805F9B34FB")}); | |||||
| byte[] bytes = new byte[]{(byte) 0xAC, 0x05}; | |||||
| bleScanAddAilinkBean.setDeviceBroadcast(bytes, 0, bytes.length); | |||||
| bleScanAddAilinkBean.setCid(0x0037); | |||||
| bleScanAddAilinkBean.setVid(0x0000); | |||||
| bleScanAddAilinkBean.setPid(0x0000); | |||||
| return bleScanAddAilinkBean; | |||||
| } | |||||
| /** | |||||
| * 好身材AC02的体脂秤,带温度 | |||||
| * | |||||
| * @return {@link BleScanAddAilinkBean} | |||||
| */ | |||||
| private static BleScanAddAilinkBean getAifit02() { | |||||
| // 旧的好身材 | |||||
| BleScanAddAilinkBean bleScanAddAilinkBean = new BleScanAddAilinkBean(); | |||||
| bleScanAddAilinkBean.setDeviceServiceUUID(new UUID[]{UuidUtils.getUuid("0000FFB0-0000-1000-8000-00805F9B34FB")}); | |||||
| byte[] bytes = new byte[]{(byte) 0xAC, 0x02}; | |||||
| bleScanAddAilinkBean.setDeviceBroadcast(bytes, 0, bytes.length); | |||||
| bleScanAddAilinkBean.setCid(0x005E); | |||||
| bleScanAddAilinkBean.setVid(0x0070); | |||||
| bleScanAddAilinkBean.setPid(0x0001); | |||||
| return bleScanAddAilinkBean; | |||||
| } | |||||
| /** | |||||
| * 好身材AC03的体脂秤,带温度 | |||||
| * | |||||
| * @return {@link BleScanAddAilinkBean} | |||||
| */ | |||||
| private static BleScanAddAilinkBean getAifit03() { | |||||
| // 旧的好身材 | |||||
| BleScanAddAilinkBean bleScanAddAilinkBean = new BleScanAddAilinkBean(); | |||||
| bleScanAddAilinkBean.setDeviceServiceUUID(new UUID[]{UuidUtils.getUuid("0000FFB0-0000-1000-8000-00805F9B34FB")}); | |||||
| byte[] bytes = new byte[]{(byte) 0xAC, 0x03}; | |||||
| bleScanAddAilinkBean.setDeviceBroadcast(bytes, 0, bytes.length); | |||||
| bleScanAddAilinkBean.setCid(0x005E); | |||||
| bleScanAddAilinkBean.setVid(0x0070); | |||||
| bleScanAddAilinkBean.setPid(0x0001); | |||||
| return bleScanAddAilinkBean; | |||||
| } | |||||
| private static BleScanAddAilinkBean getOkOk() { | |||||
| // OKOK广播秤 | |||||
| BleScanAddAilinkBean bleScanAddAilinkBean = new BleScanAddAilinkBean(); | |||||
| bleScanAddAilinkBean.setDeviceServiceUUID(null); | |||||
| byte[] bytes = new byte[]{(byte) 0x00, 0x00}; | |||||
| bleScanAddAilinkBean.setDeviceBroadcast(bytes, 6, 6+bytes.length); | |||||
| bleScanAddAilinkBean.setCid(0x08+0xFFFF); | |||||
| bleScanAddAilinkBean.setVid(0x0001); | |||||
| bleScanAddAilinkBean.setPid(0x0002); | |||||
| return bleScanAddAilinkBean; | |||||
| } | |||||
| } |
| package aicare.net.cn.sdk.ailinksdkdemoandroid.utils | |||||
| import kotlinx.coroutines.CoroutineExceptionHandler | |||||
| import kotlinx.coroutines.CoroutineScope | |||||
| import kotlinx.coroutines.Dispatchers | |||||
| import kotlinx.coroutines.Job | |||||
| import kotlinx.coroutines.SupervisorJob | |||||
| import kotlinx.coroutines.launch | |||||
| import kotlin.coroutines.cancellation.CancellationException | |||||
| object CoroutineUtils { | |||||
| // 使用 SupervisorJob 确保单个协程失败不影响其他协程 | |||||
| private val ioScope = CoroutineScope( | |||||
| SupervisorJob() + | |||||
| Dispatchers.IO + | |||||
| CoroutineExceptionHandler { _, throwable -> | |||||
| // 1. 打印详细堆栈 | |||||
| throwable.printStackTrace() | |||||
| } | |||||
| ) | |||||
| /** | |||||
| * 在IO线程池执行协程任务,自动捕获并处理未捕获异常 | |||||
| * | |||||
| * @param block 要执行的协程代码块 | |||||
| * @return 可用于取消任务的Job对象 | |||||
| */ | |||||
| fun coroutineScopeIo(block: suspend CoroutineScope.() -> Unit): Job { | |||||
| return ioScope.launch { | |||||
| try { | |||||
| block() // 正确执行传入的代码块 | |||||
| } catch (e: CancellationException) { | |||||
| // 正常取消不处理 | |||||
| throw e | |||||
| } catch (e: Exception) { | |||||
| // 此处捕获协程内部未处理的异常 | |||||
| // 异常已由CoroutineExceptionHandler处理,此处可添加额外逻辑 | |||||
| L.e( "内部捕获: ${e.message}") | |||||
| } | |||||
| } | |||||
| } | |||||
| } |
| package aicare.net.cn.sdk.ailinksdkdemoandroid.utils; | |||||
| import com.besthealth.bhBodyComposition120.BhBodyComposition; | |||||
| import com.besthealth.bhBodyComposition120.BhErrorType; | |||||
| import com.besthealth.bhBodyComposition120.BhSex; | |||||
| import com.holtek.libHTBodyfat.HTBodyBasicInfo; | |||||
| import com.holtek.libHTBodyfat.HTBodyResultAllBody; | |||||
| import java.util.Locale; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.eight_bodyfat.EightBodyFatAdc; | |||||
| public class EightBodyFatAlgorithms { | |||||
| public EightBodyFatAlgorithms() { | |||||
| } | |||||
| private static class AlgorithmsHolder { | |||||
| private static EightBodyFatAlgorithms algorithmsUnit = new EightBodyFatAlgorithms(); | |||||
| } | |||||
| public static EightBodyFatAlgorithms getInstance() { | |||||
| return AlgorithmsHolder.algorithmsUnit; | |||||
| } | |||||
| public EightBodyFatBean getAlgorithmsData(int algorithms, int sex, int height, float weight_kg, int age, EightBodyFatAdc eightBodyfatAdc) { | |||||
| EightBodyFatBean eightBodyFatBean = new EightBodyFatBean(); | |||||
| switch (algorithms) { | |||||
| case 0x20: | |||||
| //实例化对象 | |||||
| BhBodyComposition bhBodyComposition = new BhBodyComposition(); | |||||
| //传入性别 | |||||
| bhBodyComposition.bhSex = sex == 1 ? BhSex.MALE.ordinal() : BhSex.FEMALE.ordinal(); | |||||
| //传入体重。单位是千克。其他单位需要自己转换 | |||||
| bhBodyComposition.bhWeightKg = weight_kg; | |||||
| //传入年龄 | |||||
| bhBodyComposition.bhAge = age; | |||||
| //传入身高 | |||||
| bhBodyComposition.bhHeightCm = height; | |||||
| //传入阻抗。阻抗值通过设备获取。加密数据 | |||||
| //全身阻抗 | |||||
| bhBodyComposition.bhZLeftBodyEnCode = eightBodyfatAdc.getAdcRightBody(); | |||||
| //左手阻抗 | |||||
| bhBodyComposition.bhZLeftArmEnCode = eightBodyfatAdc.getAdcLeftHand(); | |||||
| //右手阻抗 | |||||
| bhBodyComposition.bhZRightArmEnCode = eightBodyfatAdc.getAdcRightHand(); | |||||
| //左脚阻抗 | |||||
| bhBodyComposition.bhZLeftLegEnCode = eightBodyfatAdc.getAdcLeftFoot(); | |||||
| //右脚阻抗 | |||||
| bhBodyComposition.bhZRightLegEnCode = eightBodyfatAdc.getAdcRightFoot(); | |||||
| //校验传入的值 | |||||
| BhErrorType bhErrorType = BhErrorType.values()[bhBodyComposition.getBodyComposition()]; | |||||
| if (bhErrorType == BhErrorType.NONE) { | |||||
| eightBodyFatBean.setWeight(String.valueOf(bhBodyComposition.bhWeightKg)); | |||||
| eightBodyFatBean.setBmi(Adecimal(bhBodyComposition.bhBMI)); | |||||
| eightBodyFatBean.setBmr((float) bhBodyComposition.bhBMR); | |||||
| eightBodyFatBean.setUvi((float) bhBodyComposition.bhVFAL); | |||||
| eightBodyFatBean.setBm(String.valueOf(bhBodyComposition.bhBoneKg)); | |||||
| eightBodyFatBean.setBfr(Adecimal(bhBodyComposition.bhBodyFatRate)); | |||||
| eightBodyFatBean.setVwc(Adecimal(bhBodyComposition.bhWaterRate)); | |||||
| eightBodyFatBean.setRom(Adecimal(bhBodyComposition.bhMuscleRate)); | |||||
| eightBodyFatBean.setBodyAge(bhBodyComposition.bhBodyAge); | |||||
| eightBodyFatBean.setPp(Adecimal(bhBodyComposition.bhProteinRate)); | |||||
| eightBodyFatBean.setSfr(Adecimal(bhBodyComposition.bhBodyFatSubCutRate)); | |||||
| eightBodyFatBean.setFatMassBody(String.valueOf(bhBodyComposition.bhBodyFatKgTrunk)); | |||||
| eightBodyFatBean.setFatMassLeftTop(String.valueOf(bhBodyComposition.bhBodyFatKgLeftArm)); | |||||
| eightBodyFatBean.setFatMassLeftBottom(String.valueOf(bhBodyComposition.bhBodyFatKgLeftLeg)); | |||||
| eightBodyFatBean.setFatMassRightTop(String.valueOf(bhBodyComposition.bhBodyFatKgRightArm)); | |||||
| eightBodyFatBean.setFatMassRightBottom(String.valueOf(bhBodyComposition.bhBodyFatKgRightLeg)); | |||||
| eightBodyFatBean.setArithmetic(algorithms); | |||||
| eightBodyFatBean.setBhSkeletalMuscleKg(String.valueOf(bhBodyComposition.bhSkeletalMuscleKg)); | |||||
| eightBodyFatBean.setBhSkeletalMuscleKgLevel(String.valueOf(bhBodyComposition.bhSkeletalMuscleKgLevel)); | |||||
| eightBodyFatBean.setBhSkeletalMuscleKgListStandardOrExcellent(String.valueOf(bhBodyComposition.bhMuscleKgListStandardOrExcellent)); | |||||
| eightBodyFatBean.setBhSkeletalMuscleKgListUnderOrStandard(String.valueOf(bhBodyComposition.bhSkeletalMuscleKgListUnderOrStandard)); | |||||
| // System.out.println("解密阻抗-左側全身(Ω)=" + body.bhZLeftBodyDeCode); | |||||
| // System.out.println("解密阻抗-左手(Ω)=" + body.bhZLeftArmDeCode); | |||||
| // System.out.println("解密阻抗-右手(Ω)=" + body.bhZRightArmDeCode); | |||||
| // System.out.println("解密阻抗-左腳(Ω)=" + body.bhZLeftLegDeCode); | |||||
| // System.out.println("解密阻抗-右腳(Ω)=" + body.bhZRightLegDeCode); | |||||
| eightBodyFatBean.setAdcLeftHand(bhBodyComposition.bhZLeftArmDeCode); | |||||
| eightBodyFatBean.setAdcRightHand(bhBodyComposition.bhZRightArmDeCode); | |||||
| eightBodyFatBean.setAdcLeftFoot(bhBodyComposition.bhZLeftLegDeCode); | |||||
| eightBodyFatBean.setAdcRightFoot(bhBodyComposition.bhZRightLegDeCode); | |||||
| eightBodyFatBean.setAdcLeftBody(bhBodyComposition.bhZLeftBodyDeCode); | |||||
| } else { | |||||
| L.e("getAlgorithmsData: " + bhErrorType.toString()); | |||||
| } | |||||
| break; | |||||
| case 1: | |||||
| default: | |||||
| HTBodyBasicInfo basicInfo = new HTBodyBasicInfo(sex, height, weight_kg, age); | |||||
| basicInfo.htZAllBodyImpedance = eightBodyfatAdc.getAdcRightBody(); | |||||
| basicInfo.htZLeftLegImpedance = eightBodyfatAdc.getAdcLeftFoot(); | |||||
| basicInfo.htZRightLegImpedance = eightBodyfatAdc.getAdcRightFoot(); | |||||
| basicInfo.htZLeftArmImpedance = eightBodyfatAdc.getAdcLeftHand(); | |||||
| basicInfo.htZRightArmImpedance = eightBodyfatAdc.getAdcRightHand(); | |||||
| basicInfo.htTwoLegsImpedance = eightBodyfatAdc.getAdcFoot(); | |||||
| basicInfo.htTwoArmsImpedance = eightBodyfatAdc.getAdcHand(); | |||||
| HTBodyResultAllBody resultTwoLegs = new HTBodyResultAllBody(); | |||||
| int errorType = resultTwoLegs.getBodyfatWithBasicInfo(basicInfo); | |||||
| if (errorType == HTBodyBasicInfo.ErrorNone) { | |||||
| eightBodyFatBean.setBmi(Adecimal(resultTwoLegs.htBMI)); | |||||
| eightBodyFatBean.setBmr((float) resultTwoLegs.htBMR); | |||||
| eightBodyFatBean.setUvi((float) resultTwoLegs.htVFAL); | |||||
| eightBodyFatBean.setBm(String.valueOf((float) resultTwoLegs.htBoneKg)); | |||||
| eightBodyFatBean.setBfr(Adecimal(resultTwoLegs.htBodyfatPercentage)); | |||||
| eightBodyFatBean.setVwc(Adecimal(resultTwoLegs.htWaterPercentage)); | |||||
| eightBodyFatBean.setRom(Adecimal(resultTwoLegs.htMusclePercentage)); | |||||
| eightBodyFatBean.setBodyAge(resultTwoLegs.htBodyAge); | |||||
| eightBodyFatBean.setPp(Adecimal(resultTwoLegs.htProteinPercentage)); | |||||
| eightBodyFatBean.setSfr(Adecimal(resultTwoLegs.htBodyfatSubcut)); | |||||
| eightBodyFatBean.setFatMassBody(String.valueOf(resultTwoLegs.htBodyfatKgTrunk)); | |||||
| eightBodyFatBean.setFatMassLeftTop(String.valueOf(resultTwoLegs.htBodyfatKgLeftArm)); | |||||
| eightBodyFatBean.setFatMassLeftBottom(String.valueOf(resultTwoLegs.htBodyfatKgLeftLeg)); | |||||
| eightBodyFatBean.setFatMassRightTop(String.valueOf(resultTwoLegs.htBodyfatKgRightArm)); | |||||
| eightBodyFatBean.setFatMassRightBottom(String.valueOf(resultTwoLegs.htBodyfatKgRightLeg)); | |||||
| // eightBodyFatBean.setFatMass(resultTwoLegs.htBodyfatKg); | |||||
| eightBodyFatBean.setMuscleMassBody(String.valueOf(resultTwoLegs.htMuscleKgTrunk)); | |||||
| eightBodyFatBean.setMuscleMassLeftTop(String.valueOf(resultTwoLegs.htMuscleKgLeftArm)); | |||||
| eightBodyFatBean.setMuscleMassLeftBottom(String.valueOf(resultTwoLegs.htMuscleKgLeftLeg)); | |||||
| eightBodyFatBean.setMuscleMassRightTop(String.valueOf(resultTwoLegs.htMuscleKgRightArm)); | |||||
| eightBodyFatBean.setMuscleMassRightBottom(String.valueOf(resultTwoLegs.htMuscleKgRightLeg)); | |||||
| // eightBodyFatBean.setMusleMass(resultTwoLegs.htMuscleKg); | |||||
| // eightBodyFatBean.setStandardWeight(resultTwoLegs.htIdealWeightKg); | |||||
| // eightBodyFatBean.setWeightWithoutFat(resultTwoLegs.htBodyfatFreeMass); | |||||
| // eightBodyFatBean.setWeightControl((weight_kg - resultTwoLegs.htIdealWeightKg)); | |||||
| // eightBodyFatBean.setFatLevel(HealthyStatusUtil.ObesitylevelsStatus(weight_kg, (float) resultTwoLegs.htIdealWeightKg)); | |||||
| // double muscle = (resultTwoLegs.htMuscleKgLeftArm + resultTwoLegs.htMuscleKgLeftLeg + resultTwoLegs.htMuscleKgRightArm + resultTwoLegs.htMuscleKgRightLeg); | |||||
| // eightBodyFatBean.setMusleMassLimbs(Adecimal(muscle / (height * height) * 10000)); | |||||
| eightBodyFatBean.setAdcFoot((resultTwoLegs.htZLeftLeg + resultTwoLegs.htZRightLeg)); | |||||
| eightBodyFatBean.setAdcHand((resultTwoLegs.htZLeftArm + resultTwoLegs.htZRightArm)); | |||||
| eightBodyFatBean.setAdcLeftHand(resultTwoLegs.htZLeftArm); | |||||
| eightBodyFatBean.setAdcRightHand(resultTwoLegs.htZRightArm); | |||||
| eightBodyFatBean.setAdcLeftFoot(resultTwoLegs.htZLeftLeg); | |||||
| eightBodyFatBean.setAdcRightFoot(resultTwoLegs.htZRightLeg); | |||||
| eightBodyFatBean.setAdcLeftBody(resultTwoLegs.htZAllBody); | |||||
| eightBodyFatBean.setAdcRightBody(resultTwoLegs.htZAllBody); | |||||
| eightBodyFatBean.setAdcRightHandLeftFoot((resultTwoLegs.htZRightArm + resultTwoLegs.htZLeftLeg)); | |||||
| eightBodyFatBean.setAdcLeftHandRightFoot((resultTwoLegs.htZLeftArm + resultTwoLegs.htZRightLeg)); | |||||
| eightBodyFatBean.setAdcBody(resultTwoLegs.htZAllBody); | |||||
| } | |||||
| } | |||||
| return eightBodyFatBean; | |||||
| } | |||||
| private float Adecimal(double data) { | |||||
| return Float.parseFloat(String.format(Locale.US, "%.1f", data)); | |||||
| } | |||||
| } |
| package aicare.net.cn.sdk.ailinksdkdemoandroid.utils | |||||
| import java.nio.ByteBuffer | |||||
| import java.nio.ByteOrder | |||||
| import kotlin.also | |||||
| import kotlin.collections.copyOfRange | |||||
| import kotlin.collections.joinToString | |||||
| import kotlin.text.format | |||||
| import kotlin.text.substring | |||||
| import kotlin.text.toInt | |||||
| /** | |||||
| * @author suzy | |||||
| * @date 2025/2/17 12:09 | |||||
| **/ | |||||
| fun Long.toByteArray(): ByteArray { | |||||
| val buffer = ByteBuffer.allocate(8) // `Long` 类型占用 8 字节 | |||||
| buffer.order(ByteOrder.BIG_ENDIAN) // 设置大端序 | |||||
| buffer.putLong(this) // 将 `Long` 类型的时间戳放入缓冲区 | |||||
| val byteArray = buffer.array() | |||||
| // 获取前 4 字节,即将 8 字节的时间戳截取成 4 字节(大端序) | |||||
| return byteArray.copyOfRange(4, byteArray.size) | |||||
| } | |||||
| fun ByteArray.toHexString(separator: String = ", "): String { | |||||
| return this.joinToString(separator) { "%02X".format(it) } | |||||
| } | |||||
| fun ByteArray.formatMac() = toHexString(":") | |||||
| fun String.parseMacToByteArray(): ByteArray { | |||||
| // 预编译正则表达式(提升性能) | |||||
| require(Regex("^([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}$").matches(this)) { | |||||
| "Invalid MAC format: must match 'XX:XX:XX:XX:XX:XX'" | |||||
| } | |||||
| return ByteArray(6).also { bytes -> | |||||
| var index = 0 | |||||
| var pos = 0 | |||||
| while (index < 6) { | |||||
| bytes[index++] = substring(pos, pos + 2).toInt(16).toByte() | |||||
| pos += 3 // 跳过':'分隔符 | |||||
| } | |||||
| } | |||||
| } | |||||
| fun ByteArray.toLong(): Long { | |||||
| require(this.size == 4) { "ByteArray must be exactly 4 bytes long" } | |||||
| val buffer = ByteBuffer.wrap(this) | |||||
| buffer.order(ByteOrder.BIG_ENDIAN) | |||||
| return buffer.int.toLong() | |||||
| } | |||||
| fun ByteArray.toAltitudeInt(): Int { | |||||
| require(this.size == 2) { "Input must be 2 bytes" } | |||||
| val value = ((this[0].toInt() and 0xFF) shl 8) or (this[1].toInt() and 0xFF) | |||||
| val isNegative = (value and 0x8000) != 0 | |||||
| val absValue = value and 0x7FFF // 取低 15 位 | |||||
| return if (isNegative) -absValue else absValue | |||||
| } | |||||
| fun Int.toByteArray(): ByteArray { | |||||
| val buffer = ByteBuffer.allocate(2) | |||||
| buffer.order(ByteOrder.BIG_ENDIAN) // 使用大端序 | |||||
| buffer.putShort(this.toShort()) // 将 Int 转换为 short 类型(2 字节) | |||||
| return buffer.array() | |||||
| } | |||||
| fun Int.toAltitudeBytes(): ByteArray { | |||||
| val altitude = this | |||||
| require(altitude in -32767..32767) { "Altitude must be in [-32767, 32767]" } | |||||
| val isNegative = altitude < 0 | |||||
| val absValue = if (isNegative) -altitude else altitude | |||||
| // 构造 16 位数值(bit15=符号位,bit0~14=数值) | |||||
| val value = if (isNegative) absValue or 0x8000 else absValue | |||||
| // 转换为大端序 2 字节 | |||||
| return byteArrayOf( | |||||
| (value shr 8).toByte(), // 高字节 | |||||
| value.toByte() // 低字节 | |||||
| ) | |||||
| } | |||||
| fun ByteArray.toInt(): Int { | |||||
| require(this.size == 2) { "ByteArray must be of size 2" } // 检查数组长度 | |||||
| val buffer = ByteBuffer.wrap(this) | |||||
| buffer.order(ByteOrder.BIG_ENDIAN) // 使用大端序 | |||||
| val unsignedShort = buffer.short.toInt() and 0xFFFF | |||||
| return unsignedShort // 将 short 转换为 int | |||||
| } | |||||
| fun Byte.toUnsignedInt(): Int = this.toInt() and 0xFF | |||||
| package aicare.net.cn.sdk.ailinksdkdemoandroid.utils; | package aicare.net.cn.sdk.ailinksdkdemoandroid.utils; | ||||
| import android.text.TextUtils; | |||||
| import java.math.RoundingMode; | import java.math.RoundingMode; | ||||
| import java.text.DecimalFormat; | import java.text.DecimalFormat; | ||||
| import java.util.Locale; | import java.util.Locale; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.config.UserUnitConfig; | |||||
| /** | /** | ||||
| * xing<br> | * xing<br> | ||||
| * 2019/4/29<br> | * 2019/4/29<br> | ||||
| * 单位转换工具类 | * 单位转换工具类 | ||||
| */ | */ | ||||
| public class UnitUtils { | public class UnitUtils { | ||||
| public final static String NO_DATA = "-1"; | |||||
| public final static String LB_SPLIT = ":"; | |||||
| //-------------重量------------ | //-------------重量------------ | ||||
| /** | |||||
| * 服务器返回(数据库读取) | |||||
| * | |||||
| * @param unit 当前的单位 | |||||
| * @param data 数据,已转换为当前单位的数据 | |||||
| * @param decimal 小数位 | |||||
| * @return 返回指定单位显示 | |||||
| */ | |||||
| public static String getWeightToKg(int unit, String data, int decimal) { | |||||
| float weight = -1f; | |||||
| float g; | |||||
| float oz; | |||||
| if (TextUtils.isEmpty(data) || NO_DATA.equalsIgnoreCase(data)) { | |||||
| return NO_DATA; | |||||
| } | |||||
| if (unit == UserUnitConfig.USER_UNIT_KG) {//单位相同直接返回 | |||||
| weight = Float.parseFloat(String.format(Locale.US, data)); | |||||
| } | |||||
| switch (unit) { | |||||
| case UserUnitConfig.USER_UNIT_FG: | |||||
| weight = UnitUtils.fgToKG(Float.parseFloat(data)); | |||||
| break; | |||||
| case UserUnitConfig.USER_UNIT_OZ: | |||||
| g = UnitUtils.ozToG(Float.parseFloat(data)); | |||||
| weight = UnitUtils.gToKG(g); | |||||
| break; | |||||
| case UserUnitConfig.USER_UNIT_LB: | |||||
| oz = getWeightLbToOz(data); | |||||
| g = UnitUtils.ozToG(oz); | |||||
| weight = UnitUtils.gToKG(g); | |||||
| break; | |||||
| case UserUnitConfig.USER_UNIT_G: | |||||
| weight = UnitUtils.gToKG(Float.parseFloat(data)); | |||||
| break; | |||||
| case UserUnitConfig.USER_UNIT_LB_LB: | |||||
| oz = UnitUtils.lbToOz(Float.parseFloat(data)); | |||||
| g = UnitUtils.ozToG(oz); | |||||
| weight = UnitUtils.gToKG(g); | |||||
| break; | |||||
| case UserUnitConfig.USER_UNIT_ST: | |||||
| String[] weightStlb = null; | |||||
| if (data.contains(":")) { | |||||
| weightStlb = data.split(":"); | |||||
| } | |||||
| if (weightStlb != null && weightStlb.length >= 2) { | |||||
| if (weightStlb[0].contains("-")) { | |||||
| oz = UnitUtils.lbToOz(UnitUtils.stToLb(Float.parseFloat(weightStlb[0])) - Math.abs(Float.parseFloat(weightStlb[1]))); | |||||
| } else { | |||||
| oz = UnitUtils.lbToOz(UnitUtils.stToLb(Float.parseFloat(weightStlb[0])) + Math.abs(Float.parseFloat(weightStlb[1]))); | |||||
| } | |||||
| g = UnitUtils.ozToG(oz); | |||||
| weight = UnitUtils.gToKG(g); | |||||
| } | |||||
| break; | |||||
| } | |||||
| return getHoldDecimal(decimal, weight); | |||||
| } | |||||
| /** | |||||
| * lb:oz转Oz | |||||
| */ | |||||
| private static float getWeightLbToOz(String lbStr) { | |||||
| float lb = 0; | |||||
| float oz = 0; | |||||
| if (lbStr.contains(LB_SPLIT)) { | |||||
| String[] lbOzS = lbStr.split(LB_SPLIT); | |||||
| lb = Float.parseFloat(lbOzS[0]); | |||||
| oz = Float.parseFloat(lbOzS[1]); | |||||
| } else { | |||||
| lb = Float.parseFloat(lbStr); | |||||
| } | |||||
| float ozSize = UnitUtils.lbToOz(lb) + oz; | |||||
| return ozSize; | |||||
| } | |||||
| /** | /** | ||||
| * st转lb | * st转lb | ||||
| */ | */ |
| <?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||||
| <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||
| android:layout_width="match_parent" | |||||
| android:layout_height="match_parent" | |||||
| android:orientation="vertical"> | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="match_parent" | |||||
| android:orientation="vertical"> | |||||
| <ScrollView | <ScrollView | ||||
| android:layout_width="match_parent" | android:layout_width="match_parent" | ||||
| <Button | <Button | ||||
| android:id="@+id/user" | |||||
| android:id="@+id/btnUser" | |||||
| android:layout_width="wrap_content" | android:layout_width="wrap_content" | ||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:text="用户" | android:text="用户" |
| android:layout_width="wrap_content" | android:layout_width="wrap_content" | ||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:text="读SN" /> | android:text="读SN" /> | ||||
| <Button | |||||
| android:id="@+id/btnGetVersion46" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="读版本(0x46)" /> | |||||
| </LinearLayout> | </LinearLayout> | ||||
| <?xml version="1.0" encoding="utf-8"?> | |||||
| <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="match_parent" | |||||
| android:focusable="true" | |||||
| android:focusableInTouchMode="true" | |||||
| android:orientation="vertical"> | |||||
| <ScrollView | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="0dp" | |||||
| android:layout_weight="1"> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content" | |||||
| android:orientation="vertical"> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content" | |||||
| android:padding="2dp"> | |||||
| <Button | |||||
| android:id="@+id/btnPause" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="暂停刷新" /> | |||||
| <Button | |||||
| android:id="@+id/btnContinue" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="继续刷新" /> | |||||
| <Button | |||||
| android:id="@+id/btnClear" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="清除log" /> | |||||
| </LinearLayout> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content" | |||||
| android:padding="2dp"> | |||||
| <Button | |||||
| android:id="@+id/btnWakeup" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="唤醒" /> | |||||
| <Button | |||||
| android:id="@+id/btnTest" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="测量" /> | |||||
| <Button | |||||
| android:id="@+id/btnStopTest" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="停止测量" /> | |||||
| <Button | |||||
| android:id="@+id/btnReset" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="重置" /> | |||||
| </LinearLayout> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content" | |||||
| android:padding="2dp"> | |||||
| <EditText | |||||
| android:id="@+id/etEmissivity" | |||||
| android:layout_width="100dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:digits="0123456789." | |||||
| android:hint="发射率(0.10~1.00)" | |||||
| android:textSize="12dp" /> | |||||
| <Button | |||||
| android:id="@+id/btnEmissivity" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="发射率" /> | |||||
| <EditText | |||||
| android:id="@+id/etAutoShutdown" | |||||
| android:layout_width="100dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:digits="0123456789" | |||||
| android:hint="自动关机(S)" | |||||
| android:textSize="12dp" /> | |||||
| <Button | |||||
| android:id="@+id/btnAutoShutdown" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="自动关机" /> | |||||
| </LinearLayout> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content" | |||||
| android:padding="2dp"> | |||||
| <EditText | |||||
| android:id="@+id/etHighTemp" | |||||
| android:layout_width="100dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:hint="高温(℃)" | |||||
| android:textSize="12dp" /> | |||||
| <EditText | |||||
| android:id="@+id/etLowTemp" | |||||
| android:layout_width="100dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:hint="低温(℃)" | |||||
| android:textSize="12dp" /> | |||||
| <Button | |||||
| android:id="@+id/btnHighOrLowTemp" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="发送高低温" /> | |||||
| </LinearLayout> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content" | |||||
| android:padding="2dp"> | |||||
| <Button | |||||
| android:id="@+id/btnGetDeviceStatus" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="获取设备信息" /> | |||||
| <Button | |||||
| android:id="@+id/btnGetDeviceParameter" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="获取设备参数" /> | |||||
| </LinearLayout> | |||||
| </LinearLayout> | |||||
| </ScrollView> | |||||
| <ListView | |||||
| android:id="@+id/listview" | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="0dp" | |||||
| android:layout_weight="2" | |||||
| android:padding="10dp" | |||||
| android:stackFromBottom="true" | |||||
| android:transcriptMode="alwaysScroll"> | |||||
| </ListView> | |||||
| </LinearLayout> |
| <?xml version="1.0" encoding="utf-8"?> | |||||
| <androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android" | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="match_parent" | |||||
| android:orientation="vertical"> | |||||
| <androidx.appcompat.widget.LinearLayoutCompat | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content" | |||||
| android:orientation="horizontal" | |||||
| android:padding="5dp"> | |||||
| <TextView | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="设备MAC:" /> | |||||
| <TextView | |||||
| android:id="@+id/tvMac" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="00:00:00:00:00:00" /> | |||||
| <Button | |||||
| android:id="@+id/btnConnect" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:layout_marginStart="10dp" | |||||
| android:text="连接" /> | |||||
| <Button | |||||
| android:id="@+id/btnDisconnect" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="断连" /> | |||||
| </androidx.appcompat.widget.LinearLayoutCompat> | |||||
| <androidx.appcompat.widget.LinearLayoutCompat | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content" | |||||
| android:orientation="horizontal"> | |||||
| <Button | |||||
| android:id="@+id/btnClear" | |||||
| android:layout_width="60dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="清空" /> | |||||
| <Button | |||||
| android:id="@+id/btnGetVersion" | |||||
| android:layout_width="70dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="版本号" /> | |||||
| <Button | |||||
| android:id="@+id/btnGetDeviceStatus" | |||||
| android:layout_width="85dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="设备状态" /> | |||||
| <Spinner | |||||
| android:id="@+id/spEncoding" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:entries="@array/spinner_encoding_format" /> | |||||
| </androidx.appcompat.widget.LinearLayoutCompat> | |||||
| <androidx.appcompat.widget.LinearLayoutCompat | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content" | |||||
| android:orientation="horizontal"> | |||||
| <TextView | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="打字速度设置(us):" /> | |||||
| <EditText | |||||
| android:id="@+id/etSpeedUs" | |||||
| android:layout_width="0dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:layout_weight="1" | |||||
| android:digits="0123456789" | |||||
| android:inputType="number" | |||||
| android:text="100" /> | |||||
| <Button | |||||
| android:id="@+id/btnSendSpeed" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="设置" /> | |||||
| </androidx.appcompat.widget.LinearLayoutCompat> | |||||
| <androidx.appcompat.widget.LinearLayoutCompat | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content" | |||||
| android:orientation="horizontal"> | |||||
| <EditText | |||||
| android:id="@+id/etData" | |||||
| android:layout_width="0dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:layout_weight="1" | |||||
| android:maxHeight="500dp" /> | |||||
| <Button | |||||
| android:id="@+id/btnSendData" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="发送数据" /> | |||||
| </androidx.appcompat.widget.LinearLayoutCompat> | |||||
| <androidx.appcompat.widget.LinearLayoutCompat | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content"> | |||||
| <TextView | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="次数:" /> | |||||
| <EditText | |||||
| android:id="@+id/etCount" | |||||
| android:layout_width="80dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:digits="0123456789" | |||||
| android:inputType="number" | |||||
| android:text="1000" /> | |||||
| <TextView | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="间隔(ms):" /> | |||||
| <EditText | |||||
| android:id="@+id/etIntervalMs" | |||||
| android:layout_width="80dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:digits="0123456789" | |||||
| android:inputType="number" | |||||
| android:text="1000" /> | |||||
| <TextView | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="已发送:" /> | |||||
| <TextView | |||||
| android:id="@+id/tvSendCount" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="0" /> | |||||
| </androidx.appcompat.widget.LinearLayoutCompat> | |||||
| <androidx.appcompat.widget.LinearLayoutCompat | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content"> | |||||
| <Button | |||||
| android:id="@+id/btnLoopSend" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="循环发送" /> | |||||
| <Button | |||||
| android:id="@+id/btnStopSend" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="停止发送" /> | |||||
| <Button | |||||
| android:id="@+id/btnResetCount" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="重置已发送" /> | |||||
| </androidx.appcompat.widget.LinearLayoutCompat> | |||||
| <ListView | |||||
| android:id="@+id/listview" | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="0dp" | |||||
| android:layout_weight="2" | |||||
| android:minHeight="100dp" | |||||
| android:padding="10dp"> | |||||
| </ListView> | |||||
| </androidx.appcompat.widget.LinearLayoutCompat> |
| <?xml version="1.0" encoding="utf-8"?> | |||||
| <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="match_parent" | |||||
| android:orientation="vertical"> | |||||
| <ScrollView | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="0dp" | |||||
| android:layout_weight="1"> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content" | |||||
| android:orientation="vertical"> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content" | |||||
| android:paddingStart="10dp" | |||||
| android:paddingEnd="10dp"> | |||||
| <EditText | |||||
| android:id="@+id/et_uuid" | |||||
| android:layout_width="180dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:hint="uuid" | |||||
| android:lines="1" | |||||
| android:text="0000FFE1" /> | |||||
| <Button | |||||
| android:id="@+id/btn_uuid" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="特征设置" /> | |||||
| </LinearLayout> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content" | |||||
| android:paddingStart="10dp" | |||||
| android:paddingEnd="10dp"> | |||||
| <EditText | |||||
| android:id="@+id/et_uuid_server" | |||||
| android:layout_width="180dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:hint="uuid_server" | |||||
| android:maxLines="1" | |||||
| android:text="0000FFE0" /> | |||||
| <Button | |||||
| android:id="@+id/btn_uuid_server" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="服务设置" /> | |||||
| </LinearLayout> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content" | |||||
| android:paddingStart="10dp" | |||||
| android:paddingEnd="10dp"> | |||||
| <EditText | |||||
| android:id="@+id/et_notify" | |||||
| android:layout_width="180dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:hint="uuid_notify" | |||||
| android:maxLines="1" | |||||
| android:text="0000FFE2" /> | |||||
| <Button | |||||
| android:id="@+id/btn_notify" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="Notify" /> | |||||
| </LinearLayout> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content"> | |||||
| <Button | |||||
| android:id="@+id/btnSelectFile" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="选择文件" /> | |||||
| <TextView | |||||
| android:id="@+id/tv_file_name" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" /> | |||||
| </LinearLayout> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content"> | |||||
| <Button | |||||
| android:id="@+id/btnWriteTest" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="开始写测试" /> | |||||
| <Button | |||||
| android:id="@+id/btnReadTest" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="开始读测试" /> | |||||
| </LinearLayout> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content" | |||||
| android:orientation="vertical" | |||||
| > | |||||
| <TextView | |||||
| android:id="@+id/tvSpeedWrite" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="0 kb/s" /> | |||||
| <TextView | |||||
| android:id="@+id/tvSpeedRead" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="0 kb/s" /> | |||||
| </LinearLayout> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content" | |||||
| android:paddingStart="10dp" | |||||
| android:paddingEnd="10dp"> | |||||
| <TextView | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="接收(B):" | |||||
| android:textSize="18dp" /> | |||||
| <TextView | |||||
| android:id="@+id/tv_receive_number" | |||||
| android:layout_width="0dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:layout_weight="1" | |||||
| android:text="0" | |||||
| android:textSize="18dp" /> | |||||
| <TextView | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="发送(B):" | |||||
| android:textSize="18dp" /> | |||||
| <TextView | |||||
| android:id="@+id/tv_send_number" | |||||
| android:layout_width="0dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:layout_weight="1" | |||||
| android:text="0" | |||||
| android:textSize="18dp" /> | |||||
| </LinearLayout> | |||||
| </LinearLayout> | |||||
| </ScrollView> | |||||
| <ListView | |||||
| android:id="@+id/listview" | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="0dp" | |||||
| android:layout_weight="1" | |||||
| android:padding="10dp" | |||||
| android:stackFromBottom="true" | |||||
| android:transcriptMode="alwaysScroll"> | |||||
| </ListView> | |||||
| </LinearLayout> |
| android:layout_height="wrap_content"> | android:layout_height="wrap_content"> | ||||
| <Button | <Button | ||||
| android:id="@+id/support_unit" | |||||
| android:id="@+id/getSupportUnit" | |||||
| android:text="查询支持单位" | android:text="查询支持单位" | ||||
| android:layout_width="wrap_content" | android:layout_width="wrap_content" | ||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" |
| <LinearLayout | <LinearLayout | ||||
| android:layout_width="match_parent" | android:layout_width="match_parent" | ||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:orientation="horizontal" | |||||
| android:layout_marginStart="10dp" | android:layout_marginStart="10dp" | ||||
| android:layout_marginTop="10dp" | android:layout_marginTop="10dp" | ||||
| android:gravity="center_vertical"> | |||||
| android:gravity="center_vertical" | |||||
| android:orientation="horizontal"> | |||||
| <TextView | <TextView | ||||
| android:layout_width="wrap_content" | android:layout_width="wrap_content" | ||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:id="@+id/tv_broadcast_mac_weight" | android:id="@+id/tv_broadcast_mac_weight" | ||||
| android:layout_width="wrap_content" | android:layout_width="wrap_content" | ||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:text="" | |||||
| android:layout_marginStart="5dp" /> | |||||
| android:layout_marginStart="5dp" | |||||
| android:text="" /> | |||||
| </LinearLayout> | </LinearLayout> | ||||
| <LinearLayout | <LinearLayout | ||||
| android:layout_width="match_parent" | android:layout_width="match_parent" | ||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:orientation="horizontal" | |||||
| android:layout_marginStart="10dp" | android:layout_marginStart="10dp" | ||||
| android:layout_marginTop="10dp" | android:layout_marginTop="10dp" | ||||
| android:gravity="center_vertical" | android:gravity="center_vertical" | ||||
| > | |||||
| android:orientation="horizontal"> | |||||
| <TextView | <TextView | ||||
| android:layout_width="wrap_content" | android:layout_width="wrap_content" | ||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:id="@+id/tv_broadcast_temp_weight" | android:id="@+id/tv_broadcast_temp_weight" | ||||
| android:layout_width="wrap_content" | android:layout_width="wrap_content" | ||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:text="--℃" | |||||
| android:layout_marginStart="5dp" | android:layout_marginStart="5dp" | ||||
| /> | |||||
| android:text="--℃" /> | |||||
| <TextView | <TextView | ||||
| android:id="@+id/tv_broadcast_did_weight" | android:id="@+id/tv_broadcast_did_weight" | ||||
| android:layout_width="wrap_content" | android:layout_width="wrap_content" | ||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:text="" | |||||
| android:layout_marginStart="20dp" | android:layout_marginStart="20dp" | ||||
| /> | |||||
| android:text="" /> | |||||
| </LinearLayout> | </LinearLayout> | ||||
| <LinearLayout | <LinearLayout | ||||
| android:layout_width="match_parent" | android:layout_width="match_parent" | ||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:layout_height="0dp" | android:layout_height="0dp" | ||||
| android:layout_weight="1" | android:layout_weight="1" | ||||
| android:padding="10dp" | android:padding="10dp" | ||||
| android:stackFromBottom="true" | |||||
| android:transcriptMode="alwaysScroll"> | |||||
| > | |||||
| </ListView> | </ListView> | ||||
| android:layout_width="0dp" | android:layout_width="0dp" | ||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:layout_weight="1" | android:layout_weight="1" | ||||
| android:hint="请输入需要连接的设备MAC地址" | |||||
| android:hint="请输入需要连接MAC地址(16进制)" | |||||
| android:paddingStart="20dp" | android:paddingStart="20dp" | ||||
| android:inputType="textCapCharacters" | |||||
| android:inputType="text" | |||||
| android:digits="0123456789abcdefABCDEF:" | android:digits="0123456789abcdefABCDEF:" | ||||
| android:maxLength="17" | android:maxLength="17" | ||||
| android:textSize="14dp" /> | android:textSize="14dp" /> | ||||
| <EditText | <EditText | ||||
| android:id="@+id/etCheckTime" | android:id="@+id/etCheckTime" | ||||
| android:layout_width="0dp" | android:layout_width="0dp" | ||||
| android:layout_height="wrap_content" | |||||
| android:layout_height="50dp" | |||||
| android:layout_weight="1" | android:layout_weight="1" | ||||
| android:hint="检测间隔时间(分)" | |||||
| android:paddingStart="20dp" | |||||
| android:hint="检测间隔(分钟)" | |||||
| android:inputType="number" | android:inputType="number" | ||||
| android:maxLength="3" | android:maxLength="3" | ||||
| android:textSize="14dp" /> | |||||
| android:textSize="10dp" /> | |||||
| <CheckBox | <CheckBox | ||||
| android:id="@+id/cbCheckTime" | android:id="@+id/cbCheckTime" | ||||
| android:layout_width="wrap_content" | android:layout_width="wrap_content" | ||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:checked="true" | android:checked="true" | ||||
| android:textSize="10dp" | |||||
| android:text="开启/关闭测量"/> | android:text="开启/关闭测量"/> | ||||
| <Button | <Button | ||||
| android:layout_height="match_parent" | android:layout_height="match_parent" | ||||
| android:text="设置检测间隔时间" /> | android:text="设置检测间隔时间" /> | ||||
| <Button | |||||
| android:id="@+id/btnQueryTheme" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="match_parent" | |||||
| android:text="查询主题" /> | |||||
| </androidx.appcompat.widget.LinearLayoutCompat> | </androidx.appcompat.widget.LinearLayoutCompat> | ||||
| <androidx.appcompat.widget.LinearLayoutCompat | <androidx.appcompat.widget.LinearLayoutCompat | ||||
| android:id="@+id/btnSetBleName" | android:id="@+id/btnSetBleName" | ||||
| android:layout_width="wrap_content" | android:layout_width="wrap_content" | ||||
| android:layout_height="match_parent" | android:layout_height="match_parent" | ||||
| android:text="设置检测间隔时间" /> | |||||
| android:text="设置蓝牙名称" /> | |||||
| <EditText | |||||
| android:id="@+id/etThemeNum" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="match_parent" | |||||
| android:hint="主题编号" | |||||
| android:inputType="number" | |||||
| android:textSize="14dp" /> | |||||
| <Button | |||||
| android:id="@+id/btnSetThemeNum" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="match_parent" | |||||
| android:text="设置主题" /> | |||||
| </androidx.appcompat.widget.LinearLayoutCompat> | </androidx.appcompat.widget.LinearLayoutCompat> | ||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content" | |||||
| android:minHeight="50dp" | |||||
| android:orientation="horizontal"> | |||||
| <EditText | |||||
| android:id="@+id/etHisTime" | |||||
| android:layout_width="0dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:layout_weight="1" | |||||
| android:hint="设置历史上传间隔(分钟)" | |||||
| android:paddingStart="20dp" | |||||
| android:inputType="textCapCharacters" | |||||
| android:digits="0123456789" | |||||
| android:maxLength="5" | |||||
| android:textSize="10dp" /> | |||||
| <CheckBox | |||||
| android:id="@+id/cbHisTime" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:checked="true" | |||||
| android:textSize="10dp" | |||||
| android:text="开启/关闭历史定时上传"/> | |||||
| <Button | |||||
| android:id="@+id/btnHisTime" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="match_parent" | |||||
| android:text="设置历史上传间隔" | |||||
| android:textSize="12dp"/> | |||||
| </LinearLayout> | |||||
| <LinearLayout | <LinearLayout | ||||
| android:layout_width="match_parent" | android:layout_width="match_parent" | ||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| </LinearLayout> | </LinearLayout> | ||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content" | |||||
| android:layout_marginStart="10dp" | |||||
| android:orientation="horizontal"> | |||||
| <Button | |||||
| android:id="@+id/btnQueryVersion" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="match_parent" | |||||
| android:text="查询版本号" /> | |||||
| <Button | |||||
| android:id="@+id/btnSetBind" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="match_parent" | |||||
| android:text="进入绑定模式" /> | |||||
| <Button | |||||
| android:id="@+id/btnQueryHardware" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="match_parent" | |||||
| android:text="查询硬件状态" /> | |||||
| </LinearLayout> | |||||
| <ListView | <ListView | ||||
| android:id="@+id/log_list" | android:id="@+id/log_list" | ||||
| android:layout_width="match_parent" | android:layout_width="match_parent" |
| android:text="过滤:true" /> | android:text="过滤:true" /> | ||||
| <Button | <Button | ||||
| android:id="@+id/跳过" | |||||
| android:id="@+id/btnJump" | |||||
| android:layout_width="wrap_content" | android:layout_width="wrap_content" | ||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:text="跳过" /> | android:text="跳过" /> |
| </LinearLayout> | </LinearLayout> | ||||
| <Button | |||||
| android:id="@+id/support_unit" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="查询支持单位" /> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:orientation="horizontal" | |||||
| android:layout_height="wrap_content"> | |||||
| <Button | |||||
| android:id="@+id/getSupportUnit" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="查询支持单位" /> | |||||
| <Button | |||||
| android:id="@+id/btnConnect" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="连接" /> | |||||
| </LinearLayout> | |||||
| <ListView | <ListView | ||||
| android:id="@+id/log_list" | android:id="@+id/log_list" |
| android:text="lb" /> | android:text="lb" /> | ||||
| </RadioGroup> | </RadioGroup> | ||||
| <LinearLayout | <LinearLayout | ||||
| android:layout_width="match_parent" | android:layout_width="match_parent" | ||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| <TextView | <TextView | ||||
| android:layout_width="wrap_content" | android:layout_width="wrap_content" | ||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:text="年龄:" /> | |||||
| android:text="年龄:" | |||||
| android:textSize="12dp" /> | |||||
| <EditText | <EditText | ||||
| android:id="@+id/et_age" | android:id="@+id/et_age" | ||||
| android:layout_width="100dp" | |||||
| android:layout_width="80dp" | |||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:inputType="number" | android:inputType="number" | ||||
| android:text="34" /> | android:text="34" /> | ||||
| <TextView | <TextView | ||||
| android:layout_width="wrap_content" | android:layout_width="wrap_content" | ||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:text="性别(女=0,男=1):" /> | |||||
| android:text="性别(女=0,男=1):" | |||||
| android:textSize="12dp" /> | |||||
| <EditText | <EditText | ||||
| android:id="@+id/et_sex" | android:id="@+id/et_sex" | ||||
| android:layout_width="100dp" | |||||
| android:layout_width="80dp" | |||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:inputType="number" | android:inputType="number" | ||||
| android:text="1" /> | android:text="1" /> | ||||
| <TextView | <TextView | ||||
| android:layout_width="wrap_content" | android:layout_width="wrap_content" | ||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:text="身高(CM):" /> | |||||
| android:text="身高(CM):" | |||||
| android:textSize="12dp" /> | |||||
| <EditText | <EditText | ||||
| android:id="@+id/et_height" | android:id="@+id/et_height" | ||||
| android:layout_width="100dp" | |||||
| android:layout_width="80dp" | |||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:inputType="number" | android:inputType="number" | ||||
| android:text="178" /> | android:text="178" /> | ||||
| <TextView | <TextView | ||||
| android:layout_width="wrap_content" | android:layout_width="wrap_content" | ||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:text="体重(kg):" /> | |||||
| android:text="体重(kg):" | |||||
| android:textSize="12dp" /> | |||||
| <EditText | <EditText | ||||
| android:id="@+id/et_weight" | android:id="@+id/et_weight" | ||||
| android:layout_width="100dp" | |||||
| android:layout_width="80dp" | |||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:digits="0123456789." | |||||
| android:inputType="number" | android:inputType="number" | ||||
| android:text="78" /> | android:text="78" /> | ||||
| <Button | |||||
| android:id="@+id/btn_update" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:textSize="12dp" | |||||
| android:text="更新用户" /> | |||||
| </LinearLayout> | </LinearLayout> | ||||
| android:orientation="horizontal" | android:orientation="horizontal" | ||||
| android:layout_height="wrap_content"> | android:layout_height="wrap_content"> | ||||
| <Button | <Button | ||||
| android:id="@+id/support_unit" | |||||
| android:id="@+id/getSupportUnit" | |||||
| android:layout_width="wrap_content" | android:layout_width="wrap_content" | ||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:text="查询支持单位" /> | android:text="查询支持单位" /> |
| android:layout_width="match_parent" | android:layout_width="match_parent" | ||||
| android:layout_height="wrap_content"> | android:layout_height="wrap_content"> | ||||
| <Button | |||||
| android:id="@+id/btnClearLog" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:onClick="onClick" | |||||
| android:text="清除log" /> | |||||
| <Button | |||||
| android:id="@+id/btnPauseLog" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:onClick="onClick" | |||||
| android:text="暂停log" /> | |||||
| <Button | <Button | ||||
| android:id="@+id/btnGetCurInfo" | android:id="@+id/btnGetCurInfo" | ||||
| android:layout_width="wrap_content" | android:layout_width="wrap_content" | ||||
| android:id="@+id/list_view" | android:id="@+id/list_view" | ||||
| android:layout_width="match_parent" | android:layout_width="match_parent" | ||||
| android:layout_height="0dp" | android:layout_height="0dp" | ||||
| android:layout_weight="1" | |||||
| /> | |||||
| android:layout_weight="1" /> | |||||
| </androidx.appcompat.widget.LinearLayoutCompat> | </androidx.appcompat.widget.LinearLayoutCompat> |
| <?xml version="1.0" encoding="utf-8"?> | |||||
| <androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android" | |||||
| xmlns:app="http://schemas.android.com/apk/res-auto" | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="match_parent" | |||||
| android:orientation="vertical"> | |||||
| <ScrollView | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="0dp" | |||||
| android:layout_weight="1"> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content" | |||||
| android:orientation="vertical" | |||||
| android:padding="5dp"> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content"> | |||||
| <Button | |||||
| android:id="@+id/btnClearLog" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:onClick="onClick" | |||||
| android:text="清除log" /> | |||||
| <Button | |||||
| android:id="@+id/btnPauseLog" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:onClick="onClick" | |||||
| android:text="暂停log" /> | |||||
| </LinearLayout> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content"> | |||||
| <Button | |||||
| android:id="@+id/btnGetSupportGas" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:onClick="onClick" | |||||
| android:text="支持的气体" /> | |||||
| <Button | |||||
| android:id="@+id/btnGetSupportFun" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:onClick="onClick" | |||||
| android:text="支持的功能" /> | |||||
| </LinearLayout> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content"> | |||||
| <Button | |||||
| android:id="@+id/btnGetAlarmSwitch" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:onClick="onClick" | |||||
| android:text="获取报警开关" /> | |||||
| <Button | |||||
| android:id="@+id/btnSetAlarmSwitch" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:onClick="onClick" | |||||
| android:text="设置报警开关" /> | |||||
| <Button | |||||
| android:id="@+id/btnGetAlarmTime" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:onClick="onClick" | |||||
| android:text="获取报警时长" /> | |||||
| </LinearLayout> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content"> | |||||
| <Button | |||||
| android:id="@+id/btnGetAlarmFrequency" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:onClick="onClick" | |||||
| android:text="获取报警频率" /> | |||||
| <Button | |||||
| android:id="@+id/btnGetGasInfo" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:onClick="onClick" | |||||
| android:text="气体信息" /> | |||||
| <Button | |||||
| android:id="@+id/btnGetPowerInfo" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:onClick="onClick" | |||||
| android:text="电量信息" /> | |||||
| <Button | |||||
| android:id="@+id/btnSetTime" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:onClick="onClick" | |||||
| android:text="同步时间" /> | |||||
| </LinearLayout> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content"> | |||||
| </LinearLayout> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content"> | |||||
| <EditText | |||||
| android:id="@+id/et1" | |||||
| android:layout_width="100dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:digits="0123456789" | |||||
| android:hint="时间1" | |||||
| android:text="1" | |||||
| android:inputType="number" | |||||
| android:textSize="14dp" /> | |||||
| <Button | |||||
| android:id="@+id/btnSaveFrequency" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:onClick="onClick" | |||||
| android:text="数据存储频率(min)" /> | |||||
| <Button | |||||
| android:id="@+id/btnReportInterval" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:onClick="onClick" | |||||
| android:text="上报间隔(min)" /> | |||||
| </LinearLayout> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content"> | |||||
| <EditText | |||||
| android:id="@+id/et2" | |||||
| android:layout_width="100dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:digits="0123456789" | |||||
| android:hint="铃声id" | |||||
| android:text="1" | |||||
| android:inputType="number" | |||||
| android:textSize="14dp" /> | |||||
| <Button | |||||
| android:id="@+id/btnGetAlarmRing" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:onClick="onClick" | |||||
| android:text="报警铃声" /> | |||||
| <Button | |||||
| android:id="@+id/btnAlarmRingTest" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:onClick="onClick" | |||||
| android:text="报警铃声测试" /> | |||||
| </LinearLayout> | |||||
| </LinearLayout> | |||||
| </ScrollView> | |||||
| <ListView | |||||
| android:id="@+id/list_view" | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="0dp" | |||||
| android:layout_weight="1" /> | |||||
| </androidx.appcompat.widget.LinearLayoutCompat> |
| <?xml version="1.0" encoding="utf-8"?> | |||||
| <LinearLayout | |||||
| xmlns:android="http://schemas.android.com/apk/res/android" | |||||
| xmlns:app="http://schemas.android.com/apk/res-auto" | |||||
| xmlns:tools="http://schemas.android.com/tools" | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="match_parent" | |||||
| android:orientation="vertical"> | |||||
| <ScrollView | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="0dp" | |||||
| android:layout_weight="1" | |||||
| > | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="0dp" | |||||
| android:layout_weight="1" | |||||
| android:orientation="vertical" | |||||
| > | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content" | |||||
| android:orientation="horizontal"> | |||||
| <Button | |||||
| android:id="@+id/button_connect" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="连接" | |||||
| /> | |||||
| <Button | |||||
| android:id="@+id/button_dis" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="断开" | |||||
| tools:layout_editor_absoluteX="281dp" | |||||
| tools:layout_editor_absoluteY="40dp"/> | |||||
| <Button | |||||
| android:id="@+id/button_clear" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="清空" | |||||
| tools:layout_editor_absoluteX="281dp" | |||||
| tools:layout_editor_absoluteY="120dp"/> | |||||
| <Button | |||||
| android:id="@+id/button_ota" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="OTA" | |||||
| tools:layout_editor_absoluteX="281dp" | |||||
| tools:layout_editor_absoluteY="120dp"/> | |||||
| </LinearLayout> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content" | |||||
| android:orientation="horizontal"> | |||||
| <Button | |||||
| android:id="@+id/button_time" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="同步时间" | |||||
| /> | |||||
| <Button | |||||
| android:id="@+id/button_status" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="获取状态" | |||||
| tools:layout_editor_absoluteX="281dp" | |||||
| tools:layout_editor_absoluteY="40dp"/> | |||||
| <Button | |||||
| android:id="@+id/button_info" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="获取参数" | |||||
| tools:layout_editor_absoluteX="281dp" | |||||
| tools:layout_editor_absoluteY="40dp"/> | |||||
| <Button | |||||
| android:id="@+id/button_log" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="读取记录" | |||||
| tools:layout_editor_absoluteX="16dp" | |||||
| tools:layout_editor_absoluteY="120dp"/> | |||||
| </LinearLayout> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content"> | |||||
| <Button | |||||
| android:id="@+id/button_close" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="关机" | |||||
| tools:layout_editor_absoluteX="148dp" | |||||
| tools:layout_editor_absoluteY="120dp"/> | |||||
| <Button | |||||
| android:id="@+id/button_activation" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="激活设备" | |||||
| tools:layout_editor_absoluteX="148dp" | |||||
| tools:layout_editor_absoluteY="120dp"/> | |||||
| <Button | |||||
| android:id="@+id/button_close_activation" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="清除激活状态" | |||||
| tools:layout_editor_absoluteX="148dp" | |||||
| tools:layout_editor_absoluteY="120dp"/> | |||||
| <Button | |||||
| android:id="@+id/button_bind" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="绑定" | |||||
| tools:layout_editor_absoluteX="148dp" | |||||
| tools:layout_editor_absoluteY="120dp"/> | |||||
| </LinearLayout> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content"> | |||||
| <Button | |||||
| android:id="@+id/button_reboot" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="重启" | |||||
| tools:layout_editor_absoluteX="148dp" | |||||
| tools:layout_editor_absoluteY="120dp"/> | |||||
| <Button | |||||
| android:id="@+id/button_version" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="版本号" | |||||
| tools:layout_editor_absoluteX="148dp" | |||||
| tools:layout_editor_absoluteY="120dp"/> | |||||
| <TextView | |||||
| android:id="@+id/tv_version" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="bm" | |||||
| /> | |||||
| </LinearLayout> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content"> | |||||
| <EditText | |||||
| android:id="@+id/et_set_user" | |||||
| android:layout_width="0dp" | |||||
| android:layout_height="match_parent" | |||||
| android:layout_weight="1" | |||||
| android:digits="0123456789" | |||||
| android:hint="userId" | |||||
| android:text="1" | |||||
| /> | |||||
| <EditText | |||||
| android:id="@+id/et_set_user_status" | |||||
| android:layout_width="0dp" | |||||
| android:layout_height="match_parent" | |||||
| android:layout_weight="1" | |||||
| android:digits="0123456789" | |||||
| android:hint="status" | |||||
| android:maxLength="1" | |||||
| android:text="0" | |||||
| /> | |||||
| <Button | |||||
| android:id="@+id/button_user" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="下发用户" | |||||
| tools:layout_editor_absoluteX="148dp" | |||||
| tools:layout_editor_absoluteY="41dp"/> | |||||
| </LinearLayout> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="40dp" | |||||
| android:gravity="center_vertical" | |||||
| android:orientation="horizontal" | |||||
| > | |||||
| <TextView | |||||
| android:layout_width="100dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="靠近报警阀值:" | |||||
| /> | |||||
| <com.pinwang.ailinkblesdk.view.SeekBarMin | |||||
| android:id="@+id/seekBar1" | |||||
| style="@style/Widget.AppCompat.SeekBar" | |||||
| android:layout_width="0dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:layout_weight="1" | |||||
| /> | |||||
| <TextView | |||||
| android:id="@+id/text1" | |||||
| android:layout_width="50dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="阀值" | |||||
| /> | |||||
| </LinearLayout> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="40dp" | |||||
| android:gravity="center_vertical" | |||||
| android:orientation="horizontal" | |||||
| > | |||||
| <TextView | |||||
| android:layout_width="100dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="接收的阀值次数:" | |||||
| /> | |||||
| <com.pinwang.ailinkblesdk.view.SeekBarMin | |||||
| android:id="@+id/seekBar2" | |||||
| style="@style/Widget.AppCompat.SeekBar" | |||||
| android:layout_width="0dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:layout_weight="1" | |||||
| /> | |||||
| <TextView | |||||
| android:id="@+id/text2" | |||||
| android:layout_width="50dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="阀值" | |||||
| /> | |||||
| </LinearLayout> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="40dp" | |||||
| android:gravity="center_vertical" | |||||
| android:orientation="horizontal" | |||||
| > | |||||
| <TextView | |||||
| android:layout_width="100dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="脱离报警时间:" | |||||
| /> | |||||
| <com.pinwang.ailinkblesdk.view.SeekBarMin | |||||
| android:id="@+id/seekBar3" | |||||
| style="@style/Widget.AppCompat.SeekBar" | |||||
| android:layout_width="0dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:layout_weight="1" | |||||
| /> | |||||
| <TextView | |||||
| android:id="@+id/text3" | |||||
| android:layout_width="50dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="阀值" | |||||
| /> | |||||
| </LinearLayout> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="40dp" | |||||
| android:gravity="center_vertical" | |||||
| android:orientation="horizontal" | |||||
| > | |||||
| <TextView | |||||
| android:layout_width="100dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="脱离报警次数:" | |||||
| /> | |||||
| <com.pinwang.ailinkblesdk.view.SeekBarMin | |||||
| android:id="@+id/seekBar4" | |||||
| style="@style/Widget.AppCompat.SeekBar" | |||||
| android:layout_width="0dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:layout_weight="1"/> | |||||
| <TextView | |||||
| android:id="@+id/text4" | |||||
| android:layout_width="50dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="阀值" | |||||
| /> | |||||
| </LinearLayout> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="40dp" | |||||
| android:gravity="center_vertical" | |||||
| android:orientation="horizontal" | |||||
| > | |||||
| <TextView | |||||
| android:layout_width="100dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="Gsensor灵敏度:" | |||||
| /> | |||||
| <com.pinwang.ailinkblesdk.view.SeekBarMin | |||||
| android:id="@+id/seekBar5" | |||||
| style="@style/Widget.AppCompat.SeekBar" | |||||
| android:layout_width="0dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:layout_weight="1" | |||||
| /> | |||||
| <TextView | |||||
| android:id="@+id/text5" | |||||
| android:layout_width="50dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="阀值" | |||||
| /> | |||||
| </LinearLayout> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="40dp" | |||||
| android:gravity="center_vertical" | |||||
| android:orientation="horizontal" | |||||
| > | |||||
| <TextView | |||||
| android:layout_width="100dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="Gsensor不动的脱机时间:" | |||||
| /> | |||||
| <com.pinwang.ailinkblesdk.view.SeekBarMin | |||||
| android:id="@+id/seekBar6" | |||||
| style="@style/Widget.AppCompat.SeekBar" | |||||
| android:layout_width="0dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:layout_weight="1" | |||||
| /> | |||||
| <TextView | |||||
| android:id="@+id/text6" | |||||
| android:layout_width="50dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="阀值" | |||||
| /> | |||||
| </LinearLayout> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="40dp" | |||||
| android:gravity="center_vertical" | |||||
| android:orientation="horizontal" | |||||
| > | |||||
| <TextView | |||||
| android:layout_width="100dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="马达震动时间:" | |||||
| /> | |||||
| <com.pinwang.ailinkblesdk.view.SeekBarMin | |||||
| android:id="@+id/seekBar7" | |||||
| style="@style/Widget.AppCompat.SeekBar" | |||||
| android:layout_width="0dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:layout_weight="1" | |||||
| /> | |||||
| <TextView | |||||
| android:id="@+id/text7" | |||||
| android:layout_width="50dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="阀值" | |||||
| /> | |||||
| </LinearLayout> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content" | |||||
| android:gravity="right" | |||||
| > | |||||
| <Button | |||||
| android:id="@+id/button_set" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="设置参数" | |||||
| tools:layout_editor_absoluteX="281dp" | |||||
| tools:layout_editor_absoluteY="120dp"/> | |||||
| </LinearLayout> | |||||
| </LinearLayout> | |||||
| </ScrollView> | |||||
| <ListView | |||||
| android:id="@+id/listview" | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="0dp" | |||||
| android:layout_marginTop="10dp" | |||||
| android:layout_weight="1" | |||||
| android:padding="10dp" | |||||
| android:stackFromBottom="true" | |||||
| android:transcriptMode="alwaysScroll" | |||||
| > | |||||
| </ListView> | |||||
| </LinearLayout> |