| applicationId "aicare.net.cn.sdk.ailinksdkdemoandroid" | applicationId "aicare.net.cn.sdk.ailinksdkdemoandroid" | ||||
| minSdkVersion 19 | minSdkVersion 19 | ||||
| targetSdkVersion 31 | targetSdkVersion 31 | ||||
| versionName "1.11.9" | |||||
| versionName "1.11.10" | |||||
| versionCode getVersionCodeNumber(versionName) | versionCode getVersionCodeNumber(versionName) | ||||
| testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" | ||||
| } | } | ||||
| implementation fileTree(dir: 'libs', include: ['*.jar']) | implementation fileTree(dir: 'libs', include: ['*.jar']) | ||||
| implementation 'androidx.appcompat:appcompat:1.4.2' | implementation 'androidx.appcompat:appcompat:1.4.2' | ||||
| implementation 'androidx.constraintlayout:constraintlayout:2.0.4' | implementation 'androidx.constraintlayout:constraintlayout:2.0.4' | ||||
| implementation 'androidx.cardview:cardview:1.0.0' | |||||
| testImplementation 'junit:junit:4.12' | testImplementation 'junit:junit:4.12' | ||||
| implementation 'com.github.elinkthings:AILinkSDKRepositoryAndroid:1.13.11'//蓝牙核心库 | |||||
| implementation 'com.github.elinkthings:AILinkSDKRepositoryAndroid:1.14.1'//蓝牙核心库 | |||||
| implementation 'com.github.elinkthings:AILinkSDKOtaLibraryAndroid:1.0.3'//OTA库,需要依赖核心库 | implementation 'com.github.elinkthings:AILinkSDKOtaLibraryAndroid:1.0.3'//OTA库,需要依赖核心库 | ||||
| implementation 'com.github.elinkthings:AILinkSDKParsingLibraryAndroid:1.8.4'//蓝牙解析库 | |||||
| implementation 'com.github.elinkthings:AILinkSDKParsingLibraryAndroid:1.9.1'//蓝牙解析库 | |||||
| implementation 'androidx.recyclerview:recyclerview:1.2.1' | implementation 'androidx.recyclerview:recyclerview:1.2.1' | ||||
| implementation 'com.jakewharton:butterknife:10.2.0' | implementation 'com.jakewharton:butterknife:10.2.0' | ||||
| annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.0' | annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.0' |
| <activity | <activity | ||||
| android:name=".modules.broadcast_weight_sacle.BroadcastWeightScaleActivity" | android:name=".modules.broadcast_weight_sacle.BroadcastWeightScaleActivity" | ||||
| android:screenOrientation="unspecified" /> | android:screenOrientation="unspecified" /> | ||||
| <activity | |||||
| android:name=".modules.barometric_temp_humidity.BarometricTempHygrometerActivity" | |||||
| android:screenOrientation="portrait" /> | |||||
| <activity android:name=".modules.wifible_sphy.WifiBleSphyActivity" /> | |||||
| <provider | <provider | ||||
| android:name="androidx.core.content.FileProvider" | android:name="androidx.core.content.FileProvider" |
| import com.pingwang.bluetoothlib.utils.BleDensityUtil; | import com.pingwang.bluetoothlib.utils.BleDensityUtil; | ||||
| import com.pingwang.bluetoothlib.utils.BleLog; | import com.pingwang.bluetoothlib.utils.BleLog; | ||||
| import com.pingwang.bluetoothlib.utils.BleStrUtils; | import com.pingwang.bluetoothlib.utils.BleStrUtils; | ||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||
| import java.util.List; | import java.util.List; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.AppBaseActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.base.AppBaseActivity; | ||||
| /** | /** | ||||
| * xing<br> | * xing<br> | ||||
| * 2022/4/6<br> | * 2022/4/6<br> |
| int vid = bleValueBean.getVid(); | int vid = bleValueBean.getVid(); | ||||
| int pid = bleValueBean.getPid(); | int pid = bleValueBean.getPid(); | ||||
| if (mDevice != null) | if (mDevice != null) | ||||
| mDevice.onNotifyData(manufacturerData, cid, vid, pid); | |||||
| mDevice.onNotifyData("",manufacturerData, cid, vid, pid); | |||||
| } | } | ||||
| } | } | ||||
| import cn.net.aicare.modulelibrary.module.babyscale.BabyBleConfig; | import cn.net.aicare.modulelibrary.module.babyscale.BabyBleConfig; | ||||
| /** | /** | ||||
| * xing<br> | * xing<br> | ||||
| * 2020/08/10<br> | * 2020/08/10<br> | ||||
| int vid = bleValueBean.getVid(); | int vid = bleValueBean.getVid(); | ||||
| int pid = bleValueBean.getPid(); | int pid = bleValueBean.getPid(); | ||||
| if (mDevice != null) { | if (mDevice != null) { | ||||
| mDevice.onNotifyData( manufacturerData, cid, vid, pid); | |||||
| mDevice.onNotifyData("", manufacturerData, cid, vid, pid); | |||||
| } | } | ||||
| } | } | ||||
| } | } |
| import com.pingwang.bluetoothlib.utils.BleDensityUtil; | import com.pingwang.bluetoothlib.utils.BleDensityUtil; | ||||
| import com.pingwang.bluetoothlib.utils.BleLog; | import com.pingwang.bluetoothlib.utils.BleLog; | ||||
| import com.pingwang.bluetoothlib.utils.BleStrUtils; | import com.pingwang.bluetoothlib.utils.BleStrUtils; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||
| import java.util.List; | import java.util.List; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||||
| import cn.net.aicare.modulelibrary.module.height.HeightDeviceData; | import cn.net.aicare.modulelibrary.module.height.HeightDeviceData; | ||||
| import com.pingwang.bluetoothlib.bean.SupportUnitBean; | import com.pingwang.bluetoothlib.bean.SupportUnitBean; | ||||
| import com.pingwang.bluetoothlib.device.BleDevice; | import com.pingwang.bluetoothlib.device.BleDevice; | ||||
| import com.pingwang.bluetoothlib.listener.OnCallbackBle; | import com.pingwang.bluetoothlib.listener.OnCallbackBle; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.AllUnitUtils; | |||||
| import java.lang.ref.WeakReference; | import java.lang.ref.WeakReference; | ||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||
| import java.util.List; | import java.util.List; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.AllUnitUtils; | |||||
| import cn.net.aicare.algorithmutil.AlgorithmUtil; | import cn.net.aicare.algorithmutil.AlgorithmUtil; | ||||
| import cn.net.aicare.algorithmutil.BodyFatData; | import cn.net.aicare.algorithmutil.BodyFatData; | ||||
| import cn.net.aicare.modulelibrary.module.HeightWeightScale.HeightBodyFatBleData; | import cn.net.aicare.modulelibrary.module.HeightWeightScale.HeightBodyFatBleData; |
| } | } | ||||
| }); | }); | ||||
| MyListener listener = new MyListener(); | MyListener listener = new MyListener(); | ||||
| // Button btn_shpy = findViewById(R.id.btn_sphy); | // Button btn_shpy = findViewById(R.id.btn_sphy); | ||||
| // Button btn_wifi_ble_weight = findViewById(R.id.btn_wifi_ble_weight); | // Button btn_wifi_ble_weight = findViewById(R.id.btn_wifi_ble_weight); | ||||
| // Button btn_baby_body_fat = findViewById(R.id.btn_baby_body_fat); | // Button btn_baby_body_fat = findViewById(R.id.btn_baby_body_fat); | ||||
| mList.add(findViewById(R.id.btn_sphy)); | mList.add(findViewById(R.id.btn_sphy)); | ||||
| mList.add(findViewById(R.id.btn_sphy_wifi_ble)); | |||||
| mList.add(findViewById(R.id.btn_tempgun)); | mList.add(findViewById(R.id.btn_tempgun)); | ||||
| mList.add(findViewById(R.id.btn_temp)); | mList.add(findViewById(R.id.btn_temp)); | ||||
| mList.add(findViewById(R.id.btn_baby)); | mList.add(findViewById(R.id.btn_baby)); | ||||
| mList.add(findViewById(R.id.btn_weight_scale)); | mList.add(findViewById(R.id.btn_weight_scale)); | ||||
| mList.add(findViewById(R.id.btn_broadcast_scale_weight)); | mList.add(findViewById(R.id.btn_broadcast_scale_weight)); | ||||
| mList.add(findViewById(R.id.btn_meat_probe)); | mList.add(findViewById(R.id.btn_meat_probe)); | ||||
| mList.add(findViewById(R.id.btn_barometric_temp_humidity)); | |||||
| for (View view : mList) { | for (View view : mList) { | ||||
| view.setOnClickListener(listener); | view.setOnClickListener(listener); | ||||
| } | } | ||||
| case R.id.btn_sphy: | case R.id.btn_sphy: | ||||
| type = BleDeviceConfig.BLOOD_PRESSURE; | type = BleDeviceConfig.BLOOD_PRESSURE; | ||||
| break; | break; | ||||
| case R.id.btn_sphy_wifi_ble: | |||||
| type = BleDeviceConfig.SPHY_WIFI_BLE; | |||||
| break; | |||||
| case R.id.btn_tempgun: | case R.id.btn_tempgun: | ||||
| type = BleDeviceConfig.INFRARED_THERMOMETER; | type = BleDeviceConfig.INFRARED_THERMOMETER; | ||||
| break; | break; | ||||
| case R.id.btn_height: | case R.id.btn_height: | ||||
| type = BleDeviceConfig.HEIGHT_METER; | type = BleDeviceConfig.HEIGHT_METER; | ||||
| break; | break; | ||||
| case R.id.btn_lock: | |||||
| type = BleDeviceConfig.SMART_LOCK; | |||||
| break; | |||||
| case R.id.btn_ad_weight: | case R.id.btn_ad_weight: | ||||
| type = BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_AD; | type = BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_AD; | ||||
| break; | break; | ||||
| // 食物探针 | // 食物探针 | ||||
| type = BleDeviceConfig.MEAT_PROBE; | type = BleDeviceConfig.MEAT_PROBE; | ||||
| break; | break; | ||||
| case R.id.btn_barometric_temp_humidity: | |||||
| type = BleDeviceConfig.BAROMETRIC_TEMP_HUMIDITY; | |||||
| break; | |||||
| case R.id.btn_mqtt: | case R.id.btn_mqtt: | ||||
| return; | return; | ||||
| boolean bleStatus = AppStart.isLocServiceEnable(mContext); | boolean bleStatus = AppStart.isLocServiceEnable(mContext); | ||||
| if (!bleStatus) { | if (!bleStatus) { | ||||
| //没有开启定位服务 | //没有开启定位服务 | ||||
| mHintDataDialog = HintDataDialogFragment.newInstance().setTitle("提示", 0).setCancel("取消", 0).setOk("确定", 0).setContent("请求开启定位服务", true).setOnDialogListener(new HintDataDialogFragment.onDialogListener() { | |||||
| @Override | |||||
| public void onSucceedListener(View v) { | |||||
| startLocationActivity(); | |||||
| } | |||||
| }); | |||||
| mHintDataDialog = HintDataDialogFragment.newInstance() | |||||
| .setTitle("提示", 0) | |||||
| .setCancel("取消", 0) | |||||
| .setOk("确定", 0) | |||||
| .setContent("请求开启定位服务", true) | |||||
| .setOnDialogListener(new HintDataDialogFragment.onDialogListener() { | |||||
| @Override | |||||
| public void onSucceedListener(View v) { | |||||
| startLocationActivity(); | |||||
| } | |||||
| }); | |||||
| mHintDataDialog.show(getSupportFragmentManager()); | mHintDataDialog.show(getSupportFragmentManager()); | ||||
| ActivityCompat.requestPermissions(this, LOCATION_PERMISSION, PERMISSION); | ActivityCompat.requestPermissions(this, LOCATION_PERMISSION, PERMISSION); | ||||
| } else { | } else { | ||||
| //权限请求失败,选中“不再提示”选项 | //权限请求失败,选中“不再提示”选项 | ||||
| mHintDataDialog = HintDataDialogFragment.newInstance().setTitle("提示", 0).setCancel("取消", 0).setOk("确定", 0).setContent("请求开启定位权限", true).setOnDialogListener(new HintDataDialogFragment.onDialogListener() { | |||||
| @Override | |||||
| public void onSucceedListener(View v) { | |||||
| AppStart.startUseSetActivity(mContext); | |||||
| } | |||||
| }); | |||||
| mHintDataDialog = HintDataDialogFragment.newInstance() | |||||
| .setTitle("提示", 0) | |||||
| .setCancel("取消", 0) | |||||
| .setOk("确定", 0) | |||||
| .setContent("请求开启定位权限", true) | |||||
| .setOnDialogListener(new HintDataDialogFragment.onDialogListener() { | |||||
| @Override | |||||
| public void onSucceedListener(View v) { | |||||
| AppStart.startUseSetActivity(mContext); | |||||
| } | |||||
| }); | |||||
| mHintDataDialog.show(getSupportFragmentManager()); | mHintDataDialog.show(getSupportFragmentManager()); | ||||
| } | } |
| import androidx.recyclerview.widget.LinearLayoutManager; | import androidx.recyclerview.widget.LinearLayoutManager; | ||||
| import androidx.recyclerview.widget.RecyclerView; | import androidx.recyclerview.widget.RecyclerView; | ||||
| import com.pingwang.bluetoothlib.bean.BleScanAddAilinkBean; | |||||
| import com.pingwang.bluetoothlib.bean.BleValueBean; | import com.pingwang.bluetoothlib.bean.BleValueBean; | ||||
| import com.pingwang.bluetoothlib.config.BleConfig; | import com.pingwang.bluetoothlib.config.BleConfig; | ||||
| import com.pingwang.bluetoothlib.device.BleDevice; | import com.pingwang.bluetoothlib.device.BleDevice; | ||||
| import com.pingwang.bluetoothlib.utils.BleStrUtils; | import com.pingwang.bluetoothlib.utils.BleStrUtils; | ||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||
| import java.util.HashMap; | |||||
| import java.util.List; | import java.util.List; | ||||
| import java.util.Map; | |||||
| import java.util.UUID; | import java.util.UUID; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.adapter.StringAdapter; | import aicare.net.cn.sdk.ailinksdkdemoandroid.adapter.StringAdapter; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.PublicBleNetworkCmdActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.PublicBleNetworkCmdActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.TempInstrument.TempInstrumentActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.TempInstrument.TempInstrumentActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.airdetector.AirDetectorActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.airdetector.AirDetectorActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.barometric_temp_humidity.BarometricTempHygrometerActivity; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_nutrition.BleNutritionActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_nutrition.BleNutritionActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.blood_pressure_tc.BloodPressureTcActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.blood_pressure_tc.BloodPressureTcActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.coffee_scale.CoffeeScaleActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.coffee_scale.CoffeeScaleActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.toothbrush.ToothBrushWifiBleActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.toothbrush.ToothBrushWifiBleActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.toothbrush_test.ToothbrushTestActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.toothbrush_test.ToothbrushTestActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.weight_scale.WeightScaleActivity; | import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.weight_scale.WeightScaleActivity; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.wifible_sphy.WifiBleSphyActivity; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.CheckPermissionUtils; | import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.CheckPermissionUtils; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.view.MyItemDecoration; | import aicare.net.cn.sdk.ailinksdkdemoandroid.view.MyItemDecoration; | ||||
| import cn.net.aicare.modulelibrary.module.RopeSkipping.RopeSkippingBleData; | import cn.net.aicare.modulelibrary.module.RopeSkipping.RopeSkippingBleData; | ||||
| // 如果是蓝牙牙刷,就弹个框提醒 | // 如果是蓝牙牙刷,就弹个框提醒 | ||||
| if (mType == BleDeviceConfig.TOOTHBRUSH_TEST) { | if (mType == BleDeviceConfig.TOOTHBRUSH_TEST) { | ||||
| new AlertDialog.Builder(mContext).setMessage("启动牙刷,工作10秒钟,然后关闭牙刷(让牙刷处于广播状态),然后点击搜索,选中列表中的牙刷,开始测试").setPositiveButton("确认", null).show(); | |||||
| new AlertDialog.Builder(mContext).setMessage("启动牙刷,工作10秒钟,然后关闭牙刷(让牙刷处于广播状态),然后点击搜索,选中列表中的牙刷,开始测试") | |||||
| .setPositiveButton("确认", null) | |||||
| .show(); | |||||
| } | } | ||||
| } | } | ||||
| mBleValueList = new ArrayList<>(); | mBleValueList = new ArrayList<>(); | ||||
| RecyclerView recyclerView = findViewById(R.id.rv_data); | RecyclerView recyclerView = findViewById(R.id.rv_data); | ||||
| recyclerView.setLayoutManager(new LinearLayoutManager(mContext)); | recyclerView.setLayoutManager(new LinearLayoutManager(mContext)); | ||||
| recyclerView.addItemDecoration(new MyItemDecoration(mContext, LinearLayoutManager.VERTICAL, 1, mContext.getResources().getColor(R.color.public_press_bg))); | |||||
| recyclerView.addItemDecoration(new MyItemDecoration(mContext, LinearLayoutManager.VERTICAL, 1, mContext.getResources() | |||||
| .getColor(R.color.public_press_bg))); | |||||
| Button btn = findViewById(R.id.btn); | Button btn = findViewById(R.id.btn); | ||||
| Button btn1 = findViewById(R.id.btn1); | Button btn1 = findViewById(R.id.btn1); | ||||
| Button clear = findViewById(R.id.clear); | Button clear = findViewById(R.id.clear); | ||||
| mFilterName = et_filter_name.getText().toString().trim(); | mFilterName = et_filter_name.getText().toString().trim(); | ||||
| mFilterMac = et_filter_mac.getText().toString().trim(); | mFilterMac = et_filter_mac.getText().toString().trim(); | ||||
| if (mType == BleDeviceConfig.SMART_SCOOTER) { | if (mType == BleDeviceConfig.SMART_SCOOTER) { | ||||
| Map<String, String> map = new HashMap<>(); | |||||
| map.put(SkateboardBleConfig.UUID_BROADCAST.toString(), "37,3,1");//37=0x0025=电滑板的cid | |||||
| mBluetoothService.startScan(30 * 1000, map, BleConfig.UUID_SERVER_AILINK, SkateboardBleConfig.UUID_BROADCAST); | |||||
| List<BleScanAddAilinkBean> list = new ArrayList<>(); | |||||
| list.add(new BleScanAddAilinkBean(0x37, 0x03, 0x01, SkateboardBleConfig.UUID_BROADCAST)); | |||||
| mBluetoothService.startScan(30 * 1000, list, BleConfig.UUID_SERVER_AILINK, SkateboardBleConfig.UUID_BROADCAST); | |||||
| } else { | } else { | ||||
| //0000FEE7=手表 | //0000FEE7=手表 | ||||
| mBluetoothService.startScan(1000, BleConfig.UUID_SERVER_AILINK, UUID.fromString("0000FEE7-0000-1000-8000-00805F9B34FB"), SkateboardBleConfig.UUID_BROADCAST); | |||||
| mBluetoothService.startScan(30 * 1000, BleConfig.UUID_BROADCAST_AILINK, BleConfig.UUID_SERVER_BROADCAST_AILINK, UUID.fromString("0000FEE7-0000-1000-8000-00805F9B34FB"), SkateboardBleConfig.UUID_BROADCAST); | |||||
| } | } | ||||
| mBleValueList.clear(); | mBleValueList.clear(); | ||||
| listAdapter.notifyDataSetChanged(); | listAdapter.notifyDataSetChanged(); | ||||
| @Override | @Override | ||||
| public void onClick(View v) { | public void onClick(View v) { | ||||
| if (mBluetoothService != null) { | if (mBluetoothService != null) { | ||||
| mBluetoothService.stopScan(); | |||||
| mBluetoothService.stopScan(10000); | |||||
| } | } | ||||
| } | } | ||||
| }); | }); | ||||
| } | } | ||||
| String data2 = BleStrUtils.byte2HexStr(bleValueBean.getManufacturerData()); | String data2 = BleStrUtils.byte2HexStr(bleValueBean.getManufacturerData()); | ||||
| showData.append(data2); | showData.append(data2); | ||||
| HintDataDialogFragment.newInstance().setTitle("自定义厂商数据", 0).setContent(showData.toString(), false).setOk("", 0).show(getSupportFragmentManager()); | |||||
| HintDataDialogFragment.newInstance() | |||||
| .setTitle("自定义厂商数据", 0) | |||||
| .setContent(showData.toString(), false) | |||||
| .setOk("", 0) | |||||
| .show(getSupportFragmentManager()); | |||||
| } | } | ||||
| }); | }); | ||||
| recyclerView.setAdapter(listAdapter); | recyclerView.setAdapter(listAdapter); | ||||
| BleValueBean bleValueBean = mBleValueList.get(i); | BleValueBean bleValueBean = mBleValueList.get(i); | ||||
| if (bleValueBean.equals(data)) { | if (bleValueBean.equals(data)) { | ||||
| bleValueBean.setRssi(data.getRssi()); | bleValueBean.setRssi(data.getRssi()); | ||||
| if (!oldData) { | |||||
| oldData = true; | |||||
| } | |||||
| oldData = true; | |||||
| listAdapter.notifyItemChanged(i); | listAdapter.notifyItemChanged(i); | ||||
| break; | |||||
| } | } | ||||
| } | } | ||||
| if (!oldData) { | if (!oldData) { | ||||
| intent.setClass(ShowBleActivity.this, TempGunCmdActivity.class); | intent.setClass(ShowBleActivity.this, TempGunCmdActivity.class); | ||||
| break; | break; | ||||
| case BleDeviceConfig.BLOOD_PRESSURE: | case BleDeviceConfig.BLOOD_PRESSURE: | ||||
| case BleDeviceConfig.SPHY_WIFI_BLE: | |||||
| intent.setClass(ShowBleActivity.this, SphyCmdActivity.class); | intent.setClass(ShowBleActivity.this, SphyCmdActivity.class); | ||||
| break; | break; | ||||
| case BleDeviceConfig.SPHY_WIFI_BLE: | |||||
| intent.setClass(ShowBleActivity.this, WifiBleSphyActivity.class); | |||||
| break; | |||||
| case BleDeviceConfig.THERMOMETER: | case BleDeviceConfig.THERMOMETER: | ||||
| intent.setClass(ShowBleActivity.this, TempCmdActivity.class); | intent.setClass(ShowBleActivity.this, TempCmdActivity.class); | ||||
| break; | break; | ||||
| case BleDeviceConfig.MEAT_PROBE: | case BleDeviceConfig.MEAT_PROBE: | ||||
| intent.setClass(ShowBleActivity.this, MeatProbeActivity.class); | intent.setClass(ShowBleActivity.this, MeatProbeActivity.class); | ||||
| break; | break; | ||||
| case BleDeviceConfig.BAROMETRIC_TEMP_HUMIDITY: | |||||
| // 气压温湿度计 | |||||
| intent.setClass(ShowBleActivity.this, BarometricTempHygrometerActivity.class); | |||||
| break; | |||||
| default: | default: | ||||
| break; | break; | ||||
| @Override | @Override | ||||
| public boolean onFilter(BleValueBean bleValueBean) { | public boolean onFilter(BleValueBean bleValueBean) { | ||||
| int cid = bleValueBean.getCid(); | int cid = bleValueBean.getCid(); | ||||
| BleLog.i(TAG, "绑定设备广播类型:" + cid + "||添加的类型:" + mType); | |||||
| boolean nameAndMac = false; | boolean nameAndMac = false; | ||||
| if (TextUtils.isEmpty(mFilterName) && TextUtils.isEmpty(mFilterMac)) { | if (TextUtils.isEmpty(mFilterName) && TextUtils.isEmpty(mFilterMac)) { | ||||
| nameAndMac = true; | nameAndMac = true; | ||||
| if (mScanCid == BleDeviceConfig.FOOD_TEMP && nameAndMac) { | if (mScanCid == BleDeviceConfig.FOOD_TEMP && nameAndMac) { | ||||
| return cid == BleDeviceConfig.FOOD_TEMP || cid == 63; | return cid == BleDeviceConfig.FOOD_TEMP || cid == 63; | ||||
| } | } | ||||
| // if (mScanCid == BleDeviceConfig.BLOOD_PRESSURE && nameAndMac) { | |||||
| // return cid == BleDeviceConfig.BLOOD_PRESSURE || cid == BleDeviceConfig.SPHY_WIFI_BLE; | |||||
| // } | |||||
| if (mScanCid < 0) { | if (mScanCid < 0) { | ||||
| return nameAndMac; | return nameAndMac; | ||||
| } else { | } else { | ||||
| private boolean isCheckDevice(int scanCid, int cid, boolean nameAndMac) { | private boolean isCheckDevice(int scanCid, int cid, boolean nameAndMac) { | ||||
| boolean okDevice = false; | |||||
| if (scanCid == BleDeviceConfig.BLOOD_PRESSURE) { | |||||
| //血压计包含wifi+bel | |||||
| if (nameAndMac) { | |||||
| okDevice = (scanCid == cid) || (cid == BleDeviceConfig.SPHY_WIFI_BLE); | |||||
| } | |||||
| } else { | |||||
| okDevice = scanCid == cid && nameAndMac; | |||||
| } | |||||
| boolean okDevice = scanCid == cid && nameAndMac; | |||||
| return okDevice; | return okDevice; | ||||
| } | } | ||||
| @Override | |||||
| public void onScanRecord(BleValueBean mBle) { | |||||
| //TODO 过滤后的设备 | |||||
| } | |||||
| @Override | @Override | ||||
| public void onScanTimeOut() { | public void onScanTimeOut() { | ||||
| break; | break; | ||||
| case BodyFatDataUtil.TEST_FINISH: | case BodyFatDataUtil.TEST_FINISH: | ||||
| mlogList.add(0, "测量状态:" + status + " 测量完成"); | mlogList.add(0, "测量状态:" + status + " 测量完成"); | ||||
| if (bodyFatBleUtilsData != null) { | |||||
| bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().updataPresentUser(selectUser)); | |||||
| } | |||||
| break; | break; | ||||
| case BodyFatDataUtil.MUC_REQUEST_USER_INFO: | case BodyFatDataUtil.MUC_REQUEST_USER_INFO: | ||||
| mlogList.add(0, "测量状态:" + status + "请求用户信息"); | mlogList.add(0, "测量状态:" + status + "请求用户信息"); | ||||
| if (bodyFatBleUtilsData != null) | |||||
| if (bodyFatBleUtilsData != null) { | |||||
| bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().setUserInfo(selectUser, BleDeviceConfig.WEIGHT_BODY_FAT_SCALE)); | bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().setUserInfo(selectUser, BleDeviceConfig.WEIGHT_BODY_FAT_SCALE)); | ||||
| } | |||||
| break; | break; | ||||
| default: | default: | ||||
| mlogList.add(0, "测量状态:" + status); | mlogList.add(0, "测量状态:" + status); | ||||
| int userid = Integer.parseInt(mEditText.getText().toString().trim()); | int userid = Integer.parseInt(mEditText.getText().toString().trim()); | ||||
| if (mUsers.size() >= userid) { | if (mUsers.size() >= userid) { | ||||
| selectUser = mUsers.get(userid - 1); | selectUser = mUsers.get(userid - 1); | ||||
| if (bodyFatBleUtilsData != null) | |||||
| if (bodyFatBleUtilsData != null) { | |||||
| bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().updataPresentUser(selectUser)); | bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().updataPresentUser(selectUser)); | ||||
| } | |||||
| } | } | ||||
| } | } | ||||
| break; | break; |
| import androidx.annotation.Nullable; | import androidx.annotation.Nullable; | ||||
| import androidx.appcompat.widget.Toolbar; | import androidx.appcompat.widget.Toolbar; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.HintDataDialogFragment; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.CheckPermissionUtils; | |||||
| import java.lang.ref.WeakReference; | 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.ButterKnife; | ||||
| import butterknife.Unbinder; | import butterknife.Unbinder; | ||||
| import com.pingwang.bluetoothlib.bean.BleValueBean; | import com.pingwang.bluetoothlib.bean.BleValueBean; | ||||
| import com.pingwang.bluetoothlib.config.BleConfig; | import com.pingwang.bluetoothlib.config.BleConfig; | ||||
| import com.pingwang.bluetoothlib.utils.BleLog; | import com.pingwang.bluetoothlib.utils.BleLog; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.BuildConfig; | import aicare.net.cn.sdk.ailinksdkdemoandroid.BuildConfig; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | ||||
| /** | /** | ||||
| * xing<br> | * xing<br> | ||||
| * 2019/4/25<br> | * 2019/4/25<br> |
| import com.pingwang.bluetoothlib.bean.BleValueBean; | import com.pingwang.bluetoothlib.bean.BleValueBean; | ||||
| import com.pingwang.bluetoothlib.config.BleConfig; | import com.pingwang.bluetoothlib.config.BleConfig; | ||||
| import com.pingwang.bluetoothlib.utils.BleLog; | import com.pingwang.bluetoothlib.utils.BleLog; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.BuildConfig; | import aicare.net.cn.sdk.ailinksdkdemoandroid.BuildConfig; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | ||||
| /** | /** | ||||
| * xing<br> | * xing<br> | ||||
| * 2019/4/25<br> | * 2019/4/25<br> |
| import android.app.Application; | import android.app.Application; | ||||
| import com.pingwang.bluetoothlib.AILinkSDK; | |||||
| public class MyApplication extends Application { | public class MyApplication extends Application { | ||||
| private static MyApplication sInstance; | private static MyApplication sInstance; | ||||
| public void onCreate() { | public void onCreate() { | ||||
| super.onCreate(); | super.onCreate(); | ||||
| sInstance = this; | sInstance = this; | ||||
| AILinkSDK.getInstance().init(this); | |||||
| } | } | ||||
| public static MyApplication getInstance(){ | public static MyApplication getInstance(){ |
| package aicare.net.cn.sdk.ailinksdkdemoandroid.dialog; | |||||
| import android.app.Dialog; | |||||
| import android.content.Context; | |||||
| import android.content.DialogInterface; | |||||
| import android.graphics.Color; | |||||
| import android.graphics.drawable.ColorDrawable; | |||||
| import android.graphics.drawable.Drawable; | |||||
| import android.os.Bundle; | |||||
| import android.text.Editable; | |||||
| import android.text.InputFilter; | |||||
| import android.text.InputType; | |||||
| import android.text.TextUtils; | |||||
| import android.text.TextWatcher; | |||||
| import android.util.DisplayMetrics; | |||||
| import android.view.Gravity; | |||||
| import android.view.KeyEvent; | |||||
| import android.view.LayoutInflater; | |||||
| import android.view.View; | |||||
| import android.view.ViewGroup; | |||||
| import android.view.Window; | |||||
| import android.view.WindowManager; | |||||
| import android.widget.EditText; | |||||
| import android.widget.TextView; | |||||
| import androidx.annotation.ColorInt; | |||||
| import androidx.annotation.IntDef; | |||||
| import androidx.annotation.NonNull; | |||||
| import androidx.annotation.Nullable; | |||||
| import androidx.fragment.app.DialogFragment; | |||||
| import androidx.fragment.app.FragmentManager; | |||||
| import java.lang.annotation.Retention; | |||||
| import java.lang.annotation.RetentionPolicy; | |||||
| import java.util.regex.Pattern; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||||
| /** | |||||
| * 修改信息的弹框 | |||||
| */ | |||||
| public class MoveDataDialogFragment extends DialogFragment implements View.OnClickListener { | |||||
| private String TAG = MoveDataDialogFragment.class.getName(); | |||||
| public static final int EMAIL = 2; | |||||
| public static final int NAME = 1; | |||||
| public static final int PAW = 3; | |||||
| @IntDef({EMAIL, NAME, PAW}) | |||||
| @Retention(RetentionPolicy.SOURCE) | |||||
| public @interface MoveDataType { | |||||
| } | |||||
| private Context mContext; | |||||
| private OnDialogListener mOnDialogListener; | |||||
| private EditText mEtName; | |||||
| private TextView mTvCancel, mTvSucceed, mTvTitle, mTvTitleHint; | |||||
| private int mNameLength = 32; | |||||
| private CharSequence mTitle = ""; | |||||
| private CharSequence mTitleHint; | |||||
| private CharSequence mContent = ""; | |||||
| private CharSequence mContentHint = ""; | |||||
| private CharSequence mCancel = ""; | |||||
| @ColorInt | |||||
| private int mCancelColor = 0; | |||||
| private CharSequence mOkStr = ""; | |||||
| private String mRegular = ""; | |||||
| @ColorInt | |||||
| private int mOkColor = 0; | |||||
| private boolean mBottom; | |||||
| /** | |||||
| * 点击确定后是否自动关闭,默认true | |||||
| */ | |||||
| private boolean autoDismiss = true; | |||||
| /** | |||||
| * 是否显示灰色背景 | |||||
| */ | |||||
| private boolean mBackground = true; | |||||
| /** | |||||
| * 点击空白区域是否关闭 | |||||
| */ | |||||
| private boolean mCancelBlank; | |||||
| /** | |||||
| * 是否显示 | |||||
| */ | |||||
| private boolean mShow; | |||||
| /** | |||||
| * 类型 | |||||
| */ | |||||
| private int mType; | |||||
| /** | |||||
| * 确认按钮背景 | |||||
| */ | |||||
| private Drawable drawable; | |||||
| public static MoveDataDialogFragment newInstance() { | |||||
| return new MoveDataDialogFragment(); | |||||
| } | |||||
| @Override | |||||
| public void onCreate(@Nullable Bundle savedInstanceState) { | |||||
| super.onCreate(savedInstanceState); | |||||
| setStyle(STYLE_NO_FRAME, R.style.MyDialog); | |||||
| } | |||||
| @NonNull | |||||
| @Override | |||||
| public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { | |||||
| setStyle(STYLE_NO_FRAME, R.style.MyDialog); | |||||
| Dialog dialogView = new Dialog(requireContext(), R.style.MyDialog);// 创建自定义样式dialog | |||||
| dialogView.setCancelable(false);//设置是否可以关闭 | |||||
| dialogView.setCanceledOnTouchOutside(mCancelBlank);//设置点击空白处是否可以取消 | |||||
| dialogView.setOnKeyListener((dialog, keyCode, event) -> { | |||||
| if (mCancelBlank) { | |||||
| return false; | |||||
| } else { | |||||
| //返回不关闭 | |||||
| return keyCode == KeyEvent.KEYCODE_BACK; | |||||
| } | |||||
| }); | |||||
| return dialogView; | |||||
| } | |||||
| @Nullable | |||||
| @Override | |||||
| public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, | |||||
| @Nullable Bundle savedInstanceState) { | |||||
| return inflater.inflate(R.layout.dialog_move_data, container); | |||||
| } | |||||
| @Override | |||||
| public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { | |||||
| super.onViewCreated(view, savedInstanceState); | |||||
| mContext = view.getContext(); | |||||
| init(view, mType); | |||||
| initData(mTitle, mTitleHint, mContent, mContentHint, mCancelColor, mOkColor, mType); | |||||
| } | |||||
| @Override | |||||
| public void onActivityCreated(@Nullable Bundle savedInstanceState) { | |||||
| super.onActivityCreated(savedInstanceState); | |||||
| Dialog dialog = getDialog(); | |||||
| if (dialog != null) { | |||||
| Window window = dialog.getWindow(); | |||||
| if (window != null) { | |||||
| window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); | |||||
| WindowManager.LayoutParams params = window.getAttributes(); | |||||
| if (mBackground) { | |||||
| params.dimAmount = 0.5f; | |||||
| } else { | |||||
| params.dimAmount = 0f; | |||||
| } | |||||
| if (mBottom) { | |||||
| params.y = 10;//设置Dialog距离底部的距离 | |||||
| params.gravity = Gravity.BOTTOM; | |||||
| } | |||||
| window.setAttributes(params); | |||||
| } | |||||
| } | |||||
| } | |||||
| /** | |||||
| * 初始化控件 | |||||
| */ | |||||
| private void init(View view, int type) { | |||||
| mEtName = view.findViewById(R.id.et_move_data_context); | |||||
| mTvCancel = view.findViewById(R.id.tv_move_data_cancel); | |||||
| mTvSucceed = view.findViewById(R.id.tv_move_data_ok); | |||||
| mTvTitle = view.findViewById(R.id.tv_move_data_title); | |||||
| mTvTitleHint = view.findViewById(R.id.tv_move_data_title_hint); | |||||
| if (type == NAME) { | |||||
| mEtName.addTextChangedListener(new TextWatcher() { | |||||
| @Override | |||||
| public void beforeTextChanged(CharSequence s, int start, int count, int after) { | |||||
| } | |||||
| @Override | |||||
| public void onTextChanged(CharSequence s, int start, int before, int count) { | |||||
| } | |||||
| @Override | |||||
| public void afterTextChanged(Editable s) { | |||||
| String name = s.toString().trim(); | |||||
| if (name.length() > mNameLength) { | |||||
| mEtName.setText(name.substring(0, mNameLength)); | |||||
| mEtName.setSelection(mEtName.getText().length()); | |||||
| } | |||||
| } | |||||
| }); | |||||
| } else if (type == EMAIL) { | |||||
| mEtName.setInputType(InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS); | |||||
| mEtName.setSelection(mEtName.getText().length()); | |||||
| } | |||||
| if (!TextUtils.isEmpty(mRegular)) { | |||||
| mEtName.setFilters(new InputFilter[]{(charSequence, start, end, dest, dstart, dend) -> { | |||||
| boolean isChinese = Pattern.matches(mRegular, charSequence.toString()); | |||||
| if (isChinese) { | |||||
| return ""; | |||||
| } | |||||
| return null; | |||||
| }}); | |||||
| } | |||||
| if (mOnDialogListener != null) { | |||||
| mOnDialogListener.onModifyName(mEtName); | |||||
| } | |||||
| mTvCancel.setOnClickListener(this); | |||||
| mTvSucceed.setOnClickListener(this); | |||||
| } | |||||
| /** | |||||
| * 点击确定后是否自动关闭,默认true | |||||
| * | |||||
| * @param autoDismiss 默认true | |||||
| * @return MoveDataDialogFragment | |||||
| */ | |||||
| public MoveDataDialogFragment setAutoDismiss(boolean autoDismiss) { | |||||
| this.autoDismiss = autoDismiss; | |||||
| return this; | |||||
| } | |||||
| @Override | |||||
| public void onClick(View v) { | |||||
| int i = v.getId(); | |||||
| if (i == R.id.tv_move_data_cancel) { | |||||
| if (mOnDialogListener != null) { | |||||
| mOnDialogListener.onCancelListener(v); | |||||
| } | |||||
| dismiss(); | |||||
| } else if (i == R.id.tv_move_data_ok) { | |||||
| if (mOnDialogListener != null) { | |||||
| String data = mEtName.getText().toString().trim(); | |||||
| mOnDialogListener.onSucceedListener(v, data); | |||||
| } | |||||
| if (!mEtName.getText().toString().trim().isEmpty() && autoDismiss) { | |||||
| dismiss(); | |||||
| } | |||||
| } | |||||
| } | |||||
| /** | |||||
| * 初始化数据 | |||||
| * | |||||
| * @param title 标题 | |||||
| * @param titleHint 标题提示 | |||||
| * @param content 输入框内容 | |||||
| * @param contentHint 输入框提示 | |||||
| * @param cancelColor 取消颜色 | |||||
| * @param okColor 确定颜色 | |||||
| * @param type 类型(名称,email){@link MoveDataType} | |||||
| */ | |||||
| private void initData(CharSequence title, CharSequence titleHint, CharSequence content, | |||||
| CharSequence contentHint, int cancelColor, int okColor, int type) { | |||||
| setTitle(title, titleHint); | |||||
| setContent(content, contentHint, type); | |||||
| setCancel("", cancelColor); | |||||
| setOk("", okColor, drawable); | |||||
| } | |||||
| /** | |||||
| * @param content 输入框内容 | |||||
| * @param contentHint 输入框提示 | |||||
| * @param type {@link MoveDataType} | |||||
| * @return | |||||
| */ | |||||
| public MoveDataDialogFragment setContent(CharSequence content, CharSequence contentHint, @MoveDataType int type) { | |||||
| this.mType = type; | |||||
| if (mType == NAME) { | |||||
| if (mContent != null && mContent.length() > mNameLength) { | |||||
| mContent = content.toString().substring(0, mNameLength); | |||||
| } else { | |||||
| this.mContent = content; | |||||
| } | |||||
| } else { | |||||
| this.mContent = content; | |||||
| } | |||||
| this.mContentHint = contentHint; | |||||
| if (mEtName != null) { | |||||
| if (mContent != null && !mContent.equals("")) { | |||||
| mEtName.setText(mContent); | |||||
| mEtName.setSelection(mEtName.getText().length()); | |||||
| } else if (mContent == null) { | |||||
| mEtName.setText(""); | |||||
| } | |||||
| if (mContentHint != null && !mContentHint.equals("")) { | |||||
| mEtName.setHint(mContentHint); | |||||
| } else if (mContentHint == null || mContentHint.equals("")) { | |||||
| mEtName.setHint(""); | |||||
| } | |||||
| if (mType == PAW) { | |||||
| mEtName.setInputType(8194); | |||||
| mEtName.setFilters(new InputFilter[]{new InputFilter.LengthFilter(6)}); | |||||
| } | |||||
| } | |||||
| return this; | |||||
| } | |||||
| public MoveDataDialogFragment setTitle(CharSequence title, CharSequence titleHint) { | |||||
| this.mTitle = title; | |||||
| this.mTitleHint = titleHint; | |||||
| if (mTvTitle != null) { | |||||
| if (mTitle != null && !mTitle.equals("")) { | |||||
| mTvTitle.setVisibility(View.VISIBLE); | |||||
| mTvTitle.setText(mTitle); | |||||
| } else if (mTitle == null) { | |||||
| mTvTitle.setVisibility(View.GONE); | |||||
| } | |||||
| } | |||||
| if (mTvTitleHint != null) { | |||||
| if (mTitleHint != null && mTitleHint.length() != 0) { | |||||
| mTvTitleHint.setVisibility(View.VISIBLE); | |||||
| mTvTitleHint.setText(mTitleHint); | |||||
| } else { | |||||
| mTvTitleHint.setVisibility(View.GONE); | |||||
| } | |||||
| } | |||||
| return this; | |||||
| } | |||||
| public MoveDataDialogFragment setCancel(CharSequence cancel, @ColorInt int cancelColor) { | |||||
| this.mCancel = cancel; | |||||
| this.mCancelColor = cancelColor; | |||||
| if (mTvCancel != null) { | |||||
| if (mCancel != null && !mCancel.equals("")) { | |||||
| mTvCancel.setVisibility(View.VISIBLE); | |||||
| mTvCancel.setText(mCancel); | |||||
| } else if (mCancel == null) { | |||||
| mTvCancel.setVisibility(View.GONE); | |||||
| } | |||||
| if (mCancelColor > 0) { | |||||
| mTvCancel.setTextColor(mCancelColor); | |||||
| } | |||||
| } | |||||
| return this; | |||||
| } | |||||
| /** | |||||
| * 确认按钮 | |||||
| */ | |||||
| public MoveDataDialogFragment setOk(CharSequence ok, @ColorInt int okColor) { | |||||
| return setOk(ok, okColor, null); | |||||
| } | |||||
| public MoveDataDialogFragment setOk(CharSequence ok, @ColorInt int okColor, Drawable drawable) { | |||||
| this.mOkStr = ok; | |||||
| this.mOkColor = okColor; | |||||
| this.drawable = drawable; | |||||
| if (mTvSucceed != null) { | |||||
| if (mOkStr != null && !mOkStr.equals("")) { | |||||
| mTvSucceed.setVisibility(View.VISIBLE); | |||||
| mTvSucceed.setText(mOkStr); | |||||
| } else if (mOkStr == null) { | |||||
| mTvSucceed.setVisibility(View.GONE); | |||||
| } | |||||
| if (mOkColor > 0) { | |||||
| mTvSucceed.setTextColor(mOkColor); | |||||
| } | |||||
| if (drawable != null) { | |||||
| mTvSucceed.setBackground(drawable); | |||||
| } | |||||
| } | |||||
| return this; | |||||
| } | |||||
| /** | |||||
| * 设置edittext输入的过滤 | |||||
| * | |||||
| * @param regular 过滤的正则 | |||||
| * @return | |||||
| */ | |||||
| public MoveDataDialogFragment setFilters(String regular) { | |||||
| this.mRegular = regular; | |||||
| return this; | |||||
| } | |||||
| /** | |||||
| * 设置dialog是否在底部 | |||||
| */ | |||||
| public MoveDataDialogFragment setBottom(boolean bottom) { | |||||
| mBottom = bottom; | |||||
| return this; | |||||
| } | |||||
| /** | |||||
| * 设置dialog是否有灰色背景,默认显示灰色背景 | |||||
| */ | |||||
| public MoveDataDialogFragment setBackground(boolean background) { | |||||
| mBackground = background; | |||||
| return this; | |||||
| } | |||||
| /** | |||||
| * 设置点击空白区域是否可以关闭,默认false | |||||
| */ | |||||
| public MoveDataDialogFragment setCancelBlank(boolean cancelable) { | |||||
| mCancelBlank = cancelable; | |||||
| return this; | |||||
| } | |||||
| public MoveDataDialogFragment setOnDialogListener(OnDialogListener mOnDialogListener) { | |||||
| this.mOnDialogListener = mOnDialogListener; | |||||
| return this; | |||||
| } | |||||
| public MoveDataDialogFragment setNameLength(int nameLength) { | |||||
| mNameLength = nameLength; | |||||
| return this; | |||||
| } | |||||
| public MoveDataDialogFragment setOkBack(int nameLength) { | |||||
| mNameLength = nameLength; | |||||
| return this; | |||||
| } | |||||
| /** | |||||
| * 当前是否显示 | |||||
| */ | |||||
| public boolean isShow() { | |||||
| return mShow; | |||||
| } | |||||
| @Override | |||||
| public void show(@NonNull FragmentManager manager, @Nullable String tag) { | |||||
| try { | |||||
| if (!mShow) { | |||||
| super.show(manager, tag); | |||||
| mShow = true; | |||||
| } | |||||
| } catch (Exception e) { | |||||
| e.printStackTrace(); | |||||
| } | |||||
| } | |||||
| public void show(@NonNull FragmentManager manager) { | |||||
| this.show(manager, "HintDataDialogFragment"); | |||||
| } | |||||
| @Override | |||||
| public void onDismiss(@NonNull DialogInterface dialog) { | |||||
| super.onDismiss(dialog); | |||||
| mShow = false; | |||||
| } | |||||
| @Override | |||||
| public void dismiss() { | |||||
| try { | |||||
| mShow = false; | |||||
| super.dismiss(); | |||||
| } catch (Exception e) { | |||||
| e.printStackTrace(); | |||||
| } | |||||
| } | |||||
| public interface OnDialogListener { | |||||
| /** | |||||
| * 取消的点击事件 | |||||
| */ | |||||
| default void onCancelListener(View v) { | |||||
| } | |||||
| /** | |||||
| * 成功的点击事件 | |||||
| */ | |||||
| default void onSucceedListener(View v, String data) { | |||||
| } | |||||
| /** | |||||
| * 修改名称的控件 | |||||
| */ | |||||
| default void onModifyName(EditText v) { | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public void onDestroyView() { | |||||
| super.onDestroyView(); | |||||
| mShow = false; | |||||
| } | |||||
| @Override | |||||
| public void onStart() { | |||||
| super.onStart(); | |||||
| Dialog dialog = getDialog(); | |||||
| if (dialog != null) { | |||||
| dialog.setOnDismissListener(this); | |||||
| DisplayMetrics dm = new DisplayMetrics(); | |||||
| if (getActivity() != null) { | |||||
| getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm); | |||||
| if (dialog.getWindow() != null) | |||||
| { | |||||
| //设置宽度为80% | |||||
| dialog.getWindow().setLayout((int) (dm.widthPixels * 0.8), | |||||
| ViewGroup.LayoutParams.WRAP_CONTENT); | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| } |
| import java.util.List; | import java.util.List; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | ||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.view.MyItemDecoration; | import aicare.net.cn.sdk.ailinksdkdemoandroid.view.MyItemDecoration; | ||||
| /** | /** | ||||
| * 列表显示的dialog | * 列表显示的dialog | ||||
| * | |||||
| * @author xing | |||||
| * @date 2023/09/23 | |||||
| */ | */ | ||||
| public class ShowListDialogFragment extends DialogFragment implements View.OnClickListener { | public class ShowListDialogFragment extends DialogFragment implements View.OnClickListener { | ||||
| private String TAG = ShowListDialogFragment.class.getName(); | private String TAG = ShowListDialogFragment.class.getName(); | ||||
| private Context mContext; | private Context mContext; | ||||
| private onDialogListener mOnDialogListener; | private onDialogListener mOnDialogListener; | ||||
| private TextView mTvCancel, mTvTitle; | |||||
| private TextView mTvCancel, mTvTitle, tv_dialog_list_data_hint; | |||||
| private RecyclerView rv_dialog_list; | private RecyclerView rv_dialog_list; | ||||
| private DialogStringImageAdapter mAdapter; | private DialogStringImageAdapter mAdapter; | ||||
| private int mCancelColor; | private int mCancelColor; | ||||
| private CharSequence mCancel; | |||||
| private CharSequence mTitle; | |||||
| private CharSequence mCancel = ""; | |||||
| private CharSequence mTitle = ""; | |||||
| private ArrayList<DialogStringImageBean> mList; | private ArrayList<DialogStringImageBean> mList; | ||||
| private boolean mBottom; | private boolean mBottom; | ||||
| /** | /** | ||||
| * 是否显示灰色背景 | * 是否显示灰色背景 | ||||
| */ | */ | ||||
| private boolean mBackground=true; | |||||
| private boolean mBackground = true; | |||||
| /** | /** | ||||
| * 点击空白区域是否关闭 | * 点击空白区域是否关闭 | ||||
| @Override | @Override | ||||
| public void onActivityCreated(@Nullable Bundle savedInstanceState) { | public void onActivityCreated(@Nullable Bundle savedInstanceState) { | ||||
| super.onActivityCreated(savedInstanceState); | super.onActivityCreated(savedInstanceState); | ||||
| L.i(TAG,"onActivityCreated"); | |||||
| Dialog dialog = getDialog(); | Dialog dialog = getDialog(); | ||||
| if (dialog != null) { | if (dialog != null) { | ||||
| Window window = dialog.getWindow(); | Window window = dialog.getWindow(); | ||||
| } | } | ||||
| /** | /** | ||||
| * 初始化控件,数据 | * 初始化控件,数据 | ||||
| */ | */ | ||||
| mTvTitle = view.findViewById(R.id.tv_dialog_list_data_title); | mTvTitle = view.findViewById(R.id.tv_dialog_list_data_title); | ||||
| mTvCancel = view.findViewById(R.id.tv_dialog_photo_cancel); | mTvCancel = view.findViewById(R.id.tv_dialog_photo_cancel); | ||||
| rv_dialog_list = view.findViewById(R.id.rv_dialog_list); | rv_dialog_list = view.findViewById(R.id.rv_dialog_list); | ||||
| tv_dialog_list_data_hint = view.findViewById(R.id.tv_dialog_list_data_hint); | |||||
| rv_dialog_list.setLayoutManager(new LinearLayoutManager(mContext)); | rv_dialog_list.setLayoutManager(new LinearLayoutManager(mContext)); | ||||
| rv_dialog_list.addItemDecoration(new MyItemDecoration(mContext, | |||||
| LinearLayoutManager.VERTICAL, 1, | |||||
| mContext.getResources().getColor(R.color.public_press_bg))); | |||||
| rv_dialog_list.addItemDecoration(new MyItemDecoration(mContext, LinearLayoutManager.VERTICAL, 1, mContext.getResources() | |||||
| .getColor(R.color.public_press_bg))); | |||||
| } | } | ||||
| */ | */ | ||||
| private void initData(ArrayList<DialogStringImageBean> list, CharSequence title, CharSequence cancel, int cancelColor) { | private void initData(ArrayList<DialogStringImageBean> list, CharSequence title, CharSequence cancel, int cancelColor) { | ||||
| if (mList == null) | |||||
| if (mList == null) { | |||||
| mList = new ArrayList<>(); | mList = new ArrayList<>(); | ||||
| } | |||||
| mAdapter = new DialogStringImageAdapter(mContext, mList, position -> { | mAdapter = new DialogStringImageAdapter(mContext, mList, position -> { | ||||
| if (mOnDialogListener != null) { | if (mOnDialogListener != null) { | ||||
| //item点击事件 | //item点击事件 | ||||
| } else if (mCancel == null) { | } else if (mCancel == null) { | ||||
| mTvCancel.setVisibility(View.GONE); | mTvCancel.setVisibility(View.GONE); | ||||
| } | } | ||||
| if (mCancelColor != 0) | |||||
| if (mCancelColor != 0) { | |||||
| mTvCancel.setTextColor(mCancelColor); | mTvCancel.setTextColor(mCancelColor); | ||||
| } | |||||
| } | } | ||||
| public ShowListDialogFragment setList(List<DialogStringImageBean> list) { | public ShowListDialogFragment setList(List<DialogStringImageBean> list) { | ||||
| if (mList == null) { | if (mList == null) { | ||||
| mList = new ArrayList<>(); | mList = new ArrayList<>(); | ||||
| mList.addAll(list); | |||||
| } | } | ||||
| if (mAdapter != null) | |||||
| mList.clear(); | |||||
| mList.addAll(list); | |||||
| if (tv_dialog_list_data_hint != null) { | |||||
| if (mList.size() == 0) { | |||||
| tv_dialog_list_data_hint.setVisibility(View.VISIBLE); | |||||
| } else { | |||||
| tv_dialog_list_data_hint.setVisibility(View.GONE); | |||||
| } | |||||
| } | |||||
| if (mAdapter != null) { | |||||
| mAdapter.notifyDataSetChanged(); | mAdapter.notifyDataSetChanged(); | ||||
| } | |||||
| return this; | return this; | ||||
| } | } | ||||
| public void onClick(View v) { | public void onClick(View v) { | ||||
| int i = v.getId(); | int i = v.getId(); | ||||
| if (i == R.id.tv_dialog_photo_cancel) { | if (i == R.id.tv_dialog_photo_cancel) { | ||||
| if (mOnDialogListener != null) | |||||
| if (mOnDialogListener != null) { | |||||
| mOnDialogListener.onCancelListener(v); | mOnDialogListener.onCancelListener(v); | ||||
| } | |||||
| dismiss(); | dismiss(); | ||||
| } | } | ||||
| } | } | ||||
| mShow = true; | mShow = true; | ||||
| } | } | ||||
| } catch (Exception e) { | } catch (Exception e) { | ||||
| L.e(TAG, "显示异常"); | |||||
| e.printStackTrace(); | e.printStackTrace(); | ||||
| } | } | ||||
| } | } | ||||
| mShow = false; | mShow = false; | ||||
| super.dismiss(); | super.dismiss(); | ||||
| } catch (Exception e) { | } catch (Exception e) { | ||||
| L.e(TAG, "关闭异常"); | |||||
| e.printStackTrace(); | e.printStackTrace(); | ||||
| } | } | ||||
| } | } |
| * | * | ||||
| * @author xing | * @author xing | ||||
| */ | */ | ||||
| public class BleDemoActivity extends BleBaseActivity { | |||||
| public class BleDemoActivity extends BleBaseActivity { | |||||
| private ListView list_view; | private ListView list_view; | ||||
| public SendBleBean checkWiFiState() { | public SendBleBean checkWiFiState() { | ||||
| byte[] bytes = new byte[1]; | byte[] bytes = new byte[1]; | ||||
| bytes[0] = 0x26; | bytes[0] = 0x26; | ||||
| return getSendBleBeam(bytes); | |||||
| return getSendBleBean(bytes); | |||||
| } | } | ||||
| byte[] bytes = new byte[2]; | byte[] bytes = new byte[2]; | ||||
| bytes[0] = (byte) CmdConfig.GET_SCAN_WIFI_RESULT; | bytes[0] = (byte) CmdConfig.GET_SCAN_WIFI_RESULT; | ||||
| bytes[1] = 0x01; | bytes[1] = 0x01; | ||||
| return getSendBleBeam(bytes); | |||||
| return getSendBleBean(bytes); | |||||
| } | } | ||||
| public SendBleBean getSnDeviceId() { | public SendBleBean getSnDeviceId() { | ||||
| byte[] bytes = new byte[1]; | byte[] bytes = new byte[1]; | ||||
| bytes[0] = (byte) 0x93; | bytes[0] = (byte) 0x93; | ||||
| return getSendBleBeam(bytes); | |||||
| return getSendBleBean(bytes); | |||||
| } | } | ||||
| public SendBleBean setWifiMac(String mac) { | public SendBleBean setWifiMac(String mac) { | ||||
| bytes[0] = (byte) CmdConfig.SET_WIFI_MAC; | bytes[0] = (byte) CmdConfig.SET_WIFI_MAC; | ||||
| String[] s = mac.split(":"); | String[] s = mac.split(":"); | ||||
| for (int i = 0; i < s.length; i++) { | for (int i = 0; i < s.length; i++) { | ||||
| bytes[i + 1] = (byte) Integer.parseInt(s[i]); | |||||
| bytes[i + 1] = (byte) Integer.parseInt(s[s.length -1 - i], 16); | |||||
| } | } | ||||
| return getSendBleBeam(bytes); | |||||
| return getSendBleBean(bytes); | |||||
| } | } | ||||
| bytes1 = new byte[1]; | bytes1 = new byte[1]; | ||||
| bytes1[0] = (byte) 0x86; | bytes1[0] = (byte) 0x86; | ||||
| } | } | ||||
| return getSendBleBeam(bytes1); | |||||
| return getSendBleBean(bytes1); | |||||
| } | } | ||||
| byte[] bytes = new byte[2]; | byte[] bytes = new byte[2]; | ||||
| bytes[0] = (byte) CmdConfig.DIS_OR_CON_WIFI; | bytes[0] = (byte) CmdConfig.DIS_OR_CON_WIFI; | ||||
| bytes[1] = 0x01; | bytes[1] = 0x01; | ||||
| return getSendBleBeam(bytes); | |||||
| return getSendBleBean(bytes); | |||||
| } | } | ||||
| /** | /** | ||||
| byte[] bytes = new byte[2]; | byte[] bytes = new byte[2]; | ||||
| bytes[0] = (byte) CmdConfig.DIS_OR_CON_WIFI; | bytes[0] = (byte) CmdConfig.DIS_OR_CON_WIFI; | ||||
| bytes[1] = 0x00; | bytes[1] = 0x00; | ||||
| return getSendBleBeam(bytes); | |||||
| return getSendBleBean(bytes); | |||||
| } | } | ||||
| /** | /** | ||||
| public SendBleBean getConnectWifiName() { | public SendBleBean getConnectWifiName() { | ||||
| byte[] bytes = new byte[1]; | byte[] bytes = new byte[1]; | ||||
| bytes[0] = (byte) CmdConfig.GET_WIFI_NAME; | bytes[0] = (byte) CmdConfig.GET_WIFI_NAME; | ||||
| return getSendBleBeam(bytes); | |||||
| return getSendBleBean(bytes); | |||||
| } | } | ||||
| /** | /** | ||||
| public SendBleBean getConnectWifiPwd() { | public SendBleBean getConnectWifiPwd() { | ||||
| byte[] bytes = new byte[1]; | byte[] bytes = new byte[1]; | ||||
| bytes[0] = (byte) CmdConfig.GET_WIFI_PWD; | bytes[0] = (byte) CmdConfig.GET_WIFI_PWD; | ||||
| return getSendBleBeam(bytes); | |||||
| return getSendBleBean(bytes); | |||||
| } | } | ||||
| public SendBleBean reset() { | public SendBleBean reset() { | ||||
| byte[] bytes = new byte[2]; | byte[] bytes = new byte[2]; | ||||
| bytes[0] = 0x22; | bytes[0] = 0x22; | ||||
| bytes[1] = 0x01; | bytes[1] = 0x01; | ||||
| return getSendBleBeam(bytes); | |||||
| return getSendBleBean(bytes); | |||||
| } | } | ||||
| public SendBleBean checkIp() { | public SendBleBean checkIp() { | ||||
| byte[] bytes = new byte[1]; | byte[] bytes = new byte[1]; | ||||
| bytes[0] = (byte) 0x8c; | bytes[0] = (byte) 0x8c; | ||||
| return getSendBleBeam(bytes); | |||||
| return getSendBleBean(bytes); | |||||
| } | } | ||||
| public SendBleBean checkPort() { | public SendBleBean checkPort() { | ||||
| byte[] bytes = new byte[1]; | byte[] bytes = new byte[1]; | ||||
| bytes[0] = (byte) 0x8e; | bytes[0] = (byte) 0x8e; | ||||
| return getSendBleBeam(bytes); | |||||
| return getSendBleBean(bytes); | |||||
| } | } | ||||
| public SendBleBean checkUrl() { | public SendBleBean checkUrl() { | ||||
| byte[] bytes = new byte[1]; | byte[] bytes = new byte[1]; | ||||
| bytes[0] = (byte) 0x97; | bytes[0] = (byte) 0x97; | ||||
| return getSendBleBeam(bytes); | |||||
| return getSendBleBean(bytes); | |||||
| } | } | ||||
| bytes1[0] = (byte) 0x8b; | bytes1[0] = (byte) 0x8b; | ||||
| } | } | ||||
| return getSendBleBeam(bytes1); | |||||
| return getSendBleBean(bytes1); | |||||
| } | } | ||||
| bytes1[0] = (byte) 0x8d; | bytes1[0] = (byte) 0x8d; | ||||
| bytes1[1] = (byte) (port >> 8); | bytes1[1] = (byte) (port >> 8); | ||||
| bytes1[2] = (byte) (port & 0xff); | bytes1[2] = (byte) (port & 0xff); | ||||
| return getSendBleBeam(bytes1); | |||||
| return getSendBleBean(bytes1); | |||||
| } | } | ||||
| bytes1[0] = (byte) 0x96; | bytes1[0] = (byte) 0x96; | ||||
| } | } | ||||
| return getSendBleBeam(bytes1); | |||||
| return getSendBleBean(bytes1); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| private SendBleBean getSendBleBeam(byte[] bytes) { | |||||
| private SendBleBean getSendBleBean(byte[] bytes) { | |||||
| SendBleBean sendBleBean = new SendBleBean(); | SendBleBean sendBleBean = new SendBleBean(); | ||||
| sendBleBean.setHex(bytes); | sendBleBean.setHex(bytes); | ||||
| return sendBleBean; | return sendBleBean; |
| package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.barometric_temp_humidity; | |||||
| import android.app.AlertDialog; | |||||
| import android.os.Bundle; | |||||
| import android.text.TextUtils; | |||||
| import android.view.View; | |||||
| import android.widget.ArrayAdapter; | |||||
| import android.widget.EditText; | |||||
| import android.widget.ListView; | |||||
| import androidx.annotation.Nullable; | |||||
| import androidx.lifecycle.Lifecycle; | |||||
| import androidx.recyclerview.widget.LinearLayoutManager; | |||||
| import androidx.recyclerview.widget.RecyclerView; | |||||
| import com.pingwang.bluetoothlib.AILinkBleManager; | |||||
| import com.pingwang.bluetoothlib.device.BleDevice; | |||||
| import com.pingwang.bluetoothlib.listener.OnCallbackBle; | |||||
| import com.pingwang.bluetoothlib.utils.BleLog; | |||||
| import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||||
| import java.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.config.BleDeviceConfig; | |||||
| import cn.net.aicare.modulelibrary.module.BoraTempHumidity.BarometricTempHumidityBleData; | |||||
| import cn.net.aicare.modulelibrary.module.BoraTempHumidity.BleSendUtils; | |||||
| /** | |||||
| * @author yesp | |||||
| */ | |||||
| public class BarometricTempHygrometerActivity extends BleNewBaseActivity implements BarometricTempHumidityBleData.BaroTempHygrometerListener, | |||||
| OnCallbackBle, BarometricTempHumidityBleData.LogInterface { | |||||
| private static final String TAG = "BarometricTempHygrometerActivity"; | |||||
| private BarometricTempHumidityBleData mBarometricTempHumidityBleData; | |||||
| private String mAddress; | |||||
| private ListView lvLogs; | |||||
| private List<String> mLogList; | |||||
| private ArrayAdapter<String> listAdapter; | |||||
| private RecyclerView rvInstruction; | |||||
| private InstructionAdapter mInstructionAdapter; | |||||
| private List<String> mHistoryList; | |||||
| private EditText etTime; | |||||
| @Override | |||||
| protected void onCreate(@Nullable Bundle savedInstanceState) { | |||||
| super.onCreate(savedInstanceState); | |||||
| setContentView(R.layout.activity_barometric_temp_humidity); | |||||
| initView(); | |||||
| } | |||||
| private void initView() { | |||||
| lvLogs = findViewById(R.id.lv_log); | |||||
| mLogList = new ArrayList<>(); | |||||
| listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mLogList); | |||||
| lvLogs.setAdapter(listAdapter); | |||||
| mHistoryList = new ArrayList<>(); | |||||
| rvInstruction = findViewById(R.id.rv_inst); | |||||
| rvInstruction.setLayoutManager(new LinearLayoutManager(this)); | |||||
| mInstructionAdapter = new InstructionAdapter(this, getInstructionList()); | |||||
| rvInstruction.setAdapter(mInstructionAdapter); | |||||
| mInstructionAdapter.setItemClickListener(this::sendInstruction); | |||||
| etTime = findViewById(R.id.et_time); | |||||
| } | |||||
| public static ArrayList<InstructionBean> getInstructionList() { | |||||
| ArrayList<InstructionBean> list = new ArrayList<>(); | |||||
| list.add(new InstructionBean(0, "获取支持功能")); | |||||
| list.add(new InstructionBean(1, "获取设备状态")); | |||||
| list.add(new InstructionBean(2, "设置设备变化阀值: 1℃, 1% , 10hpa")); | |||||
| list.add(new InstructionBean(3, "设置设备变化阀值: 2℃, 2% , 20hpa")); | |||||
| list.add(new InstructionBean(4, "读取设备的历史数据: time - 0")); | |||||
| list.add(new InstructionBean(5, "读取设备的历史数据: 自定义time")); | |||||
| list.add(new InstructionBean(6, "发下一组离线数据")); | |||||
| list.add(new InstructionBean(7, "离线数据接收完毕")); | |||||
| list.add(new InstructionBean(8, "设置采样频率(10s),保存频率(20s), 间隔(2s)")); | |||||
| list.add(new InstructionBean(9, "设置采样频率(自定义)")); | |||||
| list.add(new InstructionBean(10, "读取校准值")); | |||||
| list.add(new InstructionBean(11, "设置校准值: +1℃, +1% , +10hpa")); | |||||
| list.add(new InstructionBean(12, "设置校准值: -1℃, -1% , -10hpa")); | |||||
| list.add(new InstructionBean(13, "开始寻物")); | |||||
| list.add(new InstructionBean(14, "停止寻物")); | |||||
| list.add(new InstructionBean(15, "读取蜂鸣器状态")); | |||||
| list.add(new InstructionBean(16, "设置蜂鸣器-开")); | |||||
| list.add(new InstructionBean(17, "设置蜂鸣器-关")); | |||||
| list.add(new InstructionBean(18, "绑定设备")); | |||||
| return list; | |||||
| } | |||||
| private void sendInstruction(InstructionBean bean) { | |||||
| if (bean == null || mBarometricTempHumidityBleData == null) { | |||||
| return; | |||||
| } | |||||
| byte[] sendBytes = null; | |||||
| switch (bean.getIndex()) { | |||||
| case 0: | |||||
| sendBytes = BleSendUtils.getSupportFunction(); | |||||
| break; | |||||
| case 1: | |||||
| sendBytes = BleSendUtils.getDeviceStatus(); | |||||
| break; | |||||
| case 2: | |||||
| sendBytes = BleSendUtils.setThreshold(10, 10, 10); | |||||
| break; | |||||
| case 3: | |||||
| sendBytes = BleSendUtils.setThreshold(20, 20, 20); | |||||
| break; | |||||
| case 4: | |||||
| sendBytes = BleSendUtils.getOfflineRecord(0); | |||||
| break; | |||||
| case 5: | |||||
| String time = etTime.getText().toString().trim(); | |||||
| if (TextUtils.isEmpty(time)) { | |||||
| addLog("请在顶部输入时间"); | |||||
| return; | |||||
| } else { | |||||
| sendBytes = BleSendUtils.getOfflineRecord(Long.parseLong(time)); | |||||
| } | |||||
| break; | |||||
| case 6: | |||||
| sendBytes = BleSendUtils.sendOfflineStatus(1); | |||||
| break; | |||||
| case 7: | |||||
| sendBytes = BleSendUtils.sendOfflineStatus(0); | |||||
| break; | |||||
| case 8: | |||||
| sendBytes = BleSendUtils.setFrequency(5, 10, 20); | |||||
| break; | |||||
| case 9: | |||||
| EditParamsDialog dialog = EditParamsDialog.newInstance(); | |||||
| dialog.setOnDialogListener(new EditParamsDialog.OnDialogListener() { | |||||
| @Override | |||||
| public void tvCancelListener(View v) { | |||||
| } | |||||
| @Override | |||||
| public void tvSucceedListener(View v, int value1, int value2, int value3) { | |||||
| byte[] sendBytesT = BleSendUtils.setFrequency(value1, value2, value3); | |||||
| mBarometricTempHumidityBleData.sendDataA7(sendBytesT); | |||||
| addLog(bean.getName() + ", 发送的 payload 数据:\n" + BleStrUtils.byte2HexStr(sendBytesT)); | |||||
| } | |||||
| }); | |||||
| dialog.show(getSupportFragmentManager()); | |||||
| break; | |||||
| case 10: | |||||
| sendBytes = BleSendUtils.getCalibration(); | |||||
| break; | |||||
| case 11: | |||||
| sendBytes = BleSendUtils.setCalibration(10, 10, 10); | |||||
| break; | |||||
| case 12: | |||||
| sendBytes = BleSendUtils.setCalibration(-10, -10, -10); | |||||
| break; | |||||
| case 13: | |||||
| sendBytes = BleSendUtils.findDevice(0); | |||||
| break; | |||||
| case 14: | |||||
| sendBytes = BleSendUtils.findDevice(1); | |||||
| break; | |||||
| case 15: | |||||
| sendBytes = BleSendUtils.getSound(); | |||||
| break; | |||||
| case 16: | |||||
| sendBytes = BleSendUtils.setSound(true); | |||||
| break; | |||||
| case 17: | |||||
| sendBytes = BleSendUtils.setSound(false); | |||||
| break; | |||||
| case 18: | |||||
| sendBytes = BleSendUtils.startBindDevice(); | |||||
| break; | |||||
| default: | |||||
| break; | |||||
| } | |||||
| if (sendBytes != null) { | |||||
| mBarometricTempHumidityBleData.sendDataA7(sendBytes); | |||||
| addLog(bean.getName() + ", 发送的 payload 数据:\n" + BleStrUtils.byte2HexStr(sendBytes)); | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public void onServiceSuccess() { | |||||
| if (AILinkBleManager.getInstance() != null) { | |||||
| mAddress = getIntent().getStringExtra("mac"); | |||||
| AILinkBleManager.getInstance().setOnCallbackBle(this); | |||||
| BleDevice bleDevice = AILinkBleManager.getInstance().getBleDevice(mAddress); | |||||
| BarometricTempHumidityBleData.init(bleDevice, BleDeviceConfig.BAROMETRIC_TEMP_HUMIDITY); | |||||
| mBarometricTempHumidityBleData = BarometricTempHumidityBleData.getInstance(); | |||||
| mBarometricTempHumidityBleData.setBaroTempHygrometerListener(this); | |||||
| mBarometricTempHumidityBleData.setLogInterface(this); | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public void onDisConnected(String mac, int code) { | |||||
| if (mac.equals(mAddress) && getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) { | |||||
| BleLog.i(TAG, "设备断开连接,请退出重新连接"); | |||||
| new AlertDialog.Builder(this) | |||||
| .setTitle("ERROR:") | |||||
| .setMessage("\n" + "设备断开连接,请退出重新连接") | |||||
| .setPositiveButton("确认", (dialog, which) -> finish()) | |||||
| .show(); | |||||
| } | |||||
| } | |||||
| private void addLog(String str) { | |||||
| mLogList.add(str); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| lvLogs.smoothScrollToPosition(listAdapter.getCount() - 1); | |||||
| } | |||||
| private void addLog(List<String> strList) { | |||||
| mLogList.addAll(strList); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| lvLogs.smoothScrollToPosition(listAdapter.getCount() - 1); | |||||
| } | |||||
| @Override | |||||
| public void onServiceErr() { | |||||
| } | |||||
| @Override | |||||
| public void unbindServices() { | |||||
| AILinkBleManager.getInstance().disconnect(mAddress); | |||||
| if (mBarometricTempHumidityBleData != null) { | |||||
| mBarometricTempHumidityBleData.clear(); | |||||
| mBarometricTempHumidityBleData = null; | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public void onDeviceStatus(int battery, long time, int temp, int humidity, int barometric) { | |||||
| addLog("当前设备状态:电量:" + battery + ", 开机时间:" + time + ", 温度:" + temp / 10f + "℃, 湿度:" + humidity / 10 + "%, 气压:" + barometric); | |||||
| } | |||||
| @Override | |||||
| public void onFunctionList(int calibration, int buzzerAlarm, int alarmFunction, int reportPunctually, int nightLight, int bgLight, int findDevice, byte[] bytes) { | |||||
| addLog("当前支持功能:气压温湿度校准:" + (calibration == 1) + | |||||
| ", \n蜂鸣器报警:" + (buzzerAlarm == 1) + | |||||
| ", \n闹钟功能:" + (alarmFunction == 1) + | |||||
| ", \n整点报时:" + (reportPunctually == 1) + | |||||
| ", \n小夜灯:" + (nightLight == 1) + | |||||
| ", \n背光亮度:" + (bgLight == 1) + | |||||
| ", \n寻物功能:" + (findDevice == 1)); | |||||
| } | |||||
| @Override | |||||
| public void onOffLineRecordNum(long total, long sendNum) { | |||||
| addLog("离线记录总数: " + "总数:" + total + ", 已发数量:" + sendNum); | |||||
| addLog(mHistoryList); | |||||
| mHistoryList.clear(); | |||||
| } | |||||
| @Override | |||||
| public void onOffLineRecord(long time, int temp, int humidity, int barometric) { | |||||
| mHistoryList.add("离线记录:" + "时间:" + time + ", 温度:" + temp / 10f + "℃, 湿度:" + humidity / 10f + "%, 气压:" + barometric + "hpa"); | |||||
| } | |||||
| @Override | |||||
| public void onVersion(String version) { | |||||
| } | |||||
| @Override | |||||
| public void onThreshold(int tempT, int humidityT, int barometricT) { | |||||
| addLog("当前设备变化阀值:" + "温度:" + tempT / 10f + "℃, 湿度:" + humidityT / 10f + "%, 气压:" + barometricT + "hpa"); | |||||
| } | |||||
| @Override | |||||
| public void onFrequency(int samplingFrequency, int saveFrequency, int timerInterval) { | |||||
| int interval = timerInterval * 100; | |||||
| addLog("当前频率:" + "采样频率:" + samplingFrequency * interval + "ms, 保存频率:" + saveFrequency * interval + "ms, 设备定时器间隔:" + interval + "ms"); | |||||
| } | |||||
| @Override | |||||
| public void onFindDevice(int status) { | |||||
| String result; | |||||
| if (status == 0) { | |||||
| result = "正在报警"; | |||||
| } else if (status == 1) { | |||||
| result = "停止报警"; | |||||
| } else { | |||||
| result = "未知"; | |||||
| } | |||||
| addLog("寻物状态:" + result); | |||||
| } | |||||
| @Override | |||||
| public void onBuzzer(boolean isOpen) { | |||||
| addLog("蜂鸣器状态:" + (isOpen ? "开" : "关")); | |||||
| } | |||||
| @Override | |||||
| public void onCalibration(int tempCal, int humidityCal, int barometricCal) { | |||||
| addLog("当前校准值:" + "温度:" + tempCal / 10f + "℃, 湿度:" + humidityCal / 10f + "%, 气压:" + barometricCal + "hpa"); | |||||
| } | |||||
| @Override | |||||
| public void onBindStatus(boolean success) { | |||||
| addLog("绑定设备结果:" + (success ? "成功" : "失败")); | |||||
| } | |||||
| @Override | |||||
| public void onLog(byte[] bytes) { | |||||
| addLog("接收到的 payload 数据:" + BleStrUtils.byte2HexStr(bytes)); | |||||
| } | |||||
| } |
| package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.barometric_temp_humidity; | |||||
| import android.app.Dialog; | |||||
| import android.content.Context; | |||||
| import android.content.DialogInterface; | |||||
| import android.content.Intent; | |||||
| import android.os.Bundle; | |||||
| import android.view.KeyEvent; | |||||
| import android.view.LayoutInflater; | |||||
| import android.view.View; | |||||
| import android.view.ViewGroup; | |||||
| import android.widget.EditText; | |||||
| import android.widget.TextView; | |||||
| import android.widget.Toast; | |||||
| import androidx.annotation.NonNull; | |||||
| import androidx.annotation.Nullable; | |||||
| import androidx.fragment.app.DialogFragment; | |||||
| import androidx.fragment.app.FragmentManager; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||||
| public class EditParamsDialog extends DialogFragment implements View.OnClickListener { | |||||
| /** | |||||
| * 是否显示 | |||||
| */ | |||||
| private EditText etContent1, etContent2, etContent3; | |||||
| private TextView mTvCancel, mTvSucceed; | |||||
| private boolean mShow; | |||||
| private boolean mCancelBlank; | |||||
| private Context mContext; | |||||
| private OnDialogListener mOnDialogListener; | |||||
| public static EditParamsDialog newInstance() { | |||||
| return new EditParamsDialog(); | |||||
| } | |||||
| @NonNull | |||||
| @Override | |||||
| public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { | |||||
| Dialog dialogView = new Dialog(requireContext(), R.style.MyDialog);// 创建自定义样式dialog | |||||
| dialogView.setCancelable(false);//设置是否可以关闭 | |||||
| dialogView.setCanceledOnTouchOutside(mCancelBlank);//设置点击空白处是否可以取消 | |||||
| dialogView.setOnKeyListener((dialog, keyCode, event) -> { | |||||
| if (mCancelBlank) { | |||||
| return false; | |||||
| } else { | |||||
| //返回不关闭 | |||||
| return keyCode == KeyEvent.KEYCODE_BACK; | |||||
| } | |||||
| }); | |||||
| return dialogView; | |||||
| } | |||||
| @Nullable | |||||
| @Override | |||||
| public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { | |||||
| return inflater.inflate(R.layout.dialog_edit_params, container); | |||||
| } | |||||
| @Override | |||||
| public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { | |||||
| super.onViewCreated(view, savedInstanceState); | |||||
| mContext = view.getContext(); | |||||
| init(view); | |||||
| } | |||||
| @Override | |||||
| public void onActivityResult(int requestCode, int resultCode, Intent data) { | |||||
| super.onActivityResult(requestCode, resultCode, data); | |||||
| } | |||||
| private void init(View view) { | |||||
| etContent1 = view.findViewById(R.id.et_context1); | |||||
| etContent2 = view.findViewById(R.id.et_context2); | |||||
| etContent3 = view.findViewById(R.id.et_context3); | |||||
| mTvCancel = view.findViewById(R.id.tv_cancel); | |||||
| mTvSucceed = view.findViewById(R.id.tv_ok); | |||||
| mTvCancel.setOnClickListener(this); | |||||
| mTvSucceed.setOnClickListener(this); | |||||
| } | |||||
| @Override | |||||
| public void onClick(View v) { | |||||
| int i = v.getId(); | |||||
| if (i == R.id.tv_cancel) { | |||||
| if (mOnDialogListener != null) { | |||||
| mOnDialogListener.tvCancelListener(v); | |||||
| } | |||||
| dismiss(); | |||||
| } else if (i == R.id.tv_ok) { | |||||
| if (mOnDialogListener != null) { | |||||
| String content1 = etContent1.getText().toString().trim(); | |||||
| String content2 = etContent2.getText().toString().trim(); | |||||
| String content3 = etContent3.getText().toString().trim(); | |||||
| int value1 = 1; | |||||
| int value2 = 30; | |||||
| int value3 = 20; | |||||
| try { | |||||
| value1 = Integer.parseInt(content1); | |||||
| if (value1 > 10 || value1 < 1) { | |||||
| Toast.makeText(mContext, "采样频率输入有误", Toast.LENGTH_SHORT).show(); | |||||
| return; | |||||
| } | |||||
| } catch (NumberFormatException e) { | |||||
| Toast.makeText(mContext, "采样频率输入有误", Toast.LENGTH_SHORT).show(); | |||||
| return; | |||||
| } | |||||
| try { | |||||
| value2 = Integer.parseInt(content2); | |||||
| if (value2 > 60 || value2 < 1) { | |||||
| Toast.makeText(mContext, "保存频率输入有误", Toast.LENGTH_SHORT).show(); | |||||
| return; | |||||
| } | |||||
| } catch (NumberFormatException e) { | |||||
| Toast.makeText(mContext, "保存频率输入有误", Toast.LENGTH_SHORT).show(); | |||||
| return; | |||||
| } | |||||
| try { | |||||
| value3 = Integer.parseInt(content3); | |||||
| if (value3 > 20 || value3 < 2) { | |||||
| Toast.makeText(mContext, "设备定时器间隔输入有误", Toast.LENGTH_SHORT).show(); | |||||
| return; | |||||
| } | |||||
| } catch (NumberFormatException e) { | |||||
| Toast.makeText(mContext, "设备定时器间隔输入有误", Toast.LENGTH_SHORT).show(); | |||||
| return; | |||||
| } | |||||
| mOnDialogListener.tvSucceedListener(v, value1, value2, value3); | |||||
| } | |||||
| dismiss(); | |||||
| } | |||||
| } | |||||
| public EditParamsDialog setOnDialogListener(OnDialogListener onDialogListener) { | |||||
| mOnDialogListener = onDialogListener; | |||||
| return this; | |||||
| } | |||||
| /** | |||||
| * 当前是否显示 | |||||
| */ | |||||
| public boolean isShow() { | |||||
| return mShow; | |||||
| } | |||||
| @Override | |||||
| public void show(@NonNull FragmentManager manager, @Nullable String tag) { | |||||
| try { | |||||
| if (!mShow) { | |||||
| super.show(manager, tag); | |||||
| mShow = true; | |||||
| } | |||||
| } catch (Exception e) { | |||||
| e.printStackTrace(); | |||||
| } | |||||
| } | |||||
| public void show(@NonNull FragmentManager manager) { | |||||
| this.show(manager, "DialogFragment"); | |||||
| } | |||||
| @Override | |||||
| public void onDismiss(@NonNull DialogInterface dialog) { | |||||
| super.onDismiss(dialog); | |||||
| mShow = false; | |||||
| } | |||||
| @Override | |||||
| public void dismiss() { | |||||
| try { | |||||
| mShow = false; | |||||
| super.dismiss(); | |||||
| } catch (Exception e) { | |||||
| e.printStackTrace(); | |||||
| } | |||||
| } | |||||
| public interface OnDialogListener { | |||||
| /** | |||||
| * 取消的点击事件 | |||||
| */ | |||||
| default void tvCancelListener(View v) { | |||||
| } | |||||
| /** | |||||
| * 成功的点击事件 | |||||
| */ | |||||
| default void tvSucceedListener(View v, int value1, int value2, int value3) { | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public void onDestroyView() { | |||||
| super.onDestroyView(); | |||||
| mShow = false; | |||||
| } | |||||
| } |
| package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.barometric_temp_humidity; | |||||
| import android.content.Context; | |||||
| import android.view.LayoutInflater; | |||||
| import android.view.View; | |||||
| import android.view.ViewGroup; | |||||
| import android.widget.TextView; | |||||
| import androidx.annotation.NonNull; | |||||
| import androidx.recyclerview.widget.RecyclerView; | |||||
| import java.util.ArrayList; | |||||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||||
| /** | |||||
| * 指令 adapter | |||||
| * | |||||
| * @author yesp | |||||
| */ | |||||
| public class InstructionAdapter extends RecyclerView.Adapter<InstructionAdapter.ViewHolder> { | |||||
| private Context context; | |||||
| private ArrayList<InstructionBean> list; | |||||
| private ItemClickListener itemClickListener; | |||||
| public InstructionAdapter(Context context, ArrayList<InstructionBean> list) { | |||||
| this.context = context; | |||||
| this.list = list; | |||||
| } | |||||
| public void setList(ArrayList<InstructionBean> list) { | |||||
| this.list = list; | |||||
| } | |||||
| public void setItemClickListener(ItemClickListener itemClickListener) { | |||||
| this.itemClickListener = itemClickListener; | |||||
| } | |||||
| @NonNull | |||||
| @Override | |||||
| public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { | |||||
| ViewHolder holder = new ViewHolder(LayoutInflater.from(context).inflate(R.layout.item_instruction, parent, false)); | |||||
| holder.itemView.setOnClickListener(v -> { | |||||
| if (itemClickListener != null) { | |||||
| int position = holder.getAdapterPosition(); | |||||
| if (position < 0 || position >= list.size()) { | |||||
| return; | |||||
| } | |||||
| itemClickListener.onItemClick(list.get(position)); | |||||
| } | |||||
| }); | |||||
| return holder; | |||||
| } | |||||
| @Override | |||||
| public void onBindViewHolder(@NonNull ViewHolder holder, int position) { | |||||
| InstructionBean bean = list.get(position); | |||||
| if (bean == null) { | |||||
| return; | |||||
| } | |||||
| String content = bean.getName(); | |||||
| holder.tvContent.setText(content); | |||||
| } | |||||
| @Override | |||||
| public int getItemCount() { | |||||
| return list != null ? list.size() : 0; | |||||
| } | |||||
| public class ViewHolder extends RecyclerView.ViewHolder { | |||||
| private TextView tvContent; | |||||
| public ViewHolder(@NonNull View itemView) { | |||||
| super(itemView); | |||||
| tvContent = itemView.findViewById(R.id.tv_content); | |||||
| } | |||||
| } | |||||
| public interface ItemClickListener { | |||||
| /** | |||||
| * item 点击 | |||||
| * | |||||
| * @param bean bean | |||||
| */ | |||||
| void onItemClick(InstructionBean bean); | |||||
| } | |||||
| } |
| package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.barometric_temp_humidity; | |||||
| public class InstructionBean { | |||||
| private int index; | |||||
| private String name; | |||||
| public InstructionBean(int index, String name) { | |||||
| this.index = index; | |||||
| this.name = name; | |||||
| } | |||||
| public int getIndex() { | |||||
| return index; | |||||
| } | |||||
| public void setIndex(int index) { | |||||
| this.index = index; | |||||
| } | |||||
| public String getName() { | |||||
| return name; | |||||
| } | |||||
| public void setName(String name) { | |||||
| this.name = name; | |||||
| } | |||||
| } |
| int vid = bleValueBean.getVid(); | int vid = bleValueBean.getVid(); | ||||
| int pid = bleValueBean.getPid(); | int pid = bleValueBean.getPid(); | ||||
| if (mDevice != null) { | if (mDevice != null) { | ||||
| mDevice.onNotifyData(bleValueBean.getManufacturerData(), cid, vid, pid); | |||||
| mDevice.onNotifyData(bleValueBean.getManufacturerData(),payload, cid, vid, pid); | |||||
| } | } | ||||
| } | } | ||||
| } | } |
| */ | */ | ||||
| private void cancelDialog() { | private void cancelDialog() { | ||||
| ShowListDialogFragment.newInstance().setTitle("选择探针").setCancel("取消", 0).setCancelBlank(true).setBackground(true).setBottom(false).setList(mDialogMacList) | ShowListDialogFragment.newInstance().setTitle("选择探针").setCancel("取消", 0).setCancelBlank(true).setBackground(true).setBottom(false).setList(mDialogMacList) | ||||
| .setOnDialogListener(new ShowListDialogFragment.onDialogListener() { | |||||
| .setOnDialogListener(new ShowListDialogFragment.onDialogListener() { | |||||
| @Override | @Override | ||||
| public void onItemListener(int position) { | public void onItemListener(int position) { | ||||
| Toast.makeText(MeatProbeChargerActivity.this, mDialogMacList.get(position).getName() + "设置该指令", Toast.LENGTH_SHORT).show(); | Toast.makeText(MeatProbeChargerActivity.this, mDialogMacList.get(position).getName() + "设置该指令", Toast.LENGTH_SHORT).show(); |
| private void refreshLog(String content) { | private void refreshLog(String content) { | ||||
| if (!isPauseLog) { | if (!isPauseLog) { | ||||
| content=TimeUtils.getTime(System.currentTimeMillis())+content; | |||||
| content= TimeUtils.getTime(System.currentTimeMillis())+content; | |||||
| logList.add( content); | logList.add( content); | ||||
| mArrayAdapter.notifyDataSetChanged(); | mArrayAdapter.notifyDataSetChanged(); | ||||
| } | } |
| if (data.equals("") || data.length() > 8) { | if (data.equals("") || data.length() > 8) { | ||||
| dataPaw = data.trim(); | dataPaw = data.trim(); | ||||
| mToothBrushWiFiBleUtilsData.setWifimac(wifimacMap.get(selectWifi)); | |||||
| mToothBrushWiFiBleUtilsData.setWifiMac(wifimacMap.get(selectWifi)); | |||||
| } else { | } else { | ||||
| Toast.makeText(ToothBrushWifiBleActivity.this, "密码格式不对", Toast.LENGTH_SHORT).show(); | Toast.makeText(ToothBrushWifiBleActivity.this, "密码格式不对", Toast.LENGTH_SHORT).show(); | ||||
| } | } |
| import android.os.Looper; | import android.os.Looper; | ||||
| import android.os.Message; | import android.os.Message; | ||||
| import android.text.TextUtils; | import android.text.TextUtils; | ||||
| import android.view.View; | |||||
| import android.widget.Button; | import android.widget.Button; | ||||
| import android.widget.TextView; | import android.widget.TextView; | ||||
| recycler_view.setLayoutManager(new LinearLayoutManager(this)); | recycler_view.setLayoutManager(new LinearLayoutManager(this)); | ||||
| recycler_view.setAdapter(mAdapter); | recycler_view.setAdapter(mAdapter); | ||||
| mAdapter.setOnSelectListener(this); | mAdapter.setOnSelectListener(this); | ||||
| btn_toothbrush_prevent_splash_test = findViewById(R.id.btn_toothbrush_prevent_splash_test); | |||||
| btn_toothbrush_prevent_splash = findViewById(R.id.btn_toothbrush_prevent_splash); | |||||
| tv_toothbrush_status = findViewById(R.id.tv_toothbrush_status); | |||||
| tv_toothbrush_status.setTag(false); | |||||
| btn_toothbrush_prevent_splash_test.setOnClickListener(new View.OnClickListener() { | |||||
| @Override | |||||
| public void onClick(View v) { | |||||
| ToothBrushBleUtilsData.init(mBleDevice, new ToothBrushBleUtilsData.BleToothBrushCallback() { | |||||
| @Override | |||||
| public void onPreventSplash(boolean support, boolean status) { | |||||
| if (tv_toothbrush_status != null) { | |||||
| tv_toothbrush_status.setText("是否支持防飞溅:" + support + "\n防飞溅当前开关:" + status); | |||||
| tv_toothbrush_status.setTag(status); | |||||
| } | |||||
| } | |||||
| }); | |||||
| ToothBrushBleUtilsData.getInstance().getPreventSplash(); | |||||
| } | |||||
| }); | |||||
| btn_toothbrush_prevent_splash.setOnClickListener(new View.OnClickListener() { | |||||
| @Override | |||||
| public void onClick(View v) { | |||||
| ToothBrushBleUtilsData instance = ToothBrushBleUtilsData.getInstance(); | |||||
| if (instance != null) { | |||||
| boolean status = (boolean) tv_toothbrush_status.getTag(); | |||||
| instance.setPreventSplash(!status); | |||||
| } | |||||
| } | |||||
| }); | |||||
| } | } | ||||
| @Override | @Override |
| package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.wifible_sphy; | |||||
| import android.content.Context; | |||||
| import android.os.Bundle; | |||||
| import android.os.Handler; | |||||
| import android.os.Looper; | |||||
| import android.os.Message; | |||||
| import android.text.TextUtils; | |||||
| import android.view.View; | |||||
| import android.widget.ArrayAdapter; | |||||
| import android.widget.Button; | |||||
| import android.widget.EditText; | |||||
| import android.widget.ListView; | |||||
| import android.widget.TextView; | |||||
| import androidx.annotation.NonNull; | |||||
| import androidx.annotation.Nullable; | |||||
| import com.pingwang.bluetoothlib.config.CmdConfig; | |||||
| import com.pingwang.bluetoothlib.device.BleDevice; | |||||
| import com.pingwang.bluetoothlib.device.BleSendCmdUtil; | |||||
| import com.pingwang.bluetoothlib.device.SendBleBean; | |||||
| import com.pingwang.bluetoothlib.listener.CallbackDisIm; | |||||
| import com.pingwang.bluetoothlib.listener.OnBleCompanyListener; | |||||
| import com.pingwang.bluetoothlib.listener.OnBleVersionListener; | |||||
| import com.pingwang.bluetoothlib.listener.OnCallbackDis; | |||||
| import com.pingwang.bluetoothlib.listener.OnMcuParameterListener; | |||||
| import com.pingwang.bluetoothlib.utils.BleDensityUtil; | |||||
| import com.pingwang.bluetoothlib.utils.BleLog; | |||||
| import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||||
| import 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.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 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; | |||||
| /** | |||||
| * wifi ble 血压计界面 | |||||
| * | |||||
| * @author xing | |||||
| * @date 2023/10/07 | |||||
| */ | |||||
| public class WifiBleSphyActivity extends BleBaseActivity implements OnCallbackDis, OnBleVersionListener, OnMcuParameterListener, OnBleCompanyListener, View.OnClickListener { | |||||
| private static String TAG = WifiBleSphyActivity.class.getName(); | |||||
| private final int REFRESH_DATA = 3; | |||||
| private List<String> mList; | |||||
| private ArrayAdapter listAdapter; | |||||
| private TextView tv_wifi_ssid, tv_wifi_status; | |||||
| private EditText et_url, et_port, et_path; | |||||
| private Context mContext; | |||||
| private SphyWifiBleDeviceData mSphyWifiBleDeviceData; | |||||
| private WifiBleDeviceData mWifiBleDeviceData; | |||||
| private List<DialogStringImageBean> mWifiList = new ArrayList<>(); | |||||
| private String mAddress; | |||||
| private BleSendCmdUtil mBleSendCmdUtil; | |||||
| private int mType; | |||||
| private int mCid; | |||||
| private byte unit = 0; | |||||
| private Handler mHandler = new Handler(Looper.getMainLooper()) { | |||||
| @Override | |||||
| public void handleMessage(Message msg) { | |||||
| if (msg.what == REFRESH_DATA) { | |||||
| if (listAdapter != null) | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| } | |||||
| } | |||||
| }; | |||||
| @Override | |||||
| protected void onCreate(@Nullable Bundle savedInstanceState) { | |||||
| super.onCreate(savedInstanceState); | |||||
| setContentView(R.layout.activity_sphy_wifi_ble); | |||||
| mContext = this; | |||||
| mAddress = getIntent().getStringExtra("mac"); | |||||
| mType = getIntent().getIntExtra("type", -1); | |||||
| 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); | |||||
| Button clear = findViewById(R.id.clear); | |||||
| clear.setOnClickListener(new View.OnClickListener() { | |||||
| @Override | |||||
| public void onClick(View v) { | |||||
| if (mList != null) | |||||
| mList.clear(); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| }); | |||||
| tv_wifi_ssid = findViewById(R.id.tv_wifi_ssid); | |||||
| tv_wifi_status = findViewById(R.id.tv_wifi_status); | |||||
| et_url = findViewById(R.id.et_url); | |||||
| et_port = findViewById(R.id.et_port); | |||||
| et_path = findViewById(R.id.et_path); | |||||
| findViewById(R.id.btnVersion).setOnClickListener(this); | |||||
| findViewById(R.id.btnBattery).setOnClickListener(this); | |||||
| findViewById(R.id.btn_get_did).setOnClickListener(this); | |||||
| findViewById(R.id.btn_voice).setOnClickListener(this); | |||||
| findViewById(R.id.clear).setOnClickListener(this); | |||||
| findViewById(R.id.btn_wifi).setOnClickListener(this); | |||||
| findViewById(R.id.btn_config).setOnClickListener(this); | |||||
| findViewById(R.id.btn_read_config).setOnClickListener(this); | |||||
| findViewById(R.id.btn_read_wifi_status).setOnClickListener(this); | |||||
| cmdBtn(); | |||||
| } | |||||
| private void cmdBtn() { | |||||
| Button btn_set_unit = findViewById(R.id.btn_set_unit); | |||||
| btn_set_unit.setOnClickListener(new View.OnClickListener() { | |||||
| @Override | |||||
| public void onClick(View v) { | |||||
| if (unit == SphyBleConfig.SPHY_UNIT_MMHG) { | |||||
| unit = SphyBleConfig.SPHY_UNIT_KPA; | |||||
| mSphyWifiBleDeviceData.setUnit(unit); | |||||
| } else { | |||||
| unit = SphyBleConfig.SPHY_UNIT_MMHG; | |||||
| mSphyWifiBleDeviceData.setUnit(unit); | |||||
| } | |||||
| } | |||||
| }); | |||||
| Button btn_start = findViewById(R.id.btn_start); | |||||
| btn_start.setOnClickListener(new View.OnClickListener() { | |||||
| @Override | |||||
| public void onClick(View v) { | |||||
| mSphyWifiBleDeviceData.startMeasuring(); | |||||
| } | |||||
| }); | |||||
| Button btn_stop = findViewById(R.id.btn_stop); | |||||
| btn_stop.setOnClickListener(new View.OnClickListener() { | |||||
| @Override | |||||
| public void onClick(View v) { | |||||
| mSphyWifiBleDeviceData.stopMeasuring(); | |||||
| } | |||||
| }); | |||||
| } | |||||
| private int mVoiceStatus = 0; | |||||
| @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; | |||||
| case R.id.clear: | |||||
| if (mList != null) | |||||
| mList.clear(); | |||||
| 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() + "配置服务器信息中..."); | |||||
| 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; | |||||
| } | |||||
| } | |||||
| /** | |||||
| * 获取wifi连接信息 | |||||
| */ | |||||
| public void getWifiConnectInfo() { | |||||
| if (mWifiBleDeviceData != null) { | |||||
| mWifiBleDeviceData.getIp(); | |||||
| mWifiBleDeviceData.getPort(); | |||||
| mWifiBleDeviceData.getPath(); | |||||
| mWifiBleDeviceData.getDeviceSn(); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * 设置服务信息 | |||||
| * | |||||
| * @param ip 知识产权 | |||||
| * @param port 港口 | |||||
| * @param path 路径 | |||||
| */ | |||||
| public void setServiceInfo(String ip, int port, String path) { | |||||
| if (mWifiBleDeviceData != null) { | |||||
| mWifiBleDeviceData.setServiceInfo(ip, port, path); | |||||
| } | |||||
| } | |||||
| 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()); | |||||
| } | |||||
| //-------------------BLE send--------------- | |||||
| /** | |||||
| * 设置连接wifi | |||||
| * | |||||
| * @param mac mac | |||||
| * @param pwd 密码 | |||||
| */ | |||||
| private void setConnectWifi(String mac, String pwd) { | |||||
| if (mWifiBleDeviceData != null) { | |||||
| mWifiBleDeviceData.setConnectWifiMac(mac, pwd); | |||||
| mList.add(TimeUtils.getTime() + "正在连接wifi..."); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| } | |||||
| //---------------------------------服务--------------------------------------------------- | |||||
| @Override | |||||
| public void onServiceSuccess() { | |||||
| CallbackDisIm.getInstance().addListListener(this); | |||||
| BleLog.i(TAG, "服务与界面建立连接成功"); | |||||
| //与服务建立连接 | |||||
| if (mBluetoothService != null) { | |||||
| BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress); | |||||
| if (bleDevice != null) { | |||||
| mSphyWifiBleDeviceData = SphyWifiBleDeviceData.getInstance(bleDevice); | |||||
| mWifiBleDeviceData = mSphyWifiBleDeviceData.getWifiBleDeviceData(); | |||||
| mWifiBleDeviceData.setOnWiFiBleCallback(new WifiBleDeviceListener()); | |||||
| mSphyWifiBleDeviceData.setType(mCid); | |||||
| mSphyWifiBleDeviceData.setOnNotifyData(new NotifyData()); | |||||
| mSphyWifiBleDeviceData.setOnBleVersionListener(WifiBleSphyActivity.this); | |||||
| mSphyWifiBleDeviceData.setOnMcuParameterListener(WifiBleSphyActivity.this); | |||||
| mSphyWifiBleDeviceData.setOnCompanyListener(WifiBleSphyActivity.this); | |||||
| } | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public void onServiceErr() { | |||||
| BleLog.i(TAG, "服务与界面连接断开"); | |||||
| //与服务断开连接 | |||||
| mBluetoothService = null; | |||||
| } | |||||
| @Override | |||||
| public void unbindServices() { | |||||
| CallbackDisIm.getInstance().removeListener(this); | |||||
| if (mSphyWifiBleDeviceData != null) { | |||||
| mSphyWifiBleDeviceData.disconnect(); | |||||
| mSphyWifiBleDeviceData.clear(); | |||||
| mSphyWifiBleDeviceData = 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(); | |||||
| } | |||||
| //-----------------通知------------------- | |||||
| private class NotifyData implements SphyWifiBleDeviceData.onNotifyData { | |||||
| @Override | |||||
| public void onData(byte[] status, int type) { | |||||
| String data = ""; | |||||
| if (status != null) | |||||
| data = BleStrUtils.byte2HexStr(status); | |||||
| if (type == 100) { | |||||
| mList.add(TimeUtils.getTime() + "send->" + data); | |||||
| } else { | |||||
| mList.add(TimeUtils.getTime() + "notify->" + data); | |||||
| } | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| @Override | |||||
| public void onSphyCmd(byte cmd) { | |||||
| String cmdStr = ""; | |||||
| switch (cmd) { | |||||
| case SphyBleConfig.SHPY_CMD_START: | |||||
| cmdStr += "开始测量"; | |||||
| break; | |||||
| case SphyBleConfig.SHPY_CMD_STOP: | |||||
| cmdStr += "停止测试"; | |||||
| break; | |||||
| case SphyBleConfig.SHPY_CMD_MCU_START: | |||||
| cmdStr += "mcu 开机"; | |||||
| break; | |||||
| case SphyBleConfig.SHPY_CMD_MCU_STOP: | |||||
| cmdStr += "mcu 关机"; | |||||
| break; | |||||
| } | |||||
| mList.add(TimeUtils.getTime() + "指令:" + cmdStr); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| @Override | |||||
| public void onSphyVoice(byte cmd) { | |||||
| String cmdStr = ""; | |||||
| switch (cmd) { | |||||
| case 0x00: | |||||
| cmdStr += "打开语音"; | |||||
| break; | |||||
| case 0x01: | |||||
| cmdStr += "关闭语音"; | |||||
| break; | |||||
| } | |||||
| mList.add(TimeUtils.getTime() + "指令:" + cmdStr); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| @Override | |||||
| public void onSphyDataNow(int dia, int sys, int decimal, int pul, int unit) { | |||||
| String diaStr = BleDensityUtil.getInstance().holdDecimals(dia, decimal); | |||||
| String sysStr = BleDensityUtil.getInstance().holdDecimals(sys, decimal); | |||||
| mList.add(TimeUtils.getTime() + "实时:舒张压=" + diaStr + " 收缩压=" + sysStr + " 心率=" + pul + " 单位=" + (unit == 0 ? "mmhg" : "kPa")); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| @Override | |||||
| public void onSphyData(int dia, int sys, int decimal, int pul, int unit) { | |||||
| String diaStr = BleDensityUtil.getInstance().holdDecimals(dia, decimal); | |||||
| String sysStr = BleDensityUtil.getInstance().holdDecimals(sys, decimal); | |||||
| mList.add(TimeUtils.getTime() + "稳定:舒张压=" + diaStr + " 收缩压=" + sysStr + " 心率=" + pul + " 单位=" + (unit == 0 ? "mmhg" : "kPa")); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| @Override | |||||
| public void onUnit(int unit) { | |||||
| String showData = ""; | |||||
| switch (unit) { | |||||
| case CmdConfig.SETTING_SUCCESS: | |||||
| showData = "设置单位成功"; | |||||
| break; | |||||
| case CmdConfig.SETTING_FAILURE: | |||||
| showData = "设置单位失败"; | |||||
| break; | |||||
| case CmdConfig.SETTING_ERR: | |||||
| showData = "设置单位错误"; | |||||
| break; | |||||
| } | |||||
| mList.add(TimeUtils.getTime() + showData); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| @Override | |||||
| public void onErr(byte status) { | |||||
| String errStr = ""; | |||||
| switch ((int) status) { | |||||
| case 0: | |||||
| errStr += "未找到高压"; | |||||
| break; | |||||
| case 1: | |||||
| errStr += "无法正常加压,请检查是否插入袖带,或者重新插拔袖带气 管"; | |||||
| break; | |||||
| case 2: | |||||
| errStr += "电量低"; | |||||
| break; | |||||
| case 3: | |||||
| errStr += "传感器信号异常"; | |||||
| break; | |||||
| case 4: | |||||
| errStr += "测量结果异常"; | |||||
| break; | |||||
| case 5: | |||||
| errStr += "腕带过紧或气路堵塞"; | |||||
| break; | |||||
| case 60: | |||||
| errStr += "测量中压力干扰严重"; | |||||
| break; | |||||
| case 7: | |||||
| errStr += "压力超 290"; | |||||
| break; | |||||
| case 8: | |||||
| errStr += "标定数据异常或存储 IC 异常"; | |||||
| break; | |||||
| } | |||||
| mList.add(TimeUtils.getTime() + "错误:" + errStr); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| } | |||||
| private List<WifiBleInfoBean> mWifiBleInfoBeanList; | |||||
| private class WifiBleDeviceListener implements WifiBleDeviceData.OnWiFiBleCallback { | |||||
| /** | |||||
| * 在ble和wifi状态 | |||||
| * | |||||
| * @param bleStatus ble状态 | |||||
| * @param wifiStatus wifi状态 | |||||
| * @param workStatus 工作状态 | |||||
| */ | |||||
| @Override | |||||
| public void onBleAndWifiStatus(int bleStatus, int wifiStatus, int workStatus) { | |||||
| String wifiStatusStr = ""; | |||||
| switch (wifiStatus) { | |||||
| case 0: | |||||
| wifiStatusStr = "未配置AP"; | |||||
| break; | |||||
| case 1: | |||||
| wifiStatusStr = "连接AP失败"; | |||||
| break; | |||||
| case 2: | |||||
| wifiStatusStr = "连接的AP信号不好"; | |||||
| break; | |||||
| case 3: | |||||
| wifiStatusStr = "成功连接上AP"; | |||||
| break; | |||||
| case 4: | |||||
| wifiStatusStr = "正在连接AP"; | |||||
| break; | |||||
| } | |||||
| mList.add("蓝牙状态:" + bleStatus + "\nwifi状态:" + wifiStatusStr + "\n工作状态:" + workStatus); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| if (tv_wifi_status != null) { | |||||
| tv_wifi_status.setText(wifiStatusStr); | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public void onWifiScanStatus(int status) { | |||||
| } | |||||
| @Override | |||||
| public void onConnectWifiName(String name) { | |||||
| if (tv_wifi_ssid != null) { | |||||
| tv_wifi_ssid.setText(name); | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public void onWifiScanBean(WifiBleInfoBean wifiBleInfoBean) { | |||||
| L.i("扫描到的wifi信息:" + wifiBleInfoBean.toString()); | |||||
| } | |||||
| @Override | |||||
| public void onWifiScanFinish(List<WifiBleInfoBean> list) { | |||||
| 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); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * 设置wifi名字或密码的状态回调 | |||||
| * | |||||
| * @param type 类型 | |||||
| * @param status 状态 | |||||
| */ | |||||
| @Override | |||||
| public void onSetWifiNameOrPwdOrConnectCallback(int type, int status) { | |||||
| } | |||||
| @Override | |||||
| public void onWifiConnecting(int status) { | |||||
| L.i("wifi正在连接中:" + status); | |||||
| mList.add("wifi正在连接中..."); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| /** | |||||
| * 当前连接的wifi mac地址 | |||||
| * | |||||
| * @param mac mac | |||||
| */ | |||||
| @Override | |||||
| public void onConnectWifiMac(String mac) { | |||||
| } | |||||
| @Override | |||||
| public void onDeviceSn(String sn) { | |||||
| //主要用于查询设备是否在服务器注册成功 | |||||
| mList.add("设备SN号:" + sn); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| @Override | |||||
| public void onServerIp(String ip) { | |||||
| mList.add("设备ip地址:" + ip); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| @Override | |||||
| public void onServerPort(int port) { | |||||
| mList.add("设备端口:" + port); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| @Override | |||||
| public void onServerPath(String path) { | |||||
| mList.add("设备路径地址:" + path); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| @Override | |||||
| public void onServerSettingInfo(boolean status) { | |||||
| mList.add("服务器配置:" + (status?"成功":"失败")); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public void onBmVersion(String version) { | |||||
| mList.add(TimeUtils.getTime() + "版本号:" + version); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| @Override | |||||
| public void OnDID(int cid, int vid, int pid) { | |||||
| String didStr = "cid:" + cid + "||vid:" + vid + "||pid:" + pid; | |||||
| mList.add(TimeUtils.getTime() + "ID:" + didStr); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| @Override | |||||
| public void onMcuBatteryStatus(int status, int battery) { | |||||
| mList.add(TimeUtils.getTime() + "电量:" + battery + "%"); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| @Override | |||||
| public void onSysTime(int status, int[] times) { | |||||
| String time = times[0] + "-" + times[1] + "-" + times[2] + " " + times[3] + ":" + times[4] + ":" + times[5]; | |||||
| mList.add(TimeUtils.getTime() + "系统时间:" + time); | |||||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
| } | |||||
| @Override | |||||
| protected void onDestroy() { | |||||
| super.onDestroy(); | |||||
| BleLog.i(TAG, "onDestroy"); | |||||
| } | |||||
| } |
| for (byte aB : b) { | for (byte aB : b) { | ||||
| int a = aB & 0XFF; | int a = aB & 0XFF; | ||||
| stmp = getHexString(a); | stmp = getHexString(a); | ||||
| if (stmp.length() == 1) | |||||
| if (stmp.length() == 1) { | |||||
| hs.append("0").append(stmp); | hs.append("0").append(stmp); | ||||
| else | |||||
| } else { | |||||
| hs.append(stmp); | hs.append(stmp); | ||||
| } | |||||
| hs.append(" "); | hs.append(" "); | ||||
| } | } | ||||
| return hs.toString(); | return hs.toString(); |
| android:layout_margin="16dp" | android:layout_margin="16dp" | ||||
| android:text="开始\n测试" | android:text="开始\n测试" | ||||
| android:textSize="18dp" | android:textSize="18dp" | ||||
| android:textColor="@color/public_white" | |||||
| android:textColor="@color/white" | |||||
| android:background="@drawable/ic_round" | android:background="@drawable/ic_round" | ||||
| app:layout_constraintBottom_toBottomOf="parent" | app:layout_constraintBottom_toBottomOf="parent" | ||||
| app:layout_constraintEnd_toEndOf="parent" /> | app:layout_constraintEnd_toEndOf="parent" /> |
| <?xml version="1.0" encoding="utf-8"?> | |||||
| <androidx.constraintlayout.widget.ConstraintLayout 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"> | |||||
| <TextView | |||||
| android:id="@+id/tv_ins" | |||||
| android:layout_width="0dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:layout_marginStart="16dp" | |||||
| android:layout_marginTop="8dp" | |||||
| android:gravity="center" | |||||
| android:text="请选择指令" | |||||
| android:textColor="@color/colorAccent" | |||||
| android:textSize="16dp" | |||||
| app:layout_constraintStart_toStartOf="parent" | |||||
| app:layout_constraintTop_toTopOf="parent" /> | |||||
| <TextView | |||||
| android:id="@+id/tv_time" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:layout_marginStart="16dp" | |||||
| android:layout_marginTop="8dp" | |||||
| android:gravity="center" | |||||
| android:text="开机时间(读取历史记录):" | |||||
| android:textColor="@color/colorAccent" | |||||
| android:textSize="16dp" | |||||
| app:layout_constraintStart_toStartOf="parent" | |||||
| app:layout_constraintTop_toBottomOf="@id/tv_ins" /> | |||||
| <EditText | |||||
| android:id="@+id/et_time" | |||||
| android:layout_width="0dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:inputType="number" | |||||
| android:hint="自定义time" | |||||
| app:layout_constraintBottom_toBottomOf="@id/tv_time" | |||||
| app:layout_constraintEnd_toEndOf="parent" | |||||
| app:layout_constraintTop_toTopOf="@id/tv_time" | |||||
| app:layout_constraintStart_toEndOf="@id/tv_time" /> | |||||
| <androidx.recyclerview.widget.RecyclerView | |||||
| android:id="@+id/rv_inst" | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="0dp" | |||||
| android:layout_marginTop="8dp" | |||||
| android:layout_marginBottom="4dp" | |||||
| app:layout_constraintBottom_toTopOf="@id/mid_driver" | |||||
| app:layout_constraintEnd_toEndOf="parent" | |||||
| app:layout_constraintStart_toStartOf="parent" | |||||
| app:layout_constraintTop_toBottomOf="@id/tv_time" /> | |||||
| <View | |||||
| android:id="@+id/mid_driver" | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="1dp" | |||||
| android:background="@color/black" | |||||
| app:layout_constraintBottom_toBottomOf="parent" | |||||
| app:layout_constraintTop_toTopOf="parent" /> | |||||
| <TextView | |||||
| android:id="@+id/tv_logs" | |||||
| android:layout_width="0dp" | |||||
| android:layout_height="wrap_content" | |||||
| android:layout_marginStart="16dp" | |||||
| android:layout_marginTop="8dp" | |||||
| android:gravity="center" | |||||
| android:text="log:" | |||||
| android:textColor="@color/colorAccent" | |||||
| android:textSize="16dp" | |||||
| app:layout_constraintStart_toStartOf="parent" | |||||
| app:layout_constraintTop_toBottomOf="@id/mid_driver" /> | |||||
| <ListView | |||||
| android:id="@+id/lv_log" | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="0dp" | |||||
| app:layout_constraintBottom_toBottomOf="parent" | |||||
| app:layout_constraintEnd_toEndOf="parent" | |||||
| app:layout_constraintStart_toStartOf="parent" | |||||
| app:layout_constraintTop_toBottomOf="@id/tv_logs" /> | |||||
| </androidx.constraintlayout.widget.ConstraintLayout> |
| android:id="@+id/btn_sphy" | android:id="@+id/btn_sphy" | ||||
| android:layout_width="wrap_content" | android:layout_width="wrap_content" | ||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:text="血压计" /> | |||||
| android:text="BLE血压计" /> | |||||
| <Button | |||||
| android:id="@+id/btn_sphy_wifi_ble" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="wifi血压计" /> | |||||
| <Button | <Button | ||||
| android:id="@+id/btn_tempgun" | android:id="@+id/btn_tempgun" | ||||
| android:layout_width="wrap_content" | android:layout_width="wrap_content" | ||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:text="体温计" /> | android:text="体温计" /> | ||||
| <Button | |||||
| android:id="@+id/btn_baby" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="婴儿秤" /> | |||||
| </LinearLayout> | </LinearLayout> | ||||
| <LinearLayout | <LinearLayout | ||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:text="身高仪" /> | android:text="身高仪" /> | ||||
| <Button | |||||
| android:id="@+id/btn_lock" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:visibility="gone" | |||||
| android:text="电子锁" /> | |||||
| <Button | <Button | ||||
| android:layout_width="wrap_content" | android:layout_width="wrap_content" | ||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:text="口罩" /> | android:text="口罩" /> | ||||
| <Button | |||||
| android:id="@+id/btn_baby" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="婴儿秤" /> | |||||
| </LinearLayout> | </LinearLayout> | ||||
| android:id="@+id/btn_broadcast_scale" | android:id="@+id/btn_broadcast_scale" | ||||
| android:layout_width="wrap_content" | android:layout_width="wrap_content" | ||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:text="广播体脂秤" /> | |||||
| android:text="广播秤" /> | |||||
| <Button | <Button | ||||
| android:id="@+id/btn_broadcast_blood_oxygen" | android:id="@+id/btn_broadcast_blood_oxygen" | ||||
| android:id="@+id/btn_weight_scale" | android:id="@+id/btn_weight_scale" | ||||
| android:layout_width="wrap_content" | android:layout_width="wrap_content" | ||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:text="连接体重秤"/> | |||||
| android:text="体重秤"/> | |||||
| </LinearLayout> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content"> | |||||
| <Button | |||||
| android:id="@+id/btn_barometric_temp_humidity" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="气压温湿度计" /> | |||||
| </LinearLayout> | </LinearLayout> | ||||
| <?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||||
| <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||
| android:layout_width="match_parent" | |||||
| android:layout_height="match_parent" | |||||
| android:orientation="vertical" | |||||
| android:focusable="true" | |||||
| android:focusableInTouchMode="true" | |||||
| > | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="match_parent" | |||||
| android:focusable="true" | |||||
| android:focusableInTouchMode="true" | |||||
| android:orientation="vertical"> | |||||
| <ScrollView | <ScrollView | ||||
| android:layout_width="match_parent" | android:layout_width="match_parent" | ||||
| android:layout_height="0dp" | android:layout_height="0dp" | ||||
| android:layout_weight="1" | |||||
| > | |||||
| android:layout_weight="1"> | |||||
| <LinearLayout | <LinearLayout | ||||
| android:layout_width="match_parent" | android:layout_width="match_parent" | ||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:orientation="vertical" | |||||
| > | |||||
| android:orientation="vertical"> | |||||
| <LinearLayout | <LinearLayout | ||||
| android:layout_width="match_parent" | android:layout_width="match_parent" | ||||
| android:padding="10dp"> | android:padding="10dp"> | ||||
| <Button | <Button | ||||
| android:id="@+id/clear" | android:id="@+id/clear" | ||||
| android:layout_width="wrap_content" | android:layout_width="wrap_content" | ||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:text="清空" | |||||
| /> | |||||
| android:text="清空" /> | |||||
| </LinearLayout> | </LinearLayout> | ||||
| <LinearLayout | <LinearLayout | ||||
| android:id="@+id/btn_set_unit" | android:id="@+id/btn_set_unit" | ||||
| android:layout_width="wrap_content" | android:layout_width="wrap_content" | ||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:text="set_unit" | |||||
| /> | |||||
| android:text="set_unit" /> | |||||
| <Button | <Button | ||||
| android:id="@+id/btn_start" | android:id="@+id/btn_start" | ||||
| android:layout_width="wrap_content" | android:layout_width="wrap_content" | ||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:text="start" | |||||
| /> | |||||
| android:text="start" /> | |||||
| <Button | <Button | ||||
| android:id="@+id/btn_stop" | android:id="@+id/btn_stop" | ||||
| android:layout_width="wrap_content" | android:layout_width="wrap_content" | ||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:text="stop" | |||||
| /> | |||||
| android:text="stop" /> | |||||
| <Button | <Button | ||||
| android:id="@+id/btn_voice" | android:id="@+id/btn_voice" | ||||
| android:layout_width="wrap_content" | android:layout_width="wrap_content" | ||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:text="voice" | |||||
| /> | |||||
| android:text="voice" /> | |||||
| </LinearLayout> | </LinearLayout> | ||||
| <LinearLayout | <LinearLayout | ||||
| android:layout_width="match_parent" | android:layout_width="match_parent" | ||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:id="@+id/btn_get_did" | android:id="@+id/btn_get_did" | ||||
| android:layout_width="wrap_content" | android:layout_width="wrap_content" | ||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:text="get_did" | |||||
| /> | |||||
| android:text="get_did" /> | |||||
| <Button | <Button | ||||
| android:id="@+id/btnVersion" | android:id="@+id/btnVersion" | ||||
| android:layout_width="wrap_content" | android:layout_width="wrap_content" | ||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:text="version" | |||||
| /> | |||||
| android:text="version" /> | |||||
| <Button | <Button | ||||
| android:id="@+id/btnBattery" | android:id="@+id/btnBattery" | ||||
| android:layout_weight="2" | android:layout_weight="2" | ||||
| android:padding="10dp" | android:padding="10dp" | ||||
| android:stackFromBottom="true" | android:stackFromBottom="true" | ||||
| android:transcriptMode="alwaysScroll" | |||||
| > | |||||
| android:transcriptMode="alwaysScroll"> | |||||
| </ListView> | </ListView> |
| <?xml version="1.0" encoding="utf-8"?> | |||||
| <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||||
| xmlns:app="http://schemas.android.com/apk/res-auto" | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="match_parent" | |||||
| android:focusable="true" | |||||
| android:focusableInTouchMode="true" | |||||
| android:orientation="vertical"> | |||||
| <ScrollView | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="0dp" | |||||
| android:layout_weight="3"> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content" | |||||
| android:layout_marginTop="10dp" | |||||
| android:orientation="vertical"> | |||||
| <androidx.constraintlayout.widget.ConstraintLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content" | |||||
| android:layout_marginStart="10dp" | |||||
| android:layout_marginEnd="10dp"> | |||||
| <TextView | |||||
| android:id="@+id/tv_wifi_title" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="WIFI:" | |||||
| app:layout_constraintBottom_toBottomOf="parent" | |||||
| app:layout_constraintStart_toStartOf="parent" | |||||
| app:layout_constraintTop_toTopOf="parent" /> | |||||
| <TextView | |||||
| android:id="@+id/tv_wifi_ssid" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="" | |||||
| app:layout_constraintBottom_toBottomOf="parent" | |||||
| app:layout_constraintStart_toEndOf="@id/tv_wifi_title" | |||||
| app:layout_constraintTop_toTopOf="parent" /> | |||||
| <TextView | |||||
| android:id="@+id/tv_wifi_status" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="" | |||||
| app:layout_constraintBottom_toBottomOf="parent" | |||||
| app:layout_constraintStart_toEndOf="@id/tv_wifi_title" | |||||
| app:layout_constraintTop_toTopOf="parent" /> | |||||
| <Button | |||||
| android:id="@+id/btn_wifi" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="配网" | |||||
| app:layout_constraintEnd_toStartOf="@id/btn_read_wifi_status" | |||||
| app:layout_constraintTop_toTopOf="parent" /> | |||||
| <Button | |||||
| android:id="@+id/btn_read_wifi_status" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="读状态" | |||||
| app:layout_constraintEnd_toEndOf="parent" | |||||
| app:layout_constraintTop_toTopOf="parent" /> | |||||
| </androidx.constraintlayout.widget.ConstraintLayout> | |||||
| <View | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="0.1dp" | |||||
| android:layout_marginTop="5dp" | |||||
| android:layout_marginBottom="5dp" | |||||
| android:background="#000000" /> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content" | |||||
| android:layout_marginStart="10dp" | |||||
| android:layout_marginEnd="10dp" | |||||
| android:orientation="horizontal"> | |||||
| <TextView | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="URL(IP):" /> | |||||
| <EditText | |||||
| android:id="@+id/et_url" | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="ailink.iot.aicare.net.cn" /> | |||||
| </LinearLayout> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content" | |||||
| android:layout_marginStart="10dp" | |||||
| android:layout_marginEnd="10dp" | |||||
| android:orientation="horizontal"> | |||||
| <TextView | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="Port:" /> | |||||
| <EditText | |||||
| android:id="@+id/et_port" | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content" | |||||
| android:inputType="number" | |||||
| android:text="80" /> | |||||
| </LinearLayout> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content" | |||||
| android:layout_marginStart="10dp" | |||||
| android:layout_marginEnd="10dp" | |||||
| android:orientation="horizontal"> | |||||
| <TextView | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="Path:" /> | |||||
| <EditText | |||||
| android:id="@+id/et_path" | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content" /> | |||||
| </LinearLayout> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content" | |||||
| android:layout_marginStart="10dp" | |||||
| android:layout_marginEnd="10dp" | |||||
| android:orientation="horizontal"> | |||||
| <Button | |||||
| android:id="@+id/btn_config" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="配置信息" /> | |||||
| <Button | |||||
| android:id="@+id/btn_read_config" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="读取信息" /> | |||||
| </LinearLayout> | |||||
| <View | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="0.1dp" | |||||
| android:layout_marginTop="5dp" | |||||
| android:layout_marginBottom="5dp" | |||||
| android:background="#000000" /> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content" | |||||
| android:layout_marginTop="1dp" | |||||
| android:padding="10dp"> | |||||
| <Button | |||||
| android:id="@+id/btn_set_unit" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="set_unit" /> | |||||
| <Button | |||||
| android:id="@+id/btn_start" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="start" /> | |||||
| <Button | |||||
| android:id="@+id/btn_stop" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="stop" /> | |||||
| <Button | |||||
| android:id="@+id/btn_voice" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="voice" /> | |||||
| </LinearLayout> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content" | |||||
| android:padding="10dp"> | |||||
| <Button | |||||
| android:id="@+id/btn_get_did" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="get_did" /> | |||||
| <Button | |||||
| android:id="@+id/btnVersion" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="version" /> | |||||
| <Button | |||||
| android:id="@+id/btnBattery" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="Battery" /> | |||||
| </LinearLayout> | |||||
| </LinearLayout> | |||||
| </ScrollView> | |||||
| <Button | |||||
| android:id="@+id/clear" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:layout_marginStart="10dp" | |||||
| android:text="清空" /> | |||||
| <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> |
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:layout_weight="1" | android:layout_weight="1" | ||||
| android:digits="0123456789ABCDEFabcdef" | android:digits="0123456789ABCDEFabcdef" | ||||
| android:hint="输入payload数据" /> | |||||
| android:hint="输入payload数据(16进制)" /> | |||||
| <Button | <Button | ||||
| android:id="@+id/send" | android:id="@+id/send" | ||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:layout_weight="1" | android:layout_weight="1" | ||||
| android:digits="0123456789ABCDEFabcdef" | android:digits="0123456789ABCDEFabcdef" | ||||
| android:hint="输入payload数据" /> | |||||
| android:hint="输入payload数据(16进制)" /> | |||||
| <Button | <Button | ||||
| android:id="@+id/send_a6" | android:id="@+id/send_a6" | ||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:layout_weight="1" | android:layout_weight="1" | ||||
| android:digits="0123456789ABCDEFabcdef" | android:digits="0123456789ABCDEFabcdef" | ||||
| android:hint="输入完整的指令" | |||||
| android:hint="输入完整的指令(16进制)" | |||||
| android:textColorHint="@color/colorAccent" /> | android:textColorHint="@color/colorAccent" /> | ||||
| <Button | <Button |
| <?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||||
| <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||
| xmlns:app="http://schemas.android.com/apk/res-auto" | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="match_parent" | |||||
| android:background="@drawable/bg_btn_white_dialog" | |||||
| android:orientation="vertical"> | |||||
| xmlns:app="http://schemas.android.com/apk/res-auto" | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="match_parent" | |||||
| android:background="@drawable/bg_btn_white_dialog" | |||||
| android:orientation="vertical"> | |||||
| <TextView | <TextView | ||||
| android:padding="10dp" | android:padding="10dp" | ||||
| android:text="请选择" | android:text="请选择" | ||||
| android:textColor="@android:color/black" | android:textColor="@android:color/black" | ||||
| android:textSize="16dp"/> | |||||
| android:textSize="16dp" /> | |||||
| <androidx.recyclerview.widget.RecyclerView | |||||
| android:id="@+id/rv_dialog_list" | |||||
| <androidx.constraintlayout.widget.ConstraintLayout | |||||
| android:layout_width="match_parent" | android:layout_width="match_parent" | ||||
| android:layout_height="wrap_content" | |||||
| android:overScrollMode="never" | |||||
| android:scrollbars="none"/> | |||||
| android:layout_height="wrap_content"> | |||||
| <androidx.recyclerview.widget.RecyclerView | |||||
| android:id="@+id/rv_dialog_list" | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="200dp" | |||||
| android:overScrollMode="never" | |||||
| android:padding="5dp" | |||||
| android:scrollbars="none" | |||||
| app:layout_constraintStart_toStartOf="parent" | |||||
| app:layout_constraintTop_toTopOf="parent" /> | |||||
| <TextView | |||||
| android:id="@+id/tv_dialog_list_data_hint" | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="200dp" | |||||
| android:gravity="center" | |||||
| android:text="加载中..." | |||||
| android:textSize="20dp" | |||||
| app:layout_constraintStart_toStartOf="parent" | |||||
| app:layout_constraintTop_toTopOf="parent" /> | |||||
| </androidx.constraintlayout.widget.ConstraintLayout> | |||||
| <View | <View | ||||
| android:layout_width="match_parent" | android:layout_width="match_parent" | ||||
| android:layout_height="1px" | android:layout_height="1px" | ||||
| android:background="@android:color/black"/> | |||||
| android:background="@android:color/black" /> | |||||
| <TextView | <TextView | ||||
| android:id="@+id/tv_dialog_photo_cancel" | android:id="@+id/tv_dialog_photo_cancel" | ||||
| android:gravity="center" | android:gravity="center" | ||||
| android:padding="10dp" | android:padding="10dp" | ||||
| android:text="取消" | android:text="取消" | ||||
| android:textColor="@android:color/black" | |||||
| /> | |||||
| android:textColor="@android:color/black" /> | |||||
| </LinearLayout> | </LinearLayout> |
| <?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||||
| <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||
| android:layout_width="match_parent" | |||||
| android:layout_height="match_parent" | |||||
| android:background="#ffffff" | |||||
| android:orientation="vertical"> | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="match_parent" | |||||
| android:background="#ffffff" | |||||
| android:orientation="vertical"> | |||||
| <TextView | <TextView | ||||
| android:textSize="20dp" | android:textSize="20dp" | ||||
| /> | |||||
| /> | |||||
| <TextView | <TextView | ||||
| android:layout_marginTop="10dp" | android:layout_marginTop="10dp" | ||||
| android:gravity="center" | android:gravity="center" | ||||
| android:padding="10dp" | android:padding="10dp" | ||||
| android:text="title_2" | |||||
| android:text="" | |||||
| android:textColor="#000000" | android:textColor="#000000" | ||||
| android:textSize="18dp" | android:textSize="18dp" | ||||
| /> | |||||
| /> | |||||
| <EditText | <EditText | ||||
| android:id="@+id/et_move_data_context" | android:id="@+id/et_move_data_context" | ||||
| android:layout_width="match_parent" | android:layout_width="match_parent" | ||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:layout_marginEnd="25dp" | |||||
| android:layout_marginStart="25dp" | android:layout_marginStart="25dp" | ||||
| android:layout_marginTop="20dp" | android:layout_marginTop="20dp" | ||||
| android:layout_marginEnd="25dp" | |||||
| android:focusable="true" | |||||
| android:padding="8dp" | android:padding="8dp" | ||||
| android:singleLine="true" | android:singleLine="true" | ||||
| android:textColor="#000000" | android:textColor="#000000" | ||||
| android:textSize="18dp" | android:textSize="18dp" | ||||
| android:focusable="true" | |||||
| /> | /> | ||||
| <TextView | <TextView | ||||
| android:id="@+id/tv_move_data_ok" | android:id="@+id/tv_move_data_ok" | ||||
| android:layout_width="match_parent" | android:layout_width="match_parent" | ||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:layout_marginEnd="25dp" | |||||
| android:layout_marginStart="25dp" | android:layout_marginStart="25dp" | ||||
| android:layout_marginTop="40dp" | android:layout_marginTop="40dp" | ||||
| android:layout_marginEnd="25dp" | |||||
| android:background="#2878ce" | android:background="#2878ce" | ||||
| android:gravity="center" | android:gravity="center" | ||||
| android:padding="10dp" | android:padding="10dp" | ||||
| android:text="确认" | android:text="确认" | ||||
| android:textColor="#ffffff" | android:textColor="#ffffff" | ||||
| android:textSize="18dp" | |||||
| /> | |||||
| android:textSize="18dp" /> | |||||
| <TextView | <TextView | ||||
| android:id="@+id/tv_move_data_cancel" | android:id="@+id/tv_move_data_cancel" | ||||
| android:layout_width="match_parent" | android:layout_width="match_parent" | ||||
| android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
| android:layout_marginEnd="25dp" | |||||
| android:layout_marginStart="25dp" | android:layout_marginStart="25dp" | ||||
| android:layout_marginTop="10dp" | android:layout_marginTop="10dp" | ||||
| android:layout_marginEnd="25dp" | |||||
| android:gravity="center" | android:gravity="center" | ||||
| android:padding="10dp" | android:padding="10dp" | ||||
| android:text="取消" | android:text="取消" | ||||
| android:textSize="15dp" | |||||
| /> | |||||
| android:textSize="15dp" /> | |||||
| <View | <View | ||||
| android:layout_width="match_parent" | android:layout_width="match_parent" | ||||
| android:layout_height="20dp"/> | |||||
| android:layout_height="20dp" /> | |||||
| </LinearLayout> | </LinearLayout> |
| <?xml version="1.0" encoding="utf-8"?> | |||||
| <androidx.cardview.widget.CardView 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="wrap_content" | |||||
| android:layout_marginBottom="12dp" | |||||
| app:cardBackgroundColor="@android:color/holo_blue_dark" | |||||
| app:cardCornerRadius="8dp" | |||||
| app:cardElevation="0dp" | |||||
| android:layout_marginStart="24dp" | |||||
| android:layout_marginEnd="24dp" | |||||
| app:contentPadding="8dp"> | |||||
| <TextView | |||||
| android:id="@+id/tv_content" | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content" | |||||
| android:gravity="center" | |||||
| android:paddingStart="8dp" | |||||
| android:paddingEnd="8dp" | |||||
| android:textColor="@android:color/white" | |||||
| android:textSize="18dp" /> | |||||
| </androidx.cardview.widget.CardView> |