| @@ -1,12 +1,15 @@ | |||
| apply plugin: 'com.android.application' | |||
| apply plugin: 'com.jakewharton.butterknife' | |||
| apply plugin: 'org.jetbrains.kotlin.android' | |||
| android { | |||
| compileSdkVersion 34 | |||
| namespace 'aicare.net.cn.sdk.ailinksdkdemoandroid' | |||
| buildFeatures { buildConfig true } | |||
| compileSdkVersion app_compileSdk | |||
| defaultConfig { | |||
| applicationId "aicare.net.cn.sdk.ailinksdkdemoandroid" | |||
| minSdkVersion 24 | |||
| targetSdkVersion 34 | |||
| versionName "1.15.06" | |||
| minSdkVersion app_minSdk | |||
| targetSdkVersion app_targetSdk | |||
| versionName "1.16.21" | |||
| versionCode getVersionCodeNumber(versionName) | |||
| testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" | |||
| } | |||
| @@ -18,8 +21,8 @@ android { | |||
| } | |||
| compileOptions { | |||
| sourceCompatibility JavaVersion.VERSION_1_8 | |||
| targetCompatibility JavaVersion.VERSION_1_8 | |||
| sourceCompatibility JavaVersion.VERSION_11 | |||
| targetCompatibility JavaVersion.VERSION_11 | |||
| } | |||
| repositories { | |||
| @@ -34,6 +37,13 @@ android { | |||
| } | |||
| } | |||
| kotlinOptions { | |||
| jvmTarget = '11' | |||
| } | |||
| buildFeatures { | |||
| viewBinding true | |||
| } | |||
| } | |||
| static def getVersionCodeNumber(String versionName) { | |||
| //1.49.13_beta05 | |||
| @@ -63,22 +73,20 @@ static def getVersionCodeNumber(String versionName) { | |||
| dependencies { | |||
| implementation fileTree(dir: 'libs', include: ['*.jar']) | |||
| implementation 'androidx.appcompat:appcompat:1.4.2' | |||
| implementation 'androidx.constraintlayout:constraintlayout:2.0.4' | |||
| implementation 'androidx.cardview:cardview:1.0.0' | |||
| implementation "androidx.appcompat:appcompat:$appcompat_version" | |||
| implementation "androidx.core:core-ktx:$core_ktx_version" | |||
| implementation "androidx.activity:activity:1.8.0" | |||
| testImplementation 'junit:junit:4.12' | |||
| implementation 'androidx.cardview:cardview:1.0.0' | |||
| //https://jitpack.io/#elinkthings/AILinkSDKRepositoryAndroid | |||
| implementation 'com.github.elinkthings:AILinkSDKRepositoryAndroid:1.14.21'//蓝牙核心库 | |||
| implementation 'com.github.elinkthings:AILinkSDKRepositoryAndroid:1.15.04'//蓝牙核心库 | |||
| //https://jitpack.io/#elinkthings/AILinkSDKParsingLibraryAndroid | |||
| implementation 'com.github.elinkthings:AILinkSDKParsingLibraryAndroid:1.9.7'//蓝牙解析库,需要依赖核心库 | |||
| //https://jitpack.io/#elinkthings/AILinkMqttRepositoryAndroid | |||
| implementation 'com.github.elinkthings:AILinkMqttRepositoryAndroid:1.3.2'//MQTT库,不需要的可以不用依赖 | |||
| implementation project(path: ':otalibrary') | |||
| implementation 'com.github.elinkthings:AILinkSDKParsingLibraryAndroid:1.9.13'//蓝牙解析库,需要依赖核心库 | |||
| implementation 'androidx.recyclerview:recyclerview:1.3.2' | |||
| implementation 'androidx.constraintlayout:constraintlayout:1.1.3' | |||
| // implementation project(path: ':otalibrary') | |||
| implementation 'androidx.recyclerview:recyclerview:1.3.2' | |||
| implementation 'com.jakewharton:butterknife:10.2.3' | |||
| annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.3' | |||
| api 'com.squareup.retrofit2:converter-gson:2.7.2' | |||
| // implementation (name: 'modulelibrary-release', ext: 'aar') | |||
| } | |||
| @@ -58,64 +58,173 @@ | |||
| </activity> | |||
| <activity android:name=".ClearShakeHandsActivity" /> | |||
| <activity | |||
| android:name=".ClearShakeHandsActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity android:name=".ShowBleActivity" /> | |||
| <activity android:name=".BabyCmdActivity" /> | |||
| <activity android:name=".TempGunCmdActivity" /> | |||
| <activity android:name=".SphyCmdActivity" /> | |||
| <activity android:name=".TempCmdActivity" /> | |||
| <activity android:name=".HeightCmdActivity" /> | |||
| <activity android:name=".BleCmdActivity" /> | |||
| <activity android:name=".TestCmdActivity" /> | |||
| <activity android:name=".TpmsConnectCmdActivity" /> | |||
| <activity android:name=".ConnectBleTestActivity" /> | |||
| <activity android:name=".ADWeightScaleCmdActivity" /> | |||
| <activity android:name=".ADWeightScaleUserActivity" /> | |||
| <activity android:name=".modules.wifi_ble_scale.WeightScaleWifiBleActivity" /> | |||
| <activity android:name=".WeightScaleBleActivity" /> | |||
| <activity android:name=".WifiConfigActivity" /> | |||
| <activity android:name=".modules.eight_bodyfat.EightBodyfatActivity" /> | |||
| <activity android:name=".modules.blood_glucose.BloodGlucoseActivity" /> | |||
| <activity android:name=".BabyBodyFatCmdActivity" /> | |||
| <activity android:name=".BroadcastScaleActivity" /> | |||
| <activity android:name=".TransmissionActivity" /> | |||
| <activity android:name=".BroadcastBloodOxygenActivity" /> | |||
| <activity android:name=".SmartMaskActivity" /> | |||
| <activity android:name=".modules.toothbrush.ToothBrushWifiBleActivity" /> | |||
| <activity android:name=".BLDWeightScaleBleActivity" /> | |||
| <activity android:name=".BloodOxygenActivity" /> | |||
| <activity android:name=".modules.blood_glucose.BloodGlucoseTestActivity" /> | |||
| <activity android:name=".modules.share_charger.ShareChargerActivity" /> | |||
| <activity android:name=".modules.broadcast_height.BroadcastHeightActivity" /> | |||
| <activity android:name=".modules.coffee_scale.CoffeeScaleActivity" /> | |||
| <activity android:name=".HeightWeightScaleActivity" /> | |||
| <activity android:name=".find.FindDeviceActivity" /> | |||
| <activity android:name=".TempHumidityActivity" /> | |||
| <activity android:name=".modules.ropeskipping.RopeSkippingActivity" /> | |||
| <activity android:name=".modules.airdetector.AirDetectorActivity" /> | |||
| <activity android:name=".modules.airdetector_test.AirDetectorActivityTest" /> | |||
| <activity | |||
| android:name=".ShowBleActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".BabyCmdActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".TempGunCmdActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".SphyCmdActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".TempCmdActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".HeightCmdActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".BleCmdActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".TestCmdActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".TpmsConnectCmdActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".ConnectBleTestActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".ADWeightScaleCmdActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".ADWeightScaleUserActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".modules.wifi_ble_scale.WeightScaleWifiBleActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".WeightScaleBleActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".WifiConfigActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".modules.eight_bodyfat.EightBodyfatActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".TestOtaActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".modules.blood_glucose.BloodGlucoseActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".BabyBodyFatCmdActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".BroadcastScaleActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".TransmissionActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".BroadcastBloodOxygenActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".modules.toothbrush.ToothBrushWifiOnOnBleActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".BLDWeightScaleBleActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".BloodOxygenActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".modules.blood_glucose.BloodGlucoseTestActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".modules.share_charger.ShareChargerActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".modules.broadcast_height.BroadcastHeightActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".modules.coffee_scale.CoffeeScaleActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".HeightWeightScaleActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".find.FindDeviceActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".TempHumidityActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".modules.ropeskipping.RopeSkippingActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".modules.airdetector.AirDetectorActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".modules.airdetector_test.AirDetectorActivityTest" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".modules.food_temp.FoodTempActivity" | |||
| android:screenOrientation="portrait" | |||
| android:windowSoftInputMode="adjustPan|stateHidden" /> | |||
| <activity android:name=".find.FindDeviceNewActivity" /> | |||
| <activity android:name=".BloodSugar4GActivity" /> | |||
| <activity android:name=".modules.share_socket.ShareSocketActivity" /> | |||
| <activity android:name=".modules.share_condom.ShareCondomActivity" /> | |||
| <activity android:name=".modules.broadcast_nutrition.BroadNutritionActivity" /> | |||
| <activity android:name=".modules.ble_nutrition.BleNutritionActivity" /> | |||
| <activity android:name=".modules.toothbrush_test.ToothbrushTestActivity" /> | |||
| <activity android:name=".modules.leaone_broadcast.LeaOneBroadcastActivity" /> | |||
| <activity android:name=".modules.fascia_gun.FasciaGunActivity" /> | |||
| <activity android:name=".modules.blood_pressure_tc.BloodPressureTcActivity" /> | |||
| <activity android:name=".modules.ropeskipping.RopeSkippingSetActivity" /> | |||
| <activity android:name=".modules.body_scale_4g.BodyScale4GActivity" /> | |||
| <activity android:name=".AiLinkScooterActivity" /> | |||
| <activity android:name=".modules.TempInstrument.TempInstrumentActivity" /> | |||
| <activity android:name=".AboutActivity" /> | |||
| <activity android:name=".modules.PublicBleNetworkCmdActivity" /> | |||
| <activity android:name=".modules.noise_meter.WifiBleNoiseMeterActivity" /> | |||
| <activity android:name=".modules.noise_meter.BleNoiseMeterActivity" /> | |||
| <activity | |||
| android:name=".find.FindDeviceNewActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".BloodSugar4GActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".modules.share_socket.ShareSocketActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".modules.share_condom.ShareCondomActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".modules.broadcast_nutrition.BroadNutritionActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".modules.ble_nutrition.BleNutritionActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".modules.toothbrush_test.ToothbrushTestActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".modules.leaone_broadcast.LeaOneBroadcastActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".modules.fascia_gun.FasciaGunActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".modules.blood_pressure_tc.BloodPressureTcActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".modules.ropeskipping.RopeSkippingSetActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".modules.body_scale_4g.BodyScale4GActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".AiLinkScooterActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".modules.TempInstrument.TempInstrumentActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".AboutActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".modules.PublicBleNetworkCmdActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".modules.noise_meter.WifiBleNoiseMeterActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".modules.noise_meter.BleNoiseMeterActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".modules.meat_probe_charger.MeatProbeChargerActivity" | |||
| android:screenOrientation="portrait" /> | |||
| @@ -132,17 +241,42 @@ | |||
| <activity | |||
| android:name=".modules.barometric_temp_humidity.BarometricTempHygrometerActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity android:name=".modules.wifible_sphy.WifiBleSphyActivity" /> | |||
| <activity android:name=".modules.PublicWifiBleOtaActivity" /> | |||
| <activity android:name=".modules.eight_bodyfat.dual_band.EightDoubleBodyfatActivity" /> | |||
| <activity android:name=".modules.PublicMqttActivity" /> | |||
| <activity | |||
| android:name=".modules.wifible_sphy.WifiBleSphyActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".modules.PublicWifiBleOtaActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".modules.eight_bodyfat.dual_band.EightDoubleBodyfatActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".modules.bw05watch.Bw05WatchActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity android:name=".modules.ble_nutrition.BleNutritionNutrientActivity" /> | |||
| <activity android:name=".modules.eight_bodyfat.EightBodyFatMcuActivity" /> | |||
| <activity android:name=".modules.gasDetector.GasDetectorActivity" /> | |||
| <activity | |||
| android:name=".modules.ble_nutrition.BleNutritionNutrientActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".modules.eight_bodyfat.EightBodyFatMcuActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".modules.gasDetector.GasDetectorActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".modules.gasDetectorPlus.GasDetectorPlusActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".modules.hmiBodyFat.HmiBodyFatScaleBleActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".modules.ble_0020_hu_infrared_temp.Ble0020HpInfraredTempActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <activity | |||
| android:name=".modules.toothbrush.ToothBrushWifiNewBleActivity" | |||
| android:screenOrientation="portrait" /> | |||
| <provider | |||
| android:name="androidx.core.content.FileProvider" | |||
| @@ -158,12 +292,6 @@ | |||
| android:name="org.eclipse.paho.android.service.MqttService" | |||
| android:enabled="true" | |||
| android:exported="true"></service> | |||
| <service android:name="com.pingwang.bluetoothlib.server.ELinkBleServer" | |||
| android:foregroundServiceType="connectedDevice" | |||
| > | |||
| </service> | |||
| </application> | |||
| </manifest> | |||
| @@ -81,13 +81,9 @@ public class ADWeightScaleCmdActivity extends BleBaseActivity implements OnCallb | |||
| private Handler mHandler = new Handler(Looper.getMainLooper()) { | |||
| @Override | |||
| public void handleMessage(Message msg) { | |||
| switch (msg.what) { | |||
| case REFRESH_DATA: | |||
| if (listAdapter != null) | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| if (msg.what == REFRESH_DATA) { | |||
| if (listAdapter != null) | |||
| listAdapter.notifyDataSetChanged(); | |||
| } | |||
| } | |||
| }; | |||
| @@ -109,7 +105,7 @@ public class ADWeightScaleCmdActivity extends BleBaseActivity implements OnCallb | |||
| listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | |||
| listView.setAdapter(listAdapter); | |||
| findViewById(R.id.user).setOnClickListener(this); | |||
| findViewById(R.id.btnUser).setOnClickListener(this); | |||
| findViewById(R.id.btnVersion).setOnClickListener(this); | |||
| findViewById(R.id.Undressing).setOnClickListener(this); | |||
| findViewById(R.id.clear).setOnClickListener(this); | |||
| @@ -173,19 +169,15 @@ public class ADWeightScaleCmdActivity extends BleBaseActivity implements OnCallb | |||
| public void onCheckedChanged(RadioGroup group, int checkedId) { | |||
| if (checkedId == -1) | |||
| return;//不是人为点击不触发 | |||
| switch (group.getCheckedRadioButtonId()) { | |||
| case R.id.radio_weight_kg: | |||
| weightUnit = ADWeightScaleBleConfig.WEIGHT_KG; | |||
| break; | |||
| case R.id.radio_weight_lb_lb: | |||
| weightUnit = ADWeightScaleBleConfig.WEIGHT_LB_LB; | |||
| break; | |||
| case R.id.radio_weight_st_lb: | |||
| weightUnit = ADWeightScaleBleConfig.WEIGHT_ST; | |||
| break; | |||
| case R.id.radio_weight_jin: | |||
| weightUnit = ADWeightScaleBleConfig.WEIGHT_JIN; | |||
| break; | |||
| int checkedRadioButtonId = group.getCheckedRadioButtonId(); | |||
| if (checkedRadioButtonId == R.id.radio_weight_kg) { | |||
| weightUnit = ADWeightScaleBleConfig.WEIGHT_KG; | |||
| } else if (checkedRadioButtonId == R.id.radio_weight_lb_lb) { | |||
| weightUnit = ADWeightScaleBleConfig.WEIGHT_LB_LB; | |||
| } else if (checkedRadioButtonId == R.id.radio_weight_st_lb) { | |||
| weightUnit = ADWeightScaleBleConfig.WEIGHT_ST; | |||
| } else if (checkedRadioButtonId == R.id.radio_weight_jin) { | |||
| weightUnit = ADWeightScaleBleConfig.WEIGHT_JIN; | |||
| } | |||
| BleLog.i(TAG, "weightUnit:" + weightUnit); | |||
| mDevice.setUnit(weightUnit); | |||
| @@ -214,58 +206,44 @@ public class ADWeightScaleCmdActivity extends BleBaseActivity implements OnCallb | |||
| @Override | |||
| public void onClick(View v) { | |||
| SendBleBean sendBleBean = new SendBleBean(); | |||
| switch (v.getId()) { | |||
| case R.id.btnVersion: | |||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||
| mDevice.sendData(sendBleBean); | |||
| break; | |||
| case R.id.Undressing: | |||
| mUndressing = !mUndressing; | |||
| mDevice.setUndressing(mUndressing); | |||
| break; | |||
| case R.id.Impedance: | |||
| mImpedance = !mImpedance; | |||
| mDevice.setBleImpedanceDiscern(mImpedance, 50); | |||
| break; | |||
| case R.id.clear: | |||
| if (mList != null) | |||
| mList.clear(); | |||
| int id = v.getId(); | |||
| if (id == R.id.btnVersion) { | |||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||
| mDevice.sendData(sendBleBean); | |||
| } else if (id == R.id.Undressing) { | |||
| mUndressing = !mUndressing; | |||
| mDevice.setUndressing(mUndressing); | |||
| } else if (id == R.id.Impedance) { | |||
| mImpedance = !mImpedance; | |||
| mDevice.setBleImpedanceDiscern(mImpedance, 50); | |||
| } else if (id == R.id.clear) { | |||
| if (mList != null) | |||
| mList.clear(); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } else if (id == R.id.getRecord) { | |||
| List<Integer> list = new ArrayList<>(); | |||
| for (ADWeightScaleUserData adWeightScaleUserData : sADWeightScaleUserDataList) { | |||
| list.add(adWeightScaleUserData.getUserId()); | |||
| } | |||
| mDevice.setBleSynUserHistoryRecord(list); | |||
| } else if (id == R.id.synUserAll) { | |||
| synUserAll(); | |||
| } else if (id == R.id.synUser) { | |||
| mDevice.setBleUpdateUser(mADWeightScaleUserData); | |||
| } else if (id == R.id.btnUser) { | |||
| startActivityForResult(new Intent(mContext, ADWeightScaleUserActivity.class), 1); | |||
| } else if (id == R.id.synTime) { | |||
| if (mDevice != null) { | |||
| mDevice.setSynTime(); | |||
| mList.add(TimeUtils.getTime() + "同步时间"); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| break; | |||
| case R.id.getRecord: | |||
| List<Integer> list = new ArrayList<>(); | |||
| for (ADWeightScaleUserData adWeightScaleUserData : sADWeightScaleUserDataList) { | |||
| list.add(adWeightScaleUserData.getUserId()); | |||
| } | |||
| mDevice.setBleSynUserHistoryRecord(list); | |||
| break; | |||
| case R.id.synUserAll: | |||
| synUserAll(); | |||
| break; | |||
| case R.id.synUser: | |||
| mDevice.setBleUpdateUser(mADWeightScaleUserData); | |||
| break; | |||
| case R.id.user: | |||
| startActivityForResult(new Intent(mContext, ADWeightScaleUserActivity.class), 1); | |||
| break; | |||
| case R.id.synTime: | |||
| if (mDevice != null) { | |||
| mDevice.setSynTime(); | |||
| mList.add(TimeUtils.getTime() + "同步时间"); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| break; | |||
| case R.id.btnDis: | |||
| if (mDevice != null) { | |||
| mDevice.disconnect(); | |||
| } | |||
| break; | |||
| case R.id.btnConnect: | |||
| startScanBle(0); | |||
| break; | |||
| } | |||
| } else if (id == R.id.btnDis) { | |||
| if (mDevice != null) { | |||
| mDevice.disconnect(); | |||
| } | |||
| } else if (id == R.id.btnConnect) { | |||
| startScanBle(0); | |||
| } | |||
| } | |||
| @@ -52,28 +52,24 @@ public class ADWeightScaleUserActivity extends AppCompatActivity implements View | |||
| @Override | |||
| public void onClick(View v) { | |||
| switch (v.getId()) { | |||
| case R.id.back_btn: | |||
| finish(); | |||
| break; | |||
| case R.id.add_user_btn: | |||
| if (ADWeightScaleCmdActivity.sADWeightScaleUserDataList.size() < 8) { | |||
| ADWeightScaleCmdActivity.mUserId++; | |||
| ADWeightScaleUserData adWeightScaleUserData = new ADWeightScaleUserData(); | |||
| adWeightScaleUserData.setUserId(ADWeightScaleCmdActivity.mUserId); | |||
| adWeightScaleUserData.setSex(ADWeightScaleBleConfig.SEX.MALE); | |||
| adWeightScaleUserData.setAge(20); | |||
| adWeightScaleUserData.setHeight(170); | |||
| adWeightScaleUserData.setWeight(50); | |||
| adWeightScaleUserData.setAdc(500); | |||
| ADWeightScaleCmdActivity.sADWeightScaleUserDataList.add(adWeightScaleUserData); | |||
| mAdapter.notifyDataSetChanged(); | |||
| } else { | |||
| Toast.makeText(mContext, "最多只允许添加8个用户", Toast.LENGTH_SHORT).show(); | |||
| } | |||
| break; | |||
| int id = v.getId(); | |||
| if (id == R.id.back_btn) { | |||
| finish(); | |||
| } else if (id == R.id.add_user_btn) { | |||
| if (ADWeightScaleCmdActivity.sADWeightScaleUserDataList.size() < 8) { | |||
| ADWeightScaleCmdActivity.mUserId++; | |||
| ADWeightScaleUserData adWeightScaleUserData = new ADWeightScaleUserData(); | |||
| adWeightScaleUserData.setUserId(ADWeightScaleCmdActivity.mUserId); | |||
| adWeightScaleUserData.setSex(ADWeightScaleBleConfig.SEX.MALE); | |||
| adWeightScaleUserData.setAge(20); | |||
| adWeightScaleUserData.setHeight(170); | |||
| adWeightScaleUserData.setWeight(50); | |||
| adWeightScaleUserData.setAdc(500); | |||
| ADWeightScaleCmdActivity.sADWeightScaleUserDataList.add(adWeightScaleUserData); | |||
| mAdapter.notifyDataSetChanged(); | |||
| } else { | |||
| Toast.makeText(mContext, "最多只允许添加8个用户", Toast.LENGTH_SHORT).show(); | |||
| } | |||
| } | |||
| } | |||
| @@ -268,19 +264,15 @@ public class ADWeightScaleUserActivity extends AppCompatActivity implements View | |||
| ADWeightScaleUserData adWeightScaleUserData = | |||
| ADWeightScaleCmdActivity.sADWeightScaleUserDataList | |||
| .get(po); | |||
| switch (seekBar.getId()) { | |||
| case R.id.sb_item_age: | |||
| adWeightScaleUserData.setAge(progress); | |||
| break; | |||
| case R.id.sb_item_height: | |||
| adWeightScaleUserData.setHeight(progress); | |||
| break; | |||
| case R.id.sb_item_weight: | |||
| adWeightScaleUserData.setWeight(progress); | |||
| break; | |||
| case R.id.sb_item_adc: | |||
| adWeightScaleUserData.setAdc(progress); | |||
| break; | |||
| int id = seekBar.getId(); | |||
| if (id == R.id.sb_item_age) { | |||
| adWeightScaleUserData.setAge(progress); | |||
| } else if (id == R.id.sb_item_height) { | |||
| adWeightScaleUserData.setHeight(progress); | |||
| } else if (id == R.id.sb_item_weight) { | |||
| adWeightScaleUserData.setWeight(progress); | |||
| } else if (id == R.id.sb_item_adc) { | |||
| adWeightScaleUserData.setAdc(progress); | |||
| } | |||
| textView.setText(progress + ""); | |||
| ADWeightScaleCmdActivity.sADWeightScaleUserDataList.set(po, adWeightScaleUserData); | |||
| @@ -228,418 +228,348 @@ public class AiLinkScooterActivity extends BleBaseActivity implements View.OnCli | |||
| @Override | |||
| public void onClick(View v) { | |||
| if(AilinkScooterBleData.getInstance()==null)return; | |||
| switch (v.getId()) { | |||
| case R.id.btn_support_function: | |||
| logList.add(0,"查询支持的功能"); | |||
| listAdapter.notifyDataSetChanged(); | |||
| AilinkScooterBleData.getInstance().getSupportedFunction(); | |||
| break; | |||
| case R.id.btn_hear: | |||
| logList.add(0,"心跳数据交互"); | |||
| listAdapter.notifyDataSetChanged(); | |||
| AilinkScooterBleData.getInstance().sendHearData(); | |||
| break; | |||
| case R.id.btn_unit_kg: | |||
| logList.add(0,"设置公制单位(结果在心跳包中看)"); | |||
| listAdapter.notifyDataSetChanged(); | |||
| AilinkScooterBleData.getInstance().sendUnitData(0); | |||
| break; | |||
| case R.id.btn_unit_mi: | |||
| logList.add(0,"设置英制单位(结果在心跳包中看)"); | |||
| listAdapter.notifyDataSetChanged(); | |||
| AilinkScooterBleData.getInstance().sendUnitData(1); | |||
| break; | |||
| case R.id.btn_add_gear: | |||
| currentGear++; | |||
| if (currentGear > 7) currentGear = 7; | |||
| logList.add(0,"设置档位(结果在心跳包中看):" + currentGear); | |||
| listAdapter.notifyDataSetChanged(); | |||
| AilinkScooterBleData.getInstance().sendGearData(currentGear); | |||
| break; | |||
| case R.id.btn_cut_gear: | |||
| currentGear--; | |||
| if (currentGear < 0) currentGear = 0; | |||
| logList.add(0,"设置档位(结果在心跳包中看):" + currentGear); | |||
| listAdapter.notifyDataSetChanged(); | |||
| AilinkScooterBleData.getInstance().sendGearData(currentGear); | |||
| break; | |||
| case R.id.btn_zero_start: | |||
| logList.add(0,"零启动(结果在心跳包中看)"); | |||
| listAdapter.notifyDataSetChanged(); | |||
| AilinkScooterBleData.getInstance().sendStartModeData(0); | |||
| break; | |||
| case R.id.btn_un_zero_start: | |||
| logList.add(0,"非零启动(结果在心跳包中看)"); | |||
| listAdapter.notifyDataSetChanged(); | |||
| AilinkScooterBleData.getInstance().sendStartModeData(1); | |||
| break; | |||
| case R.id.btn_cruise_open: | |||
| logList.add(0,"开启巡航(结果在心跳包中看)"); | |||
| listAdapter.notifyDataSetChanged(); | |||
| AilinkScooterBleData.getInstance().sendCruiseControlFunctionData(1); | |||
| break; | |||
| case R.id.btn_cruise_close: | |||
| logList.add(0,"关闭巡航(结果在心跳包中看)"); | |||
| listAdapter.notifyDataSetChanged(); | |||
| AilinkScooterBleData.getInstance().sendCruiseControlFunctionData(0); | |||
| break; | |||
| case R.id.btn_clear_total_mileage: | |||
| logList.add(0,"清除总里程(结果在心跳包中看)"); | |||
| listAdapter.notifyDataSetChanged(); | |||
| AilinkScooterBleData.getInstance().sendClearData(0x02); | |||
| break; | |||
| case R.id.btn_clear_single_mileage_time: | |||
| logList.add(0,"清除单次里程时间(结果在心跳包中看)"); | |||
| listAdapter.notifyDataSetChanged(); | |||
| AilinkScooterBleData.getInstance().sendClearData(0x01); | |||
| break; | |||
| case R.id.btn_reset: | |||
| logList.add(0,"清除单次里程时间(结果在心跳包中看)"); | |||
| listAdapter.notifyDataSetChanged(); | |||
| AilinkScooterBleData.getInstance().sendClearData(0x80); | |||
| break; | |||
| case R.id.btn_clear_other: | |||
| logList.add(0,"清除除里程和时间外的其它控制器及仪表参数"); | |||
| listAdapter.notifyDataSetChanged(); | |||
| AilinkScooterBleData.getInstance().sendClearData(0x04); | |||
| break; | |||
| case R.id.btn_left_light: | |||
| if (isOpenR) { | |||
| isOpenR = false; | |||
| logList.add(0,"右转灯开"); | |||
| AilinkScooterBleData.getInstance().sendLightOpenData(0x20); | |||
| } else { | |||
| isOpenR = true; | |||
| logList.add(0,"右转灯关"); | |||
| AilinkScooterBleData.getInstance().sendLightCloseData(0x20); | |||
| } | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_right_light: | |||
| if (isOpenL) { | |||
| isOpenL = false; | |||
| logList.add(0,"左转灯开"); | |||
| AilinkScooterBleData.getInstance().sendLightOpenData(0x10); | |||
| } else { | |||
| isOpenL = true; | |||
| logList.add(0,"左转灯关"); | |||
| AilinkScooterBleData.getInstance().sendLightCloseData(0x10); | |||
| } | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_atmosphere_light: | |||
| if (isAtmosphere) { | |||
| isAtmosphere = false; | |||
| logList.add(0,"氛围灯开"); | |||
| AilinkScooterBleData.getInstance().sendLightOpenData(0x08); | |||
| } else { | |||
| isAtmosphere = true; | |||
| logList.add(0,"氛围灯关"); | |||
| AilinkScooterBleData.getInstance().sendLightCloseData(0x08); | |||
| } | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_day_light: | |||
| if (isDay) { | |||
| isDay = false; | |||
| logList.add(0,"日行灯开"); | |||
| AilinkScooterBleData.getInstance().sendLightOpenData(0x04); | |||
| } else { | |||
| isDay = true; | |||
| logList.add(0,"日行灯关"); | |||
| AilinkScooterBleData.getInstance().sendLightCloseData(0x04); | |||
| } | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_brake_light: | |||
| if (isBrake) { | |||
| isBrake = false; | |||
| logList.add(0,"刹车灯开"); | |||
| AilinkScooterBleData.getInstance().sendLightOpenData(0x02); | |||
| } else { | |||
| isBrake = true; | |||
| logList.add(0,"刹车灯关"); | |||
| AilinkScooterBleData.getInstance().sendLightCloseData(0x02); | |||
| } | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_head_light: | |||
| if (isHead) { | |||
| isHead = false; | |||
| logList.add(0,"前车灯开"); | |||
| AilinkScooterBleData.getInstance().sendLightOpenData(0x01); | |||
| } else { | |||
| isHead = true; | |||
| logList.add(0,"前车灯关"); | |||
| AilinkScooterBleData.getInstance().sendLightCloseData(0x01); | |||
| } | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_set_password: | |||
| String oldPassword = et_password.getText().toString(); | |||
| if (oldPassword.isEmpty()) { | |||
| logList.add(0,"请输入原始密码"); | |||
| } else { | |||
| logList.add(0,"修改密码"); | |||
| AilinkScooterBleData.getInstance().changeLockCarPassword(oldPassword, "123456"); | |||
| } | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_unlock: | |||
| String password = et_password.getText().toString(); | |||
| if (password.isEmpty()) { | |||
| logList.add(0,"请输入密码"); | |||
| } else { | |||
| logList.add(0,"解锁"); | |||
| AilinkScooterBleData.getInstance().setLockCarPassword(0, password); | |||
| } | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_lock: | |||
| logList.add(0,"锁车"); | |||
| AilinkScooterBleData.getInstance().setLockCarPassword(1, "000000"); | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_check_password: | |||
| String checkPassword = et_password.getText().toString(); | |||
| if (checkPassword.isEmpty()) { | |||
| logList.add(0,"请输入密码"); | |||
| } else { | |||
| logList.add(0,"验证密码"); | |||
| AilinkScooterBleData.getInstance().setLockCarPassword(2, checkPassword); | |||
| } | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_boot: | |||
| String boot = et_password.getText().toString(); | |||
| if (boot.isEmpty()) { | |||
| logList.add(0,"请输入密码"); | |||
| } else { | |||
| logList.add(0,"验证密码"); | |||
| AilinkScooterBleData.getInstance().setLockCarPassword(3, boot); | |||
| } | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_shutdown: | |||
| logList.add(0,"锁车"); | |||
| AilinkScooterBleData.getInstance().setLockCarPassword(4, "000000"); | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_after_password: | |||
| logList.add(0,"获取售后密码"); | |||
| AilinkScooterBleData.getInstance().readServicePassword(); | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_auto_bg_light: | |||
| logList.add(0,"开启自动背光"); | |||
| AilinkScooterBleData.getInstance().sendBgAuto(); | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_bg_light_100: | |||
| logList.add(0,"开启手动背光:100"); | |||
| AilinkScooterBleData.getInstance().sendBgUnAuto(100); | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_bg_light_0: | |||
| logList.add(0,"开启手动背光:0"); | |||
| AilinkScooterBleData.getInstance().sendBgUnAuto(0); | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_shutdown_unlock: | |||
| logList.add(0,"设置自动关机"); | |||
| AilinkScooterBleData.getInstance().sendAutoShutDownTime(unlockShutTime, lockShutTime); | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_check_shutdown_time: | |||
| logList.add(0,"查询自动关机时间"); | |||
| AilinkScooterBleData.getInstance().sendGetShutDownTime(); | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_check_single_use_time: | |||
| logList.add(0,"查询单次行驶里程时间"); | |||
| AilinkScooterBleData.getInstance().sendSingleMileageTime(); | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_check_battery_info: | |||
| logList.add(0,"查询总里程"); | |||
| AilinkScooterBleData.getInstance().sendTotalMileage(); | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_check_total_mileage: | |||
| logList.add(0,"查询电池信息"); | |||
| AilinkScooterBleData.getInstance().sendBatteryInfo(); | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_check_battery_no: | |||
| logList.add(0,"查询电池厂商代码及编号"); | |||
| AilinkScooterBleData.getInstance().sendBatteryNo(); | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_check_controller_no: | |||
| logList.add(0,"查询控制器厂商代码及编号"); | |||
| AilinkScooterBleData.getInstance().sendControllerNo(); | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_check_meter_version: | |||
| logList.add(0,"查询仪表固件版本"); | |||
| AilinkScooterBleData.getInstance().sendMeterVersion(); | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_check_charge_time: | |||
| logList.add(0,"读取充电时间"); | |||
| AilinkScooterBleData.getInstance().sendCheckChargeTime(); | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_set_charge_time: | |||
| String startTime = et_charge_start_time.getText().toString().trim(); | |||
| String endTime = et_charge_end_time.getText().toString().trim(); | |||
| if (startTime.isEmpty() || endTime.isEmpty() || startTime.contains(":") || endTime.contains(":")) { | |||
| logList.add(0,"输入正确的时间和格式"); | |||
| return; | |||
| } | |||
| int monday = cb_monday.isChecked() ? 1 : 0; | |||
| int tuesday = cb_tuesday.isChecked() ? 1 : 0; | |||
| int wednesday = cb_wednesday.isChecked() ? 1 : 0; | |||
| int thursday = cb_thursday.isChecked() ? 1 : 0; | |||
| int friday = cb_friday.isChecked() ? 1 : 0; | |||
| int saturday = cb_saturday.isChecked() ? 1 : 0; | |||
| int sunday = cb_sunday.isChecked() ? 1 : 0; | |||
| int repeat = 1; | |||
| StringBuffer stringBuffer = new StringBuffer(); | |||
| if (monday == 1 || tuesday == 1 || wednesday == 1 || thursday == 1 || friday == 1 || saturday == 1 || sunday == 1) { | |||
| repeat = 0; | |||
| stringBuffer.append("设置充电时间:重复:"); | |||
| stringBuffer.append(monday == 1 ? "周一 " : ""); | |||
| stringBuffer.append(tuesday == 1 ? "周二 " : ""); | |||
| stringBuffer.append(wednesday == 1 ? "周三 " : ""); | |||
| stringBuffer.append(thursday == 1 ? "周四 " : ""); | |||
| stringBuffer.append(friday == 1 ? "周五 " : ""); | |||
| stringBuffer.append(saturday == 1 ? "周六 " : ""); | |||
| stringBuffer.append(sunday == 1 ? "周日 " : ""); | |||
| } else { | |||
| stringBuffer.append("设置充电时间:不重复"); | |||
| } | |||
| String[] startTimes = startTime.split(":"); | |||
| String[] endTimes = startTime.split(":"); | |||
| logList.add(0,stringBuffer.toString()); | |||
| try { | |||
| AilinkScooterBleData.getInstance().sendChargeTime(repeat, monday, tuesday, wednesday, thursday, friday, saturday, sunday, | |||
| Integer.parseInt(startTimes[0]), Integer.parseInt(startTimes[1]), Integer.parseInt(endTimes[0]), Integer.parseInt(endTimes[1])); | |||
| } catch (NumberFormatException e) { | |||
| logList.add(0,"出现异常。时间格式解析错误"); | |||
| e.printStackTrace(); | |||
| } | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_set_charge_capacity: | |||
| String capacity = et_charge_capacity.getText().toString().trim(); | |||
| if (capacity.isEmpty()) { | |||
| logList.add(0,"请填写容量"); | |||
| return; | |||
| } | |||
| int percentage = 0; | |||
| try { | |||
| percentage = Integer.parseInt(capacity); | |||
| logList.add(0,"充电容量:" + percentage); | |||
| } catch (NumberFormatException e) { | |||
| e.printStackTrace(); | |||
| logList.add(0,"请填数据啊"); | |||
| } | |||
| AilinkScooterBleData.getInstance().sendSetChargeCapacity(percentage); | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_read_charge_capacity: | |||
| logList.add(0,"读取充电容量"); | |||
| AilinkScooterBleData.getInstance().sendGetChargeCapacity(); | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_find_car_open: | |||
| logList.add(0,"打开寻车功能"); | |||
| AilinkScooterBleData.getInstance().sendFindCarFunction(1); | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_find_car_close: | |||
| logList.add(0,"关闭寻车功能"); | |||
| AilinkScooterBleData.getInstance().sendFindCarFunction(0); | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_auto_lock_open: | |||
| logList.add(0,"打开自动锁车"); | |||
| AilinkScooterBleData.getInstance().sendAutoLockCar(1); | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_auto_lock_close: | |||
| logList.add(0,"关闭自动锁车"); | |||
| AilinkScooterBleData.getInstance().sendAutoLockCar(0); | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_auto_unlock_open: | |||
| logList.add(0,"打开自动解锁"); | |||
| AilinkScooterBleData.getInstance().sendAutoUnLockCar(1); | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_auto_unlock_close: | |||
| logList.add(0,"关闭自动解锁"); | |||
| AilinkScooterBleData.getInstance().sendAutoUnLockCar(0); | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_move_warm_open: | |||
| logList.add(0,"打开移位报警"); | |||
| AilinkScooterBleData.getInstance().sendMoveWarm(1); | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_move_warm_close: | |||
| logList.add(0,"关闭移位报警"); | |||
| AilinkScooterBleData.getInstance().sendMoveWarm(0); | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_collision_warm_open: | |||
| logList.add(0,"打开碰撞报警"); | |||
| AilinkScooterBleData.getInstance().sendCollisionWarm(1); | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_collision_warm_close: | |||
| logList.add(0,"关闭碰撞报警"); | |||
| AilinkScooterBleData.getInstance().sendCollisionWarm(0); | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_read_warm_auto_lock: | |||
| logList.add(0,"读取车辆报警、自动锁"); | |||
| AilinkScooterBleData.getInstance().sendCarWarmAndLock(); | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_find_car: | |||
| logList.add(0,"寻车"); | |||
| AilinkScooterBleData.getInstance().sendFindCar(); | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_navigation_open: | |||
| logList.add(0,"导航:向左转弯,当前方向剩余500米,总剩余路程1000米"); | |||
| AilinkScooterBleData.getInstance().sendNavigation(1,2,500,1000); | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_navigation_close: | |||
| logList.add(0,"关闭导航"); | |||
| AilinkScooterBleData.getInstance().sendNavigation(0,0,0,0); | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| int id = v.getId(); | |||
| if (id == R.id.btn_support_function) { | |||
| logList.add(0, "查询支持的功能"); | |||
| listAdapter.notifyDataSetChanged(); | |||
| AilinkScooterBleData.getInstance().getSupportedFunction(); | |||
| } else if (id == R.id.btn_hear) { | |||
| logList.add(0, "心跳数据交互"); | |||
| listAdapter.notifyDataSetChanged(); | |||
| AilinkScooterBleData.getInstance().sendHearData(); | |||
| } else if (id == R.id.btn_unit_kg) { | |||
| logList.add(0, "设置公制单位(结果在心跳包中看)"); | |||
| listAdapter.notifyDataSetChanged(); | |||
| AilinkScooterBleData.getInstance().sendUnitData(0); | |||
| } else if (id == R.id.btn_unit_mi) { | |||
| logList.add(0, "设置英制单位(结果在心跳包中看)"); | |||
| listAdapter.notifyDataSetChanged(); | |||
| AilinkScooterBleData.getInstance().sendUnitData(1); | |||
| } else if (id == R.id.btn_add_gear) { | |||
| currentGear++; | |||
| if (currentGear > 7) currentGear = 7; | |||
| logList.add(0, "设置档位(结果在心跳包中看):" + currentGear); | |||
| listAdapter.notifyDataSetChanged(); | |||
| AilinkScooterBleData.getInstance().sendGearData(currentGear); | |||
| } else if (id == R.id.btn_cut_gear) { | |||
| currentGear--; | |||
| if (currentGear < 0) currentGear = 0; | |||
| logList.add(0, "设置档位(结果在心跳包中看):" + currentGear); | |||
| listAdapter.notifyDataSetChanged(); | |||
| AilinkScooterBleData.getInstance().sendGearData(currentGear); | |||
| } else if (id == R.id.btn_zero_start) { | |||
| logList.add(0, "零启动(结果在心跳包中看)"); | |||
| listAdapter.notifyDataSetChanged(); | |||
| AilinkScooterBleData.getInstance().sendStartModeData(0); | |||
| } else if (id == R.id.btn_un_zero_start) { | |||
| logList.add(0, "非零启动(结果在心跳包中看)"); | |||
| listAdapter.notifyDataSetChanged(); | |||
| AilinkScooterBleData.getInstance().sendStartModeData(1); | |||
| } else if (id == R.id.btn_cruise_open) { | |||
| logList.add(0, "开启巡航(结果在心跳包中看)"); | |||
| listAdapter.notifyDataSetChanged(); | |||
| AilinkScooterBleData.getInstance().sendCruiseControlFunctionData(1); | |||
| } else if (id == R.id.btn_cruise_close) { | |||
| logList.add(0, "关闭巡航(结果在心跳包中看)"); | |||
| listAdapter.notifyDataSetChanged(); | |||
| AilinkScooterBleData.getInstance().sendCruiseControlFunctionData(0); | |||
| } else if (id == R.id.btn_clear_total_mileage) { | |||
| logList.add(0, "清除总里程(结果在心跳包中看)"); | |||
| listAdapter.notifyDataSetChanged(); | |||
| AilinkScooterBleData.getInstance().sendClearData(0x02); | |||
| } else if (id == R.id.btn_clear_single_mileage_time) { | |||
| logList.add(0, "清除单次里程时间(结果在心跳包中看)"); | |||
| listAdapter.notifyDataSetChanged(); | |||
| AilinkScooterBleData.getInstance().sendClearData(0x01); | |||
| } else if (id == R.id.btn_reset) { | |||
| logList.add(0, "清除单次里程时间(结果在心跳包中看)"); | |||
| listAdapter.notifyDataSetChanged(); | |||
| AilinkScooterBleData.getInstance().sendClearData(0x80); | |||
| } else if (id == R.id.btn_clear_other) { | |||
| logList.add(0, "清除除里程和时间外的其它控制器及仪表参数"); | |||
| listAdapter.notifyDataSetChanged(); | |||
| AilinkScooterBleData.getInstance().sendClearData(0x04); | |||
| } else if (id == R.id.btn_left_light) { | |||
| if (isOpenR) { | |||
| isOpenR = false; | |||
| logList.add(0, "右转灯开"); | |||
| AilinkScooterBleData.getInstance().sendLightOpenData(0x20); | |||
| } else { | |||
| isOpenR = true; | |||
| logList.add(0, "右转灯关"); | |||
| AilinkScooterBleData.getInstance().sendLightCloseData(0x20); | |||
| } | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_right_light) { | |||
| if (isOpenL) { | |||
| isOpenL = false; | |||
| logList.add(0, "左转灯开"); | |||
| AilinkScooterBleData.getInstance().sendLightOpenData(0x10); | |||
| } else { | |||
| isOpenL = true; | |||
| logList.add(0, "左转灯关"); | |||
| AilinkScooterBleData.getInstance().sendLightCloseData(0x10); | |||
| } | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_atmosphere_light) { | |||
| if (isAtmosphere) { | |||
| isAtmosphere = false; | |||
| logList.add(0, "氛围灯开"); | |||
| AilinkScooterBleData.getInstance().sendLightOpenData(0x08); | |||
| } else { | |||
| isAtmosphere = true; | |||
| logList.add(0, "氛围灯关"); | |||
| AilinkScooterBleData.getInstance().sendLightCloseData(0x08); | |||
| } | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_day_light) { | |||
| if (isDay) { | |||
| isDay = false; | |||
| logList.add(0, "日行灯开"); | |||
| AilinkScooterBleData.getInstance().sendLightOpenData(0x04); | |||
| } else { | |||
| isDay = true; | |||
| logList.add(0, "日行灯关"); | |||
| AilinkScooterBleData.getInstance().sendLightCloseData(0x04); | |||
| } | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_brake_light) { | |||
| if (isBrake) { | |||
| isBrake = false; | |||
| logList.add(0, "刹车灯开"); | |||
| AilinkScooterBleData.getInstance().sendLightOpenData(0x02); | |||
| } else { | |||
| isBrake = true; | |||
| logList.add(0, "刹车灯关"); | |||
| AilinkScooterBleData.getInstance().sendLightCloseData(0x02); | |||
| } | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_head_light) { | |||
| if (isHead) { | |||
| isHead = false; | |||
| logList.add(0, "前车灯开"); | |||
| AilinkScooterBleData.getInstance().sendLightOpenData(0x01); | |||
| } else { | |||
| isHead = true; | |||
| logList.add(0, "前车灯关"); | |||
| AilinkScooterBleData.getInstance().sendLightCloseData(0x01); | |||
| } | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_set_password) { | |||
| String oldPassword = et_password.getText().toString(); | |||
| if (oldPassword.isEmpty()) { | |||
| logList.add(0, "请输入原始密码"); | |||
| } else { | |||
| logList.add(0, "修改密码"); | |||
| AilinkScooterBleData.getInstance().changeLockCarPassword(oldPassword, "123456"); | |||
| } | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_unlock) { | |||
| String password = et_password.getText().toString(); | |||
| if (password.isEmpty()) { | |||
| logList.add(0, "请输入密码"); | |||
| } else { | |||
| logList.add(0, "解锁"); | |||
| AilinkScooterBleData.getInstance().setLockCarPassword(0, password); | |||
| } | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_lock) { | |||
| logList.add(0, "锁车"); | |||
| AilinkScooterBleData.getInstance().setLockCarPassword(1, "000000"); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_check_password) { | |||
| String checkPassword = et_password.getText().toString(); | |||
| if (checkPassword.isEmpty()) { | |||
| logList.add(0, "请输入密码"); | |||
| } else { | |||
| logList.add(0, "验证密码"); | |||
| AilinkScooterBleData.getInstance().setLockCarPassword(2, checkPassword); | |||
| } | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_boot) { | |||
| String boot = et_password.getText().toString(); | |||
| if (boot.isEmpty()) { | |||
| logList.add(0, "请输入密码"); | |||
| } else { | |||
| logList.add(0, "验证密码"); | |||
| AilinkScooterBleData.getInstance().setLockCarPassword(3, boot); | |||
| } | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_shutdown) { | |||
| logList.add(0, "锁车"); | |||
| AilinkScooterBleData.getInstance().setLockCarPassword(4, "000000"); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_after_password) { | |||
| logList.add(0, "获取售后密码"); | |||
| AilinkScooterBleData.getInstance().readServicePassword(); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_auto_bg_light) { | |||
| logList.add(0, "开启自动背光"); | |||
| AilinkScooterBleData.getInstance().sendBgAuto(); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_bg_light_100) { | |||
| logList.add(0, "开启手动背光:100"); | |||
| AilinkScooterBleData.getInstance().sendBgUnAuto(100); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_bg_light_0) { | |||
| logList.add(0, "开启手动背光:0"); | |||
| AilinkScooterBleData.getInstance().sendBgUnAuto(0); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_shutdown_unlock) { | |||
| logList.add(0, "设置自动关机"); | |||
| AilinkScooterBleData.getInstance().sendAutoShutDownTime(unlockShutTime, lockShutTime); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_check_shutdown_time) { | |||
| logList.add(0, "查询自动关机时间"); | |||
| AilinkScooterBleData.getInstance().sendGetShutDownTime(); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_check_single_use_time) { | |||
| logList.add(0, "查询单次行驶里程时间"); | |||
| AilinkScooterBleData.getInstance().sendSingleMileageTime(); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_check_battery_info) { | |||
| logList.add(0, "查询总里程"); | |||
| AilinkScooterBleData.getInstance().sendTotalMileage(); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_check_total_mileage) { | |||
| logList.add(0, "查询电池信息"); | |||
| AilinkScooterBleData.getInstance().sendBatteryInfo(); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_check_battery_no) { | |||
| logList.add(0, "查询电池厂商代码及编号"); | |||
| AilinkScooterBleData.getInstance().sendBatteryNo(); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_check_controller_no) { | |||
| logList.add(0, "查询控制器厂商代码及编号"); | |||
| AilinkScooterBleData.getInstance().sendControllerNo(); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_check_meter_version) { | |||
| logList.add(0, "查询仪表固件版本"); | |||
| AilinkScooterBleData.getInstance().sendMeterVersion(); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_check_charge_time) { | |||
| logList.add(0, "读取充电时间"); | |||
| AilinkScooterBleData.getInstance().sendCheckChargeTime(); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_set_charge_time) { | |||
| String startTime = et_charge_start_time.getText().toString().trim(); | |||
| String endTime = et_charge_end_time.getText().toString().trim(); | |||
| if (startTime.isEmpty() || endTime.isEmpty() || startTime.contains(":") || endTime.contains(":")) { | |||
| logList.add(0, "输入正确的时间和格式"); | |||
| return; | |||
| } | |||
| int monday = cb_monday.isChecked() ? 1 : 0; | |||
| int tuesday = cb_tuesday.isChecked() ? 1 : 0; | |||
| int wednesday = cb_wednesday.isChecked() ? 1 : 0; | |||
| int thursday = cb_thursday.isChecked() ? 1 : 0; | |||
| int friday = cb_friday.isChecked() ? 1 : 0; | |||
| int saturday = cb_saturday.isChecked() ? 1 : 0; | |||
| int sunday = cb_sunday.isChecked() ? 1 : 0; | |||
| int repeat = 1; | |||
| StringBuffer stringBuffer = new StringBuffer(); | |||
| if (monday == 1 || tuesday == 1 || wednesday == 1 || thursday == 1 || friday == 1 || saturday == 1 || sunday == 1) { | |||
| repeat = 0; | |||
| stringBuffer.append("设置充电时间:重复:"); | |||
| stringBuffer.append(monday == 1 ? "周一 " : ""); | |||
| stringBuffer.append(tuesday == 1 ? "周二 " : ""); | |||
| stringBuffer.append(wednesday == 1 ? "周三 " : ""); | |||
| stringBuffer.append(thursday == 1 ? "周四 " : ""); | |||
| stringBuffer.append(friday == 1 ? "周五 " : ""); | |||
| stringBuffer.append(saturday == 1 ? "周六 " : ""); | |||
| stringBuffer.append(sunday == 1 ? "周日 " : ""); | |||
| } else { | |||
| stringBuffer.append("设置充电时间:不重复"); | |||
| } | |||
| String[] startTimes = startTime.split(":"); | |||
| String[] endTimes = startTime.split(":"); | |||
| logList.add(0, stringBuffer.toString()); | |||
| try { | |||
| AilinkScooterBleData.getInstance().sendChargeTime(repeat, monday, tuesday, wednesday, thursday, friday, saturday, sunday, | |||
| Integer.parseInt(startTimes[0]), Integer.parseInt(startTimes[1]), Integer.parseInt(endTimes[0]), Integer.parseInt(endTimes[1])); | |||
| } catch (NumberFormatException e) { | |||
| logList.add(0, "出现异常。时间格式解析错误"); | |||
| e.printStackTrace(); | |||
| } | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_set_charge_capacity) { | |||
| String capacity = et_charge_capacity.getText().toString().trim(); | |||
| if (capacity.isEmpty()) { | |||
| logList.add(0, "请填写容量"); | |||
| return; | |||
| } | |||
| int percentage = 0; | |||
| try { | |||
| percentage = Integer.parseInt(capacity); | |||
| logList.add(0, "充电容量:" + percentage); | |||
| } catch (NumberFormatException e) { | |||
| e.printStackTrace(); | |||
| logList.add(0, "请填数据啊"); | |||
| } | |||
| AilinkScooterBleData.getInstance().sendSetChargeCapacity(percentage); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_read_charge_capacity) { | |||
| logList.add(0, "读取充电容量"); | |||
| AilinkScooterBleData.getInstance().sendGetChargeCapacity(); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_find_car_open) { | |||
| logList.add(0, "打开寻车功能"); | |||
| AilinkScooterBleData.getInstance().sendFindCarFunction(1); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_find_car_close) { | |||
| logList.add(0, "关闭寻车功能"); | |||
| AilinkScooterBleData.getInstance().sendFindCarFunction(0); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_auto_lock_open) { | |||
| logList.add(0, "打开自动锁车"); | |||
| AilinkScooterBleData.getInstance().sendAutoLockCar(1); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_auto_lock_close) { | |||
| logList.add(0, "关闭自动锁车"); | |||
| AilinkScooterBleData.getInstance().sendAutoLockCar(0); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_auto_unlock_open) { | |||
| logList.add(0, "打开自动解锁"); | |||
| AilinkScooterBleData.getInstance().sendAutoUnLockCar(1); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_auto_unlock_close) { | |||
| logList.add(0, "关闭自动解锁"); | |||
| AilinkScooterBleData.getInstance().sendAutoUnLockCar(0); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_move_warm_open) { | |||
| logList.add(0, "打开移位报警"); | |||
| AilinkScooterBleData.getInstance().sendMoveWarm(1); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_move_warm_close) { | |||
| logList.add(0, "关闭移位报警"); | |||
| AilinkScooterBleData.getInstance().sendMoveWarm(0); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_collision_warm_open) { | |||
| logList.add(0, "打开碰撞报警"); | |||
| AilinkScooterBleData.getInstance().sendCollisionWarm(1); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_collision_warm_close) { | |||
| logList.add(0, "关闭碰撞报警"); | |||
| AilinkScooterBleData.getInstance().sendCollisionWarm(0); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_read_warm_auto_lock) { | |||
| logList.add(0, "读取车辆报警、自动锁"); | |||
| AilinkScooterBleData.getInstance().sendCarWarmAndLock(); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_find_car) { | |||
| logList.add(0, "寻车"); | |||
| AilinkScooterBleData.getInstance().sendFindCar(); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_navigation_open) { | |||
| logList.add(0, "导航:向左转弯,当前方向剩余500米,总剩余路程1000米"); | |||
| AilinkScooterBleData.getInstance().sendNavigation(1, 2, 500, 1000); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_navigation_close) { | |||
| logList.add(0, "关闭导航"); | |||
| AilinkScooterBleData.getInstance().sendNavigation(0, 0, 0, 0); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } | |||
| } | |||
| @@ -127,38 +127,27 @@ public class BabyBodyFatCmdActivity extends BleBaseActivity implements OnCallbac | |||
| public void onCheckedChanged(RadioGroup group, int checkedId) { | |||
| if (checkedId == -1) | |||
| return;//不是人为点击不触发 | |||
| switch (group.getCheckedRadioButtonId()) { | |||
| case R.id.radio_weight_kg: | |||
| weightUnit = BabyBleConfig.BABY_KG; | |||
| break; | |||
| case R.id.radio_weight_jin: | |||
| weightUnit = BabyBleConfig.BABY_FG; | |||
| break; | |||
| case R.id.radio_weight_lb: | |||
| weightUnit = BabyBleConfig.BABY_LB; | |||
| break; | |||
| case R.id.radio_weight_oz: | |||
| weightUnit = BabyBleConfig.BABY_OZ; | |||
| break; | |||
| case R.id.radio_weight_st_lb: | |||
| weightUnit = BabyBleConfig.BABY_ST; | |||
| break; | |||
| case R.id.radio_weight_g: | |||
| weightUnit = BabyBleConfig.BABY_G; | |||
| break; | |||
| case R.id.radio_weight_lb_lb: | |||
| weightUnit = BabyBleConfig.BABY_LB_LB; | |||
| break; | |||
| case R.id.radio_height_cm: | |||
| heightUnit = BabyBleConfig.BABY_CM; | |||
| break; | |||
| case R.id.radio_height_inch: | |||
| heightUnit = BabyBleConfig.BABY_INCH; | |||
| break; | |||
| case R.id.radio_height_foot: | |||
| heightUnit = BabyBleConfig.BABY_FEET; | |||
| break; | |||
| int checkedRadioButtonId = group.getCheckedRadioButtonId(); | |||
| if (checkedRadioButtonId == R.id.radio_weight_kg) { | |||
| weightUnit = BabyBleConfig.BABY_KG; | |||
| } else if (checkedRadioButtonId == R.id.radio_weight_jin) { | |||
| weightUnit = BabyBleConfig.BABY_FG; | |||
| } else if (checkedRadioButtonId == R.id.radio_weight_lb) { | |||
| weightUnit = BabyBleConfig.BABY_LB; | |||
| } else if (checkedRadioButtonId == R.id.radio_weight_oz) { | |||
| weightUnit = BabyBleConfig.BABY_OZ; | |||
| } else if (checkedRadioButtonId == R.id.radio_weight_st_lb) { | |||
| weightUnit = BabyBleConfig.BABY_ST; | |||
| } else if (checkedRadioButtonId == R.id.radio_weight_g) { | |||
| weightUnit = BabyBleConfig.BABY_G; | |||
| } else if (checkedRadioButtonId == R.id.radio_weight_lb_lb) { | |||
| weightUnit = BabyBleConfig.BABY_LB_LB; | |||
| } else if (checkedRadioButtonId == R.id.radio_height_cm) { | |||
| heightUnit = BabyBleConfig.BABY_CM; | |||
| } else if (checkedRadioButtonId == R.id.radio_height_inch) { | |||
| heightUnit = BabyBleConfig.BABY_INCH; | |||
| } else if (checkedRadioButtonId == R.id.radio_height_foot) { | |||
| heightUnit = BabyBleConfig.BABY_FEET; | |||
| } | |||
| BleLog.i(TAG, "weightUnit:" + weightUnit + " ,||heightUnit:" + heightUnit); | |||
| mDevice.setUnit(weightUnit, heightUnit); | |||
| @@ -211,40 +200,28 @@ public class BabyBodyFatCmdActivity extends BleBaseActivity implements OnCallbac | |||
| @Override | |||
| public void onClick(View v) { | |||
| SendBleBean sendBleBean = new SendBleBean(); | |||
| switch (v.getId()) { | |||
| case R.id.btnVersion: | |||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||
| mDevice.sendData(sendBleBean); | |||
| break; | |||
| case R.id.clear: | |||
| if (mList != null) | |||
| mList.clear(); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| break; | |||
| case R.id.btnDis: | |||
| if (mDevice != null) { | |||
| mDevice.disconnect(); | |||
| } | |||
| break; | |||
| case R.id.btnConnect: | |||
| startScanBle(0); | |||
| break; | |||
| case R.id.btn_set_tare: | |||
| if (mDevice != null) { | |||
| mDevice.setTare(); | |||
| } | |||
| break; | |||
| case R.id.btn_set_hold: | |||
| if (mDevice != null) { | |||
| mDevice.setHold(); | |||
| } | |||
| break; | |||
| int id = v.getId(); | |||
| if (id == R.id.btnVersion) { | |||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||
| mDevice.sendData(sendBleBean); | |||
| } else if (id == R.id.clear) { | |||
| if (mList != null) | |||
| mList.clear(); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } else if (id == R.id.btnDis) { | |||
| if (mDevice != null) { | |||
| mDevice.disconnect(); | |||
| } | |||
| } else if (id == R.id.btnConnect) { | |||
| startScanBle(0); | |||
| } else if (id == R.id.btn_set_tare) { | |||
| if (mDevice != null) { | |||
| mDevice.setTare(); | |||
| } | |||
| } else if (id == R.id.btn_set_hold) { | |||
| if (mDevice != null) { | |||
| mDevice.setHold(); | |||
| } | |||
| } | |||
| } | |||
| @@ -36,7 +36,6 @@ import cn.net.aicare.modulelibrary.module.babyscale.BabyBleConfig; | |||
| import cn.net.aicare.modulelibrary.module.babyscale.BabyDeviceData; | |||
| /** | |||
| * xing<br> | |||
| * 2019/4/25<br> | |||
| @@ -62,13 +61,9 @@ public class BabyCmdActivity extends BleBaseActivity implements OnCallbackDis, O | |||
| private Handler mHandler = new Handler(Looper.getMainLooper()) { | |||
| @Override | |||
| public void handleMessage(Message msg) { | |||
| switch (msg.what) { | |||
| case REFRESH_DATA: | |||
| if (listAdapter != null) | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| if (msg.what == REFRESH_DATA) { | |||
| if (listAdapter != null) | |||
| listAdapter.notifyDataSetChanged(); | |||
| } | |||
| } | |||
| }; | |||
| @@ -126,30 +121,21 @@ public class BabyCmdActivity extends BleBaseActivity implements OnCallbackDis, O | |||
| @Override | |||
| public void onCheckedChanged(RadioGroup group, int checkedId) { | |||
| switch (group.getCheckedRadioButtonId()) { | |||
| case R.id.radio_weight_kg: | |||
| weightUnit = BabyBleConfig.BABY_KG; | |||
| break; | |||
| case R.id.radio_weight_lb: | |||
| weightUnit = BabyBleConfig.BABY_LB; | |||
| break; | |||
| case R.id.radio_weight_lb_lb: | |||
| weightUnit = BabyBleConfig.BABY_LB_LB; | |||
| break; | |||
| case R.id.radio_weight_oz: | |||
| weightUnit = BabyBleConfig.BABY_OZ; | |||
| break; | |||
| case R.id.radio_weight_g: | |||
| weightUnit = BabyBleConfig.BABY_G; | |||
| break; | |||
| case R.id.radio_height_cm: | |||
| heightUnit = BabyBleConfig.BABY_CM; | |||
| break; | |||
| case R.id.radio_height_foot: | |||
| heightUnit = BabyBleConfig.BABY_FEET; | |||
| break; | |||
| int checkedRadioButtonId = group.getCheckedRadioButtonId(); | |||
| if (checkedRadioButtonId == R.id.radio_weight_kg) { | |||
| weightUnit = BabyBleConfig.BABY_KG; | |||
| } else if (checkedRadioButtonId == R.id.radio_weight_lb) { | |||
| weightUnit = BabyBleConfig.BABY_LB; | |||
| } else if (checkedRadioButtonId == R.id.radio_weight_lb_lb) { | |||
| weightUnit = BabyBleConfig.BABY_LB_LB; | |||
| } else if (checkedRadioButtonId == R.id.radio_weight_oz) { | |||
| weightUnit = BabyBleConfig.BABY_OZ; | |||
| } else if (checkedRadioButtonId == R.id.radio_weight_g) { | |||
| weightUnit = BabyBleConfig.BABY_G; | |||
| } else if (checkedRadioButtonId == R.id.radio_height_cm) { | |||
| heightUnit = BabyBleConfig.BABY_CM; | |||
| } else if (checkedRadioButtonId == R.id.radio_height_foot) { | |||
| heightUnit = BabyBleConfig.BABY_FEET; | |||
| } | |||
| } | |||
| @@ -194,38 +180,26 @@ public class BabyCmdActivity extends BleBaseActivity implements OnCallbackDis, O | |||
| @Override | |||
| public void onClick(View v) { | |||
| switch (v.getId()) { | |||
| case R.id.btnVersion: | |||
| babyDevice.sendData(new SendBleBean(BleSendCmdUtil.getInstance().getBleVersion())); | |||
| break; | |||
| case R.id.btnBattery: | |||
| babyDevice.sendData(new SendBleBean(BleSendCmdUtil.getInstance().getMcuBatteryStatus())); | |||
| break; | |||
| case R.id.btn_get_did: | |||
| babyDevice.sendData(new SendBleBean(BleSendCmdUtil.getInstance().getDid())); | |||
| break; | |||
| case R.id.clear: | |||
| if (mList != null) | |||
| mList.clear(); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| break; | |||
| case R.id.btn_set_unit: | |||
| //cm=0,inch=1 | |||
| //kg=0,斤=1,lb=2,oz=3,st=4,g=5 | |||
| babyDevice.setUnit(weightUnit, weightUnit); | |||
| break; | |||
| case R.id.btn_set_tare: | |||
| babyDevice.setTare(); | |||
| break; | |||
| case R.id.btn_set_hold: | |||
| babyDevice.setHold(); | |||
| break; | |||
| case R.id.getUnit: | |||
| babyDevice.sendData(new SendBleBean(BleSendCmdUtil.getInstance().getSupportUnit())); | |||
| break; | |||
| int id = v.getId(); | |||
| if (id == R.id.btnVersion) { | |||
| babyDevice.sendData(new SendBleBean(BleSendCmdUtil.getInstance().getBleVersion())); | |||
| } else if (id == R.id.btnBattery) { | |||
| babyDevice.sendData(new SendBleBean(BleSendCmdUtil.getInstance().getMcuBatteryStatus())); | |||
| } else if (id == R.id.btn_get_did) { | |||
| babyDevice.sendData(new SendBleBean(BleSendCmdUtil.getInstance().getDid())); | |||
| } else if (id == R.id.clear) { | |||
| if (mList != null) | |||
| mList.clear(); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } else if (id == R.id.btn_set_unit) {//cm=0,inch=1 | |||
| //kg=0,斤=1,lb=2,oz=3,st=4,g=5 | |||
| babyDevice.setUnit(weightUnit, weightUnit); | |||
| } else if (id == R.id.btn_set_tare) { | |||
| babyDevice.setTare(); | |||
| } else if (id == R.id.btn_set_hold) { | |||
| babyDevice.setHold(); | |||
| } else if (id == R.id.getUnit) { | |||
| babyDevice.sendData(new SendBleBean(BleSendCmdUtil.getInstance().getSupportUnit())); | |||
| } | |||
| } | |||
| @@ -19,7 +19,12 @@ import android.widget.Toast; | |||
| import androidx.annotation.NonNull; | |||
| import androidx.annotation.Nullable; | |||
| import androidx.core.view.MenuProvider; | |||
| import androidx.lifecycle.Lifecycle; | |||
| import androidx.lifecycle.LifecycleOwner; | |||
| import com.pingwang.bluetoothlib.AILinkSDK; | |||
| import com.pingwang.bluetoothlib.bean.BleHandshakeBean; | |||
| import com.pingwang.bluetoothlib.bean.BleValueBean; | |||
| import com.pingwang.bluetoothlib.bean.SupportUnitBean; | |||
| import com.pingwang.bluetoothlib.config.BleConfig; | |||
| @@ -60,7 +65,9 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
| * 2019/4/25<br> | |||
| * 基础指令信息数据显示 | |||
| */ | |||
| public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, OnBleDeviceDataListener, OnBleVersionListener, OnMcuParameterListener, OnBleErrListener, OnBleInfoListener, OnBleParameterListener, OnBleCompanyListener, OnBleSettingListener, OnBleHandshakeListener, View.OnClickListener, OnBleOtherDataListener, OnBleRssiListener { | |||
| public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, OnBleDeviceDataListener, OnBleVersionListener, OnMcuParameterListener, | |||
| OnBleErrListener, OnBleInfoListener, OnBleParameterListener, OnBleCompanyListener, OnBleSettingListener, OnBleHandshakeListener, | |||
| View.OnClickListener, OnBleOtherDataListener, OnBleRssiListener { | |||
| private static String TAG = BleCmdActivity.class.getName(); | |||
| private final int REFRESH_DATA = 3; | |||
| @@ -76,6 +83,7 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On | |||
| private int mVid; | |||
| private int mPid; | |||
| private String mDeviceVersion; | |||
| private String mDeviceVersion46; | |||
| /** | |||
| * 是否暂停显示数据 | |||
| */ | |||
| @@ -83,12 +91,9 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On | |||
| private Handler mHandler = new Handler(Looper.getMainLooper()) { | |||
| @Override | |||
| public void handleMessage(Message msg) { | |||
| switch (msg.what) { | |||
| case REFRESH_DATA: | |||
| if (listAdapter != null) | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| if (msg.what == REFRESH_DATA) { | |||
| if (listAdapter != null) | |||
| listAdapter.notifyDataSetChanged(); | |||
| } | |||
| } | |||
| }; | |||
| @@ -113,6 +118,10 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On | |||
| mBleSendCmdUtil = BleSendCmdUtil.getInstance(); | |||
| init(); | |||
| BleConfig.setHandshakeStatus((int[]) null, mAddress, true); | |||
| BleHandshakeBean licenseDevice = AILinkSDK.getInstance().isLicenseDevice(mCid, mVid, mPid); | |||
| String msg = "license:" + licenseDevice + "\n cid:" + mCid + "\n vid:" + mVid + "\n pid:" + mPid; | |||
| addShowData(msg); | |||
| BleLog.iw(msg); | |||
| } | |||
| private void init() { | |||
| @@ -149,6 +158,7 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On | |||
| findViewById(R.id.btnDis).setOnClickListener(this); | |||
| findViewById(R.id.btnConnect).setOnClickListener(this); | |||
| findViewById(R.id.btnSnRead).setOnClickListener(this); | |||
| findViewById(R.id.btnGetVersion46).setOnClickListener(this); | |||
| etName = findViewById(R.id.etName); | |||
| etMacType = findViewById(R.id.etMacType); | |||
| etBroadcastTime = findViewById(R.id.etBroadcastTime); | |||
| @@ -160,196 +170,166 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On | |||
| @Override | |||
| public void onClick(View v) { | |||
| SendBleBean sendBleBean; | |||
| switch (v.getId()) { | |||
| case R.id.btnDis: | |||
| if (mBleDevice != null) { | |||
| mBleDevice.disconnect(); | |||
| } | |||
| addShowData("断开连接"); | |||
| break; | |||
| case R.id.btnConnect: | |||
| mAILinkBleManager.connectDevice(new BleValueBean(mAddress, mCid, mVid, mPid)); | |||
| addShowData("连接设备"); | |||
| break; | |||
| case R.id.btnClearShakeHands: | |||
| if (mList != null) | |||
| mList.clear(); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| break; | |||
| case R.id.btnPause: | |||
| mPauseShowCmd = !mPauseShowCmd; | |||
| break; | |||
| case R.id.btnHandshake: | |||
| if (mBleDevice != null) { | |||
| mBleDevice.setHandshake(true); | |||
| // mBleDevice.sendHandshake(); | |||
| addShowData("发送握手"); | |||
| } | |||
| break; | |||
| case R.id.btnVersion: | |||
| if (mBleDevice != null) { | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||
| sendData(sendBleBean); | |||
| addShowData("正在获取版本号."); | |||
| } | |||
| break; | |||
| case R.id.btnBattery: | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus()); | |||
| sendData(sendBleBean); | |||
| addShowData("读取电量"); | |||
| break; | |||
| case R.id.btnTimeRead: | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.getSysTime()); | |||
| sendData(sendBleBean); | |||
| break; | |||
| case R.id.btnTimeWrite: | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.setSysTime(bleDataUtils.getCurrentTime(), true)); | |||
| sendData(sendBleBean); | |||
| break; | |||
| case R.id.btnNameRead: | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.getBleName()); | |||
| sendData(sendBleBean); | |||
| break; | |||
| case R.id.btnMacRead: | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.getBleMac()); | |||
| sendData(sendBleBean); | |||
| break; | |||
| case R.id.btnMacTypeRead: | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.getBroadcastDataType()); | |||
| sendData(sendBleBean); | |||
| break; | |||
| case R.id.btnMacTypeWrite: | |||
| byte macType = Byte.valueOf(etMacType.getText().toString().trim()); | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.setBroadcastDataType(macType)); | |||
| sendData(sendBleBean); | |||
| break; | |||
| case R.id.btnNameWrite: | |||
| byte[] names = bleDataUtils.getBleName(etName.getText().toString().trim()); | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.setBleName(names)); | |||
| sendData(sendBleBean); | |||
| break; | |||
| case R.id.btnBroadcastTimeRead: | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.getBleBroadcastTime()); | |||
| sendData(sendBleBean); | |||
| break; | |||
| case R.id.btnBroadcastTimeWrite: | |||
| try { | |||
| int time = Integer.parseInt(etBroadcastTime.getText().toString().trim()); | |||
| byte[] broadcastTime = bleDataUtils.getBroadcastTime(time); | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.setBleBroadcastTime(broadcastTime)); | |||
| sendData(sendBleBean); | |||
| } catch (NumberFormatException e) { | |||
| e.printStackTrace(); | |||
| Toast.makeText(this, "请输入正确的广播时间", Toast.LENGTH_SHORT).show(); | |||
| } | |||
| break; | |||
| int id = v.getId(); | |||
| if (id == R.id.btnDis) { | |||
| if (mBleDevice != null) { | |||
| mBleDevice.disconnect(); | |||
| } | |||
| addShowData("断开连接"); | |||
| } else if (id == R.id.btnConnect) { | |||
| mAILinkBleManager.connectDevice(new BleValueBean(mAddress, mCid, mVid, mPid)); | |||
| addShowData("连接设备"); | |||
| } else if (id == R.id.btnClearShakeHands) { | |||
| if (mList != null) | |||
| mList.clear(); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } else if (id == R.id.btnPause) { | |||
| mPauseShowCmd = !mPauseShowCmd; | |||
| } else if (id == R.id.btnHandshake) { | |||
| if (mBleDevice != null) { | |||
| mBleDevice.setHandshake(true); | |||
| // mBleDevice.sendHandshake(); | |||
| addShowData("发送握手"); | |||
| case R.id.btnDidRead: | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.getDid()); | |||
| sendData(sendBleBean); | |||
| break; | |||
| case R.id.btnBmRestart: | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.setBleRestart()); | |||
| sendData(sendBleBean); | |||
| break; | |||
| case R.id.btnBmReset: | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.setBleReset()); | |||
| sendData(sendBleBean); | |||
| break; | |||
| case R.id.btnMcuType: | |||
| byte mode = (byte) Integer.parseInt(etMcuType.getText().toString().trim()); | |||
| } | |||
| } else if (id == R.id.btnVersion) { | |||
| if (mBleDevice != null) { | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.setPortI2cSpiMode(mode)); | |||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||
| sendData(sendBleBean); | |||
| break; | |||
| addShowData("正在获取版本号."); | |||
| case R.id.btnUnits: | |||
| } | |||
| } else if (id == R.id.btnBattery) { | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus()); | |||
| sendData(sendBleBean); | |||
| addShowData("读取电量"); | |||
| } else if (id == R.id.btnTimeRead) { | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.getSysTime()); | |||
| sendData(sendBleBean); | |||
| } else if (id == R.id.btnTimeWrite) { | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.setSysTime(bleDataUtils.getCurrentTime(), true)); | |||
| sendData(sendBleBean); | |||
| } else if (id == R.id.btnNameRead) { | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.getBleName()); | |||
| sendData(sendBleBean); | |||
| } else if (id == R.id.btnMacRead) { | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.getBleMac()); | |||
| sendData(sendBleBean); | |||
| } else if (id == R.id.btnMacTypeRead) { | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.getBroadcastDataType()); | |||
| sendData(sendBleBean); | |||
| } else if (id == R.id.btnMacTypeWrite) { | |||
| byte macType = Byte.valueOf(etMacType.getText().toString().trim()); | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.setBroadcastDataType(macType)); | |||
| sendData(sendBleBean); | |||
| } else if (id == R.id.btnNameWrite) { | |||
| byte[] names = bleDataUtils.getBleName(etName.getText().toString().trim()); | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.setBleName(names)); | |||
| sendData(sendBleBean); | |||
| } else if (id == R.id.btnBroadcastTimeRead) { | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.getBleBroadcastTime()); | |||
| sendData(sendBleBean); | |||
| } else if (id == R.id.btnBroadcastTimeWrite) { | |||
| try { | |||
| int time = Integer.parseInt(etBroadcastTime.getText().toString().trim()); | |||
| byte[] broadcastTime = bleDataUtils.getBroadcastTime(time); | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.getSupportUnit()); | |||
| sendBleBean.setHex(mBleSendCmdUtil.setBleBroadcastTime(broadcastTime)); | |||
| sendData(sendBleBean); | |||
| break; | |||
| } catch (NumberFormatException e) { | |||
| e.printStackTrace(); | |||
| Toast.makeText(this, "请输入正确的广播时间", Toast.LENGTH_SHORT).show(); | |||
| } | |||
| } else if (id == R.id.btnDidRead) { | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.getDid()); | |||
| sendData(sendBleBean); | |||
| } else if (id == R.id.btnBmRestart) { | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.setBleRestart()); | |||
| sendData(sendBleBean); | |||
| } else if (id == R.id.btnBmReset) { | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.setBleReset()); | |||
| sendData(sendBleBean); | |||
| } else if (id == R.id.btnMcuType) { | |||
| byte mode = (byte) Integer.parseInt(etMcuType.getText().toString().trim()); | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.setPortI2cSpiMode(mode)); | |||
| sendData(sendBleBean); | |||
| } else if (id == R.id.btnUnits) { | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.getSupportUnit()); | |||
| sendData(sendBleBean); | |||
| //写自动休眠 | |||
| case R.id.btnSleepTimeWrite: | |||
| String sleepStr = etSleepTime.getText().toString().trim().toLowerCase(Locale.US); | |||
| if (sleepStr.contains(",")) { | |||
| String[] didStrS = sleepStr.split(","); | |||
| if (didStrS.length > 3) { | |||
| int switchStatus = Integer.parseInt(didStrS[0]); | |||
| int toSleepTimeS = Integer.parseInt(didStrS[1]); | |||
| int sleepSwitchCmd = Integer.parseInt(didStrS[2]); | |||
| int broadcastTimeMS = Integer.parseInt(didStrS[3]); | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.setNoConnectSleep(switchStatus, toSleepTimeS, sleepSwitchCmd, broadcastTimeMS)); | |||
| sendData(sendBleBean); | |||
| } | |||
| } | |||
| break; | |||
| case R.id.btnSleepTimeRead: | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.getNoConnectSleep()); | |||
| sendData(sendBleBean); | |||
| break; | |||
| case R.id.btn_start_ble: | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.setToWake()); | |||
| sendData(sendBleBean); | |||
| break; | |||
| case R.id.btnNameRssi: | |||
| if (mBleDevice != null) { | |||
| mBleDevice.readRssi(); | |||
| } | |||
| break; | |||
| case R.id.btn_set_device: | |||
| // 设置设备信息 | |||
| String setDevice = et_set_device.getText().toString(); | |||
| setDevice = setDevice.replace(" ", ""); | |||
| setDevice = setDevice.replace(",", ""); | |||
| if (TextUtils.isEmpty(setDevice)) { | |||
| return; | |||
| } else if (id == R.id.btnSleepTimeWrite) { | |||
| String sleepStr = etSleepTime.getText().toString().trim().toLowerCase(Locale.US); | |||
| if (sleepStr.contains(",")) { | |||
| String[] didStrS = sleepStr.split(","); | |||
| if (didStrS.length > 3) { | |||
| int switchStatus = Integer.parseInt(didStrS[0]); | |||
| int toSleepTimeS = Integer.parseInt(didStrS[1]); | |||
| int sleepSwitchCmd = Integer.parseInt(didStrS[2]); | |||
| int broadcastTimeMS = Integer.parseInt(didStrS[3]); | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.setNoConnectSleep(switchStatus, toSleepTimeS, sleepSwitchCmd, broadcastTimeMS)); | |||
| sendData(sendBleBean); | |||
| } | |||
| byte[] data = BleStrUtils.stringToByte(setDevice); | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.setDeviceInfo(data)); | |||
| sendData(sendBleBean); | |||
| addShowData("设置设备信息:" + BleStrUtils.byte2HexStr(data)); | |||
| break; | |||
| case R.id.btn_get_device: | |||
| // 获取设备信息 | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.getDeviceInfo()); | |||
| sendData(sendBleBean); | |||
| addShowData("读取设备信息"); | |||
| break; | |||
| case R.id.btnSnRead: | |||
| // 获取设备信息 | |||
| } | |||
| } else if (id == R.id.btnSleepTimeRead) { | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.getNoConnectSleep()); | |||
| sendData(sendBleBean); | |||
| } else if (id == R.id.btn_start_ble) { | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.setToWake()); | |||
| sendData(sendBleBean); | |||
| } else if (id == R.id.btnNameRssi) { | |||
| if (mBleDevice != null) { | |||
| mBleDevice.readRssi(); | |||
| } | |||
| } else if (id == R.id.btn_set_device) {// 设置设备信息 | |||
| String setDevice = et_set_device.getText().toString(); | |||
| setDevice = setDevice.replace(" ", ""); | |||
| setDevice = setDevice.replace(",", ""); | |||
| if (TextUtils.isEmpty(setDevice)) { | |||
| return; | |||
| } | |||
| byte[] data = BleStrUtils.stringToByte(setDevice); | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.setDeviceInfo(data)); | |||
| sendData(sendBleBean); | |||
| addShowData("设置设备信息:" + BleStrUtils.byte2HexStr(data)); | |||
| } else if (id == R.id.btn_get_device) {// 获取设备信息 | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.getDeviceInfo()); | |||
| sendData(sendBleBean); | |||
| addShowData("读取设备信息"); | |||
| } else if (id == R.id.btnSnRead) {// 获取设备信息 | |||
| sendBleBean = new SendBleBean(); | |||
| byte[] sendData = new byte[1]; | |||
| sendData[0] = (byte) 0x95; | |||
| sendBleBean.setHex(sendData); | |||
| sendData(sendBleBean); | |||
| addShowData("读取SN号"); | |||
| } else if (id == R.id.btnGetVersion46) {// 获取设备版本号(0x46) | |||
| if (mBleDevice != null) { | |||
| sendBleBean = new SendBleBean(); | |||
| byte[] sendData = new byte[1]; | |||
| sendData[0] = (byte) 0x95; | |||
| sendBleBean.setHex(sendData); | |||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion46()); | |||
| sendData(sendBleBean); | |||
| addShowData("读取SN号"); | |||
| addShowData("正在获取版本号(0x46)."); | |||
| break; | |||
| } | |||
| } | |||
| } | |||
| @@ -438,7 +418,7 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On | |||
| @Override | |||
| public void onDisConnected(@NonNull String mac, int code) { | |||
| //TODO 连接断开 | |||
| L.i( "连接断开"); | |||
| L.i("连接断开"); | |||
| if (mAddress.equals(mac)) { | |||
| Toast.makeText(mContext, "连接断开:" + code, Toast.LENGTH_SHORT).show(); | |||
| mBleDevice = null; | |||
| @@ -541,6 +521,12 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On | |||
| } | |||
| @Override | |||
| public void onBmVersion46(String version) { | |||
| mDeviceVersion46 = version; | |||
| addShowData("版本号(0x46):" + version); | |||
| } | |||
| @Override | |||
| public void onSupportUnit(List<SupportUnitBean> list) { | |||
| StringBuilder unitStr = new StringBuilder(); | |||
| @@ -702,7 +688,7 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On | |||
| int systemBattery = AppPhoneInfoUtils.getSystemBattery(mContext); | |||
| String appData = "包名:" + BuildConfig.APPLICATION_ID + | |||
| "\nApp版本:" + AppPhoneInfoUtils.getVersionName(mContext) + | |||
| "\n设备版本:" + mDeviceVersion + | |||
| "\n设备版本:" + mDeviceVersion + " 0x46=" + mDeviceVersion46 + | |||
| "\n设备:CID=0x" + Integer.toHexString(mCid) + " VID=0x" + Integer.toHexString(mVid) + " PID=0x" + Integer.toHexString(mPid) + | |||
| "\n手机型号:" + AppPhoneInfoUtils.getPhoneInfo() + " " + AppPhoneInfoUtils.getBrand() + | |||
| "\n手机系统:" + AppPhoneInfoUtils.getSystemVersionString() + | |||
| @@ -721,4 +707,8 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On | |||
| startActivity(sendIntent); | |||
| } | |||
| @Override | |||
| public void addMenuProvider(@NonNull MenuProvider provider, @NonNull LifecycleOwner owner, @NonNull Lifecycle.State state) { | |||
| } | |||
| } | |||
| @@ -51,13 +51,9 @@ public class BroadcastBloodOxygenActivity extends BleBaseActivity implements OnC | |||
| private Handler mHandler = new Handler(Looper.getMainLooper()) { | |||
| @Override | |||
| public void handleMessage(Message msg) { | |||
| switch (msg.what) { | |||
| case REFRESH_DATA: | |||
| if (listAdapter != null) | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| if (msg.what == REFRESH_DATA) { | |||
| if (listAdapter != null) | |||
| listAdapter.notifyDataSetChanged(); | |||
| } | |||
| } | |||
| }; | |||
| @@ -90,22 +86,19 @@ public class BroadcastBloodOxygenActivity extends BleBaseActivity implements OnC | |||
| @Override | |||
| public void onClick(View v) { | |||
| switch (v.getId()) { | |||
| case R.id.clear: | |||
| if (mList != null) | |||
| mList.clear(); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| break; | |||
| case R.id.open: | |||
| if (mAILinkBleManager != null) { | |||
| mAILinkBleManager.startScan(0, UUID.fromString("0000F0A0-0000-1000-8000-00805F9B34FB")); | |||
| } | |||
| break; | |||
| case R.id.stop: | |||
| if (mAILinkBleManager != null) { | |||
| mAILinkBleManager.stopScan(); | |||
| } | |||
| break; | |||
| int id = v.getId(); | |||
| if (id == R.id.clear) { | |||
| if (mList != null) | |||
| mList.clear(); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } else if (id == R.id.open) { | |||
| if (mAILinkBleManager != null) { | |||
| mAILinkBleManager.startScan(0, UUID.fromString("0000F0A0-0000-1000-8000-00805F9B34FB")); | |||
| } | |||
| } else if (id == R.id.stop) { | |||
| if (mAILinkBleManager != null) { | |||
| mAILinkBleManager.stopScan(); | |||
| } | |||
| } | |||
| } | |||
| @@ -61,13 +61,9 @@ public class BroadcastScaleActivity extends BleNewBaseActivity implements OnCall | |||
| private Handler mHandler = new Handler(Looper.getMainLooper()) { | |||
| @Override | |||
| public void handleMessage(Message msg) { | |||
| switch (msg.what) { | |||
| case REFRESH_DATA: | |||
| if (listAdapter != null) | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| if (msg.what == REFRESH_DATA) { | |||
| if (listAdapter != null) | |||
| listAdapter.notifyDataSetChanged(); | |||
| } | |||
| } | |||
| }; | |||
| @@ -113,29 +109,21 @@ public class BroadcastScaleActivity extends BleNewBaseActivity implements OnCall | |||
| public void onCheckedChanged(RadioGroup group, int checkedId) { | |||
| if (checkedId == -1) | |||
| return;//不是人为点击不触发 | |||
| switch (group.getCheckedRadioButtonId()) { | |||
| case R.id.radio_weight_kg: | |||
| mWeightUnit = BabyBleConfig.BABY_KG; | |||
| break; | |||
| case R.id.radio_weight_jin: | |||
| mWeightUnit = BabyBleConfig.BABY_FG; | |||
| break; | |||
| case R.id.radio_weight_lb: | |||
| mWeightUnit = BabyBleConfig.BABY_LB; | |||
| break; | |||
| case R.id.radio_weight_oz: | |||
| mWeightUnit = BabyBleConfig.BABY_OZ; | |||
| break; | |||
| case R.id.radio_weight_st_lb: | |||
| mWeightUnit = BabyBleConfig.BABY_ST; | |||
| break; | |||
| case R.id.radio_weight_g: | |||
| mWeightUnit = BabyBleConfig.BABY_G; | |||
| break; | |||
| case R.id.radio_weight_lb_lb: | |||
| mWeightUnit = BabyBleConfig.BABY_LB_LB; | |||
| break; | |||
| int checkedRadioButtonId = group.getCheckedRadioButtonId(); | |||
| if (checkedRadioButtonId == R.id.radio_weight_kg) { | |||
| mWeightUnit = BabyBleConfig.BABY_KG; | |||
| } else if (checkedRadioButtonId == R.id.radio_weight_jin) { | |||
| mWeightUnit = BabyBleConfig.BABY_FG; | |||
| } else if (checkedRadioButtonId == R.id.radio_weight_lb) { | |||
| mWeightUnit = BabyBleConfig.BABY_LB; | |||
| } else if (checkedRadioButtonId == R.id.radio_weight_oz) { | |||
| mWeightUnit = BabyBleConfig.BABY_OZ; | |||
| } else if (checkedRadioButtonId == R.id.radio_weight_st_lb) { | |||
| mWeightUnit = BabyBleConfig.BABY_ST; | |||
| } else if (checkedRadioButtonId == R.id.radio_weight_g) { | |||
| mWeightUnit = BabyBleConfig.BABY_G; | |||
| } else if (checkedRadioButtonId == R.id.radio_weight_lb_lb) { | |||
| mWeightUnit = BabyBleConfig.BABY_LB_LB; | |||
| } | |||
| BleLog.i(TAG, "weightUnit:" + mWeightUnit); | |||
| } | |||
| @@ -170,18 +158,15 @@ public class BroadcastScaleActivity extends BleNewBaseActivity implements OnCall | |||
| @Override | |||
| public void onClick(View v) { | |||
| switch (v.getId()) { | |||
| case R.id.clear: | |||
| if (mList != null) | |||
| mList.clear(); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| break; | |||
| case R.id.open: | |||
| AILinkBleManager.getInstance().startScan(0, BleConfig.UUID_SERVER_BROADCAST_AILINK); | |||
| break; | |||
| case R.id.stop: | |||
| AILinkBleManager.getInstance().stopScan(); | |||
| break; | |||
| int id = v.getId(); | |||
| if (id == R.id.clear) { | |||
| if (mList != null) | |||
| mList.clear(); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } else if (id == R.id.open) { | |||
| AILinkBleManager.getInstance().startScan(0, BleConfig.UUID_SERVER_BROADCAST_AILINK); | |||
| } else if (id == R.id.stop) { | |||
| AILinkBleManager.getInstance().stopScan(); | |||
| } | |||
| } | |||
| @@ -1,276 +0,0 @@ | |||
| package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||
| import android.content.Context; | |||
| import android.os.Bundle; | |||
| import android.os.Handler; | |||
| import android.os.Looper; | |||
| import android.os.Message; | |||
| import android.view.View; | |||
| import android.widget.ArrayAdapter; | |||
| import android.widget.EditText; | |||
| import android.widget.ListView; | |||
| import androidx.annotation.NonNull; | |||
| import androidx.annotation.Nullable; | |||
| import com.pingwang.bluetoothlib.device.BleDevice; | |||
| import com.pingwang.bluetoothlib.device.BleSendCmdUtil; | |||
| import com.pingwang.bluetoothlib.device.SendBleBean; | |||
| import com.pingwang.bluetoothlib.device.SendMcuBean; | |||
| import com.pingwang.bluetoothlib.listener.CallbackDisIm; | |||
| import com.pingwang.bluetoothlib.listener.OnBleDeviceDataListener; | |||
| import com.pingwang.bluetoothlib.listener.OnBleOtherDataListener; | |||
| import com.pingwang.bluetoothlib.listener.OnBleVersionListener; | |||
| import com.pingwang.bluetoothlib.listener.OnCallbackDis; | |||
| import com.pingwang.bluetoothlib.listener.OnMcuParameterListener; | |||
| import com.pingwang.bluetoothlib.utils.BleLog; | |||
| import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||
| import java.util.ArrayList; | |||
| import java.util.List; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
| import cn.net.aicare.modulelibrary.module.sphygmomanometer.SphyBleConfig; | |||
| /** | |||
| * xing<br> | |||
| * 2019/4/25<br> | |||
| * 验证不握手不加密模块 | |||
| */ | |||
| public class ClearShakeHandsActivity extends BleBaseActivity implements OnCallbackDis, OnBleVersionListener, OnMcuParameterListener, | |||
| View.OnClickListener, OnBleOtherDataListener, OnBleDeviceDataListener { | |||
| private static String TAG = ClearShakeHandsActivity.class.getName(); | |||
| private final int REFRESH_DATA = 3; | |||
| private List<String> mList; | |||
| private ArrayAdapter listAdapter; | |||
| private Context mContext; | |||
| private EditText et_type; | |||
| private BleDevice mBleDevice; | |||
| private String mAddress; | |||
| private BleSendCmdUtil mBleSendCmdUtil; | |||
| private int mCid = 0x01; | |||
| private byte unit = 0; | |||
| private boolean mPauseRefresh = false; | |||
| private Handler mHandler = new Handler(Looper.getMainLooper()) { | |||
| @Override | |||
| public void handleMessage(Message msg) { | |||
| switch (msg.what) { | |||
| case REFRESH_DATA: | |||
| if (listAdapter != null) | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| } | |||
| } | |||
| }; | |||
| @Override | |||
| protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
| super.onCreate(savedInstanceState); | |||
| setContentView(R.layout.activity_clear_shake_hands); | |||
| mContext = this; | |||
| mAddress = getIntent().getStringExtra("mac"); | |||
| mCid = getIntent().getIntExtra("cid", -1); | |||
| mBleSendCmdUtil = BleSendCmdUtil.getInstance(); | |||
| init(); | |||
| } | |||
| private void init() { | |||
| mList = new ArrayList<>(); | |||
| ListView listView = findViewById(R.id.listview); | |||
| listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | |||
| listView.setAdapter(listAdapter); | |||
| findViewById(R.id.btnPause).setOnClickListener(this); | |||
| findViewById(R.id.btn_set_unit).setOnClickListener(this); | |||
| findViewById(R.id.btn1).setOnClickListener(this); | |||
| findViewById(R.id.clear).setOnClickListener(this); | |||
| findViewById(R.id.btnClearShakeHands).setOnClickListener(this); | |||
| et_type = findViewById(R.id.et_type); | |||
| } | |||
| @Override | |||
| public void onClick(View v) { | |||
| switch (v.getId()) { | |||
| case R.id.btn_set_unit: | |||
| if (unit == SphyBleConfig.SPHY_UNIT_MMHG) { | |||
| unit = SphyBleConfig.SPHY_UNIT_KPA; | |||
| setUnit(unit); | |||
| } else { | |||
| unit = SphyBleConfig.SPHY_UNIT_MMHG; | |||
| setUnit(unit); | |||
| } | |||
| break; | |||
| case R.id.btnPause: | |||
| mPauseRefresh = !mPauseRefresh; | |||
| break; | |||
| case R.id.btn1: | |||
| String cmd = et_type.getText().toString().trim(); | |||
| byte[] bytes = new byte[cmd.length() / 2]; | |||
| for (int i = 0; i <= cmd.length() - 2; i += 2) { | |||
| int i1 = Integer.parseInt(cmd.substring(i, i + 2), 16); | |||
| bytes[i >> 1] = (byte) i1; | |||
| } | |||
| SendMcuBean sendDataBean = new SendMcuBean(); | |||
| sendDataBean.setHex(mCid, bytes); | |||
| mBleDevice.sendData(sendDataBean); | |||
| mList.add(TimeUtils.getTime() + "发送(A7)->" + BleStrUtils.byte2HexStr(bytes)); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| break; | |||
| case R.id.clear: | |||
| if (mList != null) | |||
| mList.clear(); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| break; | |||
| case R.id.btnClearShakeHands: | |||
| byte[] send = mBleSendCmdUtil.setClearShakeHands(); | |||
| SendBleBean sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(send); | |||
| mBleDevice.sendData(sendBleBean); | |||
| mList.add(TimeUtils.getTime() + "发送(A6)->" + BleStrUtils.byte2HexStr(send)); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| break; | |||
| } | |||
| } | |||
| /** | |||
| * 设置单位(Set unit) | |||
| * | |||
| * @param unit | |||
| */ | |||
| public void setUnit(byte unit) { | |||
| SendMcuBean sendMcuBean = new SendMcuBean(); | |||
| byte[] data = new byte[2]; | |||
| data[0] = SphyBleConfig.SET_UNIT; | |||
| data[1] = unit; | |||
| sendMcuBean.setHex(0x01, data); | |||
| mBleDevice.sendData(sendMcuBean); | |||
| mList.add(TimeUtils.getTime() + "发送(A7)->" + BleStrUtils.byte2HexStr(data)); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| //---------------------------------服务--------------------------------------------------- | |||
| @Override | |||
| public void onServiceSuccess() { | |||
| CallbackDisIm.getInstance().addListListener(this); | |||
| BleLog.i(TAG, "服务与界面建立连接成功"); | |||
| //与服务建立连接 | |||
| if (mAILinkBleManager != null) { | |||
| mBleDevice = mAILinkBleManager.getBleDevice(mAddress); | |||
| //设置不加密 | |||
| mBleDevice.setA7Encryption(false); | |||
| mBleDevice.setOnBleDeviceDataListener(ClearShakeHandsActivity.this); | |||
| mBleDevice.setOnBleVersionListener(ClearShakeHandsActivity.this); | |||
| mBleDevice.setOnBleOtherDataListener(ClearShakeHandsActivity.this); | |||
| mBleDevice.sendData(new SendBleBean(mBleSendCmdUtil.getBleVersion())); | |||
| } | |||
| } | |||
| @Override | |||
| public void onServiceErr() { | |||
| BleLog.i(TAG, "服务与界面连接断开"); | |||
| //与服务断开连接 | |||
| mAILinkBleManager = null; | |||
| } | |||
| @Override | |||
| public void unbindServices() { | |||
| CallbackDisIm.getInstance().removeListener(this); | |||
| if (mBleDevice != null) { | |||
| mBleDevice.disconnect(); | |||
| mBleDevice = null; | |||
| } | |||
| } | |||
| //-----------------状态------------------- | |||
| @Override | |||
| public void onConnecting(@NonNull String mac) { | |||
| //TODO 连接中 | |||
| if (mAddress.equals(mac)) | |||
| BleLog.i(TAG, "连接中"); | |||
| } | |||
| @Override | |||
| public void onDisConnected(@NonNull String mac, int code) { | |||
| //TODO 连接断开 | |||
| if (mAddress.equals(mac)) { | |||
| BleLog.i(TAG, "连接断开"); | |||
| finish(); | |||
| } | |||
| } | |||
| @Override | |||
| public void onServicesDiscovered(@NonNull String mac) { | |||
| //TODO 连接成功(获取服务成功) | |||
| if (mAddress.equals(mac)) | |||
| BleLog.i(TAG, "连接成功(获取服务成功)"); | |||
| } | |||
| @Override | |||
| public void bleOpen() { | |||
| } | |||
| @Override | |||
| public void bleClose() { | |||
| BleLog.i(TAG, "蓝牙未开启,可请求开启"); | |||
| finish(); | |||
| } | |||
| //-----------------通知------------------- | |||
| @Override | |||
| public void onNotifyData(String uuid, byte[] hex, int type) { | |||
| addData("notify(A7)->" + BleStrUtils.byte2HexStr(hex)); | |||
| } | |||
| @Override | |||
| public void onNotifyDataA6(String uuid, byte[] hex) { | |||
| addData("notify(A6)->" + BleStrUtils.byte2HexStr(hex)); | |||
| } | |||
| @Override | |||
| public void onNotifyOtherData(String uuid, byte[] data) { | |||
| addData("notify(透传)->" + BleStrUtils.byte2HexStr(data)); | |||
| } | |||
| @Override | |||
| public void onBmVersion(String version) { | |||
| addData("版本号:" + version); | |||
| } | |||
| private void addData(String data) { | |||
| if (mPauseRefresh) | |||
| return; | |||
| mList.add(TimeUtils.getTime() + "->" + data); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| @Override | |||
| protected void onDestroy() { | |||
| super.onDestroy(); | |||
| BleLog.i(TAG, "onDestroy"); | |||
| } | |||
| } | |||
| @@ -169,12 +169,7 @@ public class ConnectBleTestActivity extends AppCompatActivity implements OnCallb | |||
| } | |||
| } | |||
| }); | |||
| findViewById(R.id.跳过).setOnClickListener(new View.OnClickListener() { | |||
| @Override | |||
| public void onClick(View v) { | |||
| Toast.makeText(mContext, "跳过", Toast.LENGTH_SHORT).show(); | |||
| } | |||
| }); | |||
| } | |||
| //---------------------------------服务--------------------------------------------------- | |||
| @@ -35,7 +35,6 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
| import cn.net.aicare.modulelibrary.module.height.HeightDeviceData; | |||
| /** | |||
| * xing<br> | |||
| * 2019/4/25<br> | |||
| @@ -61,13 +60,9 @@ public class HeightCmdActivity extends BleBaseActivity implements OnCallbackDis, | |||
| private Handler mHandler = new Handler(Looper.getMainLooper()) { | |||
| @Override | |||
| public void handleMessage(Message msg) { | |||
| switch (msg.what) { | |||
| case REFRESH_DATA: | |||
| if (listAdapter != null) | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| if (msg.what == REFRESH_DATA) { | |||
| if (listAdapter != null) | |||
| listAdapter.notifyDataSetChanged(); | |||
| } | |||
| } | |||
| }; | |||
| @@ -123,30 +118,25 @@ public class HeightCmdActivity extends BleBaseActivity implements OnCallbackDis, | |||
| @Override | |||
| public void onClick(View v) { | |||
| SendBleBean sendBleBean = new SendBleBean(); | |||
| switch (v.getId()){ | |||
| case R.id.btnVersion: | |||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||
| mBleDevice.sendData(sendBleBean); | |||
| break; | |||
| case R.id.btnBattery: | |||
| sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus()); | |||
| mBleDevice.sendData(sendBleBean); | |||
| break; | |||
| case R.id.btn_get_did: | |||
| sendBleBean.setHex(mBleSendCmdUtil.getDid()); | |||
| mBleDevice.sendData(sendBleBean); | |||
| break; | |||
| case R.id.btn1: | |||
| String cmd = et_type.getText().toString().trim(); | |||
| SendMcuBean sendDataBean = new SendMcuBean(); | |||
| sendDataBean.setHex(type,cmd.getBytes()); | |||
| mBleDevice.sendData(sendDataBean); | |||
| break; | |||
| case R.id.clear: | |||
| if (mList != null) | |||
| mList.clear(); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| break; | |||
| int id = v.getId(); | |||
| if (id == R.id.btnVersion) { | |||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||
| mBleDevice.sendData(sendBleBean); | |||
| } else if (id == R.id.btnBattery) { | |||
| sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus()); | |||
| mBleDevice.sendData(sendBleBean); | |||
| } else if (id == R.id.btn_get_did) { | |||
| sendBleBean.setHex(mBleSendCmdUtil.getDid()); | |||
| mBleDevice.sendData(sendBleBean); | |||
| } else if (id == R.id.btn1) { | |||
| String cmd = et_type.getText().toString().trim(); | |||
| SendMcuBean sendDataBean = new SendMcuBean(); | |||
| sendDataBean.setHex(type, cmd.getBytes()); | |||
| mBleDevice.sendData(sendDataBean); | |||
| } else if (id == R.id.clear) { | |||
| if (mList != null) | |||
| mList.clear(); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| } | |||
| @@ -15,6 +15,7 @@ import com.pingwang.bluetoothlib.bean.BleValueBean; | |||
| import com.pingwang.bluetoothlib.bean.SupportUnitBean; | |||
| import com.pingwang.bluetoothlib.device.BleDevice; | |||
| import com.pingwang.bluetoothlib.listener.OnCallbackBle; | |||
| import com.pingwang.bluetoothlib.utils.BleDensityUtil; | |||
| import java.lang.ref.WeakReference; | |||
| import java.util.ArrayList; | |||
| @@ -265,9 +266,8 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall | |||
| @Override | |||
| public void onWeightBodyFat(int workMode, int weightMode, int weight, int decimals, int unit) { | |||
| addText(0, "体重体脂 模式:" + workMode + " 测量状态: " + weightMode + "\n 体重: " + weight | |||
| + " 小数位: " + decimals + " 单位: " + getWeightUnitStr(unit)); | |||
| String dataStr = BleDensityUtil.getInstance().holdDecimals(weight, decimals); | |||
| addText(0, "体重体脂 模式:" + workMode + " 测量状态: " + weightMode + "\n 体重: " + dataStr + getWeightUnitStr(unit)); | |||
| if (weightMode == 2) { | |||
| mMHandler.removeMessages(ADC); | |||
| mMHandler.removeMessages(FINISH); | |||
| @@ -293,10 +293,8 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall | |||
| @Override | |||
| public void onWeight(int workMode, int weightMode, int weight, int decimals, int unit) { | |||
| addText(0, "体重 模式:" + workMode + " 测量状态: " + weightMode + "\n 体重: " + weight | |||
| + " 小数位: " + decimals + " 单位: " + getWeightUnitStr(unit)); | |||
| String dataStr = BleDensityUtil.getInstance().holdDecimals(weight, decimals); | |||
| addText(0, "体重 模式:" + workMode + " 测量状态: " + weightMode + "\n 体重: " + dataStr + getWeightUnitStr(unit)); | |||
| if (weightMode == 2) { | |||
| mMHandler.removeMessages(FINISH); | |||
| mMHandler.sendEmptyMessageDelayed(FINISH, 40000); | |||
| @@ -347,13 +345,20 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall | |||
| @Override | |||
| public void onTEMP(int workMode, int sign, int temp, int decimals, int unit) { | |||
| addText(0, "温度数据 模式:" + workMode + " 温度: " + temp + " 正负: " + sign + "小数 : " + decimals + " 单位 : " + unit); | |||
| String dataStr = BleDensityUtil.getInstance().holdDecimals(temp, decimals); | |||
| if (sign==1) { | |||
| dataStr = "-" + dataStr; | |||
| } | |||
| addText(0, "温度数据 模式:" + workMode + " 温度: " + dataStr + getTempUnitStr(unit)); | |||
| } | |||
| @Override | |||
| public void onHeight(int workMode, int height, int decimals, int unit) { | |||
| addText(0, "身高数据 模式:" + workMode + " 身高: " + height + " 小数位: " + decimals + "单位 : " + getHeightUnitStr(unit)); | |||
| String dataStr = BleDensityUtil.getInstance().holdDecimals(height, decimals); | |||
| addText(0, "身高数据 模式:" + workMode + " 身高: " + dataStr + getHeightUnitStr(unit)); | |||
| // addText(0, "身高数据 模式:" + workMode + " 身高: " + height + " 小数位: " + decimals + "单位 : " + getHeightUnitStr(unit)); | |||
| } | |||
| @@ -394,141 +399,117 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall | |||
| public void onClick(View v) { | |||
| if (HeightBodyFatBleData.getInstance() != null) { | |||
| switch (v.getId()) { | |||
| case R.id.kg: | |||
| selectWUnit = 0; | |||
| addText(0, "下发体重单位 :" + getHeightUnitStr(currentHUnit)+","+getWeightUnitStr(selectWUnit)); | |||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(currentHUnit, selectWUnit)); | |||
| mMHandler.removeMessages(SETUNIT); | |||
| mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000); | |||
| break; | |||
| case R.id.jin: | |||
| selectWUnit = 1; | |||
| addText(0, "下发体重单位 :" + getHeightUnitStr(currentHUnit)+","+getWeightUnitStr(selectWUnit)); | |||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(currentHUnit, selectWUnit)); | |||
| mMHandler.removeMessages(SETUNIT); | |||
| mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000); | |||
| break; | |||
| case R.id.st_lb: | |||
| selectWUnit = 4; | |||
| addText(0, "下发体重单位 :" + getHeightUnitStr(currentHUnit)+","+getWeightUnitStr(selectWUnit)); | |||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(currentHUnit, selectWUnit)); | |||
| mMHandler.removeMessages(SETUNIT); | |||
| mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000); | |||
| break; | |||
| case R.id.lb: | |||
| selectWUnit = 6; | |||
| addText(0, "下发体重单位 :" + getHeightUnitStr(currentHUnit)+","+getWeightUnitStr(selectWUnit)); | |||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(currentHUnit, currentHUnit)); | |||
| mMHandler.removeMessages(SETUNIT); | |||
| mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000); | |||
| break; | |||
| case R.id.girl: | |||
| addText(0, "下用户 女 18岁 165cm :" + selectWUnit); | |||
| mHeightBodyFatUser = new HeightBodyFatUser(0, 18, 165, 0, 0); | |||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUser(mHeightBodyFatUser.getSex(), mHeightBodyFatUser.getAge(), mHeightBodyFatUser.getHeight())); | |||
| mMHandler.removeMessages(SETUSER); | |||
| mMHandler.sendEmptyMessageDelayed(SETUSER, 3000); | |||
| break; | |||
| case R.id.man: | |||
| addText(0, "下用户 男 28岁 170cm :" + selectWUnit); | |||
| mHeightBodyFatUser = new HeightBodyFatUser(1, 28, 170, 0, 0); | |||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUser(mHeightBodyFatUser.getSex(), mHeightBodyFatUser.getAge(), mHeightBodyFatUser.getHeight())); | |||
| mMHandler.removeMessages(SETUSER); | |||
| mMHandler.sendEmptyMessageDelayed(SETUSER, 3000); | |||
| break; | |||
| case R.id.cm: | |||
| selectHUnit = 0; | |||
| addText(0, "下发身高单位 :" + getHeightUnitStr(selectHUnit)+","+getWeightUnitStr(currentWUnit)); | |||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(selectHUnit, currentWUnit)); | |||
| mMHandler.removeMessages(SETUNIT); | |||
| mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000); | |||
| break; | |||
| case R.id.inch: | |||
| selectHUnit = 1; | |||
| addText(0, "下发身高单位 :" + getHeightUnitStr(selectHUnit)+","+getWeightUnitStr(currentWUnit)); | |||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(selectHUnit, currentWUnit)); | |||
| mMHandler.removeMessages(SETUNIT); | |||
| mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000); | |||
| break; | |||
| case R.id.ft_in: | |||
| selectHUnit = 2; | |||
| addText(0, "下发身高单位 :" + getHeightUnitStr(selectHUnit)+","+getWeightUnitStr(currentWUnit)); | |||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(selectHUnit, currentWUnit)); | |||
| mMHandler.removeMessages(SETUNIT); | |||
| mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000); | |||
| break; | |||
| case R.id.baby: | |||
| selectMode = 2; | |||
| addText(0, "下发工作模式 :" + selectMode); | |||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setWorkMode(selectMode)); | |||
| mMHandler.removeMessages(SETMODE); | |||
| mMHandler.sendEmptyMessageDelayed(SETMODE, 3000); | |||
| break; | |||
| case R.id.bodyfat: | |||
| selectMode = 1; | |||
| addText(0, "下发工作模式 :" + selectMode); | |||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setWorkMode(selectMode)); | |||
| mMHandler.removeMessages(SETMODE); | |||
| mMHandler.sendEmptyMessageDelayed(SETMODE, 3000); | |||
| break; | |||
| case R.id.weight: | |||
| selectMode = 3; | |||
| addText(0, "下发工作模式 :" + selectMode); | |||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setWorkMode(selectMode)); | |||
| mMHandler.removeMessages(SETMODE); | |||
| mMHandler.sendEmptyMessageDelayed(SETMODE, 3000); | |||
| break; | |||
| case R.id.height_weight: | |||
| selectMode = 4; | |||
| addText(0, "下发工作模式 :" + selectMode); | |||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setWorkMode(selectMode)); | |||
| mMHandler.removeMessages(SETMODE); | |||
| mMHandler.sendEmptyMessageDelayed(SETMODE, 3000); | |||
| break; | |||
| case R.id.deviceStatus: | |||
| addText(0, "请求设备状态 :"); | |||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.getDeviceStatus()); | |||
| mMHandler.removeMessages(DEVICESTATUS); | |||
| mMHandler.sendEmptyMessageDelayed(DEVICESTATUS, 3000); | |||
| break; | |||
| case R.id.voice_open: | |||
| selectVoice = 1; | |||
| addText(0, "设置声音 :" + selectMode); | |||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setVoiceStatus(selectVoice)); | |||
| mMHandler.removeMessages(VOICE); | |||
| mMHandler.sendEmptyMessageDelayed(VOICE, 3000); | |||
| break; | |||
| case R.id.voice_close: | |||
| selectVoice = 2; | |||
| addText(0, "设置声音 :" + selectMode); | |||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setVoiceStatus(selectVoice)); | |||
| mMHandler.removeMessages(VOICE); | |||
| mMHandler.sendEmptyMessageDelayed(VOICE, 3000); | |||
| break; | |||
| case R.id.voice_status: | |||
| addText(0, "获取声音状态"); | |||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.getVoiceStatus()); | |||
| mMHandler.removeMessages(VOICESTATUS); | |||
| mMHandler.sendEmptyMessageDelayed(VOICESTATUS, 3000); | |||
| break; | |||
| case R.id.finish: | |||
| addText(0, "回复测量完成"); | |||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.replyTestFinish()); | |||
| break; | |||
| case R.id.btnPause: | |||
| pauseRefresh = !pauseRefresh; | |||
| if (pauseRefresh) { | |||
| addText(0, "暂停刷新"); | |||
| } else { | |||
| addText(0, "继续刷新"); | |||
| } | |||
| break; | |||
| int id = v.getId(); | |||
| if (id == R.id.kg) { | |||
| selectWUnit = 0; | |||
| addText(0, "下发体重单位 :" + getHeightUnitStr(currentHUnit) + "," + getWeightUnitStr(selectWUnit)); | |||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(currentHUnit, selectWUnit)); | |||
| mMHandler.removeMessages(SETUNIT); | |||
| mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000); | |||
| } else if (id == R.id.jin) { | |||
| selectWUnit = 1; | |||
| addText(0, "下发体重单位 :" + getHeightUnitStr(currentHUnit) + "," + getWeightUnitStr(selectWUnit)); | |||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(currentHUnit, selectWUnit)); | |||
| mMHandler.removeMessages(SETUNIT); | |||
| mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000); | |||
| } else if (id == R.id.st_lb) { | |||
| selectWUnit = 4; | |||
| addText(0, "下发体重单位 :" + getHeightUnitStr(currentHUnit) + "," + getWeightUnitStr(selectWUnit)); | |||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(currentHUnit, selectWUnit)); | |||
| mMHandler.removeMessages(SETUNIT); | |||
| mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000); | |||
| } else if (id == R.id.lb) { | |||
| selectWUnit = 6; | |||
| addText(0, "下发体重单位 :" + getHeightUnitStr(currentHUnit) + "," + getWeightUnitStr(selectWUnit)); | |||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(currentHUnit, currentHUnit)); | |||
| mMHandler.removeMessages(SETUNIT); | |||
| mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000); | |||
| } else if (id == R.id.girl) { | |||
| addText(0, "下用户 女 18岁 165cm :" + selectWUnit); | |||
| mHeightBodyFatUser = new HeightBodyFatUser(0, 18, 165, 0, 0); | |||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUser(mHeightBodyFatUser.getSex(), mHeightBodyFatUser.getAge(), mHeightBodyFatUser.getHeight())); | |||
| mMHandler.removeMessages(SETUSER); | |||
| mMHandler.sendEmptyMessageDelayed(SETUSER, 3000); | |||
| } else if (id == R.id.man) { | |||
| addText(0, "下用户 男 28岁 170cm :" + selectWUnit); | |||
| mHeightBodyFatUser = new HeightBodyFatUser(1, 28, 170, 0, 0); | |||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUser(mHeightBodyFatUser.getSex(), mHeightBodyFatUser.getAge(), mHeightBodyFatUser.getHeight())); | |||
| mMHandler.removeMessages(SETUSER); | |||
| mMHandler.sendEmptyMessageDelayed(SETUSER, 3000); | |||
| } else if (id == R.id.cm) { | |||
| selectHUnit = 0; | |||
| addText(0, "下发身高单位 :" + getHeightUnitStr(selectHUnit) + "," + getWeightUnitStr(currentWUnit)); | |||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(selectHUnit, currentWUnit)); | |||
| mMHandler.removeMessages(SETUNIT); | |||
| mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000); | |||
| } else if (id == R.id.inch) { | |||
| selectHUnit = 1; | |||
| addText(0, "下发身高单位 :" + getHeightUnitStr(selectHUnit) + "," + getWeightUnitStr(currentWUnit)); | |||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(selectHUnit, currentWUnit)); | |||
| mMHandler.removeMessages(SETUNIT); | |||
| mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000); | |||
| } else if (id == R.id.ft_in) { | |||
| selectHUnit = 2; | |||
| addText(0, "下发身高单位 :" + getHeightUnitStr(selectHUnit) + "," + getWeightUnitStr(currentWUnit)); | |||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(selectHUnit, currentWUnit)); | |||
| mMHandler.removeMessages(SETUNIT); | |||
| mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000); | |||
| } else if (id == R.id.baby) { | |||
| selectMode = 2; | |||
| addText(0, "下发工作模式 :" + selectMode); | |||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setWorkMode(selectMode)); | |||
| mMHandler.removeMessages(SETMODE); | |||
| mMHandler.sendEmptyMessageDelayed(SETMODE, 3000); | |||
| } else if (id == R.id.bodyfat) { | |||
| selectMode = 1; | |||
| addText(0, "下发工作模式 :" + selectMode); | |||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setWorkMode(selectMode)); | |||
| mMHandler.removeMessages(SETMODE); | |||
| mMHandler.sendEmptyMessageDelayed(SETMODE, 3000); | |||
| } else if (id == R.id.weight) { | |||
| selectMode = 3; | |||
| addText(0, "下发工作模式 :" + selectMode); | |||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setWorkMode(selectMode)); | |||
| mMHandler.removeMessages(SETMODE); | |||
| mMHandler.sendEmptyMessageDelayed(SETMODE, 3000); | |||
| } else if (id == R.id.height_weight) { | |||
| selectMode = 4; | |||
| addText(0, "下发工作模式 :" + selectMode); | |||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setWorkMode(selectMode)); | |||
| mMHandler.removeMessages(SETMODE); | |||
| mMHandler.sendEmptyMessageDelayed(SETMODE, 3000); | |||
| } else if (id == R.id.deviceStatus) { | |||
| addText(0, "请求设备状态 :"); | |||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.getDeviceStatus()); | |||
| mMHandler.removeMessages(DEVICESTATUS); | |||
| mMHandler.sendEmptyMessageDelayed(DEVICESTATUS, 3000); | |||
| } else if (id == R.id.voice_open) { | |||
| selectVoice = 1; | |||
| addText(0, "设置声音 :" + selectMode); | |||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setVoiceStatus(selectVoice)); | |||
| mMHandler.removeMessages(VOICE); | |||
| mMHandler.sendEmptyMessageDelayed(VOICE, 3000); | |||
| } else if (id == R.id.voice_close) { | |||
| selectVoice = 2; | |||
| addText(0, "设置声音 :" + selectMode); | |||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setVoiceStatus(selectVoice)); | |||
| mMHandler.removeMessages(VOICE); | |||
| mMHandler.sendEmptyMessageDelayed(VOICE, 3000); | |||
| } else if (id == R.id.voice_status) { | |||
| addText(0, "获取声音状态"); | |||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.getVoiceStatus()); | |||
| mMHandler.removeMessages(VOICESTATUS); | |||
| mMHandler.sendEmptyMessageDelayed(VOICESTATUS, 3000); | |||
| } else if (id == R.id.finish) { | |||
| addText(0, "回复测量完成"); | |||
| HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.replyTestFinish()); | |||
| } else if (id == R.id.btnPause) { | |||
| pauseRefresh = !pauseRefresh; | |||
| if (pauseRefresh) { | |||
| addText(0, "暂停刷新"); | |||
| } else { | |||
| addText(0, "继续刷新"); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -600,6 +581,16 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall | |||
| } | |||
| return ""; | |||
| } | |||
| private String getTempUnitStr(int unit) { | |||
| switch (unit) { | |||
| case 0: | |||
| return "℃"; | |||
| case 1: | |||
| return "℉"; | |||
| } | |||
| return ""; | |||
| } | |||
| private boolean pauseRefresh = false; | |||
| @@ -49,8 +49,6 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.HintDataDialogFragment; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.LoadingIosDialogFragment; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.home.HomeDataManager; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.home.MainActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.toothbrush.ToothBrushWifiBleActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.CheckPermissionUtils; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.MyBleStrUtils; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.view.MyItemDecoration; | |||
| @@ -73,6 +71,7 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O | |||
| private final int BIND_SERVER_ERR = 2; | |||
| private final int REFRESH_DATA = 3; | |||
| private EditText et_cid; | |||
| private EditText et_filter_name; | |||
| private List<BleValueBean> mBleValueList; | |||
| private StringAdapter listAdapter; | |||
| @@ -127,9 +126,8 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O | |||
| } | |||
| init(); | |||
| initData(); | |||
| // 如果是蓝牙牙刷,就弹个框提醒 | |||
| if (mCid == BleDeviceConfig.TOOTHBRUSH_TEST) { | |||
| // 如果是蓝牙牙刷,就弹个框提醒 | |||
| new AlertDialog.Builder(mContext).setMessage("启动牙刷,工作10秒钟,然后关闭牙刷(让牙刷处于广播状态),然后点击搜索,选中列表中的牙刷,开始测试") | |||
| .setPositiveButton("确认", null) | |||
| .show(); | |||
| @@ -152,9 +150,9 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O | |||
| Button btn = findViewById(R.id.btn); | |||
| Button btn1 = findViewById(R.id.btn1); | |||
| Button clear = findViewById(R.id.clear); | |||
| EditText et_filter_name = findViewById(R.id.et_filter_name); | |||
| et_filter_name = findViewById(R.id.et_filter_name); | |||
| EditText et_filter_mac = findViewById(R.id.et_filter_mac); | |||
| EditText et_cid = findViewById(R.id.et_cid); | |||
| et_cid = findViewById(R.id.et_cid); | |||
| if (mScanCid > 0) { | |||
| et_cid.setText(MyBleStrUtils.getHexString(mScanCid)); | |||
| } else { | |||
| @@ -181,10 +179,12 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O | |||
| List<BleScanAddAilinkBean> list = new ArrayList<>(); | |||
| list.add(new BleScanAddAilinkBean(0x37, 0x03, 0x01, SkateboardBleConfig.UUID_BROADCAST)); | |||
| mAILinkBleManager.startScan(scanOut, list, BleConfig.UUID_SERVER_AILINK, SkateboardBleConfig.UUID_BROADCAST); | |||
| } else if (mType == BleDeviceConfig.BLE_SMART_CYCLING_TABLE) { | |||
| mAILinkBleManager.startScan(scanOut); | |||
| } else { | |||
| //0000FEE7=手表 | |||
| // 0000FEE7=手表 | |||
| mAILinkBleManager.startScan(scanOut, BleConfig.UUID_BROADCAST_AILINK, BleConfig.UUID_SERVER_BROADCAST_AILINK, UUID.fromString("0000FEE7-0000-1000-8000-00805F9B34FB"), SkateboardBleConfig.UUID_BROADCAST); | |||
| // BleScanUtil.scanLeDevice(AILinkBleManager.getInstance(), scanOut); | |||
| // BleScanUtil.scanLeDevice(AILinkBleManager.getInstance(), scanOut,BleConfig.UUID_BROADCAST_AILINK, BleConfig.UUID_SERVER_BROADCAST_AILINK); | |||
| } | |||
| mBleValueList.clear(); | |||
| listAdapter.notifyDataSetChanged(); | |||
| @@ -220,6 +220,7 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O | |||
| mPid = bleValueBean.getPid(); | |||
| mBleName = bleValueBean.getName(); | |||
| // if (mType == BleDeviceConfig.CLEAR_SHAKE_HANDS || mType == BleDeviceConfig.BLE_SEND_SPEED_TEST) { | |||
| if (mType == BleDeviceConfig.CLEAR_SHAKE_HANDS) { | |||
| //验证不握手,不加密的界面使用 | |||
| //设置不握手 | |||
| @@ -229,14 +230,6 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O | |||
| mAILinkBleManager.connectDevice(new BleValueBean(mac, mCid, mVid, mPid)); | |||
| showLoading(); | |||
| } | |||
| } else if (BleDeviceConfig.TOOTHBRUSH_WIFI_BLE == mType) { | |||
| Intent intent = new Intent(); | |||
| intent.setClass(ShowBleActivity.this, ToothBrushWifiBleActivity.class); | |||
| intent.putExtra("type", mType); | |||
| intent.putExtra("cid", mCid); | |||
| intent.putExtra("mac", mac); | |||
| startActivity(intent); | |||
| } else { | |||
| if (mCid == BleDeviceConfig.BLE_BOOLD_OXYGEN && mVid == 0x0012) { | |||
| //vid=12的不用握手校验,不加密 | |||
| @@ -470,8 +463,8 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O | |||
| if (mAILinkBleManager != null) { | |||
| mAILinkBleManager.setOnCallbackBle(ShowBleActivity.this); | |||
| mAILinkBleManager.setOnScanFilterListener(ShowBleActivity.this); | |||
| mAILinkBleManager.initForegroundService(1, R.mipmap.ic_launcher, "前台服务", MainActivity.class); | |||
| mAILinkBleManager.startForegroundService();//启动前台服务 | |||
| // mAILinkBleManager.initForegroundService(1, R.mipmap.ic_launcher, "前台服务", MainActivity.class); | |||
| // mAILinkBleManager.startForegroundService();//启动前台服务 | |||
| mHandler.sendEmptyMessage(BIND_SERVER_OK); | |||
| } | |||
| } | |||
| @@ -1,406 +0,0 @@ | |||
| package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||
| import android.content.Context; | |||
| import android.os.Bundle; | |||
| import android.os.Handler; | |||
| import android.os.Looper; | |||
| import android.os.Message; | |||
| import android.view.View; | |||
| import android.widget.ArrayAdapter; | |||
| import android.widget.Button; | |||
| import android.widget.ListView; | |||
| import android.widget.Toast; | |||
| import androidx.annotation.NonNull; | |||
| import androidx.annotation.Nullable; | |||
| import com.pingwang.bluetoothlib.device.BleDevice; | |||
| import com.pingwang.bluetoothlib.device.BleSendCmdUtil; | |||
| import com.pingwang.bluetoothlib.device.SendBleBean; | |||
| import com.pingwang.bluetoothlib.listener.OnBleVersionListener; | |||
| import com.pingwang.bluetoothlib.listener.OnCallbackDis; | |||
| import com.pingwang.bluetoothlib.listener.OnScanFilterListener; | |||
| import com.pingwang.bluetoothlib.utils.BleLog; | |||
| import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||
| import java.util.ArrayList; | |||
| import java.util.List; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
| import butterknife.BindView; | |||
| import butterknife.ButterKnife; | |||
| import cn.net.aicare.modulelibrary.module.SmartMask.SmartMaskBleConfig; | |||
| import cn.net.aicare.modulelibrary.module.SmartMask.SmartMaskDeviceData; | |||
| /** | |||
| * xing<br> | |||
| * 2020/09/15<br> | |||
| * 智能口罩 | |||
| */ | |||
| public class SmartMaskActivity extends BleBaseActivity implements OnCallbackDis, SmartMaskDeviceData.onNotifyData, OnBleVersionListener, OnScanFilterListener, View.OnClickListener { | |||
| private static String TAG = SmartMaskActivity.class.getName(); | |||
| private final int REFRESH_DATA = 3; | |||
| @BindView(R.id.clear) | |||
| Button mClear; | |||
| @BindView(R.id.set_status) | |||
| Button mSetStatus; | |||
| @BindView(R.id.set_filter) | |||
| Button mSetFilter; | |||
| @BindView(R.id.set_fan) | |||
| Button mSetFan; | |||
| @BindView(R.id.listview) | |||
| ListView mListview; | |||
| @BindView(R.id.get_version) | |||
| Button mGetVersion; | |||
| @BindView(R.id.get_AIQ) | |||
| Button mGetAIQ; | |||
| @BindView(R.id.close_power) | |||
| Button closePower; | |||
| @BindView(R.id.set_mode) | |||
| Button setMode; | |||
| @BindView(R.id.set_payload) | |||
| Button setPayload; | |||
| private List<String> mList; | |||
| private ArrayAdapter listAdapter; | |||
| private Context mContext; | |||
| private SmartMaskDeviceData mDevice; | |||
| private String mAddress = ""; | |||
| private BleSendCmdUtil mBleSendCmdUtil; | |||
| private int type = SmartMaskBleConfig.SMART_MASK; | |||
| private int mFanStatus = 0; | |||
| private boolean showPayload; | |||
| private Handler mHandler = new Handler(Looper.getMainLooper()) { | |||
| @Override | |||
| public void handleMessage(Message msg) { | |||
| switch (msg.what) { | |||
| case REFRESH_DATA: | |||
| if (listAdapter != null) | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| } | |||
| } | |||
| }; | |||
| @Override | |||
| protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
| super.onCreate(savedInstanceState); | |||
| setContentView(R.layout.activity_smart_mask); | |||
| ButterKnife.bind(this); | |||
| mContext = this; | |||
| mAddress = getIntent().getStringExtra("mac"); | |||
| type = getIntent().getIntExtra("type", -1); | |||
| mBleSendCmdUtil = BleSendCmdUtil.getInstance(); | |||
| init(); | |||
| } | |||
| private void init() { | |||
| mList = new ArrayList<>(); | |||
| listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | |||
| mListview.setAdapter(listAdapter); | |||
| mClear.setOnClickListener(this); | |||
| mSetStatus.setOnClickListener(this); | |||
| mSetFilter.setOnClickListener(this); | |||
| mSetFan.setOnClickListener(this); | |||
| mGetVersion.setOnClickListener(this); | |||
| setPayload.setOnClickListener(this); | |||
| setMode.setOnClickListener(this); | |||
| closePower.setOnClickListener(this); | |||
| mGetAIQ.setOnClickListener(this); | |||
| } | |||
| @Override | |||
| public void onClick(View v) { | |||
| switch (v.getId()) { | |||
| case R.id.clear: | |||
| if (mList != null) | |||
| mList.clear(); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| break; | |||
| case R.id.get_version: | |||
| if (mDevice != null) { | |||
| SendBleBean sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||
| mDevice.sendData(sendBleBean); | |||
| } | |||
| break; | |||
| case R.id.set_status: | |||
| if (mDevice != null) { | |||
| mDevice.setStatus(); | |||
| } | |||
| break; | |||
| case R.id.set_filter: | |||
| if (mDevice != null) { | |||
| mDevice.setReplaceFilter(); | |||
| } | |||
| break; | |||
| case R.id.set_fan: | |||
| if (mDevice != null) { | |||
| if (mFanStatus < 2) { | |||
| mFanStatus++; | |||
| } else if (mFanStatus == 2) { | |||
| mFanStatus = 0; | |||
| } | |||
| mDevice.setFanStatus(mFanStatus); | |||
| } | |||
| break; | |||
| case R.id.get_AIQ: | |||
| if (mDevice != null) mDevice.getIAQData(); | |||
| break; | |||
| case R.id.set_mode: | |||
| if (mDevice != null) mDevice.setTestMode(); | |||
| break; | |||
| case R.id.close_power: | |||
| if (mDevice != null) mDevice.closePower(); | |||
| break; | |||
| case R.id.set_payload: | |||
| showPayload = true; | |||
| break; | |||
| } | |||
| } | |||
| //---------------------------------服务--------------------------------------------------- | |||
| @Override | |||
| public void onServiceSuccess() { | |||
| BleLog.i(TAG, "服务与界面建立连接成功"); | |||
| //与服务建立连接 | |||
| if (mAILinkBleManager != null) { | |||
| BleDevice bleDevice = mAILinkBleManager.getBleDevice(mAddress); | |||
| if (bleDevice != null) { | |||
| mDevice = SmartMaskDeviceData.getInstance(bleDevice); | |||
| mDevice.setOnNotifyData(this); | |||
| mDevice.setOnBleVersionListener(this); | |||
| } | |||
| } | |||
| } | |||
| @Override | |||
| public void onServiceErr() { | |||
| BleLog.i(TAG, "服务与界面连接断开"); | |||
| //与服务断开连接 | |||
| mAILinkBleManager = null; | |||
| } | |||
| @Override | |||
| public void unbindServices() { | |||
| if (mDevice != null) { | |||
| mDevice.disconnect(); | |||
| mDevice.clear(); | |||
| mDevice = null; | |||
| } | |||
| } | |||
| //-----------------通知------------------- | |||
| @Override | |||
| public void onData(byte[] hex, int type) { | |||
| String data = ""; | |||
| if (hex != null) | |||
| data = BleStrUtils.byte2HexStr(hex); | |||
| if (type == 100) { | |||
| mList.add(TimeUtils.getTime() + "send->" + data); | |||
| } else { | |||
| mList.add(TimeUtils.getTime() + "notify->" + data); | |||
| } | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| @Override | |||
| public void onConnecting(@NonNull String mac) { | |||
| //TODO 连接中 | |||
| BleLog.i(TAG, "连接中"); | |||
| } | |||
| @Override | |||
| public void onDisConnected(@NonNull String mac, int code) { | |||
| //TODO 连接断开 | |||
| BleLog.i(TAG, "连接断开"); | |||
| finish(); | |||
| Toast.makeText(mContext, "连接断开", Toast.LENGTH_SHORT).show(); | |||
| } | |||
| @Override | |||
| public void onServicesDiscovered(@NonNull String mac) { | |||
| //TODO 连接成功(获取服务成功) | |||
| BleLog.i(TAG, "连接成功(获取服务成功)"); | |||
| } | |||
| @Override | |||
| public void bleOpen() { | |||
| } | |||
| @Override | |||
| public void bleClose() { | |||
| BleLog.i(TAG, "蓝牙未开启,可请求开启"); | |||
| } | |||
| //-----------------通知------------------- | |||
| @Override | |||
| public void onPayloadData(byte[] data) { | |||
| if (showPayload) { | |||
| mList.add(BleStrUtils.byte2HexStr(data)); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| } | |||
| @Override | |||
| public void onSetStatus(int type,int status) { | |||
| String data = ""; | |||
| if (type==SmartMaskBleConfig.GET_TEST_MODE){ | |||
| data="进入测试模式:"; | |||
| }else if (type==SmartMaskBleConfig.GET_POWER){ | |||
| data="关机:"; | |||
| } | |||
| switch (status) { | |||
| case 0: | |||
| data += "成功"; | |||
| break; | |||
| case 1: | |||
| data += "失败"; | |||
| break; | |||
| } | |||
| mList.add(TimeUtils.getTime() + data); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| @Override | |||
| public void onStatus(int airIndex, int fanStatus, int power, int powerStatus, int batteryRemaining, int breathRate, int breathState, int filterDuration) { | |||
| String data = "口罩状态:"; | |||
| String fanStatusStr = "风扇状态:"; | |||
| switch (fanStatus) { | |||
| case 0: | |||
| fanStatusStr += "关闭"; | |||
| break; | |||
| case 1: | |||
| fanStatusStr += "1 档"; | |||
| break; | |||
| case 2: | |||
| fanStatusStr += "2 档"; | |||
| break; | |||
| } | |||
| String powerStatusStr = "电池状态:"; | |||
| switch (powerStatus) { | |||
| case 0: | |||
| powerStatusStr += "充电"; | |||
| break; | |||
| case 1: | |||
| powerStatusStr += "非充电"; | |||
| break; | |||
| } | |||
| String breathStateStr = "呼吸状态:"; | |||
| switch (breathState) { | |||
| case 1: | |||
| breathStateStr += "呼气"; | |||
| break; | |||
| case 2: | |||
| breathStateStr += "吸气"; | |||
| break; | |||
| } | |||
| data += "空气指数:" + airIndex + ";" + fanStatusStr + "\n"; | |||
| data += "电量:" + power + "%;" + powerStatusStr + "\n"; | |||
| data += "呼吸频率:" + breathRate + "次/min;" + breathStateStr + "\n"; | |||
| data += "电池续航:" + batteryRemaining + "min;滤网的总工作时长:" + filterDuration; | |||
| mList.add(TimeUtils.getTime() + data); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| @Override | |||
| public void onFilter(int status) { | |||
| String data = "更换滤网:"; | |||
| switch (status) { | |||
| case 0: | |||
| data += "成功"; | |||
| break; | |||
| case 1: | |||
| data += "失败"; | |||
| break; | |||
| } | |||
| mList.add(TimeUtils.getTime() + data); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| @Override | |||
| public void onFan(int status) { | |||
| String data = ""; | |||
| switch (status) { | |||
| case 0: | |||
| data = "关闭风扇"; | |||
| break; | |||
| case 1: | |||
| data = "1 档风扇"; | |||
| break; | |||
| case 2: | |||
| data = "2 档风扇"; | |||
| break; | |||
| } | |||
| mList.add(TimeUtils.getTime() + data); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| @Override | |||
| public void onIAQData(int status, int eCo2, int TvOc, int hcho) { | |||
| String data = ""; | |||
| switch (status) { | |||
| case 0: | |||
| data = "OK"; | |||
| break; | |||
| case 1: | |||
| data = "Heating"; | |||
| break; | |||
| case 2: | |||
| data = "Error"; | |||
| break; | |||
| } | |||
| mList.add(TimeUtils.getTime() + data + "\n ECO2:" + eCo2 + "\n TVOC:" + TvOc + "\n HCHO:" + hcho); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| @Override | |||
| public void onBmVersion(String version) { | |||
| mList.add(TimeUtils.getTime() + "版本号:" + version); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| @Override | |||
| protected void onDestroy() { | |||
| super.onDestroy(); | |||
| BleLog.i(TAG, "onDestroy"); | |||
| } | |||
| } | |||
| @@ -59,13 +59,9 @@ public class SphyCmdActivity extends BleBaseActivity implements OnCallbackDis, O | |||
| private Handler mHandler = new Handler(Looper.getMainLooper()) { | |||
| @Override | |||
| public void handleMessage(Message msg) { | |||
| switch (msg.what) { | |||
| case REFRESH_DATA: | |||
| if (listAdapter != null) | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| if (msg.what == REFRESH_DATA) { | |||
| if (listAdapter != null) | |||
| listAdapter.notifyDataSetChanged(); | |||
| } | |||
| } | |||
| }; | |||
| @@ -148,34 +144,28 @@ public class SphyCmdActivity extends BleBaseActivity implements OnCallbackDis, O | |||
| @Override | |||
| public void onClick(View v) { | |||
| SendBleBean sendBleBean = new SendBleBean(); | |||
| switch (v.getId()) { | |||
| case R.id.btnVersion: | |||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||
| mBleDevice.sendData(sendBleBean); | |||
| break; | |||
| case R.id.btnBattery: | |||
| sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus()); | |||
| mBleDevice.sendData(sendBleBean); | |||
| break; | |||
| case R.id.btn_get_did: | |||
| sendBleBean.setHex(mBleSendCmdUtil.getDid()); | |||
| mBleDevice.sendData(sendBleBean); | |||
| break; | |||
| case R.id.btn_voice: | |||
| if (mVoiceStatus == 0) { | |||
| mVoiceStatus = 1; | |||
| }else { | |||
| mVoiceStatus=0; | |||
| } | |||
| mBleDevice.setSphyVoice(mVoiceStatus); | |||
| break; | |||
| int id = v.getId(); | |||
| if (id == R.id.btnVersion) { | |||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||
| mBleDevice.sendData(sendBleBean); | |||
| } else if (id == R.id.btnBattery) { | |||
| sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus()); | |||
| mBleDevice.sendData(sendBleBean); | |||
| } else if (id == R.id.btn_get_did) { | |||
| sendBleBean.setHex(mBleSendCmdUtil.getDid()); | |||
| mBleDevice.sendData(sendBleBean); | |||
| } else if (id == R.id.btn_voice) { | |||
| if (mVoiceStatus == 0) { | |||
| mVoiceStatus = 1; | |||
| } else { | |||
| mVoiceStatus = 0; | |||
| case R.id.clear: | |||
| if (mList != null) | |||
| mList.clear(); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| break; | |||
| } | |||
| mBleDevice.setSphyVoice(mVoiceStatus); | |||
| } else if (id == R.id.clear) { | |||
| if (mList != null) | |||
| mList.clear(); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| } | |||
| @@ -75,13 +75,9 @@ public class TempCmdActivity extends BleBaseActivity implements OnCallbackDis, O | |||
| private Handler mHandler = new Handler(Looper.getMainLooper()) { | |||
| @Override | |||
| public void handleMessage(Message msg) { | |||
| switch (msg.what) { | |||
| case REFRESH_DATA: | |||
| if (listAdapter != null) | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| if (msg.what == REFRESH_DATA) { | |||
| if (listAdapter != null) | |||
| listAdapter.notifyDataSetChanged(); | |||
| } | |||
| } | |||
| }; | |||
| @@ -153,68 +149,50 @@ public class TempCmdActivity extends BleBaseActivity implements OnCallbackDis, O | |||
| @Override | |||
| public void onClick(View v) { | |||
| SendBleBean sendBleBean = new SendBleBean(); | |||
| switch (v.getId()) { | |||
| case R.id.btnVersion: | |||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||
| mBleDevice.sendData(sendBleBean); | |||
| break; | |||
| case R.id.btnBattery: | |||
| sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus()); | |||
| mBleDevice.sendData(sendBleBean); | |||
| break; | |||
| case R.id.btn_get_did: | |||
| sendBleBean.setHex(mBleSendCmdUtil.getDid()); | |||
| mBleDevice.sendData(sendBleBean); | |||
| break; | |||
| case R.id.btn1: | |||
| String cmd = et_type.getText().toString().trim(); | |||
| SendMcuBean sendDataBean = new SendMcuBean(); | |||
| sendDataBean.setHex(type, cmd.getBytes()); | |||
| mBleDevice.sendData(sendDataBean); | |||
| break; | |||
| case R.id.clear: | |||
| if (mList != null) | |||
| mList.clear(); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| break; | |||
| case R.id.btn_get_history: | |||
| // 读取历史记录 | |||
| mBleDevice.getHistoryNew(0); | |||
| break; | |||
| case R.id.btn_get_mode: | |||
| // 获取设备测温模式 | |||
| mBleDevice.getMode(); | |||
| break; | |||
| case R.id.btn_get_temp: | |||
| // 获取高温报警值 | |||
| mBleDevice.getTemp(); | |||
| break; | |||
| case R.id.btn_set_mode: | |||
| // 设置设备测温模式 | |||
| if (rb_single.isChecked()) { | |||
| mBleDevice.setMode(0); | |||
| int id = v.getId(); | |||
| if (id == R.id.btnVersion) { | |||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||
| mBleDevice.sendData(sendBleBean); | |||
| } else if (id == R.id.btnBattery) { | |||
| sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus()); | |||
| mBleDevice.sendData(sendBleBean); | |||
| } else if (id == R.id.btn_get_did) { | |||
| sendBleBean.setHex(mBleSendCmdUtil.getDid()); | |||
| mBleDevice.sendData(sendBleBean); | |||
| } else if (id == R.id.btn1) { | |||
| String cmd = et_type.getText().toString().trim(); | |||
| SendMcuBean sendDataBean = new SendMcuBean(); | |||
| sendDataBean.setHex(type, cmd.getBytes()); | |||
| mBleDevice.sendData(sendDataBean); | |||
| } else if (id == R.id.clear) { | |||
| if (mList != null) | |||
| mList.clear(); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } else if (id == R.id.btn_get_history) {// 读取历史记录 | |||
| mBleDevice.getHistoryNew(0); | |||
| } else if (id == R.id.btn_get_mode) {// 获取设备测温模式 | |||
| mBleDevice.getMode(); | |||
| } else if (id == R.id.btn_get_temp) {// 获取高温报警值 | |||
| mBleDevice.getTemp(); | |||
| } else if (id == R.id.btn_set_mode) {// 设置设备测温模式 | |||
| if (rb_single.isChecked()) { | |||
| mBleDevice.setMode(0); | |||
| } else { | |||
| mBleDevice.setMode(1); | |||
| } | |||
| } else if (id == R.id.btn_set_temp) {// 设置高温报警值 | |||
| String tempStr = et_temp.getText().toString(); | |||
| if (!tempStr.isEmpty()) { | |||
| if (rb_c.isChecked()) { | |||
| mBleDevice.setTemp(tempStr, 0); | |||
| } else { | |||
| mBleDevice.setMode(1); | |||
| } | |||
| break; | |||
| case R.id.btn_set_temp: | |||
| // 设置高温报警值 | |||
| String tempStr = et_temp.getText().toString(); | |||
| if (!tempStr.isEmpty()) { | |||
| if (rb_c.isChecked()) { | |||
| mBleDevice.setTemp(tempStr, 0); | |||
| } else { | |||
| mBleDevice.setTemp(tempStr, 1); | |||
| } | |||
| mBleDevice.setTemp(tempStr, 1); | |||
| } | |||
| break; | |||
| case R.id.btn_del_history: | |||
| mBleDevice.getHistoryNew(3); | |||
| break; | |||
| case R.id.btnSetTime: | |||
| mBleDevice.setUnixStampNew(System.currentTimeMillis()); | |||
| break; | |||
| } | |||
| } else if (id == R.id.btn_del_history) { | |||
| mBleDevice.getHistoryNew(3); | |||
| } else if (id == R.id.btnSetTime) { | |||
| mBleDevice.setUnixStampNew(System.currentTimeMillis()); | |||
| } | |||
| } | |||
| @@ -36,7 +36,6 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
| import cn.net.aicare.modulelibrary.module.foreheadgun.TempGunDeviceData; | |||
| /** | |||
| * xing<br> | |||
| * 2019/4/25<br> | |||
| @@ -63,13 +62,9 @@ public class TempGunCmdActivity extends BleBaseActivity implements OnCallbackDis | |||
| private Handler mHandler = new Handler(Looper.getMainLooper()) { | |||
| @Override | |||
| public void handleMessage(Message msg) { | |||
| switch (msg.what) { | |||
| case REFRESH_DATA: | |||
| if (listAdapter != null) | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| if (msg.what == REFRESH_DATA) { | |||
| if (listAdapter != null) | |||
| listAdapter.notifyDataSetChanged(); | |||
| } | |||
| } | |||
| }; | |||
| @@ -125,30 +120,25 @@ public class TempGunCmdActivity extends BleBaseActivity implements OnCallbackDis | |||
| @Override | |||
| public void onClick(View v) { | |||
| SendBleBean sendBleBean = new SendBleBean(); | |||
| switch (v.getId()){ | |||
| case R.id.btnVersion: | |||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||
| mBleDevice.sendData(sendBleBean); | |||
| break; | |||
| case R.id.btnBattery: | |||
| sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus()); | |||
| mBleDevice.sendData(sendBleBean); | |||
| break; | |||
| case R.id.btn_get_did: | |||
| sendBleBean.setHex(mBleSendCmdUtil.getDid()); | |||
| mBleDevice.sendData(sendBleBean); | |||
| break; | |||
| case R.id.btn1: | |||
| String cmd = et_type.getText().toString().trim(); | |||
| SendMcuBean sendDataBean = new SendMcuBean(); | |||
| sendDataBean.setHex(type,cmd.getBytes()); | |||
| mBleDevice.sendData(sendDataBean); | |||
| break; | |||
| case R.id.clear: | |||
| if (mList != null) | |||
| mList.clear(); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| break; | |||
| int id = v.getId(); | |||
| if (id == R.id.btnVersion) { | |||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||
| mBleDevice.sendData(sendBleBean); | |||
| } else if (id == R.id.btnBattery) { | |||
| sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus()); | |||
| mBleDevice.sendData(sendBleBean); | |||
| } else if (id == R.id.btn_get_did) { | |||
| sendBleBean.setHex(mBleSendCmdUtil.getDid()); | |||
| mBleDevice.sendData(sendBleBean); | |||
| } else if (id == R.id.btn1) { | |||
| String cmd = et_type.getText().toString().trim(); | |||
| SendMcuBean sendDataBean = new SendMcuBean(); | |||
| sendDataBean.setHex(type, cmd.getBytes()); | |||
| mBleDevice.sendData(sendDataBean); | |||
| } else if (id == R.id.clear) { | |||
| if (mList != null) | |||
| mList.clear(); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| } | |||
| @@ -178,91 +178,94 @@ public class TempHumidityActivity extends BleBaseActivity implements OnCallbackB | |||
| public void onClick(View v) { | |||
| if (TempHumidityBleUtils.getInstance() != null) { | |||
| switch (v.getId()) { | |||
| case R.id.btn_slow: | |||
| if (TempHumidityBleUtils.getInstance() != null) { | |||
| TempHumidityBleUtils.getInstance().sendSlowData(); | |||
| logList.add(0, "慢速保存数据"); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } | |||
| break; | |||
| case R.id.btn_fat: | |||
| if (TempHumidityBleUtils.getInstance() != null) { | |||
| TempHumidityBleUtils.getInstance().sendFatData(); | |||
| logList.add(0, "快速速保存数据"); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } | |||
| break; | |||
| case R.id.btn_history: | |||
| if (TempHumidityBleUtils.getInstance() != null) { | |||
| String s = et_history.getText().toString().trim(); | |||
| long maxId = 0; | |||
| if (!s.isEmpty()) { | |||
| maxId = Long.parseLong(s); | |||
| } | |||
| TempHumidityBleUtils.getInstance().getOffLineRecord(maxId); | |||
| logList.add(0, "获取历史记录 时间Id" + maxId); | |||
| tv_result.setText(""); | |||
| historyLogListId.clear(); | |||
| historyLogList.clear(); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } | |||
| break; | |||
| case R.id.btn_show_history: | |||
| if (listView.getVisibility() == View.VISIBLE) { | |||
| historyListAdapter.notifyDataSetChanged(); | |||
| listView.setVisibility(View.GONE); | |||
| list_view_history.setVisibility(View.VISIBLE); | |||
| } else { | |||
| listView.setVisibility(View.VISIBLE); | |||
| list_view_history.setVisibility(View.GONE); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } | |||
| case R.id.btn_hear: | |||
| if (!isHeart) { | |||
| isHeart = true; | |||
| mMHandler.sendEmptyMessage(HEART); | |||
| logList.add(0, "开启心跳"); | |||
| } else { | |||
| isHeart = false; | |||
| mMHandler.removeMessages(HEART); | |||
| logList.add(0, "关闭心跳"); | |||
| } | |||
| int id = v.getId(); | |||
| if (id == R.id.btn_slow) { | |||
| if (TempHumidityBleUtils.getInstance() != null) { | |||
| TempHumidityBleUtils.getInstance().sendSlowData(); | |||
| logList.add(0, "慢速保存数据"); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } | |||
| } else if (id == R.id.btn_fat) { | |||
| if (TempHumidityBleUtils.getInstance() != null) { | |||
| TempHumidityBleUtils.getInstance().sendFatData(); | |||
| logList.add(0, "快速速保存数据"); | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_clear: | |||
| logList.clear(); | |||
| } | |||
| } else if (id == R.id.btn_history) { | |||
| if (TempHumidityBleUtils.getInstance() != null) { | |||
| String s = et_history.getText().toString().trim(); | |||
| long maxId = 0; | |||
| if (!s.isEmpty()) { | |||
| maxId = Long.parseLong(s); | |||
| } | |||
| TempHumidityBleUtils.getInstance().getOffLineRecord(maxId); | |||
| logList.add(0, "获取历史记录 时间Id" + maxId); | |||
| tv_result.setText(""); | |||
| historyLogListId.clear(); | |||
| historyLogList.clear(); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } | |||
| } else if (id == R.id.btn_show_history) { | |||
| if (listView.getVisibility() == View.VISIBLE) { | |||
| historyListAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_interval_one: | |||
| logList.add(0, "上报间隔1分钟"); | |||
| TempHumidityBleUtils.getInstance().setReportTime(60); | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_interval_three: | |||
| logList.add(0, "上报间隔3分钟"); | |||
| TempHumidityBleUtils.getInstance().setReportTime(180); | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_interval_five: | |||
| logList.add(0, "上报间隔5分钟"); | |||
| TempHumidityBleUtils.getInstance().setReportTime(300); | |||
| listView.setVisibility(View.GONE); | |||
| list_view_history.setVisibility(View.VISIBLE); | |||
| } else { | |||
| listView.setVisibility(View.VISIBLE); | |||
| list_view_history.setVisibility(View.GONE); | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_ota: | |||
| logList.add(0, "请求ota"); | |||
| TempHumidityBleUtils.getInstance().ota(); | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| } | |||
| if (!isHeart) { | |||
| isHeart = true; | |||
| mMHandler.sendEmptyMessage(HEART); | |||
| logList.add(0, "开启心跳"); | |||
| } else { | |||
| isHeart = false; | |||
| mMHandler.removeMessages(HEART); | |||
| logList.add(0, "关闭心跳"); | |||
| } | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_hear) { | |||
| if (!isHeart) { | |||
| isHeart = true; | |||
| mMHandler.sendEmptyMessage(HEART); | |||
| logList.add(0, "开启心跳"); | |||
| } else { | |||
| isHeart = false; | |||
| mMHandler.removeMessages(HEART); | |||
| logList.add(0, "关闭心跳"); | |||
| } | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_clear) { | |||
| logList.clear(); | |||
| historyLogListId.clear(); | |||
| historyLogList.clear(); | |||
| listAdapter.notifyDataSetChanged(); | |||
| historyListAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_interval_one) { | |||
| logList.add(0, "上报间隔1分钟"); | |||
| TempHumidityBleUtils.getInstance().setReportTime(60); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_interval_three) { | |||
| logList.add(0, "上报间隔3分钟"); | |||
| TempHumidityBleUtils.getInstance().setReportTime(180); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_interval_five) { | |||
| logList.add(0, "上报间隔5分钟"); | |||
| TempHumidityBleUtils.getInstance().setReportTime(300); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_ota) { | |||
| logList.add(0, "请求ota"); | |||
| TempHumidityBleUtils.getInstance().ota(); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } | |||
| } | |||
| } | |||
| @@ -302,15 +305,11 @@ public class TempHumidityActivity extends BleBaseActivity implements OnCallbackB | |||
| @Override | |||
| public void handleMessage(@NonNull Message msg) { | |||
| super.handleMessage(msg); | |||
| switch (msg.what) { | |||
| case HEART: | |||
| if (TempHumidityBleUtils.getInstance() != null) { | |||
| TempHumidityBleUtils.getInstance().getDeviceStatus(); | |||
| mMHandler.sendEmptyMessageDelayed(HEART, 5000); | |||
| } | |||
| break; | |||
| if (msg.what == HEART) { | |||
| if (TempHumidityBleUtils.getInstance() != null) { | |||
| TempHumidityBleUtils.getInstance().getDeviceStatus(); | |||
| mMHandler.sendEmptyMessageDelayed(HEART, 5000); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -1,5 +1,6 @@ | |||
| package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||
| import android.bluetooth.BluetoothGatt; | |||
| import android.content.Context; | |||
| import android.os.Bundle; | |||
| import android.os.Handler; | |||
| @@ -100,7 +101,7 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O | |||
| addLog("发送数据量:" + mNum); | |||
| } | |||
| SendDataBean sendDataBean = new SendDataBean(sendData, sendUuid, BleConfig.WRITE_DATA, sendUuidServer); | |||
| mBleDevice.sendDataNow(sendDataBean); | |||
| mBleDevice.sendData(sendDataBean); | |||
| if (intervalTime > 0) { | |||
| mHandler.sendEmptyMessageDelayed(SEND_DATA, intervalTime); | |||
| } | |||
| @@ -140,6 +141,7 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O | |||
| findViewById(R.id.btn_uuid_server).setOnClickListener(this); | |||
| findViewById(R.id.btn_log).setOnClickListener(this); | |||
| findViewById(R.id.btnIncrementSend).setOnClickListener(this); | |||
| findViewById(R.id.btnSendNow).setOnClickListener(this); | |||
| etIncrementNumber = findViewById(R.id.etIncrementNumber); | |||
| et_cmd = findViewById(R.id.et_cmd); | |||
| @@ -154,69 +156,61 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O | |||
| @Override | |||
| public void onClick(View v) { | |||
| switch (v.getId()) { | |||
| case R.id.btn1: | |||
| try { | |||
| mNumMax = Integer.parseInt(etIncrementNumber.getText().toString().trim()); | |||
| } catch (NumberFormatException e) { | |||
| e.printStackTrace(); | |||
| mNumMax = 514; | |||
| } | |||
| sendCmd = et_cmd.getText().toString().trim(); | |||
| sendCmdB = BleDensityUtil.getInstance().toBytes(sendCmd); | |||
| mHandler.removeMessages(SEND_DATA); | |||
| mHandler.sendEmptyMessage(SEND_DATA); | |||
| break; | |||
| case R.id.btn_stop: | |||
| mHandler.removeMessages(SEND_DATA); | |||
| break; | |||
| case R.id.clear: | |||
| if (mList != null) | |||
| mList.clear(); | |||
| mSendNumber = 0; | |||
| mReceiveNumber = 0; | |||
| tv_receive_number.setText("0"); | |||
| tv_send_number.setText("0"); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| break; | |||
| case R.id.btn_uuid: | |||
| String uuid = et_uuid.getText().toString().trim().toUpperCase(Locale.ENGLISH); | |||
| sendUuid = UuidUtils.getUuid(uuid); | |||
| addLog("设置特征UUID"); | |||
| break; | |||
| case R.id.btn_uuid_server: | |||
| String uuidServer = et_uuid_server.getText().toString().trim().toUpperCase(Locale.ENGLISH); | |||
| sendUuidServer = UuidUtils.getUuid(uuidServer); | |||
| addLog("设置服务UUID"); | |||
| break; | |||
| case R.id.btn_time: | |||
| String time = et_time.getText().toString().trim().toUpperCase(Locale.ENGLISH); | |||
| sendTime = Integer.parseInt(time); | |||
| addLog("设置时间间隔(ms):" + sendTime); | |||
| break; | |||
| case R.id.btn_notify: | |||
| String notify = et_notify.getText().toString().trim().toUpperCase(Locale.ENGLISH); | |||
| readNotify(notify, mNotify); | |||
| addLog("设置Notify UUID"); | |||
| break; | |||
| case R.id.btn_notify_status: | |||
| mNotify = !mNotify; | |||
| ((Button) v).setText("" + mNotify); | |||
| break; | |||
| case R.id.btn_log: | |||
| mShowLog = !mShowLog; | |||
| ((Button) v).setText("log:" + (mShowLog ? "Y" : "N")); | |||
| break; | |||
| case R.id.btnIncrementSend: | |||
| mIncrementSend = !mIncrementSend; | |||
| int id = v.getId(); | |||
| if (id == R.id.btn1) { | |||
| try { | |||
| mNumMax = Integer.parseInt(etIncrementNumber.getText().toString().trim()); | |||
| } catch (NumberFormatException e) { | |||
| e.printStackTrace(); | |||
| mNumMax = 514; | |||
| } | |||
| sendCmd = et_cmd.getText().toString().trim(); | |||
| sendCmdB = BleDensityUtil.getInstance().toBytes(sendCmd); | |||
| mHandler.removeMessages(SEND_DATA); | |||
| mHandler.sendEmptyMessage(SEND_DATA); | |||
| } else if (id == R.id.btn_stop) { | |||
| mHandler.removeMessages(SEND_DATA); | |||
| } else if (id == R.id.clear) { | |||
| if (mList != null) | |||
| mList.clear(); | |||
| mSendNumber = 0; | |||
| mReceiveNumber = 0; | |||
| tv_receive_number.setText("0"); | |||
| tv_send_number.setText("0"); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } else if (id == R.id.btn_uuid) { | |||
| String uuid = et_uuid.getText().toString().trim().toUpperCase(Locale.ENGLISH); | |||
| sendUuid = UuidUtils.getUuid(uuid); | |||
| addLog("设置特征UUID"); | |||
| } else if (id == R.id.btn_uuid_server) { | |||
| String uuidServer = et_uuid_server.getText().toString().trim().toUpperCase(Locale.ENGLISH); | |||
| sendUuidServer = UuidUtils.getUuid(uuidServer); | |||
| addLog("设置服务UUID"); | |||
| } else if (id == R.id.btn_time) { | |||
| String time = et_time.getText().toString().trim().toUpperCase(Locale.ENGLISH); | |||
| sendTime = Integer.parseInt(time); | |||
| addLog("设置时间间隔(ms):" + sendTime); | |||
| if (mBleDevice != null) { | |||
| mBleDevice.setSendDataInterval(sendTime); | |||
| } | |||
| } else if (id == R.id.btn_notify) { | |||
| String notify = et_notify.getText().toString().trim().toUpperCase(Locale.ENGLISH); | |||
| readNotify(notify, mNotify); | |||
| addLog("设置Notify UUID"); | |||
| } else if (id == R.id.btn_notify_status) { | |||
| mNotify = !mNotify; | |||
| ((Button) v).setText("" + mNotify); | |||
| } else if (id == R.id.btn_log) { | |||
| mShowLog = !mShowLog; | |||
| ((Button) v).setText("log:" + (mShowLog ? "Y" : "N")); | |||
| } else if (id == R.id.btnIncrementSend) { | |||
| mIncrementSend = !mIncrementSend; | |||
| // mBleDevice.setMtu(mNumMax); | |||
| ((Button) v).setText("递增发送:" + (mIncrementSend ? "Y" : "N")); | |||
| break; | |||
| ((Button) v).setText("递增发送:" + (mIncrementSend ? "Y" : "N")); | |||
| } else if (id == R.id.btnSendNow) { | |||
| byte[] bytes = BleDensityUtil.getInstance().toBytes(et_cmd.getText().toString().trim()); | |||
| SendDataBean sendDataBean = new SendDataBean(bytes, sendUuid, BleConfig.WRITE_DATA, sendUuidServer); | |||
| mBleDevice.sendDataNow(sendDataBean); | |||
| } | |||
| } | |||
| @@ -258,6 +252,7 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O | |||
| mBleDevice = mAILinkBleManager.getBleDevice(mAddress); | |||
| CallbackDisIm.getInstance().addListListener(this); | |||
| if (mBleDevice != null) { | |||
| mBleDevice.setConnectPriority(BluetoothGatt.CONNECTION_PRIORITY_HIGH); | |||
| mBleDevice.setOnBleOtherDataListener(this); | |||
| mBleDevice.setOnBleDeviceDataListener(this); | |||
| mBleDevice.setOnBleMtuListener(new OnBleMtuListener() { | |||
| @@ -1,715 +0,0 @@ | |||
| package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||
| import android.Manifest; | |||
| import android.app.AlertDialog; | |||
| import android.content.Context; | |||
| import android.content.DialogInterface; | |||
| import android.content.Intent; | |||
| import android.content.pm.PackageManager; | |||
| import android.net.Uri; | |||
| import android.os.Build; | |||
| import android.os.Bundle; | |||
| import android.os.Environment; | |||
| import android.os.Handler; | |||
| import android.os.Looper; | |||
| import android.os.Message; | |||
| import android.provider.Settings; | |||
| import android.text.TextUtils; | |||
| import android.view.View; | |||
| import android.widget.AdapterView; | |||
| import android.widget.ArrayAdapter; | |||
| import android.widget.Button; | |||
| import android.widget.ListView; | |||
| import android.widget.TextView; | |||
| import android.widget.Toast; | |||
| import androidx.activity.result.ActivityResultLauncher; | |||
| import androidx.annotation.NonNull; | |||
| import androidx.annotation.Nullable; | |||
| import androidx.core.app.ActivityCompat; | |||
| import com.elinkthings.bleotalibrary.bk.BKOtaManager; | |||
| import com.elinkthings.bleotalibrary.dialog.DialogOtaManager; | |||
| import com.elinkthings.bleotalibrary.jl.FileBean; | |||
| import com.elinkthings.bleotalibrary.jl.JLManager; | |||
| import com.elinkthings.bleotalibrary.listener.OnBleFlashListener; | |||
| import com.elinkthings.bleotalibrary.listener.OnBleOTAListener; | |||
| import com.elinkthings.bleotalibrary.netstrap.OPLOtaManager; | |||
| import com.pingwang.bluetoothlib.config.BleConfig; | |||
| import com.pingwang.bluetoothlib.device.BleDevice; | |||
| import com.pingwang.bluetoothlib.listener.OnBleDeviceDataListener; | |||
| import com.pingwang.bluetoothlib.listener.OnCallbackBle; | |||
| import com.pingwang.bluetoothlib.utils.BleLog; | |||
| import java.io.File; | |||
| import java.util.ArrayList; | |||
| import java.util.List; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.DialogStringImageBean; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.ShowListDialogFragment; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.FileUtils; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.ResultContact; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.SP; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
| /** | |||
| * xing<br> | |||
| * 2019/4/25<br> | |||
| * OTA测试界面 | |||
| */ | |||
| public class TestOtaActivity extends BleBaseActivity implements OnCallbackBle, OnBleDeviceDataListener, View.OnClickListener, OnBleOTAListener, OnBleFlashListener, | |||
| ShowListDialogFragment.onDialogListener { | |||
| private static String TAG = TestOtaActivity.class.getName(); | |||
| private final int REFRESH_DATA = 3; | |||
| private final int SEND_DATA = 4; | |||
| private TextView mTvVersion; | |||
| private TextView tvPath; | |||
| private Button btn_shake_hands; | |||
| private List<String> mList; | |||
| private ArrayAdapter listAdapter; | |||
| private Context mContext; | |||
| private BleDevice mBleDevice; | |||
| private String mAddress; | |||
| private ArrayList<DialogStringImageBean> mDialogList; | |||
| private String mOTAFileName; | |||
| private DialogOtaManager mDialogOtaManager; | |||
| private BKOtaManager mBKOtaManager; | |||
| private OPLOtaManager mOPLOtaManager; | |||
| private JLManager mJLManager; | |||
| private String mPath=""; | |||
| private ActivityResultLauncher<Boolean> launcher; | |||
| private Handler mHandler = new Handler(Looper.getMainLooper()) { | |||
| @Override | |||
| public void handleMessage(Message msg) { | |||
| switch (msg.what) { | |||
| case REFRESH_DATA: | |||
| if (listAdapter != null) | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case SEND_DATA: | |||
| break; | |||
| } | |||
| } | |||
| }; | |||
| @Override | |||
| protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
| super.onCreate(savedInstanceState); | |||
| setContentView(R.layout.activity_test_ota); | |||
| mContext = this; | |||
| mAddress = getIntent().getStringExtra("mac"); | |||
| initPermissions(); | |||
| init(); | |||
| FileUtils.init(); | |||
| initLauncher(); | |||
| } | |||
| private void initLauncher() { | |||
| launcher = registerForActivityResult(new ResultContact(), result -> { | |||
| if (!TextUtils.isEmpty(mOTAFileName)) { | |||
| mOTAFileName = result; | |||
| L.d("fileName : " + mOTAFileName); | |||
| SP.getInstance().putOtaFileName(mOTAFileName); | |||
| mTvVersion.setText(mOTAFileName); | |||
| } | |||
| }); | |||
| } | |||
| private void init() { | |||
| mList = new ArrayList<>(); | |||
| ListView listView = findViewById(R.id.listview); | |||
| listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | |||
| listView.setAdapter(listAdapter); | |||
| mTvVersion = findViewById(R.id.tv_version); | |||
| tvPath = findViewById(R.id.tv_path); | |||
| btn_shake_hands = findViewById(R.id.btn_shake_hands); | |||
| btn_shake_hands.setTag(false); | |||
| findViewById(R.id.btn_ota_connect).setOnClickListener(this); | |||
| findViewById(R.id.btn_ota_dis).setOnClickListener(this); | |||
| findViewById(R.id.btn_ota_file).setOnClickListener(this); | |||
| findViewById(R.id.btn_ota_start_585).setOnClickListener(this); | |||
| findViewById(R.id.btn_ota_start_531).setOnClickListener(this); | |||
| findViewById(R.id.btn_ota_start_580).setOnClickListener(this); | |||
| findViewById(R.id.btn_ota_bk).setOnClickListener(this); | |||
| findViewById(R.id.btn_start_ota).setOnClickListener(this); | |||
| findViewById(R.id.btn_ota_opl).setOnClickListener(this); | |||
| findViewById(R.id.btn_ota_jl).setOnClickListener(this); | |||
| findViewById(R.id.btn_watch_jl).setOnClickListener(this); | |||
| findViewById(R.id.btn_file_list).setOnClickListener(this); | |||
| findViewById(R.id.btn_file_watch_name).setOnClickListener(this); | |||
| findViewById(R.id.btn_file_watch_delete).setOnClickListener(this); | |||
| btn_shake_hands.setOnClickListener(this); | |||
| tvPath.setText("文件路径:手机" + File.separator + Environment.DIRECTORY_DOCUMENTS + File.separator + FileUtils.FILE_DIR + "\n"); | |||
| mOTAFileName = SP.getInstance().getOtaFileName(); | |||
| if (mOTAFileName.isEmpty()) | |||
| mTvVersion.setText("xxxxxxxx"); | |||
| else | |||
| mTvVersion.setText(mOTAFileName); | |||
| mDialogList = new ArrayList<>(); | |||
| listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { | |||
| @Override | |||
| public void onItemClick(AdapterView<?> parent, View view, int position, long id) { | |||
| String s = mList.get(position); | |||
| if (s.contains("path")){ | |||
| mPath=s.substring(s.indexOf("/"),s.lastIndexOf('}')-1); | |||
| L.i("选择的path:"+mPath); | |||
| } | |||
| } | |||
| }); | |||
| } | |||
| @Override | |||
| public void onItemListener(int position) { | |||
| if (mDialogList.size() > position) { | |||
| DialogStringImageBean dialogStringImageBean = mDialogList.get(position); | |||
| String name = dialogStringImageBean.getName(); | |||
| mOTAFileName = name; | |||
| SP.getInstance().putOtaFileName(name); | |||
| mTvVersion.setText(mOTAFileName); | |||
| } | |||
| } | |||
| @Override | |||
| public void onClick(View v) { | |||
| switch (v.getId()) { | |||
| case R.id.btn_ota_connect: | |||
| if (mBleDevice == null && !TextUtils.isEmpty(mAddress)) { | |||
| BleConfig.setHandshakeStatus(mAddress, ((Boolean) btn_shake_hands.getTag())); | |||
| connectBle(mAddress); | |||
| } | |||
| break; | |||
| case R.id.btn_ota_dis: | |||
| if (mBleDevice != null) { | |||
| mBleDevice.disconnect(); | |||
| mBleDevice = null; | |||
| } | |||
| break; | |||
| case R.id.btn_ota_file: | |||
| if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { | |||
| launcher.launch(true); | |||
| } else { | |||
| mDialogList.clear(); | |||
| ArrayList<String> list = FileUtils.list(); | |||
| for (String s : list) { | |||
| mDialogList.add(new DialogStringImageBean(s, 0)); | |||
| } | |||
| ShowListDialogFragment.newInstance().setTitle("").setCancel("", 0).setCancelBlank(true).setBackground(true).setBottom(false).setList(mDialogList).setOnDialogListener(this) | |||
| .show(getSupportFragmentManager()); | |||
| } | |||
| break; | |||
| case R.id.btn_ota_start_585: | |||
| startOta(DialogOtaManager.IC_TYPE_585); | |||
| break; | |||
| case R.id.btn_ota_start_531: | |||
| startOta(DialogOtaManager.IC_TYPE_531); | |||
| break; | |||
| case R.id.btn_ota_start_580: | |||
| startOta(DialogOtaManager.IC_TYPE_580); | |||
| break; | |||
| case R.id.btn_ota_bk: | |||
| startOtaBK(); | |||
| break; | |||
| case R.id.btn_ota_opl: | |||
| startOtaOPL(); | |||
| break; | |||
| case R.id.btn_ota_jl: | |||
| startOtaJL(); | |||
| break; | |||
| case R.id.btn_watch_jl: | |||
| startWatchJL(); | |||
| break; | |||
| case R.id.btn_file_list: | |||
| if (mJLManager != null) { | |||
| mJLManager.getWatchList(new JLManager.OnWatchFileListener<ArrayList<FileBean>>() { | |||
| @Override | |||
| public void onSuccess(ArrayList<FileBean> list) { | |||
| for (FileBean fileBean : list) { | |||
| mList.add(TimeUtils.getTime() + "文件信息:" + fileBean.toString()); | |||
| } | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| @Override | |||
| public void onFailed(int code, String message) { | |||
| mList.add(TimeUtils.getTime() + "读取文件列表失败:" + message); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| }); | |||
| }else { | |||
| mList.add(TimeUtils.getTime() + "请先初始化加载WATCH" ); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| break; | |||
| case R.id.btn_file_watch_name: | |||
| if (mJLManager != null) { | |||
| if (TextUtils.isEmpty(mPath)) { | |||
| mList.add(TimeUtils.getTime() + "请先选择表盘:" + mPath); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| return; | |||
| } | |||
| mJLManager.setCurrentWatch(mPath, new JLManager.OnWatchFileListener<FileBean>() { | |||
| @Override | |||
| public void onSuccess(FileBean fileBean) { | |||
| mList.add(TimeUtils.getTime() + "当前表盘:" + (fileBean==null?"":fileBean.toString())); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| @Override | |||
| public void onFailed(int code, String message) { | |||
| mList.add(TimeUtils.getTime() + "读取文件列表失败:" + message); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| }); | |||
| }else { | |||
| mList.add(TimeUtils.getTime() + "请先初始化加载WATCH" ); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| break; | |||
| case R.id.btn_file_watch_delete: | |||
| if (mJLManager != null) { | |||
| if (TextUtils.isEmpty(mPath)) { | |||
| mList.add(TimeUtils.getTime() + "请先选择表盘:" + mPath); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| return; | |||
| } | |||
| mJLManager.deleteWatchFile(mPath, new JLManager.OnWatchFileListener<Boolean>() { | |||
| @Override | |||
| public void onSuccess(Boolean list) { | |||
| mList.add(TimeUtils.getTime() + "删除表盘成功:" + mPath); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| @Override | |||
| public void onFailed(int code, String message) { | |||
| mList.add(TimeUtils.getTime() + "删除表盘失败:" + mPath); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| }); | |||
| }else { | |||
| mList.add(TimeUtils.getTime() + "请先初始化加载WATCH" ); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| break; | |||
| case R.id.btn_start_ota: | |||
| startOta(); | |||
| break; | |||
| case R.id.btn_shake_hands: | |||
| boolean status = (boolean) btn_shake_hands.getTag(); | |||
| btn_shake_hands.setTag(!status); | |||
| btn_shake_hands.setText("握手:" + !status); | |||
| break; | |||
| default: | |||
| break; | |||
| } | |||
| } | |||
| private void startOta(int icType) { | |||
| if (mOTAFileName.isEmpty()) { | |||
| Toast.makeText(mContext, "请先选择文件", Toast.LENGTH_SHORT).show(); | |||
| return; | |||
| } | |||
| String byFileName = FileUtils.getByFileName() + mOTAFileName; | |||
| mDialogOtaManager = DialogOtaManager.newBuilder().setOnBleOTAListener(this).setFilePath(byFileName).setIcType(icType).build(mBleDevice); | |||
| if (mDialogOtaManager != null) { | |||
| mList.add(TimeUtils.getTime() + "加载OTA包成功,点击开始OTA即可开始"); | |||
| } else { | |||
| mList.add(TimeUtils.getTime() + "连接断开"); | |||
| } | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| // mBleDevice.setOnDialogOTAListener(this); | |||
| // mBleDevice.startDialogOta(byFileName, icType,((Boolean) btn_shake_hands.getTag())); | |||
| } | |||
| private String mOTAVersionAll = ""; | |||
| private void startOtaBK() { | |||
| if (mOTAFileName.isEmpty()) { | |||
| Toast.makeText(mContext, "请先选择文件", Toast.LENGTH_SHORT).show(); | |||
| return; | |||
| } | |||
| String byFileName = FileUtils.getByFileName() + mOTAFileName; | |||
| mBKOtaManager = BKOtaManager.newBuilder().setOnBleOTAListener(this).setFilePath(byFileName).build(mBleDevice); | |||
| mOTAVersionAll = ""; | |||
| mDeviceVersionAll = ""; | |||
| if (mBKOtaManager != null) { | |||
| long deviceVersion = mBKOtaManager.getDeviceVersion(); | |||
| long romVersion = mBKOtaManager.getRomVersion(); | |||
| mOTAVersionAll = deviceVersion + "_" + romVersion; | |||
| mList.add(TimeUtils.getTime() + "加载OTA包成功,点击开始OTA即可开始"); | |||
| mList.add(TimeUtils.getTime() + "OTA包版本:" + mOTAVersionAll); | |||
| } else { | |||
| mList.add(TimeUtils.getTime() + "连接断开"); | |||
| } | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| private void startOtaOPL() { | |||
| if (mOTAFileName.isEmpty()) { | |||
| Toast.makeText(mContext, "请先选择文件", Toast.LENGTH_SHORT).show(); | |||
| return; | |||
| } | |||
| String byFileName = FileUtils.getByFileName() + mOTAFileName; | |||
| mOPLOtaManager = OPLOtaManager.newBuilder(mContext).setFilePath(byFileName).setOnBleOTAListener(this).build(mBleDevice); | |||
| mList.add(TimeUtils.getTime() + "加载OTA包成功,点击开始OTA即可开始"); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| private void startOtaJL() { | |||
| if (mOTAFileName.isEmpty()) { | |||
| Toast.makeText(mContext, "请先选择文件", Toast.LENGTH_SHORT).show(); | |||
| return; | |||
| } | |||
| String byFileName = FileUtils.getByFileName() + mOTAFileName; | |||
| mJLManager = JLManager.newBuilder(mContext).setType(JLManager.TYPE_OTA).setFilePath(byFileName).setOnBleOTAListener(this).build(mBleDevice); | |||
| mList.add(TimeUtils.getTime() + "加载OTA包成功,点击开始OTA即可开始"); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| private void startWatchJL() { | |||
| if (mOTAFileName.isEmpty()) { | |||
| Toast.makeText(mContext, "请先选择文件", Toast.LENGTH_SHORT).show(); | |||
| return; | |||
| } | |||
| String byFileName = FileUtils.getByFileName() + mOTAFileName; | |||
| mJLManager = JLManager.newBuilder(mContext).setType(JLManager.TYPE_WATCH).setFilePath(byFileName).setOnBleFlashListener(this).build(mBleDevice); | |||
| mList.add(TimeUtils.getTime() + "加载WATCH包成功,可以进行相关操作了"); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| private void startOta() { | |||
| if (mDialogOtaManager != null) { | |||
| mDialogOtaManager.startOta(); | |||
| } else if (mBKOtaManager != null) { | |||
| if (!TextUtils.isEmpty(mOTAVersionAll)) { | |||
| if (mOTAVersionAll.equals(mDeviceVersionAll)) { | |||
| mList.add(TimeUtils.getTime() + "OTA版本与设备版本相同"); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| return; | |||
| } | |||
| } | |||
| mBKOtaManager.startOta(); | |||
| mBKOtaManager = null; | |||
| } else if (mOPLOtaManager != null) { | |||
| mOPLOtaManager.startOta(); | |||
| } else if (mJLManager != null) { | |||
| if (mJLManager.getType() == JLManager.TYPE_OTA) { | |||
| mJLManager.startOta(); | |||
| mList.add(TimeUtils.getTime() + "开始OTA:"); | |||
| } else { | |||
| mJLManager.startFlash(); | |||
| mList.add(TimeUtils.getTime() + "开始表盘:"); | |||
| } | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| return; | |||
| } else { | |||
| mList.add(TimeUtils.getTime() + "请先选择OTA类型"); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| return; | |||
| } | |||
| mList.add(TimeUtils.getTime() + "OTA已开始,请耐心等待"); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| /** | |||
| * 初始化请求权限 | |||
| */ | |||
| private void initPermissions() { | |||
| if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { | |||
| ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); | |||
| } | |||
| } | |||
| @Override | |||
| public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { | |||
| super.onRequestPermissionsResult(requestCode, permissions, grantResults); | |||
| if (requestCode != 1) { | |||
| return; | |||
| } | |||
| if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { | |||
| } else { | |||
| if (ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[0])) { | |||
| //权限请求失败,但未选中“不再提示”选项 | |||
| new AlertDialog.Builder(this).setTitle("提示").setMessage("请求使用定位权限搜索蓝牙设备").setPositiveButton("确定", new DialogInterface.OnClickListener() { | |||
| @Override | |||
| public void onClick(DialogInterface dialog, int which) { | |||
| //引导用户至设置页手动授权 | |||
| Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); | |||
| Uri uri = Uri.fromParts("package", getApplicationContext().getPackageName(), null); | |||
| intent.setData(uri); | |||
| startActivity(intent); | |||
| } | |||
| }).setNegativeButton("取消", new DialogInterface.OnClickListener() { | |||
| @Override | |||
| public void onClick(DialogInterface dialog, int which) { | |||
| if (dialog != null) { | |||
| dialog.cancel(); | |||
| } | |||
| } | |||
| }).show(); | |||
| } else { | |||
| //权限请求失败,选中“不再提示”选项 | |||
| // T.showShort(MainActivity.this, "获取权限失败"); | |||
| new AlertDialog.Builder(this).setTitle("提示").setMessage("请求使用定位权限搜索蓝牙设备").setPositiveButton("确定", new DialogInterface.OnClickListener() { | |||
| @Override | |||
| public void onClick(DialogInterface dialog, int which) { | |||
| //引导用户至设置页手动授权 | |||
| Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); | |||
| Uri uri = Uri.fromParts("package", getApplicationContext().getPackageName(), null); | |||
| intent.setData(uri); | |||
| startActivity(intent); | |||
| } | |||
| }).setNegativeButton("取消", new DialogInterface.OnClickListener() { | |||
| @Override | |||
| public void onClick(DialogInterface dialog, int which) { | |||
| if (dialog != null) { | |||
| dialog.cancel(); | |||
| } | |||
| } | |||
| }).show(); | |||
| } | |||
| } | |||
| } | |||
| //---------------------------------服务--------------------------------------------------- | |||
| @Override | |||
| public void onServiceSuccess() { | |||
| BleLog.i(TAG, "服务与界面建立连接成功"); | |||
| //与服务建立连接 | |||
| if (mAILinkBleManager != null) { | |||
| mBleDevice = mAILinkBleManager.getBleDevice(mAddress); | |||
| mAILinkBleManager.setOnCallbackBle(this); | |||
| if (mDialogOtaManager != null) { | |||
| mDialogOtaManager.setOnBleOTAListener(this); | |||
| } | |||
| if (mJLManager != null) { | |||
| //在OTA状态 | |||
| mJLManager.setOnBleOTAListener(this); | |||
| mJLManager.onBtDeviceConnection(mBleDevice); | |||
| } | |||
| } | |||
| } | |||
| @Override | |||
| public void onServiceErr() { | |||
| BleLog.i(TAG, "服务与界面连接断开"); | |||
| //与服务断开连接 | |||
| mAILinkBleManager = null; | |||
| } | |||
| @Override | |||
| public void unbindServices() { | |||
| if (mBleDevice != null) { | |||
| if (mJLManager != null) | |||
| mJLManager.release(); | |||
| mBleDevice.disconnect(); | |||
| mBleDevice = null; | |||
| } | |||
| if (mAILinkBleManager !=null) { | |||
| mAILinkBleManager.removeOnCallbackBle(this); | |||
| } | |||
| } | |||
| //-----------------状态------------------- | |||
| @Override | |||
| public void onConnecting(@NonNull String mac) { | |||
| //TODO 连接中 | |||
| if (!mac.equalsIgnoreCase(mAddress)) { | |||
| return; | |||
| } | |||
| BleLog.i(TAG, "连接中"); | |||
| mList.add(TimeUtils.getTime() + "连接中"); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| @Override | |||
| public void onDisConnected(@NonNull String mac, int code) { | |||
| // 连接断开 | |||
| if (!mac.equalsIgnoreCase(mAddress)) { | |||
| return; | |||
| } | |||
| BleLog.i(TAG, "连接断开:" + code); | |||
| mBleDevice = null; | |||
| mList.add(TimeUtils.getTime() + "连接断开:" + code); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| @Override | |||
| public void onServicesDiscovered(@NonNull String mac) { | |||
| // 连接成功(获取服务成功) | |||
| if (!mac.equalsIgnoreCase(mAddress)) { | |||
| return; | |||
| } | |||
| BleLog.i(TAG, "连接成功(获取服务成功)"); | |||
| mList.add(TimeUtils.getTime() + "连接成功"); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| onServiceSuccess(); | |||
| } | |||
| @Override | |||
| public void bleOpen() { | |||
| } | |||
| @Override | |||
| public void bleClose() { | |||
| BleLog.i(TAG, "蓝牙未开启,可请求开启"); | |||
| } | |||
| //-----------------通知------------------- | |||
| @Override | |||
| protected void onDestroy() { | |||
| super.onDestroy(); | |||
| if (mHandler != null) { | |||
| mHandler.removeCallbacksAndMessages(null); | |||
| } | |||
| BleLog.i(TAG, "onDestroy"); | |||
| } | |||
| @Override | |||
| public void onOtaSuccess() { | |||
| mList.add(TimeUtils.getTime() + "OTA成功"); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| @Override | |||
| public void onOtaFailure(int cmd, String err) { | |||
| mList.add(TimeUtils.getTime() + "OTA失败:" + err); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| // if (mBleDevice != null) { | |||
| // mBleDevice.disconnect(); | |||
| // } | |||
| } | |||
| private int progressOld; | |||
| @Override | |||
| public void onOtaProgress(float progress, int currentCount, int maxCount) { | |||
| int progressInt = (int) progress; | |||
| if (progressInt == -1) { | |||
| mList.add(TimeUtils.getTime() + "OTA进度:正在校验升级文件"); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| return; | |||
| } | |||
| String showProgress = "OTA进度:" + progressInt + "%"; | |||
| if (maxCount > 1) { | |||
| showProgress = "OTA进度:" + progressInt + "%" + " 总共:" + maxCount + " 当前进行:" + currentCount; | |||
| } | |||
| if (progressOld != progressInt) { | |||
| progressOld = progressInt; | |||
| mList.add(TimeUtils.getTime() + showProgress); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| } | |||
| @Override | |||
| public void onReconnect(String mac) { | |||
| mList.add(TimeUtils.getTime() + "OTA回连:" + mac); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| mHandler.postDelayed(() -> { | |||
| BleConfig.setHandshakeStatus(mAddress, ((Boolean) btn_shake_hands.getTag())); | |||
| connectBle(mAddress); | |||
| }, 2000); | |||
| } | |||
| private String mDeviceVersionAll = ""; | |||
| // @Override | |||
| // public void onDeviceVersion(String deviceVersion, String romVersion) { | |||
| // mDeviceVersionAll = deviceVersion + "_" + romVersion; | |||
| // mList.add(TimeUtils.getTime() + "设备版本:" + mDeviceVersionAll); | |||
| // mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| // } | |||
| @Override | |||
| public void onFlashSuccess() { | |||
| mList.add(TimeUtils.getTime() + "表盘成功"); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| @Override | |||
| public void onFlashFailure(int cmd, String err) { | |||
| mList.add(TimeUtils.getTime() + "表盘失败:" + err); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| @Override | |||
| public void onFlashProgress(float progress, int currentCount, int maxCount) { | |||
| int progressInt = (int) progress; | |||
| if (progressInt == -1) { | |||
| mList.add(TimeUtils.getTime() + "表盘进度:正在校验升级文件"); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| return; | |||
| } | |||
| String showProgress = "表盘进度:" + progressInt + "%"; | |||
| if (maxCount > 1) { | |||
| showProgress = "表盘进度:" + progressInt + "%" + " 总共:" + maxCount + " 当前进行:" + currentCount; | |||
| } | |||
| if (progressOld != progressInt) { | |||
| progressOld = progressInt; | |||
| mList.add(TimeUtils.getTime() + showProgress); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| } | |||
| @Override | |||
| public void onFlashStatus(int status) { | |||
| } | |||
| } | |||
| @@ -35,7 +35,6 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
| import cn.net.aicare.modulelibrary.module.tpms.TpmsDeviceData; | |||
| /** | |||
| * xing<br> | |||
| * 2019/9/2<br> | |||
| @@ -62,13 +61,9 @@ public class TpmsConnectCmdActivity extends BleBaseActivity implements OnCallbac | |||
| private Handler mHandler = new Handler(Looper.getMainLooper()) { | |||
| @Override | |||
| public void handleMessage(Message msg) { | |||
| switch (msg.what) { | |||
| case REFRESH_DATA: | |||
| if (listAdapter != null) | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| if (msg.what == REFRESH_DATA) { | |||
| if (listAdapter != null) | |||
| listAdapter.notifyDataSetChanged(); | |||
| } | |||
| } | |||
| }; | |||
| @@ -124,30 +119,25 @@ public class TpmsConnectCmdActivity extends BleBaseActivity implements OnCallbac | |||
| @Override | |||
| public void onClick(View v) { | |||
| SendBleBean sendBleBean = new SendBleBean(); | |||
| switch (v.getId()) { | |||
| case R.id.btnVersion: | |||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||
| mBleDevice.sendData(sendBleBean); | |||
| break; | |||
| case R.id.btnBattery: | |||
| sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus()); | |||
| mBleDevice.sendData(sendBleBean); | |||
| break; | |||
| case R.id.btn_get_did: | |||
| sendBleBean.setHex(mBleSendCmdUtil.getDid()); | |||
| mBleDevice.sendData(sendBleBean); | |||
| break; | |||
| case R.id.btn1: | |||
| String cmd = et_type.getText().toString().trim(); | |||
| SendMcuBean sendDataBean = new SendMcuBean(); | |||
| sendDataBean.setHex(type,cmd.getBytes()); | |||
| mBleDevice.sendData(sendDataBean); | |||
| break; | |||
| case R.id.clear: | |||
| if (mList != null) | |||
| mList.clear(); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| break; | |||
| int id = v.getId(); | |||
| if (id == R.id.btnVersion) { | |||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||
| mBleDevice.sendData(sendBleBean); | |||
| } else if (id == R.id.btnBattery) { | |||
| sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus()); | |||
| mBleDevice.sendData(sendBleBean); | |||
| } else if (id == R.id.btn_get_did) { | |||
| sendBleBean.setHex(mBleSendCmdUtil.getDid()); | |||
| mBleDevice.sendData(sendBleBean); | |||
| } else if (id == R.id.btn1) { | |||
| String cmd = et_type.getText().toString().trim(); | |||
| SendMcuBean sendDataBean = new SendMcuBean(); | |||
| sendDataBean.setHex(type, cmd.getBytes()); | |||
| mBleDevice.sendData(sendDataBean); | |||
| } else if (id == R.id.clear) { | |||
| if (mList != null) | |||
| mList.clear(); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| } | |||
| @@ -14,11 +14,11 @@ import android.widget.TextView; | |||
| import androidx.annotation.Nullable; | |||
| import com.google.gson.Gson; | |||
| import com.pingwang.bluetoothlib.AILinkBleManager; | |||
| import com.pingwang.bluetoothlib.bean.SupportUnitBean; | |||
| import com.pingwang.bluetoothlib.device.BleDevice; | |||
| import com.pingwang.bluetoothlib.device.BleSendCmdUtil; | |||
| import com.pingwang.bluetoothlib.listener.OnCallbackBle; | |||
| import com.pingwang.bluetoothlib.utils.BleDataUtils; | |||
| import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||
| import java.lang.ref.WeakReference; | |||
| @@ -26,6 +26,7 @@ import java.util.ArrayList; | |||
| import java.util.List; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.SP; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
| import cn.net.aicare.modulelibrary.module.Transmission.TransmissionDeviceData; | |||
| @@ -34,9 +35,11 @@ import cn.net.aicare.modulelibrary.module.Transmission.TransmissionDeviceData; | |||
| */ | |||
| public class TransmissionActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, TransmissionDeviceData.MyBleCallback { | |||
| private final String TRANSMISSION_DATA_KEY = "TRANSMISSION_DATA_KEY"; | |||
| private TextView tv_device_info; | |||
| private EditText et, et_cid, et_a6, et_customize, et_name; | |||
| private Button send, send_a6, bt_clear, bt_clear_log, bt_cid, send_customize; | |||
| private EditText et, et_cid, et_a6, et_customize, etReceive, etSend; | |||
| private Button send, send_a6, bt_clear, bt_clear_log, btnSetAutoSend, send_customize; | |||
| private Button btDis, btConnect; | |||
| private ListView mListView; | |||
| private List<String> mlogList; | |||
| private final int ToRefreUi = 1; | |||
| @@ -45,6 +48,8 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic | |||
| private String mAddress; | |||
| private TransmissionDeviceData mTransmissionDeviceData; | |||
| private boolean isPause = false; | |||
| private Gson mGson = new Gson(); | |||
| private SaveDataBean mSaveDataBean; | |||
| @Override | |||
| public void onServiceSuccess() { | |||
| @@ -92,27 +97,42 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic | |||
| et = findViewById(R.id.et); | |||
| et_a6 = findViewById(R.id.et_a6); | |||
| et_cid = findViewById(R.id.et_cid); | |||
| bt_cid = findViewById(R.id.bt_cid); | |||
| btnSetAutoSend = findViewById(R.id.btnSetAutoSend); | |||
| send = findViewById(R.id.send); | |||
| send_a6 = findViewById(R.id.send_a6); | |||
| et_customize = findViewById(R.id.et_customize); | |||
| send_customize = findViewById(R.id.send_customize); | |||
| et_name = findViewById(R.id.et_name); | |||
| etReceive = findViewById(R.id.etReceive); | |||
| etSend = findViewById(R.id.etSend); | |||
| bt_clear = findViewById(R.id.bt_clear); | |||
| bt_clear_log = findViewById(R.id.bt_clear_log); | |||
| mListView = findViewById(R.id.listview); | |||
| btDis = findViewById(R.id.btDis); | |||
| btConnect = findViewById(R.id.btConnect); | |||
| send.setOnClickListener(this); | |||
| send_a6.setOnClickListener(this); | |||
| send_customize.setOnClickListener(this); | |||
| findViewById(R.id.send_name).setOnClickListener(this); | |||
| findViewById(R.id.btPause).setOnClickListener(this); | |||
| bt_clear.setOnClickListener(this); | |||
| bt_cid.setOnClickListener(this); | |||
| bt_clear_log.setOnClickListener(this); | |||
| btDis.setOnClickListener(this); | |||
| btConnect.setOnClickListener(this); | |||
| btnSetAutoSend.setOnClickListener(this); | |||
| mAddress = getIntent().getStringExtra("mac"); | |||
| mlogList = new ArrayList<>(); | |||
| listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mlogList); | |||
| mListView.setAdapter(listAdapter); | |||
| mGson = new Gson(); | |||
| String json = (String) SP.getInstance().get(TRANSMISSION_DATA_KEY, ""); | |||
| if (!TextUtils.isEmpty(json)) { | |||
| mSaveDataBean = mGson.fromJson(json, SaveDataBean.class); | |||
| et_cid.setText(mSaveDataBean.cid); | |||
| et.setText(mSaveDataBean.a7Data); | |||
| et_a6.setText(mSaveDataBean.a6Data); | |||
| et_customize.setText(mSaveDataBean.customizeData); | |||
| } | |||
| } | |||
| @Override | |||
| @@ -135,11 +155,6 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic | |||
| } else if (id == R.id.bt_clear_log) { | |||
| mlogList.clear(); | |||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||
| } else if (id == R.id.bt_cid) { | |||
| if (mTransmissionDeviceData != null) { | |||
| mTransmissionDeviceData.getCid(); | |||
| } | |||
| } else if (id == R.id.send_a6) { | |||
| String hex = et_a6.getText().toString().toUpperCase().trim(); | |||
| if (!TextUtils.isEmpty(hex)) { | |||
| @@ -156,17 +171,43 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic | |||
| mTransmissionDeviceData.setSendDataCustomize(hexStr); | |||
| } | |||
| } | |||
| } else if (id == R.id.send_name) { | |||
| String name = et_name.getText().toString().trim(); | |||
| if (!TextUtils.isEmpty(name)) { | |||
| byte[] names = BleDataUtils.getInstance().getBleName(name); | |||
| mTransmissionDeviceData.setSendDataA6(BleSendCmdUtil.getInstance().setBleName(names)); | |||
| } | |||
| }else if (id == R.id.btPause){ | |||
| } else if (id == R.id.btnSetAutoSend) { | |||
| mReceiveStr = etReceive.getText().toString().trim(); | |||
| mSendStr = etSend.getText().toString().trim(); | |||
| addLog("设置成功:发送的数据通过A7通道发送"); | |||
| } else if (id == R.id.btPause) { | |||
| isPause = !isPause; | |||
| } else if (id == R.id.btDis) { | |||
| AILinkBleManager.getInstance().disconnectAll(); | |||
| } else if (id == R.id.btConnect) { | |||
| AILinkBleManager.getInstance().connectDevice(mAddress); | |||
| } | |||
| } | |||
| private String mReceiveStr = ""; | |||
| private String mSendStr = ""; | |||
| /** | |||
| * 检查数据自动发送 | |||
| * | |||
| * @param data 数据 | |||
| */ | |||
| public void checkDataAutoSend(String data) { | |||
| data = data.replace(" ",""); | |||
| if (TextUtils.isEmpty(mReceiveStr) || TextUtils.isEmpty(mSendStr) || TextUtils.isEmpty(data)) { | |||
| return; | |||
| } | |||
| if (data.startsWith(mReceiveStr)) { | |||
| byte[] hexStr = BleStrUtils.stringToByte(mSendStr); | |||
| String cid = et_cid.getText().toString().toUpperCase().trim(); | |||
| int hexStrCid = Integer.parseInt(cid, 16); | |||
| if (mTransmissionDeviceData != null) { | |||
| mTransmissionDeviceData.setSendData(hexStrCid, hexStr); | |||
| } | |||
| } | |||
| } | |||
| @Override | |||
| public void onVersion(String version) { | |||
| @@ -174,7 +215,8 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic | |||
| @Override | |||
| public void showData(String data, int type) { | |||
| addLog( "收A7 payload数据" + TimeUtils.getTimeSSS() + "cid=" + type + "\n" + data); | |||
| addLog("收A7 payload数据" + TimeUtils.getTimeSSS() + "cid=" + type + "\n" + data); | |||
| checkDataAutoSend(data); | |||
| } | |||
| @Override | |||
| @@ -190,11 +232,13 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic | |||
| @Override | |||
| public void otherData(byte[] hex, String data) { | |||
| addLog("收 透传数据" + TimeUtils.getTime() + data); | |||
| checkDataAutoSend(data); | |||
| } | |||
| @Override | |||
| public void a6Data(byte[] hex, String data) { | |||
| addLog("收A6 payload数据" + TimeUtils.getTime() + data); | |||
| checkDataAutoSend(data); | |||
| } | |||
| @Override | |||
| @@ -202,6 +246,12 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic | |||
| addLog("发 " + TimeUtils.getTimeSSS() + data); | |||
| } | |||
| @Override | |||
| public void onServicesDiscovered(String mac) { | |||
| onServiceSuccess(); | |||
| mlogList.add(0, "连接成功: " + mac); | |||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||
| } | |||
| @Override | |||
| public void onDisConnected(String mac, int code) { | |||
| @@ -213,17 +263,10 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic | |||
| @Override | |||
| public void handleMessage(Message msg) { | |||
| super.handleMessage(msg); | |||
| switch (msg.what) { | |||
| case ToRefreUi: | |||
| if (listAdapter != null) { | |||
| listAdapter.notifyDataSetChanged(); | |||
| } | |||
| break; | |||
| default: | |||
| break; | |||
| if (msg.what == ToRefreUi) { | |||
| if (listAdapter != null) { | |||
| listAdapter.notifyDataSetChanged(); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -234,15 +277,32 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic | |||
| if (mAILinkBleManager != null) { | |||
| mAILinkBleManager.disconnectAll(); | |||
| } | |||
| if (mSaveDataBean == null) { | |||
| mSaveDataBean = new SaveDataBean(); | |||
| } | |||
| mSaveDataBean.cid = et_cid.getText().toString().trim(); | |||
| mSaveDataBean.a7Data = et.getText().toString().trim(); | |||
| mSaveDataBean.a6Data = et_a6.getText().toString().trim(); | |||
| mSaveDataBean.customizeData = et_customize.getText().toString().trim(); | |||
| String json = mGson.toJson(mSaveDataBean); | |||
| SP.getInstance().put(TRANSMISSION_DATA_KEY, json); | |||
| } | |||
| private void addLog(String log) { | |||
| if (isPause){ | |||
| if (isPause) { | |||
| return; | |||
| } | |||
| mlogList.add(0, log); | |||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||
| } | |||
| class SaveDataBean { | |||
| String cid = ""; | |||
| String a7Data = ""; | |||
| String a6Data = ""; | |||
| String customizeData = ""; | |||
| } | |||
| } | |||
| @@ -29,12 +29,13 @@ import java.util.List; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.AddUserDialog; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.bean.UserBean; | |||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.AppHistoryRecordBean; | |||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatBleUtilsData; | |||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatDataUtil; | |||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatRecord; | |||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatUserBean; | |||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.McuHistoryRecordBean; | |||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.User; | |||
| /** | |||
| * Ble体脂秤 | |||
| @@ -50,8 +51,8 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl | |||
| private MHandler mMHandler; | |||
| private EditText mEditText; | |||
| private RadioButton kg, jing, stlb, lb; | |||
| private List<User> mUsers; | |||
| private User selectUser; | |||
| private List<BodyFatUserBean> mBodyFatUserBeans; | |||
| private BodyFatUserBean mSelectBodyFatUserBean; | |||
| private int weighunit = BodyFatDataUtil.KG; | |||
| private ListView loglistView; | |||
| private ListView userlistView; | |||
| @@ -71,7 +72,7 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl | |||
| private void initView() { | |||
| findViewById(R.id.history).setOnClickListener(this); | |||
| findViewById(R.id.userlist).setOnClickListener(this); | |||
| findViewById(R.id.user).setOnClickListener(this); | |||
| findViewById(R.id.btnUser).setOnClickListener(this); | |||
| findViewById(R.id.adduser).setOnClickListener(this); | |||
| findViewById(R.id.syntime).setOnClickListener(this); | |||
| kg = findViewById(R.id.kg); | |||
| @@ -96,29 +97,29 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl | |||
| listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mlogList); | |||
| loglistView.setAdapter(listAdapter); | |||
| User defaultUser = getdefault(); | |||
| selectUser = defaultUser; | |||
| BodyFatUserBean defaultBodyFatUserBean = getdefault(); | |||
| mSelectBodyFatUserBean = defaultBodyFatUserBean; | |||
| mUsers = new ArrayList<>(); | |||
| mUsers.add(defaultUser); | |||
| mBodyFatUserBeans = new ArrayList<>(); | |||
| mBodyFatUserBeans.add(defaultBodyFatUserBean); | |||
| mUserlogList = new ArrayList<>(); | |||
| mUserlogList.add(defaultUser.toString()); | |||
| mUserlogList.add(defaultBodyFatUserBean.toString()); | |||
| userAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mUserlogList); | |||
| userlistView.setAdapter(userAdapter); | |||
| } | |||
| private User getdefault() { | |||
| User user = new User(); | |||
| user.setModeType(BodyFatDataUtil.MODE_ORDINARY); | |||
| user.setSex(BodyFatDataUtil.SEX_MAN); | |||
| user.setAge(18); | |||
| user.setHeight(170); | |||
| user.setAdc(560); | |||
| user.setWeight(50); | |||
| user.setId(1); | |||
| return user; | |||
| private BodyFatUserBean getdefault() { | |||
| BodyFatUserBean bodyFatUserBean = new BodyFatUserBean(); | |||
| bodyFatUserBean.setModeType(BodyFatDataUtil.MODE_ORDINARY); | |||
| bodyFatUserBean.setSex(BodyFatDataUtil.SEX_MAN); | |||
| bodyFatUserBean.setAge(18); | |||
| bodyFatUserBean.setHeight(170); | |||
| bodyFatUserBean.setAdc(560); | |||
| bodyFatUserBean.setWeight(50); | |||
| bodyFatUserBean.setId(1); | |||
| return bodyFatUserBean; | |||
| } | |||
| private void setUnitinit() { | |||
| @@ -262,7 +263,7 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl | |||
| if (status == BodyFatDataUtil.WEIGHT_RESULT) { | |||
| //稳定体重 | |||
| selectUser.setWeight(weight); | |||
| mSelectBodyFatUserBean.setWeight(weight); | |||
| mMHandler.sendEmptyMessage(TO_REFRE_USER); | |||
| } | |||
| @@ -309,13 +310,13 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl | |||
| case BodyFatDataUtil.TEST_FINISH: | |||
| mlogList.add(0, "测量状态:" + status + " 测量完成"); | |||
| if (bodyFatBleUtilsData != null) { | |||
| bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().updataPresentUser(selectUser)); | |||
| bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().updataPresentUser(mSelectBodyFatUserBean)); | |||
| } | |||
| break; | |||
| case BodyFatDataUtil.MUC_REQUEST_USER_INFO: | |||
| mlogList.add(0, "测量状态:" + status + "请求用户信息"); | |||
| if (bodyFatBleUtilsData != null) { | |||
| bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().setUserInfo(selectUser, BleDeviceConfig.WEIGHT_BODY_FAT_SCALE)); | |||
| bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().setUserInfo(mSelectBodyFatUserBean, BleDeviceConfig.WEIGHT_BODY_FAT_SCALE)); | |||
| } | |||
| break; | |||
| default: | |||
| @@ -328,7 +329,7 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl | |||
| @Override | |||
| public void onAdc(int adc, int algorithmic) { | |||
| mlogList.add(0, "阻抗:" + adc + " 算法位:" + algorithmic); | |||
| selectUser.setAdc(adc); | |||
| mSelectBodyFatUserBean.setAdc(adc); | |||
| mMHandler.sendEmptyMessage(TO_REFRE_USER); | |||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||
| } | |||
| @@ -488,53 +489,70 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl | |||
| @Override | |||
| public void onClick(View v) { | |||
| int id = v.getId(); | |||
| switch (id) { | |||
| case R.id.history: | |||
| if (bodyFatBleUtilsData != null) | |||
| bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().requestSynHistory()); | |||
| break; | |||
| case R.id.user: | |||
| if (!mEditText.getText().toString().trim().isEmpty()) { | |||
| int userid = Integer.parseInt(mEditText.getText().toString().trim()); | |||
| if (mUsers.size() >= userid) { | |||
| selectUser = mUsers.get(userid - 1); | |||
| if (bodyFatBleUtilsData != null) { | |||
| bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().updataPresentUser(selectUser)); | |||
| } | |||
| if (id == R.id.history) { | |||
| if (bodyFatBleUtilsData != null) | |||
| bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().requestSynHistory()); | |||
| } else if (id == R.id.btnUser) { | |||
| if (!mEditText.getText().toString().trim().isEmpty()) { | |||
| int userid = Integer.parseInt(mEditText.getText().toString().trim()); | |||
| if (mBodyFatUserBeans.size() >= userid) { | |||
| mSelectBodyFatUserBean = mBodyFatUserBeans.get(userid - 1); | |||
| if (bodyFatBleUtilsData != null) { | |||
| bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().updataPresentUser(mSelectBodyFatUserBean)); | |||
| } | |||
| } | |||
| break; | |||
| case R.id.userlist: | |||
| for (User mUser : mUsers) { | |||
| if (bodyFatBleUtilsData != null) | |||
| bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().setUserInfoList(mUser)); | |||
| } | |||
| } | |||
| } else if (id == R.id.userlist) { | |||
| for (BodyFatUserBean mBodyFatUserBean : mBodyFatUserBeans) { | |||
| if (bodyFatBleUtilsData != null) | |||
| bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().updateUsersComplete()); | |||
| break; | |||
| case R.id.adduser: | |||
| AddUserDialog addUserDialog = new AddUserDialog(new AddUserDialog.OnDialogListener() { | |||
| @Override | |||
| public void tvSucceedListener(User user) { | |||
| user.setId(mUsers.size() + 1); | |||
| mUsers.add(user); | |||
| mUserlogList.add(user.toString()); | |||
| userAdapter.notifyDataSetChanged(); | |||
| } | |||
| }); | |||
| addUserDialog.show(getSupportFragmentManager()); | |||
| break; | |||
| case R.id.syntime: | |||
| if (bodyFatBleUtilsData != null) { | |||
| SendBleBean sendBleBean = BodyFatDataUtil.getInstance().synSysTime(); | |||
| Log.e("time", BleStrUtils.byte2HexStr(sendBleBean.getHex())); | |||
| bodyFatBleUtilsData.sendData(sendBleBean); | |||
| bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().setUserInfoList(mBodyFatUserBean)); | |||
| } | |||
| if (bodyFatBleUtilsData != null) | |||
| bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().updateUsersComplete()); | |||
| } else if (id == R.id.adduser) { | |||
| AddUserDialog addUserDialog = new AddUserDialog(new AddUserDialog.OnDialogListener() { | |||
| @Override | |||
| public void tvSucceedListener(UserBean user) { | |||
| user.setId(mBodyFatUserBeans.size() + 1); | |||
| mBodyFatUserBeans.add(getBodyFatUserBean(user)); | |||
| mUserlogList.add(user.toString()); | |||
| userAdapter.notifyDataSetChanged(); | |||
| } | |||
| break; | |||
| }); | |||
| addUserDialog.show(getSupportFragmentManager()); | |||
| } else if (id == R.id.syntime) { | |||
| if (bodyFatBleUtilsData != null) { | |||
| SendBleBean sendBleBean = BodyFatDataUtil.getInstance().synSysTime(); | |||
| Log.e("time", BleStrUtils.byte2HexStr(sendBleBean.getHex())); | |||
| bodyFatBleUtilsData.sendData(sendBleBean); | |||
| } | |||
| } | |||
| } | |||
| private BodyFatUserBean getBodyFatUserBean(UserBean userBean) { | |||
| BodyFatUserBean bean = new BodyFatUserBean(); | |||
| if (userBean.getSex() == UserBean.SEX_MAN) { | |||
| bean.setSex(BodyFatDataUtil.SEX_MAN); | |||
| } else { | |||
| bean.setSex(BodyFatDataUtil.SEX_FEMAN); | |||
| } | |||
| if (userBean.getModeType() == UserBean.MODE_ATHLETE) { | |||
| bean.setModeType(BodyFatDataUtil.MODE_ATHLETE); | |||
| } else if (userBean.getModeType() == UserBean.MODE_PREGNANT) { | |||
| bean.setModeType(BodyFatDataUtil.MODE_PREGNANT); | |||
| } else { | |||
| bean.setModeType(BodyFatDataUtil.MODE_ORDINARY); | |||
| } | |||
| bean.setId(userBean.getId()); | |||
| bean.setAge(userBean.getAge()); | |||
| bean.setHeight(userBean.getHeight()); | |||
| bean.setWeight(userBean.getWeight()); | |||
| bean.setAdc(userBean.getAdc()); | |||
| return bean; | |||
| } | |||
| private final int ToRefreUi = 300; | |||
| private final int TO_REFRE_USER = 301; | |||
| @@ -552,9 +570,9 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl | |||
| case TO_REFRE_USER: | |||
| if (userAdapter != null) { | |||
| mUserlogList.clear(); | |||
| if (mUsers!=null) { | |||
| for (User user : mUsers) { | |||
| mUserlogList.add(user.toString()); | |||
| if (mBodyFatUserBeans !=null) { | |||
| for (BodyFatUserBean bodyFatUserBean : mBodyFatUserBeans) { | |||
| mUserlogList.add(bodyFatUserBean.toString()); | |||
| } | |||
| } | |||
| userAdapter.notifyDataSetChanged(); | |||
| @@ -1,872 +0,0 @@ | |||
| package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||
| import android.app.AlertDialog; | |||
| import android.content.DialogInterface; | |||
| import android.content.Intent; | |||
| import android.content.pm.ActivityInfo; | |||
| import android.content.pm.PackageManager; | |||
| import android.location.LocationManager; | |||
| import android.os.Build; | |||
| import android.os.Bundle; | |||
| import android.provider.Settings; | |||
| import android.util.Log; | |||
| import android.view.View; | |||
| import android.widget.ArrayAdapter; | |||
| import android.widget.Button; | |||
| import android.widget.CompoundButton; | |||
| import android.widget.EditText; | |||
| import android.widget.ListView; | |||
| import android.widget.RadioButton; | |||
| import androidx.annotation.Nullable; | |||
| import androidx.appcompat.app.AppCompatActivity; | |||
| import androidx.core.app.ActivityCompat; | |||
| import androidx.core.content.ContextCompat; | |||
| import org.json.JSONArray; | |||
| import org.json.JSONException; | |||
| import org.json.JSONObject; | |||
| import java.io.ByteArrayOutputStream; | |||
| import java.io.IOException; | |||
| import java.io.InputStream; | |||
| import java.net.HttpURLConnection; | |||
| import java.net.URL; | |||
| import java.text.SimpleDateFormat; | |||
| import java.util.ArrayList; | |||
| import java.util.List; | |||
| import java.util.Locale; | |||
| import cn.net.aicare.modulelibrary.module.wifi.WifiConfig; | |||
| import cn.net.aicare.modulelibrary.module.wifi.WifiUtils; | |||
| /** | |||
| * wifi配置界面 | |||
| */ | |||
| public class WifiConfigActivity extends AppCompatActivity implements View.OnClickListener, WifiUtils.OnWifiEventListener { | |||
| private String TAG = WifiConfigActivity.class.getName(); | |||
| private EditText ssid, paw, key, sn, devicename; | |||
| private ListView mListView; | |||
| private ArrayAdapter logadapter; | |||
| private List<String> loglist; | |||
| private Button btn_connect; | |||
| private Button btn_weight_result; | |||
| private WifiUtils mWifiUtils; | |||
| private Button btn_getdeviceid; | |||
| private Button btn_login; | |||
| private Button get_record; | |||
| private String SN; | |||
| private String myDeviceId; | |||
| private String token; | |||
| private long appid; | |||
| private List<Long> bodyId; | |||
| private RadioButton kg, jing, stlb, lb; | |||
| private String mDeviceName; | |||
| @Override | |||
| protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
| super.onCreate(savedInstanceState); | |||
| setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//禁止横屏 | |||
| setContentView(R.layout.activity_wifi_config); | |||
| ssid = findViewById(R.id.ssid); | |||
| paw = findViewById(R.id.password); | |||
| key = findViewById(R.id.key); | |||
| btn_getdeviceid = findViewById(R.id.deviceid); | |||
| btn_weight_result = findViewById(R.id.weight_result); | |||
| get_record = findViewById(R.id.get_record); | |||
| mListView = findViewById(R.id.log_list); | |||
| btn_connect = findViewById(R.id.btn_connect); | |||
| btn_login = findViewById(R.id.btn_login); | |||
| sn = findViewById(R.id.sn); | |||
| devicename = findViewById(R.id.device_name); | |||
| btn_login.setOnClickListener(this); | |||
| btn_weight_result.setOnClickListener(this); | |||
| btn_connect.setOnClickListener(this); | |||
| btn_getdeviceid.setOnClickListener(this); | |||
| get_record.setOnClickListener(this); | |||
| findViewById(R.id.clear_log).setOnClickListener(this); | |||
| findViewById(R.id.clear_record).setOnClickListener(this); | |||
| loglist = new ArrayList<>(); | |||
| logadapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, loglist); | |||
| mListView.setAdapter(logadapter); | |||
| mWifiUtils = new WifiUtils(this, this); | |||
| mWifiUtils.setLoopSendEnable(false); | |||
| mWifiUtils.setInterval(5); | |||
| ssid.setText(mWifiUtils.getSsidstring() == null ? "Elink-wif" : mWifiUtils.getSsidstring().replace("\"", "")); | |||
| paw.setText("elink1234567890"); | |||
| key.setText("1234567812345678"); | |||
| sn.setText("574d0868174f882078a5784b1f8d48"); | |||
| devicename.setText("wifi秤"); | |||
| bodyId = new ArrayList<>(); | |||
| kg = findViewById(R.id.kg); | |||
| jing = findViewById(R.id.jin); | |||
| stlb = findViewById(R.id.st_lb); | |||
| lb = findViewById(R.id.lb); | |||
| kg.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||
| @Override | |||
| public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | |||
| if (isChecked) { | |||
| new Thread(new Runnable() { | |||
| @Override | |||
| public void run() { | |||
| try { | |||
| setUnit(WifiConfig.KG); | |||
| } catch (Throwable throwable) { | |||
| throwable.printStackTrace(); | |||
| } | |||
| } | |||
| }).start(); | |||
| } | |||
| } | |||
| }); | |||
| jing.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||
| @Override | |||
| public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | |||
| if (isChecked) { | |||
| new Thread(new Runnable() { | |||
| @Override | |||
| public void run() { | |||
| try { | |||
| setUnit(WifiConfig.JIN); | |||
| } catch (Throwable throwable) { | |||
| throwable.printStackTrace(); | |||
| } | |||
| } | |||
| }).start(); | |||
| } | |||
| } | |||
| }); | |||
| stlb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||
| @Override | |||
| public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | |||
| if (isChecked) { | |||
| new Thread(new Runnable() { | |||
| @Override | |||
| public void run() { | |||
| try { | |||
| setUnit(WifiConfig.ST); | |||
| } catch (Throwable throwable) { | |||
| throwable.printStackTrace(); | |||
| } | |||
| } | |||
| }).start(); | |||
| } | |||
| } | |||
| }); | |||
| lb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||
| @Override | |||
| public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | |||
| if (isChecked) { | |||
| new Thread(new Runnable() { | |||
| @Override | |||
| public void run() { | |||
| try { | |||
| setUnit(WifiConfig.LB); | |||
| } catch (Throwable throwable) { | |||
| throwable.printStackTrace(); | |||
| } | |||
| } | |||
| }).start(); | |||
| } | |||
| } | |||
| }); | |||
| } | |||
| @Override | |||
| public void onClick(View v) { | |||
| if (v.getId() == R.id.btn_connect) { | |||
| if (mWifiUtils.getRunning() == 0) { | |||
| btn_connect.setText("停止"); | |||
| mWifiUtils.startSendData(ssid.getText().toString().trim(), paw.getText().toString().trim(), key.getText().toString().trim()); | |||
| } else { | |||
| mWifiUtils.end(); | |||
| btn_connect.setText("开始配网"); | |||
| } | |||
| } else if (v.getId() == R.id.deviceid) { | |||
| SN = sn.getText().toString().trim(); | |||
| mDeviceName = devicename.getText().toString().trim(); | |||
| if (appid != 0 && token != null && !SN.isEmpty() && !mDeviceName.isEmpty()) { | |||
| new Thread(new Runnable() { | |||
| @Override | |||
| public void run() { | |||
| try { | |||
| getDeviceid(); | |||
| } catch (Throwable throwable) { | |||
| throwable.printStackTrace(); | |||
| } | |||
| } | |||
| }).start(); | |||
| } else { | |||
| if (appid == 0 || token == null) { | |||
| loglist.add(0, "未登录"); | |||
| } | |||
| if (SN.isEmpty()) { | |||
| loglist.add(0, "没有SN号"); | |||
| } | |||
| if (mDeviceName.isEmpty()) { | |||
| loglist.add(0, "没有设备名称"); | |||
| } | |||
| } | |||
| logadapter.notifyDataSetChanged(); | |||
| } else if (v.getId() == R.id.weight_result) { | |||
| if (appid != 0 && token != null && myDeviceId != null) { | |||
| new Thread(new Runnable() { | |||
| @Override | |||
| public void run() { | |||
| try { | |||
| getWeight(appid, token, myDeviceId); | |||
| } catch (Throwable throwable) { | |||
| throwable.printStackTrace(); | |||
| } | |||
| } | |||
| }).start(); | |||
| } else { | |||
| if (appid == 0 || token == null) { | |||
| loglist.add(0, "未登录"); | |||
| } | |||
| if (myDeviceId == null) { | |||
| loglist.add(0, "没有得到设备Id"); | |||
| } | |||
| } | |||
| logadapter.notifyDataSetChanged(); | |||
| } else if (v.getId() == R.id.btn_login) { | |||
| new Thread(new Runnable() { | |||
| @Override | |||
| public void run() { | |||
| try { | |||
| login(); | |||
| } catch (Throwable throwable) { | |||
| throwable.printStackTrace(); | |||
| } | |||
| } | |||
| }).start(); | |||
| } else if (v.getId() == R.id.clear_log) { | |||
| loglist.clear(); | |||
| logadapter.notifyDataSetChanged(); | |||
| } else if (v.getId() == R.id.clear_record) { | |||
| if (bodyId.size() != 0) { | |||
| new Thread(new Runnable() { | |||
| @Override | |||
| public void run() { | |||
| for (int i = 0; i < bodyId.size(); i++) { | |||
| try { | |||
| delRecord(bodyId.get(i)); | |||
| } catch (Throwable throwable) { | |||
| throwable.printStackTrace(); | |||
| } | |||
| } | |||
| } | |||
| }).start(); | |||
| } else { | |||
| loglist.add(0, "没有BodyFatId"); | |||
| logadapter.notifyDataSetChanged(); | |||
| } | |||
| } else if (v.getId() == R.id.get_record) { | |||
| new Thread(new Runnable() { | |||
| @Override | |||
| public void run() { | |||
| try { | |||
| getTestRecord(); | |||
| } catch (Throwable throwable) { | |||
| throwable.printStackTrace(); | |||
| } | |||
| } | |||
| }).start(); | |||
| } | |||
| } | |||
| @Override | |||
| public void onEvent(int code) { | |||
| runOnUiThread(new Runnable() { | |||
| @Override | |||
| public void run() { | |||
| switch (code) { | |||
| case WifiConfig.KEY_ILLEGAL: | |||
| loglist.add(0, "加密key非法"); | |||
| break; | |||
| case WifiConfig.ERROR_EXCEPTIONAL: | |||
| loglist.add(0, "异常"); | |||
| break; | |||
| case WifiConfig.INFORMATION_SUCCESSFUL: | |||
| loglist.add(0, "生成数据类info 成功"); | |||
| break; | |||
| case WifiConfig.DEVICE_CONNECTION_SUCCESSFUL: | |||
| mWifiUtils.end(); | |||
| loglist.add(0, "设备联网成功成功"); | |||
| btn_connect.setText("开始配网"); | |||
| //调取登录 通过SN号去获取deviceId | |||
| break; | |||
| case WifiConfig.START_SEND_DATA: | |||
| loglist.add(0, "开始发送加密包"); | |||
| break; | |||
| case WifiConfig.ERROR_START_SEND_DATA: | |||
| loglist.add(0, "开始发送加密包,出错"); | |||
| break; | |||
| case WifiConfig.START_RECEIVE_DATA: | |||
| loglist.add(0, "开始接收设备数据"); | |||
| break; | |||
| case WifiConfig.ERROR_START_RECEIVE_DATA: | |||
| loglist.add(0, "开始接收设备数据,出错"); | |||
| break; | |||
| case WifiConfig.SSID_KEY_NULL: | |||
| loglist.add(0, "ssid为空或key为空"); | |||
| break; | |||
| } | |||
| logadapter.notifyDataSetChanged(); | |||
| } | |||
| }); | |||
| } | |||
| @Override | |||
| protected void onDestroy() { | |||
| super.onDestroy(); | |||
| mWifiUtils.onDestory(); | |||
| } | |||
| public void login() throws Throwable { | |||
| URL uri = new URL("http://test.ailink.app.aicare.net.cn/api/user/login?key=inet_elink&username=dhls@qq.com&password=dc483e80a7a0bd9ef71d8cf973673924"); | |||
| HttpURLConnection httpURLConnection = (HttpURLConnection) uri.openConnection(); | |||
| // Post请求必须设置允许输出 | |||
| httpURLConnection.setDoOutput(true); | |||
| // Post请求不能使用缓存 | |||
| httpURLConnection.setUseCaches(false); | |||
| // 设置为Post请求 | |||
| httpURLConnection.setRequestMethod("POST"); | |||
| httpURLConnection.setInstanceFollowRedirects(true); | |||
| // 配置请求Content-Type | |||
| httpURLConnection.setRequestProperty("Content-Type", | |||
| "application/x-www-form-urlencode"); | |||
| // 设置连接超时时间 | |||
| httpURLConnection.setConnectTimeout(6 * 1000); | |||
| // 开始连接 | |||
| httpURLConnection.connect(); | |||
| // DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream()); | |||
| // dos.write(map.toString().getBytes()); | |||
| // dos.flush(); | |||
| // dos.close(); | |||
| // 判断请求是否成功 | |||
| if (httpURLConnection.getResponseCode() == 200) { | |||
| // 获取返回的数据 | |||
| byte[] data = readInputStream(httpURLConnection.getInputStream()); | |||
| String result = new String(data, "UTF-8"); | |||
| Log.i(TAG, result); | |||
| JSONObject jsonObject = new JSONObject(result); | |||
| JSONObject datajson = jsonObject.getJSONObject("data"); | |||
| runOnUiThread(new Runnable() { | |||
| @Override | |||
| public void run() { | |||
| try { | |||
| token = jsonObject.getString("token"); | |||
| appid = datajson.getLong("appUserId"); | |||
| loglist.add(0, "登录成功"); | |||
| logadapter.notifyDataSetChanged(); | |||
| } catch (JSONException e) { | |||
| e.printStackTrace(); | |||
| } | |||
| } | |||
| }); | |||
| } else { | |||
| Log.i(TAG, "Post方式请求失败"); | |||
| runOnUiThread(new Runnable() { | |||
| @Override | |||
| public void run() { | |||
| loglist.add(0, "登录失败"); | |||
| } | |||
| }); | |||
| } | |||
| } | |||
| public void getWeight(long appid, String token, String deviceId) throws Throwable { | |||
| StringBuilder stringBuilder = new StringBuilder(); | |||
| stringBuilder.append("http://test.ailink.app.aicare.net.cn/api/BFScale/list?key=inet_elink&appUserId="); | |||
| stringBuilder.append(appid); | |||
| stringBuilder.append("&token="); | |||
| stringBuilder.append(token); | |||
| stringBuilder.append("&deviceId="); | |||
| stringBuilder.append(deviceId); | |||
| stringBuilder.append("&subUserId=1&maxId=0"); | |||
| URL uri = new URL(stringBuilder.toString()); | |||
| HttpURLConnection httpURLConnection = (HttpURLConnection) uri.openConnection(); | |||
| // // Post请求必须设置允许输出 | |||
| // httpURLConnection.setDoOutput(true); | |||
| // // Post请求不能使用缓存 | |||
| // httpURLConnection.setUseCaches(false); | |||
| // 设置为Post请求 | |||
| // httpURLConnection.setRequestMethod("GET"); | |||
| // httpURLConnection.setInstanceFollowRedirects(true); | |||
| // // 配置请求Content-Type | |||
| // httpURLConnection.setRequestProperty("Content-Type", | |||
| // "application/x-www-form-urlencode"); | |||
| // 设置连接超时时间 | |||
| httpURLConnection.setConnectTimeout(6 * 1000); | |||
| // 开始连接 | |||
| httpURLConnection.connect(); | |||
| // DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream()); | |||
| // dos.write(map.toString().getBytes()); | |||
| // dos.flush(); | |||
| // dos.close(); | |||
| // 判断请求是否成功 | |||
| if (httpURLConnection.getResponseCode() == 200) { | |||
| // 获取返回的数据 | |||
| byte[] data = readInputStream(httpURLConnection.getInputStream()); | |||
| String result = new String(data, "UTF-8"); | |||
| JSONObject jsonObject = new JSONObject(result); | |||
| JSONArray datajson = jsonObject.getJSONArray("data"); | |||
| bodyId.clear(); | |||
| for (int i = 0; i < datajson.length(); i++) { | |||
| bodyId.add(datajson.getJSONObject(i).getLong("bodyFatId")); | |||
| } | |||
| Log.i(TAG, result); | |||
| runOnUiThread(new Runnable() { | |||
| @Override | |||
| public void run() { | |||
| loglist.add(0, result); | |||
| logadapter.notifyDataSetChanged(); | |||
| loglist.add(0, "总共有:" + bodyId.size()); | |||
| logadapter.notifyDataSetChanged(); | |||
| } | |||
| }); | |||
| } else { | |||
| runOnUiThread(new Runnable() { | |||
| @Override | |||
| public void run() { | |||
| loglist.add(0, "请求失败"); | |||
| logadapter.notifyDataSetChanged(); | |||
| } | |||
| }); | |||
| } | |||
| } | |||
| public void getDeviceid() throws Throwable { | |||
| StringBuilder stringBuilder = new StringBuilder(); | |||
| stringBuilder.append("http://test.ailink.app.aicare.net.cn/api/device/getDeviceBySN?key=inet_elink&appUserId="); | |||
| stringBuilder.append(appid); | |||
| stringBuilder.append("&token="); | |||
| stringBuilder.append(token); | |||
| stringBuilder.append("&deviceSN="); | |||
| stringBuilder.append(SN); | |||
| Log.e(TAG, stringBuilder.toString()); | |||
| URL uri = new URL(stringBuilder.toString()); | |||
| HttpURLConnection httpURLConnection = (HttpURLConnection) uri.openConnection(); | |||
| // Post请求必须设置允许输出 | |||
| httpURLConnection.setDoOutput(true); | |||
| // Post请求不能使用缓存 | |||
| httpURLConnection.setUseCaches(false); | |||
| // 设置为Post请求 | |||
| httpURLConnection.setRequestMethod("POST"); | |||
| httpURLConnection.setInstanceFollowRedirects(true); | |||
| // 配置请求Content-Type | |||
| httpURLConnection.setRequestProperty("Content-Type", | |||
| "application/x-www-form-urlencode"); | |||
| // 设置连接超时时间 | |||
| httpURLConnection.setConnectTimeout(6 * 1000); | |||
| // 开始连接 | |||
| httpURLConnection.connect(); | |||
| // DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream()); | |||
| // dos.write(map.toString().getBytes()); | |||
| // dos.flush(); | |||
| // dos.close(); | |||
| // 判断请求是否成功 | |||
| if (httpURLConnection.getResponseCode() == 200) { | |||
| // 获取返回的数据 | |||
| byte[] data = readInputStream(httpURLConnection.getInputStream()); | |||
| String result = new String(data, "UTF-8"); | |||
| Log.i(TAG, result); | |||
| JSONObject jsonObject = new JSONObject(result); | |||
| JSONArray datajson = jsonObject.getJSONArray("data"); | |||
| runOnUiThread(new Runnable() { | |||
| @Override | |||
| public void run() { | |||
| try { | |||
| if (datajson.length() > 0) | |||
| myDeviceId = datajson.getJSONObject(0).getString("deviceId"); | |||
| loglist.add(0, "设备信息" + result); | |||
| logadapter.notifyDataSetChanged(); | |||
| } catch (JSONException e) { | |||
| e.printStackTrace(); | |||
| } | |||
| } | |||
| }); | |||
| bindDevice(); | |||
| } else { | |||
| Log.i(TAG, "Post方式请求失败"); | |||
| } | |||
| } | |||
| public void bindDevice() throws Throwable { | |||
| StringBuilder stringBuilder = new StringBuilder(); | |||
| stringBuilder.append("http://test.ailink.app.aicare.net.cn/api/device/update?key=inet_elink&appUserId="); | |||
| stringBuilder.append(appid); | |||
| stringBuilder.append("&token="); | |||
| stringBuilder.append(token); | |||
| stringBuilder.append("&deviceId="); | |||
| stringBuilder.append(myDeviceId); | |||
| stringBuilder.append("&roomId=4326&deviceName="); | |||
| stringBuilder.append(mDeviceName); | |||
| URL uri = new URL(stringBuilder.toString()); | |||
| HttpURLConnection httpURLConnection = (HttpURLConnection) uri.openConnection(); | |||
| // Post请求必须设置允许输出 | |||
| httpURLConnection.setDoOutput(true); | |||
| // Post请求不能使用缓存 | |||
| httpURLConnection.setUseCaches(false); | |||
| // 设置为Post请求 | |||
| httpURLConnection.setRequestMethod("POST"); | |||
| httpURLConnection.setInstanceFollowRedirects(true); | |||
| // 配置请求Content-Type | |||
| httpURLConnection.setRequestProperty("Content-Type", | |||
| "application/x-www-form-urlencode"); | |||
| // 设置连接超时时间 | |||
| httpURLConnection.setConnectTimeout(6 * 1000); | |||
| // 开始连接 | |||
| httpURLConnection.connect(); | |||
| // DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream()); | |||
| // dos.write(map.toString().getBytes()); | |||
| // dos.flush(); | |||
| // dos.close(); | |||
| // 判断请求是否成功 | |||
| if (httpURLConnection.getResponseCode() == 200) { | |||
| // 获取返回的数据 | |||
| byte[] data = readInputStream(httpURLConnection.getInputStream()); | |||
| String result = new String(data, "UTF-8"); | |||
| Log.i(TAG, result); | |||
| runOnUiThread(new Runnable() { | |||
| @Override | |||
| public void run() { | |||
| loglist.add(0, "绑定设备" + result); | |||
| logadapter.notifyDataSetChanged(); | |||
| } | |||
| }); | |||
| } else { | |||
| runOnUiThread(new Runnable() { | |||
| @Override | |||
| public void run() { | |||
| loglist.add(0, "绑定设备失败"); | |||
| logadapter.notifyDataSetChanged(); | |||
| } | |||
| }); | |||
| } | |||
| } | |||
| public void delRecord(Long bodyid) throws Throwable { | |||
| StringBuilder stringBuilder = new StringBuilder(); | |||
| stringBuilder.append("http://test.ailink.app.aicare.net.cn/api/BFScale/delete?key=inet_elink&appUserId="); | |||
| stringBuilder.append(appid); | |||
| stringBuilder.append("&token="); | |||
| stringBuilder.append(token); | |||
| stringBuilder.append("&bodyFatId="); | |||
| stringBuilder.append(bodyid); | |||
| stringBuilder.append(""); | |||
| URL uri = new URL(stringBuilder.toString()); | |||
| HttpURLConnection httpURLConnection = (HttpURLConnection) uri.openConnection(); | |||
| // Post请求必须设置允许输出 | |||
| httpURLConnection.setDoOutput(true); | |||
| // Post请求不能使用缓存 | |||
| httpURLConnection.setUseCaches(false); | |||
| // 设置为Post请求 | |||
| httpURLConnection.setRequestMethod("POST"); | |||
| httpURLConnection.setInstanceFollowRedirects(true); | |||
| // 配置请求Content-Type | |||
| httpURLConnection.setRequestProperty("Content-Type", | |||
| "application/x-www-form-urlencode"); | |||
| // 设置连接超时时间 | |||
| httpURLConnection.setConnectTimeout(6 * 1000); | |||
| // 开始连接 | |||
| httpURLConnection.connect(); | |||
| // DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream()); | |||
| // dos.write(map.toString().getBytes()); | |||
| // dos.flush(); | |||
| // dos.close(); | |||
| // 判断请求是否成功 | |||
| if (httpURLConnection.getResponseCode() == 200) { | |||
| // 获取返回的数据 | |||
| byte[] data = readInputStream(httpURLConnection.getInputStream()); | |||
| String result = new String(data, "UTF-8"); | |||
| Log.i(TAG, result); | |||
| runOnUiThread(new Runnable() { | |||
| @Override | |||
| public void run() { | |||
| loglist.add(0, result); | |||
| logadapter.notifyDataSetChanged(); | |||
| } | |||
| }); | |||
| } else { | |||
| runOnUiThread(new Runnable() { | |||
| @Override | |||
| public void run() { | |||
| loglist.add(0, "请求失败"); | |||
| logadapter.notifyDataSetChanged(); | |||
| } | |||
| }); | |||
| } | |||
| } | |||
| public byte[] readInputStream(InputStream inputStream) throws IOException { | |||
| byte[] buffer = new byte[1024]; | |||
| int len = 0; | |||
| ByteArrayOutputStream bos = new ByteArrayOutputStream(); | |||
| while ((len = inputStream.read(buffer)) != -1) { | |||
| bos.write(buffer, 0, len); | |||
| } | |||
| bos.close(); | |||
| return bos.toByteArray(); | |||
| } | |||
| public void setUnit(int unit) throws Throwable { | |||
| if (appid == 0 || token == null || SN == null || SN.isEmpty() || mDeviceName == null || mDeviceName.isEmpty()) { | |||
| runOnUiThread(new Runnable() { | |||
| @Override | |||
| public void run() { | |||
| loglist.add(0, "请先登录,然后获取设备id"); | |||
| logadapter.notifyDataSetChanged(); | |||
| } | |||
| }); | |||
| return; | |||
| } | |||
| StringBuilder stringBuilder = new StringBuilder(); | |||
| // http://test.ailink.app.aicare.net.cn/api/device/update?key=inet_elink&appUserId=10429&token=57dce920-8521-42e9-9040-157d08c7d922&deviceId=3001&roomId=4326&deviceName=WIFI秤测试&deviceUnit=1 | |||
| stringBuilder.append("http://test.ailink.app.aicare.net.cn/api/device/update?key=inet_elink&appUserId="); | |||
| stringBuilder.append(appid); | |||
| stringBuilder.append("&token="); | |||
| stringBuilder.append(token); | |||
| stringBuilder.append("&deviceId="); | |||
| stringBuilder.append(myDeviceId); | |||
| stringBuilder.append("&roomId=4326&deviceName="); | |||
| stringBuilder.append(mDeviceName); | |||
| stringBuilder.append("&deviceUnit="); | |||
| stringBuilder.append(unit); | |||
| Log.e("设置单位", stringBuilder.toString()); | |||
| URL uri = new URL(stringBuilder.toString()); | |||
| HttpURLConnection httpURLConnection = (HttpURLConnection) uri.openConnection(); | |||
| // Post请求必须设置允许输出 | |||
| httpURLConnection.setDoOutput(true); | |||
| // Post请求不能使用缓存 | |||
| httpURLConnection.setUseCaches(false); | |||
| // 设置为Post请求 | |||
| httpURLConnection.setRequestMethod("POST"); | |||
| httpURLConnection.setInstanceFollowRedirects(true); | |||
| // 配置请求Content-Type | |||
| httpURLConnection.setRequestProperty("Content-Type", | |||
| "application/x-www-form-urlencode"); | |||
| // 设置连接超时时间 | |||
| httpURLConnection.setConnectTimeout(6 * 1000); | |||
| // 开始连接 | |||
| httpURLConnection.connect(); | |||
| // DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream()); | |||
| // dos.write(map.toString().getBytes()); | |||
| // dos.flush(); | |||
| // dos.close(); | |||
| // 判断请求是否成功 | |||
| if (httpURLConnection.getResponseCode() == 200) { | |||
| // 获取返回的数据 | |||
| byte[] data = readInputStream(httpURLConnection.getInputStream()); | |||
| String result = new String(data, "UTF-8"); | |||
| Log.i(TAG, result); | |||
| runOnUiThread(new Runnable() { | |||
| @Override | |||
| public void run() { | |||
| loglist.add(0, result); | |||
| logadapter.notifyDataSetChanged(); | |||
| } | |||
| }); | |||
| } else { | |||
| runOnUiThread(new Runnable() { | |||
| @Override | |||
| public void run() { | |||
| loglist.add(0, "请求失败"); | |||
| logadapter.notifyDataSetChanged(); | |||
| } | |||
| }); | |||
| } | |||
| } | |||
| public void getTestRecord() throws Throwable { | |||
| StringBuilder stringBuilder = new StringBuilder(); | |||
| stringBuilder.append("http://test.ailink.app.aicare.net.cn/api/deDataTest/getDeDataTestPage?key=inet_elink&appUserId="); | |||
| stringBuilder.append(appid); | |||
| stringBuilder.append("&token="); | |||
| stringBuilder.append(token); | |||
| stringBuilder.append("&maxId=0"); | |||
| stringBuilder.append("&sortColumns="); | |||
| stringBuilder.append("id desc"); | |||
| Log.e(TAG, stringBuilder.toString()); | |||
| URL uri = new URL(stringBuilder.toString()); | |||
| HttpURLConnection httpURLConnection = (HttpURLConnection) uri.openConnection(); | |||
| // // Post请求必须设置允许输出 | |||
| // httpURLConnection.setDoOutput(true); | |||
| // // Post请求不能使用缓存 | |||
| // httpURLConnection.setUseCaches(false); | |||
| // // 设置为Post请求 | |||
| // httpURLConnection.setRequestMethod("POST"); | |||
| // httpURLConnection.setInstanceFollowRedirects(true); | |||
| // // 配置请求Content-Type | |||
| // httpURLConnection.setRequestProperty("Content-Type", | |||
| // "application/x-www-form-urlencode"); | |||
| // 设置连接超时时间 | |||
| httpURLConnection.setConnectTimeout(6 * 1000); | |||
| // 开始连接 | |||
| httpURLConnection.connect(); | |||
| // DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream()); | |||
| // dos.write(map.toString().getBytes()); | |||
| // dos.flush(); | |||
| // dos.close(); | |||
| // 判断请求是否成功 | |||
| if (httpURLConnection.getResponseCode() == 200) { | |||
| // 获取返回的数据 | |||
| byte[] data = readInputStream(httpURLConnection.getInputStream()); | |||
| String result = new String(data, "UTF-8"); | |||
| Log.i(TAG, result); | |||
| JSONObject jsonObject = new JSONObject(result); | |||
| JSONObject datajson = jsonObject.getJSONObject("data"); | |||
| JSONArray listjson = datajson.getJSONArray("list"); | |||
| StringBuffer stringBuffer = new StringBuffer(); | |||
| for (int i = 0; i < listjson.length(); i++) { | |||
| long id = listjson.getJSONObject(i).getLong("id"); | |||
| // String createTime="数据时间 "+getDateDefault(listjson.getJSONObject(i).getLong("createTime")); | |||
| String encryptData = "请求的加密值: " + listjson.getJSONObject(i).getString("encryptData"); | |||
| // String decryptData = "解密结果: " + listjson.getJSONObject(i).getString("decryptData"); | |||
| stringBuffer.append("id: "); | |||
| stringBuffer.append(id); | |||
| stringBuffer.append("\n"); | |||
| stringBuffer.append(encryptData); | |||
| stringBuffer.append("\n=================\n"); | |||
| } | |||
| runOnUiThread(new Runnable() { | |||
| @Override | |||
| public void run() { | |||
| loglist.add(0, "测试数据\n" + stringBuffer.toString()); | |||
| logadapter.notifyDataSetChanged(); | |||
| } | |||
| }); | |||
| } else { | |||
| } | |||
| } | |||
| public static String getDateDefault(Long time) { | |||
| SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US); | |||
| return simpleDateFormat.format(time); | |||
| } | |||
| public void getPermission() { | |||
| String[] permissions = {android.Manifest.permission.ACCESS_COARSE_LOCATION,}; | |||
| if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { | |||
| //当前系统大于等于6.0 | |||
| for (String perssion : permissions) { | |||
| int isGranted = ContextCompat.checkSelfPermission(this, perssion); | |||
| if (isGranted != PackageManager.PERMISSION_GRANTED) { | |||
| ActivityCompat.requestPermissions(this, new String[]{perssion}, 1); | |||
| } | |||
| } | |||
| LocationManager lm = (LocationManager) this.getSystemService(this.LOCATION_SERVICE); | |||
| if (!lm.isProviderEnabled(LocationManager.GPS_PROVIDER)) { | |||
| /*Toast.makeText(this, "检测到未开启GPS定位服务,需要开启才能扫描到附件WiFi信息,请开启", Toast.LENGTH_SHORT).show(); | |||
| new Thread(new Runnable() { | |||
| @Override | |||
| public void run() { | |||
| try { | |||
| Thread.sleep(3 * 1000); //sleep s | |||
| } catch (InterruptedException e) { | |||
| e.printStackTrace(); | |||
| } | |||
| } | |||
| }).start();*/ | |||
| AlertDialog dialog = new AlertDialog.Builder(this) | |||
| .setTitle("警告!") | |||
| .setMessage("检测到未开启GPS定位服务,需要开启才能扫描到附件WiFi信息,请开启") | |||
| .setPositiveButton("确定", new DialogInterface.OnClickListener() { | |||
| @Override | |||
| public void onClick(DialogInterface dialog, int which) { | |||
| Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); | |||
| startActivityForResult(intent, 1); | |||
| } | |||
| }).show(); | |||
| } | |||
| } | |||
| } | |||
| @Override | |||
| public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { | |||
| switch (requestCode) { | |||
| case 1: { | |||
| // If request is cancelled, the result arrays are empty. | |||
| if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { | |||
| Log.d("Mainactivity", "onRequestPermissionsResult granted"); | |||
| } else { | |||
| Log.d("Mainactivity", "onRequestPermissionsResult denied"); | |||
| AlertDialog dialog = new AlertDialog.Builder(this) | |||
| .setTitle("警告!") | |||
| .setMessage("需要授予定位权限才能扫描到附件WiFi信息") | |||
| .setPositiveButton("确定", new DialogInterface.OnClickListener() { | |||
| @Override | |||
| public void onClick(DialogInterface dialog, int which) { | |||
| //一般情况下如果用户不授权的话,功能是无法运行的,做退出处理 | |||
| finish(); | |||
| } | |||
| }).show(); | |||
| } | |||
| break; | |||
| } | |||
| default: | |||
| break; | |||
| } | |||
| super.onRequestPermissionsResult(requestCode, permissions, grantResults); | |||
| } | |||
| } | |||
| @@ -28,8 +28,6 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.BuildConfig; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.HintDataDialogFragment; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.AppStart; | |||
| import butterknife.ButterKnife; | |||
| import butterknife.Unbinder; | |||
| /** | |||
| @@ -48,7 +46,6 @@ public abstract class AppBaseActivity extends AppCompatActivity { | |||
| protected TextView mTvTopTitle; | |||
| @Nullable | |||
| protected Toolbar mToolbar; | |||
| private Unbinder bind; | |||
| //--------------ble--------------- | |||
| /** | |||
| * 需要申请的权限 | |||
| @@ -147,7 +144,6 @@ public abstract class AppBaseActivity extends AppCompatActivity { | |||
| * 初始化 | |||
| */ | |||
| protected final void init() { | |||
| bind = ButterKnife.bind(this); | |||
| addInit(); | |||
| initView(); | |||
| initData(); | |||
| @@ -358,7 +354,5 @@ public abstract class AppBaseActivity extends AppCompatActivity { | |||
| if (mHandler != null) { | |||
| mHandler.removeCallbacksAndMessages(null); | |||
| } | |||
| if (bind != null) | |||
| bind.unbind(); | |||
| } | |||
| } | |||
| @@ -19,8 +19,6 @@ import java.lang.ref.WeakReference; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.HintDataDialogFragment; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.CheckPermissionUtils; | |||
| import butterknife.ButterKnife; | |||
| import butterknife.Unbinder; | |||
| /** | |||
| @@ -39,7 +37,6 @@ public abstract class BleAppBaseActivity extends BleBaseActivity { | |||
| protected TextView mTvTopTitle; | |||
| @Nullable | |||
| protected Toolbar mToolbar; | |||
| private Unbinder bind; | |||
| //--------------ble--------------- | |||
| /** | |||
| * 需要申请的权限 | |||
| @@ -138,7 +135,6 @@ public abstract class BleAppBaseActivity extends BleBaseActivity { | |||
| * 初始化 | |||
| */ | |||
| protected final void init() { | |||
| bind = ButterKnife.bind(this); | |||
| addInit(); | |||
| initView(); | |||
| initData(); | |||
| @@ -271,7 +267,5 @@ public abstract class BleAppBaseActivity extends BleBaseActivity { | |||
| if (mHandler != null) { | |||
| mHandler.removeCallbacksAndMessages(null); | |||
| } | |||
| if (bind != null) | |||
| bind.unbind(); | |||
| } | |||
| } | |||
| @@ -33,8 +33,9 @@ public abstract class BleBaseActivity extends AppCompatActivity { | |||
| protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
| super.onCreate(savedInstanceState); | |||
| ActionBar supportActionBar = getSupportActionBar(); | |||
| if (supportActionBar != null) | |||
| if (supportActionBar != null) { | |||
| supportActionBar.setTitle(getString(R.string.app_name) + BuildConfig.VERSION_NAME); | |||
| } | |||
| init(); | |||
| } | |||
| @@ -44,43 +45,45 @@ public abstract class BleBaseActivity extends AppCompatActivity { | |||
| } | |||
| /** | |||
| * 搜索蓝牙(默认通过uuid过滤) | |||
| * @param timeOut 超时,小于等于0代表永不超时 | |||
| * 设置标题 | |||
| * | |||
| * @param title 标题 | |||
| */ | |||
| protected void startScanBle(long timeOut){ | |||
| if (AILinkBleManager.getInstance().isInitOk()){ | |||
| AILinkBleManager.getInstance().startScan(timeOut,BleConfig.UUID_SERVER_AILINK); | |||
| public void setTitleData(String title) { | |||
| ActionBar supportActionBar = getSupportActionBar(); | |||
| if (supportActionBar != null) { | |||
| supportActionBar.setTitle(title); | |||
| } | |||
| } | |||
| /** | |||
| * 主动停止搜索 | |||
| * 搜索蓝牙(默认通过uuid过滤) | |||
| * | |||
| * @param timeOut 超时,小于等于0代表永不超时 | |||
| */ | |||
| protected void stopScanBle(){ | |||
| if (AILinkBleManager.getInstance().isInitOk()){ | |||
| AILinkBleManager.getInstance().stopScan(); | |||
| protected void startScanBle(long timeOut) { | |||
| if (AILinkBleManager.getInstance().isInitOk()) { | |||
| AILinkBleManager.getInstance().startScan(timeOut, BleConfig.UUID_SERVER_AILINK); | |||
| } | |||
| } | |||
| /** | |||
| * 设置标题 | |||
| * | |||
| * @param title 标题 | |||
| * 主动停止搜索 | |||
| */ | |||
| public void setTitleData(String title) { | |||
| ActionBar supportActionBar = getSupportActionBar(); | |||
| if (supportActionBar != null) { | |||
| supportActionBar.setTitle(title); | |||
| protected void stopScanBle() { | |||
| if (AILinkBleManager.getInstance().isInitOk()) { | |||
| AILinkBleManager.getInstance().stopScan(); | |||
| } | |||
| } | |||
| /** | |||
| * 连接设备 | |||
| * | |||
| * @param bleValueBean 搜索到的地址 | |||
| */ | |||
| protected void connectBle(BleValueBean bleValueBean){ | |||
| if (AILinkBleManager.getInstance().isInitOk()){ | |||
| protected void connectBle(BleValueBean bleValueBean) { | |||
| if (AILinkBleManager.getInstance().isInitOk()) { | |||
| AILinkBleManager.getInstance().stopScan(); | |||
| AILinkBleManager.getInstance().connectDevice(bleValueBean); | |||
| } | |||
| @@ -88,10 +91,11 @@ public abstract class BleBaseActivity extends AppCompatActivity { | |||
| /** | |||
| * 连接设备 | |||
| * | |||
| * @param mac 设备的地址 | |||
| */ | |||
| protected void connectBle(String mac){ | |||
| if (AILinkBleManager.getInstance().isInitOk()){ | |||
| protected void connectBle(String mac) { | |||
| if (AILinkBleManager.getInstance().isInitOk()) { | |||
| AILinkBleManager.getInstance().stopScan(); | |||
| AILinkBleManager.getInstance().connectDevice(mac); | |||
| } | |||
| @@ -117,11 +121,11 @@ public abstract class BleBaseActivity extends AppCompatActivity { | |||
| onServiceErr(); | |||
| } | |||
| }); | |||
| }else { | |||
| mHandler.postDelayed(()->{ | |||
| } else { | |||
| mHandler.postDelayed(() -> { | |||
| mAILinkBleManager = AILinkBleManager.getInstance(); | |||
| onServiceSuccess(); | |||
| },500); | |||
| }, 500); | |||
| } | |||
| } | |||
| @@ -23,14 +23,15 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
| public abstract class BleNewBaseActivity extends AppCompatActivity { | |||
| private static String TAG = BleNewBaseActivity.class.getName(); | |||
| protected AILinkBleManager mBleManager; | |||
| @Override | |||
| protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
| super.onCreate(savedInstanceState); | |||
| ActionBar supportActionBar = getSupportActionBar(); | |||
| if (supportActionBar != null) | |||
| if (supportActionBar != null) { | |||
| supportActionBar.setTitle(getString(R.string.app_name) + BuildConfig.VERSION_NAME); | |||
| } | |||
| init(); | |||
| } | |||
| @@ -41,32 +42,32 @@ public abstract class BleNewBaseActivity extends AppCompatActivity { | |||
| /** | |||
| * 搜索蓝牙(默认通过uuid过滤) | |||
| * | |||
| * @param timeOut 超时,小于等于0代表永不超时 | |||
| */ | |||
| protected void startScanBle(long timeOut){ | |||
| if (AILinkBleManager.getInstance()!=null){ | |||
| AILinkBleManager.getInstance().startScan(timeOut,BleConfig.UUID_SERVER_AILINK); | |||
| protected void startScanBle(long timeOut) { | |||
| if (AILinkBleManager.getInstance() != null) { | |||
| AILinkBleManager.getInstance().startScan(timeOut, BleConfig.UUID_SERVER_AILINK); | |||
| } | |||
| } | |||
| /** | |||
| * 主动停止搜索 | |||
| */ | |||
| protected void stopScanBle(){ | |||
| if (AILinkBleManager.getInstance()!=null){ | |||
| protected void stopScanBle() { | |||
| if (AILinkBleManager.getInstance() != null) { | |||
| AILinkBleManager.getInstance().stopScan(); | |||
| } | |||
| } | |||
| /** | |||
| * 连接设备 | |||
| * | |||
| * @param bleValueBean 搜索到的地址 | |||
| */ | |||
| protected void connectBle(BleValueBean bleValueBean){ | |||
| if (AILinkBleManager.getInstance()!=null){ | |||
| protected void connectBle(BleValueBean bleValueBean) { | |||
| if (AILinkBleManager.getInstance() != null) { | |||
| AILinkBleManager.getInstance().stopScan(); | |||
| AILinkBleManager.getInstance().connectDevice(bleValueBean.getMac()); | |||
| } | |||
| @@ -74,10 +75,11 @@ public abstract class BleNewBaseActivity extends AppCompatActivity { | |||
| /** | |||
| * 连接设备 | |||
| * | |||
| * @param mac 设备的地址 | |||
| */ | |||
| protected void connectBle(String mac){ | |||
| if (AILinkBleManager.getInstance()!=null){ | |||
| protected void connectBle(String mac) { | |||
| if (AILinkBleManager.getInstance() != null) { | |||
| AILinkBleManager.getInstance().stopScan(); | |||
| AILinkBleManager.getInstance().connectDevice(mac); | |||
| } | |||
| @@ -90,6 +92,7 @@ public abstract class BleNewBaseActivity extends AppCompatActivity { | |||
| AILinkBleManager.getInstance().init(this, new AILinkBleManager.onInitListener() { | |||
| @Override | |||
| public void onInitSuccess() { | |||
| mBleManager = AILinkBleManager.getInstance(); | |||
| onServiceSuccess(); | |||
| } | |||
| @@ -98,7 +101,8 @@ public abstract class BleNewBaseActivity extends AppCompatActivity { | |||
| onServiceErr(); | |||
| } | |||
| }); | |||
| }else { | |||
| } else { | |||
| mBleManager = AILinkBleManager.getInstance(); | |||
| onServiceSuccess(); | |||
| } | |||
| @@ -0,0 +1,147 @@ | |||
| package aicare.net.cn.sdk.ailinksdkdemoandroid.base | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.LoadingIosDialogFragment | |||
| import android.R | |||
| import android.app.Activity | |||
| import android.content.Context | |||
| import android.content.pm.ActivityInfo | |||
| import android.os.Build | |||
| import android.os.Bundle | |||
| import android.view.KeyEvent | |||
| import android.view.MenuItem | |||
| import android.view.MotionEvent | |||
| import android.view.View | |||
| import android.view.WindowManager | |||
| import android.view.inputmethod.InputMethodManager | |||
| import androidx.annotation.ColorRes | |||
| import androidx.appcompat.widget.Toolbar | |||
| import androidx.core.content.ContextCompat | |||
| import androidx.viewbinding.ViewBinding | |||
| abstract class KBleBaseNewActivity<T : ViewBinding> : BleNewBaseActivity() { | |||
| val TAG = this.javaClass.name | |||
| lateinit var mContext: Context | |||
| @ColorRes | |||
| var mStatusBarColor: Int = 0 | |||
| lateinit var binding: T | |||
| override fun onCreate(savedInstanceState: Bundle?) { | |||
| super.onCreate(savedInstanceState) | |||
| binding = getLayoutView() | |||
| // initWindow() | |||
| setContentView(binding.root) | |||
| mContext = this | |||
| init() | |||
| } | |||
| /** | |||
| * 初始化 | |||
| */ | |||
| private fun init() { | |||
| findTopView() | |||
| initData() | |||
| initListener() | |||
| } | |||
| private fun findTopView() { | |||
| binding.root.findViewWithTag<View>("tbPublicTitle")?.let { | |||
| if (it is Toolbar) { | |||
| it.title = "" | |||
| setSupportActionBar(it) | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * 获取当前activity的布局 | |||
| * | |||
| * @return int | |||
| */ | |||
| protected abstract fun getLayoutView(): T | |||
| open fun initWindow() { | |||
| //禁止横屏 | |||
| requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT | |||
| //设置状态栏文字为黑色 | |||
| if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { | |||
| window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR | |||
| } | |||
| setStatusBarColor(mStatusBarColor) | |||
| } | |||
| fun setStatusBarColor(color: Int) { | |||
| if (color != 0) { | |||
| this.window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) | |||
| this.window.statusBarColor = ContextCompat.getColor(this, color) | |||
| } | |||
| } | |||
| /** | |||
| * 返回键 | |||
| */ | |||
| override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean { | |||
| if (keyCode == KeyEvent.KEYCODE_BACK && event.repeatCount == 0) { | |||
| myFinish() | |||
| return true | |||
| } | |||
| return super.onKeyDown(keyCode, event) | |||
| } | |||
| /** | |||
| * 返回 | |||
| */ | |||
| protected open fun myFinish() { | |||
| finish() | |||
| } | |||
| /** | |||
| * 初始化事件 | |||
| */ | |||
| protected abstract fun initListener() | |||
| /** | |||
| * 初始化数据 | |||
| */ | |||
| protected abstract fun initData() | |||
| override fun onOptionsItemSelected(item: MenuItem): Boolean { | |||
| val id = item.itemId | |||
| if (id == R.id.home) { | |||
| myFinish() | |||
| return true | |||
| } | |||
| return super.onOptionsItemSelected(item) | |||
| } | |||
| //--------------------------start Loading-------------------------- | |||
| private var mDialogFragment: LoadingIosDialogFragment? = null | |||
| /** | |||
| * 显示加载 | |||
| */ | |||
| fun showLoading() { | |||
| if (mDialogFragment == null) { | |||
| mDialogFragment = LoadingIosDialogFragment() | |||
| } | |||
| mDialogFragment!!.show(supportFragmentManager) | |||
| } | |||
| /** | |||
| * 关闭加载 | |||
| */ | |||
| fun dismissLoading() { | |||
| if (mDialogFragment != null) { | |||
| mDialogFragment!!.dismiss() | |||
| } | |||
| } | |||
| //--------------------------end Loading-------------------------- | |||
| } | |||
| @@ -234,7 +234,6 @@ public class BleDeviceConfig { | |||
| public final static int TEMP_INSTRUMENT = 0x003D; | |||
| /** | |||
| * wifi+ble血压计 | |||
| */ | |||
| @@ -280,7 +279,38 @@ public class BleDeviceConfig { | |||
| */ | |||
| public static final int BLE_GAS_DETECTOR = 0x006F; | |||
| /** | |||
| * 恶魔之眼(BLE) | |||
| */ | |||
| public static final int BLE_DEMON_EYES = 0x0071; | |||
| /** | |||
| * 气体检测仪(Ailink ) | |||
| */ | |||
| public static final int WIFI_BLE_GAS_DETECTOR = 0x0074; | |||
| /** | |||
| * BLE HMI体脂秤 | |||
| */ | |||
| public static final int BLE_HMI_BODY_FAT_SCALE = 0x0076; | |||
| /** | |||
| * 智能码表 | |||
| */ | |||
| public final static int BLE_SMART_CYCLING_TABLE = 0x0077; | |||
| /** | |||
| * 华普红外测温枪 | |||
| */ | |||
| public final static int BLE_HP_INFRARED_TEMPERATURE = 0x0020; | |||
| /** | |||
| * 热线式风速计 | |||
| */ | |||
| public static final int CID_0072_HOTLINE_ANE = 0x0072; | |||
| /** | |||
| * 病例宝 | |||
| */ | |||
| public final static int BLE_CASE_TREASURE = 0x0080; | |||
| //------------------特殊 | |||
| /** | |||
| @@ -316,4 +346,10 @@ public class BleDeviceConfig { | |||
| * wifi_ble_OTA | |||
| */ | |||
| public final static int WIFI_BLE_OTA = -11; | |||
| /** | |||
| * Ble发送速度测试 | |||
| */ | |||
| public static final int BLE_SEND_SPEED_TEST = -12; | |||
| } | |||
| @@ -17,23 +17,23 @@ import androidx.fragment.app.DialogFragment; | |||
| import androidx.fragment.app.FragmentManager; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatDataUtil; | |||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.User; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.bean.UserBean; | |||
| public class AddUserDialog extends DialogFragment implements View.OnClickListener , SeekBar.OnSeekBarChangeListener, RadioGroup.OnCheckedChangeListener { | |||
| private boolean mCancelBlank; | |||
| private TextView id; | |||
| private SeekBar agesb, heightsb, weightsb, adcsb; | |||
| private RadioGroup sexRG, modeRG; | |||
| private User user; | |||
| private UserBean user; | |||
| private TextView tv_move_data_ok, tv_move_data_cancel; | |||
| private OnDialogListener mOnDialogListener; | |||
| public AddUserDialog( OnDialogListener onDialogListener) { | |||
| user=new User(); | |||
| user.setModeType(BodyFatDataUtil.MODE_ORDINARY); | |||
| user.setSex(BodyFatDataUtil.SEX_MAN); | |||
| user=new UserBean(); | |||
| user.setModeType(UserBean.MODE_ORDINARY); | |||
| user.setSex(UserBean.SEX_MAN); | |||
| user.setAge(0); | |||
| user.setHeight(0); | |||
| user.setAdc(0); | |||
| @@ -136,15 +136,15 @@ public class AddUserDialog extends DialogFragment implements View.OnClickListene | |||
| @Override | |||
| public void onCheckedChanged(RadioGroup group, int checkedId) { | |||
| if (checkedId == R.id.man) { | |||
| user.setSex(BodyFatDataUtil.SEX_MAN); | |||
| user.setSex(UserBean.SEX_MAN); | |||
| } else if (checkedId == R.id.female) { | |||
| user.setSex(BodyFatDataUtil.SEX_FEMAN); | |||
| user.setSex(UserBean.SEX_FEMAN); | |||
| } else if (checkedId == R.id.ordinary) { | |||
| user.setModeType(BodyFatDataUtil.MODE_ORDINARY); | |||
| user.setModeType(UserBean.MODE_ORDINARY); | |||
| } else if (checkedId == R.id.athlete) { | |||
| user.setModeType(BodyFatDataUtil.MODE_ATHLETE); | |||
| user.setModeType(UserBean.MODE_ATHLETE); | |||
| } else if (checkedId == R.id.pregnant) { | |||
| user.setModeType(BodyFatDataUtil.MODE_PREGNANT); | |||
| user.setModeType(UserBean.MODE_PREGNANT); | |||
| } | |||
| settext(); | |||
| } | |||
| @@ -165,7 +165,7 @@ public class AddUserDialog extends DialogFragment implements View.OnClickListene | |||
| /** | |||
| * 成功的点击事件 | |||
| */ | |||
| default void tvSucceedListener(User user) { | |||
| default void tvSucceedListener(UserBean user) { | |||
| } | |||
| } | |||
| @@ -40,6 +40,11 @@ public class LoadingIosDialogFragment extends DialogFragment { | |||
| return show; | |||
| } | |||
| public static LoadingIosDialogFragment newInstance() { | |||
| return new LoadingIosDialogFragment(); | |||
| } | |||
| private Handler mHandler = new Handler(Looper.getMainLooper()) { | |||
| @Override | |||
| public void handleMessage(Message msg) { | |||
| @@ -46,7 +46,7 @@ public class ShowListDialogFragment extends DialogFragment implements View.OnCli | |||
| private int mCancelColor; | |||
| private CharSequence mCancel = ""; | |||
| private CharSequence mTitle = ""; | |||
| private ArrayList<DialogStringImageBean> mList; | |||
| private ArrayList<DialogStringImageBean> mList = new ArrayList<>(); | |||
| private boolean mBottom; | |||
| /** | |||
| * 是否显示灰色背景 | |||
| @@ -135,7 +135,7 @@ public class ShowListDialogFragment extends DialogFragment implements View.OnCli | |||
| tv_dialog_list_data_hint = view.findViewById(R.id.tv_dialog_list_data_hint); | |||
| rv_dialog_list.setLayoutManager(new LinearLayoutManager(mContext)); | |||
| rv_dialog_list.addItemDecoration(new MyItemDecoration(mContext, LinearLayoutManager.VERTICAL, 1, mContext.getResources() | |||
| .getColor(R.color.public_press_bg))); | |||
| .getColor(R.color.public_press_bg))); | |||
| } | |||
| @@ -145,10 +145,7 @@ public class ShowListDialogFragment extends DialogFragment implements View.OnCli | |||
| */ | |||
| private void initData(ArrayList<DialogStringImageBean> list, CharSequence title, CharSequence cancel, int cancelColor) { | |||
| if (mList == null) { | |||
| mList = new ArrayList<>(); | |||
| } | |||
| mAdapter = new DialogStringImageAdapter(mContext, mList, position -> { | |||
| mAdapter = new DialogStringImageAdapter(mContext, list, position -> { | |||
| if (mOnDialogListener != null) { | |||
| //item点击事件 | |||
| mOnDialogListener.onItemListener(position); | |||
| @@ -157,7 +154,7 @@ public class ShowListDialogFragment extends DialogFragment implements View.OnCli | |||
| }); | |||
| rv_dialog_list.setAdapter(mAdapter); | |||
| setList(list); | |||
| setList(new ArrayList<DialogStringImageBean>(list)); | |||
| setTitle(title); | |||
| setCancel(cancel, cancelColor); | |||
| mTvCancel.setOnClickListener(this); | |||
| @@ -199,13 +196,10 @@ public class ShowListDialogFragment extends DialogFragment implements View.OnCli | |||
| * 修改列表中的内容 | |||
| */ | |||
| public ShowListDialogFragment setList(List<DialogStringImageBean> list) { | |||
| if (mList == null) { | |||
| mList = new ArrayList<>(); | |||
| } | |||
| mList.clear(); | |||
| mList.addAll(list); | |||
| if (tv_dialog_list_data_hint != null) { | |||
| if (mList.size() == 0) { | |||
| if (mList.isEmpty()) { | |||
| tv_dialog_list_data_hint.setVisibility(View.VISIBLE); | |||
| } else { | |||
| tv_dialog_list_data_hint.setVisibility(View.GONE); | |||
| @@ -0,0 +1,131 @@ | |||
| package aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.bean; | |||
| public class UserBean { | |||
| /** | |||
| * 普通模式 Normal mode | |||
| */ | |||
| public final static int MODE_ORDINARY = 0; | |||
| /** | |||
| * 运动员模式 Athlete mode | |||
| */ | |||
| public final static int MODE_ATHLETE = 1; | |||
| /** | |||
| * 孕妇模式 Maternity mode | |||
| */ | |||
| public final static int MODE_PREGNANT = 2; | |||
| /** | |||
| * 男 Male | |||
| */ | |||
| public final static int SEX_MAN = 1; | |||
| /** | |||
| * 女 Female | |||
| */ | |||
| public final static int SEX_FEMAN = 0; | |||
| /** | |||
| * 性别,0女,1男 | |||
| * Gender, 0 female, 1 male | |||
| */ | |||
| private int sex; | |||
| /** | |||
| * 年龄 0~120 | |||
| * Age 0 ~ 120 | |||
| */ | |||
| private int age; | |||
| /** | |||
| * 身高cm 0~269 | |||
| * Height cm 0 ~ 269 | |||
| */ | |||
| private int height; | |||
| /** | |||
| * 体重kg 1位小数 0~250 | |||
| * Weight kg 1 decimal place 0 ~ 250 | |||
| */ | |||
| private float weight; | |||
| /** | |||
| * 模式,0普通,1运动员 | |||
| * Mode, 0 Normal, 1 Athlete | |||
| */ | |||
| private int modeType; | |||
| /** | |||
| * 1到8 | |||
| */ | |||
| private int id; | |||
| /** | |||
| * 阻抗值,正常0~1000 | |||
| * Impedance value, normal 0 ~ 1000 | |||
| */ | |||
| private int adc; | |||
| public int getAdc() { | |||
| return adc; | |||
| } | |||
| public void setAdc(int adc) { | |||
| this.adc = adc; | |||
| } | |||
| public int getId() { | |||
| return id; | |||
| } | |||
| public void setId(int id) { | |||
| this.id = id; | |||
| } | |||
| public int getSex() { | |||
| return sex; | |||
| } | |||
| public void setSex(int sex) { | |||
| this.sex = sex; | |||
| } | |||
| public int getAge() { | |||
| return age; | |||
| } | |||
| public void setAge(int age) { | |||
| this.age = age; | |||
| } | |||
| public int getHeight() { | |||
| return height; | |||
| } | |||
| public void setHeight(int height) { | |||
| this.height = height; | |||
| } | |||
| public float getWeight() { | |||
| return weight; | |||
| } | |||
| public void setWeight(float weight) { | |||
| this.weight = weight; | |||
| } | |||
| public int getModeType() { | |||
| return modeType; | |||
| } | |||
| public void setModeType(int modeType) { | |||
| this.modeType = modeType; | |||
| } | |||
| @Override | |||
| public String toString() { | |||
| return "BodyFatUserBean{" + | |||
| "sex=" + sex + | |||
| ", age=" + age + | |||
| ", height=" + height + | |||
| ", weight=" + weight + | |||
| ", modeType=" + modeType + | |||
| ", id=" + id + | |||
| ", adc=" + adc + | |||
| '}'; | |||
| } | |||
| } | |||
| @@ -80,46 +80,34 @@ public class FindDeviceActivity extends BleBaseActivity implements View.OnClickL | |||
| @Override | |||
| public void onClick(View v) { | |||
| switch (v.getId()) { | |||
| case R.id.btn_connect_info_list: | |||
| if (mFindDeviceData!=null) { | |||
| mFindDeviceData.getConnectInfoList(); | |||
| } | |||
| break; | |||
| case R.id.btn_get_connect_number: | |||
| if (mFindDeviceData!=null) { | |||
| mFindDeviceData.getConnectDeviceNumber(); | |||
| } | |||
| break; | |||
| case R.id.btn_device_id_0: | |||
| sendCmd(0); | |||
| break; | |||
| case R.id.btn_device_id_1: | |||
| sendCmd(1); | |||
| break; | |||
| case R.id.btn_device_id_2: | |||
| sendCmd(2); | |||
| break; | |||
| case R.id.btn_device_id_3: | |||
| sendCmd(3); | |||
| break; | |||
| case R.id.btn_device_id_4: | |||
| sendCmd(4); | |||
| break; | |||
| case R.id.btn_device_id_5: | |||
| sendCmd(5); | |||
| break; | |||
| case R.id.btn_device_id_6: | |||
| sendCmd(6); | |||
| break; | |||
| case R.id.btn_clear: | |||
| mList.clear(); | |||
| if (mListAdapter != null) { | |||
| mListAdapter.notifyDataSetChanged(); | |||
| } | |||
| break; | |||
| int id = v.getId(); | |||
| if (id == R.id.btn_connect_info_list) { | |||
| if (mFindDeviceData != null) { | |||
| mFindDeviceData.getConnectInfoList(); | |||
| } | |||
| } else if (id == R.id.btn_get_connect_number) { | |||
| if (mFindDeviceData != null) { | |||
| mFindDeviceData.getConnectDeviceNumber(); | |||
| } | |||
| } else if (id == R.id.btn_device_id_0) { | |||
| sendCmd(0); | |||
| } else if (id == R.id.btn_device_id_1) { | |||
| sendCmd(1); | |||
| } else if (id == R.id.btn_device_id_2) { | |||
| sendCmd(2); | |||
| } else if (id == R.id.btn_device_id_3) { | |||
| sendCmd(3); | |||
| } else if (id == R.id.btn_device_id_4) { | |||
| sendCmd(4); | |||
| } else if (id == R.id.btn_device_id_5) { | |||
| sendCmd(5); | |||
| } else if (id == R.id.btn_device_id_6) { | |||
| sendCmd(6); | |||
| } else if (id == R.id.btn_clear) { | |||
| mList.clear(); | |||
| if (mListAdapter != null) { | |||
| mListAdapter.notifyDataSetChanged(); | |||
| } | |||
| } | |||
| } | |||
| @@ -147,30 +147,25 @@ public class FindDeviceNewActivity extends BleAppBaseActivity implements View.On | |||
| @Override | |||
| public void onClick(View v) { | |||
| switch (v.getId()) { | |||
| case R.id.btn_scan_ble: | |||
| if (mFindDeviceData != null) { | |||
| int id = v.getId(); | |||
| if (id == R.id.btn_scan_ble) { | |||
| if (mFindDeviceData != null) { | |||
| // mFindDeviceData.setNearbyDevice(1, 10, new byte[]{}); | |||
| // if (rv_device.getVisibility() != View.VISIBLE) { | |||
| // rv_device.setVisibility(View.VISIBLE); | |||
| // } | |||
| mFindDeviceBeanList.clear(); | |||
| if (mFindDeviceAdapter != null) { | |||
| mFindDeviceAdapter.notifyDataSetChanged(); | |||
| } | |||
| mFindDeviceData.getConnectInfoList(); | |||
| mAILinkBleManager.startScan(30 * 1000); | |||
| mFindDeviceBeanList.clear(); | |||
| if (mFindDeviceAdapter != null) { | |||
| mFindDeviceAdapter.notifyDataSetChanged(); | |||
| } | |||
| break; | |||
| case R.id.btn_clear: | |||
| mList.clear(); | |||
| if (mListAdapter != null) { | |||
| mListAdapter.notifyDataSetChanged(); | |||
| } | |||
| break; | |||
| mFindDeviceData.getConnectInfoList(); | |||
| mAILinkBleManager.startScan(30 * 1000); | |||
| } | |||
| } else if (id == R.id.btn_clear) { | |||
| mList.clear(); | |||
| if (mListAdapter != null) { | |||
| mListAdapter.notifyDataSetChanged(); | |||
| } | |||
| } | |||
| } | |||
| @@ -1,5 +1,6 @@ | |||
| package aicare.net.cn.sdk.ailinksdkdemoandroid.home; | |||
| import java.util.ArrayList; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.ADWeightScaleCmdActivity; | |||
| @@ -11,13 +12,11 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.BloodOxygenActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.BloodSugar4GActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.BroadcastBloodOxygenActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.BroadcastScaleActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.ClearShakeHandsActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.ConnectBleTestActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.HeightCmdActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.HeightWeightScaleActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.ShowBleActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.SmartMaskActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.SphyCmdActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.TempCmdActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.TempGunCmdActivity; | |||
| @@ -25,17 +24,17 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.TempHumidityActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.TestCmdActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.TransmissionActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.WeightScaleBleActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.WifiConfigActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.find.FindDeviceNewActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.PublicBleNetworkCmdActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.PublicMqttActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.PublicWifiBleOtaActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.TempInstrument.TempInstrumentActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.airdetector.AirDetectorActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.barometric_temp_humidity.BarometricTempHygrometerActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_0020_hu_infrared_temp.Ble0020HpInfraredTempActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_nutrition.BleNutritionActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_nutrition.BleNutritionNutrientActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_speed_test.BleSpeedTestActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.blood_glucose.BloodGlucoseActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.blood_pressure_tc.BloodPressureTcActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.body_scale_4g.BodyScale4GActivity; | |||
| @@ -43,6 +42,7 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.broadcast_height.Broadcast | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.broadcast_nutrition.BroadNutritionActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.broadcast_weight_sacle.BroadcastWeightScaleActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.bw05watch.Bw05WatchActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.caseTreasure.BleCaseTreasureActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.coffee_scale.CoffeeScaleActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.eight_bodyfat.EightBodyFatMcuActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.eight_bodyfat.EightBodyfatActivity; | |||
| @@ -50,6 +50,8 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.eight_bodyfat.dual_band.Ei | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.fascia_gun.FasciaGunActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.food_temp.FoodTempActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.gasDetector.GasDetectorActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.gasDetectorPlus.GasDetectorPlusActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.hmiBodyFat.HmiBodyFatScaleBleActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.leaone_broadcast.LeaOneBroadcastActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.meat_probe.MeatProbeActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.meat_probe_charger.MeatProbeChargerActivity; | |||
| @@ -60,7 +62,8 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ropeskipping.RopeSkippingS | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.share_charger.ShareChargerActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.share_condom.ShareCondomActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.share_socket.ShareSocketActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.toothbrush.ToothBrushWifiBleActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.smart_cycling_table.SmartCyclingTableActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.toothbrush.ToothBrushWifiNewBleActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.toothbrush_test.ToothbrushTestActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.weight_scale.WeightScaleActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.wifi_ble_scale.WeightScaleWifiBleActivity; | |||
| @@ -90,14 +93,18 @@ public class HomeDataManager { | |||
| beanList.add(new JumpBean(BleDeviceConfig.PUBLIC_BLE_NETWORK, R.string.item_ble_universal_distribution_network, publicJumpActivity, PublicBleNetworkCmdActivity.class)); | |||
| // Ble test | |||
| beanList.add(new JumpBean(BleDeviceConfig.BLE_TEST, R.string.item_ble_test, publicJumpActivity, TestCmdActivity.class)); | |||
| // Ble send speed test | |||
| beanList.add(new JumpBean(BleDeviceConfig.BLE_SEND_SPEED_TEST, R.string.ble_send_speed_test, publicJumpActivity, BleSpeedTestActivity.class)); | |||
| // Ble connect test | |||
| beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_ble_connect_test, null, ConnectBleTestActivity.class)); | |||
| // OTA通用 | |||
| // OTA通用 | |||
| // beanList.add(new JumpBean(BleDeviceConfig.OTA, R.string.item_ota, publicJumpActivity, TestOtaActivity.class)); | |||
| //MQTT通用 | |||
| beanList.add(new JumpBean(BleDeviceConfig.OTA, R.string.item_mqtt, null, PublicMqttActivity.class)); | |||
| // 透传 | |||
| beanList.add(new JumpBean(BleDeviceConfig.PENETRATE, R.string.item_penetrate, publicJumpActivity, TransmissionActivity.class)); | |||
| //HMI四电极体脂秤 | |||
| beanList.add(new JumpBean(BleDeviceConfig.BLE_HMI_BODY_FAT_SCALE, R.string.item_hmi_body_fat_scale, publicJumpActivity, HmiBodyFatScaleBleActivity.class)); | |||
| //气体检测仪(Ailink ) | |||
| beanList.add(new JumpBean(BleDeviceConfig.WIFI_BLE_GAS_DETECTOR, R.string.gas_detector_puls, publicJumpActivity, GasDetectorPlusActivity.class)); | |||
| //气体检测仪 | |||
| beanList.add(new JumpBean(BleDeviceConfig.BLE_GAS_DETECTOR, R.string.gas_detector, publicJumpActivity, GasDetectorActivity.class)); | |||
| // 广播秤 | |||
| @@ -165,11 +172,10 @@ public class HomeDataManager { | |||
| // 探针充电盒 | |||
| beanList.add(new JumpBean(BleDeviceConfig.MEAT_PROBE_CHARGER, R.string.item_probe_charging_box, publicJumpActivity, MeatProbeChargerActivity.class)); | |||
| // 牙刷(wifi+ble) | |||
| beanList.add(new JumpBean(BleDeviceConfig.TOOTHBRUSH_WIFI_BLE, R.string.item_toothbrush_wifi_ble, publicJumpActivity, ToothBrushWifiBleActivity.class)); | |||
| // beanList.add(new JumpBean(BleDeviceConfig.TOOTHBRUSH_WIFI_BLE, R.string.item_toothbrush_wifi_ble, publicJumpActivity, ToothBrushWifiOnOnBleActivity.class)); | |||
| beanList.add(new JumpBean(BleDeviceConfig.TOOTHBRUSH_WIFI_BLE, R.string.item_toothbrush_wifi_ble, publicJumpActivity, ToothBrushWifiNewBleActivity.class)); | |||
| // 牙刷测试 | |||
| beanList.add(new JumpBean(BleDeviceConfig.TOOTHBRUSH_TEST, R.string.item_toothbrush_test, publicJumpActivity, ToothbrushTestActivity.class)); | |||
| // 口罩 | |||
| beanList.add(new JumpBean(BleDeviceConfig.SMART_MASK, R.string.item_smart_mask, publicJumpActivity, SmartMaskActivity.class)); | |||
| // 筋膜枪 | |||
| beanList.add(new JumpBean(BleDeviceConfig.FASCIA_GUN, R.string.item_fascia_gun, publicJumpActivity, FasciaGunActivity.class)); | |||
| // 跳绳 | |||
| @@ -203,18 +209,18 @@ public class HomeDataManager { | |||
| beanList.add(new JumpBean(BleDeviceConfig.WIFI_BLE_OTA, BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_WIFI_BLE, R.string.wifi_ble_ota_tool, publicJumpActivity, PublicWifiBleOtaActivity.class)); | |||
| //bw05暨芯手表 | |||
| beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_bw05_watch, null, Bw05WatchActivity.class)); | |||
| // 智能码表 | |||
| beanList.add(new JumpBean(BleDeviceConfig.BLE_SMART_CYCLING_TABLE, R.string.ble_smart_cycling_table, publicJumpActivity, SmartCyclingTableActivity.class)); | |||
| // 华普红外测温枪 | |||
| beanList.add(new JumpBean(BleDeviceConfig.BLE_HP_INFRARED_TEMPERATURE, R.string.ble_0020_hu_temp, publicJumpActivity, Ble0020HpInfraredTempActivity.class)); | |||
| //病例宝 | |||
| beanList.add(new JumpBean(BleDeviceConfig.BLE_CASE_TREASURE, R.string.ble_case_treasure, publicJumpActivity, BleCaseTreasureActivity.class)); | |||
| return beanList; | |||
| } | |||
| public static ArrayList<JumpBean> getHideDataList() { | |||
| ArrayList<JumpBean> hideList = new ArrayList<>(); | |||
| Class<?> publicJumpActivity = ShowBleActivity.class; | |||
| // 不握手不加密 | |||
| hideList.add(new JumpBean(BleDeviceConfig.CLEAR_SHAKE_HANDS, R.string.item_no_handshake_encryption, publicJumpActivity, ClearShakeHandsActivity.class)); | |||
| // wifi 配置 | |||
| hideList.add(new JumpBean(IGNORE_TYPE, R.string.item_wifi_config, null, WifiConfigActivity.class)); | |||
| return hideList; | |||
| } | |||
| /** | |||
| * 要跳转的目标Activity | |||
| @@ -57,7 +57,12 @@ public class HomeListAdapter extends RecyclerView.Adapter<HomeListAdapter.MyHold | |||
| @Override | |||
| public void onBindViewHolder(@NonNull MyHolder holder, int position) { | |||
| holder.tvContent.setText(context.getString(list.get(position).getItemNameResId())); | |||
| JumpBean jumpBean = list.get(position); | |||
| String cidStr = ""; | |||
| if (jumpBean.getCid() > 0) { | |||
| cidStr = "(" + jumpBean.getCidStr() + ")"; | |||
| } | |||
| holder.tvContent.setText(context.getString(jumpBean.getItemNameResId()) + cidStr); | |||
| } | |||
| @Override | |||
| @@ -1,6 +1,7 @@ | |||
| package aicare.net.cn.sdk.ailinksdkdemoandroid.home; | |||
| import java.util.List; | |||
| import java.util.Locale; | |||
| /** | |||
| * 说明: | |||
| @@ -82,6 +83,11 @@ public class JumpBean { | |||
| return cid; | |||
| } | |||
| public String getCidStr() { | |||
| String format = String.format(Locale.US, "0x%02X", cid); | |||
| return format; | |||
| } | |||
| public void setCid(int cid) { | |||
| this.cid = cid; | |||
| } | |||
| @@ -18,6 +18,7 @@ import android.view.Menu; | |||
| import android.view.MenuItem; | |||
| import android.view.View; | |||
| import android.widget.EditText; | |||
| import android.widget.TextView; | |||
| import androidx.annotation.NonNull; | |||
| import androidx.annotation.Nullable; | |||
| @@ -28,15 +29,19 @@ import androidx.core.content.ContextCompat; | |||
| import androidx.recyclerview.widget.LinearLayoutManager; | |||
| import androidx.recyclerview.widget.RecyclerView; | |||
| import com.besthealth.bhBodyComposition120.BhBodyComposition; | |||
| import com.elinkthings.httplibrary.OnHttpListener; | |||
| import com.elinkthings.httplibrary.license.LicenseHttpBean; | |||
| import com.elinkthings.httplibrary.license.LicenseHttpUtils; | |||
| import com.pingwang.bluetoothlib.AILinkBleManager; | |||
| import com.pingwang.bluetoothlib.AILinkSDK; | |||
| import com.pingwang.bluetoothlib.bean.AilinkLicenseBean; | |||
| import com.pingwang.bluetoothlib.bean.BleValueBean; | |||
| import com.pingwang.bluetoothlib.device.AiLinkBleCheckUtil; | |||
| import com.pingwang.bluetoothlib.listener.OnCallbackBle; | |||
| import com.pingwang.bluetoothlib.utils.BleLog; | |||
| import java.util.ArrayList; | |||
| import java.util.Arrays; | |||
| import java.util.List; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.AboutActivity; | |||
| @@ -54,6 +59,7 @@ public class MainActivity extends AppCompatActivity { | |||
| private Context mContext; | |||
| private RecyclerView rvList; | |||
| private TextView tvLog; | |||
| private ArrayList<JumpBean> mList = new ArrayList<>(); | |||
| private ArrayList<JumpBean> homeDataList = HomeDataManager.getHomeDataList(); | |||
| private CharSequence inputData = ""; | |||
| @@ -76,8 +82,6 @@ public class MainActivity extends AppCompatActivity { | |||
| initView(); | |||
| initData(); | |||
| initListener(); | |||
| int bodyComposition = new BhBodyComposition().getBodyComposition(); | |||
| L.i("bodyComposition:" + bodyComposition); | |||
| EditText etSearch = findViewById(R.id.etSearch); | |||
| etSearch.addTextChangedListener(new TextWatcher() { | |||
| @@ -131,6 +135,7 @@ public class MainActivity extends AppCompatActivity { | |||
| } | |||
| }); | |||
| } | |||
| @@ -157,15 +162,65 @@ public class MainActivity extends AppCompatActivity { | |||
| protected void initData() { | |||
| initPermissions(); | |||
| List<AilinkLicenseBean> list = new ArrayList<>(); | |||
| list.add(new AilinkLicenseBean(0x2F, 0x03, 0x09)); | |||
| list.add(new AilinkLicenseBean(0x2F, 0x03, 0x01)); | |||
| list.add(new AilinkLicenseBean(65544, 103, 0)); | |||
| list.add(new AilinkLicenseBean(65544, 21, 0)); | |||
| list.add(new AilinkLicenseBean(0x02, 0x99, 0x01)); | |||
| AILinkSDK.getInstance().initLicense(list); | |||
| refreshLicenseData(); | |||
| byte[] data = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06}; | |||
| int crc16 = AiLinkBleCheckUtil.getCrc16(data); | |||
| L.i("crc16:" + crc16); | |||
| // AiLinkPwdUtil | |||
| // List<AilinkLicenseBean> list = new ArrayList<>(); | |||
| // list.add(new AilinkLicenseBean(0x2F, 0x03, 0x09)); | |||
| // list.add(new AilinkLicenseBean(0x2F, 0x03, 0x01)); | |||
| // list.add(new AilinkLicenseBean(65544, 103, 0)); | |||
| // list.add(new AilinkLicenseBean(65544, 21, 0)); | |||
| // list.add(new AilinkLicenseBean(0x02, 0x99, 0x01)); | |||
| // | |||
| // AILinkSDK.getInstance().initLicense(list); | |||
| } | |||
| private List<AilinkLicenseBean> mLicenseBeans; | |||
| /** | |||
| * 刷新许可数据 | |||
| */ | |||
| private void refreshLicenseData() { | |||
| if (mLicenseBeans == null) { | |||
| mLicenseBeans = new ArrayList<>(); | |||
| } | |||
| new LicenseHttpUtils().getLicenseList(new OnHttpListener<List<LicenseHttpBean>>() { | |||
| @Override | |||
| public void onSuccess(List<LicenseHttpBean> data) { | |||
| if (data != null) { | |||
| L.iw("License:" + Arrays.toString(data.toArray())); | |||
| // tvLog.setText("License成功:" + data.size()); | |||
| for (LicenseHttpBean datum : data) { | |||
| //最好做一下判断,免得后端抽风改了就寄了 | |||
| if (datum != null) { | |||
| AilinkLicenseBean ailinkLicenseBean = new AilinkLicenseBean(); | |||
| ailinkLicenseBean.setCid(datum.getCid()); | |||
| ailinkLicenseBean.setVid(datum.getVid()); | |||
| ailinkLicenseBean.setPid(datum.getPid()); | |||
| mLicenseBeans.add(ailinkLicenseBean); | |||
| } | |||
| } | |||
| //还是判断一下初始化有没有完成吧 | |||
| if (AILinkSDK.getInstance().isInitOk() && mLicenseBeans != null && !mLicenseBeans.isEmpty()) { | |||
| AILinkSDK.getInstance().initLicense(mLicenseBeans); | |||
| } | |||
| } else { | |||
| tvLog.setText("License失败:null"); | |||
| } | |||
| } | |||
| @Override | |||
| public void onFailed(List<LicenseHttpBean> data) { | |||
| tvLog.setText("License失败:网络问题"); | |||
| } | |||
| }); | |||
| } | |||
| private int count = 0; | |||
| private OnCallbackBle mOnCallbackBle = new OnCallbackBle() { | |||
| @Override | |||
| @@ -181,13 +236,13 @@ public class MainActivity extends AppCompatActivity { | |||
| protected void initView() { | |||
| BleLog.init(true); | |||
| //connectDevice(BleValueBean bleValueBean);连接的时候需要传广播对象,否则返回的cid,vid,pid始终都是0 | |||
| //sdk | |||
| AILinkSDK.getInstance().init(mContext); | |||
| AILinkBleManager.getInstance().init(mContext, new AILinkBleManager.onInitListener() { | |||
| @Override | |||
| public void onInitSuccess() { | |||
| L.i("初始化成功"); | |||
| // AILinkBleManager.getInstance().setOnCallbackBle(mOnCallbackBle); | |||
| } | |||
| @@ -200,6 +255,7 @@ public class MainActivity extends AppCompatActivity { | |||
| SP.init(this); | |||
| rvList = findViewById(R.id.rv_list); | |||
| tvLog = findViewById(R.id.tvLog); | |||
| rvList.setLayoutManager(new LinearLayoutManager(this)); | |||
| mList.clear(); | |||
| mList.addAll(homeDataList); | |||
| @@ -15,7 +15,7 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||
| /** | |||
| * 噪音计(ble) | |||
| * demo参考界面 | |||
| * | |||
| * @author xing | |||
| */ | |||
| @@ -35,6 +35,7 @@ import java.util.List; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.WifiDialog; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.SP; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatDataUtil; | |||
| @@ -46,6 +47,11 @@ public class PublicBleNetworkCmdActivity extends BleBaseActivity implements OnCa | |||
| , OnMcuParameterListener, OnBleCompanyListener, View.OnClickListener, OnBleDeviceDataListener, OnBleConnectStatus { | |||
| private static String TAG = PublicBleNetworkCmdActivity.class.getName(); | |||
| private final static String WIFI_IP_KEY = "WIFI_IP_KEY"; | |||
| private final static String WIFI_PORT_KEY = "WIFI_PORT_KEY"; | |||
| private final static String WIFI_URL_KEY = "WIFI_URL_KEY"; | |||
| private final int REFRESH_DATA = 3; | |||
| private List<String> mList; | |||
| private ArrayAdapter listAdapter; | |||
| @@ -95,20 +101,28 @@ public class PublicBleNetworkCmdActivity extends BleBaseActivity implements OnCa | |||
| mList = new ArrayList<>(); | |||
| listView = findViewById(R.id.listview); | |||
| select_wifi_et = findViewById(R.id.select_wifi_et); | |||
| String ip = (String) SP.getInstance().get(WIFI_IP_KEY, ""); | |||
| et_ip = findViewById(R.id.et_ip); | |||
| et_ip.setText(ip); | |||
| String port = (String) SP.getInstance().get(WIFI_PORT_KEY, ""); | |||
| et_port = findViewById(R.id.et_port); | |||
| et_port.setText(port); | |||
| String url = (String) SP.getInstance().get(WIFI_URL_KEY, ""); | |||
| et_url = findViewById(R.id.et_url); | |||
| et_url.setText(url); | |||
| listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | |||
| listView.setAdapter(listAdapter); | |||
| findViewById(R.id.clear).setOnClickListener(this); | |||
| findViewById(R.id.scan_wifi).setOnClickListener(this); | |||
| findViewById(R.id.scanWifi).setOnClickListener(this); | |||
| findViewById(R.id.check_wifi_state).setOnClickListener(this); | |||
| findViewById(R.id.check_device_id).setOnClickListener(this); | |||
| findViewById(R.id.connect_wifi).setOnClickListener(this); | |||
| findViewById(R.id.disconnect).setOnClickListener(this); | |||
| findViewById(R.id.connectWifi).setOnClickListener(this); | |||
| findViewById(R.id.disconnectWifi).setOnClickListener(this); | |||
| findViewById(R.id.get_set_name).setOnClickListener(this); | |||
| findViewById(R.id.get_set_paw).setOnClickListener(this); | |||
| findViewById(R.id.reset).setOnClickListener(this); | |||
| @@ -126,110 +140,105 @@ public class PublicBleNetworkCmdActivity extends BleBaseActivity implements OnCa | |||
| @Override | |||
| public void onClick(View v) { | |||
| switch (v.getId()) { | |||
| int id = v.getId(); | |||
| if (id == R.id.clear) { | |||
| if (mList != null) | |||
| mList.clear(); | |||
| wifiMap.clear(); | |||
| mMapWifiName.clear(); | |||
| mList.add("扫描热点"); | |||
| if (mBleDevice != null) mBleDevice.sendData(scanWifi()); | |||
| } else if (id == R.id.scanWifi) { | |||
| wifiMap.clear(); | |||
| mMapWifiName.clear(); | |||
| mList.add("扫描热点"); | |||
| if (mBleDevice != null) mBleDevice.sendData(scanWifi()); | |||
| } else if (id == R.id.check_wifi_state) { | |||
| mList.add("查看wifi当前状态"); | |||
| if (mBleDevice != null) mBleDevice.sendData(checkWiFiState()); | |||
| } else if (id == R.id.check_device_id) { | |||
| mList.add("查看设备的ID"); | |||
| if (mBleDevice != null) mBleDevice.sendData(getSnDeviceId()); | |||
| } else if (id == R.id.connectWifi) { | |||
| try { | |||
| no = Integer.parseInt(select_wifi_et.getText().toString()); | |||
| String wifiMac = wifiMap.get(no); | |||
| String wifiName = mMapWifiName.get(no); | |||
| WifiDialog.newInstance().setTitle(wifiName, wifiMac).setOnDialogListener(new WifiDialog.OnDialogListener() { | |||
| @Override | |||
| public void tvCancelListener(View v) { | |||
| case R.id.clear: | |||
| if (mList != null) | |||
| mList.clear(); | |||
| case R.id.scan_wifi: | |||
| wifiMap.clear(); | |||
| mMapWifiName.clear(); | |||
| mList.add("扫描热点"); | |||
| if (mBleDevice != null) mBleDevice.sendData(scanWifi()); | |||
| break; | |||
| case R.id.check_wifi_state: | |||
| mList.add("查看wifi当前状态"); | |||
| if (mBleDevice != null) mBleDevice.sendData(checkWiFiState()); | |||
| break; | |||
| case R.id.check_device_id: | |||
| mList.add("查看设备的ID"); | |||
| if (mBleDevice != null) mBleDevice.sendData(getSnDeviceId()); | |||
| break; | |||
| case R.id.connect_wifi: | |||
| try { | |||
| no = Integer.parseInt(select_wifi_et.getText().toString()); | |||
| String wifiMac = wifiMap.get(no); | |||
| String wifiName = mMapWifiName.get(no); | |||
| WifiDialog.newInstance().setTitle(wifiName, wifiMac).setOnDialogListener(new WifiDialog.OnDialogListener() { | |||
| @Override | |||
| public void tvCancelListener(View v) { | |||
| } | |||
| } | |||
| @Override | |||
| public void tvSucceedListener(View v, String data) { | |||
| mBleDevice.sendData(setWifiMac(wifiMac)); | |||
| if (data.equals("") || data.length() >= 8) { | |||
| setPaw(data); | |||
| } else { | |||
| mList.add("按照操作规则来,输入密码。"); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| @Override | |||
| public void tvSucceedListener(View v, String data) { | |||
| mBleDevice.sendData(setWifiMac(wifiMac)); | |||
| if (data.equals("") || data.length() >= 8) { | |||
| setPaw(data); | |||
| } else { | |||
| mList.add("按照操作规则来,输入密码。"); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| }).show(getSupportFragmentManager()); | |||
| } catch (Exception e) { | |||
| e.printStackTrace(); | |||
| //不输入编号,不输入数字,瞎搞的人。呸 | |||
| mList.add("按照操作规则来,输入热点编号。"); | |||
| } | |||
| break; | |||
| case R.id.disconnect: | |||
| mList.add("断开连接"); | |||
| if (mBleDevice != null) mBleDevice.sendData(setDisconnectWifi()); | |||
| break; | |||
| case R.id.get_set_paw: | |||
| mList.add("获取到设置的密码"); | |||
| if (mBleDevice != null) mBleDevice.sendData(getConnectWifiPwd()); | |||
| break; | |||
| case R.id.get_set_name: | |||
| mList.add("获取到设置的热点"); | |||
| if (mBleDevice != null) mBleDevice.sendData(getConnectWifiName()); | |||
| break; | |||
| case R.id.reset: | |||
| mList.add("回复出厂设置"); | |||
| if (mBleDevice != null) mBleDevice.sendData(reset()); | |||
| break; | |||
| case R.id.check_ip: | |||
| mList.add("查看Ip"); | |||
| if (mBleDevice != null) mBleDevice.sendData(checkIp()); | |||
| break; | |||
| case R.id.check_port: | |||
| mList.add("查看端口号"); | |||
| if (mBleDevice != null) mBleDevice.sendData(checkPort()); | |||
| break; | |||
| case R.id.check_url: | |||
| mList.add("查看URL"); | |||
| if (mBleDevice != null) mBleDevice.sendData(checkUrl()); | |||
| break; | |||
| case R.id.set_ip: | |||
| String ipStr = et_ip.getText().toString(); | |||
| if (!ipStr.isEmpty()) { | |||
| mList.add("设置Ip地址"); | |||
| setIp(convertToASCII(ipStr)); | |||
| } else { | |||
| mList.add("最起码把Ip地址填一下吧"); | |||
| } | |||
| break; | |||
| case R.id.set_url: | |||
| String urlStr = et_url.getText().toString(); | |||
| mList.add("设置路径地址"); | |||
| setIpUrl(convertToASCII(urlStr)); | |||
| break; | |||
| case R.id.set_port: | |||
| try { | |||
| int port = Integer.parseInt(et_port.getText().toString()); | |||
| mList.add("设置Ip地址"); | |||
| setPort(port); | |||
| } catch (Exception e) { | |||
| e.printStackTrace(); | |||
| mList.add("输入的数字"); | |||
| } | |||
| break; | |||
| } | |||
| }).show(getSupportFragmentManager()); | |||
| } catch (Exception e) { | |||
| e.printStackTrace(); | |||
| //不输入编号,不输入数字,瞎搞的人。呸 | |||
| mList.add("按照操作规则来,输入热点编号。"); | |||
| } | |||
| } else if (id == R.id.disconnectWifi) { | |||
| mList.add("断开连接"); | |||
| if (mBleDevice != null) mBleDevice.sendData(setDisconnectWifi()); | |||
| } else if (id == R.id.get_set_paw) { | |||
| mList.add("获取到设置的密码"); | |||
| if (mBleDevice != null) mBleDevice.sendData(getConnectWifiPwd()); | |||
| } else if (id == R.id.get_set_name) { | |||
| mList.add("获取到设置的热点"); | |||
| if (mBleDevice != null) mBleDevice.sendData(getConnectWifiName()); | |||
| } else if (id == R.id.reset) { | |||
| mList.add("回复出厂设置"); | |||
| if (mBleDevice != null) mBleDevice.sendData(reset()); | |||
| } else if (id == R.id.check_ip) { | |||
| mList.add("查看Ip"); | |||
| if (mBleDevice != null) { | |||
| mBleDevice.sendData(checkIp()); | |||
| } | |||
| } else if (id == R.id.check_port) { | |||
| mList.add("查看端口号"); | |||
| if (mBleDevice != null) { | |||
| mBleDevice.sendData(checkPort()); | |||
| } | |||
| } else if (id == R.id.check_url) { | |||
| mList.add("查看URL"); | |||
| if (mBleDevice != null) { | |||
| mBleDevice.sendData(checkUrl()); | |||
| } | |||
| } else if (id == R.id.set_ip) { | |||
| String ipStr = et_ip.getText().toString(); | |||
| if (!ipStr.isEmpty()) { | |||
| mList.add("设置Ip地址"); | |||
| setIp(convertToASCII(ipStr)); | |||
| SP.getInstance().put(WIFI_IP_KEY, ipStr); | |||
| } else { | |||
| mList.add("请输入Ip地址"); | |||
| } | |||
| } else if (id == R.id.set_url) { | |||
| String urlStr = et_url.getText().toString(); | |||
| mList.add("设置路径地址"); | |||
| setIpUrl(convertToASCII(urlStr)); | |||
| SP.getInstance().put(WIFI_URL_KEY, urlStr); | |||
| } else if (id == R.id.set_port) { | |||
| try { | |||
| int port = Integer.parseInt(et_port.getText().toString()); | |||
| mList.add("设置Ip地址"); | |||
| setPort(port); | |||
| SP.getInstance().put(WIFI_PORT_KEY, String.valueOf(port)); | |||
| } catch (Exception e) { | |||
| e.printStackTrace(); | |||
| mList.add("输入的数字"); | |||
| } | |||
| } | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| @@ -289,7 +298,6 @@ public class PublicBleNetworkCmdActivity extends BleBaseActivity implements OnCa | |||
| public void onDisConnected(@NonNull String mac, int code) { | |||
| //TODO 连接断开 | |||
| if (mAddress.equals(mac)) { | |||
| finish(); | |||
| } | |||
| } | |||
| @@ -396,26 +404,48 @@ public class PublicBleNetworkCmdActivity extends BleBaseActivity implements OnCa | |||
| @Override | |||
| public void onBleConnectStatus(int bleStatus, int wifiStatus, int workStatus) { | |||
| String wifiStatusStr = ""; | |||
| String bleStatusStr = bleStatus + "_"; | |||
| //蓝牙状态 0:无连接 1:已连接 | |||
| if (bleStatus == 0) { | |||
| bleStatusStr += "无连接"; | |||
| } else if (bleStatus == 1) { | |||
| bleStatusStr += "已连接"; | |||
| } | |||
| String wifiStatusStr = wifiStatus + "_"; | |||
| //wifi状态 0:未配置 AP; 1:连接 AP 失败,连接时密码错误、AP 信号不好、主动断开都会是这个状态; 2:连接的 AP 信号不好; 3:成功连接上 AP; 4:正在连接 AP; | |||
| switch (wifiStatus) { | |||
| case 0: | |||
| wifiStatusStr = "未配置AP"; | |||
| wifiStatusStr += "未配置AP"; | |||
| break; | |||
| case 1: | |||
| wifiStatusStr = "连接AP失败"; | |||
| wifiStatusStr += "连接AP失败"; | |||
| break; | |||
| case 2: | |||
| wifiStatusStr = "连接的AP信号不好"; | |||
| wifiStatusStr += "连接的AP信号不好"; | |||
| break; | |||
| case 3: | |||
| wifiStatusStr = "成功连接上AP"; | |||
| wifiStatusStr += "成功连接上AP"; | |||
| break; | |||
| case 4: | |||
| wifiStatusStr = "正在连接AP"; | |||
| wifiStatusStr += "正在连接AP"; | |||
| break; | |||
| } | |||
| mList.add("蓝牙状态:" + bleStatus + "\nwifi状态:" + wifiStatusStr + "\n工作状态:" + workStatus); | |||
| String workStatusStr = workStatus + "_"; | |||
| //工作状态 0:唤醒 1:进入休眠 2:模块准备就绪 | |||
| switch (workStatus) { | |||
| case 0: | |||
| workStatusStr += "唤醒"; | |||
| break; | |||
| case 1: | |||
| workStatusStr += "进入休眠"; | |||
| break; | |||
| case 2: | |||
| workStatusStr += "模块准备就绪"; | |||
| break; | |||
| } | |||
| mList.add("蓝牙状态:" + bleStatusStr + "\nwifi状态:" + wifiStatusStr + "\n工作状态:" + workStatusStr); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| @@ -521,7 +551,7 @@ public class PublicBleNetworkCmdActivity extends BleBaseActivity implements OnCa | |||
| bytes[0] = (byte) CmdConfig.SET_WIFI_MAC; | |||
| String[] s = mac.split(":"); | |||
| for (int i = 0; i < s.length; i++) { | |||
| bytes[i + 1] = (byte) Integer.parseInt(s[s.length -1 - i], 16); | |||
| bytes[i + 1] = (byte) Integer.parseInt(s[s.length - 1 - i], 16); | |||
| } | |||
| return getSendBleBean(bytes); | |||
| @@ -1,246 +0,0 @@ | |||
| package aicare.net.cn.sdk.ailinksdkdemoandroid.modules; | |||
| import android.os.Message; | |||
| import android.text.TextUtils; | |||
| import android.view.View; | |||
| import android.widget.ArrayAdapter; | |||
| import android.widget.EditText; | |||
| import android.widget.ListView; | |||
| import android.widget.TextView; | |||
| import com.elinkthings.elinkmqttlib.listener.OnMqttConnectListener; | |||
| import com.elinkthings.elinkmqttlib.listener.OnMqttMessageListener; | |||
| import com.elinkthings.elinkmqttlib.listener.OnMqttOtherMessageListener; | |||
| import com.elinkthings.elinkmqttlib.mqtt.MqttDevice; | |||
| import com.elinkthings.elinkmqttlib.mqtt.MqttManager; | |||
| import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||
| import java.util.ArrayList; | |||
| import java.util.Arrays; | |||
| import java.util.List; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.AppBaseActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
| /** | |||
| * 公共mqtt界面 | |||
| * | |||
| * @author xing | |||
| * @date 2024/04/19 | |||
| */ | |||
| public class PublicMqttActivity extends AppBaseActivity implements View.OnClickListener, OnMqttMessageListener, OnMqttOtherMessageListener { | |||
| private final int REFRESH_DATA = 1; | |||
| private EditText etAppUserId; | |||
| private EditText etDeviceId; | |||
| private EditText etSendData; | |||
| private EditText etSendDataDeviceId; | |||
| private TextView tvDeviceList; | |||
| private List<String> mList; | |||
| private ArrayAdapter listAdapter; | |||
| private ListView lv_log; | |||
| /** | |||
| * _mac地址用于加解密,这里随便写一个,实际使用时需要替换 | |||
| */ | |||
| private String mMac = "00:00:00:00:00:00"; | |||
| @Override | |||
| protected void uiHandlerMessage(Message msg) { | |||
| if (msg.what == REFRESH_DATA) { | |||
| listAdapter.notifyDataSetChanged(); | |||
| } | |||
| } | |||
| @Override | |||
| protected int getLayoutId() { | |||
| return R.layout.activity_public_mqtt; | |||
| } | |||
| @Override | |||
| protected void initListener() { | |||
| MqttManager.getInstance().addOnMqttConnectListener(new OnMqttConnectListener() { | |||
| @Override | |||
| public void onConnected() { | |||
| addLog("Mqtt连接成功"); | |||
| } | |||
| @Override | |||
| public void onConnecting() { | |||
| addLog("Mqtt正在连接中"); | |||
| } | |||
| @Override | |||
| public void onDisconnect(int errCode) { | |||
| addLog("Mqtt断开连接,错误码:" + errCode); | |||
| } | |||
| @Override | |||
| public void onSubscribeSuccess(String... topics) { | |||
| addLog("订阅成功:\n" + Arrays.toString(topics)); | |||
| for (String topic : topics) { | |||
| MqttDevice device = MqttManager.getInstance().getDeviceForTopic(topic); | |||
| device.setOnMqttMessageListener(PublicMqttActivity.this); | |||
| device.setOnMqttOtherMessageListener(PublicMqttActivity.this); | |||
| device.setOnA7EncryptionListener(new MqttDevice.OnA7EncryptionListener() { | |||
| @Override | |||
| public byte[] onA7Encryption(int cid, byte[] cidBytes, byte[] payload) { | |||
| // return AiLinkPwdUtil.mcuEncrypt(cidBytes, getMacByte(mMac), payload); | |||
| return payload; | |||
| } | |||
| }); | |||
| } | |||
| } | |||
| @Override | |||
| public void onSubscribeFail(String... topics) { | |||
| addLog("订阅失败:\n" + Arrays.toString(topics)); | |||
| } | |||
| }); | |||
| } | |||
| @Override | |||
| public void onMessage(String topic, String deviceId, int cid, byte[] payload) { | |||
| addLog("设备ID:" + deviceId + " 接收到消息:" + BleStrUtils.byte2HexStr(payload)); | |||
| } | |||
| @Override | |||
| public void onSendSuccess(String topic, String deviceId, byte[] payload) { | |||
| addLog("设备ID:" + deviceId + " 发送消息成功:" + BleStrUtils.byte2HexStr(payload)); | |||
| } | |||
| @Override | |||
| public void onSendFailure(String topic, String deviceId, byte[] payload, int errCode, int retryCount) { | |||
| addLog("设备ID:" + deviceId + " 发送消息失败:" + BleStrUtils.byte2HexStr(payload)); | |||
| } | |||
| @Override | |||
| public void onOtherMessage(String topic, String deviceId, byte[] hex) { | |||
| addLog("设备ID:" + deviceId + " 接收到透传消息:" + BleStrUtils.byte2HexStr(hex)); | |||
| } | |||
| @Override | |||
| public void onClick(View v) { | |||
| int id = v.getId(); | |||
| if (id == R.id.btnClearShakeHands) { | |||
| mList.clear(); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } else if (id == R.id.btnConnectMqtt) { | |||
| String appId = etAppUserId.getText().toString(); | |||
| if (TextUtils.isEmpty(appId)) { | |||
| addLog("App Id不能为空"); | |||
| return; | |||
| } | |||
| //禁止etAppUserId编辑 | |||
| etAppUserId.setEnabled(false); | |||
| MqttManager.getInstance().init(this, appId); | |||
| addLog("正在连接Mqtt:" + appId); | |||
| MqttManager.getInstance().connectMqtt(); | |||
| } else if (id == R.id.btnDisconnectMqtt) { | |||
| etAppUserId.setEnabled(true); | |||
| addLog("正在断开Mqtt连接"); | |||
| MqttManager.getInstance().disconnect(); | |||
| } else if (id == R.id.btnAddDevice) { | |||
| String deviceId = etDeviceId.getText().toString(); | |||
| MqttManager.getInstance().addDevice(deviceId); | |||
| addLog("添加设备:" + deviceId); | |||
| etDeviceId.setText(""); | |||
| refreshDeviceList(); | |||
| } else if (id == R.id.btnRemoveDevice) { | |||
| String deviceId = etDeviceId.getText().toString(); | |||
| MqttManager.getInstance().removeDevice(deviceId); | |||
| addLog("移除设备:" + deviceId); | |||
| etDeviceId.setText(""); | |||
| refreshDeviceList(); | |||
| } else if (id == R.id.btnSendData) { | |||
| String data = etSendData.getText().toString().trim(); | |||
| data = data.replaceAll(" ", ""); | |||
| if (TextUtils.isEmpty(data)) { | |||
| addLog("发送数据不能为空"); | |||
| return; | |||
| } | |||
| String deviceId = etSendDataDeviceId.getText().toString(); | |||
| if (TextUtils.isEmpty(deviceId)) { | |||
| addLog("设备Id不能为空"); | |||
| return; | |||
| } | |||
| byte[] bytes = new byte[0]; | |||
| try { | |||
| bytes = BleStrUtils.stringToByte(data); | |||
| } catch (Exception e) { | |||
| e.printStackTrace(); | |||
| } | |||
| MqttDevice device = MqttManager.getInstance().getDevice(deviceId); | |||
| if (device != null) { | |||
| if (bytes.length == 0) { | |||
| addLog("发送数据不能为空"); | |||
| return; | |||
| } | |||
| device.sendData(bytes); | |||
| addLog("发送数据:" + data + " 设备:" + deviceId); | |||
| } else { | |||
| addLog("设备不存在或者未连接:" + deviceId); | |||
| } | |||
| } | |||
| } | |||
| @Override | |||
| protected void initData() { | |||
| mList = new ArrayList<>(); | |||
| listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | |||
| lv_log.setAdapter(listAdapter); | |||
| } | |||
| @Override | |||
| protected void initView() { | |||
| findViewById(R.id.btnClearShakeHands).setOnClickListener(this); | |||
| findViewById(R.id.btnConnectMqtt).setOnClickListener(this); | |||
| findViewById(R.id.btnDisconnectMqtt).setOnClickListener(this); | |||
| etAppUserId = (EditText) findViewById(R.id.etAppUserId); | |||
| etDeviceId = (EditText) findViewById(R.id.etDeviceId); | |||
| findViewById(R.id.btnAddDevice).setOnClickListener(this); | |||
| findViewById(R.id.btnRemoveDevice).setOnClickListener(this); | |||
| tvDeviceList = (TextView) findViewById(R.id.tvDeviceList); | |||
| lv_log = findViewById(R.id.lv_log); | |||
| etSendData = (EditText) findViewById(R.id.etSendData); | |||
| etSendDataDeviceId = (EditText) findViewById(R.id.etSendDataDeviceId); | |||
| findViewById(R.id.btnSendData).setOnClickListener(this); | |||
| } | |||
| private void refreshDeviceList() { | |||
| List<String> deviceList = MqttManager.getInstance().getDeviceList(); | |||
| String deviceListStr = TextUtils.join(",", deviceList); | |||
| tvDeviceList.setText(deviceListStr); | |||
| } | |||
| /** | |||
| * 添加日志 | |||
| * | |||
| * @param log 日志 | |||
| */ | |||
| private void addLog(String log) { | |||
| log = TimeUtils.getTimeSSS() + log; | |||
| mList.add(0, log); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| /** | |||
| * 获取mac字节 | |||
| * | |||
| * @param mac mac | |||
| * @return {@link byte[]} | |||
| */ | |||
| private byte[] getMacByte(String mac) { | |||
| byte[] macByte = new byte[6]; | |||
| if (mac.contains(":")) { | |||
| String[] macArr = mac.split(":"); | |||
| for (int i = 0; i < macArr.length; i++) { | |||
| macByte[macArr.length - i - 1] = (byte) Integer.parseInt(macArr[i], 16); | |||
| } | |||
| } | |||
| return macByte; | |||
| } | |||
| } | |||
| @@ -18,6 +18,8 @@ import androidx.annotation.Nullable; | |||
| import com.pingwang.bluetoothlib.device.BleDevice; | |||
| import com.pingwang.bluetoothlib.device.BleSendCmdUtil; | |||
| import com.pingwang.bluetoothlib.device.SendBleBean; | |||
| import com.pingwang.bluetoothlib.device.wifibleDevice.WifiBleDeviceData; | |||
| import com.pingwang.bluetoothlib.device.wifibleDevice.WifiBleInfoBean; | |||
| import com.pingwang.bluetoothlib.listener.CallbackDisIm; | |||
| import com.pingwang.bluetoothlib.listener.OnBleCompanyListener; | |||
| import com.pingwang.bluetoothlib.listener.OnBleDeviceDataListener; | |||
| @@ -37,8 +39,6 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.ShowListDialogFragment; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.SP; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
| import cn.net.aicare.modulelibrary.module.wifibleDevice.WifiBleDeviceData; | |||
| import cn.net.aicare.modulelibrary.module.wifibleDevice.WifiBleInfoBean; | |||
| /** | |||
| @@ -130,46 +130,35 @@ public class PublicWifiBleOtaActivity extends BleBaseActivity implements OnCallb | |||
| @Override | |||
| public void onClick(View v) { | |||
| switch (v.getId()) { | |||
| case R.id.clear: | |||
| if (mList != null) | |||
| mList.clear(); | |||
| int id = v.getId(); | |||
| if (id == R.id.clear) { | |||
| if (mList != null) | |||
| mList.clear(); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| SP.getInstance().put(WIFI_BLE_SSID, ""); | |||
| SP.getInstance().put(WIFI_BLE_SSID_MAC, ""); | |||
| SP.getInstance().put(WIFI_BLE_PWD, ""); | |||
| mSsid = ""; | |||
| mMac = ""; | |||
| mPwd = ""; | |||
| if (tv_wifi_info != null) { | |||
| tv_wifi_info.setText(""); | |||
| } | |||
| } else if (id == R.id.btn_read_wifi_status) { | |||
| if (mWifiBleDeviceData != null) { | |||
| mWifiBleDeviceData.getWifiCurrentState(); | |||
| } | |||
| } else if (id == R.id.btn_start_ota) { | |||
| if (mWifiBleDeviceData != null) { | |||
| setConnectWifi(mMac, mPwd); | |||
| } | |||
| } else if (id == R.id.btn_wifi) { | |||
| if (mWifiBleDeviceData != null) { | |||
| mWifiBleDeviceData.getWifiList(); | |||
| mList.add(TimeUtils.getTime() + "正在扫描附近可用的wifi..."); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| SP.getInstance().put(WIFI_BLE_SSID, ""); | |||
| SP.getInstance().put(WIFI_BLE_SSID_MAC, ""); | |||
| SP.getInstance().put(WIFI_BLE_PWD, ""); | |||
| mSsid = ""; | |||
| mMac = ""; | |||
| mPwd = ""; | |||
| if (tv_wifi_info != null) { | |||
| tv_wifi_info.setText(""); | |||
| } | |||
| break; | |||
| case R.id.btn_read_wifi_status: | |||
| if (mWifiBleDeviceData != null) { | |||
| mWifiBleDeviceData.getWifiCurrentState(); | |||
| } | |||
| break; | |||
| case R.id.btn_start_ota: | |||
| if (mWifiBleDeviceData != null) { | |||
| setConnectWifi(mMac, mPwd); | |||
| } | |||
| break; | |||
| case R.id.btn_wifi: | |||
| if (mWifiBleDeviceData != null) { | |||
| mWifiBleDeviceData.getWifiList(); | |||
| mList.add(TimeUtils.getTime() + "正在扫描附近可用的wifi..."); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| showWifiList(); | |||
| break; | |||
| default: | |||
| break; | |||
| } | |||
| showWifiList(); | |||
| } | |||
| } | |||
| @@ -205,210 +205,184 @@ public class TempInstrumentActivity extends BleBaseActivity implements OnCallbac | |||
| if (mBleDevice == null) | |||
| return; | |||
| SendBleBean sendBleBean = new SendBleBean(); | |||
| switch (v.getId()) { | |||
| case R.id.btnVersion: | |||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||
| mBleDevice.sendData(sendBleBean); | |||
| break; | |||
| case R.id.btnBattery: | |||
| sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus()); | |||
| mBleDevice.sendData(sendBleBean); | |||
| break; | |||
| case R.id.btn_get_did: | |||
| sendBleBean.setHex(mBleSendCmdUtil.getDid()); | |||
| mBleDevice.sendData(sendBleBean); | |||
| break; | |||
| case R.id.btnClearShakeHands: | |||
| if (mList != null) | |||
| mList.clear(); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| break; | |||
| case R.id.btnGetConfig: | |||
| if (mBleDevice != null) { | |||
| mBleDevice.getDeviceConfig(); | |||
| int vId = v.getId(); | |||
| if (vId == R.id.btnVersion) { | |||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||
| mBleDevice.sendData(sendBleBean); | |||
| } else if (vId == R.id.btnBattery) { | |||
| sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus()); | |||
| mBleDevice.sendData(sendBleBean); | |||
| } else if (vId == R.id.btn_get_did) { | |||
| sendBleBean.setHex(mBleSendCmdUtil.getDid()); | |||
| mBleDevice.sendData(sendBleBean); | |||
| } else if (vId == R.id.btnClearShakeHands) { | |||
| if (mList != null) | |||
| mList.clear(); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } else if (vId == R.id.btnGetConfig) { | |||
| if (mBleDevice != null) { | |||
| mBleDevice.getDeviceConfig(); | |||
| } | |||
| } else if (vId == R.id.btnSetUnit) { | |||
| if (mBleDevice != null) { | |||
| if (mTempUnit == TempInstrumentBleConfig.UnitType.TEMP_UNIT_C) { | |||
| mTempUnit = TempInstrumentBleConfig.UnitType.TEMP_UNIT_F; | |||
| } else { | |||
| mTempUnit = TempInstrumentBleConfig.UnitType.TEMP_UNIT_C; | |||
| } | |||
| break; | |||
| case R.id.btnSetUnit: | |||
| if (mBleDevice != null) { | |||
| if (mTempUnit == TempInstrumentBleConfig.UnitType.TEMP_UNIT_C) { | |||
| mTempUnit = TempInstrumentBleConfig.UnitType.TEMP_UNIT_F; | |||
| mBleDevice.synUnit(mTempUnit); | |||
| } | |||
| } else if (vId == R.id.btnSetVolume) { | |||
| if (!mConfigInfoStatus) | |||
| return; | |||
| for (int i = 0; i < mVolumeList.size(); i++) { | |||
| int id = mVolumeList.get(i); | |||
| if (id == mCurrentVolumeLevel) { | |||
| if (mVolumeList.size() - 1 == i) { | |||
| mCurrentVolumeLevel = mVolumeList.get(0); | |||
| } else { | |||
| mTempUnit = TempInstrumentBleConfig.UnitType.TEMP_UNIT_C; | |||
| } | |||
| mBleDevice.synUnit(mTempUnit); | |||
| } | |||
| break; | |||
| case R.id.btnSetVolume: | |||
| if (!mConfigInfoStatus) | |||
| return; | |||
| for (int i = 0; i < mVolumeList.size(); i++) { | |||
| int id = mVolumeList.get(i); | |||
| if (id == mCurrentVolumeLevel) { | |||
| if (mVolumeList.size() - 1 == i) { | |||
| mCurrentVolumeLevel = mVolumeList.get(0); | |||
| } else { | |||
| mCurrentVolumeLevel = mVolumeList.get(++i); | |||
| } | |||
| break; | |||
| mCurrentVolumeLevel = mVolumeList.get(++i); | |||
| } | |||
| break; | |||
| } | |||
| mBleDevice.synVolume(mCurrentVolumeLevel); | |||
| break; | |||
| case R.id.btnSetLanguage: | |||
| if (!mConfigInfoStatus) | |||
| return; | |||
| List<Long> languageIdTypeListAll = TempInstrumentDeviceData.LANGUAGE_ID_ALL_TYPE_LIST;//协议支持的全部语言ID,按照顺序保存的 | |||
| long currentLanguageId = languageIdTypeListAll.get(mCurrentLanguageIndex);//获取当前的语言ID | |||
| int languageIndex = 0;//下一个语言的下标,在支持的语言ID表中 | |||
| for (int i = 0; i < mLanguageList.size(); i++) { | |||
| long id = mLanguageList.get(i); | |||
| //循环获得当前语言ID的下标 | |||
| if (id == currentLanguageId) { | |||
| //获取下一个语言下标 | |||
| if (i == mLanguageList.size() - 1) { | |||
| languageIndex = 0; | |||
| } else { | |||
| languageIndex = ++i; | |||
| } | |||
| break; | |||
| } | |||
| mBleDevice.synVolume(mCurrentVolumeLevel); | |||
| } else if (vId == R.id.btnSetLanguage) { | |||
| if (!mConfigInfoStatus) | |||
| return; | |||
| List<Long> languageIdTypeListAll = TempInstrumentDeviceData.LANGUAGE_ID_ALL_TYPE_LIST;//协议支持的全部语言ID,按照顺序保存的 | |||
| long currentLanguageId = languageIdTypeListAll.get(mCurrentLanguageIndex);//获取当前的语言ID | |||
| int languageIndex = 0;//下一个语言的下标,在支持的语言ID表中 | |||
| for (int i = 0; i < mLanguageList.size(); i++) { | |||
| long id = mLanguageList.get(i); | |||
| //循环获得当前语言ID的下标 | |||
| if (id == currentLanguageId) { | |||
| //获取下一个语言下标 | |||
| if (i == mLanguageList.size() - 1) { | |||
| languageIndex = 0; | |||
| } else { | |||
| languageIndex = ++i; | |||
| } | |||
| break; | |||
| } | |||
| long languageId = mLanguageList.get(languageIndex);//下一个语言要发送的语言ID | |||
| for (int i = 0; i < languageIdTypeListAll.size(); i++) { | |||
| long aLong = languageIdTypeListAll.get(i); | |||
| if (aLong == languageId) { | |||
| mCurrentLanguageIndex = i;//当前要发送的语言下标 | |||
| break; | |||
| } | |||
| } | |||
| long languageId = mLanguageList.get(languageIndex);//下一个语言要发送的语言ID | |||
| for (int i = 0; i < languageIdTypeListAll.size(); i++) { | |||
| long aLong = languageIdTypeListAll.get(i); | |||
| if (aLong == languageId) { | |||
| mCurrentLanguageIndex = i;//当前要发送的语言下标 | |||
| break; | |||
| } | |||
| } | |||
| mBleDevice.synLanguage(mCurrentLanguageIndex); | |||
| break; | |||
| case R.id.btnAutoOpen: | |||
| if (mCurrentAutoOpen == 1) { | |||
| mCurrentAutoOpen = 0; | |||
| } else { | |||
| mCurrentAutoOpen = 1; | |||
| } | |||
| mBleDevice.synAutoOpen(mCurrentAutoOpen); | |||
| break; | |||
| case R.id.btnTempBroadcast: | |||
| if (mCurrentTempBroadcast == 1) { | |||
| mCurrentTempBroadcast = 0; | |||
| } else { | |||
| mCurrentTempBroadcast = 1; | |||
| } | |||
| mBleDevice.synTempBroadcast(mCurrentTempBroadcast); | |||
| break; | |||
| case R.id.btnTestTempDistance: | |||
| if (!mConfigInfoStatus) | |||
| return; | |||
| for (int i = 0; i < mDistanceList.size(); i++) { | |||
| int id = mDistanceList.get(i); | |||
| if (id == mCurrentTestTempDistanceId) { | |||
| if (mDistanceList.size() - 1 == i) { | |||
| mCurrentTestTempDistanceId = mDistanceList.get(0); | |||
| } else { | |||
| mCurrentTestTempDistanceId = mDistanceList.get(++i); | |||
| } | |||
| break; | |||
| mBleDevice.synLanguage(mCurrentLanguageIndex); | |||
| } else if (vId == R.id.btnAutoOpen) { | |||
| if (mCurrentAutoOpen == 1) { | |||
| mCurrentAutoOpen = 0; | |||
| } else { | |||
| mCurrentAutoOpen = 1; | |||
| } | |||
| mBleDevice.synAutoOpen(mCurrentAutoOpen); | |||
| } else if (vId == R.id.btnTempBroadcast) { | |||
| if (mCurrentTempBroadcast == 1) { | |||
| mCurrentTempBroadcast = 0; | |||
| } else { | |||
| mCurrentTempBroadcast = 1; | |||
| } | |||
| mBleDevice.synTempBroadcast(mCurrentTempBroadcast); | |||
| } else if (vId == R.id.btnTestTempDistance) { | |||
| if (!mConfigInfoStatus) | |||
| return; | |||
| for (int i = 0; i < mDistanceList.size(); i++) { | |||
| int id = mDistanceList.get(i); | |||
| if (id == mCurrentTestTempDistanceId) { | |||
| if (mDistanceList.size() - 1 == i) { | |||
| mCurrentTestTempDistanceId = mDistanceList.get(0); | |||
| } else { | |||
| mCurrentTestTempDistanceId = mDistanceList.get(++i); | |||
| } | |||
| break; | |||
| } | |||
| mBleDevice.synTestTempDistance(mCurrentTestTempDistanceId); | |||
| break; | |||
| case R.id.btnBeep: | |||
| if (!mConfigInfoStatus) | |||
| return; | |||
| for (int i = 0; i < mBeepList.size(); i++) { | |||
| int id = mBeepList.get(i); | |||
| if (id == mCurrentBeepId) { | |||
| if (mBeepList.size() - 1 == i) { | |||
| mCurrentBeepId = mBeepList.get(0); | |||
| } else { | |||
| mCurrentBeepId = mBeepList.get(++i); | |||
| } | |||
| break; | |||
| } | |||
| mBleDevice.synTestTempDistance(mCurrentTestTempDistanceId); | |||
| } else if (vId == R.id.btnBeep) { | |||
| if (!mConfigInfoStatus) | |||
| return; | |||
| for (int i = 0; i < mBeepList.size(); i++) { | |||
| int id = mBeepList.get(i); | |||
| if (id == mCurrentBeepId) { | |||
| if (mBeepList.size() - 1 == i) { | |||
| mCurrentBeepId = mBeepList.get(0); | |||
| } else { | |||
| mCurrentBeepId = mBeepList.get(++i); | |||
| } | |||
| break; | |||
| } | |||
| mBleDevice.synBeepType(mCurrentBeepId); | |||
| break; | |||
| case R.id.btnAlarmSound: | |||
| if (!mConfigInfoStatus) | |||
| return; | |||
| for (int i = 0; i < mAlarmSoundList.size(); i++) { | |||
| int id = mAlarmSoundList.get(i); | |||
| if (id == mCurrentAlarmSoundId) { | |||
| if (mAlarmSoundList.size() - 1 == i) { | |||
| mCurrentAlarmSoundId = mAlarmSoundList.get(0); | |||
| } else { | |||
| mCurrentAlarmSoundId = mAlarmSoundList.get(++i); | |||
| } | |||
| break; | |||
| } | |||
| mBleDevice.synBeepType(mCurrentBeepId); | |||
| } else if (vId == R.id.btnAlarmSound) { | |||
| if (!mConfigInfoStatus) | |||
| return; | |||
| for (int i = 0; i < mAlarmSoundList.size(); i++) { | |||
| int id = mAlarmSoundList.get(i); | |||
| if (id == mCurrentAlarmSoundId) { | |||
| if (mAlarmSoundList.size() - 1 == i) { | |||
| mCurrentAlarmSoundId = mAlarmSoundList.get(0); | |||
| } else { | |||
| mCurrentAlarmSoundId = mAlarmSoundList.get(++i); | |||
| } | |||
| break; | |||
| } | |||
| mBleDevice.synAlarmSoundType(mCurrentAlarmSoundId); | |||
| break; | |||
| case R.id.btnTempBodyAdd: | |||
| mBleDevice.synBodyTempAdd(0x00); | |||
| break; | |||
| case R.id.btnTempBodyLess: | |||
| mBleDevice.synBodyTempAdd(0x01); | |||
| break; | |||
| case R.id.btnTempObjectAdd: | |||
| mBleDevice.synObjectTempAdd(0x00); | |||
| break; | |||
| case R.id.btnTempObjectLess: | |||
| mBleDevice.synObjectTempAdd(0x01); | |||
| break; | |||
| case R.id.btnTempErr: | |||
| if (mBleDevice != null) { | |||
| int tempC = Integer.parseInt(etAlarmTempC.getText().toString().trim()); | |||
| int tempF = Integer.parseInt(etAlarmTempF.getText().toString().trim()); | |||
| mBleDevice.synAlarmTemp(tempC, tempF); | |||
| } | |||
| break; | |||
| case R.id.btnSetSensitivity://设置灵敏度 | |||
| if (!mConfigInfoStatus) | |||
| return; | |||
| for (int i = 0; i < mSensitivityList.size(); i++) { | |||
| int id = mSensitivityList.get(i); | |||
| if (id == mCurrentSensitivityLevel) { | |||
| if (mSensitivityList.size() - 1 == i) { | |||
| mCurrentSensitivityLevel = mSensitivityList.get(0); | |||
| } else { | |||
| mCurrentSensitivityLevel = mSensitivityList.get(++i); | |||
| } | |||
| break; | |||
| } | |||
| mBleDevice.synAlarmSoundType(mCurrentAlarmSoundId); | |||
| } else if (vId == R.id.btnTempBodyAdd) { | |||
| mBleDevice.synBodyTempAdd(0x00); | |||
| } else if (vId == R.id.btnTempBodyLess) { | |||
| mBleDevice.synBodyTempAdd(0x01); | |||
| } else if (vId == R.id.btnTempObjectAdd) { | |||
| mBleDevice.synObjectTempAdd(0x00); | |||
| } else if (vId == R.id.btnTempObjectLess) { | |||
| mBleDevice.synObjectTempAdd(0x01); | |||
| } else if (vId == R.id.btnTempErr) { | |||
| if (mBleDevice != null) { | |||
| int tempC = Integer.parseInt(etAlarmTempC.getText().toString().trim()); | |||
| int tempF = Integer.parseInt(etAlarmTempF.getText().toString().trim()); | |||
| mBleDevice.synAlarmTemp(tempC, tempF); | |||
| } | |||
| } else if (vId == R.id.btnSetSensitivity) {//设置灵敏度 | |||
| if (!mConfigInfoStatus) | |||
| return; | |||
| for (int i = 0; i < mSensitivityList.size(); i++) { | |||
| int id = mSensitivityList.get(i); | |||
| if (id == mCurrentSensitivityLevel) { | |||
| if (mSensitivityList.size() - 1 == i) { | |||
| mCurrentSensitivityLevel = mSensitivityList.get(0); | |||
| } else { | |||
| mCurrentSensitivityLevel = mSensitivityList.get(++i); | |||
| } | |||
| break; | |||
| } | |||
| mBleDevice.synSensitivity(mCurrentSensitivityLevel); | |||
| break; | |||
| case R.id.btnAutoClose://自动关机 | |||
| if (!mConfigInfoStatus) | |||
| return; | |||
| for (int i = 0; i < mAutoCloseList.size(); i++) { | |||
| int id = mAutoCloseList.get(i); | |||
| if (id == mCurrentAutoCloseId) { | |||
| if (mAutoCloseList.size() - 1 == i) { | |||
| mCurrentAutoCloseId = mAutoCloseList.get(0); | |||
| } else { | |||
| mCurrentAutoCloseId = mAutoCloseList.get(++i); | |||
| } | |||
| break; | |||
| } | |||
| mBleDevice.synSensitivity(mCurrentSensitivityLevel); | |||
| } else if (vId == R.id.btnAutoClose) {//自动关机 | |||
| if (!mConfigInfoStatus) | |||
| return; | |||
| for (int i = 0; i < mAutoCloseList.size(); i++) { | |||
| int id = mAutoCloseList.get(i); | |||
| if (id == mCurrentAutoCloseId) { | |||
| if (mAutoCloseList.size() - 1 == i) { | |||
| mCurrentAutoCloseId = mAutoCloseList.get(0); | |||
| } else { | |||
| mCurrentAutoCloseId = mAutoCloseList.get(++i); | |||
| } | |||
| break; | |||
| } | |||
| mBleDevice.synAutoClose(mCurrentAutoCloseId); | |||
| break; | |||
| case R.id.btnReset: | |||
| if (mBleDevice != null) { | |||
| mBleDevice.reset(); | |||
| } | |||
| break; | |||
| } | |||
| mBleDevice.synAutoClose(mCurrentAutoCloseId); | |||
| } else if (vId == R.id.btnReset) { | |||
| if (mBleDevice != null) { | |||
| mBleDevice.reset(); | |||
| } | |||
| } | |||
| } | |||
| @@ -20,6 +20,7 @@ import androidx.fragment.app.FragmentManager; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
| public class EditParamsDialog extends DialogFragment implements View.OnClickListener { | |||
| /** | |||
| @@ -0,0 +1,246 @@ | |||
| package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_0020_hu_infrared_temp | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleAppNewBaseActivity | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_0020_hu_infrared_temp.viewmodel.Ble0020HpTempViewModel | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils | |||
| import android.os.Message | |||
| import android.view.View | |||
| import android.widget.ArrayAdapter | |||
| import android.widget.Button | |||
| import android.widget.EditText | |||
| import android.widget.ListView | |||
| import androidx.lifecycle.ViewModelProvider | |||
| import cn.net.aicare.modulelibrary.module.ble_0020_hu_infrared_temp.HpInfraredTempBleConfig | |||
| /** | |||
| * 华普红外测温枪 | |||
| * @author xing | |||
| * @date 2025/03/27 | |||
| * @constructor 创建[Ble0020HpInfraredTempActivity] | |||
| */ | |||
| class Ble0020HpInfraredTempActivity : BleAppNewBaseActivity(), View.OnClickListener { | |||
| private lateinit var btnPause: Button | |||
| private lateinit var btnContinue: Button | |||
| private lateinit var btnClear: Button | |||
| private lateinit var btnWakeup: Button | |||
| private lateinit var btnTest: Button | |||
| private lateinit var btnStopTest: Button | |||
| private lateinit var btnReset: Button | |||
| private lateinit var btnEmissivity: Button | |||
| private lateinit var btnAutoShutdown: Button | |||
| private lateinit var btnHighOrLowTemp: Button | |||
| private lateinit var btnGetDeviceStatus: Button | |||
| private lateinit var btnGetDeviceParameter: Button | |||
| private lateinit var etEmissivity: EditText | |||
| private lateinit var etAutoShutdown: EditText | |||
| private lateinit var etHighTemp: EditText | |||
| private lateinit var etLowTemp: EditText | |||
| private var mViewModel: Ble0020HpTempViewModel? = null | |||
| private var mAddress: String = "" | |||
| private val mList: ArrayList<String> = arrayListOf() | |||
| private var listAdapter: ArrayAdapter<String>? = null | |||
| private var mRefresh = true | |||
| override fun uiHandlerMessage(msg: Message?) { | |||
| } | |||
| override fun getLayoutId(): Int { | |||
| return R.layout.activity_ble_0020_hp_infrared_temp | |||
| } | |||
| override fun initView() { | |||
| btnPause=findViewById(R.id.btnPause) | |||
| btnContinue=findViewById(R.id.btnContinue) | |||
| btnClear=findViewById(R.id.btnClear) | |||
| btnWakeup=findViewById(R.id.btnWakeup) | |||
| btnTest=findViewById(R.id.btnTest) | |||
| btnStopTest=findViewById(R.id.btnStopTest) | |||
| btnReset=findViewById(R.id.btnReset) | |||
| btnEmissivity=findViewById(R.id.btnEmissivity) | |||
| btnAutoShutdown=findViewById(R.id.btnAutoShutdown) | |||
| btnHighOrLowTemp=findViewById(R.id.btnHighOrLowTemp) | |||
| btnGetDeviceStatus=findViewById(R.id.btnGetDeviceStatus) | |||
| btnGetDeviceParameter=findViewById(R.id.btnGetDeviceParameter) | |||
| etEmissivity=findViewById(R.id.etEmissivity) | |||
| etAutoShutdown=findViewById(R.id.etAutoShutdown) | |||
| etHighTemp=findViewById(R.id.etHighTemp) | |||
| etLowTemp=findViewById(R.id.etLowTemp) | |||
| } | |||
| override fun initListener() { | |||
| btnPause.setOnClickListener(this) | |||
| btnContinue.setOnClickListener(this) | |||
| btnClear.setOnClickListener(this) | |||
| btnWakeup.setOnClickListener(this) | |||
| btnTest.setOnClickListener(this) | |||
| btnStopTest.setOnClickListener(this) | |||
| btnReset.setOnClickListener(this) | |||
| btnEmissivity.setOnClickListener(this) | |||
| btnAutoShutdown.setOnClickListener(this) | |||
| btnHighOrLowTemp.setOnClickListener(this) | |||
| btnGetDeviceStatus.setOnClickListener(this) | |||
| btnGetDeviceParameter.setOnClickListener(this) | |||
| mViewModel?.let { | |||
| it.showLogLiveData.observe(this) { | |||
| addLog(it) | |||
| } | |||
| } | |||
| } | |||
| override fun onClick(v: View?) { | |||
| when (v?.id) { | |||
| R.id.btnPause -> { | |||
| mRefresh = false | |||
| } | |||
| R.id.btnContinue -> { | |||
| mRefresh = true | |||
| } | |||
| R.id.btnClear -> { | |||
| clear() | |||
| } | |||
| R.id.btnWakeup -> { | |||
| mViewModel?.sendButtonCmd(HpInfraredTempBleConfig.CMD_WAKEUP) | |||
| addLog("发送唤醒") | |||
| } | |||
| R.id.btnTest -> { | |||
| mViewModel?.sendButtonCmd(HpInfraredTempBleConfig.CMD_TEST) | |||
| addLog("发送测量") | |||
| } | |||
| R.id.btnStopTest -> { | |||
| mViewModel?.sendButtonCmd(HpInfraredTempBleConfig.CMD_STOP_TEST) | |||
| addLog("发送停止测量") | |||
| } | |||
| R.id.btnReset -> { | |||
| mViewModel?.sendButtonCmd(HpInfraredTempBleConfig.CMD_RESET) | |||
| addLog("发送重置") | |||
| } | |||
| R.id.btnEmissivity -> { | |||
| val emissivity = etEmissivity.text.toString() | |||
| if (emissivity.isNotBlank()) { | |||
| val data = (emissivity.toFloat() * 100).toInt() | |||
| mViewModel?.sendEmissivity(data) | |||
| addLog("发送发射率:$data") | |||
| } | |||
| } | |||
| R.id.btnAutoShutdown -> { | |||
| val autoShutdown = etAutoShutdown.text.toString() | |||
| if (autoShutdown.isNotBlank()) { | |||
| mViewModel?.sendAutoShutdown(autoShutdown.toInt()) | |||
| addLog("发送自动关机:$autoShutdown") | |||
| } | |||
| } | |||
| R.id.btnHighOrLowTemp -> { | |||
| val tempHStr = etHighTemp.text.toString() | |||
| val tempLStr = etLowTemp.text.toString() | |||
| if (tempHStr.isNotBlank() && tempLStr.isNotBlank()) { | |||
| val tempH = tempHStr.toInt() | |||
| val tempL = tempLStr.toInt() | |||
| val signH = if (tempH > 0) { | |||
| HpInfraredTempBleConfig.PLUS | |||
| } else { | |||
| HpInfraredTempBleConfig.MINUS | |||
| } | |||
| val signL = if (tempL > 0) { | |||
| HpInfraredTempBleConfig.PLUS | |||
| } else { | |||
| HpInfraredTempBleConfig.MINUS | |||
| } | |||
| mViewModel?.sendWarmInfo(HpInfraredTempBleConfig.TEMP_C, signH, signL, tempH, tempL) | |||
| addLog("发送高低温报警:高温=${tempHStr}℃,低温=${tempLStr}℉") | |||
| } | |||
| } | |||
| R.id.btnGetDeviceStatus -> { | |||
| mViewModel?.sendGetDeviceStatus() | |||
| addLog("发送获取设备状态") | |||
| } | |||
| R.id.btnGetDeviceParameter -> { | |||
| mViewModel?.sendGetDeviceParameter() | |||
| addLog("发送获取设备参数") | |||
| } | |||
| else -> {} | |||
| } | |||
| } | |||
| override fun initData() { | |||
| mContext = this | |||
| val mac = intent.getStringExtra("mac") | |||
| if (mac.isNullOrBlank()) { | |||
| finish() | |||
| return | |||
| } | |||
| mAddress = mac | |||
| mViewModel = ViewModelProvider(this)[Ble0020HpTempViewModel::class.java] | |||
| if (isServiceBind) { | |||
| onServiceSuccess() | |||
| } | |||
| val listView = findViewById<ListView>(R.id.listview) | |||
| listAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, mList) | |||
| listView.adapter = listAdapter | |||
| } | |||
| private fun addLog(msg: String) { | |||
| if (!mRefresh) { | |||
| return | |||
| } | |||
| mList.add(TimeUtils.getTimeSSS() + msg) | |||
| listAdapter!!.notifyDataSetChanged() | |||
| } | |||
| private fun clear() { | |||
| mList.clear() | |||
| listAdapter!!.notifyDataSetChanged() | |||
| } | |||
| private var isServiceBind = false | |||
| override fun onServiceSuccess() { | |||
| isServiceBind = true | |||
| if (mAddress.isNotBlank()) { | |||
| val bleDevice = mBleManager?.getBleDevice(mAddress) | |||
| bleDevice?.let { | |||
| mViewModel?.initDevice(it) | |||
| } | |||
| } | |||
| } | |||
| override fun onServiceErr() { | |||
| } | |||
| override fun unbindServices() { | |||
| } | |||
| } | |||
| @@ -0,0 +1,361 @@ | |||
| package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_0020_hu_infrared_temp.viewmodel | |||
| import androidx.lifecycle.MutableLiveData | |||
| import androidx.lifecycle.ViewModel | |||
| import cn.net.aicare.modulelibrary.module.ble_0020_hu_infrared_temp.HpInfraredTempBleDataCmdUtils | |||
| import cn.net.aicare.modulelibrary.module.ble_0020_hu_infrared_temp.HpInfraredTempBleDeviceData | |||
| import com.pingwang.bluetoothlib.device.BleDevice | |||
| /** | |||
| * 华普红外测温枪视图模型 | |||
| * @author xing | |||
| * @date 2025/03/27 | |||
| * @constructor 创建[Ble0020HpTempViewModel] | |||
| */ | |||
| class Ble0020HpTempViewModel : ViewModel(), HpInfraredTempBleDeviceData.OnBleDeviceInfoListener, HpInfraredTempBleDeviceData.OnBleSetStatusListener, | |||
| HpInfraredTempBleDeviceData.OnBleAlarmResultListener { | |||
| val showLogLiveData by lazy { MutableLiveData<String>() } | |||
| var mHpInfraredTempBleDeviceData: HpInfraredTempBleDeviceData? = null | |||
| fun initDevice(bleDevice: BleDevice) { | |||
| HpInfraredTempBleDeviceData.init(bleDevice) | |||
| mHpInfraredTempBleDeviceData = HpInfraredTempBleDeviceData.getInstance() | |||
| } | |||
| /** | |||
| * 发送获取设备状态 | |||
| */ | |||
| fun sendGetDeviceStatus() { | |||
| val checkDeviceStatus = HpInfraredTempBleDataCmdUtils.checkDeviceStatus() | |||
| mHpInfraredTempBleDeviceData?.sendData(checkDeviceStatus) | |||
| } | |||
| /** | |||
| * 发送按钮CMD | |||
| * @param [type] 类型 {@link HpInfraredTempBleConfig#CMD_WAKEUP ...} | |||
| */ | |||
| fun sendButtonCmd(type: Int) { | |||
| val setCmd = HpInfraredTempBleDataCmdUtils.setCmd(type) | |||
| mHpInfraredTempBleDeviceData?.sendData(setCmd) | |||
| } | |||
| /** | |||
| * 发送发射率 | |||
| * @param [emissivity] 发射率 | |||
| */ | |||
| fun sendEmissivity(emissivity: Int) { | |||
| val setEmissivity = HpInfraredTempBleDataCmdUtils.setEmissivity(emissivity) | |||
| mHpInfraredTempBleDeviceData?.sendData(setEmissivity) | |||
| } | |||
| /** | |||
| * 发送自动关机 | |||
| * @param [time] 时间s | |||
| */ | |||
| fun sendAutoShutdown(time: Int) { | |||
| val setAutoShutdown = HpInfraredTempBleDataCmdUtils.setAutoShutdown(time) | |||
| mHpInfraredTempBleDeviceData?.sendData(setAutoShutdown) | |||
| } | |||
| /** | |||
| * 发送报警信息 | |||
| */ | |||
| fun sendWarmInfo(unit: Int, signH: Int, signL: Int, tempH: Int, tempL: Int) { | |||
| val setWarmInfo = HpInfraredTempBleDataCmdUtils.setWarm(unit, signH, signL, tempH, tempL) | |||
| mHpInfraredTempBleDeviceData?.sendData(setWarmInfo) | |||
| } | |||
| /** | |||
| * 发送获取设备参数 | |||
| */ | |||
| fun sendGetDeviceParameter() { | |||
| val getDeviceParameter = HpInfraredTempBleDataCmdUtils.getDeviceParameter() | |||
| mHpInfraredTempBleDeviceData?.sendData(getDeviceParameter) | |||
| } | |||
| /** | |||
| * 设备状态1 | |||
| * | |||
| * @param scanOrHold 状态 0:SCAN。1:HOLD | |||
| * @param tempUnit 单位 0:℃ 。 1:℉ | |||
| * @param laser 激光灯 0:关闭 。1:打开 | |||
| * @param backLamp 背光灯 0:关闭 。1:打开 | |||
| * @param lowBattery 低电 0:不低电 。1:低电 | |||
| * @param alarmH 高位报警 0:不报警 。 1:正在报警 | |||
| * @param alarmL 低温报警 0:不报警 。 1:正在报警 | |||
| * @param flashlight 手电筒灯 0:关闭 。1:打开 | |||
| * @param mode 模式 0x00:REC(设备端查看历史记录时发送该模式,APP 不保存该模式的数据) | |||
| * 0x01:MAX;0x02:AVG;0x03:MIN;0x04:DIF;0x05:LAL;0x06:HAL;0x07:EMS(设备端查看发射率);0x08:HAL—Warming—T;0x09:LAL—Warming—T | |||
| * 0x0A:EMS(设备端设置发射率) | |||
| * @param mainTag 主区数据标识:显示标识:0:不显示。1:显示 | |||
| * @param mainSign 主区数据标识:数据正负:0:正值。 1:负值 | |||
| * @param mainDecimal 主区数据标识:数据小数点:0:无小数点。1:带 1 位小数 | |||
| * @param subTag 附区数据标识:显示标识:0:不显示。1:显示 | |||
| * @param subSign 附区数据标识:数据正负:0:正值。 1:负值 | |||
| * @param subDecimal 附区数据标识:数据小数点:0:无小数点。1:带 1 位小数 | |||
| * @param mainValue 主区数值 | |||
| * @param subValue 附区数值 | |||
| * @param ems EMS 数值 10~100(显示0.10 ~1.00) | |||
| * @param autoShutdown 自动睡眠时间 | |||
| */ | |||
| override fun onDeviceStatus1( | |||
| scanOrHold: Int, tempUnit: Int, laser: Int, backLamp: Int, lowBattery: Int, alarmH: Int, alarmL: Int, | |||
| flashlight: Int, mode: Int, mainTag: Int, mainSign: Int, mainDecimal: Int, subTag: Int, subSign: Int, subDecimal: Int, mainValue: Int, | |||
| subValue: Int, ems: Int, autoShutdown: Int | |||
| ) { | |||
| var msg = "" | |||
| msg += "状态:" + if (scanOrHold == 0) { | |||
| "SCAN" | |||
| } else { | |||
| "HOLD" | |||
| } + "\n" | |||
| msg += " 单位:" + if (tempUnit == 0) { | |||
| "℃" | |||
| } else { | |||
| "℉" | |||
| } | |||
| msg += " 激光灯:" + if (laser == 0) { | |||
| "关闭" | |||
| } else { | |||
| "打开" | |||
| } | |||
| msg += "背光灯:" + if (backLamp == 0) { | |||
| "关闭" | |||
| } else { | |||
| "打开" | |||
| } + "\n" | |||
| msg += " 低电:" + if (lowBattery == 0) { | |||
| "不低电" | |||
| } else { | |||
| "低电" | |||
| } | |||
| msg += " 高温报警:" + if (alarmH == 0) { | |||
| "不报警" | |||
| } else { | |||
| "正在报警" | |||
| } + "\n" | |||
| msg += " 低温报警:" + if (alarmL == 0) { | |||
| "不报警" | |||
| } else { | |||
| "正在报警" | |||
| } | |||
| msg += " 手电筒灯:" + if (flashlight == 0) { | |||
| "关闭" | |||
| } else { | |||
| "打开" | |||
| } + "\n" | |||
| msg += "模式:" + when (mode) { | |||
| 0x00 -> { | |||
| "REC" | |||
| } | |||
| 0x01 -> { | |||
| "MAX" | |||
| } | |||
| 0x02 -> { | |||
| "AVG" | |||
| } | |||
| 0x03 -> { | |||
| "MIN" | |||
| } | |||
| 0x04 -> { | |||
| "DIF" | |||
| } | |||
| 0x05 -> { | |||
| "LAL" | |||
| } | |||
| 0x06 -> { | |||
| "HAL" | |||
| } | |||
| 0x07 -> { | |||
| "EMS" | |||
| } | |||
| 0x08 -> { | |||
| "HAL—Warming—T" | |||
| } | |||
| 0x09 -> { | |||
| "LAL—Warming—T" | |||
| } | |||
| 0x0A -> { | |||
| "EMS" | |||
| } | |||
| else -> { | |||
| "未知" | |||
| } | |||
| } + "\n" | |||
| if (mainTag == 1) { | |||
| var showMainValue = mainValue.toFloat() | |||
| if (mainDecimal == 1) { | |||
| showMainValue /= 10F | |||
| } | |||
| if (mainSign == 1) { | |||
| showMainValue = -showMainValue | |||
| } | |||
| msg += "主区数值:${showMainValue}" | |||
| } | |||
| if (subTag == 1) { | |||
| var showSubValue = subValue.toFloat() | |||
| if (subDecimal == 1) { | |||
| showSubValue /= 10F | |||
| } | |||
| if (subSign == 1) { | |||
| showSubValue = -showSubValue | |||
| } | |||
| msg += "附区数值:${showSubValue}" | |||
| } | |||
| msg += "附区数值:${subValue}" | |||
| msg += "EMS 数值:${ems / 100F}" | |||
| msg += "自动睡眠时间:$autoShutdown" | |||
| showLogLiveData.postValue(msg) | |||
| } | |||
| /** | |||
| * 设备状态2 | |||
| * | |||
| * @param scanOrHold 状态 0:SCAN。1:HOLD | |||
| * @param dewTempSign 露点温度标志:0:正数 , 1:负数 | |||
| * @param dewTempDecimal 露点温度小数点: 0:无小数, 1: 1 个小数 | |||
| * @param dewTemp 露点温度 | |||
| * @param humidity 环境湿度:单位% | |||
| * @param envTempSign 环境温度正负:0:正数 , 1:负数 | |||
| * @param envTempDecimal 环境温度小数点: 0:无小数, 1: 1 个小数 | |||
| * @param envTemp 环境温度 | |||
| */ | |||
| override fun onDeviceStatus2( | |||
| scanOrHold: Int, dewTempSign: Int, dewTempDecimal: Int, dewTemp: Int, humidity: Int, envTempSign: Int, | |||
| envTempDecimal: Int, envTemp: Int | |||
| ) { | |||
| var msg = "" | |||
| msg += "状态:" + if (scanOrHold == 0) { | |||
| "SCAN" | |||
| } else { | |||
| "HOLD" | |||
| } + "\n" | |||
| msg += "环境湿度:${humidity}%" | |||
| var showDewTemp = dewTemp.toFloat() | |||
| if (dewTempDecimal == 1) { | |||
| showDewTemp /= 10F | |||
| } | |||
| if (dewTempSign == 1) { | |||
| showDewTemp = -showDewTemp | |||
| } | |||
| msg += "露点温度:${showDewTemp}" | |||
| var showEnvTemp = envTemp.toFloat() | |||
| if (envTempDecimal == 1) { | |||
| showEnvTemp /= 10F | |||
| } | |||
| if (envTempSign == 1) { | |||
| showEnvTemp = -showEnvTemp | |||
| } | |||
| msg += "环境温度:${showEnvTemp}" | |||
| showLogLiveData.postValue(msg) | |||
| } | |||
| /** | |||
| * 设备参数 | |||
| * | |||
| * @param emissivity 发射率:2 个小数;范围 0.10 ~ 1.00 (对应的是 10-100) | |||
| * @param autoShutdown 自动关机时间 | |||
| * @param alarmHSign 数据标识:高温报警数据(正负值:0:正值 。1:负值) | |||
| * @param alarmHUnit 数据标识:高温报警数据(单位:0:℃ 。1:℉) | |||
| * @param alarmLSign 数据标识:低温报警数据(正负值:0:正值 。1:负值) | |||
| * @param alarmLUnit 数据标识:低温报警数据(单位:0:℃ 。1:℉) | |||
| * @param alarmH 高温报警数据 | |||
| * @param alarmL 低温报警数据 | |||
| */ | |||
| override fun onDeviceParameter( | |||
| emissivity: Int, autoShutdown: Int, alarmHSign: Int, alarmHUnit: Int, alarmLSign: Int, alarmLUnit: Int, alarmH: Int, alarmL: Int | |||
| ) { | |||
| var msg = "发射率:${emissivity / 100F} 自动关机时间:${autoShutdown}\n" | |||
| var showAlarmHValue = alarmH.toFloat() | |||
| if (alarmHSign == 1) { | |||
| showAlarmHValue = -showAlarmHValue | |||
| } | |||
| msg += "高温报警数据:${showAlarmHValue}${ | |||
| if (alarmHUnit == 0) { | |||
| "℃" | |||
| } else { | |||
| "℉" | |||
| } | |||
| }\n" | |||
| var showAlarmLValue = alarmH.toFloat() | |||
| if (alarmLSign == 1) { | |||
| showAlarmLValue = -showAlarmLValue | |||
| } | |||
| msg += "低温报警数据:${showAlarmLValue}${ | |||
| if (alarmLUnit == 0) { | |||
| "℃" | |||
| } else { | |||
| "℉" | |||
| } | |||
| }" | |||
| showLogLiveData.postValue(msg) | |||
| } | |||
| /** | |||
| * 关于发射率结果 | |||
| * @param [status] 状态 | |||
| */ | |||
| override fun onEmissivityResult(status: Int) { | |||
| showLogLiveData.postValue( | |||
| "发射率设置:${ | |||
| if (status == 0) { | |||
| "成功" | |||
| } else { | |||
| "失败" | |||
| } | |||
| }" | |||
| ) | |||
| } | |||
| /** | |||
| * 自动关机结果 | |||
| * @param [status] 状态 | |||
| */ | |||
| override fun onAutoShutDownResult(status: Int) { | |||
| showLogLiveData.postValue( | |||
| "自动关机时间设置:${ | |||
| if (status == 0) { | |||
| "成功" | |||
| } else { | |||
| "失败" | |||
| } | |||
| }" | |||
| ) | |||
| } | |||
| /** | |||
| * 报警结果 | |||
| * @param [status] 状态 | |||
| */ | |||
| override fun onAlarmResult(status: Int) { | |||
| showLogLiveData.postValue( | |||
| "高低温报警值设置:${ | |||
| if (status == 0) { | |||
| "成功" | |||
| } else { | |||
| "失败" | |||
| } | |||
| }" | |||
| ) | |||
| } | |||
| } | |||
| @@ -26,12 +26,6 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
| import cn.net.aicare.modulelibrary.module.BleNutrition.BleNutritionData; | |||
| import cn.net.aicare.modulelibrary.module.BleNutrition.BleNutritionHistoryBean; | |||
| /** | |||
| * ble营养界面 | |||
| * | |||
| * @author xing | |||
| * @date 2024/10/28 | |||
| */ | |||
| public class BleNutritionActivity extends BleBaseActivity implements View.OnClickListener, BleNutritionData.BleNutritionCallback, OnBleSettingListener { | |||
| private static final String TAG = "Tag1"; | |||
| @@ -206,9 +200,17 @@ public class BleNutritionActivity extends BleBaseActivity implements View.OnClic | |||
| // 小数点 | |||
| w = (float) (w / Math.pow(10, decimal)); | |||
| // 保留小数位 | |||
| String weightStr = getPreFloatStr(w, decimal); | |||
| String str = "MCU上发重量:" + weightStr + getUnitStr(unit) + "\n流水号:" + no + ",原始重量:" + weight + ",单位:" + unit + ",小数点:" + decimal + ",符号:" + symbol + ",重量类型:" + type; | |||
| String weightStr = ""; | |||
| if (unit == 2) { | |||
| int lb = (int) (w / 16); | |||
| float oz = w - (lb * 16); | |||
| weightStr = lb + ":" + getPreFloatStr(oz, decimal); | |||
| } else { | |||
| weightStr = getPreFloatStr(w, decimal); | |||
| } | |||
| String str = "MCU上发重量:" + weightStr +" "+ getUnitStr(unit) + "\n流水号:" + no + ",原始重量:" + weight + ",单位:" + unit + ",小数点:" + decimal + ",符号:" + symbol + ",重量类型:" + type; | |||
| addText(str); | |||
| } | |||
| @@ -198,22 +198,30 @@ public class BleNutritionNutrientActivity extends BleBaseActivity implements Vie | |||
| // 小数点 | |||
| w = (float) (w / Math.pow(10, decimal)); | |||
| // 保留小数位 | |||
| String weightStr = getPreFloatStr(w, decimal); | |||
| String weightStr = ""; | |||
| if (unit == 2) { | |||
| int lb = (int) (w / 16); | |||
| float oz = w - (lb * 16); | |||
| weightStr = lb + ":" + getPreFloatStr(oz, decimal); | |||
| } else { | |||
| weightStr = getPreFloatStr(w, decimal); | |||
| } | |||
| String str = "MCU上发重量:" + weightStr + getUnitStr(unit) + "\n流水号:" + no + ",原始重量:" + weight + ",单位:" + unit + ",小数点:" + decimal + ",符号:" + symbol + ",重量类型:" + type; | |||
| String str = "MCU上发重量:" + weightStr +" "+ getUnitStr(unit) + "\n流水号:" + no + ",原始重量:" + weight + ",单位:" + unit + ",小数点:" + decimal + ",符号:" + symbol + ",重量类型:" + type; | |||
| addText(str); | |||
| if (type == 2) { | |||
| if (foodNutrientBean != null ) { | |||
| //稳定重量 | |||
| if (unit == 0x04) { | |||
| if (unit == 0x04) {//kg | |||
| foodNutrientBean.setWeightToG(Double.parseDouble(weightStr)*1000); | |||
| }else if (unit == 0x05){ | |||
| }else if (unit == 0x05){//斤 | |||
| foodNutrientBean.setWeightToG(Double.parseDouble(weightStr)*500); | |||
| }else if (unit == 0x00){ | |||
| }else if (unit == 0x00){//G | |||
| foodNutrientBean.setWeightToG(Double.parseDouble(weightStr)); | |||
| }else if (unit == 0x03){ | |||
| }else if (unit == 0x03){//oz | |||
| foodNutrientBean.setWeightToG(UnitUtils.ozToG(Float.parseFloat(weightStr))); | |||
| }else { | |||
| addText("不支持的重量单位,当前只支持g,oz,kg,斤:" + unit); | |||
| @@ -0,0 +1,455 @@ | |||
| package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_speed_test | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.KBleBaseNewActivity | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.databinding.ActivityBleSpeedTestBinding | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.CoroutineUtils | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.toUnsignedInt | |||
| import android.bluetooth.BluetoothDevice | |||
| import android.bluetooth.BluetoothGattCharacteristic | |||
| import android.net.Uri | |||
| import android.os.Build | |||
| import android.os.Handler | |||
| import android.os.Looper | |||
| import android.os.Message | |||
| import android.text.TextUtils | |||
| import android.view.View | |||
| import android.widget.ArrayAdapter | |||
| import androidx.activity.result.contract.ActivityResultContracts | |||
| import androidx.annotation.RequiresApi | |||
| import com.pingwang.bluetoothlib.config.BleConfig | |||
| import com.pingwang.bluetoothlib.device.AiLinkBleCheckUtil | |||
| import com.pingwang.bluetoothlib.device.BleDevice | |||
| import com.pingwang.bluetoothlib.device.SendDataBean | |||
| import com.pingwang.bluetoothlib.listener.OnBleMtuListener | |||
| import com.pingwang.bluetoothlib.listener.OnBleOtherDataListener | |||
| import com.pingwang.bluetoothlib.listener.OnCallbackBle | |||
| import com.pingwang.bluetoothlib.listener.OnCharacteristicListener | |||
| import com.pingwang.bluetoothlib.utils.BleLog | |||
| import com.pingwang.bluetoothlib.utils.UuidUtils | |||
| import kotlinx.coroutines.CoroutineScope | |||
| import kotlinx.coroutines.Dispatchers | |||
| import kotlinx.coroutines.launch | |||
| import kotlinx.coroutines.withContext | |||
| import java.nio.charset.Charset | |||
| import java.nio.charset.StandardCharsets | |||
| import java.util.UUID | |||
| /** | |||
| * ble速度测试界面 | |||
| * @author xing | |||
| * @date 2025/09/12 | |||
| * @constructor 创建[BleSpeedTestActivity] | |||
| */ | |||
| class BleSpeedTestActivity : KBleBaseNewActivity<ActivityBleSpeedTestBinding>(), View.OnClickListener, OnCallbackBle, OnBleOtherDataListener { | |||
| private val REFRESH_DATA = 3 | |||
| private var mList: MutableList<String> = mutableListOf() | |||
| private var listAdapter: ArrayAdapter<String>? = null | |||
| private var mBleDevice: BleDevice? = null | |||
| private var sendUuid: UUID? = null | |||
| private var sendUuidServer: UUID? = null | |||
| private var sendUuidNotify: UUID? = null | |||
| private var mCount = 0L | |||
| // 指定每个分组的字节大小 | |||
| private val headMax = 12 // 1KB | |||
| private var mMtu = 514 // 1KB | |||
| private var mSendDataMax = 514 - headMax // 1KB | |||
| private val filePickerLauncher = registerForActivityResult(ActivityResultContracts.GetContent()) { uri -> | |||
| uri?.let { readFileChunks(it) } | |||
| } | |||
| private var mSelectFilePath = "" | |||
| private var mAddress: String? = "" | |||
| private var mSendList: MutableList<ByteArray> = mutableListOf() | |||
| private var mReadList: MutableList<ByteArray> = mutableListOf() | |||
| private var mWriteBytes: Long = 0 | |||
| private var mReadBytes: Long = 0 | |||
| private var mStartTime: Long = 0 | |||
| private var mStartWriteTime: Long = 0 | |||
| private var mStartReadTime: Long = 0 | |||
| private val mHandler = object : Handler(Looper.getMainLooper()) { | |||
| override fun handleMessage(msg: Message) { | |||
| super.handleMessage(msg) | |||
| when (msg.what) { | |||
| REFRESH_DATA -> { | |||
| listAdapter?.notifyDataSetChanged() | |||
| } | |||
| } | |||
| } | |||
| } | |||
| override fun getLayoutView(): ActivityBleSpeedTestBinding { | |||
| return ActivityBleSpeedTestBinding.inflate(layoutInflater) | |||
| } | |||
| override fun initListener() { | |||
| binding.btnUuid.setOnClickListener(this) | |||
| binding.btnUuidServer.setOnClickListener(this) | |||
| binding.btnNotify.setOnClickListener(this) | |||
| binding.btnSelectFile.setOnClickListener(this) | |||
| binding.btnWriteTest.setOnClickListener(this) | |||
| binding.btnReadTest.setOnClickListener(this) | |||
| } | |||
| override fun onClick(v: View) { | |||
| when (v.id) { | |||
| R.id.btn_uuid -> { | |||
| val uuid = binding.etUuid.getText().toString().trim { it <= ' ' }.uppercase() | |||
| sendUuid = UuidUtils.getUuid(uuid) | |||
| addLog("设置特征UUID") | |||
| } | |||
| R.id.btn_uuid_server -> { | |||
| val uuid = binding.etUuidServer.getText().toString().trim { it <= ' ' }.uppercase() | |||
| sendUuidServer = UuidUtils.getUuid(uuid) | |||
| addLog("设置服务UUID") | |||
| } | |||
| R.id.btn_notify -> { | |||
| // val notifyStr = binding.etUuid.getText().toString().trim { it <= ' ' }.uppercase() | |||
| sendUuidNotify = UuidUtils.getUuid("FFE2") | |||
| readNotify(sendUuidNotify) | |||
| readNotify(UuidUtils.getUuid("FFE3")) | |||
| addLog("打开notify") | |||
| } | |||
| R.id.btnSelectFile -> { | |||
| filePickerLauncher.launch("application/octet-stream") | |||
| } | |||
| R.id.btnWriteTest -> { | |||
| if (TextUtils.isEmpty(mSelectFilePath)) { | |||
| addLog("请选择文件") | |||
| return | |||
| } | |||
| if (mBleDevice == null) { | |||
| addLog("请先连接设备") | |||
| return | |||
| } | |||
| if (sendUuid == null) { | |||
| addLog("请先设置特征UUID") | |||
| return | |||
| } | |||
| if (sendUuidServer == null) { | |||
| addLog("请先设置服务UUID") | |||
| return | |||
| } | |||
| // sendStartWriteFile() | |||
| sendA5DataStart(mWriteBytes.toInt()) | |||
| } | |||
| R.id.btnReadTest -> { | |||
| sendStartReadFile() | |||
| } | |||
| } | |||
| } | |||
| override fun initData() { | |||
| mAddress = intent.getStringExtra("mac") | |||
| if (mAddress.isNullOrEmpty()) { | |||
| finish() | |||
| return | |||
| } | |||
| if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { | |||
| onServiceSuccess() | |||
| } | |||
| listAdapter = ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mList) | |||
| binding.listview.setAdapter(listAdapter) | |||
| } | |||
| @RequiresApi(Build.VERSION_CODES.O) | |||
| override fun onServiceSuccess() { | |||
| if (mBleManager != null && !TextUtils.isEmpty(mAddress)) { | |||
| mBleDevice = mBleManager.getBleDevice(mAddress) | |||
| mBleManager.setOnCallbackBle(this) | |||
| mBleDevice?.let { | |||
| it.setPreferredPhy(BluetoothDevice.PHY_LE_2M, BluetoothDevice.PHY_LE_2M) | |||
| it.setMtu(517) | |||
| it.setOnBleMtuListener(object : OnBleMtuListener { | |||
| override fun onMtuAvailable(mtu: Int) { | |||
| mMtu = mtu | |||
| mSendDataMax = mtu - headMax | |||
| } | |||
| }) | |||
| it.setOnBleOtherDataListener(this) | |||
| it.setOnCharacteristicListener(object : OnCharacteristicListener { | |||
| override fun onCharacteristicWriteOK(characteristic: BluetoothGattCharacteristic) { | |||
| BleLog.i("写入成功回调时间戳:${System.currentTimeMillis()}") | |||
| if (characteristic.uuid.toString() == sendUuid.toString()) { | |||
| val str = characteristic.value.toString(Charset.forName("UTF-8")) | |||
| if (str.startsWith("rate")) { | |||
| return | |||
| } | |||
| mCount += characteristic.value.size | |||
| runOnUiThread { | |||
| binding.tvSendNumber.text = (mCount).toString() | |||
| //发送完成 | |||
| val currentTimeMillis = System.currentTimeMillis() | |||
| val caT = (currentTimeMillis - mStartTime) / 1000F | |||
| val noCaT = (currentTimeMillis - mStartWriteTime) / 1000F | |||
| val kb = mCount / 1024 | |||
| binding.tvSpeedWrite.text = | |||
| "写速度:${kb / (caT)}KB/s(擦) ${kb / (noCaT)}KB/s 时间差(擦):${currentTimeMillis - mStartTime}" | |||
| } | |||
| } | |||
| } | |||
| }) | |||
| } | |||
| } | |||
| } | |||
| override fun onNotifyOtherData(uuid: String, data: ByteArray) { | |||
| val cmdStr = String(data, Charset.forName("UTF-8")) | |||
| if (cmdStr.startsWith("rateTx_ready") || checkA5StartData(data)) { | |||
| //写开始 | |||
| binding.tvSendNumber.text = "0" | |||
| mStartWriteTime = System.currentTimeMillis() | |||
| addLog("开始发送:${mStartWriteTime - mStartTime}") | |||
| val total = mSendList.size | |||
| for ((index, bytes) in mSendList.withIndex()) { | |||
| val a5Data = getA5Data(index, total, bytes) | |||
| sendData(a5Data) | |||
| } | |||
| sendA5DataEnd() | |||
| } else if (cmdStr.startsWith("rateRx_ready")) { | |||
| //读开始 | |||
| mStartReadTime = System.currentTimeMillis() | |||
| mReadBytes = 0 | |||
| binding.tvReceiveNumber.text = "0" | |||
| } else { | |||
| mReadBytes += data.size | |||
| mReadList.add(data) | |||
| CoroutineUtils.coroutineScopeIo { | |||
| withContext(Dispatchers.Main) { | |||
| if (mReadBytes >= mWriteBytes) { | |||
| val equal = areByteArrayListsEqual(mReadList, mSendList) | |||
| addLog("内容是否相等:$equal") | |||
| } | |||
| val currentTimeMillis = System.currentTimeMillis() | |||
| val lng = currentTimeMillis - mStartReadTime | |||
| val kb = mReadBytes / 1024 | |||
| binding.tvSpeedRead.text = "读速度:${kb / ((lng / 1000).toFloat())}KB/s 时间差:${lng}" | |||
| binding.tvReceiveNumber.text = (mReadBytes).toString() | |||
| } | |||
| } | |||
| } | |||
| } | |||
| fun areByteArrayListsEqual(list1: MutableList<ByteArray>, list2: MutableList<ByteArray>): Boolean { | |||
| // 先比较列表大小 | |||
| if (list1.size != list2.size) return false | |||
| // 使用索引逐个比较字节数组 | |||
| return list1.indices.all { index -> | |||
| list1[index].contentEquals(list2[index]) | |||
| } | |||
| } | |||
| override fun onServiceErr() { | |||
| addLog("服务绑定失败") | |||
| } | |||
| override fun unbindServices() { | |||
| addLog("服务解绑") | |||
| } | |||
| override fun onDisConnected(mac: String?, code: Int) { | |||
| super.onDisConnected(mac, code) | |||
| addLog("断开连接:$mac 错误码:$code") | |||
| } | |||
| private fun readFileChunks(uri: Uri) { | |||
| CoroutineScope(Dispatchers.Main).launch { | |||
| val path = uri.toString() | |||
| addLog("正在读取文件:$path") | |||
| mSelectFilePath = path | |||
| // binding.tvFileName.text = path.substring(path.lastIndexOf("test")) | |||
| val result = withContext(Dispatchers.IO) { | |||
| try { | |||
| contentResolver.openInputStream(uri)?.use { inputStream -> | |||
| // 创建 MutableList<ByteArray> 来存储分块数据 | |||
| mSendList.clear() | |||
| // 使用缓冲区读取文件,避免一次性加载大文件到内存 | |||
| val buffer = ByteArray(mSendDataMax) | |||
| var bytesRead: Int | |||
| mWriteBytes = 0 | |||
| while (inputStream.read(buffer).also { bytesRead = it } != -1) { | |||
| // 创建正确大小的字节数组副本 | |||
| val chunk = if (bytesRead < mSendDataMax) { | |||
| buffer.copyOf(bytesRead) | |||
| } else { | |||
| buffer.copyOf() // 创建副本,避免重用缓冲区 | |||
| } | |||
| mSendList.add(chunk) | |||
| mWriteBytes += bytesRead | |||
| } | |||
| // 构建结果字符串 | |||
| val stringBuilder = StringBuilder() | |||
| stringBuilder.append("文件读取成功!共 $mWriteBytes 字节,分成 ${mSendList.size} 个组\n\n") | |||
| stringBuilder.toString() | |||
| } ?: "无法打开文件流" | |||
| } catch (e: Exception) { | |||
| "读取文件时出错: ${e.message}" | |||
| } | |||
| } | |||
| addLog(result) | |||
| } | |||
| } | |||
| private fun sendStartWriteFile() { | |||
| binding.tvSendNumber.text = "" | |||
| binding.tvReceiveNumber.text = "" | |||
| mCount = 0 | |||
| mStartTime = System.currentTimeMillis() | |||
| val cmdStr = "rateTx_start:$mWriteBytes" | |||
| sendData(cmdStr.toByteArray(StandardCharsets.US_ASCII)) | |||
| mHandler.postDelayed({ | |||
| //0x7261746554785F7265616479 | |||
| val byteArray = byteArrayOf(0x72, 0x61, 0x74, 0x65, 0x54, 0x78, 0x5F, 0x72, 0x65, 0x61, 0x64, 0x79) | |||
| onNotifyOtherData("FFE2", byteArray) | |||
| }, 1000) | |||
| } | |||
| private fun sendStartReadFile() { | |||
| binding.tvSendNumber.text = "" | |||
| binding.tvReceiveNumber.text = "" | |||
| mReadList.clear() | |||
| val cmdStr = "rateRx_start:$mWriteBytes" | |||
| sendData(cmdStr.toByteArray(StandardCharsets.US_ASCII)) | |||
| } | |||
| private fun sendData(hex: ByteArray) { | |||
| val sendDataBean = SendDataBean(hex, sendUuid, BleConfig.WRITE_DATA, sendUuidServer) | |||
| mBleDevice?.sendDataNow(sendDataBean) | |||
| } | |||
| private fun sendA5DataStart(fileSize: Int) { | |||
| binding.tvSendNumber.text = "" | |||
| binding.tvReceiveNumber.text = "" | |||
| mCount = 0 | |||
| mStartTime = System.currentTimeMillis() | |||
| //包头+cid+长度+sum+包尾=7 | |||
| val a5Data = ByteArray(12) | |||
| val len = 0x07 | |||
| a5Data[0] = 0xA5.toByte() | |||
| a5Data[1] = 0x00 | |||
| a5Data[2] = len.toByte() | |||
| a5Data[3] = 0x01 | |||
| a5Data[4] = 0x02 | |||
| a5Data[5] = 0x00 | |||
| a5Data[6] = (fileSize shr 24).toByte() | |||
| a5Data[7] = (fileSize shr 16).toByte() | |||
| a5Data[8] = (fileSize shr 8).toByte() | |||
| a5Data[9] = fileSize.toByte() | |||
| val crcData = ByteArray(9) | |||
| System.arraycopy(a5Data, 1, crcData, 0, crcData.size) | |||
| val crc16 = AiLinkBleCheckUtil.getCrc16(crcData) | |||
| a5Data[a5Data.size - 2] = (crc16 shr 8).toByte() | |||
| a5Data[a5Data.size - 1] = crc16.toByte() | |||
| sendData(a5Data) | |||
| } | |||
| private fun checkA5StartData(data: ByteArray): Boolean { | |||
| return data[0].toUnsignedInt() == 0xA5 && data[3].toUnsignedInt() == 0x01 | |||
| } | |||
| /** | |||
| * 获取a5数据 | |||
| * | |||
| * @param cid cid | |||
| * @param data 数据 | |||
| * @return [byte[]] | |||
| */ | |||
| private fun getA5Data(count: Int, total: Int, data: ByteArray): ByteArray { | |||
| //包头+cid+长度+sum+包尾=7 | |||
| val a5Data = ByteArray(data.size + headMax) | |||
| val len = data.size + (headMax - 5) | |||
| a5Data[0] = 0xA5.toByte() | |||
| a5Data[1] = (len shr 8).toByte() | |||
| a5Data[2] = len.toByte() | |||
| a5Data[3] = 0x02 | |||
| a5Data[4] = 0x02 | |||
| a5Data[5] = (count shr 8).toByte() | |||
| a5Data[6] = count.toByte() | |||
| a5Data[7] = (total shr 8).toByte() | |||
| a5Data[8] = total.toByte() | |||
| val crcData = ByteArray(a5Data.size -3) | |||
| System.arraycopy(data, 0, a5Data, 9, data.size) | |||
| System.arraycopy(a5Data, 1, crcData, 0, crcData.size) | |||
| val crc16 = AiLinkBleCheckUtil.getCrc16(crcData) | |||
| a5Data[a5Data.size - 2] = (crc16 shr 8).toByte() | |||
| a5Data[a5Data.size - 1] = crc16.toByte() | |||
| return a5Data | |||
| } | |||
| private fun sendA5DataEnd() { | |||
| //包头+cid+长度+sum+包尾=7 | |||
| val a5Data = ByteArray(8) | |||
| val len = 0x03 | |||
| a5Data[0] = 0xA5.toByte() | |||
| a5Data[1] = 0x00 | |||
| a5Data[2] = len.toByte() | |||
| a5Data[3] = 0x03 | |||
| a5Data[4] = 0x02 | |||
| a5Data[5] = 0x00 | |||
| val crcData = ByteArray(5) | |||
| System.arraycopy(a5Data, 1, crcData, 0, crcData.size) | |||
| val crc16 = AiLinkBleCheckUtil.getCrc16(crcData) | |||
| a5Data[a5Data.size - 2] = (crc16 shr 8).toByte() | |||
| a5Data[a5Data.size - 1] = crc16.toByte() | |||
| sendData(a5Data) | |||
| } | |||
| /** | |||
| * 设置通知 | |||
| */ | |||
| private fun readNotify(uuidNotify: UUID?, notifyOpen: Boolean = true) { | |||
| if (uuidNotify == null) { | |||
| return | |||
| } | |||
| if (mBleDevice != null && sendUuidServer != null) { | |||
| if (notifyOpen) { | |||
| mBleDevice!!.setNotify(sendUuidServer, uuidNotify) | |||
| } else { | |||
| mBleDevice!!.setCloseNotify(sendUuidServer, uuidNotify) | |||
| } | |||
| } else { | |||
| mList.add(TimeUtils.getTime() + "请先设置特征UUID和服务UUID") | |||
| mHandler.sendEmptyMessage(REFRESH_DATA) | |||
| } | |||
| } | |||
| private var mShowLog = true | |||
| private fun addLog(log: String?) { | |||
| if (mShowLog) { | |||
| BleLog.i(log) | |||
| mList.add(TimeUtils.getTimeSSS() + log) | |||
| mHandler.sendEmptyMessage(REFRESH_DATA) | |||
| } | |||
| } | |||
| override fun onDestroy() { | |||
| super.onDestroy() | |||
| mBleDevice?.disconnect() | |||
| } | |||
| } | |||
| @@ -43,7 +43,7 @@ public class BloodGlucoseActivity extends BleBaseActivity implements OnCallbackB | |||
| super.onCreate(savedInstanceState); | |||
| setContentView(R.layout.activity_blood_glucose); | |||
| mAddress = getIntent().getStringExtra("mac"); | |||
| support_unit = findViewById(R.id.support_unit); | |||
| support_unit = findViewById(R.id.getSupportUnit); | |||
| quest_status = findViewById(R.id.quest_status); | |||
| showdata=findViewById(R.id.showdata); | |||
| test = findViewById(R.id.test); | |||
| @@ -25,9 +25,10 @@ import com.pingwang.bluetoothlib.utils.BleDensityUtil; | |||
| import com.pingwang.bluetoothlib.utils.BleLog; | |||
| import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||
| import java.text.SimpleDateFormat; | |||
| import java.util.ArrayList; | |||
| import java.util.List; | |||
| import java.util.UUID; | |||
| import java.util.Locale; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.BroadcastScaleActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
| @@ -38,6 +39,7 @@ import cn.net.aicare.modulelibrary.module.broadcastweightscale.BroadcastWeightSc | |||
| /** | |||
| * 广播体重秤 | |||
| * | |||
| * @auther ljl | |||
| * on 2023/3/10 | |||
| */ | |||
| @@ -81,21 +83,23 @@ public class BroadcastWeightScaleActivity extends BleNewBaseActivity implements | |||
| mContext = this; | |||
| // mAddress = getIntent().getStringExtra("mac"); | |||
| mBleSendCmdUtil = BleSendCmdUtil.getInstance(); | |||
| init(); | |||
| initView(); | |||
| initData(); | |||
| initListener(); | |||
| } | |||
| private void init() { | |||
| private void initData() { | |||
| mList = new ArrayList<>(); | |||
| ListView listView = findViewById(R.id.listview_weight); | |||
| listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | |||
| listView.setAdapter(listAdapter); | |||
| findViewById(R.id.clear_weight).setOnClickListener(this); | |||
| findViewById(R.id.open_weight).setOnClickListener(this); | |||
| findViewById(R.id.stop_weight).setOnClickListener(this); | |||
| ((RadioGroup) findViewById(R.id.radio_weight_weight)).setOnCheckedChangeListener(this); | |||
| } | |||
| private void initView() { | |||
| tv_broadcast_temp = findViewById(R.id.tv_broadcast_temp_weight); | |||
| mRadioButtonKg = findViewById(R.id.radio_weight_kg_weight); | |||
| @@ -105,6 +109,16 @@ public class BroadcastWeightScaleActivity extends BleNewBaseActivity implements | |||
| tv_broadcast_mac = findViewById(R.id.tv_broadcast_mac_weight); | |||
| tv_broadcast_did = findViewById(R.id.tv_broadcast_did_weight); | |||
| } | |||
| private void initListener() { | |||
| findViewById(R.id.clear_weight).setOnClickListener(this); | |||
| findViewById(R.id.open_weight).setOnClickListener(this); | |||
| findViewById(R.id.stop_weight).setOnClickListener(this); | |||
| ((RadioGroup) findViewById(R.id.radio_weight_weight)).setOnCheckedChangeListener(this); | |||
| } | |||
| @@ -114,20 +128,15 @@ public class BroadcastWeightScaleActivity extends BleNewBaseActivity implements | |||
| if (checkedId == -1) { | |||
| return;//不是人为点击不触发 | |||
| } | |||
| switch (group.getCheckedRadioButtonId()) { | |||
| case R.id.radio_weight_kg_weight: | |||
| mWeightUnit = BroadcastWeightScaleBleConfig.UNIT_KG; | |||
| break; | |||
| case R.id.radio_weight_jin_weight: | |||
| mWeightUnit = BroadcastWeightScaleBleConfig.UNIT_F; | |||
| break; | |||
| case R.id.radio_weight_st_lb_weight: | |||
| mWeightUnit = BroadcastWeightScaleBleConfig.UNIT_ST; | |||
| break; | |||
| case R.id.radio_weight_lb_lb_weight: | |||
| mWeightUnit = BroadcastWeightScaleBleConfig.UNIT_LB_LB; | |||
| break; | |||
| int checkedRadioButtonId = group.getCheckedRadioButtonId(); | |||
| if (checkedRadioButtonId == R.id.radio_weight_kg_weight) { | |||
| mWeightUnit = BroadcastWeightScaleBleConfig.UNIT_KG; | |||
| } else if (checkedRadioButtonId == R.id.radio_weight_jin_weight) { | |||
| mWeightUnit = BroadcastWeightScaleBleConfig.UNIT_F; | |||
| } else if (checkedRadioButtonId == R.id.radio_weight_st_lb_weight) { | |||
| mWeightUnit = BroadcastWeightScaleBleConfig.UNIT_ST; | |||
| } else if (checkedRadioButtonId == R.id.radio_weight_lb_lb_weight) { | |||
| mWeightUnit = BroadcastWeightScaleBleConfig.UNIT_LB_LB; | |||
| } | |||
| BleLog.i("ljl", "weightUnit:" + mWeightUnit); | |||
| } | |||
| @@ -155,25 +164,20 @@ public class BroadcastWeightScaleActivity extends BleNewBaseActivity implements | |||
| @Override | |||
| public void onClick(View v) { | |||
| switch (v.getId()) { | |||
| case R.id.clear_weight: | |||
| if (mList != null) { | |||
| mList.clear(); | |||
| } | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| break; | |||
| case R.id.open_weight: | |||
| if (AILinkBleManager.getInstance() != null) { | |||
| AILinkBleManager.getInstance().startScan(0, UUID.fromString("0000F0A0-0000-1000-8000-00805F9B34FB")); | |||
| } | |||
| break; | |||
| case R.id.stop_weight: | |||
| if (AILinkBleManager.getInstance() != null) { | |||
| AILinkBleManager.getInstance().stopScan(); | |||
| } | |||
| break; | |||
| default: | |||
| break; | |||
| int id = v.getId(); | |||
| if (id == R.id.clear_weight) { | |||
| if (mList != null) { | |||
| mList.clear(); | |||
| } | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } else if (id == R.id.open_weight) { | |||
| if (AILinkBleManager.getInstance() != null) { | |||
| AILinkBleManager.getInstance().startScan(0, BleConfig.UUID_SERVER_BROADCAST_AILINK); | |||
| } | |||
| } else if (id == R.id.stop_weight) { | |||
| if (AILinkBleManager.getInstance() != null) { | |||
| AILinkBleManager.getInstance().stopScan(); | |||
| } | |||
| } | |||
| } | |||
| @@ -183,7 +187,6 @@ public class BroadcastWeightScaleActivity extends BleNewBaseActivity implements | |||
| @Override | |||
| public void onServiceSuccess() { | |||
| BleLog.i("ljl", "服务与界面建立连接成功"); | |||
| //与服务建立连接 | |||
| if (AILinkBleManager.getInstance() != null) { | |||
| mDevice = BroadcastWeightScaleDeviceData.getInstance(); | |||
| @@ -195,7 +198,6 @@ public class BroadcastWeightScaleActivity extends BleNewBaseActivity implements | |||
| @Override | |||
| public void onServiceErr() { | |||
| BleLog.i("ljl", "服务与界面连接断开"); | |||
| //与服务断开连接 | |||
| AILinkBleManager.getInstance().removeOnBleBroadcastDataListener(this); | |||
| } | |||
| @@ -213,15 +215,13 @@ public class BroadcastWeightScaleActivity extends BleNewBaseActivity implements | |||
| @Override | |||
| public void bleOpen() { | |||
| mList.add(TimeUtils.getTime() + "蓝牙打开"); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| addLog("蓝牙打开"); | |||
| } | |||
| @Override | |||
| public void bleClose() { | |||
| BleLog.i(TAG, "蓝牙未开启,可请求开启"); | |||
| mList.add(TimeUtils.getTime() + "蓝牙关闭"); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| addLog("蓝牙关闭"); | |||
| } | |||
| //-----------------通知------------------- | |||
| @@ -238,8 +238,7 @@ public class BroadcastWeightScaleActivity extends BleNewBaseActivity implements | |||
| return; | |||
| } | |||
| mOldData = data; | |||
| mList.add(TimeUtils.getTime() + "数据ID" + type + " ,||解密payload数据:" + data + " ,||原始厂商数据:" + BleStrUtils.byte2HexStr(dataOriginal)); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| addLog( "数据ID" + type + " ,||解密payload数据:" + data + " ,||原始厂商数据:" + BleStrUtils.byte2HexStr(dataOriginal)); | |||
| } | |||
| @@ -322,8 +321,8 @@ public class BroadcastWeightScaleActivity extends BleNewBaseActivity implements | |||
| } | |||
| mList.add(showData); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| addLog(showData); | |||
| } | |||
| @Override | |||
| @@ -357,8 +356,29 @@ public class BroadcastWeightScaleActivity extends BleNewBaseActivity implements | |||
| int vid = bleValueBean.getVid(); | |||
| int pid = bleValueBean.getPid(); | |||
| if (mDevice != null) { | |||
| mDevice.onNotifyData(bleValueBean.getManufacturerData(),payload, cid, vid, pid); | |||
| mDevice.onNotifyData(bleValueBean.getManufacturerData(), payload, cid, vid, pid); | |||
| } | |||
| } | |||
| } | |||
| private String mOldLog = ""; | |||
| private SimpleDateFormat sdf; | |||
| /** | |||
| * 添加日志 | |||
| * | |||
| * @param log 日志 | |||
| */ | |||
| private void addLog(String log) { | |||
| if (mOldLog.equalsIgnoreCase(log)) { | |||
| return; | |||
| } | |||
| if (sdf == null) { | |||
| sdf = new SimpleDateFormat("HH:mm:ss", Locale.US); | |||
| } | |||
| mOldLog = log; | |||
| mList.add(0, sdf.format(System.currentTimeMillis()) + ":\n" + log); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| } | |||
| @@ -52,7 +52,10 @@ public class Bw05WatchActivity extends BleBaseActivity implements OnBw05WatchDat | |||
| private Button btnSetTime, btnQueryInfo, btnQueryThreshold; | |||
| private Button btnSetCheckTime, btnSetBleName, btnSetThreshold; | |||
| private Button btnConnect, btnClearLog; | |||
| private Button btnConnect, btnClearLog, btnHisTime; | |||
| private Button btnQueryTheme, btnSetThemeNum; | |||
| private Button btnQueryVersion, btnSetBind, btnQueryHardware; | |||
| private EditText etCheckTime, etBleName; | |||
| private EditText etHrMin, etHrMax; | |||
| @@ -60,16 +63,16 @@ public class Bw05WatchActivity extends BleBaseActivity implements OnBw05WatchDat | |||
| private EditText etTempMin, etTempMax; | |||
| private EditText etSbpMin, etSbpMax; | |||
| private EditText etDbpMin, etDbpMax; | |||
| private EditText etMac; | |||
| private EditText etMac, etThemeNum, etHisTime; | |||
| private CheckBox cbCheckTime; | |||
| private CheckBox cbCheckTime, cbHisTime; | |||
| private ListView log_list; | |||
| private List<String> mList; | |||
| private ArrayAdapter mListAdapter; | |||
| private String checkTimeOp; | |||
| private String checkTimeOp, hisTimeOp; | |||
| private Bw05WatchBleDevice mBw05WatchBleDevice; | |||
| @@ -98,6 +101,18 @@ public class Bw05WatchActivity extends BleBaseActivity implements OnBw05WatchDat | |||
| btnConnect.setOnClickListener(this); | |||
| btnClearLog = findViewById(R.id.btnClearLog); | |||
| btnClearLog.setOnClickListener(this); | |||
| btnQueryTheme = findViewById(R.id.btnQueryTheme); | |||
| btnQueryTheme.setOnClickListener(this); | |||
| btnSetThemeNum = findViewById(R.id.btnSetThemeNum); | |||
| btnSetThemeNum.setOnClickListener(this); | |||
| btnQueryVersion = findViewById(R.id.btnQueryVersion); | |||
| btnQueryVersion.setOnClickListener(this); | |||
| btnSetBind = findViewById(R.id.btnSetBind); | |||
| btnSetBind.setOnClickListener(this); | |||
| btnQueryHardware = findViewById(R.id.btnQueryHardware); | |||
| btnQueryHardware.setOnClickListener(this); | |||
| btnHisTime = findViewById(R.id.btnHisTime); | |||
| btnHisTime.setOnClickListener(this); | |||
| etCheckTime = findViewById(R.id.etCheckTime); | |||
| etBleName = findViewById(R.id.etBleName); | |||
| @@ -112,10 +127,14 @@ public class Bw05WatchActivity extends BleBaseActivity implements OnBw05WatchDat | |||
| etDbpMin = findViewById(R.id.etDbpMin); | |||
| etDbpMax = findViewById(R.id.etDbpMax); | |||
| etMac = findViewById(R.id.etMac); | |||
| etThemeNum = findViewById(R.id.etThemeNum); | |||
| etHisTime = findViewById(R.id.etHisTime); | |||
| cbCheckTime = findViewById(R.id.cbCheckTime); | |||
| cbHisTime = findViewById(R.id.cbHisTime); | |||
| checkTimeOp = cbCheckTime.isChecked() ? "1" : "0"; | |||
| hisTimeOp = cbHisTime.isChecked() ? "1" : "0"; | |||
| cbCheckTime.setOnCheckedChangeListener((buttonView, isChecked) -> { | |||
| if (isChecked) { | |||
| @@ -125,6 +144,14 @@ public class Bw05WatchActivity extends BleBaseActivity implements OnBw05WatchDat | |||
| } | |||
| }); | |||
| cbHisTime.setOnCheckedChangeListener((buttonView, isChecked) -> { | |||
| if (isChecked) { | |||
| hisTimeOp = "1"; | |||
| } else { | |||
| hisTimeOp = "0"; | |||
| } | |||
| }); | |||
| etTempMin.addTextChangedListener(new TextWatcher() { | |||
| @Override | |||
| public void beforeTextChanged(CharSequence s, int start, int count, int after) { | |||
| @@ -199,84 +226,98 @@ public class Bw05WatchActivity extends BleBaseActivity implements OnBw05WatchDat | |||
| if (v == null) { | |||
| return; | |||
| } | |||
| switch (v.getId()) { | |||
| case R.id.btnSetTime: | |||
| //设置时间 | |||
| if (mBw05WatchBleDevice != null) { | |||
| mBw05WatchBleDevice.setTime(); | |||
| int id = v.getId(); | |||
| if (id == R.id.btnSetTime) {//设置时间 | |||
| if (mBw05WatchBleDevice != null) { | |||
| mBw05WatchBleDevice.setTime(); | |||
| } | |||
| } else if (id == R.id.btnQueryInfo) {//查询信息 | |||
| if (mBw05WatchBleDevice != null) { | |||
| mBw05WatchBleDevice.queryInfo(); | |||
| } | |||
| } else if (id == R.id.btnQueryThreshold) {//查询阈值 | |||
| if (mBw05WatchBleDevice != null) { | |||
| mBw05WatchBleDevice.queryThreshold(); | |||
| } | |||
| } else if (id == R.id.btnSetCheckTime) {//设置检测间隔时间 | |||
| if (!TextUtils.isEmpty(etCheckTime.getText().toString())) { | |||
| if (etCheckTime.getText().toString().length() < 4 && mBw05WatchBleDevice != null) { | |||
| mBw05WatchBleDevice.setCheckTime(checkTimeOp + formatDataStr(etCheckTime.getText().toString(), 3)); | |||
| } | |||
| break; | |||
| case R.id.btnQueryInfo: | |||
| //查询信息 | |||
| } | |||
| } else if (id == R.id.btnSetBleName) {//设置蓝牙名称 | |||
| if (!TextUtils.isEmpty(etBleName.getText().toString())) { | |||
| if (mBw05WatchBleDevice != null) { | |||
| mBw05WatchBleDevice.queryInfo(); | |||
| mBw05WatchBleDevice.setBleName(etBleName.getText().toString()); | |||
| } | |||
| break; | |||
| case R.id.btnQueryThreshold: | |||
| //查询阈值 | |||
| } | |||
| } else if (id == R.id.btnSetThreshold) {//设置阈值 | |||
| if (!TextUtils.isEmpty(getFloatThresholdValue(etTempMin.getText().toString(), etTempMin.getHint().toString())) | |||
| && !TextUtils.isEmpty(getFloatThresholdValue(etTempMax.getText().toString(), etTempMax.getHint().toString()))) { | |||
| if (mBw05WatchBleDevice != null) { | |||
| mBw05WatchBleDevice.queryThreshold(); | |||
| } | |||
| break; | |||
| case R.id.btnSetCheckTime: | |||
| //设置检测间隔时间 | |||
| if (!TextUtils.isEmpty(etCheckTime.getText().toString())) { | |||
| if (etCheckTime.getText().toString().length() < 4 && mBw05WatchBleDevice != null) { | |||
| mBw05WatchBleDevice.setCheckTime(checkTimeOp + formatDataStr(etCheckTime.getText().toString(), 3)); | |||
| } | |||
| } | |||
| break; | |||
| case R.id.btnSetBleName: | |||
| //设置蓝牙名称 | |||
| if (!TextUtils.isEmpty(etBleName.getText().toString())) { | |||
| if (mBw05WatchBleDevice != null) { | |||
| mBw05WatchBleDevice.setBleName(etBleName.getText().toString()); | |||
| } | |||
| } | |||
| break; | |||
| case R.id.btnSetThreshold: | |||
| //设置阈值 | |||
| if (!TextUtils.isEmpty(getFloatThresholdValue(etTempMin.getText().toString(), etTempMin.getHint().toString())) | |||
| && !TextUtils.isEmpty(getFloatThresholdValue(etTempMax.getText().toString(), etTempMax.getHint().toString()))) { | |||
| if (mBw05WatchBleDevice != null) { | |||
| StringBuilder stringBuilder = new StringBuilder(); | |||
| stringBuilder.append(getIntThresholdValue(etHrMin.getText().toString(), etHrMin.getHint().toString())); | |||
| stringBuilder.append(getIntThresholdValue(etHrMax.getText().toString(), etHrMax.getHint().toString())); | |||
| stringBuilder.append(getIntThresholdValue(etSpo2Min.getText().toString(), etSpo2Min.getHint().toString())); | |||
| stringBuilder.append(getIntThresholdValue(etSpo2Max.getText().toString(), etSpo2Max.getHint().toString())); | |||
| StringBuilder stringBuilder = new StringBuilder(); | |||
| stringBuilder.append(getIntThresholdValue(etHrMin.getText().toString(), etHrMin.getHint().toString())); | |||
| stringBuilder.append(getIntThresholdValue(etHrMax.getText().toString(), etHrMax.getHint().toString())); | |||
| stringBuilder.append(getIntThresholdValue(etSpo2Min.getText().toString(), etSpo2Min.getHint().toString())); | |||
| stringBuilder.append(getIntThresholdValue(etSpo2Max.getText().toString(), etSpo2Max.getHint().toString())); | |||
| // stringBuilder.append(getIntThresholdValue(etSbpMin.getText().toString(), etSbpMin.getHint().toString())); | |||
| // stringBuilder.append(getIntThresholdValue(etSbpMax.getText().toString(), etSbpMax.getHint().toString())); | |||
| // stringBuilder.append(getIntThresholdValue(etDbpMin.getText().toString(), etDbpMin.getHint().toString())); | |||
| // stringBuilder.append(getIntThresholdValue(etDbpMax.getText().toString(), etDbpMax.getHint().toString())); | |||
| stringBuilder.append(getFloatThresholdValue(etTempMin.getText().toString(), etTempMin.getHint().toString())); | |||
| stringBuilder.append(getFloatThresholdValue(etTempMax.getText().toString(), etTempMax.getHint().toString())); | |||
| stringBuilder.append(getFloatThresholdValue(etTempMin.getText().toString(), etTempMin.getHint().toString())); | |||
| stringBuilder.append(getFloatThresholdValue(etTempMax.getText().toString(), etTempMax.getHint().toString())); | |||
| String payLoadStr = stringBuilder.toString(); | |||
| mBw05WatchBleDevice.setRangeValue(payLoadStr); | |||
| } | |||
| String payLoadStr = stringBuilder.toString(); | |||
| mBw05WatchBleDevice.setRangeValue(payLoadStr); | |||
| } | |||
| break; | |||
| case R.id.btnConnect: | |||
| //连接设备 | |||
| if (btnConnect.getText().toString().equals("连接")) { | |||
| if (!TextUtils.isEmpty(etMac.getText().toString()) && isValidMacAddress(etMac.getText().toString()) && mAILinkBleManager != null) { | |||
| connectMac = etMac.getText().toString(); | |||
| connectBle(connectMac.toUpperCase()); | |||
| } else { | |||
| Toast.makeText(this, "地址出错", Toast.LENGTH_SHORT).show(); | |||
| } | |||
| } | |||
| } else if (id == R.id.btnConnect) {//连接设备 | |||
| if (btnConnect.getText().toString().equals("连接")) { | |||
| if (!TextUtils.isEmpty(etMac.getText().toString()) && isValidMacAddress(etMac.getText().toString()) && mAILinkBleManager != null) { | |||
| connectMac = etMac.getText().toString(); | |||
| connectBle(connectMac.toUpperCase()); | |||
| } else { | |||
| if (mAILinkBleManager != null && !TextUtils.isEmpty(connectMac)) { | |||
| mAILinkBleManager.disconnect(connectMac.toUpperCase()); | |||
| } | |||
| Toast.makeText(this, "MAC地址出错", Toast.LENGTH_SHORT).show(); | |||
| } | |||
| break; | |||
| case R.id.btnClearLog: | |||
| clearText(); | |||
| break; | |||
| default: | |||
| break; | |||
| } else { | |||
| if (mAILinkBleManager != null && !TextUtils.isEmpty(connectMac)) { | |||
| mAILinkBleManager.disconnect(connectMac.toUpperCase()); | |||
| } | |||
| } | |||
| } else if (id == R.id.btnQueryTheme) {//查询主题 | |||
| if (mBw05WatchBleDevice != null) { | |||
| mBw05WatchBleDevice.queryTheme(); | |||
| } | |||
| } else if (id == R.id.btnSetThemeNum) {//设置主题 | |||
| if (!TextUtils.isEmpty(etThemeNum.getText().toString()) && ("1".equals(etThemeNum.getText().toString()) | |||
| || "2".equals(etThemeNum.getText().toString()) || "3".equals(etThemeNum.getText().toString()))) { | |||
| if (mBw05WatchBleDevice != null) { | |||
| mBw05WatchBleDevice.setTheme(etThemeNum.getText().toString()); | |||
| } | |||
| } else { | |||
| Toast.makeText(this, "只支持输入1,2,3", Toast.LENGTH_SHORT).show(); | |||
| } | |||
| } else if (id == R.id.btnQueryVersion) {//查询手环版本号 | |||
| if (mBw05WatchBleDevice != null) { | |||
| mBw05WatchBleDevice.queryVersion(); | |||
| } | |||
| } else if (id == R.id.btnSetBind) {//设置手环进入绑定模式 | |||
| if (mBw05WatchBleDevice != null) { | |||
| mBw05WatchBleDevice.setBindMode(); | |||
| } | |||
| } else if (id == R.id.btnQueryHardware) {//查询硬件状态 | |||
| if (mBw05WatchBleDevice != null) { | |||
| mBw05WatchBleDevice.queryHardware(); | |||
| } | |||
| } else if (id == R.id.btnHisTime) {//设置历史上传间隔 | |||
| if (!TextUtils.isEmpty(etHisTime.getText().toString())) { | |||
| if (etHisTime.getText().toString().length() < 5 && mBw05WatchBleDevice != null) { | |||
| int time = Integer.parseInt(etHisTime.getText().toString()); | |||
| mBw05WatchBleDevice.setHisTime(hisTimeOp + String.format(Locale.US, "%04d", time)); | |||
| } | |||
| } | |||
| } else if (id == R.id.btnClearLog) { | |||
| clearText(); | |||
| } | |||
| } | |||
| @@ -0,0 +1,280 @@ | |||
| package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.caseTreasure | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R | |||
| import android.os.Handler | |||
| import android.os.Looper | |||
| import android.os.Message | |||
| import android.view.View | |||
| import android.view.WindowManager | |||
| import android.widget.AdapterView | |||
| import android.widget.ArrayAdapter | |||
| import android.widget.Toast | |||
| import cn.net.aicare.modulelibrary.module.bleCaseTreasure.BleCaseTreasureDevice | |||
| import com.pingwang.bluetoothlib.listener.OnCallbackBle | |||
| import com.pingwang.bluetoothlib.utils.BleStrUtils | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.KBleBaseNewActivity | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.databinding.ActivityBleCaseTreasureBinding | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L | |||
| import java.text.SimpleDateFormat | |||
| import java.util.Locale | |||
| /** | |||
| * 病例宝界面 | |||
| * @author xing | |||
| * @date 2025/06/03 | |||
| * @constructor 创建[BleCaseTreasureActivity] | |||
| */ | |||
| class BleCaseTreasureActivity : KBleBaseNewActivity<ActivityBleCaseTreasureBinding>(), BleCaseTreasureDevice.OnBleCaseTreasureListener, | |||
| View.OnClickListener, OnCallbackBle { | |||
| private val REFRESH_DATA = 3 | |||
| private val LOOPSEND_KEY = 4 | |||
| private val mList: ArrayList<String> = arrayListOf() | |||
| private var listAdapter: ArrayAdapter<*>? = null | |||
| private var mMac = "" | |||
| private var mBleCaseTreasureDevice: BleCaseTreasureDevice? = null | |||
| private var spList = arrayOf("ASCII") | |||
| private var mSelectPosition = 0 | |||
| private var mSendIntervalMs = 1000L | |||
| private var mSendCountAll = 0 | |||
| private var mSendCount = 0 | |||
| private var mSendData = "" | |||
| private val mHandler: Handler = object : Handler(Looper.getMainLooper()) { | |||
| override fun handleMessage(msg: Message) { | |||
| when (msg.what) { | |||
| REFRESH_DATA -> listAdapter?.notifyDataSetChanged() | |||
| LOOPSEND_KEY -> { | |||
| if (mSendCount >= mSendCountAll) { | |||
| addLog("已循环发送完成:$mSendCount") | |||
| removeMessages(LOOPSEND_KEY) | |||
| return | |||
| } | |||
| val charsetName = spList[mSelectPosition] | |||
| mBleCaseTreasureDevice?.sendString(charsetName, "$mSendCount:$mSendData") | |||
| mSendCount++ | |||
| binding.tvSendCount.text = "$mSendCount" | |||
| sendEmptyMessageDelayed(LOOPSEND_KEY, mSendIntervalMs) | |||
| } | |||
| } | |||
| } | |||
| } | |||
| override fun getLayoutView(): ActivityBleCaseTreasureBinding { | |||
| return ActivityBleCaseTreasureBinding.inflate(layoutInflater) | |||
| } | |||
| override fun initListener() { | |||
| binding.btnConnect.setOnClickListener(this) | |||
| binding.btnDisconnect.setOnClickListener(this) | |||
| binding.btnClear.setOnClickListener(this) | |||
| binding.btnGetVersion.setOnClickListener(this) | |||
| binding.btnGetDeviceStatus.setOnClickListener(this) | |||
| binding.btnSendData.setOnClickListener(this) | |||
| binding.btnSendSpeed.setOnClickListener(this) | |||
| binding.btnLoopSend.setOnClickListener(this) | |||
| binding.btnStopSend.setOnClickListener(this) | |||
| binding.btnResetCount.setOnClickListener(this) | |||
| binding.spEncoding.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { | |||
| override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { | |||
| mSelectPosition = position | |||
| addLog("选择的项:${spList[position]}") | |||
| } | |||
| override fun onNothingSelected(parent: AdapterView<*>?) { | |||
| L.i("没有选择") | |||
| } | |||
| } | |||
| } | |||
| override fun onClick(v: View?) { | |||
| when (v?.id) { | |||
| R.id.btnConnect -> { | |||
| mBleManager.connectDevice(mMac) | |||
| } | |||
| R.id.btnDisconnect -> { | |||
| mBleManager.disconnect(mMac) | |||
| } | |||
| R.id.btnClear -> { | |||
| mList.clear() | |||
| mHandler.sendEmptyMessage(REFRESH_DATA) | |||
| } | |||
| R.id.btnGetVersion -> { | |||
| mBleCaseTreasureDevice?.getVersion() | |||
| } | |||
| R.id.btnGetDeviceStatus -> { | |||
| mBleCaseTreasureDevice?.getDeviceStatus() | |||
| } | |||
| R.id.btnSendData -> { | |||
| val data = binding.etData.text.toString() | |||
| if (data.isEmpty()) { | |||
| addLog("发送的内容不能为空") | |||
| return | |||
| } | |||
| val charsetName = spList[mSelectPosition] | |||
| mBleCaseTreasureDevice?.sendString(charsetName, data) | |||
| } | |||
| R.id.btnSendSpeed -> { | |||
| val data = binding.etSpeedUs.text.toString() | |||
| mBleCaseTreasureDevice?.setSpeed(data.toInt()) | |||
| } | |||
| R.id.btnLoopSend -> { | |||
| mSendCountAll = binding.etCount.text.toString().toInt() | |||
| mSendIntervalMs = binding.etIntervalMs.text.toString().toLong() | |||
| mSendData = binding.etData.text.toString() | |||
| if (mSendData.isEmpty()) { | |||
| addLog("发送的内容不能为空") | |||
| return | |||
| } | |||
| if (mSendIntervalMs<1000){ | |||
| addLog("发送间隔不能小于1000") | |||
| Toast.makeText(this,"发送间隔不能小于1000", Toast.LENGTH_LONG).show() | |||
| return | |||
| } | |||
| mHandler.removeMessages(LOOPSEND_KEY) | |||
| mHandler.sendEmptyMessage(LOOPSEND_KEY) | |||
| } | |||
| R.id.btnStopSend -> { | |||
| mHandler.removeMessages(LOOPSEND_KEY) | |||
| } | |||
| R.id.btnResetCount -> { | |||
| mSendCount = 0 | |||
| binding.tvSendCount.text = "$mSendCount" | |||
| mHandler.removeMessages(LOOPSEND_KEY) | |||
| } | |||
| else -> {} | |||
| } | |||
| } | |||
| override fun initData() { | |||
| //设置常亮 | |||
| window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) | |||
| mMac = intent.getStringExtra("mac") ?: "" | |||
| if (mMac.isEmpty()) { | |||
| finish() | |||
| return | |||
| } | |||
| binding.tvMac.text = mMac | |||
| listAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, mList) | |||
| binding.listview.adapter = listAdapter | |||
| spList = resources.getStringArray(R.array.spinner_encoding_format) | |||
| val adapter = ArrayAdapter.createFromResource(this, R.array.spinner_encoding_format, android.R.layout.simple_spinner_item) | |||
| adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) | |||
| binding.spEncoding.adapter = adapter | |||
| binding.spEncoding.setSelection(mSelectPosition) | |||
| onServiceSuccess() | |||
| } | |||
| override fun onServiceSuccess() { | |||
| if (mMac.isEmpty() || mBleManager == null) { | |||
| return | |||
| } | |||
| val bleDevice = mBleManager.getBleDevice(mMac) | |||
| bleDevice?.let { | |||
| addLog("连接成功:${mMac}") | |||
| mBleManager.setOnCallbackBle(this) | |||
| mBleCaseTreasureDevice = BleCaseTreasureDevice(bleDevice) | |||
| mBleCaseTreasureDevice?.addListener(this@BleCaseTreasureActivity) | |||
| } | |||
| } | |||
| override fun onServiceErr() { | |||
| } | |||
| override fun unbindServices() { | |||
| } | |||
| override fun bleOpen() { | |||
| addLog("蓝牙已打开") | |||
| } | |||
| override fun bleClose() { | |||
| addLog("蓝牙已关闭") | |||
| } | |||
| override fun onServicesDiscovered(mac: String?) { | |||
| onServiceSuccess() | |||
| } | |||
| override fun onDisConnected(mac: String?, code: Int) { | |||
| addLog("断开连接:$mac 错误码:$code") | |||
| mHandler.removeMessages(LOOPSEND_KEY) | |||
| } | |||
| override fun onVersion(version: String?) { | |||
| addLog("版本号:$version") | |||
| } | |||
| override fun onDeviceStatus(status: Int, dataId: Int, sendId: Int) { | |||
| addLog("设备状态:$status,病例ID:$dataId,已传帧ID:$sendId") | |||
| } | |||
| override fun onSendDataSchedule(cur: Int, size: Int) { | |||
| addLog("已发送帧数:$cur,总帧数:${size}, 发送完成") | |||
| } | |||
| override fun onSendFail() { | |||
| addLog("发送失败") | |||
| } | |||
| override fun onSendDataId(dataId: Int) { | |||
| addLog("发送的数据ID:$dataId") | |||
| } | |||
| override fun onSendHex(hex: ByteArray?) { | |||
| L.i("发送的数据:${BleStrUtils.byte2HexStr(hex)}") | |||
| // addLog("发送的数据:${BleStrUtils.byte2HexStr(hex)}") | |||
| } | |||
| override fun onSetSpeed(status: Int) { | |||
| addLog("设置打字速度:${if (status == 0) "成功" else "失败"}") | |||
| } | |||
| override fun onDestroy() { | |||
| super.onDestroy() | |||
| mHandler.removeMessages(LOOPSEND_KEY) | |||
| } | |||
| //-----------log--------------- | |||
| private var mOldLog = "" | |||
| private var sdf: SimpleDateFormat? = null | |||
| /** | |||
| * 添加日志 | |||
| * | |||
| * @param log 日志 | |||
| */ | |||
| private fun addLog(log: String) { | |||
| if (mOldLog.equals(log, ignoreCase = true)) { | |||
| return | |||
| } | |||
| if (sdf == null) { | |||
| sdf = SimpleDateFormat("HH:mm:ss:SSS", Locale.US) | |||
| } | |||
| mOldLog = log | |||
| mList.add( | |||
| 0, """ | |||
| ${sdf!!.format(System.currentTimeMillis())}: | |||
| $log | |||
| """.trimIndent() | |||
| ) | |||
| mHandler.sendEmptyMessage(REFRESH_DATA) | |||
| } | |||
| } | |||
| @@ -166,60 +166,34 @@ public class CoffeeScaleActivity extends BleBaseActivity implements View.OnClick | |||
| @Override | |||
| public void onClick(View v) { | |||
| switch (v.getId()) { | |||
| case R.id.btn_clear: | |||
| // 清空文本框 | |||
| clearText(); | |||
| break; | |||
| case R.id.btnPause: | |||
| // 清空文本框 | |||
| mPauseRefresh = !mPauseRefresh; | |||
| break; | |||
| case R.id.btn_zero: | |||
| // APP下发去皮功能(归零功能) | |||
| //某些秤可能需要进入冲煮模式才能使用,并且设备上面的定时和归零可用 | |||
| appSetZero(); | |||
| break; | |||
| case R.id.btn_set_weight_unit: | |||
| // APP下发重量单位 | |||
| appSetWeightUnit(); | |||
| break; | |||
| case R.id.btn_set_temp_unit: | |||
| // APP下发温度单位 | |||
| appSetTempUnit(); | |||
| break; | |||
| case R.id.btn_set_auto_shutdown: | |||
| // APP下发自动关机 | |||
| appSetAutoShutdown(); | |||
| break; | |||
| case R.id.btn_set_timing: | |||
| // APP下发计时功能控制 | |||
| appSetTiming(); | |||
| break; | |||
| case R.id.btn_callback_timing: | |||
| // APP回复计时功能 | |||
| appCallbackTiming(); | |||
| break; | |||
| case R.id.btn_set_alert: | |||
| // APP下发报警设置 | |||
| appSetAlert(); | |||
| break; | |||
| case R.id.btn_stop_alert: | |||
| // APP停止报警指令 | |||
| appStopAlert(); | |||
| break; | |||
| case R.id.btn_callback_alert: | |||
| // APP回复报警设置 | |||
| appCallbackAlert(); | |||
| break; | |||
| case R.id.btn_callback_stop_alert: | |||
| // APP回复停止报警 | |||
| appCallbackStopAlert(); | |||
| break; | |||
| case R.id.btn_brew_mode: | |||
| // APP设置冲煮模式 | |||
| appBrewMode(); | |||
| break; | |||
| int id = v.getId(); | |||
| if (id == R.id.btn_clear) {// 清空文本框 | |||
| clearText(); | |||
| } else if (id == R.id.btnPause) {// 清空文本框 | |||
| mPauseRefresh = !mPauseRefresh; | |||
| } else if (id == R.id.btn_zero) {// APP下发去皮功能(归零功能) | |||
| //某些秤可能需要进入冲煮模式才能使用,并且设备上面的定时和归零可用 | |||
| appSetZero(); | |||
| } else if (id == R.id.btn_set_weight_unit) {// APP下发重量单位 | |||
| appSetWeightUnit(); | |||
| } else if (id == R.id.btn_set_temp_unit) {// APP下发温度单位 | |||
| appSetTempUnit(); | |||
| } else if (id == R.id.btn_set_auto_shutdown) {// APP下发自动关机 | |||
| appSetAutoShutdown(); | |||
| } else if (id == R.id.btn_set_timing) {// APP下发计时功能控制 | |||
| appSetTiming(); | |||
| } else if (id == R.id.btn_callback_timing) {// APP回复计时功能 | |||
| appCallbackTiming(); | |||
| } else if (id == R.id.btn_set_alert) {// APP下发报警设置 | |||
| appSetAlert(); | |||
| } else if (id == R.id.btn_stop_alert) {// APP停止报警指令 | |||
| appStopAlert(); | |||
| } else if (id == R.id.btn_callback_alert) {// APP回复报警设置 | |||
| appCallbackAlert(); | |||
| } else if (id == R.id.btn_callback_stop_alert) {// APP回复停止报警 | |||
| appCallbackStopAlert(); | |||
| } else if (id == R.id.btn_brew_mode) {// APP设置冲煮模式 | |||
| appBrewMode(); | |||
| } | |||
| } | |||
| @@ -537,7 +511,7 @@ public class CoffeeScaleActivity extends BleBaseActivity implements View.OnClick | |||
| } | |||
| } | |||
| SimpleDateFormat sdf; | |||
| private SimpleDateFormat sdf; | |||
| // 添加一条文本 | |||
| private void addText(String text) { | |||
| if (mPauseRefresh) { | |||
| @@ -1,5 +1,11 @@ | |||
| package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.eight_bodyfat; | |||
| /** | |||
| * 八电极阻抗信息 | |||
| * | |||
| * @author xing | |||
| * @date 2024/11/29 | |||
| */ | |||
| public class EightBodyFatAdc { | |||
| @@ -4,6 +4,7 @@ import android.os.Bundle; | |||
| import android.view.View; | |||
| import android.widget.ArrayAdapter; | |||
| import android.widget.CompoundButton; | |||
| import android.widget.EditText; | |||
| import android.widget.ListView; | |||
| import android.widget.RadioButton; | |||
| @@ -14,11 +15,14 @@ import com.pingwang.bluetoothlib.bean.SupportUnitBean; | |||
| import com.pingwang.bluetoothlib.device.BleDevice; | |||
| import com.pingwang.bluetoothlib.listener.OnCallbackBle; | |||
| import java.text.SimpleDateFormat; | |||
| import java.util.ArrayList; | |||
| import java.util.List; | |||
| import java.util.Locale; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.UnitUtils; | |||
| import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatMcuDeviceData; | |||
| import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatUtil; | |||
| @@ -33,21 +37,25 @@ public class EightBodyFatMcuActivity extends BleBaseActivity implements View.OnC | |||
| private String mAddress; | |||
| private EightBodyFatMcuDeviceData mEightBodyFatDeviceData; | |||
| private RadioButton kg, jing, stlb, lb, C, F; | |||
| private UserInfoBean mUserInfoBean; | |||
| private EditText et_weight, et_height, et_age, et_sex; | |||
| @Override | |||
| protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
| super.onCreate(savedInstanceState); | |||
| setContentView(R.layout.activity_eight_body_fata); | |||
| mAddress = getIntent().getStringExtra("mac"); | |||
| init(); | |||
| loglist = new ArrayList<>(); | |||
| listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, loglist); | |||
| log_list.setAdapter(listAdapter); | |||
| initView(); | |||
| initData(); | |||
| initListener(); | |||
| setTitleData("八电极秤 MCU算法:0x" + Integer.toHexString(EightBodyFatUtil.EIGHT_BODY_FAT_SCALE_MCU)); | |||
| } | |||
| private void init() { | |||
| private void initView() { | |||
| et_weight = findViewById(R.id.et_weight); | |||
| et_height = findViewById(R.id.et_height); | |||
| et_age = findViewById(R.id.et_age); | |||
| et_sex = findViewById(R.id.et_sex); | |||
| log_list = findViewById(R.id.log_list); | |||
| kg = findViewById(R.id.kg); | |||
| jing = findViewById(R.id.jin); | |||
| @@ -55,7 +63,38 @@ public class EightBodyFatMcuActivity extends BleBaseActivity implements View.OnC | |||
| lb = findViewById(R.id.lb); | |||
| C = findViewById(R.id.c); | |||
| F = findViewById(R.id.f); | |||
| findViewById(R.id.support_unit).setOnClickListener(this); | |||
| } | |||
| private void initData() { | |||
| initUserInfo(); | |||
| loglist = new ArrayList<>(); | |||
| listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, loglist); | |||
| log_list.setAdapter(listAdapter); | |||
| } | |||
| /** | |||
| * 初始化用户信息 | |||
| */ | |||
| private void initUserInfo() { | |||
| String weightKg = et_weight.getText().toString().trim(); | |||
| String height = et_height.getText().toString().trim(); | |||
| String age = et_age.getText().toString().trim(); | |||
| String sex = et_sex.getText().toString().trim(); | |||
| if (mUserInfoBean == null) { | |||
| mUserInfoBean = new UserInfoBean(); | |||
| mUserInfoBean.setUserId(1); | |||
| mUserInfoBean.setUserType(0); | |||
| } | |||
| mUserInfoBean.setAge(Integer.parseInt(age)); | |||
| mUserInfoBean.setSex(Integer.parseInt(sex)); | |||
| mUserInfoBean.setHeightCm(Integer.parseInt(height)); | |||
| mUserInfoBean.setWeightKg(Float.parseFloat(weightKg)); | |||
| } | |||
| private void initListener() { | |||
| findViewById(R.id.getSupportUnit).setOnClickListener(this); | |||
| findViewById(R.id.btn_update).setOnClickListener(this); | |||
| kg.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||
| @Override | |||
| public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | |||
| @@ -150,9 +189,12 @@ public class EightBodyFatMcuActivity extends BleBaseActivity implements View.OnC | |||
| @Override | |||
| public void onClick(View v) { | |||
| if (v.getId() == R.id.support_unit) { | |||
| if (v.getId() == R.id.getSupportUnit) { | |||
| if (mEightBodyFatDeviceData != null) | |||
| mEightBodyFatDeviceData.getUnitList(); | |||
| }else if (v.getId() == R.id.btn_update) { | |||
| initUserInfo(); | |||
| addLog("更新用户信息"); | |||
| } | |||
| } | |||
| @@ -179,7 +221,6 @@ public class EightBodyFatMcuActivity extends BleBaseActivity implements View.OnC | |||
| addLog("设备返回操作指令:" + opCodeStr + " 结果:" + resultStr); | |||
| } | |||
| private double weightValue; | |||
| @Override | |||
| public void onWeight(int status, int weight, int unit, int decimal) { | |||
| @@ -188,24 +229,25 @@ public class EightBodyFatMcuActivity extends BleBaseActivity implements View.OnC | |||
| statusStr = "实时体重"; | |||
| } else if (status == 0x02) { | |||
| statusStr = "稳定体重"; | |||
| mUserInfoBean.setWeightKg(Float.parseFloat(UnitUtils.getWeightToKg(unit,String.valueOf(weight),decimal))); | |||
| } | |||
| if (decimal == 0) { | |||
| weightValue = weight; | |||
| } else { | |||
| weightValue = weight / (decimal * 10.0); | |||
| } | |||
| float weightF = Float.parseFloat(UnitUtils.getHoldDecimal(decimal, weight)); | |||
| String unitStr = ""; | |||
| if (unit == EightBodyFatUtil.KG) { | |||
| unitStr = "kg"; | |||
| mUserInfoBean.setWeightKg(weightF); | |||
| } else if (unit == EightBodyFatUtil.JIN) { | |||
| unitStr = "斤"; | |||
| mUserInfoBean.setWeightKg(weightF / 2); | |||
| } else if (unit == EightBodyFatUtil.ST) { | |||
| unitStr = "lb(未转换为st:lb)"; | |||
| } else if (unit == EightBodyFatUtil.LB) { | |||
| unitStr = "lb"; | |||
| } | |||
| addLog("体重:" + statusStr + " " + weightValue + unitStr); | |||
| if (et_weight != null) { | |||
| et_weight.setText(String.valueOf(weightF)); | |||
| } | |||
| addLog("体重:" + statusStr + " " + weightF + unitStr); | |||
| } | |||
| @Override | |||
| @@ -229,41 +271,57 @@ public class EightBodyFatMcuActivity extends BleBaseActivity implements View.OnC | |||
| addLog("身高:" + statusStr + " " + height + unitStr); | |||
| } | |||
| private EightBodyFatAdc mEightBodyFatAdc; | |||
| @Override | |||
| public void onImpedance(int status, EightBodyFatMcuDeviceData.EightBodyFatAdc eightBodyFatAdc, int arithmetic) { | |||
| String statusStr = ""; | |||
| if (status == EightBodyFatUtil.IMPEDANCE_MEASUREMENT) { | |||
| statusStr = "测量中"; | |||
| mEightBodyFatAdc = new EightBodyFatAdc(); | |||
| mEightBodyFatAdc.setAlgorithms(0x20); | |||
| } else if (status == EightBodyFatUtil.IMPEDANCE_FAILED) { | |||
| statusStr = "测量失败"; | |||
| } else if (status == EightBodyFatUtil.IMPEDANCE_SUCCESS_MCU) { | |||
| statusStr = "测量完成"; | |||
| } | |||
| String partStr = ""; | |||
| int part = eightBodyFatAdc.getPart(); | |||
| int adc = eightBodyFatAdc.getAdc(); | |||
| if (part == 0x00) { | |||
| partStr = "双脚阻抗"; | |||
| mEightBodyFatAdc.setAdcFoot(adc); | |||
| } else if (part == 0x01) { | |||
| partStr = "双手阻抗"; | |||
| mEightBodyFatAdc.setAdcHand(adc); | |||
| } else if (part == 0x02) { | |||
| partStr = "左手阻抗"; | |||
| mEightBodyFatAdc.setAdcLeftHand(adc); | |||
| } else if (part == 0x03) { | |||
| partStr = "右手阻抗"; | |||
| mEightBodyFatAdc.setAdcRightHand(adc); | |||
| } else if (part == 0x04) { | |||
| partStr = "左脚阻抗"; | |||
| mEightBodyFatAdc.setAdcLeftFoot(adc); | |||
| } else if (part == 0x05) { | |||
| partStr = "右脚阻抗"; | |||
| mEightBodyFatAdc.setAdcRightFoot(adc); | |||
| } else if (part == 0x06) { | |||
| partStr = "左全身阻抗"; | |||
| mEightBodyFatAdc.setAdcLeftBody(adc); | |||
| } else if (part == 0x07) { | |||
| partStr = "右全身阻抗"; | |||
| mEightBodyFatAdc.setAdcRightBody(adc); | |||
| } else if (part == 0x08) { | |||
| partStr = "右手左脚阻抗"; | |||
| mEightBodyFatAdc.setAdcRightHandLeftFoot(adc); | |||
| } else if (part == 0x09) { | |||
| partStr = "左手右脚阻抗"; | |||
| mEightBodyFatAdc.setAdcLeftHandRightFoot(adc); | |||
| } else if (part == 0x0A) { | |||
| partStr = "躯干阻抗"; | |||
| mEightBodyFatAdc.setAdcBody(adc); | |||
| } | |||
| addLog("阻抗:" + statusStr + " " + partStr + " : " + adc); | |||
| @@ -302,15 +360,18 @@ public class EightBodyFatMcuActivity extends BleBaseActivity implements View.OnC | |||
| @Override | |||
| public void onSyncUserInfo() { | |||
| addLog("请求同步用户信息:" + "默认传入用户:用户ID:1, 普通人:0, 性别:男,身高:180,年龄27"); | |||
| addLog("请求同步用户信息:" + "默认传入用户:" + mUserInfoBean.toString()); | |||
| if (mEightBodyFatDeviceData != null) { | |||
| mEightBodyFatDeviceData.setUserInfo(1, 0, 1, 27, 180); | |||
| mEightBodyFatDeviceData.setUserInfo(mUserInfoBean.getUserId(), mUserInfoBean.getUserType(), mUserInfoBean.getSex(), mUserInfoBean.getAge(), mUserInfoBean.getHeightCm()); | |||
| } | |||
| } | |||
| @Override | |||
| public void onCompletionData() { | |||
| addLog("请求补充体脂数据"); | |||
| if (mEightBodyFatAdc != null) { | |||
| mEightBodyFatAdc.setAlgorithms(0xFFFF); | |||
| } | |||
| } | |||
| @Override | |||
| @@ -320,6 +381,7 @@ public class EightBodyFatMcuActivity extends BleBaseActivity implements View.OnC | |||
| @Override | |||
| public void onTestSuccess(EightBodyFatMcuDeviceData.EightBodyFatInfo bodyFat) { | |||
| //测量完成 | |||
| addLog("体脂数据:" + bodyFat.toString()); | |||
| } | |||
| @@ -355,7 +417,7 @@ public class EightBodyFatMcuActivity extends BleBaseActivity implements View.OnC | |||
| } | |||
| private String mOldLog = ""; | |||
| private SimpleDateFormat sdf; | |||
| /** | |||
| * 添加日志 | |||
| * | |||
| @@ -365,14 +427,15 @@ public class EightBodyFatMcuActivity extends BleBaseActivity implements View.OnC | |||
| if (mOldLog.equalsIgnoreCase(log)) { | |||
| return; | |||
| } | |||
| if (sdf == null) { | |||
| sdf = new SimpleDateFormat("HH:mm:ss", Locale.US); | |||
| } | |||
| mOldLog = log; | |||
| loglist.add(0, log); | |||
| loglist.add(0,sdf.format(System.currentTimeMillis()) + ":\n" + log); | |||
| if (listAdapter != null) { | |||
| listAdapter.notifyDataSetChanged(); | |||
| } | |||
| } | |||
| } | |||
| @@ -10,7 +10,8 @@ import android.widget.RadioButton; | |||
| import androidx.annotation.Nullable; | |||
| import com.holtek.libHTBodyfat.HTBodyBasicInfo; | |||
| import com.pingwang.bluetoothlib.AILinkBleManager; | |||
| import com.pingwang.bluetoothlib.bean.BleValueBean; | |||
| import com.pingwang.bluetoothlib.bean.SupportUnitBean; | |||
| import com.pingwang.bluetoothlib.device.BleDevice; | |||
| import com.pingwang.bluetoothlib.listener.OnCallbackBle; | |||
| @@ -22,13 +23,11 @@ import java.util.Locale; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.eight_bodyfat.dual_band.UserInfoBean; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.EightBodyFatAlgorithms; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.EightBodyFatBean; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.UnitUtils; | |||
| import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatBleDeviceData; | |||
| import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatMcuDeviceData; | |||
| import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatUtil; | |||
| import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightOneBodyFatAdcBean; | |||
| import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightOneDataBodyFatBean; | |||
| /** | |||
| * 八电极秤 (单频APP算法) | |||
| @@ -43,6 +42,7 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic | |||
| private RadioButton kg, jing, stlb, lb, C, F; | |||
| private UserInfoBean mUserInfoBean; | |||
| private EditText et_weight, et_height, et_age, et_sex; | |||
| private EightOneBodyFatAdcBean mEightOneBodyFatAdcBean; | |||
| @Override | |||
| protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
| @@ -60,19 +60,22 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic | |||
| private void test() { | |||
| weight = 60; | |||
| if (mEightBodyFatAdc == null) { | |||
| mEightBodyFatAdc = new EightBodyFatAdc(); | |||
| mEightBodyFatAdc.setAlgorithms(0x20); | |||
| if (mEightOneBodyFatAdcBean == null) { | |||
| mEightOneBodyFatAdcBean = new EightOneBodyFatAdcBean(); | |||
| } | |||
| mEightOneBodyFatAdcBean.setAlgorithmsId(0x20); | |||
| mEightOneBodyFatAdcBean.setAdcFoot(5784349); | |||
| mEightOneBodyFatAdcBean.setAdcHand(5121114); | |||
| mEightOneBodyFatAdcBean.setAdcLeftHand(12854746); | |||
| mEightOneBodyFatAdcBean.setAdcRightHand(15738341); | |||
| mEightOneBodyFatAdcBean.setAdcLeftFoot(1074604); | |||
| mEightOneBodyFatAdcBean.setAdcRightFoot(13046299); | |||
| mEightOneBodyFatAdcBean.setAdcLeftBody(7480094); | |||
| mEightOneBodyFatAdcBean.setAdcRightBody(7480094); | |||
| if (mEightBodyFatBleDeviceData != null) { | |||
| mEightBodyFatBleDeviceData.getOneEightBodyData(mUserInfoBean.getSex(), mUserInfoBean.getAge(), mUserInfoBean.getWeightKg(), | |||
| mUserInfoBean.getHeightCm(), mEightOneBodyFatAdcBean); | |||
| } | |||
| mEightBodyFatAdc.setAdcFoot(5784349); | |||
| mEightBodyFatAdc.setAdcHand(5121114); | |||
| mEightBodyFatAdc.setAdcLeftHand(12854746); | |||
| mEightBodyFatAdc.setAdcRightHand(15738341); | |||
| mEightBodyFatAdc.setAdcLeftFoot(1074604); | |||
| mEightBodyFatAdc.setAdcRightFoot(13046299); | |||
| mEightBodyFatAdc.setAdcLeftBody(7480094); | |||
| mEightBodyFatAdc.setAdcRightBody(7480094); | |||
| kaimengJieMi(mEightBodyFatAdc, mUserInfoBean); | |||
| } | |||
| @@ -118,8 +121,9 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic | |||
| private void initListener() { | |||
| findViewById(R.id.support_unit).setOnClickListener(this); | |||
| findViewById(R.id.getSupportUnit).setOnClickListener(this); | |||
| findViewById(R.id.btn_update).setOnClickListener(this); | |||
| findViewById(R.id.btnConnect).setOnClickListener(this); | |||
| kg.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||
| @Override | |||
| public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | |||
| @@ -198,6 +202,11 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic | |||
| } | |||
| @Override | |||
| public void onServicesDiscovered(String mac) { | |||
| onServiceSuccess(); | |||
| } | |||
| @Override | |||
| public void unbindServices() { | |||
| if (mAILinkBleManager != null) { | |||
| @@ -207,12 +216,21 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic | |||
| @Override | |||
| public void onClick(View v) { | |||
| if (v.getId() == R.id.support_unit) { | |||
| if (v.getId() == R.id.getSupportUnit) { | |||
| if (mEightBodyFatBleDeviceData != null) | |||
| mEightBodyFatBleDeviceData.getUnitList(); | |||
| } else if (v.getId() == R.id.btn_update) { | |||
| initUserInfo(); | |||
| addLog("更新用户信息"); | |||
| } else if (v.getId() == R.id.btnConnect) { | |||
| if (mEightBodyFatBleDeviceData != null) { | |||
| BleValueBean bleValueBean = mEightBodyFatBleDeviceData.getBleValueBean(); | |||
| if (bleValueBean != null) { | |||
| AILinkBleManager.getInstance().connectDevice(bleValueBean); | |||
| }else { | |||
| AILinkBleManager.getInstance().connectDevice(mAddress); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -248,45 +266,6 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic | |||
| adc = "阻抗测量完成"; | |||
| break; | |||
| } | |||
| switch (result) { | |||
| case EightBodyFatUtil.IMPEDANCE_FOOT: | |||
| adc = adc + "双脚阻抗"; | |||
| break; | |||
| case EightBodyFatUtil.IMPEDANCE_HAND: | |||
| adc = adc + "双手阻抗"; | |||
| break; | |||
| case EightBodyFatUtil.IMPEDANCE_BODY: | |||
| adc = adc + "躯干阻抗"; | |||
| break; | |||
| case EightBodyFatUtil.IMPEDANCE_L_HAND: | |||
| adc = adc + "左手阻抗"; | |||
| break; | |||
| case EightBodyFatUtil.IMPEDANCE_R_HAND: | |||
| adc = adc + "右手阻抗"; | |||
| break; | |||
| case EightBodyFatUtil.IMPEDANCE_L_FOOT: | |||
| adc = adc + "左脚阻抗"; | |||
| break; | |||
| case EightBodyFatUtil.IMPEDANCE_R_FOOT: | |||
| adc = adc + "右脚阻抗"; | |||
| break; | |||
| case EightBodyFatUtil.IMPEDANCE_L_BODY: | |||
| adc = adc + "左驱干"; | |||
| break; | |||
| case EightBodyFatUtil.IMPEDANCE_R_BODY: | |||
| adc = adc + "右躯干"; | |||
| break; | |||
| case EightBodyFatUtil.IMPEDANCE_R_HAND_L_FOOT: | |||
| adc = adc + "右手左脚"; | |||
| break; | |||
| case EightBodyFatUtil.IMPEDANCE_L_HAND_R_FOOT: | |||
| adc = adc + "左手右脚"; | |||
| break; | |||
| default: | |||
| } | |||
| addLog(adc); | |||
| break; | |||
| case EightBodyFatUtil.HEART_RATE: | |||
| @@ -311,8 +290,9 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic | |||
| case EightBodyFatUtil.MEASUREMENT_END: | |||
| addLog("测量完成"); | |||
| //测量完成 | |||
| if (mEightBodyFatAdc != null) { | |||
| kaimengJieMi(mEightBodyFatAdc, mUserInfoBean); | |||
| if (mEightBodyFatBleDeviceData != null && mEightOneBodyFatAdcBean != null) { | |||
| mEightBodyFatBleDeviceData.getOneEightBodyData(mUserInfoBean.getSex(), mUserInfoBean.getAge(), mUserInfoBean.getWeightKg(), | |||
| mUserInfoBean.getHeightCm(), mEightOneBodyFatAdcBean); | |||
| } | |||
| break; | |||
| @@ -368,6 +348,7 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic | |||
| stateStr = "实时体重"; | |||
| } else if (state == EightBodyFatUtil.WEIGHT_STABILIZATION_WEIGHT) { | |||
| stateStr = "稳定体重"; | |||
| mUserInfoBean.setWeightKg(Float.parseFloat(UnitUtils.getWeightToKg(unit, String.valueOf(weight), decimal))); | |||
| } | |||
| this.weight = weight; | |||
| if (unit == EightBodyFatUtil.ST) { | |||
| @@ -378,12 +359,14 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic | |||
| if (et_weight != null) { | |||
| et_weight.setText(String.valueOf(weight)); | |||
| } | |||
| } | |||
| @Override | |||
| public void onImpedance(int adc, int part, int arithmetic) { | |||
| addLog("阻抗:" + adc + " 部位: " + part + " 算法" + arithmetic); | |||
| kaimeng(part, adc, arithmetic); | |||
| public void onImpedance(EightOneBodyFatAdcBean adcBean) { | |||
| mEightOneBodyFatAdcBean = adcBean; | |||
| addLog("阻抗测量完成:阻抗信息:" + adcBean); | |||
| } | |||
| @Override | |||
| @@ -411,173 +394,18 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic | |||
| } | |||
| @Override | |||
| public void showData(String data) { | |||
| // loglist.add(0, data); | |||
| public void onBodyFatData(@Nullable EightOneDataBodyFatBean bodyFatBean) { | |||
| addLog("获取体脂数据成功:\n" + bodyFatBean.toString()); | |||
| } | |||
| private EightBodyFatAdc mEightBodyFatAdc; | |||
| private void kaimeng(int part, int adc, int algorithms) { | |||
| if (mEightBodyFatAdc == null) { | |||
| mEightBodyFatAdc = new EightBodyFatAdc(); | |||
| } | |||
| mEightBodyFatAdc.setAlgorithms(algorithms); | |||
| switch (part) { | |||
| case EightBodyFatUtil.IMPEDANCE_FOOT: | |||
| //双脚阻抗 | |||
| mEightBodyFatAdc.setAdcFoot(adc); | |||
| break; | |||
| case EightBodyFatUtil.IMPEDANCE_HAND: | |||
| //双手阻抗 | |||
| mEightBodyFatAdc.setAdcHand(adc); | |||
| break; | |||
| case EightBodyFatUtil.IMPEDANCE_BODY: | |||
| //躯干阻抗 | |||
| mEightBodyFatAdc.setAdcBody(adc); | |||
| break; | |||
| case EightBodyFatUtil.IMPEDANCE_L_HAND: | |||
| //"左手阻抗"; | |||
| mEightBodyFatAdc.setAdcLeftHand(adc); | |||
| break; | |||
| case EightBodyFatUtil.IMPEDANCE_R_HAND: | |||
| // adc = adc + "右手阻抗"; | |||
| mEightBodyFatAdc.setAdcRightHand(adc); | |||
| break; | |||
| case EightBodyFatUtil.IMPEDANCE_L_FOOT: | |||
| // adc = adc + "左脚阻抗"; | |||
| mEightBodyFatAdc.setAdcLeftFoot(adc); | |||
| break; | |||
| case EightBodyFatUtil.IMPEDANCE_R_FOOT: | |||
| // adc = adc + "右脚阻抗"; | |||
| mEightBodyFatAdc.setAdcRightFoot(adc); | |||
| break; | |||
| case EightBodyFatUtil.IMPEDANCE_L_BODY: | |||
| // adc = adc + "左驱干"; | |||
| mEightBodyFatAdc.setAdcLeftBody(adc); | |||
| break; | |||
| case EightBodyFatUtil.IMPEDANCE_R_BODY: | |||
| // adc = adc + "右躯干"; | |||
| mEightBodyFatAdc.setAdcRightBody(adc); | |||
| break; | |||
| case EightBodyFatUtil.IMPEDANCE_R_HAND_L_FOOT: | |||
| // adc = adc + "右手左脚"; | |||
| mEightBodyFatAdc.setAdcRightHandLeftFoot(adc); | |||
| break; | |||
| case EightBodyFatUtil.IMPEDANCE_L_HAND_R_FOOT: | |||
| // adc = adc + "左手右脚"; | |||
| mEightBodyFatAdc.setAdcLeftHandRightFoot(adc); | |||
| break; | |||
| default: | |||
| } | |||
| @Override | |||
| public void onBodyFatDataError(int type, String msg) { | |||
| addLog("获取体脂数据失败:" + type + " " + msg); | |||
| } | |||
| private void kaimengJieMi(EightBodyFatAdc eightBodyFatAdc, UserInfoBean userInfoBean) { | |||
| loglist.add(0, "默认传入用户: " + userInfoBean.toString()); | |||
| EightBodyFatBean algorithmsData = EightBodyFatAlgorithms.getInstance() | |||
| .getAlgorithmsData(eightBodyFatAdc.getAlgorithms(), userInfoBean.getSex(), | |||
| userInfoBean.getHeightCm(), userInfoBean.getWeightKg(), | |||
| userInfoBean.getAge(), eightBodyFatAdc); | |||
| if (algorithmsData.getBhErrorType() != null) { | |||
| String type = algorithmsData.getBhErrorType(); | |||
| int typeInt = -1; | |||
| try { | |||
| typeInt = Integer.parseInt(algorithmsData.getBhErrorType()); | |||
| } catch (NumberFormatException e) { | |||
| typeInt = -1; | |||
| e.printStackTrace(); | |||
| } | |||
| if (typeInt != -1) { | |||
| //新算法 | |||
| switch (typeInt) { | |||
| case HTBodyBasicInfo.ErrorAge: | |||
| loglist.add(0, "年龄不符合要求:6~99"); | |||
| break; | |||
| case HTBodyBasicInfo.ErrorHeight: | |||
| loglist.add(0, "身高不符合要求:90~220"); | |||
| break; | |||
| case HTBodyBasicInfo.ErrorWeight: | |||
| loglist.add(0, "体重不符合要求:10.0~200.0"); | |||
| break; | |||
| case HTBodyBasicInfo.ErrorImpedance: | |||
| loglist.add(0, "阻抗不符合要求100~600"); | |||
| break; | |||
| case HTBodyBasicInfo.ErrorImpedanceLeftLeg: | |||
| loglist.add(0, "左手左脚阻抗不符合要求:100~600"); | |||
| break; | |||
| case HTBodyBasicInfo.ErrorImpedanceRightLeg: | |||
| loglist.add(0, "右手左脚阻抗不符合要求:100~600"); | |||
| break; | |||
| case HTBodyBasicInfo.ErrorImpedanceLeftArm: | |||
| loglist.add(0, "左手阻抗不符合要求:100~600"); | |||
| break; | |||
| case HTBodyBasicInfo.ErrorImpedanceRightArm: | |||
| loglist.add(0, "右手阻抗不符合要求:100~600"); | |||
| break; | |||
| case HTBodyBasicInfo.ErrorNone: | |||
| //正常 | |||
| loglist.add(0, "算法计算结果:" + algorithmsData.toString()); | |||
| break; | |||
| default: | |||
| loglist.add(0, "其他错误:" + algorithmsData.getBhErrorType()); | |||
| break; | |||
| } | |||
| } else { | |||
| switch (type) { | |||
| case "AGE": | |||
| loglist.add(0, "年龄不符合要求:6~99"); | |||
| break; | |||
| case "HEIGHT": | |||
| loglist.add(0, "身高不符合要求:90~220"); | |||
| break; | |||
| case "WEIGHT": | |||
| loglist.add(0, "体重不符合要求:10.0~200.0"); | |||
| break; | |||
| case "IMPEDANCE_LEFT_BODY": | |||
| loglist.add(0, "左侧全身阻抗不符合要求:200~1200"); | |||
| break; | |||
| case "IMPEDANCE_LEFT_ARM": | |||
| loglist.add(0, "左手阻抗不符合要求:100~600"); | |||
| break; | |||
| case "IMPEDANCE_RIGHT_ARM": | |||
| loglist.add(0, "右手阻抗不符合要求:100~600"); | |||
| break; | |||
| case "IMPEDANCE_LEFT_LEG": | |||
| loglist.add(0, "左脚阻抗不符合要求:100~600"); | |||
| break; | |||
| case "IMPEDANCE_RIGHT_LEG": | |||
| loglist.add(0, "右脚阻抗不符合要求:100~600"); | |||
| break; | |||
| case "NONE": | |||
| //正常 | |||
| loglist.add(0, "算法计算结果:" + algorithmsData.toString()); | |||
| break; | |||
| default: | |||
| loglist.add(0, "其他错误:" + algorithmsData.getBhErrorType()); | |||
| break; | |||
| } | |||
| } | |||
| } else { | |||
| loglist.add(0, "其他错误:" + algorithmsData.getBhErrorType()); | |||
| } | |||
| if (listAdapter != null) { | |||
| listAdapter.notifyDataSetChanged(); | |||
| } | |||
| // EightBodyFatBean algorithmsData = | |||
| // EightBodyFatAlgorithms.getInstance().getAlgorithmsData(2, 0, 165, weight, 27, mEightBodyFatAdc); | |||
| L.i("算法结果" + algorithmsData.toString()); | |||
| @Override | |||
| public void showData(String data) { | |||
| // loglist.add(0, data); | |||
| } | |||
| @@ -0,0 +1,64 @@ | |||
| package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.eight_bodyfat; | |||
| public class UserInfoBean { | |||
| private int userId; | |||
| private int age; | |||
| private int heightCm; | |||
| private float weightKg; | |||
| private int userType; | |||
| private int sex; | |||
| public int getUserId() { | |||
| return userId; | |||
| } | |||
| public void setUserId(int userId) { | |||
| this.userId = userId; | |||
| } | |||
| public int getAge() { | |||
| return age; | |||
| } | |||
| public void setAge(int age) { | |||
| this.age = age; | |||
| } | |||
| public int getHeightCm() { | |||
| return heightCm; | |||
| } | |||
| public void setHeightCm(int heightCm) { | |||
| this.heightCm = heightCm; | |||
| } | |||
| public float getWeightKg() { | |||
| return weightKg; | |||
| } | |||
| public void setWeightKg(float weightKg) { | |||
| this.weightKg = weightKg; | |||
| } | |||
| public int getSex() { | |||
| return sex; | |||
| } | |||
| public void setSex(int sex) { | |||
| this.sex = sex; | |||
| } | |||
| public int getUserType() { | |||
| return userType; | |||
| } | |||
| public void setUserType(int userType) { | |||
| this.userType = userType; | |||
| } | |||
| @Override | |||
| public String toString() { | |||
| return "UserInfoBean{" + "年龄=" + age + "用户类型=" + userType + ", 身高=" + heightCm + ", 体重=" + weightKg + ", 性别=" + (sex == 1 ? "男" : "女") + '}'; | |||
| } | |||
| } | |||
| @@ -19,8 +19,10 @@ import com.pingwang.bluetoothlib.bean.SupportUnitBean; | |||
| import com.pingwang.bluetoothlib.device.BleDevice; | |||
| import com.pingwang.bluetoothlib.listener.OnCallbackBle; | |||
| import java.text.SimpleDateFormat; | |||
| import java.util.ArrayList; | |||
| import java.util.List; | |||
| import java.util.Locale; | |||
| import java.util.Map; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
| @@ -31,14 +33,15 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.UnitUtils; | |||
| import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatUtil; | |||
| import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.BaseEightDoubleBodyFatData; | |||
| import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.EightDoubleBodyFatAdcBean; | |||
| import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.EightDoubleBodyFatBean; | |||
| import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.EightDoubleBodyFatBleConfig; | |||
| import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.EightDoubleBodyFatBleDeviceData; | |||
| import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.EightDoubleBodyFatBleMcuDeviceData; | |||
| import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.EightDoubleDataBodyFatBean; | |||
| import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.EightDoubleMcuBodyFatBean; | |||
| import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.OnEightDoubleBodyFatCallback; | |||
| /** | |||
| * 双频八电极秤(mcu算法) | |||
| * 双频八电极秤(app/mcu算法) | |||
| * | |||
| * @author xing | |||
| * @date 2024/03/14 | |||
| @@ -85,7 +88,7 @@ public class EightDoubleBodyfatActivity extends BleBaseActivity implements View. | |||
| initView(); | |||
| initListener(); | |||
| initData(); | |||
| setTitleData("双频八电极秤:0x" + Integer.toHexString(mCid)); | |||
| } | |||
| private void initData() { | |||
| @@ -100,24 +103,25 @@ public class EightDoubleBodyfatActivity extends BleBaseActivity implements View. | |||
| public void onClick(View v) { | |||
| List<EightDoubleBodyFatAdcBean> list = new ArrayList<>(); | |||
| EightDoubleBodyFatAdcBean adcBean = new EightDoubleBodyFatAdcBean(); | |||
| adcBean.setAdcRightHand(2433844368L); | |||
| adcBean.setAdcLeftHand(3781622117L); | |||
| adcBean.setAdcBody(1349958013L); | |||
| adcBean.setAdcRightFoot(1365295937L); | |||
| adcBean.setAdcLeftFoot(1903359127L); | |||
| adcBean.setAdcRightHand(0x70CE5D91L); | |||
| adcBean.setAdcLeftHand(0x61A2D714L); | |||
| adcBean.setAdcBody(0x3013EEE0L); | |||
| adcBean.setAdcRightFoot(0x50A93C9FL); | |||
| adcBean.setAdcLeftFoot(0x10071D0CL); | |||
| adcBean.setFrequencyId(0x01); | |||
| adcBean.setAlgorithmsId(0x01); | |||
| list.add(adcBean); | |||
| EightDoubleBodyFatAdcBean adcBean100 = new EightDoubleBodyFatAdcBean(); | |||
| adcBean100.setAdcRightHand(2447381468L); | |||
| adcBean100.setAdcLeftHand(1909750593L); | |||
| adcBean100.setAdcBody(2954962439L); | |||
| adcBean100.setAdcRightFoot(4036701847L); | |||
| adcBean100.setAdcLeftFoot(2421978775L); | |||
| adcBean100.setAdcRightHand(0x509A9A5FL); | |||
| adcBean100.setAdcLeftHand(0x7037B559L); | |||
| adcBean100.setAdcBody(0x3022CEC6L); | |||
| adcBean100.setAdcRightFoot(0x60AA8F98L); | |||
| adcBean100.setAdcLeftFoot(0x40F72698L); | |||
| adcBean100.setFrequencyId(0x02); | |||
| adcBean100.setAlgorithmsId(0x01); | |||
| list.add(adcBean100); | |||
| mCid = EightDoubleBodyFatBleConfig.CID_APP; | |||
| onTestCompleted(list); | |||
| } | |||
| }); | |||
| @@ -130,6 +134,8 @@ public class EightDoubleBodyfatActivity extends BleBaseActivity implements View. | |||
| String sex = et_sex.getText().toString().trim(); | |||
| if (mUserInfoBean == null) { | |||
| mUserInfoBean = new UserInfoBean(); | |||
| mUserInfoBean.setUserId(1); | |||
| mUserInfoBean.setUserType(0); | |||
| } | |||
| mUserInfoBean.setAge(Integer.parseInt(age)); | |||
| mUserInfoBean.setSex(Integer.parseInt(sex)); | |||
| @@ -152,7 +158,8 @@ public class EightDoubleBodyfatActivity extends BleBaseActivity implements View. | |||
| private void initListener() { | |||
| findViewById(R.id.support_unit).setOnClickListener(this); | |||
| findViewById(R.id.getSupportUnit).setOnClickListener(this); | |||
| findViewById(R.id.btn_update).setOnClickListener(this); | |||
| findViewById(R.id.btn_clear_log).setOnClickListener(this); | |||
| kg.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||
| @Override | |||
| @@ -238,13 +245,16 @@ public class EightDoubleBodyfatActivity extends BleBaseActivity implements View. | |||
| @Override | |||
| public void onClick(View v) { | |||
| if (v.getId() == R.id.support_unit) { | |||
| if (v.getId() == R.id.getSupportUnit) { | |||
| if (mEightDoubleBodyFatData != null) { | |||
| mEightDoubleBodyFatData.getUnitList(); | |||
| } | |||
| } else if (v.getId() == R.id.btn_clear_log) { | |||
| mLoglist.clear(); | |||
| mHandler.sendEmptyMessage(REFRESH_KEY); | |||
| } else if (v.getId() == R.id.btn_update) { | |||
| initUserInfo(); | |||
| showData("更新用户信息"); | |||
| } | |||
| } | |||
| @@ -262,7 +272,7 @@ public class EightDoubleBodyfatActivity extends BleBaseActivity implements View. | |||
| @Override | |||
| public void onTestCompleted(List<EightDoubleBodyFatAdcBean> adcBeanList) { | |||
| initUserInfo(); | |||
| mLoglist.add(0, "测试完成:" + adcBeanList.size()); | |||
| mLoglist.add(0, "测试完成"); | |||
| for (EightDoubleBodyFatAdcBean adcBean : adcBeanList) { | |||
| String data = ""; | |||
| data += (adcBean.getFrequencyId() == 0x01) ? "频率:20kHz" : "频率:100kHz"; | |||
| @@ -275,71 +285,17 @@ public class EightDoubleBodyfatActivity extends BleBaseActivity implements View. | |||
| mLoglist.add(0, data); | |||
| } | |||
| mLoglist.add(0, "用户信息:" + mUserInfoBean.toString()); | |||
| mHandler.sendEmptyMessage(REFRESH_KEY); | |||
| getBodyFatData(adcBeanList); | |||
| mHandler.sendEmptyMessage(REFRESH_KEY); | |||
| } | |||
| // private HetaiHttpUtils mHetaiHttpUtils; | |||
| private void getBodyFatData(List<EightDoubleBodyFatAdcBean> adcBeanList) { | |||
| if (mCid != EightDoubleBodyFatBleConfig.CID_APP) { | |||
| if (mCid != EightDoubleBodyFatBleConfig.CID_APP || adcBeanList == null || adcBeanList.isEmpty()) { | |||
| return; | |||
| } | |||
| // ParamsHetaiBean paramsHetaiBean = new ParamsHetaiBean(); | |||
| // paramsHetaiBean.setAge(String.valueOf(mUserInfoBean.getAge())); | |||
| // paramsHetaiBean.setSex(String.valueOf(mUserInfoBean.getSex())); | |||
| // paramsHetaiBean.setHeightCm(String.valueOf(mUserInfoBean.getHeightCm())); | |||
| // paramsHetaiBean.setWeightKg(String.valueOf(mUserInfoBean.getWeightKg())); | |||
| // for (EightDoubleBodyFatAdcBean adcBean : adcBeanList) { | |||
| // if (adcBean.getFrequencyId() == 0x01) { | |||
| // //20khz | |||
| // paramsHetaiBean.setZ20KhzLeftArmEnCode(String.valueOf(adcBean.getAdcLeftHand())); | |||
| // paramsHetaiBean.setZ20KhzRightArmEnCode(String.valueOf(adcBean.getAdcRightHand())); | |||
| // paramsHetaiBean.setZ20KhzLeftLegEnCode(String.valueOf(adcBean.getAdcLeftFoot())); | |||
| // paramsHetaiBean.setZ20KhzRightLegEnCode(String.valueOf(adcBean.getAdcRightFoot())); | |||
| // paramsHetaiBean.setZ20KhzTrunkEnCode(String.valueOf(adcBean.getAdcBody())); | |||
| // | |||
| // } else if (adcBean.getFrequencyId() == 0x02) { | |||
| // //100khz | |||
| // paramsHetaiBean.setZ100KhzLeftArmEnCode(String.valueOf(adcBean.getAdcLeftHand())); | |||
| // paramsHetaiBean.setZ100KhzRightArmEnCode(String.valueOf(adcBean.getAdcRightHand())); | |||
| // paramsHetaiBean.setZ100KhzLeftLegEnCode(String.valueOf(adcBean.getAdcLeftFoot())); | |||
| // paramsHetaiBean.setZ100KhzRightLegEnCode(String.valueOf(adcBean.getAdcRightFoot())); | |||
| // paramsHetaiBean.setZ100KhzTrunkEnCode(String.valueOf(adcBean.getAdcBody())); | |||
| // } | |||
| // } | |||
| // //获取数据 | |||
| // if (mHetaiHttpUtils == null) { | |||
| // mHetaiHttpUtils = new HetaiHttpUtils(); | |||
| // } | |||
| // mHetaiHttpUtils.postGetBody270(paramsHetaiBean, new OnHttpListener<HttpHetaiListBean>() { | |||
| // @Override | |||
| // public void onSuccess(HttpHetaiListBean data) { | |||
| // List<HttpHetaiBean> httpHetaiBeans = data.getData(); | |||
| // if (httpHetaiBeans != null) { | |||
| // mLoglist.add(0, "获取数据成功:" + httpHetaiBeans.size()); | |||
| // for (HttpHetaiBean httpHetaiBean : httpHetaiBeans) { | |||
| // String show = mMap.get(httpHetaiBean.getName()) + ":" + httpHetaiBean.getValue() + " " + | |||
| // (httpHetaiBean.getUnit() == null ? "" : httpHetaiBean.getUnit()) + | |||
| // (httpHetaiBean.getLevel() == null ? "" : "\n" + httpHetaiBean.getLevel().toString()); | |||
| // mLoglist.add(0, show); | |||
| // L.i(httpHetaiBean.toString()); | |||
| // } | |||
| // mHandler.sendEmptyMessage(REFRESH_KEY); | |||
| // } else { | |||
| // showData("体脂数据为空:" + data.toString()); | |||
| // } | |||
| // | |||
| // } | |||
| // | |||
| // @Override | |||
| // public void onFailed(HttpHetaiListBean data) { | |||
| // showData("获取数据失败"); | |||
| // } | |||
| // }); | |||
| mEightDoubleBodyFatData.getDualEightBodyData(mUserInfoBean.getSex(), mUserInfoBean.getAge(), mUserInfoBean.getWeightKg(), | |||
| mUserInfoBean.getHeightCm(), adcBeanList); | |||
| } | |||
| @Override | |||
| @@ -351,6 +307,7 @@ public class EightDoubleBodyfatActivity extends BleBaseActivity implements View. | |||
| stateStr = "实时体重"; | |||
| } else if (state == EightDoubleBodyFatBleConfig.STATUS_WEIGHT_STABILIZATION_WEIGHT) { | |||
| stateStr = "稳定体重"; | |||
| mUserInfoBean.setWeightKg(Float.parseFloat(UnitUtils.getWeightToKg(unit, String.valueOf(weightF), decimal))); | |||
| mWeightKg = String.valueOf(weightF); | |||
| if (et_weight != null) { | |||
| et_weight.setText(mWeightKg); | |||
| @@ -407,12 +364,12 @@ public class EightDoubleBodyfatActivity extends BleBaseActivity implements View. | |||
| } | |||
| @Override | |||
| public void onBodyFat(EightDoubleBodyFatBean bodyFatBean) { | |||
| public void onBodyFatMcu(EightDoubleMcuBodyFatBean bodyFatBean) { | |||
| if (bodyFatBean == null) { | |||
| showData("体脂数据为空"); | |||
| return; | |||
| } | |||
| showData("体脂数据:" + bodyFatBean); | |||
| showData("体脂数据(MCU):" + bodyFatBean); | |||
| } | |||
| @Override | |||
| @@ -441,15 +398,38 @@ public class EightDoubleBodyfatActivity extends BleBaseActivity implements View. | |||
| showData("设备请求同步用户信息"); | |||
| } | |||
| private String mOldData = ""; | |||
| @Override | |||
| public void onBodyFatDataError(int type, String msg) { | |||
| L.i("体脂数据计算错误:type=" + type + " msg=" + msg); | |||
| showData("体脂数据计算错误:type=" + type + " msg=" + msg); | |||
| } | |||
| @Override | |||
| public void showData(String data) { | |||
| if (mOldData.equals(data)) { | |||
| public void onBodyFatData(@Nullable EightDoubleDataBodyFatBean bodyFatBean) { | |||
| if (bodyFatBean != null) { | |||
| L.i("体脂数据计算成功:" + bodyFatBean.toString()); | |||
| showData("体脂数据(服务器):\n" + bodyFatBean); | |||
| } | |||
| } | |||
| private String mOldLog = ""; | |||
| private SimpleDateFormat sdf; | |||
| /** | |||
| * 添加日志 | |||
| * | |||
| * @param log 日志 | |||
| */ | |||
| @Override | |||
| public void showData(String log) { | |||
| if (mOldLog.equalsIgnoreCase(log)) { | |||
| return; | |||
| } | |||
| mOldData = data; | |||
| mLoglist.add(0, data); | |||
| if (sdf == null) { | |||
| sdf = new SimpleDateFormat("HH:mm:ss", Locale.US); | |||
| } | |||
| mOldLog = log; | |||
| mLoglist.add(0, sdf.format(System.currentTimeMillis()) + ":\n" + log); | |||
| mHandler.sendEmptyMessage(REFRESH_KEY); | |||
| } | |||
| @@ -457,7 +437,7 @@ public class EightDoubleBodyfatActivity extends BleBaseActivity implements View. | |||
| @Override | |||
| protected void onDestroy() { | |||
| super.onDestroy(); | |||
| if (mAILinkBleManager!=null) { | |||
| if (mAILinkBleManager != null) { | |||
| mAILinkBleManager.disconnectAll(); | |||
| } | |||
| } | |||
| @@ -7,6 +7,8 @@ import android.widget.ArrayAdapter; | |||
| import android.widget.EditText; | |||
| import android.widget.ListView; | |||
| import androidx.appcompat.app.ActionBar; | |||
| import com.pingwang.bluetoothlib.AILinkBleManager; | |||
| import com.pingwang.bluetoothlib.device.BleDevice; | |||
| import com.pingwang.bluetoothlib.listener.OnCallbackBle; | |||
| @@ -50,157 +52,116 @@ public class GasDetectorActivity extends BleAppNewBaseActivity implements View.O | |||
| @Override | |||
| protected void initListener() { | |||
| ActionBar supportActionBar = getSupportActionBar(); | |||
| if (supportActionBar != null) { | |||
| supportActionBar.setTitle("气体检测仪"); | |||
| } | |||
| } | |||
| @Override | |||
| public void onClick(View v) { | |||
| switch (v.getId()) { | |||
| case R.id.btnGetCurInfo: | |||
| //实时信息 | |||
| mGasDetectorDevice.getCurrentInfo(); | |||
| addText("获取实时信息"); | |||
| break; | |||
| case R.id.btnSyncTime: | |||
| //同步时间 | |||
| mGasDetectorDevice.setSyncTime(); | |||
| addText("同步时间"); | |||
| break; | |||
| case R.id.btnGetCO2Density: | |||
| //CO2报警浓度 | |||
| mGasDetectorDevice.getCo2Alarm(); | |||
| addText("获取CO2报警浓度"); | |||
| break; | |||
| case R.id.btnGetCODensity: | |||
| //CO报警浓度 | |||
| mGasDetectorDevice.getCoAlarm(); | |||
| addText("获取CO报警浓度"); | |||
| break; | |||
| case R.id.btnGetO2Density: | |||
| //O2报警浓度 | |||
| mGasDetectorDevice.getO2Alarm(); | |||
| addText("获取O2报警浓度"); | |||
| break; | |||
| case R.id.btnGetCO2Interval: | |||
| //CO2间隔 | |||
| mGasDetectorDevice.getCo2Interval(); | |||
| addText("获取CO2间隔"); | |||
| break; | |||
| case R.id.btnGetCOInterval: | |||
| //CO间隔 | |||
| mGasDetectorDevice.getCoInterval(); | |||
| addText("获取CO间隔"); | |||
| break; | |||
| case R.id.btnGetHistoryInterval: | |||
| //历史记录间隔 | |||
| mGasDetectorDevice.getOfflineHistoryInterval(); | |||
| addText("获取历史记录间隔"); | |||
| break; | |||
| case R.id.btnGetCO2Switch: | |||
| //CO2开关 | |||
| mGasDetectorDevice.getCo2Switch(); | |||
| addText("获取CO2开关"); | |||
| break; | |||
| case R.id.btnGetCOSwitch: | |||
| //CO开关 | |||
| mGasDetectorDevice.getCoSwitch(); | |||
| addText("获取CO开关"); | |||
| break; | |||
| case R.id.btnGetSoundSwitch: | |||
| //声音开关 | |||
| mGasDetectorDevice.getSoundSwitch(); | |||
| addText("获取声音开关"); | |||
| break; | |||
| case R.id.btnGetShakeSwitch: | |||
| //震动开关 | |||
| mGasDetectorDevice.getShockSwitch(); | |||
| addText("获取震动开关"); | |||
| break; | |||
| case R.id.btnGetTempUnit: | |||
| //温度单位 | |||
| mGasDetectorDevice.getTempUnit(); | |||
| addText("获取温度单位"); | |||
| break; | |||
| case R.id.btnGetPressureUnit: | |||
| //气压单位 | |||
| mGasDetectorDevice.getAirPressureUnit(); | |||
| addText("获取气压单位"); | |||
| break; | |||
| case R.id.btnGetScreenOffTime: | |||
| //息屏时间 | |||
| mGasDetectorDevice.getScreenOffTime(); | |||
| addText("获取息屏时间"); | |||
| break; | |||
| case R.id.btnGetShutdownTime: | |||
| //关机时间 | |||
| mGasDetectorDevice.getShutdownTime(); | |||
| addText("获取关机时间"); | |||
| break; | |||
| case R.id.btnGetHistory: | |||
| //历史记录 | |||
| mGasDetectorDevice.getOfflineHistory(0); | |||
| addText("获取历史记录"); | |||
| break; | |||
| case R.id.btnClearHistory: | |||
| //清空历史记录 | |||
| mGasDetectorDevice.setClearOfflineHistory(); | |||
| addText("清空历史记录"); | |||
| break; | |||
| case R.id.btnSetCo2Density: | |||
| //设置Co2浓度 | |||
| try { | |||
| int densityCo2 = Integer.parseInt(etDensity.getText().toString()); | |||
| mGasDetectorDevice.setCo2Alarm(densityCo2); | |||
| addText("设置CO2报警浓度:" + densityCo2); | |||
| } catch (NumberFormatException e) { | |||
| addText("请输入正确的数字"); | |||
| } | |||
| break; | |||
| case R.id.btnSetO2Density: | |||
| //设置O2浓度 | |||
| try { | |||
| int densityO2 = Integer.parseInt(etDensity.getText().toString()); | |||
| mGasDetectorDevice.setO2Alarm(densityO2); | |||
| addText("设置O2报警浓度:" + densityO2); | |||
| } catch (NumberFormatException e) { | |||
| addText("请输入正确的数字"); | |||
| } | |||
| break; | |||
| case R.id.btnSetCo2Interval: | |||
| //设置CO2间隔 | |||
| try { | |||
| int intervalCo2 = Integer.parseInt(etInterval.getText().toString()); | |||
| mGasDetectorDevice.setCo2Interval(intervalCo2); | |||
| addText("设置CO2间隔:" + intervalCo2); | |||
| } catch (NumberFormatException e) { | |||
| addText("请输入正确的数字"); | |||
| } | |||
| break; | |||
| case R.id.btnSetCoInterval: | |||
| //设置CO间隔 | |||
| try { | |||
| int intervalCo = Integer.parseInt(etInterval.getText().toString()); | |||
| mGasDetectorDevice.setCoInterval(intervalCo); | |||
| addText("设置CO间隔:" + intervalCo); | |||
| } catch (NumberFormatException e) { | |||
| addText("请输入正确的数字"); | |||
| } | |||
| break; | |||
| case R.id.btnSetPressureCali: | |||
| //气压校准 | |||
| try { | |||
| int hpa = Integer.parseInt(etHpa.getText().toString()); | |||
| int inHg = Integer.parseInt(etInHg.getText().toString()); | |||
| mGasDetectorDevice.setAirPressureCalibration(hpa, inHg); | |||
| addText("设置气压校准:hpa=" + hpa + " inHg=" + inHg); | |||
| } catch (NumberFormatException e) { | |||
| addText("请输入正确的数字"); | |||
| } | |||
| break; | |||
| int id = v.getId(); | |||
| if (id == R.id.btnClearLog) {//清除日志 | |||
| mList.clear(); | |||
| addText("清除日志"); | |||
| } else if (id == R.id.btnPauseLog) {//暂停日志 | |||
| isPause = !isPause; | |||
| addText("暂停日志:" + isPause); | |||
| } else if (id == R.id.btnGetCurInfo) {//实时信息 | |||
| mGasDetectorDevice.getCurrentInfo(); | |||
| addText("获取实时信息"); | |||
| } else if (id == R.id.btnSyncTime) {//同步时间 | |||
| mGasDetectorDevice.setSyncTime(); | |||
| addText("同步时间"); | |||
| } else if (id == R.id.btnGetCO2Density) {//CO2报警浓度 | |||
| mGasDetectorDevice.getCo2Alarm(); | |||
| addText("获取CO2报警浓度"); | |||
| } else if (id == R.id.btnGetCODensity) {//CO报警浓度 | |||
| mGasDetectorDevice.getCoAlarm(); | |||
| addText("获取CO报警浓度"); | |||
| } else if (id == R.id.btnGetO2Density) {//O2报警浓度 | |||
| mGasDetectorDevice.getO2Alarm(); | |||
| addText("获取O2报警浓度"); | |||
| } else if (id == R.id.btnGetCO2Interval) {//CO2间隔 | |||
| mGasDetectorDevice.getCo2Interval(); | |||
| addText("获取CO2间隔"); | |||
| } else if (id == R.id.btnGetCOInterval) {//CO间隔 | |||
| mGasDetectorDevice.getCoInterval(); | |||
| addText("获取CO间隔"); | |||
| } else if (id == R.id.btnGetHistoryInterval) {//历史记录间隔 | |||
| mGasDetectorDevice.getOfflineHistoryInterval(); | |||
| addText("获取历史记录间隔"); | |||
| } else if (id == R.id.btnGetCO2Switch) {//CO2开关 | |||
| mGasDetectorDevice.getCo2Switch(); | |||
| addText("获取CO2开关"); | |||
| } else if (id == R.id.btnGetCOSwitch) {//CO开关 | |||
| mGasDetectorDevice.getCoSwitch(); | |||
| addText("获取CO开关"); | |||
| } else if (id == R.id.btnGetSoundSwitch) {//声音开关 | |||
| mGasDetectorDevice.getSoundSwitch(); | |||
| addText("获取声音开关"); | |||
| } else if (id == R.id.btnGetShakeSwitch) {//震动开关 | |||
| mGasDetectorDevice.getShockSwitch(); | |||
| addText("获取震动开关"); | |||
| } else if (id == R.id.btnGetTempUnit) {//温度单位 | |||
| mGasDetectorDevice.getTempUnit(); | |||
| addText("获取温度单位"); | |||
| } else if (id == R.id.btnGetPressureUnit) {//气压单位 | |||
| mGasDetectorDevice.getAirPressureUnit(); | |||
| addText("获取气压单位"); | |||
| } else if (id == R.id.btnGetScreenOffTime) {//息屏时间 | |||
| mGasDetectorDevice.getScreenOffTime(); | |||
| addText("获取息屏时间"); | |||
| } else if (id == R.id.btnGetShutdownTime) {//关机时间 | |||
| mGasDetectorDevice.getShutdownTime(); | |||
| addText("获取关机时间"); | |||
| } else if (id == R.id.btnGetHistory) {//历史记录 | |||
| mGasDetectorDevice.getOfflineHistory(0); | |||
| addText("获取历史记录"); | |||
| } else if (id == R.id.btnClearHistory) {//清空历史记录 | |||
| mGasDetectorDevice.setClearOfflineHistory(); | |||
| addText("清空历史记录"); | |||
| } else if (id == R.id.btnSetCo2Density) {//设置Co2浓度 | |||
| try { | |||
| int densityCo2 = Integer.parseInt(etDensity.getText().toString()); | |||
| mGasDetectorDevice.setCo2Alarm(densityCo2); | |||
| addText("设置CO2报警浓度:" + densityCo2); | |||
| } catch (NumberFormatException e) { | |||
| addText("请输入正确的数字"); | |||
| } | |||
| } else if (id == R.id.btnSetO2Density) {//设置O2浓度 | |||
| try { | |||
| int densityO2 = Integer.parseInt(etDensity.getText().toString()); | |||
| mGasDetectorDevice.setO2Alarm(densityO2); | |||
| addText("设置O2报警浓度:" + densityO2); | |||
| } catch (NumberFormatException e) { | |||
| addText("请输入正确的数字"); | |||
| } | |||
| } else if (id == R.id.btnSetCo2Interval) {//设置CO2间隔 | |||
| try { | |||
| int intervalCo2 = Integer.parseInt(etInterval.getText().toString()); | |||
| mGasDetectorDevice.setCo2Interval(intervalCo2); | |||
| addText("设置CO2间隔:" + intervalCo2); | |||
| } catch (NumberFormatException e) { | |||
| addText("请输入正确的数字"); | |||
| } | |||
| } else if (id == R.id.btnSetCoInterval) {//设置CO间隔 | |||
| try { | |||
| int intervalCo = Integer.parseInt(etInterval.getText().toString()); | |||
| mGasDetectorDevice.setCoInterval(intervalCo); | |||
| addText("设置CO间隔:" + intervalCo); | |||
| } catch (NumberFormatException e) { | |||
| addText("请输入正确的数字"); | |||
| } | |||
| } else if (id == R.id.btnSetPressureCali) {//气压校准 | |||
| try { | |||
| int hpa = Integer.parseInt(etHpa.getText().toString()); | |||
| int inHg = Integer.parseInt(etInHg.getText().toString()); | |||
| mGasDetectorDevice.setAirPressureCalibration(hpa, inHg); | |||
| addText("设置气压校准:hpa=" + hpa + " inHg=" + inHg); | |||
| } catch (NumberFormatException e) { | |||
| addText("请输入正确的数字"); | |||
| } | |||
| } | |||
| } | |||
| @@ -371,8 +332,12 @@ public class GasDetectorActivity extends BleAppNewBaseActivity implements View.O | |||
| private SimpleDateFormat sdf; | |||
| private String mOldText = ""; | |||
| private boolean isPause = false; | |||
| private void addText(String text) { | |||
| if (isPause && !mList.isEmpty()) { | |||
| return; | |||
| } | |||
| if (mOldText.equals(text)) { | |||
| return; | |||
| } | |||
| @@ -0,0 +1,440 @@ | |||
| package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.gasDetectorPlus; | |||
| import android.os.Message; | |||
| import android.text.TextUtils; | |||
| import android.view.View; | |||
| import android.widget.ArrayAdapter; | |||
| import android.widget.EditText; | |||
| import android.widget.ListView; | |||
| import androidx.appcompat.app.ActionBar; | |||
| import com.pingwang.bluetoothlib.AILinkBleManager; | |||
| import com.pingwang.bluetoothlib.device.BleDevice; | |||
| import com.pingwang.bluetoothlib.listener.OnCallbackBle; | |||
| import java.text.SimpleDateFormat; | |||
| import java.util.ArrayList; | |||
| import java.util.Arrays; | |||
| import java.util.List; | |||
| import java.util.Locale; | |||
| import java.util.Map; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleAppNewBaseActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.UnitUtils; | |||
| import cn.net.aicare.modulelibrary.module.gasDetectorPlus.GasDetectorPlusBleDevice; | |||
| import cn.net.aicare.modulelibrary.module.gasDetectorPlus.OnGasDetectorPlusInfoListener; | |||
| import cn.net.aicare.modulelibrary.module.gasDetectorPlus.bean.GasAlarmInfoBean; | |||
| import cn.net.aicare.modulelibrary.module.gasDetectorPlus.bean.GasDetectorPlusCurrentInfoBean; | |||
| /** | |||
| * 气体检测仪界面(华普) | |||
| * | |||
| * @author xing | |||
| * @date 2024/09/05 | |||
| */ | |||
| public class GasDetectorPlusActivity extends BleAppNewBaseActivity implements View.OnClickListener, OnCallbackBle, OnGasDetectorPlusInfoListener { | |||
| private String mMac = ""; | |||
| private EditText et1, et2; | |||
| private GasDetectorPlusBleDevice mGasDetectorPlusBleDevice; | |||
| private ListView list_view; | |||
| private List<String> mList; | |||
| private ArrayAdapter mListAdapter; | |||
| private List<String> mGasList = new ArrayList<>(Arrays.asList( | |||
| "O2", "CO2", "TVOC(PID)", "TVOC", "CO", "H2S", "NO", "NO2", "SO2", "H2", "O3", "NH3", "HCN", "HCI", "H2O2", "CH2O", | |||
| "C2H4", "Cl2", "ClO2", "C2H4O", "PH3", "HF", "F2", "C4H8S", "ASH3", "SIH4", "CH3SH", "CH4O", "C2H6O", "C4H", "C3H8O", "COF2", | |||
| "BF3", "CH4", "C3H6O", "C2H2", "C6H6", "C6H14", "C3H8", "温度", "湿度" | |||
| )); | |||
| @Override | |||
| protected void uiHandlerMessage(Message msg) { | |||
| } | |||
| @Override | |||
| protected int getLayoutId() { | |||
| return R.layout.activity_gas_detector_plus; | |||
| } | |||
| @Override | |||
| protected void initListener() { | |||
| ActionBar supportActionBar = getSupportActionBar(); | |||
| if (supportActionBar != null) { | |||
| supportActionBar.setTitle("气体检测仪(BLE+WIFI)"); | |||
| } | |||
| } | |||
| @Override | |||
| public void onClick(View v) { | |||
| int id = v.getId(); | |||
| if (id == R.id.btnClearLog) {//清除日志 | |||
| mList.clear(); | |||
| addText("清除日志"); | |||
| } else if (id == R.id.btnPauseLog) {//暂停日志 | |||
| isPause = !isPause; | |||
| addText("暂停日志:" + isPause); | |||
| } else if (id == R.id.btnGetSupportGas) {//支持的气体类型(0x01) | |||
| mGasDetectorPlusBleDevice.getSupportedGas(); | |||
| addText("获取支持的气体类型(0x01)"); | |||
| } else if (id == R.id.btnGetSupportFun) {//获取支持的功能列表 | |||
| mGasDetectorPlusBleDevice.getSupportedFun(); | |||
| addText("获取支持的功能列表(0x02)"); | |||
| } else if (id == R.id.btnGetAlarmSwitch) {//警报推送开关(0x03) | |||
| mGasDetectorPlusBleDevice.getAlarmSwitch(); | |||
| addText("获取警报推送开关(0x03)"); | |||
| } else if (id == R.id.btnSetAlarmSwitch) {//警报推送开关(0x03) | |||
| alarmSwitch = alarmSwitch == 1 ? 0 : 1; | |||
| mGasDetectorPlusBleDevice.setAlarmSwitch(alarmSwitch); | |||
| addText("设置警报推送开关(0x03):" + alarmSwitch); | |||
| } else if (id == R.id.btnGetAlarmTime) {//报警时长设置(0x04) | |||
| mGasDetectorPlusBleDevice.getAlarmTime(); | |||
| addText("获取报警时长设置(0x04)"); | |||
| } else if (id == R.id.btnGetAlarmFrequency) {//报警频率(0x0A) | |||
| mGasDetectorPlusBleDevice.getAlarmFrequency(); | |||
| addText("获取报警频率(0x0A)"); | |||
| } else if (id == R.id.btnGetGasInfo) {//气体信息(0x09) | |||
| mGasDetectorPlusBleDevice.getGasInfo(); | |||
| addText("获取气体信息(0x09)"); | |||
| } else if (id == R.id.btnSaveFrequency) {//离线数据存储频率(0x07) | |||
| int frequency = 0; | |||
| try { | |||
| frequency = Integer.parseInt(et1.getText().toString().trim()); | |||
| } catch (NumberFormatException e) { | |||
| e.printStackTrace(); | |||
| } | |||
| mGasDetectorPlusBleDevice.setHistorySaveFrequency(frequency); | |||
| addText("设置离线数据存储频率(0x07):" + frequency); | |||
| } else if (id == R.id.btnReportInterval) {//数据上报间隔(0x08) | |||
| int interval = 0; | |||
| try { | |||
| interval = Integer.parseInt(et1.getText().toString().trim()); | |||
| } catch (NumberFormatException e) { | |||
| e.printStackTrace(); | |||
| } | |||
| mGasDetectorPlusBleDevice.setDataReportInterval(interval); | |||
| addText("设置数据上报间隔(0x08):" + interval); | |||
| } else if (id == R.id.btnGetAlarmRing) { | |||
| int ring = 0; | |||
| try { | |||
| ring = Integer.parseInt(et2.getText().toString().trim()); | |||
| } catch (NumberFormatException e) { | |||
| e.printStackTrace(); | |||
| } | |||
| mGasDetectorPlusBleDevice.setAlarmRing(ring); | |||
| addText("报警铃声设置(0x05):" + ring); | |||
| } else if (id == R.id.btnAlarmRingTest) { | |||
| int ringTest = 0; | |||
| try { | |||
| ringTest = Integer.parseInt(et2.getText().toString().trim()); | |||
| } catch (NumberFormatException e) { | |||
| e.printStackTrace(); | |||
| } | |||
| mGasDetectorPlusBleDevice.setAlarmRingTest(ringTest); | |||
| addText("报警铃声试听(0x06):" + ringTest); | |||
| } else if (id == R.id.btnGetPowerInfo) {//请求获取设备电量信息(0x0C) | |||
| mGasDetectorPlusBleDevice.getPowerInfo(); | |||
| addText("请求获取设备电量信息(0x0C)"); | |||
| } else if (id == R.id.btnSetTime) { | |||
| long second = System.currentTimeMillis() / 1000; | |||
| mGasDetectorPlusBleDevice.setSyncTime(second); | |||
| addText("下发同步时间(0x0E):\n" + second + "秒"); | |||
| } | |||
| } | |||
| @Override | |||
| protected void initData() { | |||
| mMac = getIntent().getStringExtra("mac"); | |||
| mList = new ArrayList<>(); | |||
| mListAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | |||
| list_view.setAdapter(mListAdapter); | |||
| addText("连接成功:" + mMac); | |||
| onServiceSuccess(); | |||
| } | |||
| @Override | |||
| protected void initView() { | |||
| et1 = (EditText) findViewById(R.id.et1); | |||
| et2 = (EditText) findViewById(R.id.et2); | |||
| list_view = findViewById(R.id.list_view); | |||
| } | |||
| @Override | |||
| public void onServiceSuccess() { | |||
| if (TextUtils.isEmpty(mMac)) { | |||
| return; | |||
| } | |||
| if (mGasDetectorPlusBleDevice != null) { | |||
| return; | |||
| } | |||
| AILinkBleManager.getInstance().setOnCallbackBle(this); | |||
| BleDevice bleDevice = AILinkBleManager.getInstance().getBleDevice(mMac); | |||
| mGasDetectorPlusBleDevice = GasDetectorPlusBleDevice.init(bleDevice); | |||
| mGasDetectorPlusBleDevice.addOnGasDetectorInfoListener(this); | |||
| mGasDetectorPlusBleDevice.setOnShowData(new GasDetectorPlusBleDevice.OnShowData() { | |||
| @Override | |||
| public void showData(String data) { | |||
| addText("收到的vlaue数据:" + data); | |||
| } | |||
| }); | |||
| } | |||
| @Override | |||
| public void onServiceErr() { | |||
| } | |||
| @Override | |||
| public void unbindServices() { | |||
| } | |||
| @Override | |||
| public void onDisConnected(String mac, int code) { | |||
| if (mac.equals(this.mMac)) { | |||
| if (mGasDetectorPlusBleDevice != null) { | |||
| mGasDetectorPlusBleDevice.removeOnGasDetectorInfoListener(this); | |||
| mGasDetectorPlusBleDevice = null; | |||
| } | |||
| addText("断开连接:" + mac + " code:" + code); | |||
| } | |||
| } | |||
| @Override | |||
| public void onSupportedGas(Map<Integer, Boolean> map) { | |||
| StringBuilder showData = new StringBuilder(); | |||
| for (Integer key : map.keySet()) { | |||
| if (map.get(key)) { | |||
| if (key >= mGasList.size()) { | |||
| break; | |||
| } | |||
| String name = mGasList.get(key); | |||
| showData.append(name).append("\n"); | |||
| } | |||
| } | |||
| addText("支持的气体类型(0x01):\n" + showData); | |||
| } | |||
| @Override | |||
| public void onSupportedFun(Map<Integer, Boolean> map) { | |||
| StringBuilder data = new StringBuilder(); | |||
| for (Integer key : map.keySet()) { | |||
| String str = map.get(key) ? "支持" : "不支持"; | |||
| switch (key) { | |||
| case 0: | |||
| data.append("报警推送:").append(str).append("\n"); | |||
| break; | |||
| case 1: | |||
| data.append("报警时长:").append(str).append("\n"); | |||
| break; | |||
| case 2: | |||
| data.append("报警铃声:").append(str).append("\n"); | |||
| break; | |||
| case 3: | |||
| data.append("报警推送频率:").append(str).append("\n"); | |||
| break; | |||
| } | |||
| } | |||
| addText("支持的功能列表(0x02):" + data); | |||
| } | |||
| int alarmSwitch = 0; | |||
| @Override | |||
| public void onAlarmSwitch(int switchStatus) { | |||
| alarmSwitch = switchStatus; | |||
| addText("警报推送开关(0x03):" + (switchStatus == 1 ? "打开" : "关闭")); | |||
| } | |||
| @Override | |||
| public void onAlarmTime(int current, int[] supportTimes) { | |||
| String min; | |||
| switch (current) { | |||
| case 0: | |||
| min = "一直报警"; | |||
| break; | |||
| case 1: | |||
| min = "15S报警"; | |||
| break; | |||
| case 2: | |||
| min = "30S报警"; | |||
| break; | |||
| case 3: | |||
| min = "45S报警"; | |||
| break; | |||
| case 4: | |||
| min = "1分钟报警"; | |||
| break; | |||
| case 5: | |||
| min = "2分钟报警"; | |||
| break; | |||
| case 6: | |||
| min = "3分钟报警"; | |||
| break; | |||
| default: | |||
| min = "未知"; | |||
| break; | |||
| } | |||
| addText("报警时长设置(0x04):选中" + current + "项," + min + "分钟" + " 支持的时长选项:" + Arrays.toString(supportTimes)); | |||
| } | |||
| @Override | |||
| public void onAlarmRing(int current, int[] supportedRing) { | |||
| String str; | |||
| switch (current) { | |||
| case 1: | |||
| str = "铃声1"; | |||
| break; | |||
| case 2: | |||
| str = "铃声2"; | |||
| break; | |||
| case 3: | |||
| str = "铃声3"; | |||
| break; | |||
| case 4: | |||
| str = "铃声4"; | |||
| break; | |||
| case 5: | |||
| str = "铃声5"; | |||
| break; | |||
| case 6: | |||
| str = "铃声6"; | |||
| break; | |||
| default: | |||
| str = "未知"; | |||
| break; | |||
| } | |||
| addText("报警铃声设置(0x05):选中" + current + "项," + str + " 支持的时长:" + Arrays.toString(supportedRing)); | |||
| } | |||
| @Override | |||
| public void onAlarmRingTest(int position) { | |||
| addText("报警铃声试听(0x06):选中" + position + "项"); | |||
| } | |||
| @Override | |||
| public void onHistorySaveFrequency(int frequency) { | |||
| addText("离线数据存储频率(0x07):频率" + frequency + "分钟"); | |||
| } | |||
| @Override | |||
| public void onDataReportInterval(int interval) { | |||
| addText("数据上报间隔(0x08):间隔" + interval + "分钟"); | |||
| } | |||
| @Override | |||
| public void onAlarmFrequency(int frequency) { | |||
| addText("报警频率(0x0A):频率" + frequency + "秒"); | |||
| } | |||
| @Override | |||
| public void onAlarmGasInfo(List<GasAlarmInfoBean> list) { | |||
| StringBuilder showData = new StringBuilder(); | |||
| for (GasAlarmInfoBean gasAlarmInfoBean : list) { | |||
| showData.append(mGasList.get(gasAlarmInfoBean.getType())).append(" ").append(gasAlarmInfoBean.getStatus() == 1 ? "报警" : "正常").append("\n"); | |||
| } | |||
| addText("报警的气体信息(0x0B):\n" + showData); | |||
| } | |||
| @Override | |||
| public void onPowerInfo(int status, int power) { | |||
| addText("设备电量信息(0x0C):\n" + power + "%"); | |||
| } | |||
| @Override | |||
| public void onUnitInfo(int type, int unit) { | |||
| String unitStr = "ppm"; | |||
| switch (unit) { | |||
| case 0: | |||
| unitStr = "ppm"; | |||
| break; | |||
| case 1: | |||
| unitStr = "%"; | |||
| break; | |||
| case 2: | |||
| unitStr = "mg/m³"; | |||
| break; | |||
| case 3: | |||
| unitStr = "℃"; | |||
| break; | |||
| case 4: | |||
| unitStr = "℉"; | |||
| break; | |||
| } | |||
| addText("单位设置(0x0D):\n类型:" + mGasList.get(type) + " 单位:" + unitStr); | |||
| } | |||
| @Override | |||
| public void onSyncTime() { | |||
| long second = System.currentTimeMillis() / 1000; | |||
| mGasDetectorPlusBleDevice.setSyncTime(second); | |||
| addText("同步时间(0x0E):\n" + second + "秒"); | |||
| } | |||
| @Override | |||
| public void onGasInfo(GasDetectorPlusCurrentInfoBean bean) { | |||
| SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US); | |||
| String time = simpleDateFormat.format(bean.getTimeSeconds() * 1000); | |||
| StringBuilder showData = new StringBuilder(time + ":\n"); | |||
| for (GasDetectorPlusCurrentInfoBean.GasInfo gasInfo : bean.getGasInfoList()) { | |||
| String unitStr = "ppm"; | |||
| switch (gasInfo.getUnit()) { | |||
| case 0: | |||
| unitStr = "ppm"; | |||
| break; | |||
| case 1: | |||
| unitStr = "%"; | |||
| break; | |||
| case 2: | |||
| unitStr = "mg/m³"; | |||
| break; | |||
| case 3: | |||
| unitStr = "℃"; | |||
| break; | |||
| case 4: | |||
| unitStr = "℉"; | |||
| break; | |||
| } | |||
| String valueStr = UnitUtils.getHoldDecimal(gasInfo.getDecimal(), gasInfo.getValue()); | |||
| showData.append(mGasList.get(gasInfo.getType())).append(" ").append(valueStr).append(unitStr).append("\n"); | |||
| } | |||
| addText("气体信息(0x09):\n" + showData); | |||
| } | |||
| private SimpleDateFormat sdf; | |||
| private String mOldText = ""; | |||
| private boolean isPause = false; | |||
| private void addText(String text) { | |||
| if (isPause && !mList.isEmpty()) { | |||
| return; | |||
| } | |||
| if (mOldText.equals(text)) { | |||
| return; | |||
| } | |||
| if (sdf == null) { | |||
| sdf = new SimpleDateFormat("HH:mm:ss", Locale.US); | |||
| } | |||
| mList.add(0, sdf.format(System.currentTimeMillis()) + ":\n" + text); | |||
| mListAdapter.notifyDataSetChanged(); | |||
| } | |||
| @Override | |||
| protected void onDestroy() { | |||
| super.onDestroy(); | |||
| AILinkBleManager.getInstance().removeOnCallbackBle(this); | |||
| if (mGasDetectorPlusBleDevice != null) { | |||
| mGasDetectorPlusBleDevice.clear(); | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,580 @@ | |||
| package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.hmiBodyFat; | |||
| import android.content.pm.ActivityInfo; | |||
| import android.os.Bundle; | |||
| import android.os.Handler; | |||
| import android.os.Message; | |||
| import android.view.View; | |||
| import android.widget.ArrayAdapter; | |||
| import android.widget.EditText; | |||
| import android.widget.ListView; | |||
| import android.widget.RadioButton; | |||
| import androidx.annotation.Nullable; | |||
| import com.pingwang.bluetoothlib.bean.BleValueBean; | |||
| import com.pingwang.bluetoothlib.config.CmdConfig; | |||
| import com.pingwang.bluetoothlib.device.BleDevice; | |||
| import com.pingwang.bluetoothlib.listener.OnCallbackBle; | |||
| import java.lang.ref.WeakReference; | |||
| import java.util.ArrayList; | |||
| import java.util.List; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.AddUserDialog; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.bean.UserBean; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.HmiAppHistoryRecordBean; | |||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.HmiBodyFatBleUtilsData; | |||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.HmiBodyFatDataUtil; | |||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.HmiBodyFatRecordBean; | |||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.HmiBodyFatUserBean; | |||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.HmiMcuHistoryRecordBean; | |||
| /** | |||
| * HMI蓝牙体脂秤 | |||
| */ | |||
| public class HmiBodyFatScaleBleActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, HmiBodyFatBleUtilsData.BleBodyFatCallback { | |||
| private String TAG = HmiBodyFatScaleBleActivity.class.getName(); | |||
| private String mAddress; | |||
| private List<String> mlogList; | |||
| private List<String> mUserlogList; | |||
| private ArrayAdapter listAdapter; | |||
| private ArrayAdapter userAdapter; | |||
| private HmiBodyFatBleUtilsData bodyFatBleUtilsData; | |||
| private MHandler mMHandler; | |||
| private EditText mEditText; | |||
| private RadioButton kg, jing, stlb, lb; | |||
| private List<HmiBodyFatUserBean> mUsers; | |||
| private HmiBodyFatUserBean selectUser; | |||
| private int weighunit = HmiBodyFatDataUtil.KG; | |||
| private ListView loglistView; | |||
| private ListView userlistView; | |||
| @Override | |||
| protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
| super.onCreate(savedInstanceState); | |||
| setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//禁止横屏 | |||
| setContentView(R.layout.activity_hmi_body_fat_scale_ble); | |||
| initView(); | |||
| setUnitInit(); | |||
| initdata(); | |||
| } | |||
| private void initView() { | |||
| findViewById(R.id.history).setOnClickListener(this); | |||
| findViewById(R.id.userlist).setOnClickListener(this); | |||
| findViewById(R.id.btnUser).setOnClickListener(this); | |||
| findViewById(R.id.adduser).setOnClickListener(this); | |||
| findViewById(R.id.syntime).setOnClickListener(this); | |||
| kg = findViewById(R.id.kg); | |||
| jing = findViewById(R.id.jin); | |||
| stlb = findViewById(R.id.st_lb); | |||
| lb = findViewById(R.id.lb); | |||
| mEditText = findViewById(R.id.edit_Userid); | |||
| kg.setChecked(true); | |||
| loglistView = findViewById(R.id.log_list); | |||
| userlistView = findViewById(R.id.user_list); | |||
| } | |||
| private void initdata() { | |||
| mAddress = getIntent().getStringExtra("mac"); | |||
| WeakReference weakReference = new WeakReference(new MHandler()); | |||
| mMHandler = (MHandler) weakReference.get(); | |||
| mlogList = new ArrayList<>(); | |||
| listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mlogList); | |||
| loglistView.setAdapter(listAdapter); | |||
| HmiBodyFatUserBean defaultUser = getdefault(); | |||
| selectUser = defaultUser; | |||
| mUsers = new ArrayList<>(); | |||
| mUsers.add(defaultUser); | |||
| mUserlogList = new ArrayList<>(); | |||
| mUserlogList.add(defaultUser.toString()); | |||
| userAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mUserlogList); | |||
| userlistView.setAdapter(userAdapter); | |||
| } | |||
| private HmiBodyFatUserBean getdefault() { | |||
| HmiBodyFatUserBean user = new HmiBodyFatUserBean(); | |||
| user.setModeType(HmiBodyFatDataUtil.MODE_ORDINARY); | |||
| user.setSex(HmiBodyFatDataUtil.SEX_MAN); | |||
| user.setAge(18); | |||
| user.setHeight(170); | |||
| user.setAdc(560); | |||
| user.setWeight(50); | |||
| user.setId(1); | |||
| return user; | |||
| } | |||
| private void setUnitInit() { | |||
| kg.setOnCheckedChangeListener((buttonView, isChecked) -> { | |||
| if (isChecked) { | |||
| weighunit = HmiBodyFatDataUtil.KG; | |||
| if (bodyFatBleUtilsData != null) { | |||
| bodyFatBleUtilsData.setWeightUnit(weighunit); | |||
| } | |||
| } | |||
| }); | |||
| jing.setOnCheckedChangeListener((buttonView, isChecked) -> { | |||
| if (isChecked) { | |||
| weighunit = HmiBodyFatDataUtil.JIN; | |||
| if (bodyFatBleUtilsData != null) { | |||
| bodyFatBleUtilsData.setWeightUnit(weighunit); | |||
| } | |||
| } | |||
| }); | |||
| stlb.setOnCheckedChangeListener((buttonView, isChecked) -> { | |||
| if (isChecked) { | |||
| weighunit = HmiBodyFatDataUtil.ST; | |||
| if (bodyFatBleUtilsData != null) { | |||
| bodyFatBleUtilsData.setWeightUnit(weighunit); | |||
| } | |||
| } | |||
| }); | |||
| lb.setOnCheckedChangeListener((buttonView, isChecked) -> { | |||
| if (isChecked) { | |||
| weighunit = HmiBodyFatDataUtil.LB; | |||
| if (bodyFatBleUtilsData != null) { | |||
| bodyFatBleUtilsData.setWeightUnit(weighunit); | |||
| } | |||
| } | |||
| }); | |||
| } | |||
| @Override | |||
| public void onServiceSuccess() { | |||
| mlogList.add(0, "服务与界面建立连接成功"); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| // BleLog.i(TAG, "服务与界面建立连接成功"); | |||
| //与服务建立连接 | |||
| if (mAILinkBleManager != null) { | |||
| mAILinkBleManager.setOnCallbackBle(this); | |||
| BleDevice bleDevice = mAILinkBleManager.getBleDevice(mAddress); | |||
| if (bleDevice != null) { | |||
| HmiBodyFatBleUtilsData.init(bleDevice, this); | |||
| bodyFatBleUtilsData = HmiBodyFatBleUtilsData.getInstance(); | |||
| if (bodyFatBleUtilsData != null) { | |||
| bodyFatBleUtilsData.setWeightUnit(weighunit); | |||
| bodyFatBleUtilsData.synSysTime(); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @Override | |||
| public void onServiceErr() { | |||
| mlogList.add(0, "服务与界面建立连接出错"); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void unbindServices() { | |||
| mlogList.add(0, "服务与界面建立断开连接成功"); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| if (mAILinkBleManager != null) { | |||
| mAILinkBleManager.removeOnCallbackBle(this); | |||
| } | |||
| } | |||
| @Override | |||
| public void onStartScan() { | |||
| mlogList.add(0, "开始扫描"); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onScanning(BleValueBean data) { | |||
| mlogList.add(0, "扫描中"); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onScanTimeOut() { | |||
| mlogList.add(0, "扫描超时"); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onConnecting(String mac) { | |||
| mlogList.add(0, "正在连接" + mac); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onDisConnected(String mac, int code) { | |||
| mlogList.add(0, "断开连接" + mac); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onServicesDiscovered(String mac) { | |||
| mlogList.add(0, "发现蓝牙服务" + mac); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void bleOpen() { | |||
| mlogList.add(0, "蓝牙打开"); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void bleClose() { | |||
| mlogList.add(0, "蓝牙关闭"); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| private String mOldData = ""; | |||
| @Override | |||
| public void onWeightData(int status, float weight, int weightUnit, int decimals) { | |||
| String data = "体重数据类型:" + (status == HmiBodyFatDataUtil.WEIGHT_TESTING ? "实时" : "稳定") + "\n体重: " + weight + " 单位:" + weightUnit + " 小数点位: " + decimals; | |||
| if (mOldData.equals(data)) { | |||
| return; | |||
| } | |||
| if (status == HmiBodyFatDataUtil.WEIGHT_RESULT) { | |||
| //稳定体重 | |||
| selectUser.setWeight(weight); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_USER); | |||
| } | |||
| mOldData = data; | |||
| mlogList.add(0, data); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| private int mOldStatus = -1; | |||
| @Override | |||
| public void onStatus(int status) { | |||
| if (mOldStatus == status) { | |||
| return; | |||
| } | |||
| mOldStatus = status; | |||
| switch (status) { | |||
| case HmiBodyFatDataUtil.WEIGHT_TESTING: | |||
| mlogList.add(0, "测量状态:" + status + " 测量实时体重"); | |||
| break; | |||
| case HmiBodyFatDataUtil.WEIGHT_RESULT: | |||
| mlogList.add(0, "测量状态:" + status + " 稳定体重"); | |||
| break; | |||
| case HmiBodyFatDataUtil.IMPEDANCE_TESTING: | |||
| mlogList.add(0, "测量状态:" + status + " 阻抗测量中"); | |||
| break; | |||
| case HmiBodyFatDataUtil.IMPEDANCE_SUCCESS: | |||
| case HmiBodyFatDataUtil.IMPEDANCE_SUCCESS_DATA: | |||
| mlogList.add(0, "测量状态:" + status + " 阻抗测量成功"); | |||
| break; | |||
| case HmiBodyFatDataUtil.IMPEDANCE_FAIL: | |||
| mlogList.add(0, "测量状态:" + status + " 阻抗测量失败"); | |||
| break; | |||
| case HmiBodyFatDataUtil.HEART_TESTING: | |||
| mlogList.add(0, "测量状态:" + status + " 心率测量中"); | |||
| break; | |||
| case HmiBodyFatDataUtil.HEART_SUCCESS: | |||
| mlogList.add(0, "测量状态:" + status + " 心率测量成功"); | |||
| break; | |||
| case HmiBodyFatDataUtil.HEART_FAIL: | |||
| mlogList.add(0, "测量状态:" + status + " 心率测量失败"); | |||
| break; | |||
| case HmiBodyFatDataUtil.TEST_FINISH: | |||
| mlogList.add(0, "测量状态:" + status + " 测量完成"); | |||
| if (bodyFatBleUtilsData != null) { | |||
| bodyFatBleUtilsData.updateUserInfo(selectUser); | |||
| } | |||
| break; | |||
| case HmiBodyFatDataUtil.MUC_REQUEST_USER_INFO: | |||
| mlogList.add(0, "测量状态:" + status + "请求用户信息"); | |||
| if (bodyFatBleUtilsData != null) { | |||
| bodyFatBleUtilsData.setUserInfo(selectUser); | |||
| } | |||
| break; | |||
| default: | |||
| mlogList.add(0, "测量状态:" + status); | |||
| } | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onAdc(int adc, int algorithmic) { | |||
| mlogList.add(0, "阻抗:" + adc + " 算法位:" + algorithmic); | |||
| selectUser.setAdc(adc); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_USER); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onHeartRate(int heartrate) { | |||
| mlogList.add(0, "心率:" + heartrate); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onBodyFat(HmiBodyFatRecordBean bodyFatRecord) { | |||
| mlogList.add(0, "体脂数:" + bodyFatRecord.toString()); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onError(int code) { | |||
| mlogList.add(0, "错误码:" + code); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onHistoryMcu(HmiMcuHistoryRecordBean mcuHistoryRecordBean) { | |||
| mlogList.add(0, "历史记录Mcu:" + mcuHistoryRecordBean.toString()); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onHistoryApp(HmiAppHistoryRecordBean appHistoryRecordBean) { | |||
| mlogList.add(0, "历史记录app:" + appHistoryRecordBean.toString()); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onVersion(String version) { | |||
| mlogList.add(0, "版本号:" + version); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onMcuBatteryStatus(int status, int battery) { | |||
| mlogList.add(0, "电量状态" + status + " 电量:" + battery); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onSysTime(int status, int[] times) { | |||
| mlogList.add(0, "时间状态" + status); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void requestSynTime() { | |||
| mlogList.add(0, "同步时间"); | |||
| if (bodyFatBleUtilsData != null) | |||
| bodyFatBleUtilsData.synMcuTime(); | |||
| } | |||
| @Override | |||
| public void setTimeCallback(int type, int status) { | |||
| String msg = ""; | |||
| if (type == CmdConfig.SET_SYS_TIME) { | |||
| msg = "设置系统当前时间:"; | |||
| } else if (type == CmdConfig.SET_DEVICE_TIME) { | |||
| msg = "同步时间"; | |||
| } | |||
| if (status == HmiBodyFatDataUtil.STATUS_SUCCESS) { | |||
| msg = msg + status + " 成功"; | |||
| } else if (status == HmiBodyFatDataUtil.STATUS_FAIL) { | |||
| msg = msg + status + " 失败"; | |||
| } else if (status == HmiBodyFatDataUtil.STATUS_NOT_SUPPORT) { | |||
| msg = msg + status + " 不支持"; | |||
| } | |||
| mlogList.add(0, msg); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void requestSynHistoryCallback(int status) { | |||
| if (status == 0) { | |||
| mlogList.add(0, "请求历史记录:" + status + " 无历史记录"); | |||
| } else if (status == 1) { | |||
| mlogList.add(0, "请求历史记录:" + status + " 开始发送历史记录"); | |||
| } else { | |||
| mlogList.add(0, "请求历史记录:" + status + " 发送历史记录结束"); | |||
| } | |||
| } | |||
| @Override | |||
| public void updateUserCallback(int status) { | |||
| if (status == 0) { | |||
| mlogList.add(0, "更新用户或列表回调" + status + " 更新列表成功"); | |||
| } else if (status == 1) { | |||
| mlogList.add(0, "更新用户或列表回调" + status + " 更新个人用户成功"); | |||
| } else if (status == 2) { | |||
| mlogList.add(0, "更新用户或列表回调" + status + " 更新列表失败"); | |||
| } else { | |||
| mlogList.add(0, "更新用户或列表回调" + status + " 更新个人用户失败"); | |||
| } | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| /** | |||
| * @param status {@link#Bod} | |||
| */ | |||
| @Override | |||
| public void setUnitCallback(int status) { | |||
| if (status == 0) { | |||
| mlogList.add(0, "下发单位回调" + status + " 成功"); | |||
| } else if (status == 1) { | |||
| mlogList.add(0, "下发单位回调" + status + " 失败"); | |||
| } else { | |||
| mlogList.add(0, "下发单位回调" + status + " 不支持"); | |||
| } | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void requestUserData(int status) { | |||
| if (status == 0x01) { | |||
| mlogList.add(0, "下发用户信息 " + status); | |||
| } else if (status == 0x03) { | |||
| mlogList.add(0, "下发用户信息成功 " + status); | |||
| } else { | |||
| mlogList.add(0, "下发用户信息失败 " + status); | |||
| } | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onOtaCallback(int status) { | |||
| } | |||
| @Override | |||
| public void onIpData(String ip) { | |||
| } | |||
| @Override | |||
| public void onPortData(int port) { | |||
| } | |||
| @Override | |||
| public void onUrlData(String url) { | |||
| } | |||
| @Override | |||
| public void onClick(View v) { | |||
| int id = v.getId(); | |||
| if (id == R.id.history) { | |||
| if (bodyFatBleUtilsData != null) | |||
| bodyFatBleUtilsData.requestSynHistory(); | |||
| } else if (id == R.id.btnUser) { | |||
| if (!mEditText.getText().toString().trim().isEmpty()) { | |||
| int userid = Integer.parseInt(mEditText.getText().toString().trim()); | |||
| if (mUsers.size() >= userid) { | |||
| selectUser = mUsers.get(userid - 1); | |||
| if (bodyFatBleUtilsData != null) { | |||
| bodyFatBleUtilsData.updateUserInfo(selectUser); | |||
| } | |||
| } | |||
| } else { | |||
| addLog("请输入正确的用户ID"); | |||
| } | |||
| } else if (id == R.id.userlist) { | |||
| bodyFatBleUtilsData.setUserInfoList(mUsers); | |||
| if (bodyFatBleUtilsData != null) | |||
| bodyFatBleUtilsData.updateUsersComplete(); | |||
| } else if (id == R.id.adduser) { | |||
| AddUserDialog addUserDialog = new AddUserDialog(new AddUserDialog.OnDialogListener() { | |||
| @Override | |||
| public void tvSucceedListener(UserBean user) { | |||
| user.setId(mUsers.size() + 1); | |||
| mUsers.add(getHmiBodyFatUserBean(user)); | |||
| mUserlogList.add(user.toString()); | |||
| userAdapter.notifyDataSetChanged(); | |||
| } | |||
| }); | |||
| addUserDialog.show(getSupportFragmentManager()); | |||
| } else if (id == R.id.syntime) { | |||
| if (bodyFatBleUtilsData != null) { | |||
| bodyFatBleUtilsData.synSysTime(); | |||
| } | |||
| } | |||
| } | |||
| private HmiBodyFatUserBean getHmiBodyFatUserBean(UserBean userBean) { | |||
| HmiBodyFatUserBean hmiBodyFatUserBean = new HmiBodyFatUserBean(); | |||
| if (userBean.getSex() == UserBean.SEX_MAN) { | |||
| hmiBodyFatUserBean.setSex(HmiBodyFatDataUtil.SEX_MAN); | |||
| } else { | |||
| hmiBodyFatUserBean.setSex(HmiBodyFatDataUtil.SEX_FEMAN); | |||
| } | |||
| if (userBean.getModeType() == UserBean.MODE_ATHLETE) { | |||
| hmiBodyFatUserBean.setModeType(HmiBodyFatDataUtil.MODE_ATHLETE); | |||
| } else if (userBean.getModeType() == UserBean.MODE_PREGNANT) { | |||
| hmiBodyFatUserBean.setModeType(HmiBodyFatDataUtil.MODE_PREGNANT); | |||
| } else { | |||
| hmiBodyFatUserBean.setModeType(HmiBodyFatDataUtil.MODE_ORDINARY); | |||
| } | |||
| hmiBodyFatUserBean.setId(userBean.getId()); | |||
| hmiBodyFatUserBean.setAge(userBean.getAge()); | |||
| hmiBodyFatUserBean.setHeight(userBean.getHeight()); | |||
| hmiBodyFatUserBean.setWeight(userBean.getWeight()); | |||
| hmiBodyFatUserBean.setAdc(userBean.getAdc()); | |||
| return hmiBodyFatUserBean; | |||
| } | |||
| private void addLog(String log) { | |||
| mlogList.add(0, TimeUtils.getTimeSSS() + log); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| private final int TO_REFRESH_UI = 300; | |||
| private final int TO_REFRESH_USER = 301; | |||
| private class MHandler extends Handler { | |||
| @Override | |||
| public void handleMessage(Message msg) { | |||
| super.handleMessage(msg); | |||
| switch (msg.what) { | |||
| case TO_REFRESH_UI: | |||
| if (listAdapter != null) { | |||
| listAdapter.notifyDataSetChanged(); | |||
| } | |||
| break; | |||
| case TO_REFRESH_USER: | |||
| if (userAdapter != null) { | |||
| mUserlogList.clear(); | |||
| if (mUsers != null) { | |||
| for (HmiBodyFatUserBean user : mUsers) { | |||
| mUserlogList.add(user.toString()); | |||
| } | |||
| } | |||
| userAdapter.notifyDataSetChanged(); | |||
| } | |||
| break; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -196,57 +196,47 @@ public class MeatProbeActivity extends BleBaseActivity implements OnCallbackBle, | |||
| @Override | |||
| public void onClick(View v) { | |||
| switch (v.getId()) { | |||
| case R.id.btn_meat_probe_connect: | |||
| if (mAILinkBleManager != null) { | |||
| mAILinkBleManager.connectDevice(mMac); | |||
| int id = v.getId(); | |||
| if (id == R.id.btn_meat_probe_connect) { | |||
| if (mAILinkBleManager != null) { | |||
| mAILinkBleManager.connectDevice(mMac); | |||
| } | |||
| } else if (id == R.id.btn_meat_probe_disconnect) { | |||
| if (mAILinkBleManager != null) { | |||
| mAILinkBleManager.disconnect(mMac); | |||
| } | |||
| } else if (id == R.id.btn_meat_probe_version) { | |||
| if (mMeatProbeBleData != null) { | |||
| mMeatProbeBleData.getVersionInfo(); | |||
| } | |||
| } else if (id == R.id.btn_meat_probe_battery) { | |||
| if (mMeatProbeBleData != null) { | |||
| mMeatProbeBleData.getBattery(); | |||
| } | |||
| } else if (id == R.id.btn_meat_probe_switch_unit) { | |||
| if (mMeatProbeBleData != null) { | |||
| //0-摄氏度 1-华氏度 | |||
| if (unit == 0) { | |||
| mMeatProbeBleData.sendSwitchUnit(1); | |||
| } else { | |||
| mMeatProbeBleData.sendSwitchUnit(0); | |||
| } | |||
| break; | |||
| case R.id.btn_meat_probe_disconnect: | |||
| if (mAILinkBleManager != null) { | |||
| mAILinkBleManager.disconnect(mMac); | |||
| } | |||
| break; | |||
| case R.id.btn_meat_probe_version: | |||
| if (mMeatProbeBleData != null) { | |||
| mMeatProbeBleData.getVersionInfo(); | |||
| } | |||
| break; | |||
| case R.id.btn_meat_probe_battery: | |||
| if (mMeatProbeBleData != null) { | |||
| mMeatProbeBleData.getBattery(); | |||
| } | |||
| break; | |||
| case R.id.btn_meat_probe_switch_unit: | |||
| if (mMeatProbeBleData != null) { | |||
| //0-摄氏度 1-华氏度 | |||
| if (unit == 0) { | |||
| mMeatProbeBleData.sendSwitchUnit(1); | |||
| } else { | |||
| mMeatProbeBleData.sendSwitchUnit(0); | |||
| } | |||
| } | |||
| break; | |||
| case R.id.btn_meat_probe_get_info: | |||
| if (mMeatProbeBleData != null) { | |||
| mMeatProbeBleData.appGetDeviceInfo(); | |||
| } | |||
| break; | |||
| case R.id.btn_meat_probe_start: | |||
| if (mMeatProbeBleData != null) { | |||
| mProbeBean.setCookingId(System.currentTimeMillis()); | |||
| mProbeBean.setCurrentUnit(unit); | |||
| mMeatProbeBleData.appSetDeviceInfo(mProbeBean); | |||
| } | |||
| break; | |||
| case R.id.btn_meat_probe_end: | |||
| if (mMeatProbeBleData != null) { | |||
| mMeatProbeBleData.endWork(); | |||
| } | |||
| break; | |||
| default: | |||
| break; | |||
| } | |||
| } else if (id == R.id.btn_meat_probe_get_info) { | |||
| if (mMeatProbeBleData != null) { | |||
| mMeatProbeBleData.appGetDeviceInfo(); | |||
| } | |||
| } else if (id == R.id.btn_meat_probe_start) { | |||
| if (mMeatProbeBleData != null) { | |||
| mProbeBean.setCookingId(System.currentTimeMillis()); | |||
| mProbeBean.setCurrentUnit(unit); | |||
| mMeatProbeBleData.appSetDeviceInfo(mProbeBean); | |||
| } | |||
| } else if (id == R.id.btn_meat_probe_end) { | |||
| if (mMeatProbeBleData != null) { | |||
| mMeatProbeBleData.endWork(); | |||
| } | |||
| } | |||
| } | |||
| @@ -112,91 +112,69 @@ public class MeatProbeChargerActivity extends BleBaseActivity implements View.On | |||
| @Override | |||
| public void onClick(View view) { | |||
| switch (view.getId()) { | |||
| case R.id.btn_probe_version: | |||
| //获取版本号 | |||
| mMeatProbeChargerBleDevice.getVersion(); | |||
| break; | |||
| case R.id.btn_probe_sync_time: | |||
| //同步时间 | |||
| mMeatProbeChargerBleDevice.appSyncTime(); | |||
| break; | |||
| case R.id.btn_probe_info: | |||
| //获取设备状态 | |||
| mMeatProbeChargerBleDevice.getDeviceInfo(); | |||
| break; | |||
| case R.id.btn_probe_set: | |||
| //设置探针参数,需要选择探针 | |||
| if (mDialogMacList.size() > 0) { | |||
| setProbeDataDialog(); | |||
| } else { | |||
| Toast.makeText(MeatProbeChargerActivity.this, "请确认充电盒当前是否有连接的探针,点击获取设备状态按钮试试", Toast.LENGTH_SHORT).show(); | |||
| } | |||
| break; | |||
| case R.id.btn_probe_get: | |||
| //获取探针参数,先判断是否有探针再选择探针获取数据,需要选择探针 | |||
| if (mDialogMacList.size() > 0) { | |||
| getProbeDataDialog(); | |||
| } else { | |||
| Toast.makeText(MeatProbeChargerActivity.this, "请确认充电盒当前是否有连接的探针,点击获取设备状态按钮试试", Toast.LENGTH_SHORT).show(); | |||
| } | |||
| break; | |||
| case R.id.btn_probe_clear: | |||
| //清除探针数据,需要选择探针 | |||
| if (mDialogMacList.size() > 0) { | |||
| clearProbeDataDialog(); | |||
| } else { | |||
| Toast.makeText(MeatProbeChargerActivity.this, "请确认充电盒当前是否有连接的探针,点击获取设备状态按钮试试", Toast.LENGTH_SHORT).show(); | |||
| } | |||
| break; | |||
| case R.id.btn_probe_unit: | |||
| //切换盒子单位 | |||
| if (("切换成℃").equals(btn_probe_unit.getText().toString())) { | |||
| btn_probe_unit.setText("切换成℉"); | |||
| mMeatProbeChargerBleDevice.switchUnit(true); | |||
| } else { | |||
| btn_probe_unit.setText("切换成℃"); | |||
| mMeatProbeChargerBleDevice.switchUnit(false); | |||
| } | |||
| break; | |||
| case R.id.btn_probe_set_alarm: | |||
| //发送报警设置,需要选择探针 | |||
| if (mDialogMacList.size() > 0) { | |||
| setAlarmDialog(); | |||
| } else { | |||
| Toast.makeText(MeatProbeChargerActivity.this, "请确认充电盒当前是否有连接的探针,点击获取设备状态按钮试试", Toast.LENGTH_SHORT).show(); | |||
| } | |||
| break; | |||
| case R.id.btn_probe_clear_alarm: | |||
| //清除报警设置,需要选择探针 | |||
| if (mDialogMacList.size() > 0) { | |||
| cancelDialog(); | |||
| } else { | |||
| Toast.makeText(MeatProbeChargerActivity.this, "请确认充电盒当前是否有连接的探针,点击获取设备状态按钮试试", Toast.LENGTH_SHORT).show(); | |||
| } | |||
| break; | |||
| case R.id.btn_probe_set_hand: | |||
| //发送握手命令进行握手 | |||
| if (!TextUtils.isEmpty(et_probe_set_hand.getText().toString())) { | |||
| String cidvidpid = et_probe_set_hand.getText().toString().replaceAll(",", ","); | |||
| if (cidvidpid.contains(",")) { | |||
| String[] split = cidvidpid.split(","); | |||
| int cid = 0, vid = 0, pid = 0; | |||
| cid = Integer.parseInt(split[0], 16); | |||
| if (split.length > 1) { | |||
| vid = Integer.parseInt(split[1], 16); | |||
| } | |||
| if (split.length > 2) { | |||
| pid = Integer.parseInt(split[2], 16); | |||
| } | |||
| BleConfig.setHandshakeStatus(mMac, true, cid, vid, pid); | |||
| int id = view.getId(); | |||
| if (id == R.id.btn_probe_version) {//获取版本号 | |||
| mMeatProbeChargerBleDevice.getVersion(); | |||
| } else if (id == R.id.btn_probe_sync_time) {//同步时间 | |||
| mMeatProbeChargerBleDevice.appSyncTime(); | |||
| } else if (id == R.id.btn_probe_info) {//获取设备状态 | |||
| mMeatProbeChargerBleDevice.getDeviceInfo(); | |||
| } else if (id == R.id.btn_probe_set) {//设置探针参数,需要选择探针 | |||
| if (mDialogMacList.size() > 0) { | |||
| setProbeDataDialog(); | |||
| } else { | |||
| Toast.makeText(MeatProbeChargerActivity.this, "请确认充电盒当前是否有连接的探针,点击获取设备状态按钮试试", Toast.LENGTH_SHORT).show(); | |||
| } | |||
| } else if (id == R.id.btn_probe_get) {//获取探针参数,先判断是否有探针再选择探针获取数据,需要选择探针 | |||
| if (mDialogMacList.size() > 0) { | |||
| getProbeDataDialog(); | |||
| } else { | |||
| Toast.makeText(MeatProbeChargerActivity.this, "请确认充电盒当前是否有连接的探针,点击获取设备状态按钮试试", Toast.LENGTH_SHORT).show(); | |||
| } | |||
| } else if (id == R.id.btn_probe_clear) {//清除探针数据,需要选择探针 | |||
| if (mDialogMacList.size() > 0) { | |||
| clearProbeDataDialog(); | |||
| } else { | |||
| Toast.makeText(MeatProbeChargerActivity.this, "请确认充电盒当前是否有连接的探针,点击获取设备状态按钮试试", Toast.LENGTH_SHORT).show(); | |||
| } | |||
| } else if (id == R.id.btn_probe_unit) {//切换盒子单位 | |||
| if (("切换成℃").equals(btn_probe_unit.getText().toString())) { | |||
| btn_probe_unit.setText("切换成℉"); | |||
| mMeatProbeChargerBleDevice.switchUnit(true); | |||
| } else { | |||
| btn_probe_unit.setText("切换成℃"); | |||
| mMeatProbeChargerBleDevice.switchUnit(false); | |||
| } | |||
| } else if (id == R.id.btn_probe_set_alarm) {//发送报警设置,需要选择探针 | |||
| if (mDialogMacList.size() > 0) { | |||
| setAlarmDialog(); | |||
| } else { | |||
| Toast.makeText(MeatProbeChargerActivity.this, "请确认充电盒当前是否有连接的探针,点击获取设备状态按钮试试", Toast.LENGTH_SHORT).show(); | |||
| } | |||
| } else if (id == R.id.btn_probe_clear_alarm) {//清除报警设置,需要选择探针 | |||
| if (mDialogMacList.size() > 0) { | |||
| cancelDialog(); | |||
| } else { | |||
| Toast.makeText(MeatProbeChargerActivity.this, "请确认充电盒当前是否有连接的探针,点击获取设备状态按钮试试", Toast.LENGTH_SHORT).show(); | |||
| } | |||
| } else if (id == R.id.btn_probe_set_hand) {//发送握手命令进行握手 | |||
| if (!TextUtils.isEmpty(et_probe_set_hand.getText().toString())) { | |||
| String cidvidpid = et_probe_set_hand.getText().toString().replaceAll(",", ","); | |||
| if (cidvidpid.contains(",")) { | |||
| String[] split = cidvidpid.split(","); | |||
| int cid = 0, vid = 0, pid = 0; | |||
| cid = Integer.parseInt(split[0], 16); | |||
| if (split.length > 1) { | |||
| vid = Integer.parseInt(split[1], 16); | |||
| } | |||
| } else { | |||
| Toast.makeText(MeatProbeChargerActivity.this, "请先输入CID,VID,PID", Toast.LENGTH_SHORT).show(); | |||
| if (split.length > 2) { | |||
| pid = Integer.parseInt(split[2], 16); | |||
| } | |||
| BleConfig.setHandshakeStatus(mMac, true, cid, vid, pid); | |||
| } | |||
| break; | |||
| default: | |||
| break; | |||
| } else { | |||
| Toast.makeText(MeatProbeChargerActivity.this, "请先输入CID,VID,PID", Toast.LENGTH_SHORT).show(); | |||
| } | |||
| } | |||
| } | |||
| @@ -123,46 +123,31 @@ public class BleNoiseMeterActivity extends BleBaseActivity implements View.OnCli | |||
| @Override | |||
| public void onClick(View v) { | |||
| switch (v.getId()) { | |||
| case R.id.btn_noise_ble_ac: | |||
| //A/C键功能 | |||
| if (mNoiseMeterBle != null) { | |||
| mNoiseMeterBle.sendAC(); | |||
| } | |||
| break; | |||
| case R.id.btn_noise_ble_light: | |||
| //LIGHT键 | |||
| if (mNoiseMeterBle != null) { | |||
| mNoiseMeterBle.sendLight(); | |||
| } | |||
| break; | |||
| case R.id.btn_noise_ble_fs: | |||
| //F/S键 | |||
| if (mNoiseMeterBle != null) { | |||
| mNoiseMeterBle.sendFS(); | |||
| } | |||
| break; | |||
| case R.id.btn_noise_ble_max: | |||
| //MAX键 | |||
| if (mNoiseMeterBle != null) { | |||
| mNoiseMeterBle.sendMax(); | |||
| } | |||
| break; | |||
| case R.id.btn_noise_ble_up: | |||
| //UP键 | |||
| if (mNoiseMeterBle != null) { | |||
| mNoiseMeterBle.sendUp(); | |||
| } | |||
| break; | |||
| case R.id.btn_noise_ble_down: | |||
| //DOWN键 | |||
| if (mNoiseMeterBle != null) { | |||
| mNoiseMeterBle.sendDown(); | |||
| } | |||
| break; | |||
| default: | |||
| break; | |||
| int id = v.getId(); | |||
| if (id == R.id.btn_noise_ble_ac) {//A/C键功能 | |||
| if (mNoiseMeterBle != null) { | |||
| mNoiseMeterBle.sendAC(); | |||
| } | |||
| } else if (id == R.id.btn_noise_ble_light) {//LIGHT键 | |||
| if (mNoiseMeterBle != null) { | |||
| mNoiseMeterBle.sendLight(); | |||
| } | |||
| } else if (id == R.id.btn_noise_ble_fs) {//F/S键 | |||
| if (mNoiseMeterBle != null) { | |||
| mNoiseMeterBle.sendFS(); | |||
| } | |||
| } else if (id == R.id.btn_noise_ble_max) {//MAX键 | |||
| if (mNoiseMeterBle != null) { | |||
| mNoiseMeterBle.sendMax(); | |||
| } | |||
| } else if (id == R.id.btn_noise_ble_up) {//UP键 | |||
| if (mNoiseMeterBle != null) { | |||
| mNoiseMeterBle.sendUp(); | |||
| } | |||
| } else if (id == R.id.btn_noise_ble_down) {//DOWN键 | |||
| if (mNoiseMeterBle != null) { | |||
| mNoiseMeterBle.sendDown(); | |||
| } | |||
| } | |||
| } | |||
| @@ -74,47 +74,32 @@ public class WifiBleNoiseMeterActivity extends BleBaseActivity implements View.O | |||
| @Override | |||
| public void onClick(View v) { | |||
| int id = v.getId(); | |||
| switch (id) { | |||
| case R.id.btn_get_device_state: | |||
| sendData(mNoiseSendUtils.sendSetDeviceState()); | |||
| addText("获取设备状态"); | |||
| break; | |||
| case R.id.btn_get_support_list: | |||
| sendData(mNoiseSendUtils.sendSetSupportList()); | |||
| addText("获取设备支持的功能列表"); | |||
| break; | |||
| case R.id.btn_noise_ac: | |||
| if (deviceAc == 1) { | |||
| deviceAc++; | |||
| } else { | |||
| deviceAc--; | |||
| } | |||
| sendData(mNoiseSendUtils.sendAc(deviceAc)); | |||
| break; | |||
| case R.id.btn_noise_min_max: | |||
| deviceMinMax++; | |||
| sendData(mNoiseSendUtils.sendMinMaxMode(deviceMinMax%3)); | |||
| break; | |||
| case R.id.btn_noise_hold: | |||
| if (deviceHold == 0) { | |||
| deviceHold++; | |||
| } else { | |||
| deviceHold--; | |||
| } | |||
| sendData(mNoiseSendUtils.sendHoldMode(deviceHold,100)); | |||
| break; | |||
| case R.id.btn_noise_log: | |||
| sendData(mNoiseSendUtils.sendGetHistory(mTime)); | |||
| addText("获取历史记录:时间="+mTime); | |||
| break; | |||
| default: | |||
| break; | |||
| if (id == R.id.btn_get_device_state) { | |||
| sendData(mNoiseSendUtils.sendSetDeviceState()); | |||
| addText("获取设备状态"); | |||
| } else if (id == R.id.btn_get_support_list) { | |||
| sendData(mNoiseSendUtils.sendSetSupportList()); | |||
| addText("获取设备支持的功能列表"); | |||
| } else if (id == R.id.btn_noise_ac) { | |||
| if (deviceAc == 1) { | |||
| deviceAc++; | |||
| } else { | |||
| deviceAc--; | |||
| } | |||
| sendData(mNoiseSendUtils.sendAc(deviceAc)); | |||
| } else if (id == R.id.btn_noise_min_max) { | |||
| deviceMinMax++; | |||
| sendData(mNoiseSendUtils.sendMinMaxMode(deviceMinMax % 3)); | |||
| } else if (id == R.id.btn_noise_hold) { | |||
| if (deviceHold == 0) { | |||
| deviceHold++; | |||
| } else { | |||
| deviceHold--; | |||
| } | |||
| sendData(mNoiseSendUtils.sendHoldMode(deviceHold, 100)); | |||
| } else if (id == R.id.btn_noise_log) { | |||
| sendData(mNoiseSendUtils.sendGetHistory(mTime)); | |||
| addText("获取历史记录:时间=" + mTime); | |||
| } | |||
| @@ -127,29 +127,26 @@ public class ShareChargerActivity extends BleBaseActivity implements View.OnClic | |||
| @Override | |||
| public void onClick(View v) { | |||
| switch (v.getId()) { | |||
| case R.id.btn_set: | |||
| int hour = seek_hour.getProgress(); | |||
| int minute = seek_minute.getProgress(); | |||
| int second = seek_second.getProgress() + 1; | |||
| if (mShareChargerData != null) { | |||
| addText("APP设置充电时间:" + getTimeStr(hour, minute, second)); | |||
| mShareChargerData.appSetChargerTime(hour, minute, second); | |||
| } | |||
| break; | |||
| case R.id.btn_get: | |||
| if (mShareChargerData != null) { | |||
| addText("APP获取剩余充电时间"); | |||
| mShareChargerData.appGetChargerTime(); | |||
| } | |||
| break; | |||
| case R.id.btn_switch: | |||
| boolean isOpen = rb_open.isChecked(); | |||
| if (mShareChargerData != null) { | |||
| addText("APP切换开关:" + isOpen); | |||
| mShareChargerData.appSwitch(isOpen); | |||
| } | |||
| break; | |||
| int id = v.getId(); | |||
| if (id == R.id.btn_set) { | |||
| int hour = seek_hour.getProgress(); | |||
| int minute = seek_minute.getProgress(); | |||
| int second = seek_second.getProgress() + 1; | |||
| if (mShareChargerData != null) { | |||
| addText("APP设置充电时间:" + getTimeStr(hour, minute, second)); | |||
| mShareChargerData.appSetChargerTime(hour, minute, second); | |||
| } | |||
| } else if (id == R.id.btn_get) { | |||
| if (mShareChargerData != null) { | |||
| addText("APP获取剩余充电时间"); | |||
| mShareChargerData.appGetChargerTime(); | |||
| } | |||
| } else if (id == R.id.btn_switch) { | |||
| boolean isOpen = rb_open.isChecked(); | |||
| if (mShareChargerData != null) { | |||
| addText("APP切换开关:" + isOpen); | |||
| mShareChargerData.appSwitch(isOpen); | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,57 @@ | |||
| package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.smart_cycling_table | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L | |||
| import com.pinwang.ailinkblesdk.modules.smart_cycling_table.SatelliteBean | |||
| /** | |||
| * 卫星豆(合计) | |||
| * @author xing | |||
| * @date 2025/03/08 | |||
| * @constructor 创建[SatelliteAllBean] | |||
| */ | |||
| class SatelliteAllBean { | |||
| var type = "" | |||
| var size = 0 | |||
| var list: MutableList<SatelliteBean> = mutableListOf() | |||
| fun parseStr(msgs: Array<String>) { | |||
| type = msgs[0].substring(1) | |||
| size = msgs[3].toInt() | |||
| val group = msgs.size - 5 | |||
| val start = 4 | |||
| //group从4开始,步进是4 | |||
| for (i in 0 until group step 4) { | |||
| val index = i + start | |||
| val newArray = if (index + 4 < msgs.size) { | |||
| msgs.sliceArray(index until index + 4) | |||
| } else { | |||
| emptyArray() // 如果 startIndex 超出范围,返回空数组 | |||
| } | |||
| if (newArray.isEmpty()) { | |||
| continue | |||
| } | |||
| val bean = SatelliteBean().also { | |||
| it.init(newArray) | |||
| } | |||
| L.i("卫星信息:$bean") | |||
| list.add(bean) | |||
| } | |||
| } | |||
| fun checkData(): Boolean { | |||
| return list.size >= size | |||
| } | |||
| //复制对象 | |||
| fun copy(): SatelliteAllBean { | |||
| return SatelliteAllBean().also { | |||
| it.type = this.type | |||
| it.size = this.size | |||
| it.list = this.list.map { it.copy() }.toMutableList() | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,42 @@ | |||
| package com.pinwang.ailinkblesdk.modules.smart_cycling_table | |||
| /** | |||
| * 卫星豆 | |||
| * @author xing | |||
| * @date 2025/03/08 | |||
| * @constructor 创建[SatelliteBean] | |||
| */ | |||
| class SatelliteBean { | |||
| var id = "" | |||
| /** 仰角 */ | |||
| var llevation = "" | |||
| var azimuth = "" | |||
| var rssi = "" | |||
| fun init(msg: Array<String>) { | |||
| id = msg[0] | |||
| llevation = msg[1] | |||
| azimuth = msg[2] | |||
| rssi = msg[3] | |||
| } | |||
| //复制对象 | |||
| fun copy(): SatelliteBean { | |||
| val bean = SatelliteBean().also { | |||
| it.id = id | |||
| it.llevation = llevation | |||
| it.azimuth = azimuth | |||
| it.rssi = rssi | |||
| } | |||
| return bean | |||
| } | |||
| override fun toString(): String { | |||
| return "SatelliteBean(id='$id', llevation='$llevation', azimuth='$azimuth', rssi='$rssi')" | |||
| } | |||
| } | |||
| @@ -0,0 +1,157 @@ | |||
| package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.smart_cycling_table; | |||
| import android.content.Context; | |||
| import android.os.Bundle; | |||
| import android.view.View; | |||
| import android.widget.ArrayAdapter; | |||
| import android.widget.Button; | |||
| import android.widget.ListView; | |||
| import android.widget.TextView; | |||
| import androidx.annotation.Nullable; | |||
| import androidx.lifecycle.ViewModelProvider; | |||
| import com.pinwang.ailinkblesdk.modules.smart_cycling_table.SmartCyclingTableViewModel; | |||
| import java.util.ArrayList; | |||
| import java.util.List; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleNewBaseActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
| /** | |||
| * 智能码表界面 | |||
| * | |||
| * @author xing | |||
| * @date 2025/12/11 | |||
| */ | |||
| public class SmartCyclingTableActivity extends BleNewBaseActivity implements View.OnClickListener { | |||
| private Button btnGetGps, btnPause, btnContinue, btnClear; | |||
| private TextView tvLastData; | |||
| private List<String> mList; | |||
| private ArrayAdapter listAdapter; | |||
| private Context mContext; | |||
| private String mAddress; | |||
| private int mCid; | |||
| private int mVid; | |||
| private int mPid; | |||
| private SmartCyclingTableViewModel mViewModel; | |||
| @Override | |||
| protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
| super.onCreate(savedInstanceState); | |||
| setContentView(R.layout.activity_smart_cycling_table); | |||
| initView(); | |||
| initData(); | |||
| initListener(); | |||
| } | |||
| private void initListener() { | |||
| btnGetGps.setOnClickListener(this); | |||
| btnPause.setOnClickListener(this); | |||
| btnContinue.setOnClickListener(this); | |||
| btnClear.setOnClickListener(this); | |||
| if (mViewModel != null) { | |||
| mViewModel.getMGpsLogLiveData().observe(this, s -> { | |||
| addLog(s); | |||
| }); | |||
| // mViewModel.getMGpsNumberLiveData().observe(this, map -> { | |||
| // String msg = ""; | |||
| // msg += map.get("GPGSV") + "\n"; | |||
| // msg += map.get("GBGSV") + "\n"; | |||
| // msg += map.get("GAGSV") + "\n"; | |||
| // msg += map.get("GLGSV") + "\n"; | |||
| // tvLastData.setText(msg); | |||
| // }); | |||
| mViewModel.getConnectStatusData().observe(this, status -> { | |||
| switch (status) { | |||
| case 1: | |||
| addLog("扫描中"); | |||
| break; | |||
| case 2: | |||
| addLog("连接断开"); | |||
| break; | |||
| case 3: | |||
| addLog("连接成功"); | |||
| break; | |||
| } | |||
| }); | |||
| } | |||
| } | |||
| @Override | |||
| public void onClick(View v) { | |||
| int id = v.getId(); | |||
| if (id == R.id.btnGetGps) { | |||
| mViewModel.getGpsInfo(); | |||
| } else if (id == R.id.btnPause) { | |||
| mViewModel.refreshDataPause(); | |||
| } else if (id == R.id.btnContinue) { | |||
| mViewModel.refreshDataContinue(); | |||
| } else if (id == R.id.btnClear) { | |||
| clear(); | |||
| } | |||
| } | |||
| private void initData() { | |||
| mViewModel = new ViewModelProvider(this).get(SmartCyclingTableViewModel.class); | |||
| mContext = this; | |||
| mAddress = getIntent().getStringExtra("mac"); | |||
| mCid = getIntent().getIntExtra("cid", -1); | |||
| mVid = getIntent().getIntExtra("vid", -1); | |||
| mPid = getIntent().getIntExtra("pid", -1); | |||
| if (isServiceBinded) { | |||
| onServiceSuccess(); | |||
| } | |||
| } | |||
| private void initView() { | |||
| tvLastData = findViewById(R.id.tvLastData); | |||
| btnGetGps = findViewById(R.id.btnGetGps); | |||
| btnPause = findViewById(R.id.btnPause); | |||
| btnContinue = findViewById(R.id.btnContinue); | |||
| btnClear = findViewById(R.id.btnClear); | |||
| mList = new ArrayList<>(); | |||
| ListView listView = findViewById(R.id.listview); | |||
| listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | |||
| listView.setAdapter(listAdapter); | |||
| } | |||
| private boolean isServiceBinded = false; | |||
| @Override | |||
| public void onServiceSuccess() { | |||
| isServiceBinded = true; | |||
| if (mViewModel != null) { | |||
| mViewModel.init(mAddress, mCid, mVid, mPid); | |||
| } | |||
| } | |||
| @Override | |||
| public void onServiceErr() { | |||
| } | |||
| @Override | |||
| public void unbindServices() { | |||
| } | |||
| private void addLog(String msg) { | |||
| mList.add(TimeUtils.getTimeSSS() + msg); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } | |||
| private void clear() { | |||
| mList.clear(); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } | |||
| } | |||
| @@ -0,0 +1,220 @@ | |||
| package com.pinwang.ailinkblesdk.modules.smart_cycling_table | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.smart_cycling_table.SatelliteAllBean | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L | |||
| import androidx.lifecycle.MutableLiveData | |||
| import androidx.lifecycle.ViewModel | |||
| import com.pingwang.bluetoothlib.AILinkBleManager | |||
| import com.pingwang.bluetoothlib.bean.BleValueBean | |||
| import com.pingwang.bluetoothlib.device.BleDevice | |||
| import com.pingwang.bluetoothlib.listener.OnBleOtherDataListener | |||
| import com.pingwang.bluetoothlib.listener.OnCallbackBle | |||
| import com.pingwang.bluetoothlib.utils.UuidUtils | |||
| /** | |||
| * 智能码表视图模型 | |||
| * @author xing | |||
| * @date 2025/03/07 | |||
| * @constructor 创建[SmartCyclingTableViewModel] | |||
| */ | |||
| class SmartCyclingTableViewModel : ViewModel(), OnCallbackBle, OnBleOtherDataListener { | |||
| /** ble状态数据 | |||
| * true-打开 | |||
| * false-关闭 | |||
| * */ | |||
| val bleStatusData by lazy { MutableLiveData<Boolean>() } | |||
| /** 连接状态数据 | |||
| * 1-扫描中 | |||
| * 2-连接断开 | |||
| * 3-连接成功 | |||
| * | |||
| * */ | |||
| val connectStatusData by lazy { MutableLiveData<Int>() } | |||
| val mGpsLogLiveData by lazy { MutableLiveData<String>() } | |||
| val mGpsInfoLiveData by lazy { MutableLiveData<MutableMap<String, SatelliteAllBean>>() } | |||
| /** 缓存Map */ | |||
| var cacheMap: MutableMap<String, SatelliteAllBean> = mutableMapOf() | |||
| var mRefreshData: Boolean = true | |||
| var mMac: String = "" | |||
| var mBleDevice: BleDevice? = null | |||
| fun init(mac: String, cid: Int, vid: Int, pid: Int) { | |||
| mMac = mac | |||
| AILinkBleManager.getInstance().setOnCallbackBle(this) | |||
| mBleDevice = AILinkBleManager.getInstance().getBleDevice(mac) | |||
| mBleDevice?.let { | |||
| connectStatusData.postValue(3) | |||
| it.setA7Encryption(false) | |||
| it.setOnBleOtherDataListener(this) | |||
| } ?: run { | |||
| connectDevice(mac, cid, vid, pid) | |||
| } | |||
| } | |||
| fun getGpsInfo() { | |||
| mBleDevice?.setNotify(UuidUtils.getUuid("FFE0"), UuidUtils.getUuid("FFE3")) | |||
| refreshDataContinue() | |||
| } | |||
| fun refreshDataPause() { | |||
| mRefreshData = false | |||
| mGpsLogLiveData.value = "暂停刷新" | |||
| } | |||
| fun refreshDataContinue() { | |||
| mRefreshData = true | |||
| mGpsLogLiveData.value = "继续刷新" | |||
| } | |||
| override fun onNotifyOtherData(uuid: String?, data: ByteArray?) { | |||
| super.onNotifyOtherData(uuid, data) | |||
| data?.let { | |||
| if (mRefreshData) { | |||
| parseData(String(data)) | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * 解析数据 | |||
| * @param [msg] 味精 | |||
| */ | |||
| fun parseData(msg: String) { | |||
| if (msg.contains(",")) { | |||
| val split = msg.split(",") | |||
| if (split[0].isEmpty()) { | |||
| return | |||
| } | |||
| val type = split[0].substring(1) | |||
| var message: String | |||
| when (type) { | |||
| "GPGSV" -> { | |||
| message = "GPS卫星数:" | |||
| } | |||
| "GBGSV" -> { | |||
| message = "北斗卫星数:" | |||
| } | |||
| "GAGSV" -> { | |||
| message = "伽利略卫星数:" | |||
| } | |||
| "GLGSV" -> { | |||
| message = "俄罗斯卫星数:" | |||
| } | |||
| "GIGSV" -> { | |||
| message = "印度卫星数:" | |||
| } | |||
| "GQGSV" -> { | |||
| message = "日本卫星数:" | |||
| } | |||
| else -> { | |||
| return | |||
| } | |||
| } | |||
| L.i("msg:$msg") | |||
| var bean = cacheMap[type] | |||
| if (bean == null) { | |||
| bean = SatelliteAllBean() | |||
| } | |||
| bean.parseStr(split.toTypedArray()) | |||
| cacheMap[type] = bean | |||
| if (bean.checkData()) { | |||
| message += "${bean.size}\n" | |||
| val newBean = bean.copy() | |||
| cacheMap.remove(bean.type) | |||
| if (newBean.size > 0) { | |||
| mGpsLogLiveData.value = message + getSatelliteAllBeanString(newBean) | |||
| } | |||
| // mGpsInfoLiveData.value = mutableMapOf<String, SatelliteAllBean>().also { it.putAll(cacheMap) } | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * 获取卫星所有豆字符串 | |||
| * @param [bean] 豆 | |||
| * @return [String] | |||
| */ | |||
| private fun getSatelliteAllBeanString(bean: SatelliteAllBean): String { | |||
| var message = "" | |||
| for ((index, satelliteBean) in bean.list.withIndex()) { | |||
| message += "编号:${satelliteBean.id};信号:${satelliteBean.rssi}dB" | |||
| message += if (index % 2 == 1) { | |||
| "\n" | |||
| } else { | |||
| "; " | |||
| } | |||
| } | |||
| return message | |||
| } | |||
| /** | |||
| * 连接设备 | |||
| * @param [mac] mac | |||
| * @param [cid] cid | |||
| * @param [vid] vid | |||
| * @param [pid] pid | |||
| */ | |||
| private fun connectDevice(mac: String, cid: Int, vid: Int, pid: Int) { | |||
| AILinkBleManager.getInstance().connectDevice(BleValueBean(mac, cid, vid, pid)) | |||
| } | |||
| override fun bleOpen() { | |||
| bleStatusData.postValue(true) | |||
| } | |||
| override fun bleClose() { | |||
| bleStatusData.postValue(false) | |||
| } | |||
| override fun onDisConnected(mac: String?, code: Int) { | |||
| super.onDisConnected(mac, code) | |||
| if (mac == mMac) { | |||
| connectStatusData.postValue(2) | |||
| } | |||
| } | |||
| override fun onServicesDiscovered(mac: String?) { | |||
| super.onServicesDiscovered(mac) | |||
| if (mac == mMac) { | |||
| connectStatusData.postValue(3) | |||
| } | |||
| } | |||
| override fun onStartScan() { | |||
| super.onStartScan() | |||
| connectStatusData.postValue(1) | |||
| } | |||
| override fun onScanning(data: BleValueBean?) { | |||
| super.onScanning(data) | |||
| data?.let { | |||
| if (it.mac == mMac) { | |||
| AILinkBleManager.getInstance().connectDevice(data) | |||
| } | |||
| } | |||
| } | |||
| override fun onCleared() { | |||
| super.onCleared() | |||
| mBleDevice?.disconnect() | |||
| AILinkBleManager.getInstance().disconnectAll() | |||
| } | |||
| } | |||
| @@ -0,0 +1,718 @@ | |||
| package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.toothbrush; | |||
| import android.content.Intent; | |||
| import android.content.pm.ActivityInfo; | |||
| import android.net.Uri; | |||
| import android.os.Bundle; | |||
| import android.os.Handler; | |||
| import android.os.Message; | |||
| import android.text.TextUtils; | |||
| import android.view.View; | |||
| import android.widget.ArrayAdapter; | |||
| import android.widget.EditText; | |||
| import android.widget.ListView; | |||
| import android.widget.Toast; | |||
| import androidx.annotation.Nullable; | |||
| import com.pingwang.bluetoothlib.bean.BleValueBean; | |||
| import com.pingwang.bluetoothlib.config.CmdConfig; | |||
| import com.pingwang.bluetoothlib.device.BleDevice; | |||
| import com.pingwang.bluetoothlib.device.wifibleDevice.WifiBleDeviceData; | |||
| import com.pingwang.bluetoothlib.device.wifibleDevice.WifiBleInfoBean; | |||
| import com.pingwang.bluetoothlib.listener.OnCallbackBle; | |||
| import com.pingwang.bluetoothlib.utils.BleLog; | |||
| import java.lang.ref.WeakReference; | |||
| import java.text.SimpleDateFormat; | |||
| import java.util.ArrayList; | |||
| import java.util.Arrays; | |||
| import java.util.List; | |||
| import java.util.Locale; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.DialogStringImageBean; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.MoveDataDialogFragment; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.ShowListDialogFragment; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.ToothBrushUtils; | |||
| import cn.net.aicare.modulelibrary.module.ToothBrush.ToothBrushBleCmd; | |||
| import cn.net.aicare.modulelibrary.module.ToothBrush.ToothBrushWiFiBleUtilsData; | |||
| /** | |||
| * Wifi+ble 牙刷(new), 客户定制版本,增加api key读取和设置 | |||
| */ | |||
| public class ToothBrushWifiNewBleActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, WifiBleDeviceData.OnWiFiBleCallback, ToothBrushWiFiBleUtilsData.OnBleToothBrushCallback { | |||
| private final int TO_REFRESH_UI = 300; | |||
| private final int TO_REQUEST_TOKEN = 500; | |||
| private final int GET_BATTERY = 600; | |||
| private String TAG = ToothBrushWifiNewBleActivity.class.getName(); | |||
| private String mAddress; | |||
| private List<String> mList; | |||
| private ArrayAdapter listAdapter; | |||
| private ToothBrushWiFiBleUtilsData mToothBrushWiFiBleUtilsData; | |||
| private MHandler mMHandler; | |||
| private EditText etApiKey, select_gears_et, ed_score, etIp, etPort, etPath; | |||
| private List<DialogStringImageBean> mWifiList = new ArrayList<>(); | |||
| private List<WifiBleInfoBean> mWifiBleInfoBeanList = new ArrayList<>(); | |||
| @Override | |||
| protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
| super.onCreate(savedInstanceState); | |||
| setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//禁止横屏 | |||
| setContentView(R.layout.activity_tooth_brush_wifi_ble_new); | |||
| findViewById(R.id.getWifiStatus).setOnClickListener(this); | |||
| findViewById(R.id.getSn).setOnClickListener(this); | |||
| findViewById(R.id.scanWifi).setOnClickListener(this); | |||
| findViewById(R.id.disconnectWifi).setOnClickListener(this); | |||
| findViewById(R.id.getWifiName).setOnClickListener(this); | |||
| findViewById(R.id.getSupportUnit).setOnClickListener(this); | |||
| findViewById(R.id.defaultTryOut).setOnClickListener(this); | |||
| findViewById(R.id.getTimeMode).setOnClickListener(this); | |||
| findViewById(R.id.defaultMode).setOnClickListener(this); | |||
| findViewById(R.id.ota).setOnClickListener(this); | |||
| findViewById(R.id.btnScore).setOnClickListener(this); | |||
| findViewById(R.id.btnGetApiKey).setOnClickListener(this); | |||
| findViewById(R.id.btnSetApiKey).setOnClickListener(this); | |||
| findViewById(R.id.btnSetUrl).setOnClickListener(this); | |||
| findViewById(R.id.btnGetUrl).setOnClickListener(this); | |||
| etApiKey = findViewById(R.id.etApiKey); | |||
| select_gears_et = findViewById(R.id.etSelectGears); | |||
| ed_score = findViewById(R.id.etScore); | |||
| etIp = findViewById(R.id.etIp); | |||
| etPort = findViewById(R.id.etPort); | |||
| etPath = findViewById(R.id.etPath); | |||
| mAddress = getIntent().getStringExtra("mac"); | |||
| mList = new ArrayList<>(); | |||
| ListView listView = findViewById(R.id.log_list); | |||
| listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | |||
| listView.setAdapter(listAdapter); | |||
| WeakReference weakReference = new WeakReference(new MHandler()); | |||
| mMHandler = (MHandler) weakReference.get(); | |||
| } | |||
| @Override | |||
| public void onClick(View v) { | |||
| int id = v.getId(); | |||
| if (mToothBrushWiFiBleUtilsData != null) { | |||
| if (id == R.id.getWifiStatus) { | |||
| mToothBrushWiFiBleUtilsData.getWifiCurrentState(); | |||
| } else if (id == R.id.getSn) { | |||
| mToothBrushWiFiBleUtilsData.getDeviceId(); | |||
| } else if (id == R.id.scanWifi) { | |||
| mToothBrushWiFiBleUtilsData.scanWifi(); | |||
| mList.add(TimeUtils.getTime() + "正在扫描附近可用的wifi..."); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| showWifiList(); | |||
| } else if (id == R.id.getWifiName) { | |||
| mToothBrushWiFiBleUtilsData.getConnectWifiName(); | |||
| } else if (id == R.id.disconnectWifi) { | |||
| mToothBrushWiFiBleUtilsData.disconnectWifi(); | |||
| } else if (id == R.id.getSupportUnit) { | |||
| mToothBrushWiFiBleUtilsData.getSupportGears(); | |||
| } else if (id == R.id.defaultMode) { | |||
| String gear = select_gears_et.getText().toString().trim(); | |||
| if (!gear.isEmpty()) { | |||
| String[] gears = null; | |||
| if (gear.contains(",")) { | |||
| gears = gear.split(","); | |||
| } else if (gear.contains(",")) { | |||
| gears = gear.split(","); | |||
| } else { | |||
| Toast.makeText(this, "请输入时长,档位,档位级别(数字加符号)", Toast.LENGTH_SHORT).show(); | |||
| } | |||
| if (gears != null) { | |||
| try { | |||
| mToothBrushWiFiBleUtilsData.setDefault(Integer.parseInt(gears[0]), Integer.parseInt(gears[1]), Integer.parseInt(gears[2])); | |||
| } catch (NumberFormatException e) { | |||
| e.printStackTrace(); | |||
| Toast.makeText(this, "请输入时长,档位,档位级别(数字加符号)", Toast.LENGTH_SHORT).show(); | |||
| } | |||
| } | |||
| } | |||
| } else if (id == R.id.defaultTryOut) { | |||
| String gear1 = select_gears_et.getText().toString().trim(); | |||
| if (!gear1.isEmpty()) { | |||
| String[] gears = null; | |||
| if (gear1.contains(",")) { | |||
| gears = gear1.split(","); | |||
| } else if (gear1.contains(",")) { | |||
| gears = gear1.split(","); | |||
| } else { | |||
| Toast.makeText(this, "请输入时长,档位,档位级别(数字加符号)", Toast.LENGTH_SHORT).show(); | |||
| } | |||
| if (gears != null) { | |||
| try { | |||
| mToothBrushWiFiBleUtilsData.setTryOut(Integer.parseInt(gears[1]), Integer.parseInt(gears[2]), 0, 0); | |||
| } catch (NumberFormatException e) { | |||
| e.printStackTrace(); | |||
| Toast.makeText(this, "请输入时长,档位,档位级别(数字加符号)", Toast.LENGTH_SHORT).show(); | |||
| } | |||
| } | |||
| } | |||
| } else if (id == R.id.getTimeMode) { | |||
| mToothBrushWiFiBleUtilsData.getDefaultGearAndDuration(); | |||
| } else if (id == R.id.ota) { | |||
| showFileChooser(); | |||
| // mToothBrushWiFiBleUtilsData.setOta(); | |||
| } else if (id == R.id.btnGetApiKey) { | |||
| mToothBrushWiFiBleUtilsData.getApiKey(); | |||
| } else if (id == R.id.btnSetApiKey) { | |||
| String apiKey = etApiKey.getText().toString().trim(); | |||
| if (!apiKey.isEmpty()) { | |||
| mToothBrushWiFiBleUtilsData.setApiKey(apiKey); | |||
| } | |||
| } else if (id == R.id.btnSetUrl) { | |||
| String ip = etIp.getText().toString().trim(); | |||
| String port = etPort.getText().toString().trim(); | |||
| String path = etPath.getText().toString().trim(); | |||
| mToothBrushWiFiBleUtilsData.setServiceInfo(ip, Integer.parseInt(port), path); | |||
| } else if (id == R.id.btnGetUrl) { | |||
| mToothBrushWiFiBleUtilsData.getServiceInfo(); | |||
| } | |||
| } | |||
| if (v.getId() == R.id.btnScore) { | |||
| try { | |||
| String[] time = ed_score.getText().toString().trim().split(","); | |||
| int defaultTime = Integer.parseInt(time[0]); | |||
| int useTime = Integer.parseInt(time[1]); | |||
| int lTime = Integer.parseInt(time[2]); | |||
| int rTime = Integer.parseInt(time[3]); | |||
| ToothBrushUtils toothBrushUtils = new ToothBrushUtils(); | |||
| int grade = toothBrushUtils.getGrade(defaultTime, useTime, lTime, rTime); | |||
| int avg = toothBrushUtils.getAvgGrade(defaultTime, lTime, rTime); | |||
| int rang = toothBrushUtils.getRangeGrade(defaultTime, lTime, rTime); | |||
| int duration = toothBrushUtils.getDurationGrade(defaultTime, useTime); | |||
| mList.add(0, grade + " 均匀度: " + avg + " 范围:" + rang + " 刷牙时长:" + duration); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } catch (Exception e) { | |||
| mList.add(0, "出错了 请按 默认时长,刷牙时长,左时长,右时长.输入单位是秒"); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| e.printStackTrace(); | |||
| } | |||
| } | |||
| } | |||
| private ShowListDialogFragment mShowListDialogFragment; | |||
| private void showWifiList() { | |||
| if (mShowListDialogFragment == null) { | |||
| mShowListDialogFragment = ShowListDialogFragment.newInstance(); | |||
| mShowListDialogFragment.setList(mWifiList); | |||
| mShowListDialogFragment.setTitle("选择WIFI"); | |||
| mShowListDialogFragment.setCancel("取消", 0); | |||
| mShowListDialogFragment.setOnDialogListener(new ShowListDialogFragment.onDialogListener() { | |||
| @Override | |||
| public void onItemListener(int position) { | |||
| WifiBleInfoBean wifiBleInfoBean = mWifiBleInfoBeanList.get(position); | |||
| String ssid = wifiBleInfoBean.getSsid(); | |||
| MoveDataDialogFragment.newInstance() | |||
| .setTitle(ssid, "") | |||
| .setContent("", "请输入密码", MoveDataDialogFragment.NAME) | |||
| .setOk("OK", 0) | |||
| .setCancel("取消", 0) | |||
| .setOnDialogListener(new MoveDataDialogFragment.OnDialogListener() { | |||
| @Override | |||
| public void onSucceedListener(View v, String data) { | |||
| String pwd = data.trim(); | |||
| setConnectWifi(wifiBleInfoBean.getMac(), pwd); | |||
| } | |||
| }) | |||
| .show(getSupportFragmentManager()); | |||
| } | |||
| @Override | |||
| public void onCancelListener(View v) { | |||
| } | |||
| }); | |||
| } | |||
| mShowListDialogFragment.show(getSupportFragmentManager()); | |||
| } | |||
| /** | |||
| * 设置连接wifi | |||
| * | |||
| * @param mac mac | |||
| * @param pwd 密码 | |||
| */ | |||
| private void setConnectWifi(String mac, String pwd) { | |||
| if (mToothBrushWiFiBleUtilsData != null) { | |||
| mToothBrushWiFiBleUtilsData.setConnectWifiMac(mac, pwd); | |||
| mList.add(TimeUtils.getTime() + "正在连接wifi..."); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| } | |||
| @Override | |||
| public void onServiceSuccess() { | |||
| //与服务建立连接 | |||
| mList.add(0, "服务与界面建立连接成功"); | |||
| // mList.add(0, "搜索设备"); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| mAILinkBleManager.setOnCallbackBle(this); | |||
| onServicesDiscovered(mAddress); | |||
| } | |||
| @Override | |||
| public void onServiceErr() { | |||
| } | |||
| @Override | |||
| public void unbindServices() { | |||
| if (mAILinkBleManager != null) { | |||
| mAILinkBleManager.removeOnCallbackBle(this); | |||
| mAILinkBleManager.disconnectAll(); | |||
| } | |||
| } | |||
| @Override | |||
| public void onScanning(BleValueBean data) { | |||
| BleLog.i(TAG, "MAC=" + mAddress + "||CID=" + data.getCid() + "||VID=" + data.getVid() + "||PID=" + data.getPid()); | |||
| if (data.getMac().equalsIgnoreCase(mAddress)) { | |||
| if (mAILinkBleManager != null) { | |||
| mAILinkBleManager.stopScan(); | |||
| mAILinkBleManager.connectDevice(data); | |||
| } | |||
| } | |||
| } | |||
| @Override | |||
| public void onDisConnected(String mac, int code) { | |||
| if (mAddress.equalsIgnoreCase(mac)) { | |||
| mList.add(0, "蓝牙已断开:" + mac); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| } | |||
| @Override | |||
| public void onServicesDiscovered(String mac) { | |||
| if (mAILinkBleManager == null) { | |||
| return; | |||
| } | |||
| if (mAddress.equalsIgnoreCase(mac)) { | |||
| mList.add(0, "蓝牙已连接"); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| mAILinkBleManager.setOnCallbackBle(this); | |||
| BleDevice bleDevice = mAILinkBleManager.getBleDevice(mAddress); | |||
| if (bleDevice != null) { | |||
| ToothBrushWiFiBleUtilsData.init(bleDevice, this, this); | |||
| mToothBrushWiFiBleUtilsData = ToothBrushWiFiBleUtilsData.getInstance(); | |||
| mMHandler.sendEmptyMessageDelayed(TO_REQUEST_TOKEN, 600); | |||
| mMHandler.sendEmptyMessageDelayed(GET_BATTERY, 800); | |||
| } | |||
| } | |||
| } | |||
| @Override | |||
| public void bleOpen() { | |||
| if (mAILinkBleManager != null) { | |||
| mAILinkBleManager.startScan(30000L); | |||
| } | |||
| mList.add(0, "蓝牙已开启,开始搜索连接"); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void bleClose() { | |||
| mList.add(0, "蓝牙已关闭"); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onBleAndWifiStatus(int bleStatus, int wifiStatus, int workStatus) { | |||
| String show = "蓝牙状态:"; | |||
| switch (wifiStatus) { | |||
| case 0: | |||
| show += "无连接"; | |||
| break; | |||
| case 1: | |||
| show += "已连接"; | |||
| break; | |||
| case 2: | |||
| show += "配对完成"; | |||
| break; | |||
| } | |||
| show += " wifi状态:"; | |||
| switch (wifiStatus) { | |||
| case 0: | |||
| show += "没连接热点"; | |||
| break; | |||
| case 1: | |||
| show += "尝试连接热点,但是失败了"; | |||
| break; | |||
| case 2: | |||
| show += "连接的热点无网络或者信号不好"; | |||
| break; | |||
| case 3: | |||
| show += "成功连接上热点"; | |||
| break; | |||
| case 4: | |||
| show += "有热点信息,还没连接"; | |||
| break; | |||
| } | |||
| show += " 工作状态:"; | |||
| switch (workStatus) { | |||
| case 0: | |||
| show += "唤醒"; | |||
| break; | |||
| case 1: | |||
| show += "进入休眠"; | |||
| break; | |||
| case 2: | |||
| show += "模块准备就绪"; | |||
| break; | |||
| } | |||
| mList.add(0, show); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onWifiScanStatus(int status) { | |||
| mList.add(0, "扫描wifi状态: " + status); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onConnectWifiName(String name) { | |||
| mList.add(0, "当前连接wifi名称: " + name); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onWifiScanBean(WifiBleInfoBean wifiBleInfoBean) { | |||
| mList.add(0, "扫描到wifi: " + wifiBleInfoBean.toString()); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onWifiScanFinish(List<WifiBleInfoBean> list) { | |||
| mList.add(0, "扫描结束 扫描的wifi个数 " + list.size()); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| if (mWifiBleInfoBeanList == null) { | |||
| mWifiBleInfoBeanList = new ArrayList<>(); | |||
| } | |||
| mWifiBleInfoBeanList.clear(); | |||
| mWifiList.clear(); | |||
| for (WifiBleInfoBean wifiBleInfoBean : list) { | |||
| String ssid = wifiBleInfoBean.getSsid(); | |||
| if (TextUtils.isEmpty(ssid)) { | |||
| continue; | |||
| } | |||
| mWifiList.add(new DialogStringImageBean(ssid, wifiBleInfoBean.getType())); | |||
| mWifiBleInfoBeanList.add(wifiBleInfoBean); | |||
| } | |||
| if (mShowListDialogFragment != null) { | |||
| mShowListDialogFragment.setList(mWifiList); | |||
| } | |||
| } | |||
| @Override | |||
| public void onSetWifiNameOrPwdOrConnectCallback(int type, int status) { | |||
| if (type == CmdConfig.SET_WIFI_MAC) { | |||
| mList.add(0, "获取到设置的mac地址状态 " + status); | |||
| } | |||
| if (type == CmdConfig.SET_WIFI_PWD) { | |||
| mList.add(0, "获取到设置的密码状态 " + status); | |||
| } | |||
| if (type == CmdConfig.DIS_OR_CON_WIFI) { | |||
| mList.add(0, "发起连接 " + status); | |||
| } | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onWifiConnecting(int status) { | |||
| WifiBleDeviceData.OnWiFiBleCallback.super.onWifiConnecting(status); | |||
| } | |||
| @Override | |||
| public void onConnectWifiMac(String mac) { | |||
| mList.add(0, "获取到设置的wifi的mac地址 " + mac); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onConnectWifiPwd(String pwd) { | |||
| mList.add(0, "获取到设置的wifi的密码 " + pwd); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onDeviceSn(long sn) { | |||
| mList.add(0, "sn: " + sn); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onServerIp(String ip) { | |||
| mList.add(0, "ip: " + ip); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onServerPort(int port) { | |||
| mList.add(0, "port: " + port); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onServerPath(String path) { | |||
| mList.add(0, "path: " + path); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| /** | |||
| * 关于服务器设置信息 | |||
| * | |||
| * @param status 状态 true 配置完成, false 配置失败 | |||
| */ | |||
| @Override | |||
| public void onServerSettingInfo(boolean status) { | |||
| mList.add(0, "服务器设置信息: " + (status ? "配置完成" : "配置失败")); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onVersion(String version) { | |||
| mList.add(0, "版本号:" + version); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onGetSupportGears(List<Integer> staif, List<Integer> secondLevel) { | |||
| mList.add(0, "牙刷支持的一级档位:" + Arrays.toString(staif.toArray()) + " 二级档位:" + Arrays.toString(secondLevel.toArray())); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onGetBattery(int batteryStatus, int batteryQuantity) { | |||
| mList.add(0, "电池状态:" + batteryStatus + " 电量:" + batteryQuantity); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onGetDefaultGearAndDuration(int time, int gear, int gearFrom) { | |||
| mList.add(0, "获得到默认的刷牙档位和时长:" + time + " 档位:" + gear + " 档位级别" + gearFrom); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onGetTokenResult(int result) { | |||
| String s = ""; | |||
| if (result == ToothBrushBleCmd.NO_TOKEN) { | |||
| s = "没有"; | |||
| } else if (result == ToothBrushBleCmd.HAS_TOKEN) { | |||
| s = "已经授权"; | |||
| } else if (result == ToothBrushBleCmd.WITHOUT_TOKEN) { | |||
| s = "不需要授权"; | |||
| } else if (result == ToothBrushBleCmd.SUCCESSTOKEN) { | |||
| s = "授权成功"; | |||
| } | |||
| mList.add(0, "请求授权结果" + result + " " + s); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onGetManualParameter(int time, int hz, int duty) { | |||
| mList.add(0, " 获取手动档位的参数: 时长" + time + " 频率" + hz + " 占空比" + duty); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onSetDefaultModeAndManualModeResult(byte type, int result) { | |||
| String s = ""; | |||
| if (result == 0) { | |||
| s = "设置成功"; | |||
| } else if (result == 1) { | |||
| s = "设置失败"; | |||
| } else if (result == 2) { | |||
| s = "不支持设置"; | |||
| } | |||
| if (type == ToothBrushBleCmd.SET_TOOTHBRUSH_TIME_GEARS) { | |||
| mList.add(0, " 设置默认刷牙时长和工作档位: 结果" + result + " " + s); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } else { | |||
| mList.add(0, " 设置手动设置(自定义)档位: 结果" + result + " " + s); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| } | |||
| @Override | |||
| public void onTestFinish(int totalTime, int leftTime, int rightTime, int mode, int battery) { | |||
| mList.add(0, "刷牙完成: 总时长:" + totalTime + " 左时长:" + leftTime + " 右时长:" + rightTime + " 模式:" + mode + " 电量:" + battery); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onTryOutResult(int result) { | |||
| mList.add(0, "设置使用结果:" + result + " ( 0:设置成功 1:设置失败,原因未知 2:不支持设置)"); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onTwoLevelModeDefault(int mode) { | |||
| mList.add(0, "获取二级档位默认值:" + mode); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onOTA(int status) { | |||
| String s = " "; | |||
| switch (status) { | |||
| case 0x00: | |||
| s = "wifiOTA 成功"; | |||
| break; | |||
| case 0x01: | |||
| s = "wifiOTA 失败"; | |||
| break; | |||
| case 0x02: | |||
| s = "不支持 wifiOTA"; | |||
| break; | |||
| case 0x03: | |||
| s = "模块主动开始 wifiOTA(MCU 收到该指 令后不能断电,需要等待 OTA 成功或者失败)"; | |||
| break; | |||
| } | |||
| mList.add(0, s); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onSetApiKey(boolean result) { | |||
| addText("设置apikey结果:" + result); | |||
| } | |||
| @Override | |||
| public void onGetApiKey(String apiKey) { | |||
| addText("读取到API KEY:" + apiKey); | |||
| } | |||
| @Override | |||
| public void onShowData(String data) { | |||
| L.i(data); | |||
| } | |||
| private class MHandler extends Handler { | |||
| @Override | |||
| public void handleMessage(Message msg) { | |||
| super.handleMessage(msg); | |||
| switch (msg.what) { | |||
| case TO_REFRESH_UI: | |||
| if (listAdapter != null) { | |||
| listAdapter.notifyDataSetChanged(); | |||
| } | |||
| break; | |||
| case TO_REQUEST_TOKEN: | |||
| mList.add(0, "请求授权"); | |||
| mToothBrushWiFiBleUtilsData.requestToken(System.currentTimeMillis()); | |||
| if (listAdapter != null) { | |||
| listAdapter.notifyDataSetChanged(); | |||
| } | |||
| mToothBrushWiFiBleUtilsData.getDefaultGearAndDuration(); | |||
| break; | |||
| case GET_BATTERY: | |||
| mToothBrushWiFiBleUtilsData.getBattery(); | |||
| break; | |||
| } | |||
| } | |||
| } | |||
| // 添加一条文本 | |||
| private void addText(String text) { | |||
| SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss:SSS", Locale.US); | |||
| mList.add(0, sdf.format(System.currentTimeMillis()) + ":\n" + text); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| private static final int FILE_SELECT_CODE = 0x1002; | |||
| private void showFileChooser() { | |||
| Intent intent = new Intent(Intent.ACTION_GET_CONTENT); | |||
| intent.setType("*/*"); | |||
| intent.addCategory(Intent.CATEGORY_OPENABLE); | |||
| try { | |||
| startActivityForResult(Intent.createChooser(intent, "Select a File to Upload"), FILE_SELECT_CODE); | |||
| } catch (android.content.ActivityNotFoundException ex) { | |||
| Toast.makeText(this, "Please install a File Manager.", Toast.LENGTH_SHORT).show(); | |||
| } | |||
| } | |||
| @Override | |||
| protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { | |||
| super.onActivityResult(requestCode, resultCode, data); | |||
| if (resultCode == RESULT_OK) { | |||
| Uri uri = data.getData(); | |||
| String path = uri.getPath(); | |||
| mList.add(0, "ota准备就绪,请勿操作"); | |||
| listAdapter.notifyDataSetChanged(); | |||
| // initOtaUtil(this, uri, new OnBleOTAListener() { | |||
| // @Override | |||
| // public void onOtaSuccess() { | |||
| // mList.add(0, "ota成功"); | |||
| // listAdapter.notifyDataSetChanged(); | |||
| // | |||
| // } | |||
| // | |||
| // @Override | |||
| // public void onOtaFailure(int cmd, String err) { | |||
| // mList.add(0, "失败"); | |||
| // listAdapter.notifyDataSetChanged(); | |||
| // } | |||
| // | |||
| // private int mOldProgress = -1; | |||
| // | |||
| // @Override | |||
| // public void onOtaProgress(float progress, int currentCount, int maxCount) { | |||
| // if (mOldProgress != progress) { | |||
| // mOldProgress = (int) progress; | |||
| // mList.add(0, "otaProgress:" + progress); | |||
| // listAdapter.notifyDataSetChanged(); | |||
| // } | |||
| // } | |||
| // }, mToothBrushWiFiBleUtilsData.getBleDevice()); | |||
| } else { | |||
| } | |||
| } | |||
| // private OPLOtaManager mOPLOtaManager; | |||
| // | |||
| // public void initOtaUtil(Context context, Uri url, OnBleOTAListener listener, BleDevice bleDevice) { | |||
| // mOPLOtaManager = null; | |||
| // mOPLOtaManager = OPLOtaManager.newBuilder(context).setFileUri(url).setOnBleOTAListener(listener).build(bleDevice); | |||
| // mOPLOtaManager.startOta(); | |||
| // } | |||
| } | |||
| @@ -6,6 +6,7 @@ import android.net.Uri; | |||
| import android.os.Bundle; | |||
| import android.os.Handler; | |||
| import android.os.Message; | |||
| import android.text.TextUtils; | |||
| import android.view.View; | |||
| import android.widget.ArrayAdapter; | |||
| import android.widget.EditText; | |||
| @@ -17,20 +18,23 @@ import androidx.annotation.Nullable; | |||
| import com.pingwang.bluetoothlib.bean.BleValueBean; | |||
| import com.pingwang.bluetoothlib.config.CmdConfig; | |||
| import com.pingwang.bluetoothlib.device.BleDevice; | |||
| import com.pingwang.bluetoothlib.device.wifibleDevice.WifiBleDeviceData; | |||
| import com.pingwang.bluetoothlib.device.wifibleDevice.WifiBleInfoBean; | |||
| import com.pingwang.bluetoothlib.listener.OnCallbackBle; | |||
| import com.pingwang.bluetoothlib.utils.BleLog; | |||
| import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||
| import java.lang.ref.WeakReference; | |||
| import java.util.ArrayList; | |||
| import java.util.Arrays; | |||
| import java.util.HashMap; | |||
| import java.util.List; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.WifiDialog; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.DialogStringImageBean; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.MoveDataDialogFragment; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.ShowListDialogFragment; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.ToothBrushUtils; | |||
| import cn.net.aicare.modulelibrary.module.ToothBrush.ToothBrushBleCmd; | |||
| import cn.net.aicare.modulelibrary.module.ToothBrush.ToothBrushWiFiBleUtilsData; | |||
| @@ -38,39 +42,37 @@ import cn.net.aicare.modulelibrary.module.ToothBrush.ToothBrushWiFiBleUtilsData; | |||
| /** | |||
| * Wifi+ble 牙刷 | |||
| */ | |||
| public class ToothBrushWifiBleActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, ToothBrushWiFiBleUtilsData.BleToothBrushWiFiCallback, ToothBrushWiFiBleUtilsData.BleToothBrushCallback { | |||
| private String TAG = ToothBrushWifiBleActivity.class.getName(); | |||
| public class ToothBrushWifiOnOnBleActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, WifiBleDeviceData.OnWiFiBleCallback, ToothBrushWiFiBleUtilsData.OnBleToothBrushCallback { | |||
| private String TAG = ToothBrushWifiOnOnBleActivity.class.getName(); | |||
| private String mAddress; | |||
| private List<String> mList; | |||
| private ArrayAdapter listAdapter; | |||
| private ToothBrushWiFiBleUtilsData mToothBrushWiFiBleUtilsData; | |||
| private MHandler mMHandler; | |||
| private EditText mEditText, select_gears_et, ed_score; | |||
| private String dataPaw; | |||
| private EditText select_gears_et, ed_score; | |||
| private List<DialogStringImageBean> mWifiList = new ArrayList<>(); | |||
| private List<WifiBleInfoBean> mWifiBleInfoBeanList = new ArrayList<>(); | |||
| @Override | |||
| protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
| super.onCreate(savedInstanceState); | |||
| setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//禁止横屏 | |||
| setContentView(R.layout.activity_tooth_brush_wifi_ble); | |||
| findViewById(R.id.wifistatus).setOnClickListener(this); | |||
| findViewById(R.id.sn).setOnClickListener(this); | |||
| findViewById(R.id.scan_wifi).setOnClickListener(this); | |||
| findViewById(R.id.connect_wifi).setOnClickListener(this); | |||
| findViewById(R.id.disconnect).setOnClickListener(this); | |||
| findViewById(R.id.setedname).setOnClickListener(this); | |||
| findViewById(R.id.support_unit).setOnClickListener(this); | |||
| findViewById(R.id.default_try_out).setOnClickListener(this); | |||
| findViewById(R.id.default_time_mode).setOnClickListener(this); | |||
| findViewById(R.id.default_mode).setOnClickListener(this); | |||
| findViewById(R.id.getWifiStatus).setOnClickListener(this); | |||
| findViewById(R.id.getSn).setOnClickListener(this); | |||
| findViewById(R.id.scanWifi).setOnClickListener(this); | |||
| findViewById(R.id.disconnectWifi).setOnClickListener(this); | |||
| findViewById(R.id.getWifiName).setOnClickListener(this); | |||
| findViewById(R.id.getSupportUnit).setOnClickListener(this); | |||
| findViewById(R.id.defaultTryOut).setOnClickListener(this); | |||
| findViewById(R.id.getTimeMode).setOnClickListener(this); | |||
| findViewById(R.id.defaultMode).setOnClickListener(this); | |||
| findViewById(R.id.ota).setOnClickListener(this); | |||
| findViewById(R.id.btn_score).setOnClickListener(this); | |||
| findViewById(R.id.btnScore).setOnClickListener(this); | |||
| mEditText = findViewById(R.id.select_wifi_et); | |||
| select_gears_et = findViewById(R.id.select_gears_et); | |||
| ed_score = findViewById(R.id.ed_score); | |||
| select_gears_et = findViewById(R.id.etSelectGears); | |||
| ed_score = findViewById(R.id.etScore); | |||
| mAddress = getIntent().getStringExtra("mac"); | |||
| mList = new ArrayList<>(); | |||
| @@ -84,16 +86,159 @@ public class ToothBrushWifiBleActivity extends BleBaseActivity implements View.O | |||
| } | |||
| @Override | |||
| public void onClick(View v) { | |||
| int id = v.getId(); | |||
| if (mToothBrushWiFiBleUtilsData != null) { | |||
| if (id == R.id.getWifiStatus) { | |||
| mToothBrushWiFiBleUtilsData.getWifiCurrentState(); | |||
| } else if (id == R.id.getSn) { | |||
| mToothBrushWiFiBleUtilsData.getDeviceId(); | |||
| } else if (id == R.id.scanWifi) { | |||
| mToothBrushWiFiBleUtilsData.scanWifi(); | |||
| mList.add(TimeUtils.getTime() + "正在扫描附近可用的wifi..."); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| showWifiList(); | |||
| } else if (id == R.id.getWifiName) { | |||
| mToothBrushWiFiBleUtilsData.getConnectWifiName(); | |||
| } else if (id == R.id.disconnectWifi) { | |||
| mToothBrushWiFiBleUtilsData.disconnectWifi(); | |||
| } else if (id == R.id.getSupportUnit) { | |||
| mToothBrushWiFiBleUtilsData.getSupportGears(); | |||
| } else if (id == R.id.defaultMode) { | |||
| String gear = select_gears_et.getText().toString().trim(); | |||
| if (!gear.isEmpty()) { | |||
| String[] gears = null; | |||
| if (gear.contains(",")) { | |||
| gears = gear.split(","); | |||
| } else if (gear.contains(",")) { | |||
| gears = gear.split(","); | |||
| } else { | |||
| Toast.makeText(this, "请输入时长,档位,档位级别(数字加符号)", Toast.LENGTH_SHORT).show(); | |||
| } | |||
| if (gears != null) { | |||
| try { | |||
| mToothBrushWiFiBleUtilsData.setDefault(Integer.parseInt(gears[0]), Integer.parseInt(gears[1]), Integer.parseInt(gears[2])); | |||
| } catch (NumberFormatException e) { | |||
| e.printStackTrace(); | |||
| Toast.makeText(this, "请输入时长,档位,档位级别(数字加符号)", Toast.LENGTH_SHORT).show(); | |||
| } | |||
| } | |||
| } | |||
| } else if (id == R.id.defaultTryOut) { | |||
| String gear1 = select_gears_et.getText().toString().trim(); | |||
| if (!gear1.isEmpty()) { | |||
| String[] gears = null; | |||
| if (gear1.contains(",")) { | |||
| gears = gear1.split(","); | |||
| } else if (gear1.contains(",")) { | |||
| gears = gear1.split(","); | |||
| } else { | |||
| Toast.makeText(this, "请输入时长,档位,档位级别(数字加符号)", Toast.LENGTH_SHORT).show(); | |||
| } | |||
| if (gears != null) { | |||
| try { | |||
| mToothBrushWiFiBleUtilsData.setTryOut(Integer.parseInt(gears[1]), Integer.parseInt(gears[2]), 0, 0); | |||
| } catch (NumberFormatException e) { | |||
| e.printStackTrace(); | |||
| Toast.makeText(this, "请输入时长,档位,档位级别(数字加符号)", Toast.LENGTH_SHORT).show(); | |||
| } | |||
| } | |||
| } | |||
| } else if (id == R.id.getTimeMode) { | |||
| mToothBrushWiFiBleUtilsData.getDefaultGearAndDuration(); | |||
| } else if (id == R.id.ota) { | |||
| showFileChooser(); | |||
| // mToothBrushWiFiBleUtilsData.setOta(); | |||
| } | |||
| } | |||
| if (v.getId() == R.id.btnScore) { | |||
| try { | |||
| String[] time = ed_score.getText().toString().trim().split(","); | |||
| int defaultTime = Integer.parseInt(time[0]); | |||
| int useTime = Integer.parseInt(time[1]); | |||
| int lTime = Integer.parseInt(time[2]); | |||
| int rTime = Integer.parseInt(time[3]); | |||
| ToothBrushUtils toothBrushUtils = new ToothBrushUtils(); | |||
| int grade = toothBrushUtils.getGrade(defaultTime, useTime, lTime, rTime); | |||
| int avg = toothBrushUtils.getAvgGrade(defaultTime, lTime, rTime); | |||
| int rang = toothBrushUtils.getRangeGrade(defaultTime, lTime, rTime); | |||
| int duration = toothBrushUtils.getDurationGrade(defaultTime, useTime); | |||
| mList.add(0, grade + " 均匀度: " + avg + " 范围:" + rang + " 刷牙时长:" + duration); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } catch (Exception e) { | |||
| mList.add(0, "出错了 请按 默认时长,刷牙时长,左时长,右时长.输入单位是秒"); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| e.printStackTrace(); | |||
| } | |||
| } | |||
| } | |||
| private ShowListDialogFragment mShowListDialogFragment; | |||
| private void showWifiList() { | |||
| if (mShowListDialogFragment == null) { | |||
| mShowListDialogFragment = ShowListDialogFragment.newInstance(); | |||
| mShowListDialogFragment.setList(mWifiList); | |||
| mShowListDialogFragment.setTitle("选择WIFI"); | |||
| mShowListDialogFragment.setCancel("取消", 0); | |||
| mShowListDialogFragment.setOnDialogListener(new ShowListDialogFragment.onDialogListener() { | |||
| @Override | |||
| public void onItemListener(int position) { | |||
| WifiBleInfoBean wifiBleInfoBean = mWifiBleInfoBeanList.get(position); | |||
| String ssid = wifiBleInfoBean.getSsid(); | |||
| MoveDataDialogFragment.newInstance() | |||
| .setTitle(ssid, "") | |||
| .setContent("", "请输入密码", MoveDataDialogFragment.NAME) | |||
| .setOk("OK", 0) | |||
| .setCancel("取消", 0) | |||
| .setOnDialogListener(new MoveDataDialogFragment.OnDialogListener() { | |||
| @Override | |||
| public void onSucceedListener(View v, String data) { | |||
| String pwd = data.trim(); | |||
| setConnectWifi(wifiBleInfoBean.getMac(), pwd); | |||
| } | |||
| }) | |||
| .show(getSupportFragmentManager()); | |||
| } | |||
| @Override | |||
| public void onCancelListener(View v) { | |||
| } | |||
| }); | |||
| } | |||
| mShowListDialogFragment.show(getSupportFragmentManager()); | |||
| } | |||
| /** | |||
| * 设置连接wifi | |||
| * | |||
| * @param mac mac | |||
| * @param pwd 密码 | |||
| */ | |||
| private void setConnectWifi(String mac, String pwd) { | |||
| if (mToothBrushWiFiBleUtilsData != null) { | |||
| mToothBrushWiFiBleUtilsData.setConnectWifiMac(mac, pwd); | |||
| mList.add(TimeUtils.getTime() + "正在连接wifi..."); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| } | |||
| @Override | |||
| public void onServiceSuccess() { | |||
| //与服务建立连接 | |||
| mList.add(0, "服务与界面建立连接成功"); | |||
| // mList.add(0, "搜索设备"); | |||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| mAILinkBleManager.setOnCallbackBle(this); | |||
| mAILinkBleManager.startScan(30 * 1000); | |||
| } | |||
| @@ -111,10 +256,6 @@ public class ToothBrushWifiBleActivity extends BleBaseActivity implements View.O | |||
| } | |||
| } | |||
| @Override | |||
| public void onStartScan() { | |||
| } | |||
| @Override | |||
| public void onScanning(BleValueBean data) { | |||
| @@ -122,317 +263,194 @@ public class ToothBrushWifiBleActivity extends BleBaseActivity implements View.O | |||
| if (data.getMac().equalsIgnoreCase(mAddress)) { | |||
| if (mAILinkBleManager != null) { | |||
| mAILinkBleManager.stopScan(); | |||
| mAILinkBleManager.connectDevice(data.getMac()); | |||
| mAILinkBleManager.connectDevice(data); | |||
| } | |||
| } | |||
| } | |||
| @Override | |||
| public void onScanTimeOut() { | |||
| } | |||
| @Override | |||
| public void onConnecting(String mac) { | |||
| } | |||
| @Override | |||
| public void onDisConnected(String mac, int code) { | |||
| mList.add(0, "蓝牙已断开"); | |||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||
| if (mAddress.equalsIgnoreCase(mac)) { | |||
| mList.add(0, "蓝牙已断开:" + mac); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| } | |||
| @Override | |||
| public void onServicesDiscovered(String mac) { | |||
| mList.add(0, "蓝牙已连接"); | |||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||
| mAILinkBleManager.setOnCallbackBle(this); | |||
| BleDevice bleDevice = mAILinkBleManager.getBleDevice(mAddress); | |||
| if (bleDevice != null) { | |||
| ToothBrushWiFiBleUtilsData.init(bleDevice, this, this); | |||
| mToothBrushWiFiBleUtilsData = ToothBrushWiFiBleUtilsData.getInstance(); | |||
| mMHandler.sendEmptyMessageDelayed(ToRequestToken, 600); | |||
| mMHandler.sendEmptyMessageDelayed(GETBATTERY, 800); | |||
| if (mAddress.equalsIgnoreCase(mac)) { | |||
| mList.add(0, "蓝牙已连接"); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| BleDevice bleDevice = mAILinkBleManager.getBleDevice(mAddress); | |||
| if (bleDevice != null) { | |||
| ToothBrushWiFiBleUtilsData.init(bleDevice, this, this); | |||
| mToothBrushWiFiBleUtilsData = ToothBrushWiFiBleUtilsData.getInstance(); | |||
| mMHandler.sendEmptyMessageDelayed(TO_REQUEST_TOKEN, 600); | |||
| mMHandler.sendEmptyMessageDelayed(GET_BATTERY, 800); | |||
| } | |||
| } | |||
| } | |||
| @Override | |||
| public void bleOpen() { | |||
| if (mAILinkBleManager != null) { | |||
| mAILinkBleManager.startScan(30000L); | |||
| } | |||
| mList.add(0, "蓝牙已开启,开始搜索连接"); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void bleClose() { | |||
| mList.add(0, "蓝牙已关闭"); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void OnBleAndWifiStatus(int blestatus, int wifistatus, int workstatus) { | |||
| BleLog.e(TAG, "蓝牙状态:" + blestatus + " wifi状态:" + " 工作状态:" + workstatus); | |||
| mList.add(0, "蓝牙状态:" + blestatus + " wifi状态:" + wifistatus + " 工作状态:" + workstatus); | |||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||
| public void onBleAndWifiStatus(int bleStatus, int wifiStatus, int workStatus) { | |||
| BleLog.e(TAG, "蓝牙状态:" + bleStatus + " wifi状态:" + wifiStatus + " 工作状态:" + workStatus); | |||
| mList.add(0, "蓝牙状态:" + bleStatus + " wifi状态:" + wifiStatus + " 工作状态:" + workStatus); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void OnWifiScanStatus(int Status) { | |||
| mList.add(0, "扫描wifi状态: " + Status); | |||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||
| public void onWifiScanStatus(int status) { | |||
| mList.add(0, "扫描wifi状态: " + status); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| private HashMap<Integer, String> mHashMap = new HashMap(); | |||
| @Override | |||
| public void OnWifiListName(int no, String name) { | |||
| mHashMap.put(no, name); | |||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||
| public void onConnectWifiName(String name) { | |||
| mList.add(0, "当前连接wifi名称: " + name); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| private HashMap<Integer, String> wifimacMap = new HashMap(); | |||
| @Override | |||
| public void OnWifiListInfo(int no, String mac, int db, int type, int wifistatus) { | |||
| wifimacMap.put(no, mac); | |||
| mList.add(0, "WIFI序号: " + no + " WIFI名称:" + mHashMap.get(no) + " WIFImac: " + mac + " db: " + db + " type: " + type + " wifistata" + wifistatus); | |||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||
| } | |||
| @Override | |||
| public void OnWifiCurrentConnect(String name) { | |||
| mList.add(0, "当前连接wifi名称: " + name); | |||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||
| public void onWifiScanBean(WifiBleInfoBean wifiBleInfoBean) { | |||
| mList.add(0, "扫描到wifi: " + wifiBleInfoBean.toString()); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void OnWifiScanFinish(int wifiNum) { | |||
| mList.add(0, "扫描结束 扫描的wifi个数 " + wifiNum); | |||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||
| public void onWifiScanFinish(List<WifiBleInfoBean> list) { | |||
| mList.add(0, "扫描结束 扫描的wifi个数 " + list.size()); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| if (mWifiBleInfoBeanList == null) { | |||
| mWifiBleInfoBeanList = new ArrayList<>(); | |||
| } | |||
| mWifiBleInfoBeanList.clear(); | |||
| mWifiList.clear(); | |||
| for (WifiBleInfoBean wifiBleInfoBean : list) { | |||
| String ssid = wifiBleInfoBean.getSsid(); | |||
| if (TextUtils.isEmpty(ssid)) { | |||
| continue; | |||
| } | |||
| mWifiList.add(new DialogStringImageBean(ssid, wifiBleInfoBean.getType())); | |||
| mWifiBleInfoBeanList.add(wifiBleInfoBean); | |||
| } | |||
| if (mShowListDialogFragment != null) { | |||
| mShowListDialogFragment.setList(mWifiList); | |||
| } | |||
| } | |||
| private boolean issetMac = false; | |||
| /** | |||
| * @param type {@link CmdConfig#SET_WIFI_MAC} | |||
| * @param status {@link ToothBrushBleCmd#STATUS_SUCCESS} | |||
| */ | |||
| @Override | |||
| public void OnSetWifiNameOrPwdOrConnectCallback(int type, int status) { | |||
| public void onSetWifiNameOrPwdOrConnectCallback(int type, int status) { | |||
| if (type == CmdConfig.SET_WIFI_MAC) { | |||
| mList.add(0, "获取到设置的mac地址状态 " + status); | |||
| if (status == ToothBrushBleCmd.STATUS_SUCCESS) { | |||
| issetMac = true; | |||
| setPaw(dataPaw); | |||
| } | |||
| } | |||
| if (type == CmdConfig.SET_WIFI_PWD) { | |||
| mList.add(0, "获取到设置的密码状态 " + status); | |||
| if (status == ToothBrushBleCmd.STATUS_SUCCESS && issetMac) { | |||
| mMHandler.sendEmptyMessage(ConnectWifi); | |||
| } | |||
| } | |||
| if (type == CmdConfig.DIS_OR_CON_WIFI) { | |||
| mList.add(0, "发起连接 " + status); | |||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||
| } | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onWifiConnecting(int status) { | |||
| WifiBleDeviceData.OnWiFiBleCallback.super.onWifiConnecting(status); | |||
| } | |||
| @Override | |||
| public void getSelectWifiMac(String mac) { | |||
| public void onConnectWifiMac(String mac) { | |||
| mList.add(0, "获取到设置的wifi的mac地址 " + mac); | |||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void getSelectWifiPaw(String paw) { | |||
| mList.add(0, "获取到设置的wifi的密码 " + paw); | |||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||
| public void onConnectWifiPwd(String pwd) { | |||
| mList.add(0, "获取到设置的wifi的密码 " + pwd); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void getDid(long sn) { | |||
| public void onDeviceSn(long sn) { | |||
| mList.add(0, "sn: " + sn); | |||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onClick(View v) { | |||
| int id = v.getId(); | |||
| if (mToothBrushWiFiBleUtilsData != null) { | |||
| switch (id) { | |||
| case R.id.wifistatus: | |||
| mToothBrushWiFiBleUtilsData.queryBleStatus(); | |||
| break; | |||
| case R.id.sn: | |||
| mToothBrushWiFiBleUtilsData.getDevicedid(); | |||
| break; | |||
| case R.id.scan_wifi: | |||
| mToothBrushWiFiBleUtilsData.scanWifi(); | |||
| break; | |||
| case R.id.connect_wifi: | |||
| try { | |||
| int selectWifi = Integer.valueOf(mEditText.getText().toString().trim()); | |||
| if (mHashMap.get(selectWifi) != null && wifimacMap.get(selectWifi) != null) { | |||
| WifiDialog.newInstance().setTitle(mHashMap.get(selectWifi), wifimacMap.get(selectWifi)).setOnDialogListener(new WifiDialog.OnDialogListener() { | |||
| @Override | |||
| public void tvCancelListener(View v) { | |||
| } | |||
| @Override | |||
| public void tvSucceedListener(View v, String data) { | |||
| if (data.equals("") || data.length() > 8) { | |||
| dataPaw = data.trim(); | |||
| mToothBrushWiFiBleUtilsData.setWifiMac(wifimacMap.get(selectWifi)); | |||
| } else { | |||
| Toast.makeText(ToothBrushWifiBleActivity.this, "密码格式不对", Toast.LENGTH_SHORT).show(); | |||
| } | |||
| } | |||
| @Override | |||
| public void etModifyName(EditText v) { | |||
| } | |||
| }).show(getSupportFragmentManager()); | |||
| } | |||
| } catch (NumberFormatException e) { | |||
| e.printStackTrace(); | |||
| mMHandler.sendEmptyMessage(ConnectWifi); | |||
| } | |||
| break; | |||
| case R.id.setedname: | |||
| mToothBrushWiFiBleUtilsData.getConnectWifiName(); | |||
| break; | |||
| case R.id.disconnect: | |||
| mToothBrushWiFiBleUtilsData.disconnectWifi(); | |||
| break; | |||
| case R.id.support_unit: | |||
| mToothBrushWiFiBleUtilsData.getSupportGears(); | |||
| break; | |||
| case R.id.default_mode: | |||
| String gear = select_gears_et.getText().toString().trim(); | |||
| if (!gear.isEmpty()) { | |||
| String[] gears = null; | |||
| if (gear.contains(",")) { | |||
| gears = gear.split(","); | |||
| } else if (gear.contains(",")) { | |||
| gears = gear.split(","); | |||
| } else { | |||
| Toast.makeText(this, "请输入时长,档位,档位级别(数字加符号)", Toast.LENGTH_SHORT).show(); | |||
| } | |||
| if (gears != null) { | |||
| try { | |||
| mToothBrushWiFiBleUtilsData.setDefault(Integer.parseInt(gears[0]), Integer.parseInt(gears[1]), Integer.parseInt(gears[2])); | |||
| } catch (NumberFormatException e) { | |||
| e.printStackTrace(); | |||
| Toast.makeText(this, "请输入时长,档位,档位级别(数字加符号)", Toast.LENGTH_SHORT).show(); | |||
| } | |||
| } | |||
| } | |||
| break; | |||
| case R.id.default_try_out: | |||
| String gear1 = select_gears_et.getText().toString().trim(); | |||
| if (!gear1.isEmpty()) { | |||
| String[] gears = null; | |||
| if (gear1.contains(",")) { | |||
| gears = gear1.split(","); | |||
| } else if (gear1.contains(",")) { | |||
| gears = gear1.split(","); | |||
| } else { | |||
| Toast.makeText(this, "请输入时长,档位,档位级别(数字加符号)", Toast.LENGTH_SHORT).show(); | |||
| } | |||
| if (gears != null) { | |||
| try { | |||
| mToothBrushWiFiBleUtilsData.setTryOut(Integer.parseInt(gears[1]), Integer.parseInt(gears[2]), 0, 0); | |||
| } catch (NumberFormatException e) { | |||
| e.printStackTrace(); | |||
| Toast.makeText(this, "请输入时长,档位,档位级别(数字加符号)", Toast.LENGTH_SHORT).show(); | |||
| } | |||
| } | |||
| } | |||
| break; | |||
| case R.id.default_time_mode: | |||
| mToothBrushWiFiBleUtilsData.getDefaultGearAndDuration(); | |||
| break; | |||
| case R.id.ota: | |||
| showFileChooser(); | |||
| // mToothBrushWiFiBleUtilsData.setOta(); | |||
| break; | |||
| default: | |||
| public void onServerIp(String ip) { | |||
| mList.add(0, "ip: " + ip); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| break; | |||
| } | |||
| } | |||
| if (v.getId() == R.id.btn_score) { | |||
| try { | |||
| String[] time = ed_score.getText().toString().trim().split(","); | |||
| int defaultTime = Integer.parseInt(time[0]); | |||
| int useTime = Integer.parseInt(time[1]); | |||
| int lTime = Integer.parseInt(time[2]); | |||
| int rTime = Integer.parseInt(time[3]); | |||
| ToothBrushUtils toothBrushUtils = new ToothBrushUtils(); | |||
| int grade = toothBrushUtils.getGrade(defaultTime, useTime, lTime, rTime); | |||
| int avg = toothBrushUtils.getAvgGrade(defaultTime, lTime, rTime); | |||
| int rang = toothBrushUtils.getRangeGrade(defaultTime, lTime, rTime); | |||
| int duration = toothBrushUtils.getDurationGrade(defaultTime, useTime); | |||
| mList.add(0, grade + " 均匀度: " + avg + " 范围:" + rang + " 刷牙时长:" + duration); | |||
| @Override | |||
| public void onServerPort(int port) { | |||
| mList.add(0, "port: " + port); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||
| } catch (Exception e) { | |||
| @Override | |||
| public void onServerPath(String path) { | |||
| mList.add(0, "path: " + path); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| mList.add(0, "出错了 请按 默认时长,刷牙时长,左时长,右时长.输入单位是秒"); | |||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||
| e.printStackTrace(); | |||
| } | |||
| } | |||
| /** | |||
| * 关于服务器设置信息 | |||
| * | |||
| * @param status 状态 true 配置完成, false 配置失败 | |||
| */ | |||
| @Override | |||
| public void onServerSettingInfo(boolean status) { | |||
| mList.add(0, "服务器设置信息: " + (status ? "配置完成" : "配置失败")); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| private final int ToRefreUi = 300; | |||
| private final int ConnectWifi = 400; | |||
| private final int ToRequestToken = 500; | |||
| private final int GETBATTERY = 600; | |||
| private final int TO_REFRESH_UI = 300; | |||
| private final int CONNECT_WIFI = 400; | |||
| private final int TO_REQUEST_TOKEN = 500; | |||
| private final int GET_BATTERY = 600; | |||
| @Override | |||
| public void onVersion(String version) { | |||
| mList.add(0, "版本号:" + version); | |||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onGetSupportGears(List<Integer> staif, List<Integer> secondLevel) { | |||
| mList.add(0, "牙刷支持的一级档位:" + Arrays.toString(staif.toArray()) + " 二级档位:" + Arrays.toString(secondLevel.toArray())); | |||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onGetBattery(int batteryStatus, int batteryQuantity) { | |||
| mList.add(0, "电池状态:" + batteryStatus + " 电量:" + batteryQuantity); | |||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onGetDefaultGearAndDuration(int time, int gear, int gearFrom) { | |||
| mList.add(0, "获得到默认的刷牙档位和时长:" + time + " 档位:" + gear + " 档位级别" + gearFrom); | |||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| @@ -448,13 +466,13 @@ public class ToothBrushWifiBleActivity extends BleBaseActivity implements View.O | |||
| s = "授权成功"; | |||
| } | |||
| mList.add(0, "请求授权结果" + result + " " + s); | |||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onGetManualParameter(int time, int hz, int duty) { | |||
| mList.add(0, " 获取手动档位的参数: 时长" + time + " 频率" + hz + " 占空比" + duty); | |||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| @@ -469,29 +487,29 @@ public class ToothBrushWifiBleActivity extends BleBaseActivity implements View.O | |||
| } | |||
| if (type == ToothBrushBleCmd.SET_TOOTHBRUSH_TIME_GEARS) { | |||
| mList.add(0, " 设置默认刷牙时长和工作档位: 结果" + result + " " + s); | |||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } else { | |||
| mList.add(0, " 设置手动设置(自定义)档位: 结果" + result + " " + s); | |||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| } | |||
| @Override | |||
| public void onTestFinish(int totalTime, int leftTime, int rightTime, int mode, int battery) { | |||
| mList.add(0, "刷牙完成: 总时长:" + totalTime + " 左时长:" + leftTime + " 右时长:" + rightTime + " 模式:" + mode + " 电量:" + battery); | |||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onTryOutResult(int result) { | |||
| mList.add(0, "设置使用结果:" + result + " ( 0:设置成功 1:设置失败,原因未知 2:不支持设置)"); | |||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onTwoLevelModeDefault(int mode) { | |||
| mList.add(0, "获取二级档位默认值:" + mode); | |||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @@ -513,7 +531,18 @@ public class ToothBrushWifiBleActivity extends BleBaseActivity implements View.O | |||
| break; | |||
| } | |||
| mList.add(0, s); | |||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||
| mMHandler.sendEmptyMessage(TO_REFRESH_UI); | |||
| } | |||
| @Override | |||
| public void onGetApiKey(String apiKey) { | |||
| ToothBrushWiFiBleUtilsData.OnBleToothBrushCallback.super.onGetApiKey(apiKey); | |||
| } | |||
| @Override | |||
| public void onSetApiKey(boolean result) { | |||
| ToothBrushWiFiBleUtilsData.OnBleToothBrushCallback.super.onSetApiKey(result); | |||
| } | |||
| @Override | |||
| @@ -526,15 +555,15 @@ public class ToothBrushWifiBleActivity extends BleBaseActivity implements View.O | |||
| public void handleMessage(Message msg) { | |||
| super.handleMessage(msg); | |||
| switch (msg.what) { | |||
| case ToRefreUi: | |||
| case TO_REFRESH_UI: | |||
| if (listAdapter != null) { | |||
| listAdapter.notifyDataSetChanged(); | |||
| } | |||
| break; | |||
| case ConnectWifi: | |||
| mToothBrushWiFiBleUtilsData.connectWifi(); | |||
| case CONNECT_WIFI: | |||
| mToothBrushWiFiBleUtilsData.setConnectWifi(); | |||
| break; | |||
| case ToRequestToken: | |||
| case TO_REQUEST_TOKEN: | |||
| mList.add(0, "请求授权"); | |||
| mToothBrushWiFiBleUtilsData.requestToken(System.currentTimeMillis()); | |||
| if (listAdapter != null) { | |||
| @@ -542,7 +571,7 @@ public class ToothBrushWifiBleActivity extends BleBaseActivity implements View.O | |||
| } | |||
| mToothBrushWiFiBleUtilsData.getDefaultGearAndDuration(); | |||
| break; | |||
| case GETBATTERY: | |||
| case GET_BATTERY: | |||
| mToothBrushWiFiBleUtilsData.getBattery(); | |||
| break; | |||
| } | |||
| @@ -550,51 +579,6 @@ public class ToothBrushWifiBleActivity extends BleBaseActivity implements View.O | |||
| } | |||
| /** | |||
| * wifi密码一次只能传14个byte | |||
| * 如果密码长度超过14个byte 就需要分包传送 | |||
| * subpackage 为0 时,表示后面还有数据 | |||
| * subpackage 为1 时,表示数据小于或等于14个byte,后面没有数据 | |||
| * | |||
| * @param paw | |||
| */ | |||
| private void setPaw(String paw) { | |||
| if (paw.isEmpty()) { | |||
| byte[] bytes = new byte[0]; | |||
| mToothBrushWiFiBleUtilsData.setWifiPwd(0, bytes); | |||
| } else { | |||
| byte[] password = BleStrUtils.stringToBytes(paw); | |||
| if (password != null) { | |||
| if (password.length < 14) { | |||
| mToothBrushWiFiBleUtilsData.setWifiPwd(0, password); | |||
| } else { | |||
| boolean isend = false; | |||
| int i = 0; | |||
| byte[] byte1 = password; | |||
| while (!isend) { | |||
| if (byte1.length > 14) { | |||
| byte[] bytes = new byte[14]; | |||
| System.arraycopy(password, i, bytes, 0, bytes.length); | |||
| mToothBrushWiFiBleUtilsData.setWifiPwd(1, bytes); | |||
| i = i + 14; | |||
| byte1 = Arrays.copyOf(password, password.length - i); | |||
| } else { | |||
| isend = true; | |||
| byte[] bytes = new byte[password.length - i]; | |||
| System.arraycopy(password, i, bytes, 0, bytes.length); | |||
| mToothBrushWiFiBleUtilsData.setWifiPwd(1, bytes); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| } | |||
| } | |||
| private static final int FILE_SELECT_CODE = 0x1002; | |||
| private void showFileChooser() { | |||
| @@ -653,7 +637,7 @@ public class ToothBrushWifiBleActivity extends BleBaseActivity implements View.O | |||
| // | |||
| // public void initOtaUtil(Context context, Uri url, OnBleOTAListener listener, BleDevice bleDevice) { | |||
| // mOPLOtaManager = null; | |||
| // mOPLOtaManager = OPLOtaManager.newBuilder(context).setFilePath(url).setOnBleOTAListener(listener).build(bleDevice); | |||
| // mOPLOtaManager = OPLOtaManager.newBuilder(context).setFileUri(url).setOnBleOTAListener(listener).build(bleDevice); | |||
| // mOPLOtaManager.startOta(); | |||
| // } | |||
| @@ -290,11 +290,11 @@ public class WeightScaleActivity extends BleBaseActivity implements WeightScaleD | |||
| addText("版本号:" + version); | |||
| } | |||
| // /** | |||
| // * 请求同步时间 | |||
| // * | |||
| // * @param quest 1-请求同步时间 | |||
| // */ | |||
| /** | |||
| * 请求同步时间 | |||
| * | |||
| * @param quest 1-请求同步时间 | |||
| */ | |||
| // @Override | |||
| // public void onSyncTime(int quest) { | |||
| // if (quest == 1) { | |||
| @@ -24,6 +24,8 @@ import androidx.annotation.Nullable; | |||
| import com.pingwang.bluetoothlib.config.CmdConfig; | |||
| import com.pingwang.bluetoothlib.device.BleDevice; | |||
| import com.pingwang.bluetoothlib.device.wifibleDevice.WifiBleDeviceData; | |||
| import com.pingwang.bluetoothlib.device.wifibleDevice.WifiBleInfoBean; | |||
| import com.pingwang.bluetoothlib.listener.OnCallbackBle; | |||
| import com.pingwang.bluetoothlib.utils.BleLog; | |||
| @@ -48,10 +50,8 @@ import cn.net.aicare.modulelibrary.module.BodyFatScale.AppHistoryRecordBean; | |||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatBleUtilsData; | |||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatDataUtil; | |||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatRecord; | |||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatUserBean; | |||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.McuHistoryRecordBean; | |||
| import cn.net.aicare.modulelibrary.module.BodyFatScale.User; | |||
| import cn.net.aicare.modulelibrary.module.wifibleDevice.WifiBleDeviceData; | |||
| import cn.net.aicare.modulelibrary.module.wifibleDevice.WifiBleInfoBean; | |||
| /** | |||
| * wifi+ble体脂秤 | |||
| @@ -74,19 +74,19 @@ public class WeightScaleWifiBleActivity extends BleBaseActivity implements View. | |||
| private ActivityResultLauncher<Boolean> launcher; | |||
| private WifiBleDeviceData mWifiBleDeviceData; | |||
| private User selectUser; | |||
| private BodyFatUserBean mSelectBodyFatUserBean; | |||
| @Override | |||
| protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
| super.onCreate(savedInstanceState); | |||
| setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//禁止横屏 | |||
| setContentView(R.layout.activity_weight_scale_wifi_ble); | |||
| findViewById(R.id.wifistatus).setOnClickListener(this); | |||
| findViewById(R.id.sn).setOnClickListener(this); | |||
| findViewById(R.id.scan_wifi).setOnClickListener(this); | |||
| findViewById(R.id.connect_wifi).setOnClickListener(this); | |||
| findViewById(R.id.disconnect).setOnClickListener(this); | |||
| findViewById(R.id.setedname).setOnClickListener(this); | |||
| findViewById(R.id.getWifiStatus).setOnClickListener(this); | |||
| findViewById(R.id.getSn).setOnClickListener(this); | |||
| findViewById(R.id.scanWifi).setOnClickListener(this); | |||
| findViewById(R.id.connectWifi).setOnClickListener(this); | |||
| findViewById(R.id.disconnectWifi).setOnClickListener(this); | |||
| findViewById(R.id.getWifiName).setOnClickListener(this); | |||
| findViewById(R.id.setedpaw).setOnClickListener(this); | |||
| findViewById(R.id.setedmac).setOnClickListener(this); | |||
| findViewById(R.id.ota).setOnClickListener(this); | |||
| @@ -157,128 +157,107 @@ public class WeightScaleWifiBleActivity extends BleBaseActivity implements View. | |||
| FileUtils.init(); | |||
| mDialogList = new ArrayList<>(); | |||
| initLauncher(); | |||
| selectUser = getDefault(); | |||
| mSelectBodyFatUserBean = getDefault(); | |||
| } | |||
| @Override | |||
| public void onClick(View v) { | |||
| int id = v.getId(); | |||
| switch (id) { | |||
| case R.id.reset: | |||
| mList.add(0, getString(R.string.reset)); | |||
| listAdapter.notifyDataSetChanged(); | |||
| if (mWifiBleDeviceData != null) { | |||
| mWifiBleDeviceData.setReset(); | |||
| } | |||
| break; | |||
| case R.id.wifistatus: | |||
| if (mWifiBleDeviceData != null) { | |||
| mWifiBleDeviceData.getWifiCurrentState(); | |||
| } | |||
| break; | |||
| case R.id.sn: | |||
| if (mWifiBleDeviceData != null) { | |||
| mWifiBleDeviceData.getDeviceSn(); | |||
| } | |||
| break; | |||
| case R.id.scan_wifi: | |||
| if (mWifiBleDeviceData != null) { | |||
| mWifiBleDeviceData.getWifiList(); | |||
| mList.add(TimeUtils.getTime() + "sacn wifi..."); | |||
| mMHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| showWifiList(); | |||
| break; | |||
| case R.id.setedmac: | |||
| if (mWifiBleDeviceData != null) { | |||
| mWifiBleDeviceData.getConnectWifiMac(); | |||
| } | |||
| break; | |||
| case R.id.setedpaw: | |||
| if (mWifiBleDeviceData != null) { | |||
| mWifiBleDeviceData.getConnectWifiPwd(); | |||
| } | |||
| break; | |||
| case R.id.setedname: | |||
| if (mWifiBleDeviceData != null) { | |||
| mWifiBleDeviceData.getConnectWifiSsid(); | |||
| } | |||
| break; | |||
| case R.id.disconnect: | |||
| if (mWifiBleDeviceData != null) { | |||
| mWifiBleDeviceData.setDisconnectWifi(); | |||
| } | |||
| break; | |||
| case R.id.ota: | |||
| showFileChooser(); | |||
| break; | |||
| case R.id.surroundings: | |||
| String ipStr = et_ip.getText().toString(); | |||
| String port = et_port.getText().toString(); | |||
| String path = et_path.getText().toString(); | |||
| if (mWifiBleDeviceData != null) { | |||
| mWifiBleDeviceData.setServiceInfo(ipStr, Integer.parseInt(port), path); | |||
| } | |||
| mList.add(0, getString(R.string.set_environment) + ipStr + ":" + port + path); | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.check_ip: | |||
| if (mWifiBleDeviceData != null) { | |||
| mWifiBleDeviceData.getIp(); | |||
| } | |||
| mList.add(0, getString(R.string.view_environment_ip)); | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.check_port: | |||
| if (mWifiBleDeviceData != null) { | |||
| mWifiBleDeviceData.getPort(); | |||
| } | |||
| mList.add(0, getString(R.string.view_environment_port)); | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.check_path: | |||
| if (mWifiBleDeviceData != null) { | |||
| mWifiBleDeviceData.getPath(); | |||
| } | |||
| mList.add(0, getString(R.string.view_environment_path)); | |||
| listAdapter.notifyDataSetChanged(); | |||
| break; | |||
| case R.id.btn_select_file: | |||
| if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { | |||
| launcher.launch(true); | |||
| } else { | |||
| mDialogList.clear(); | |||
| ArrayList<String> list = FileUtils.list(); | |||
| for (String s : list) { | |||
| mDialogList.add(new DialogStringImageBean(s, 0)); | |||
| } | |||
| ShowListDialogFragment.newInstance() | |||
| .setTitle("") | |||
| .setCancel("", 0) | |||
| .setCancelBlank(true) | |||
| .setBackground(true) | |||
| .setBottom(false) | |||
| .setList(mDialogList) | |||
| .setOnDialogListener(new ShowListDialogFragment.onDialogListener() { | |||
| @Override | |||
| public void onItemListener(int position) { | |||
| if (mDialogList.size() > position) { | |||
| DialogStringImageBean dialogStringImageBean = mDialogList.get(position); | |||
| String name = dialogStringImageBean.getName(); | |||
| SP.getInstance().putOtaFileName(name); | |||
| } | |||
| } | |||
| }) | |||
| .show(getSupportFragmentManager()); | |||
| if (id == R.id.reset) { | |||
| mList.add(0, getString(R.string.reset)); | |||
| listAdapter.notifyDataSetChanged(); | |||
| if (mWifiBleDeviceData != null) { | |||
| mWifiBleDeviceData.setReset(); | |||
| } | |||
| } else if (id == R.id.getWifiStatus) { | |||
| if (mWifiBleDeviceData != null) { | |||
| mWifiBleDeviceData.getWifiCurrentState(); | |||
| } | |||
| } else if (id == R.id.getSn) { | |||
| if (mWifiBleDeviceData != null) { | |||
| mWifiBleDeviceData.getDeviceSn(); | |||
| } | |||
| } else if (id == R.id.scanWifi) { | |||
| if (mWifiBleDeviceData != null) { | |||
| mWifiBleDeviceData.getWifiList(); | |||
| mList.add(TimeUtils.getTime() + "sacn wifi..."); | |||
| mMHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| showWifiList(); | |||
| } else if (id == R.id.setedmac) { | |||
| if (mWifiBleDeviceData != null) { | |||
| mWifiBleDeviceData.getConnectWifiMac(); | |||
| } | |||
| } else if (id == R.id.setedpaw) { | |||
| if (mWifiBleDeviceData != null) { | |||
| mWifiBleDeviceData.getConnectWifiPwd(); | |||
| } | |||
| } else if (id == R.id.getWifiName) { | |||
| if (mWifiBleDeviceData != null) { | |||
| mWifiBleDeviceData.getConnectWifiSsid(); | |||
| } | |||
| } else if (id == R.id.disconnectWifi) { | |||
| if (mWifiBleDeviceData != null) { | |||
| mWifiBleDeviceData.setDisconnectWifi(); | |||
| } | |||
| } else if (id == R.id.ota) { | |||
| showFileChooser(); | |||
| } else if (id == R.id.surroundings) { | |||
| String ipStr = et_ip.getText().toString(); | |||
| String port = et_port.getText().toString(); | |||
| String path = et_path.getText().toString(); | |||
| if (mWifiBleDeviceData != null) { | |||
| mWifiBleDeviceData.setServiceInfo(ipStr, Integer.parseInt(port), path); | |||
| } | |||
| mList.add(0, getString(R.string.set_environment) + ipStr + ":" + port + path); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.check_ip) { | |||
| if (mWifiBleDeviceData != null) { | |||
| mWifiBleDeviceData.getIp(); | |||
| } | |||
| mList.add(0, getString(R.string.view_environment_ip)); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.check_port) { | |||
| if (mWifiBleDeviceData != null) { | |||
| mWifiBleDeviceData.getPort(); | |||
| } | |||
| mList.add(0, getString(R.string.view_environment_port)); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.check_path) { | |||
| if (mWifiBleDeviceData != null) { | |||
| mWifiBleDeviceData.getPath(); | |||
| } | |||
| mList.add(0, getString(R.string.view_environment_path)); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } else if (id == R.id.btn_select_file) { | |||
| if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { | |||
| launcher.launch(true); | |||
| } else { | |||
| mDialogList.clear(); | |||
| ArrayList<String> list = FileUtils.list(); | |||
| for (String s : list) { | |||
| mDialogList.add(new DialogStringImageBean(s, 0)); | |||
| } | |||
| break; | |||
| ShowListDialogFragment.newInstance() | |||
| .setTitle("") | |||
| .setCancel("", 0) | |||
| .setCancelBlank(true) | |||
| .setBackground(true) | |||
| .setBottom(false) | |||
| .setList(mDialogList) | |||
| .setOnDialogListener(new ShowListDialogFragment.onDialogListener() { | |||
| @Override | |||
| public void onItemListener(int position) { | |||
| if (mDialogList.size() > position) { | |||
| DialogStringImageBean dialogStringImageBean = mDialogList.get(position); | |||
| String name = dialogStringImageBean.getName(); | |||
| SP.getInstance().putOtaFileName(name); | |||
| } | |||
| } | |||
| }) | |||
| .show(getSupportFragmentManager()); | |||
| } | |||
| } | |||
| } | |||
| @@ -324,16 +303,16 @@ public class WeightScaleWifiBleActivity extends BleBaseActivity implements View. | |||
| } | |||
| private User getDefault() { | |||
| User user = new User(); | |||
| user.setModeType(BodyFatDataUtil.MODE_ORDINARY); | |||
| user.setSex(BodyFatDataUtil.SEX_MAN); | |||
| user.setAge(18); | |||
| user.setHeight(170); | |||
| user.setAdc(560); | |||
| user.setWeight(50); | |||
| user.setId(1); | |||
| return user; | |||
| private BodyFatUserBean getDefault() { | |||
| BodyFatUserBean bodyFatUserBean = new BodyFatUserBean(); | |||
| bodyFatUserBean.setModeType(BodyFatDataUtil.MODE_ORDINARY); | |||
| bodyFatUserBean.setSex(BodyFatDataUtil.SEX_MAN); | |||
| bodyFatUserBean.setAge(18); | |||
| bodyFatUserBean.setHeight(170); | |||
| bodyFatUserBean.setAdc(560); | |||
| bodyFatUserBean.setWeight(50); | |||
| bodyFatUserBean.setId(1); | |||
| return bodyFatUserBean; | |||
| } | |||
| private void initLauncher() { | |||
| @@ -452,7 +431,7 @@ public class WeightScaleWifiBleActivity extends BleBaseActivity implements View. | |||
| case BodyFatDataUtil.MUC_REQUEST_USER_INFO: | |||
| mList.add(0, getString(R.string.measurement_status) + status + "\n" + getString(R.string.request_user_information)); | |||
| if (bodyFatBleUtilsData != null) { | |||
| bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().setUserInfo(selectUser, BleDeviceConfig.WEIGHT_BODY_FAT_SCALE)); | |||
| bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().setUserInfo(mSelectBodyFatUserBean, BleDeviceConfig.WEIGHT_BODY_FAT_SCALE)); | |||
| } | |||
| break; | |||
| default: | |||
| @@ -20,6 +20,8 @@ import com.pingwang.bluetoothlib.config.CmdConfig; | |||
| import com.pingwang.bluetoothlib.device.BleDevice; | |||
| import com.pingwang.bluetoothlib.device.BleSendCmdUtil; | |||
| import com.pingwang.bluetoothlib.device.SendBleBean; | |||
| import com.pingwang.bluetoothlib.device.wifibleDevice.WifiBleDeviceData; | |||
| import com.pingwang.bluetoothlib.device.wifibleDevice.WifiBleInfoBean; | |||
| import com.pingwang.bluetoothlib.listener.CallbackDisIm; | |||
| import com.pingwang.bluetoothlib.listener.OnBleCompanyListener; | |||
| import com.pingwang.bluetoothlib.listener.OnBleVersionListener; | |||
| @@ -41,8 +43,6 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
| import cn.net.aicare.modulelibrary.module.sphygmomanometer.SphyBleConfig; | |||
| import cn.net.aicare.modulelibrary.module.sphygmomanometer.SphyWifiBleDeviceData; | |||
| import cn.net.aicare.modulelibrary.module.wifibleDevice.WifiBleDeviceData; | |||
| import cn.net.aicare.modulelibrary.module.wifibleDevice.WifiBleInfoBean; | |||
| /** | |||
| @@ -164,72 +164,53 @@ public class WifiBleSphyActivity extends BleBaseActivity implements OnCallbackDi | |||
| @Override | |||
| public void onClick(View v) { | |||
| SendBleBean sendBleBean = new SendBleBean(); | |||
| switch (v.getId()) { | |||
| case R.id.btnVersion: | |||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||
| mSphyWifiBleDeviceData.sendData(sendBleBean); | |||
| break; | |||
| case R.id.btnBattery: | |||
| sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus()); | |||
| mSphyWifiBleDeviceData.sendData(sendBleBean); | |||
| break; | |||
| case R.id.btn_get_did: | |||
| sendBleBean.setHex(mBleSendCmdUtil.getDid()); | |||
| mSphyWifiBleDeviceData.sendData(sendBleBean); | |||
| break; | |||
| case R.id.btn_voice: | |||
| if (mVoiceStatus == 0) { | |||
| mVoiceStatus = 1; | |||
| } else { | |||
| mVoiceStatus = 0; | |||
| } | |||
| mSphyWifiBleDeviceData.setSphyVoice(mVoiceStatus); | |||
| break; | |||
| int id = v.getId(); | |||
| if (id == R.id.btnVersion) { | |||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||
| mSphyWifiBleDeviceData.sendData(sendBleBean); | |||
| } else if (id == R.id.btnBattery) { | |||
| sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus()); | |||
| mSphyWifiBleDeviceData.sendData(sendBleBean); | |||
| } else if (id == R.id.btn_get_did) { | |||
| sendBleBean.setHex(mBleSendCmdUtil.getDid()); | |||
| mSphyWifiBleDeviceData.sendData(sendBleBean); | |||
| } else if (id == R.id.btn_voice) { | |||
| if (mVoiceStatus == 0) { | |||
| mVoiceStatus = 1; | |||
| } else { | |||
| mVoiceStatus = 0; | |||
| case R.id.clear: | |||
| if (mList != null) | |||
| mList.clear(); | |||
| } | |||
| mSphyWifiBleDeviceData.setSphyVoice(mVoiceStatus); | |||
| } else if (id == R.id.clear) { | |||
| if (mList != null) | |||
| mList.clear(); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } else if (id == R.id.btn_config) { | |||
| String ip = et_url.getText().toString().trim(); | |||
| String port = et_port.getText().toString().trim(); | |||
| String path = et_path.getText().toString().trim(); | |||
| if (ip.length() == 0 || port.length() == 0) { | |||
| mList.add(TimeUtils.getTime() + "配置失败:ip或端口为空"); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| break; | |||
| case R.id.btn_config: | |||
| String ip = et_url.getText().toString().trim(); | |||
| String port = et_port.getText().toString().trim(); | |||
| String path = et_path.getText().toString().trim(); | |||
| if (ip.length() == 0 || port.length() == 0) { | |||
| mList.add(TimeUtils.getTime() + "配置失败:ip或端口为空"); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| return; | |||
| } | |||
| setServiceInfo(ip, Integer.parseInt(port), path); | |||
| mList.add(TimeUtils.getTime() + "配置服务器信息中..."); | |||
| return; | |||
| } | |||
| setServiceInfo(ip, Integer.parseInt(port), path); | |||
| mList.add(TimeUtils.getTime() + "配置服务器信息中..."); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } else if (id == R.id.btn_read_config) { | |||
| getWifiConnectInfo(); | |||
| } else if (id == R.id.btn_read_wifi_status) { | |||
| if (mWifiBleDeviceData != null) { | |||
| mWifiBleDeviceData.getWifiCurrentState(); | |||
| } | |||
| } else if (id == R.id.btn_wifi) { | |||
| if (mWifiBleDeviceData != null) { | |||
| mWifiBleDeviceData.getWifiList(); | |||
| mList.add(TimeUtils.getTime() + "正在扫描附近可用的wifi..."); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| break; | |||
| case R.id.btn_read_config: | |||
| getWifiConnectInfo(); | |||
| break; | |||
| case R.id.btn_read_wifi_status: | |||
| if (mWifiBleDeviceData != null) { | |||
| mWifiBleDeviceData.getWifiCurrentState(); | |||
| } | |||
| break; | |||
| case R.id.btn_wifi: | |||
| if (mWifiBleDeviceData != null) { | |||
| mWifiBleDeviceData.getWifiList(); | |||
| mList.add(TimeUtils.getTime() + "正在扫描附近可用的wifi..."); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| showWifiList(); | |||
| break; | |||
| default: | |||
| break; | |||
| } | |||
| showWifiList(); | |||
| } | |||
| } | |||
| @@ -1,114 +0,0 @@ | |||
| package aicare.net.cn.sdk.ailinksdkdemoandroid.utils; | |||
| import com.pingwang.bluetoothlib.AILinkBleManager; | |||
| import com.pingwang.bluetoothlib.bean.BleScanAddAilinkBean; | |||
| import com.pingwang.bluetoothlib.config.BleConfig; | |||
| import com.pingwang.bluetoothlib.server.ELinkBleServer; | |||
| import com.pingwang.bluetoothlib.utils.UuidUtils; | |||
| import java.util.ArrayList; | |||
| import java.util.List; | |||
| import java.util.UUID; | |||
| /** | |||
| * 蓝牙扫描设备工具 | |||
| * 因为 AILink 现在接了不是 AILink 协议的设备,比如旧的营养秤 UUID 不同 | |||
| */ | |||
| public class BleScanUtil { | |||
| /** | |||
| * 开始扫描设备 | |||
| * | |||
| * @param blueToothService 蓝牙服务 | |||
| * @param timeout 延迟 ms | |||
| */ | |||
| public static void scanLeDevice(ELinkBleServer blueToothService, long timeout) { | |||
| blueToothService.scanLeDevice(timeout, getScanLeDeviceMap()); | |||
| } | |||
| public static void scanLeDevice(AILinkBleManager aiLinkBleManager, long timeout) { | |||
| aiLinkBleManager.startScan(timeout, getScanLeDeviceMap()); | |||
| } | |||
| public static List<BleScanAddAilinkBean> getScanLeDeviceMap() { | |||
| List<BleScanAddAilinkBean> list = new ArrayList<>(); | |||
| list.add(getAifresh()); | |||
| list.add(getAifit02()); | |||
| list.add(getAifit03()); | |||
| list.add(getOkOk()); | |||
| return list; | |||
| } | |||
| public static UUID[] getScanLeDeviceUUID() { | |||
| UUID[] uuids = new UUID[]{UUID.fromString("0000FFB0-0000-1000-8000-00805F9B34FB"),// 旧的营养秤 AC05 | |||
| // UUID.fromString("0000FEE7-0000-1000-8000-00805F9B34FB"),// 华盛达手表 | |||
| BleConfig.UUID_SERVER_AILINK, BleConfig.UUID_SERVER_BROADCAST_AILINK}; | |||
| return uuids; | |||
| } | |||
| /** | |||
| * 好营养AC05的设备 | |||
| * | |||
| * @return {@link BleScanAddAilinkBean} | |||
| */ | |||
| private static BleScanAddAilinkBean getAifresh() { | |||
| // 旧的营养秤 | |||
| BleScanAddAilinkBean bleScanAddAilinkBean = new BleScanAddAilinkBean(); | |||
| bleScanAddAilinkBean.setDeviceServiceUUID(new UUID[]{UuidUtils.getUuid("0000FFB0-0000-1000-8000-00805F9B34FB")}); | |||
| byte[] bytes = new byte[]{(byte) 0xAC, 0x05}; | |||
| bleScanAddAilinkBean.setDeviceBroadcast(bytes, 0, bytes.length); | |||
| bleScanAddAilinkBean.setCid(0x0037); | |||
| bleScanAddAilinkBean.setVid(0x0000); | |||
| bleScanAddAilinkBean.setPid(0x0000); | |||
| return bleScanAddAilinkBean; | |||
| } | |||
| /** | |||
| * 好身材AC02的体脂秤,带温度 | |||
| * | |||
| * @return {@link BleScanAddAilinkBean} | |||
| */ | |||
| private static BleScanAddAilinkBean getAifit02() { | |||
| // 旧的好身材 | |||
| BleScanAddAilinkBean bleScanAddAilinkBean = new BleScanAddAilinkBean(); | |||
| bleScanAddAilinkBean.setDeviceServiceUUID(new UUID[]{UuidUtils.getUuid("0000FFB0-0000-1000-8000-00805F9B34FB")}); | |||
| byte[] bytes = new byte[]{(byte) 0xAC, 0x02}; | |||
| bleScanAddAilinkBean.setDeviceBroadcast(bytes, 0, bytes.length); | |||
| bleScanAddAilinkBean.setCid(0x005E); | |||
| bleScanAddAilinkBean.setVid(0x0070); | |||
| bleScanAddAilinkBean.setPid(0x0001); | |||
| return bleScanAddAilinkBean; | |||
| } | |||
| /** | |||
| * 好身材AC03的体脂秤,带温度 | |||
| * | |||
| * @return {@link BleScanAddAilinkBean} | |||
| */ | |||
| private static BleScanAddAilinkBean getAifit03() { | |||
| // 旧的好身材 | |||
| BleScanAddAilinkBean bleScanAddAilinkBean = new BleScanAddAilinkBean(); | |||
| bleScanAddAilinkBean.setDeviceServiceUUID(new UUID[]{UuidUtils.getUuid("0000FFB0-0000-1000-8000-00805F9B34FB")}); | |||
| byte[] bytes = new byte[]{(byte) 0xAC, 0x03}; | |||
| bleScanAddAilinkBean.setDeviceBroadcast(bytes, 0, bytes.length); | |||
| bleScanAddAilinkBean.setCid(0x005E); | |||
| bleScanAddAilinkBean.setVid(0x0070); | |||
| bleScanAddAilinkBean.setPid(0x0001); | |||
| return bleScanAddAilinkBean; | |||
| } | |||
| private static BleScanAddAilinkBean getOkOk() { | |||
| // OKOK广播秤 | |||
| BleScanAddAilinkBean bleScanAddAilinkBean = new BleScanAddAilinkBean(); | |||
| bleScanAddAilinkBean.setDeviceServiceUUID(null); | |||
| byte[] bytes = new byte[]{(byte) 0x00, 0x00}; | |||
| bleScanAddAilinkBean.setDeviceBroadcast(bytes, 6, 6+bytes.length); | |||
| bleScanAddAilinkBean.setCid(0x08+0xFFFF); | |||
| bleScanAddAilinkBean.setVid(0x0001); | |||
| bleScanAddAilinkBean.setPid(0x0002); | |||
| return bleScanAddAilinkBean; | |||
| } | |||
| } | |||
| @@ -0,0 +1,46 @@ | |||
| package aicare.net.cn.sdk.ailinksdkdemoandroid.utils | |||
| import kotlinx.coroutines.CoroutineExceptionHandler | |||
| import kotlinx.coroutines.CoroutineScope | |||
| import kotlinx.coroutines.Dispatchers | |||
| import kotlinx.coroutines.Job | |||
| import kotlinx.coroutines.SupervisorJob | |||
| import kotlinx.coroutines.launch | |||
| import kotlin.coroutines.cancellation.CancellationException | |||
| object CoroutineUtils { | |||
| // 使用 SupervisorJob 确保单个协程失败不影响其他协程 | |||
| private val ioScope = CoroutineScope( | |||
| SupervisorJob() + | |||
| Dispatchers.IO + | |||
| CoroutineExceptionHandler { _, throwable -> | |||
| // 1. 打印详细堆栈 | |||
| throwable.printStackTrace() | |||
| } | |||
| ) | |||
| /** | |||
| * 在IO线程池执行协程任务,自动捕获并处理未捕获异常 | |||
| * | |||
| * @param block 要执行的协程代码块 | |||
| * @return 可用于取消任务的Job对象 | |||
| */ | |||
| fun coroutineScopeIo(block: suspend CoroutineScope.() -> Unit): Job { | |||
| return ioScope.launch { | |||
| try { | |||
| block() // 正确执行传入的代码块 | |||
| } catch (e: CancellationException) { | |||
| // 正常取消不处理 | |||
| throw e | |||
| } catch (e: Exception) { | |||
| // 此处捕获协程内部未处理的异常 | |||
| // 异常已由CoroutineExceptionHandler处理,此处可添加额外逻辑 | |||
| L.e( "内部捕获: ${e.message}") | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -1,175 +0,0 @@ | |||
| package aicare.net.cn.sdk.ailinksdkdemoandroid.utils; | |||
| import com.besthealth.bhBodyComposition120.BhBodyComposition; | |||
| import com.besthealth.bhBodyComposition120.BhErrorType; | |||
| import com.besthealth.bhBodyComposition120.BhSex; | |||
| import com.holtek.libHTBodyfat.HTBodyBasicInfo; | |||
| import com.holtek.libHTBodyfat.HTBodyResultAllBody; | |||
| import java.util.Locale; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.eight_bodyfat.EightBodyFatAdc; | |||
| public class EightBodyFatAlgorithms { | |||
| public EightBodyFatAlgorithms() { | |||
| } | |||
| private static class AlgorithmsHolder { | |||
| private static EightBodyFatAlgorithms algorithmsUnit = new EightBodyFatAlgorithms(); | |||
| } | |||
| public static EightBodyFatAlgorithms getInstance() { | |||
| return AlgorithmsHolder.algorithmsUnit; | |||
| } | |||
| public EightBodyFatBean getAlgorithmsData(int algorithms, int sex, int height, float weight_kg, int age, EightBodyFatAdc eightBodyfatAdc) { | |||
| EightBodyFatBean eightBodyFatBean = new EightBodyFatBean(); | |||
| switch (algorithms) { | |||
| case 0x20: | |||
| //实例化对象 | |||
| BhBodyComposition bhBodyComposition = new BhBodyComposition(); | |||
| //传入性别 | |||
| bhBodyComposition.bhSex = sex == 1 ? BhSex.MALE.ordinal() : BhSex.FEMALE.ordinal(); | |||
| //传入体重。单位是千克。其他单位需要自己转换 | |||
| bhBodyComposition.bhWeightKg = weight_kg; | |||
| //传入年龄 | |||
| bhBodyComposition.bhAge = age; | |||
| //传入身高 | |||
| bhBodyComposition.bhHeightCm = height; | |||
| //传入阻抗。阻抗值通过设备获取。加密数据 | |||
| //全身阻抗 | |||
| bhBodyComposition.bhZLeftBodyEnCode = eightBodyfatAdc.getAdcRightBody(); | |||
| //左手阻抗 | |||
| bhBodyComposition.bhZLeftArmEnCode = eightBodyfatAdc.getAdcLeftHand(); | |||
| //右手阻抗 | |||
| bhBodyComposition.bhZRightArmEnCode = eightBodyfatAdc.getAdcRightHand(); | |||
| //左脚阻抗 | |||
| bhBodyComposition.bhZLeftLegEnCode = eightBodyfatAdc.getAdcLeftFoot(); | |||
| //右脚阻抗 | |||
| bhBodyComposition.bhZRightLegEnCode = eightBodyfatAdc.getAdcRightFoot(); | |||
| //校验传入的值 | |||
| BhErrorType bhErrorType = BhErrorType.values()[bhBodyComposition.getBodyComposition()]; | |||
| if (bhErrorType == BhErrorType.NONE) { | |||
| eightBodyFatBean.setWeight(String.valueOf(bhBodyComposition.bhWeightKg)); | |||
| eightBodyFatBean.setBmi(Adecimal(bhBodyComposition.bhBMI)); | |||
| eightBodyFatBean.setBmr((float) bhBodyComposition.bhBMR); | |||
| eightBodyFatBean.setUvi((float) bhBodyComposition.bhVFAL); | |||
| eightBodyFatBean.setBm(String.valueOf(bhBodyComposition.bhBoneKg)); | |||
| eightBodyFatBean.setBfr(Adecimal(bhBodyComposition.bhBodyFatRate)); | |||
| eightBodyFatBean.setVwc(Adecimal(bhBodyComposition.bhWaterRate)); | |||
| eightBodyFatBean.setRom(Adecimal(bhBodyComposition.bhMuscleRate)); | |||
| eightBodyFatBean.setBodyAge(bhBodyComposition.bhBodyAge); | |||
| eightBodyFatBean.setPp(Adecimal(bhBodyComposition.bhProteinRate)); | |||
| eightBodyFatBean.setSfr(Adecimal(bhBodyComposition.bhBodyFatSubCutRate)); | |||
| eightBodyFatBean.setFatMassBody(String.valueOf(bhBodyComposition.bhBodyFatKgTrunk)); | |||
| eightBodyFatBean.setFatMassLeftTop(String.valueOf(bhBodyComposition.bhBodyFatKgLeftArm)); | |||
| eightBodyFatBean.setFatMassLeftBottom(String.valueOf(bhBodyComposition.bhBodyFatKgLeftLeg)); | |||
| eightBodyFatBean.setFatMassRightTop(String.valueOf(bhBodyComposition.bhBodyFatKgRightArm)); | |||
| eightBodyFatBean.setFatMassRightBottom(String.valueOf(bhBodyComposition.bhBodyFatKgRightLeg)); | |||
| eightBodyFatBean.setArithmetic(algorithms); | |||
| eightBodyFatBean.setBhSkeletalMuscleKg(String.valueOf(bhBodyComposition.bhSkeletalMuscleKg)); | |||
| eightBodyFatBean.setBhSkeletalMuscleKgLevel(String.valueOf(bhBodyComposition.bhSkeletalMuscleKgLevel)); | |||
| eightBodyFatBean.setBhSkeletalMuscleKgListStandardOrExcellent(String.valueOf(bhBodyComposition.bhMuscleKgListStandardOrExcellent)); | |||
| eightBodyFatBean.setBhSkeletalMuscleKgListUnderOrStandard(String.valueOf(bhBodyComposition.bhSkeletalMuscleKgListUnderOrStandard)); | |||
| // System.out.println("解密阻抗-左側全身(Ω)=" + body.bhZLeftBodyDeCode); | |||
| // System.out.println("解密阻抗-左手(Ω)=" + body.bhZLeftArmDeCode); | |||
| // System.out.println("解密阻抗-右手(Ω)=" + body.bhZRightArmDeCode); | |||
| // System.out.println("解密阻抗-左腳(Ω)=" + body.bhZLeftLegDeCode); | |||
| // System.out.println("解密阻抗-右腳(Ω)=" + body.bhZRightLegDeCode); | |||
| eightBodyFatBean.setAdcLeftHand(bhBodyComposition.bhZLeftArmDeCode); | |||
| eightBodyFatBean.setAdcRightHand(bhBodyComposition.bhZRightArmDeCode); | |||
| eightBodyFatBean.setAdcLeftFoot(bhBodyComposition.bhZLeftLegDeCode); | |||
| eightBodyFatBean.setAdcRightFoot(bhBodyComposition.bhZRightLegDeCode); | |||
| eightBodyFatBean.setAdcLeftBody(bhBodyComposition.bhZLeftBodyDeCode); | |||
| } else { | |||
| L.e("getAlgorithmsData: " + bhErrorType.toString()); | |||
| } | |||
| break; | |||
| case 1: | |||
| default: | |||
| HTBodyBasicInfo basicInfo = new HTBodyBasicInfo(sex, height, weight_kg, age); | |||
| basicInfo.htZAllBodyImpedance = eightBodyfatAdc.getAdcRightBody(); | |||
| basicInfo.htZLeftLegImpedance = eightBodyfatAdc.getAdcLeftFoot(); | |||
| basicInfo.htZRightLegImpedance = eightBodyfatAdc.getAdcRightFoot(); | |||
| basicInfo.htZLeftArmImpedance = eightBodyfatAdc.getAdcLeftHand(); | |||
| basicInfo.htZRightArmImpedance = eightBodyfatAdc.getAdcRightHand(); | |||
| basicInfo.htTwoLegsImpedance = eightBodyfatAdc.getAdcFoot(); | |||
| basicInfo.htTwoArmsImpedance = eightBodyfatAdc.getAdcHand(); | |||
| HTBodyResultAllBody resultTwoLegs = new HTBodyResultAllBody(); | |||
| int errorType = resultTwoLegs.getBodyfatWithBasicInfo(basicInfo); | |||
| if (errorType == HTBodyBasicInfo.ErrorNone) { | |||
| eightBodyFatBean.setBmi(Adecimal(resultTwoLegs.htBMI)); | |||
| eightBodyFatBean.setBmr((float) resultTwoLegs.htBMR); | |||
| eightBodyFatBean.setUvi((float) resultTwoLegs.htVFAL); | |||
| eightBodyFatBean.setBm(String.valueOf((float) resultTwoLegs.htBoneKg)); | |||
| eightBodyFatBean.setBfr(Adecimal(resultTwoLegs.htBodyfatPercentage)); | |||
| eightBodyFatBean.setVwc(Adecimal(resultTwoLegs.htWaterPercentage)); | |||
| eightBodyFatBean.setRom(Adecimal(resultTwoLegs.htMusclePercentage)); | |||
| eightBodyFatBean.setBodyAge(resultTwoLegs.htBodyAge); | |||
| eightBodyFatBean.setPp(Adecimal(resultTwoLegs.htProteinPercentage)); | |||
| eightBodyFatBean.setSfr(Adecimal(resultTwoLegs.htBodyfatSubcut)); | |||
| eightBodyFatBean.setFatMassBody(String.valueOf(resultTwoLegs.htBodyfatKgTrunk)); | |||
| eightBodyFatBean.setFatMassLeftTop(String.valueOf(resultTwoLegs.htBodyfatKgLeftArm)); | |||
| eightBodyFatBean.setFatMassLeftBottom(String.valueOf(resultTwoLegs.htBodyfatKgLeftLeg)); | |||
| eightBodyFatBean.setFatMassRightTop(String.valueOf(resultTwoLegs.htBodyfatKgRightArm)); | |||
| eightBodyFatBean.setFatMassRightBottom(String.valueOf(resultTwoLegs.htBodyfatKgRightLeg)); | |||
| // eightBodyFatBean.setFatMass(resultTwoLegs.htBodyfatKg); | |||
| eightBodyFatBean.setMuscleMassBody(String.valueOf(resultTwoLegs.htMuscleKgTrunk)); | |||
| eightBodyFatBean.setMuscleMassLeftTop(String.valueOf(resultTwoLegs.htMuscleKgLeftArm)); | |||
| eightBodyFatBean.setMuscleMassLeftBottom(String.valueOf(resultTwoLegs.htMuscleKgLeftLeg)); | |||
| eightBodyFatBean.setMuscleMassRightTop(String.valueOf(resultTwoLegs.htMuscleKgRightArm)); | |||
| eightBodyFatBean.setMuscleMassRightBottom(String.valueOf(resultTwoLegs.htMuscleKgRightLeg)); | |||
| // eightBodyFatBean.setMusleMass(resultTwoLegs.htMuscleKg); | |||
| // eightBodyFatBean.setStandardWeight(resultTwoLegs.htIdealWeightKg); | |||
| // eightBodyFatBean.setWeightWithoutFat(resultTwoLegs.htBodyfatFreeMass); | |||
| // eightBodyFatBean.setWeightControl((weight_kg - resultTwoLegs.htIdealWeightKg)); | |||
| // eightBodyFatBean.setFatLevel(HealthyStatusUtil.ObesitylevelsStatus(weight_kg, (float) resultTwoLegs.htIdealWeightKg)); | |||
| // double muscle = (resultTwoLegs.htMuscleKgLeftArm + resultTwoLegs.htMuscleKgLeftLeg + resultTwoLegs.htMuscleKgRightArm + resultTwoLegs.htMuscleKgRightLeg); | |||
| // eightBodyFatBean.setMusleMassLimbs(Adecimal(muscle / (height * height) * 10000)); | |||
| eightBodyFatBean.setAdcFoot((resultTwoLegs.htZLeftLeg + resultTwoLegs.htZRightLeg)); | |||
| eightBodyFatBean.setAdcHand((resultTwoLegs.htZLeftArm + resultTwoLegs.htZRightArm)); | |||
| eightBodyFatBean.setAdcLeftHand(resultTwoLegs.htZLeftArm); | |||
| eightBodyFatBean.setAdcRightHand(resultTwoLegs.htZRightArm); | |||
| eightBodyFatBean.setAdcLeftFoot(resultTwoLegs.htZLeftLeg); | |||
| eightBodyFatBean.setAdcRightFoot(resultTwoLegs.htZRightLeg); | |||
| eightBodyFatBean.setAdcLeftBody(resultTwoLegs.htZAllBody); | |||
| eightBodyFatBean.setAdcRightBody(resultTwoLegs.htZAllBody); | |||
| eightBodyFatBean.setAdcRightHandLeftFoot((resultTwoLegs.htZRightArm + resultTwoLegs.htZLeftLeg)); | |||
| eightBodyFatBean.setAdcLeftHandRightFoot((resultTwoLegs.htZLeftArm + resultTwoLegs.htZRightLeg)); | |||
| eightBodyFatBean.setAdcBody(resultTwoLegs.htZAllBody); | |||
| } | |||
| } | |||
| return eightBodyFatBean; | |||
| } | |||
| private float Adecimal(double data) { | |||
| return Float.parseFloat(String.format(Locale.US, "%.1f", data)); | |||
| } | |||
| } | |||
| @@ -0,0 +1,102 @@ | |||
| package aicare.net.cn.sdk.ailinksdkdemoandroid.utils | |||
| import java.nio.ByteBuffer | |||
| import java.nio.ByteOrder | |||
| import kotlin.also | |||
| import kotlin.collections.copyOfRange | |||
| import kotlin.collections.joinToString | |||
| import kotlin.text.format | |||
| import kotlin.text.substring | |||
| import kotlin.text.toInt | |||
| /** | |||
| * @author suzy | |||
| * @date 2025/2/17 12:09 | |||
| **/ | |||
| fun Long.toByteArray(): ByteArray { | |||
| val buffer = ByteBuffer.allocate(8) // `Long` 类型占用 8 字节 | |||
| buffer.order(ByteOrder.BIG_ENDIAN) // 设置大端序 | |||
| buffer.putLong(this) // 将 `Long` 类型的时间戳放入缓冲区 | |||
| val byteArray = buffer.array() | |||
| // 获取前 4 字节,即将 8 字节的时间戳截取成 4 字节(大端序) | |||
| return byteArray.copyOfRange(4, byteArray.size) | |||
| } | |||
| fun ByteArray.toHexString(separator: String = ", "): String { | |||
| return this.joinToString(separator) { "%02X".format(it) } | |||
| } | |||
| fun ByteArray.formatMac() = toHexString(":") | |||
| fun String.parseMacToByteArray(): ByteArray { | |||
| // 预编译正则表达式(提升性能) | |||
| require(Regex("^([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}$").matches(this)) { | |||
| "Invalid MAC format: must match 'XX:XX:XX:XX:XX:XX'" | |||
| } | |||
| return ByteArray(6).also { bytes -> | |||
| var index = 0 | |||
| var pos = 0 | |||
| while (index < 6) { | |||
| bytes[index++] = substring(pos, pos + 2).toInt(16).toByte() | |||
| pos += 3 // 跳过':'分隔符 | |||
| } | |||
| } | |||
| } | |||
| fun ByteArray.toLong(): Long { | |||
| require(this.size == 4) { "ByteArray must be exactly 4 bytes long" } | |||
| val buffer = ByteBuffer.wrap(this) | |||
| buffer.order(ByteOrder.BIG_ENDIAN) | |||
| return buffer.int.toLong() | |||
| } | |||
| fun ByteArray.toAltitudeInt(): Int { | |||
| require(this.size == 2) { "Input must be 2 bytes" } | |||
| val value = ((this[0].toInt() and 0xFF) shl 8) or (this[1].toInt() and 0xFF) | |||
| val isNegative = (value and 0x8000) != 0 | |||
| val absValue = value and 0x7FFF // 取低 15 位 | |||
| return if (isNegative) -absValue else absValue | |||
| } | |||
| fun Int.toByteArray(): ByteArray { | |||
| val buffer = ByteBuffer.allocate(2) | |||
| buffer.order(ByteOrder.BIG_ENDIAN) // 使用大端序 | |||
| buffer.putShort(this.toShort()) // 将 Int 转换为 short 类型(2 字节) | |||
| return buffer.array() | |||
| } | |||
| fun Int.toAltitudeBytes(): ByteArray { | |||
| val altitude = this | |||
| require(altitude in -32767..32767) { "Altitude must be in [-32767, 32767]" } | |||
| val isNegative = altitude < 0 | |||
| val absValue = if (isNegative) -altitude else altitude | |||
| // 构造 16 位数值(bit15=符号位,bit0~14=数值) | |||
| val value = if (isNegative) absValue or 0x8000 else absValue | |||
| // 转换为大端序 2 字节 | |||
| return byteArrayOf( | |||
| (value shr 8).toByte(), // 高字节 | |||
| value.toByte() // 低字节 | |||
| ) | |||
| } | |||
| fun ByteArray.toInt(): Int { | |||
| require(this.size == 2) { "ByteArray must be of size 2" } // 检查数组长度 | |||
| val buffer = ByteBuffer.wrap(this) | |||
| buffer.order(ByteOrder.BIG_ENDIAN) // 使用大端序 | |||
| val unsignedShort = buffer.short.toInt() and 0xFFFF | |||
| return unsignedShort // 将 short 转换为 int | |||
| } | |||
| fun Byte.toUnsignedInt(): Int = this.toInt() and 0xFF | |||
| @@ -1,18 +1,108 @@ | |||
| package aicare.net.cn.sdk.ailinksdkdemoandroid.utils; | |||
| import android.text.TextUtils; | |||
| import java.math.RoundingMode; | |||
| import java.text.DecimalFormat; | |||
| import java.util.Locale; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.config.UserUnitConfig; | |||
| /** | |||
| * xing<br> | |||
| * 2019/4/29<br> | |||
| * 单位转换工具类 | |||
| */ | |||
| public class UnitUtils { | |||
| public final static String NO_DATA = "-1"; | |||
| public final static String LB_SPLIT = ":"; | |||
| //-------------重量------------ | |||
| /** | |||
| * 服务器返回(数据库读取) | |||
| * | |||
| * @param unit 当前的单位 | |||
| * @param data 数据,已转换为当前单位的数据 | |||
| * @param decimal 小数位 | |||
| * @return 返回指定单位显示 | |||
| */ | |||
| public static String getWeightToKg(int unit, String data, int decimal) { | |||
| float weight = -1f; | |||
| float g; | |||
| float oz; | |||
| if (TextUtils.isEmpty(data) || NO_DATA.equalsIgnoreCase(data)) { | |||
| return NO_DATA; | |||
| } | |||
| if (unit == UserUnitConfig.USER_UNIT_KG) {//单位相同直接返回 | |||
| weight = Float.parseFloat(String.format(Locale.US, data)); | |||
| } | |||
| switch (unit) { | |||
| case UserUnitConfig.USER_UNIT_FG: | |||
| weight = UnitUtils.fgToKG(Float.parseFloat(data)); | |||
| break; | |||
| case UserUnitConfig.USER_UNIT_OZ: | |||
| g = UnitUtils.ozToG(Float.parseFloat(data)); | |||
| weight = UnitUtils.gToKG(g); | |||
| break; | |||
| case UserUnitConfig.USER_UNIT_LB: | |||
| oz = getWeightLbToOz(data); | |||
| g = UnitUtils.ozToG(oz); | |||
| weight = UnitUtils.gToKG(g); | |||
| break; | |||
| case UserUnitConfig.USER_UNIT_G: | |||
| weight = UnitUtils.gToKG(Float.parseFloat(data)); | |||
| break; | |||
| case UserUnitConfig.USER_UNIT_LB_LB: | |||
| oz = UnitUtils.lbToOz(Float.parseFloat(data)); | |||
| g = UnitUtils.ozToG(oz); | |||
| weight = UnitUtils.gToKG(g); | |||
| break; | |||
| case UserUnitConfig.USER_UNIT_ST: | |||
| String[] weightStlb = null; | |||
| if (data.contains(":")) { | |||
| weightStlb = data.split(":"); | |||
| } | |||
| if (weightStlb != null && weightStlb.length >= 2) { | |||
| if (weightStlb[0].contains("-")) { | |||
| oz = UnitUtils.lbToOz(UnitUtils.stToLb(Float.parseFloat(weightStlb[0])) - Math.abs(Float.parseFloat(weightStlb[1]))); | |||
| } else { | |||
| oz = UnitUtils.lbToOz(UnitUtils.stToLb(Float.parseFloat(weightStlb[0])) + Math.abs(Float.parseFloat(weightStlb[1]))); | |||
| } | |||
| g = UnitUtils.ozToG(oz); | |||
| weight = UnitUtils.gToKG(g); | |||
| } | |||
| break; | |||
| } | |||
| return getHoldDecimal(decimal, weight); | |||
| } | |||
| /** | |||
| * lb:oz转Oz | |||
| */ | |||
| private static float getWeightLbToOz(String lbStr) { | |||
| float lb = 0; | |||
| float oz = 0; | |||
| if (lbStr.contains(LB_SPLIT)) { | |||
| String[] lbOzS = lbStr.split(LB_SPLIT); | |||
| lb = Float.parseFloat(lbOzS[0]); | |||
| oz = Float.parseFloat(lbOzS[1]); | |||
| } else { | |||
| lb = Float.parseFloat(lbStr); | |||
| } | |||
| float ozSize = UnitUtils.lbToOz(lb) + oz; | |||
| return ozSize; | |||
| } | |||
| /** | |||
| * st转lb | |||
| */ | |||
| @@ -1,8 +1,8 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | |||
| <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||
| android:layout_width="match_parent" | |||
| android:layout_height="match_parent" | |||
| android:orientation="vertical"> | |||
| android:layout_width="match_parent" | |||
| android:layout_height="match_parent" | |||
| android:orientation="vertical"> | |||
| <ScrollView | |||
| android:layout_width="match_parent" | |||
| @@ -23,7 +23,7 @@ | |||
| <Button | |||
| android:id="@+id/user" | |||
| android:id="@+id/btnUser" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="用户" | |||
| @@ -164,6 +164,11 @@ | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="读SN" /> | |||
| <Button | |||
| android:id="@+id/btnGetVersion46" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="读版本(0x46)" /> | |||
| </LinearLayout> | |||
| @@ -0,0 +1,172 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | |||
| <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||
| android:layout_width="match_parent" | |||
| android:layout_height="match_parent" | |||
| android:focusable="true" | |||
| android:focusableInTouchMode="true" | |||
| android:orientation="vertical"> | |||
| <ScrollView | |||
| android:layout_width="match_parent" | |||
| android:layout_height="0dp" | |||
| android:layout_weight="1"> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content" | |||
| android:orientation="vertical"> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content" | |||
| android:padding="2dp"> | |||
| <Button | |||
| android:id="@+id/btnPause" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="暂停刷新" /> | |||
| <Button | |||
| android:id="@+id/btnContinue" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="继续刷新" /> | |||
| <Button | |||
| android:id="@+id/btnClear" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="清除log" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content" | |||
| android:padding="2dp"> | |||
| <Button | |||
| android:id="@+id/btnWakeup" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="唤醒" /> | |||
| <Button | |||
| android:id="@+id/btnTest" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="测量" /> | |||
| <Button | |||
| android:id="@+id/btnStopTest" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="停止测量" /> | |||
| <Button | |||
| android:id="@+id/btnReset" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="重置" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content" | |||
| android:padding="2dp"> | |||
| <EditText | |||
| android:id="@+id/etEmissivity" | |||
| android:layout_width="100dp" | |||
| android:layout_height="wrap_content" | |||
| android:digits="0123456789." | |||
| android:hint="发射率(0.10~1.00)" | |||
| android:textSize="12dp" /> | |||
| <Button | |||
| android:id="@+id/btnEmissivity" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="发射率" /> | |||
| <EditText | |||
| android:id="@+id/etAutoShutdown" | |||
| android:layout_width="100dp" | |||
| android:layout_height="wrap_content" | |||
| android:digits="0123456789" | |||
| android:hint="自动关机(S)" | |||
| android:textSize="12dp" /> | |||
| <Button | |||
| android:id="@+id/btnAutoShutdown" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="自动关机" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content" | |||
| android:padding="2dp"> | |||
| <EditText | |||
| android:id="@+id/etHighTemp" | |||
| android:layout_width="100dp" | |||
| android:layout_height="wrap_content" | |||
| android:hint="高温(℃)" | |||
| android:textSize="12dp" /> | |||
| <EditText | |||
| android:id="@+id/etLowTemp" | |||
| android:layout_width="100dp" | |||
| android:layout_height="wrap_content" | |||
| android:hint="低温(℃)" | |||
| android:textSize="12dp" /> | |||
| <Button | |||
| android:id="@+id/btnHighOrLowTemp" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="发送高低温" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content" | |||
| android:padding="2dp"> | |||
| <Button | |||
| android:id="@+id/btnGetDeviceStatus" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="获取设备信息" /> | |||
| <Button | |||
| android:id="@+id/btnGetDeviceParameter" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="获取设备参数" /> | |||
| </LinearLayout> | |||
| </LinearLayout> | |||
| </ScrollView> | |||
| <ListView | |||
| android:id="@+id/listview" | |||
| android:layout_width="match_parent" | |||
| android:layout_height="0dp" | |||
| android:layout_weight="2" | |||
| android:padding="10dp" | |||
| android:stackFromBottom="true" | |||
| android:transcriptMode="alwaysScroll"> | |||
| </ListView> | |||
| </LinearLayout> | |||
| @@ -0,0 +1,197 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | |||
| <androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android" | |||
| android:layout_width="match_parent" | |||
| android:layout_height="match_parent" | |||
| android:orientation="vertical"> | |||
| <androidx.appcompat.widget.LinearLayoutCompat | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content" | |||
| android:orientation="horizontal" | |||
| android:padding="5dp"> | |||
| <TextView | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="设备MAC:" /> | |||
| <TextView | |||
| android:id="@+id/tvMac" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="00:00:00:00:00:00" /> | |||
| <Button | |||
| android:id="@+id/btnConnect" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:layout_marginStart="10dp" | |||
| android:text="连接" /> | |||
| <Button | |||
| android:id="@+id/btnDisconnect" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="断连" /> | |||
| </androidx.appcompat.widget.LinearLayoutCompat> | |||
| <androidx.appcompat.widget.LinearLayoutCompat | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content" | |||
| android:orientation="horizontal"> | |||
| <Button | |||
| android:id="@+id/btnClear" | |||
| android:layout_width="60dp" | |||
| android:layout_height="wrap_content" | |||
| android:text="清空" /> | |||
| <Button | |||
| android:id="@+id/btnGetVersion" | |||
| android:layout_width="70dp" | |||
| android:layout_height="wrap_content" | |||
| android:text="版本号" /> | |||
| <Button | |||
| android:id="@+id/btnGetDeviceStatus" | |||
| android:layout_width="85dp" | |||
| android:layout_height="wrap_content" | |||
| android:text="设备状态" /> | |||
| <Spinner | |||
| android:id="@+id/spEncoding" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:entries="@array/spinner_encoding_format" /> | |||
| </androidx.appcompat.widget.LinearLayoutCompat> | |||
| <androidx.appcompat.widget.LinearLayoutCompat | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content" | |||
| android:orientation="horizontal"> | |||
| <TextView | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="打字速度设置(us):" /> | |||
| <EditText | |||
| android:id="@+id/etSpeedUs" | |||
| android:layout_width="0dp" | |||
| android:layout_height="wrap_content" | |||
| android:layout_weight="1" | |||
| android:digits="0123456789" | |||
| android:inputType="number" | |||
| android:text="100" /> | |||
| <Button | |||
| android:id="@+id/btnSendSpeed" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="设置" /> | |||
| </androidx.appcompat.widget.LinearLayoutCompat> | |||
| <androidx.appcompat.widget.LinearLayoutCompat | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content" | |||
| android:orientation="horizontal"> | |||
| <EditText | |||
| android:id="@+id/etData" | |||
| android:layout_width="0dp" | |||
| android:layout_height="wrap_content" | |||
| android:layout_weight="1" | |||
| android:maxHeight="500dp" /> | |||
| <Button | |||
| android:id="@+id/btnSendData" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="发送数据" /> | |||
| </androidx.appcompat.widget.LinearLayoutCompat> | |||
| <androidx.appcompat.widget.LinearLayoutCompat | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <TextView | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="次数:" /> | |||
| <EditText | |||
| android:id="@+id/etCount" | |||
| android:layout_width="80dp" | |||
| android:layout_height="wrap_content" | |||
| android:digits="0123456789" | |||
| android:inputType="number" | |||
| android:text="1000" /> | |||
| <TextView | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="间隔(ms):" /> | |||
| <EditText | |||
| android:id="@+id/etIntervalMs" | |||
| android:layout_width="80dp" | |||
| android:layout_height="wrap_content" | |||
| android:digits="0123456789" | |||
| android:inputType="number" | |||
| android:text="1000" /> | |||
| <TextView | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="已发送:" /> | |||
| <TextView | |||
| android:id="@+id/tvSendCount" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="0" /> | |||
| </androidx.appcompat.widget.LinearLayoutCompat> | |||
| <androidx.appcompat.widget.LinearLayoutCompat | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btnLoopSend" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="循环发送" /> | |||
| <Button | |||
| android:id="@+id/btnStopSend" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="停止发送" /> | |||
| <Button | |||
| android:id="@+id/btnResetCount" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="重置已发送" /> | |||
| </androidx.appcompat.widget.LinearLayoutCompat> | |||
| <ListView | |||
| android:id="@+id/listview" | |||
| android:layout_width="match_parent" | |||
| android:layout_height="0dp" | |||
| android:layout_weight="2" | |||
| android:minHeight="100dp" | |||
| android:padding="10dp"> | |||
| </ListView> | |||
| </androidx.appcompat.widget.LinearLayoutCompat> | |||
| @@ -0,0 +1,195 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | |||
| <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||
| android:layout_width="match_parent" | |||
| android:layout_height="match_parent" | |||
| android:orientation="vertical"> | |||
| <ScrollView | |||
| android:layout_width="match_parent" | |||
| android:layout_height="0dp" | |||
| android:layout_weight="1"> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content" | |||
| android:orientation="vertical"> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content" | |||
| android:paddingStart="10dp" | |||
| android:paddingEnd="10dp"> | |||
| <EditText | |||
| android:id="@+id/et_uuid" | |||
| android:layout_width="180dp" | |||
| android:layout_height="wrap_content" | |||
| android:hint="uuid" | |||
| android:lines="1" | |||
| android:text="0000FFE1" /> | |||
| <Button | |||
| android:id="@+id/btn_uuid" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="特征设置" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content" | |||
| android:paddingStart="10dp" | |||
| android:paddingEnd="10dp"> | |||
| <EditText | |||
| android:id="@+id/et_uuid_server" | |||
| android:layout_width="180dp" | |||
| android:layout_height="wrap_content" | |||
| android:hint="uuid_server" | |||
| android:maxLines="1" | |||
| android:text="0000FFE0" /> | |||
| <Button | |||
| android:id="@+id/btn_uuid_server" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="服务设置" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content" | |||
| android:paddingStart="10dp" | |||
| android:paddingEnd="10dp"> | |||
| <EditText | |||
| android:id="@+id/et_notify" | |||
| android:layout_width="180dp" | |||
| android:layout_height="wrap_content" | |||
| android:hint="uuid_notify" | |||
| android:maxLines="1" | |||
| android:text="0000FFE2" /> | |||
| <Button | |||
| android:id="@+id/btn_notify" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="Notify" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btnSelectFile" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="选择文件" /> | |||
| <TextView | |||
| android:id="@+id/tv_file_name" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btnWriteTest" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="开始写测试" /> | |||
| <Button | |||
| android:id="@+id/btnReadTest" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="开始读测试" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content" | |||
| android:orientation="vertical" | |||
| > | |||
| <TextView | |||
| android:id="@+id/tvSpeedWrite" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="0 kb/s" /> | |||
| <TextView | |||
| android:id="@+id/tvSpeedRead" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="0 kb/s" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content" | |||
| android:paddingStart="10dp" | |||
| android:paddingEnd="10dp"> | |||
| <TextView | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="接收(B):" | |||
| android:textSize="18dp" /> | |||
| <TextView | |||
| android:id="@+id/tv_receive_number" | |||
| android:layout_width="0dp" | |||
| android:layout_height="wrap_content" | |||
| android:layout_weight="1" | |||
| android:text="0" | |||
| android:textSize="18dp" /> | |||
| <TextView | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="发送(B):" | |||
| android:textSize="18dp" /> | |||
| <TextView | |||
| android:id="@+id/tv_send_number" | |||
| android:layout_width="0dp" | |||
| android:layout_height="wrap_content" | |||
| android:layout_weight="1" | |||
| android:text="0" | |||
| android:textSize="18dp" /> | |||
| </LinearLayout> | |||
| </LinearLayout> | |||
| </ScrollView> | |||
| <ListView | |||
| android:id="@+id/listview" | |||
| android:layout_width="match_parent" | |||
| android:layout_height="0dp" | |||
| android:layout_weight="1" | |||
| android:padding="10dp" | |||
| android:stackFromBottom="true" | |||
| android:transcriptMode="alwaysScroll"> | |||
| </ListView> | |||
| </LinearLayout> | |||
| @@ -28,7 +28,7 @@ | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/support_unit" | |||
| android:id="@+id/getSupportUnit" | |||
| android:text="查询支持单位" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| @@ -17,10 +17,11 @@ | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content" | |||
| android:orientation="horizontal" | |||
| android:layout_marginStart="10dp" | |||
| android:layout_marginTop="10dp" | |||
| android:gravity="center_vertical"> | |||
| android:gravity="center_vertical" | |||
| android:orientation="horizontal"> | |||
| <TextView | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| @@ -30,8 +31,8 @@ | |||
| android:id="@+id/tv_broadcast_mac_weight" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="" | |||
| android:layout_marginStart="5dp" /> | |||
| android:layout_marginStart="5dp" | |||
| android:text="" /> | |||
| </LinearLayout> | |||
| @@ -88,11 +89,11 @@ | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content" | |||
| android:orientation="horizontal" | |||
| android:layout_marginStart="10dp" | |||
| android:layout_marginTop="10dp" | |||
| android:gravity="center_vertical" | |||
| > | |||
| android:orientation="horizontal"> | |||
| <TextView | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| @@ -104,24 +105,19 @@ | |||
| android:id="@+id/tv_broadcast_temp_weight" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="--℃" | |||
| android:layout_marginStart="5dp" | |||
| /> | |||
| android:text="--℃" /> | |||
| <TextView | |||
| android:id="@+id/tv_broadcast_did_weight" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="" | |||
| android:layout_marginStart="20dp" | |||
| /> | |||
| android:text="" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content" | |||
| @@ -160,8 +156,7 @@ | |||
| android:layout_height="0dp" | |||
| android:layout_weight="1" | |||
| android:padding="10dp" | |||
| android:stackFromBottom="true" | |||
| android:transcriptMode="alwaysScroll"> | |||
| > | |||
| </ListView> | |||
| @@ -17,9 +17,9 @@ | |||
| android:layout_width="0dp" | |||
| android:layout_height="wrap_content" | |||
| android:layout_weight="1" | |||
| android:hint="请输入需要连接的设备MAC地址" | |||
| android:hint="请输入需要连接MAC地址(16进制)" | |||
| android:paddingStart="20dp" | |||
| android:inputType="textCapCharacters" | |||
| android:inputType="text" | |||
| android:digits="0123456789abcdefABCDEF:" | |||
| android:maxLength="17" | |||
| android:textSize="14dp" /> | |||
| @@ -76,19 +76,19 @@ | |||
| <EditText | |||
| android:id="@+id/etCheckTime" | |||
| android:layout_width="0dp" | |||
| android:layout_height="wrap_content" | |||
| android:layout_height="50dp" | |||
| android:layout_weight="1" | |||
| android:hint="检测间隔时间(分)" | |||
| android:paddingStart="20dp" | |||
| android:hint="检测间隔(分钟)" | |||
| android:inputType="number" | |||
| android:maxLength="3" | |||
| android:textSize="14dp" /> | |||
| android:textSize="10dp" /> | |||
| <CheckBox | |||
| android:id="@+id/cbCheckTime" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:checked="true" | |||
| android:textSize="10dp" | |||
| android:text="开启/关闭测量"/> | |||
| <Button | |||
| @@ -97,6 +97,12 @@ | |||
| android:layout_height="match_parent" | |||
| android:text="设置检测间隔时间" /> | |||
| <Button | |||
| android:id="@+id/btnQueryTheme" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="match_parent" | |||
| android:text="查询主题" /> | |||
| </androidx.appcompat.widget.LinearLayoutCompat> | |||
| <androidx.appcompat.widget.LinearLayoutCompat | |||
| @@ -120,10 +126,59 @@ | |||
| android:id="@+id/btnSetBleName" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="match_parent" | |||
| android:text="设置检测间隔时间" /> | |||
| android:text="设置蓝牙名称" /> | |||
| <EditText | |||
| android:id="@+id/etThemeNum" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="match_parent" | |||
| android:hint="主题编号" | |||
| android:inputType="number" | |||
| android:textSize="14dp" /> | |||
| <Button | |||
| android:id="@+id/btnSetThemeNum" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="match_parent" | |||
| android:text="设置主题" /> | |||
| </androidx.appcompat.widget.LinearLayoutCompat> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content" | |||
| android:minHeight="50dp" | |||
| android:orientation="horizontal"> | |||
| <EditText | |||
| android:id="@+id/etHisTime" | |||
| android:layout_width="0dp" | |||
| android:layout_height="wrap_content" | |||
| android:layout_weight="1" | |||
| android:hint="设置历史上传间隔(分钟)" | |||
| android:paddingStart="20dp" | |||
| android:inputType="textCapCharacters" | |||
| android:digits="0123456789" | |||
| android:maxLength="5" | |||
| android:textSize="10dp" /> | |||
| <CheckBox | |||
| android:id="@+id/cbHisTime" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:checked="true" | |||
| android:textSize="10dp" | |||
| android:text="开启/关闭历史定时上传"/> | |||
| <Button | |||
| android:id="@+id/btnHisTime" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="match_parent" | |||
| android:text="设置历史上传间隔" | |||
| android:textSize="12dp"/> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content" | |||
| @@ -324,6 +379,33 @@ | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content" | |||
| android:layout_marginStart="10dp" | |||
| android:orientation="horizontal"> | |||
| <Button | |||
| android:id="@+id/btnQueryVersion" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="match_parent" | |||
| android:text="查询版本号" /> | |||
| <Button | |||
| android:id="@+id/btnSetBind" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="match_parent" | |||
| android:text="进入绑定模式" /> | |||
| <Button | |||
| android:id="@+id/btnQueryHardware" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="match_parent" | |||
| android:text="查询硬件状态" /> | |||
| </LinearLayout> | |||
| <ListView | |||
| android:id="@+id/log_list" | |||
| android:layout_width="match_parent" | |||
| @@ -51,7 +51,7 @@ | |||
| android:text="过滤:true" /> | |||
| <Button | |||
| android:id="@+id/跳过" | |||
| android:id="@+id/btnJump" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="跳过" /> | |||
| @@ -138,11 +138,26 @@ | |||
| </LinearLayout> | |||
| <Button | |||
| android:id="@+id/support_unit" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="查询支持单位" /> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:orientation="horizontal" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/getSupportUnit" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="查询支持单位" /> | |||
| <Button | |||
| android:id="@+id/btnConnect" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="连接" /> | |||
| </LinearLayout> | |||
| <ListView | |||
| android:id="@+id/log_list" | |||
| @@ -40,7 +40,6 @@ | |||
| android:text="lb" /> | |||
| </RadioGroup> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content" | |||
| @@ -49,11 +48,12 @@ | |||
| <TextView | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="年龄:" /> | |||
| android:text="年龄:" | |||
| android:textSize="12dp" /> | |||
| <EditText | |||
| android:id="@+id/et_age" | |||
| android:layout_width="100dp" | |||
| android:layout_width="80dp" | |||
| android:layout_height="wrap_content" | |||
| android:inputType="number" | |||
| android:text="34" /> | |||
| @@ -61,11 +61,12 @@ | |||
| <TextView | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="性别(女=0,男=1):" /> | |||
| android:text="性别(女=0,男=1):" | |||
| android:textSize="12dp" /> | |||
| <EditText | |||
| android:id="@+id/et_sex" | |||
| android:layout_width="100dp" | |||
| android:layout_width="80dp" | |||
| android:layout_height="wrap_content" | |||
| android:inputType="number" | |||
| android:text="1" /> | |||
| @@ -81,11 +82,12 @@ | |||
| <TextView | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="身高(CM):" /> | |||
| android:text="身高(CM):" | |||
| android:textSize="12dp" /> | |||
| <EditText | |||
| android:id="@+id/et_height" | |||
| android:layout_width="100dp" | |||
| android:layout_width="80dp" | |||
| android:layout_height="wrap_content" | |||
| android:inputType="number" | |||
| android:text="178" /> | |||
| @@ -93,15 +95,23 @@ | |||
| <TextView | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="体重(kg):" /> | |||
| android:text="体重(kg):" | |||
| android:textSize="12dp" /> | |||
| <EditText | |||
| android:id="@+id/et_weight" | |||
| android:layout_width="100dp" | |||
| android:layout_width="80dp" | |||
| android:layout_height="wrap_content" | |||
| android:digits="0123456789." | |||
| android:inputType="number" | |||
| android:text="78" /> | |||
| <Button | |||
| android:id="@+id/btn_update" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:textSize="12dp" | |||
| android:text="更新用户" /> | |||
| </LinearLayout> | |||
| @@ -110,7 +120,7 @@ | |||
| android:orientation="horizontal" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/support_unit" | |||
| android:id="@+id/getSupportUnit" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="查询支持单位" /> | |||
| @@ -20,6 +20,20 @@ | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btnClearLog" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:onClick="onClick" | |||
| android:text="清除log" /> | |||
| <Button | |||
| android:id="@+id/btnPauseLog" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:onClick="onClick" | |||
| android:text="暂停log" /> | |||
| <Button | |||
| android:id="@+id/btnGetCurInfo" | |||
| android:layout_width="wrap_content" | |||
| @@ -277,7 +291,6 @@ | |||
| android:id="@+id/list_view" | |||
| android:layout_width="match_parent" | |||
| android:layout_height="0dp" | |||
| android:layout_weight="1" | |||
| /> | |||
| android:layout_weight="1" /> | |||
| </androidx.appcompat.widget.LinearLayoutCompat> | |||
| @@ -0,0 +1,203 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | |||
| <androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android" | |||
| xmlns:app="http://schemas.android.com/apk/res-auto" | |||
| android:layout_width="match_parent" | |||
| android:layout_height="match_parent" | |||
| android:orientation="vertical"> | |||
| <ScrollView | |||
| android:layout_width="match_parent" | |||
| android:layout_height="0dp" | |||
| android:layout_weight="1"> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content" | |||
| android:orientation="vertical" | |||
| android:padding="5dp"> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btnClearLog" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:onClick="onClick" | |||
| android:text="清除log" /> | |||
| <Button | |||
| android:id="@+id/btnPauseLog" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:onClick="onClick" | |||
| android:text="暂停log" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btnGetSupportGas" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:onClick="onClick" | |||
| android:text="支持的气体" /> | |||
| <Button | |||
| android:id="@+id/btnGetSupportFun" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:onClick="onClick" | |||
| android:text="支持的功能" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btnGetAlarmSwitch" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:onClick="onClick" | |||
| android:text="获取报警开关" /> | |||
| <Button | |||
| android:id="@+id/btnSetAlarmSwitch" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:onClick="onClick" | |||
| android:text="设置报警开关" /> | |||
| <Button | |||
| android:id="@+id/btnGetAlarmTime" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:onClick="onClick" | |||
| android:text="获取报警时长" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btnGetAlarmFrequency" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:onClick="onClick" | |||
| android:text="获取报警频率" /> | |||
| <Button | |||
| android:id="@+id/btnGetGasInfo" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:onClick="onClick" | |||
| android:text="气体信息" /> | |||
| <Button | |||
| android:id="@+id/btnGetPowerInfo" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:onClick="onClick" | |||
| android:text="电量信息" /> | |||
| <Button | |||
| android:id="@+id/btnSetTime" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:onClick="onClick" | |||
| android:text="同步时间" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <EditText | |||
| android:id="@+id/et1" | |||
| android:layout_width="100dp" | |||
| android:layout_height="wrap_content" | |||
| android:digits="0123456789" | |||
| android:hint="时间1" | |||
| android:text="1" | |||
| android:inputType="number" | |||
| android:textSize="14dp" /> | |||
| <Button | |||
| android:id="@+id/btnSaveFrequency" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:onClick="onClick" | |||
| android:text="数据存储频率(min)" /> | |||
| <Button | |||
| android:id="@+id/btnReportInterval" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:onClick="onClick" | |||
| android:text="上报间隔(min)" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <EditText | |||
| android:id="@+id/et2" | |||
| android:layout_width="100dp" | |||
| android:layout_height="wrap_content" | |||
| android:digits="0123456789" | |||
| android:hint="铃声id" | |||
| android:text="1" | |||
| android:inputType="number" | |||
| android:textSize="14dp" /> | |||
| <Button | |||
| android:id="@+id/btnGetAlarmRing" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:onClick="onClick" | |||
| android:text="报警铃声" /> | |||
| <Button | |||
| android:id="@+id/btnAlarmRingTest" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:onClick="onClick" | |||
| android:text="报警铃声测试" /> | |||
| </LinearLayout> | |||
| </LinearLayout> | |||
| </ScrollView> | |||
| <ListView | |||
| android:id="@+id/list_view" | |||
| android:layout_width="match_parent" | |||
| android:layout_height="0dp" | |||
| android:layout_weight="1" /> | |||
| </androidx.appcompat.widget.LinearLayoutCompat> | |||
| @@ -1,459 +0,0 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | |||
| <LinearLayout | |||
| xmlns:android="http://schemas.android.com/apk/res/android" | |||
| xmlns:app="http://schemas.android.com/apk/res-auto" | |||
| xmlns:tools="http://schemas.android.com/tools" | |||
| android:layout_width="match_parent" | |||
| android:layout_height="match_parent" | |||
| android:orientation="vertical"> | |||
| <ScrollView | |||
| android:layout_width="match_parent" | |||
| android:layout_height="0dp" | |||
| android:layout_weight="1" | |||
| > | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="0dp" | |||
| android:layout_weight="1" | |||
| android:orientation="vertical" | |||
| > | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content" | |||
| android:orientation="horizontal"> | |||
| <Button | |||
| android:id="@+id/button_connect" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="连接" | |||
| /> | |||
| <Button | |||
| android:id="@+id/button_dis" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="断开" | |||
| tools:layout_editor_absoluteX="281dp" | |||
| tools:layout_editor_absoluteY="40dp"/> | |||
| <Button | |||
| android:id="@+id/button_clear" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="清空" | |||
| tools:layout_editor_absoluteX="281dp" | |||
| tools:layout_editor_absoluteY="120dp"/> | |||
| <Button | |||
| android:id="@+id/button_ota" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="OTA" | |||
| tools:layout_editor_absoluteX="281dp" | |||
| tools:layout_editor_absoluteY="120dp"/> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content" | |||
| android:orientation="horizontal"> | |||
| <Button | |||
| android:id="@+id/button_time" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="同步时间" | |||
| /> | |||
| <Button | |||
| android:id="@+id/button_status" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="获取状态" | |||
| tools:layout_editor_absoluteX="281dp" | |||
| tools:layout_editor_absoluteY="40dp"/> | |||
| <Button | |||
| android:id="@+id/button_info" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="获取参数" | |||
| tools:layout_editor_absoluteX="281dp" | |||
| tools:layout_editor_absoluteY="40dp"/> | |||
| <Button | |||
| android:id="@+id/button_log" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="读取记录" | |||
| tools:layout_editor_absoluteX="16dp" | |||
| tools:layout_editor_absoluteY="120dp"/> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/button_close" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="关机" | |||
| tools:layout_editor_absoluteX="148dp" | |||
| tools:layout_editor_absoluteY="120dp"/> | |||
| <Button | |||
| android:id="@+id/button_activation" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="激活设备" | |||
| tools:layout_editor_absoluteX="148dp" | |||
| tools:layout_editor_absoluteY="120dp"/> | |||
| <Button | |||
| android:id="@+id/button_close_activation" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="清除激活状态" | |||
| tools:layout_editor_absoluteX="148dp" | |||
| tools:layout_editor_absoluteY="120dp"/> | |||
| <Button | |||
| android:id="@+id/button_bind" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="绑定" | |||
| tools:layout_editor_absoluteX="148dp" | |||
| tools:layout_editor_absoluteY="120dp"/> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/button_reboot" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="重启" | |||
| tools:layout_editor_absoluteX="148dp" | |||
| tools:layout_editor_absoluteY="120dp"/> | |||
| <Button | |||
| android:id="@+id/button_version" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="版本号" | |||
| tools:layout_editor_absoluteX="148dp" | |||
| tools:layout_editor_absoluteY="120dp"/> | |||
| <TextView | |||
| android:id="@+id/tv_version" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="bm" | |||
| /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <EditText | |||
| android:id="@+id/et_set_user" | |||
| android:layout_width="0dp" | |||
| android:layout_height="match_parent" | |||
| android:layout_weight="1" | |||
| android:digits="0123456789" | |||
| android:hint="userId" | |||
| android:text="1" | |||
| /> | |||
| <EditText | |||
| android:id="@+id/et_set_user_status" | |||
| android:layout_width="0dp" | |||
| android:layout_height="match_parent" | |||
| android:layout_weight="1" | |||
| android:digits="0123456789" | |||
| android:hint="status" | |||
| android:maxLength="1" | |||
| android:text="0" | |||
| /> | |||
| <Button | |||
| android:id="@+id/button_user" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="下发用户" | |||
| tools:layout_editor_absoluteX="148dp" | |||
| tools:layout_editor_absoluteY="41dp"/> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="40dp" | |||
| android:gravity="center_vertical" | |||
| android:orientation="horizontal" | |||
| > | |||
| <TextView | |||
| android:layout_width="100dp" | |||
| android:layout_height="wrap_content" | |||
| android:text="靠近报警阀值:" | |||
| /> | |||
| <com.pinwang.ailinkblesdk.view.SeekBarMin | |||
| android:id="@+id/seekBar1" | |||
| style="@style/Widget.AppCompat.SeekBar" | |||
| android:layout_width="0dp" | |||
| android:layout_height="wrap_content" | |||
| android:layout_weight="1" | |||
| /> | |||
| <TextView | |||
| android:id="@+id/text1" | |||
| android:layout_width="50dp" | |||
| android:layout_height="wrap_content" | |||
| android:text="阀值" | |||
| /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="40dp" | |||
| android:gravity="center_vertical" | |||
| android:orientation="horizontal" | |||
| > | |||
| <TextView | |||
| android:layout_width="100dp" | |||
| android:layout_height="wrap_content" | |||
| android:text="接收的阀值次数:" | |||
| /> | |||
| <com.pinwang.ailinkblesdk.view.SeekBarMin | |||
| android:id="@+id/seekBar2" | |||
| style="@style/Widget.AppCompat.SeekBar" | |||
| android:layout_width="0dp" | |||
| android:layout_height="wrap_content" | |||
| android:layout_weight="1" | |||
| /> | |||
| <TextView | |||
| android:id="@+id/text2" | |||
| android:layout_width="50dp" | |||
| android:layout_height="wrap_content" | |||
| android:text="阀值" | |||
| /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="40dp" | |||
| android:gravity="center_vertical" | |||
| android:orientation="horizontal" | |||
| > | |||
| <TextView | |||
| android:layout_width="100dp" | |||
| android:layout_height="wrap_content" | |||
| android:text="脱离报警时间:" | |||
| /> | |||
| <com.pinwang.ailinkblesdk.view.SeekBarMin | |||
| android:id="@+id/seekBar3" | |||
| style="@style/Widget.AppCompat.SeekBar" | |||
| android:layout_width="0dp" | |||
| android:layout_height="wrap_content" | |||
| android:layout_weight="1" | |||
| /> | |||
| <TextView | |||
| android:id="@+id/text3" | |||
| android:layout_width="50dp" | |||
| android:layout_height="wrap_content" | |||
| android:text="阀值" | |||
| /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="40dp" | |||
| android:gravity="center_vertical" | |||
| android:orientation="horizontal" | |||
| > | |||
| <TextView | |||
| android:layout_width="100dp" | |||
| android:layout_height="wrap_content" | |||
| android:text="脱离报警次数:" | |||
| /> | |||
| <com.pinwang.ailinkblesdk.view.SeekBarMin | |||
| android:id="@+id/seekBar4" | |||
| style="@style/Widget.AppCompat.SeekBar" | |||
| android:layout_width="0dp" | |||
| android:layout_height="wrap_content" | |||
| android:layout_weight="1"/> | |||
| <TextView | |||
| android:id="@+id/text4" | |||
| android:layout_width="50dp" | |||
| android:layout_height="wrap_content" | |||
| android:text="阀值" | |||
| /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="40dp" | |||
| android:gravity="center_vertical" | |||
| android:orientation="horizontal" | |||
| > | |||
| <TextView | |||
| android:layout_width="100dp" | |||
| android:layout_height="wrap_content" | |||
| android:text="Gsensor灵敏度:" | |||
| /> | |||
| <com.pinwang.ailinkblesdk.view.SeekBarMin | |||
| android:id="@+id/seekBar5" | |||
| style="@style/Widget.AppCompat.SeekBar" | |||
| android:layout_width="0dp" | |||
| android:layout_height="wrap_content" | |||
| android:layout_weight="1" | |||
| /> | |||
| <TextView | |||
| android:id="@+id/text5" | |||
| android:layout_width="50dp" | |||
| android:layout_height="wrap_content" | |||
| android:text="阀值" | |||
| /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="40dp" | |||
| android:gravity="center_vertical" | |||
| android:orientation="horizontal" | |||
| > | |||
| <TextView | |||
| android:layout_width="100dp" | |||
| android:layout_height="wrap_content" | |||
| android:text="Gsensor不动的脱机时间:" | |||
| /> | |||
| <com.pinwang.ailinkblesdk.view.SeekBarMin | |||
| android:id="@+id/seekBar6" | |||
| style="@style/Widget.AppCompat.SeekBar" | |||
| android:layout_width="0dp" | |||
| android:layout_height="wrap_content" | |||
| android:layout_weight="1" | |||
| /> | |||
| <TextView | |||
| android:id="@+id/text6" | |||
| android:layout_width="50dp" | |||
| android:layout_height="wrap_content" | |||
| android:text="阀值" | |||
| /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="40dp" | |||
| android:gravity="center_vertical" | |||
| android:orientation="horizontal" | |||
| > | |||
| <TextView | |||
| android:layout_width="100dp" | |||
| android:layout_height="wrap_content" | |||
| android:text="马达震动时间:" | |||
| /> | |||
| <com.pinwang.ailinkblesdk.view.SeekBarMin | |||
| android:id="@+id/seekBar7" | |||
| style="@style/Widget.AppCompat.SeekBar" | |||
| android:layout_width="0dp" | |||
| android:layout_height="wrap_content" | |||
| android:layout_weight="1" | |||
| /> | |||
| <TextView | |||
| android:id="@+id/text7" | |||
| android:layout_width="50dp" | |||
| android:layout_height="wrap_content" | |||
| android:text="阀值" | |||
| /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content" | |||
| android:gravity="right" | |||
| > | |||
| <Button | |||
| android:id="@+id/button_set" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="设置参数" | |||
| tools:layout_editor_absoluteX="281dp" | |||
| tools:layout_editor_absoluteY="120dp"/> | |||
| </LinearLayout> | |||
| </LinearLayout> | |||
| </ScrollView> | |||
| <ListView | |||
| android:id="@+id/listview" | |||
| android:layout_width="match_parent" | |||
| android:layout_height="0dp" | |||
| android:layout_marginTop="10dp" | |||
| android:layout_weight="1" | |||
| android:padding="10dp" | |||
| android:stackFromBottom="true" | |||
| android:transcriptMode="alwaysScroll" | |||
| > | |||
| </ListView> | |||
| </LinearLayout> | |||