您好,我是开发应用程序的新手,对 BLE 的概念也比较陌生。我正在使用 Java 在 Android 上开发一个应用程序,该应用程序能够扫描附近的 BLE 设备。主要目的是获取设备型号/制造商并将其以可读格式发送到服务器。该应用程序能够发现它们并单击即可连接。连接后,我可以从所述设备读取和查看所有服务 UUID。 GAP 配置文件的 UUID 是 x180A,我理解它应该是 GAP 的 UUID。该设备能够读取下面屏幕截图中以灰色突出显示的特征。问题是我得到的值是十六进制字符串格式。有什么办法可以将它们转换成可读的字符串吗? 下面是我用来显示服务特征的代码片段。
@Override
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
BluetoothGattCharacteristic characteristic = Objects.requireNonNull(characteristics_HashMapList.get(
services_ArrayList.get(groupPosition).getUuid().toString())).get(childPosition);
if (Utils.hasWriteProperty(characteristic.getProperties()) != 0) {
String uuid = characteristic.getUuid().toString();
Dialog_BTLE_Characteristic dialog_btle_characteristic = new Dialog_BTLE_Characteristic();
dialog_btle_characteristic.setTitle(uuid);
dialog_btle_characteristic.setService(mBTLE_Service);
dialog_btle_characteristic.setCharacteristic(characteristic);
dialog_btle_characteristic.show(getFragmentManager(), "Dialog_BTLE_Characteristic");
} else if (Utils.hasReadProperty(characteristic.getProperties()) != 0) {
if (mBTLE_Service != null) {
mBTLE_Service.readCharacteristic(characteristic);
}
} else if (Utils.hasNotifyProperty(characteristic.getProperties()) != 0) {
if (mBTLE_Service != null) {
mBTLE_Service.setCharacteristicNotification(characteristic, true);
}
}
return false;
}
这里是readcharacteristic方法。
public void readCharacteristic(BluetoothGattCharacteristic characteristic) {
if (mBluetoothAdapter == null || mBluetoothGatt == null) {
Log.w(TAG, "BluetoothAdapter not initialized");
return;
}
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
mBluetoothGatt.readCharacteristic(characteristic);
}
我尝试读取十六进制值,但不知道如何将其转换为可读的字符串格式。
您需要维护自己的UUID来命名查找数据库。
如果服务或特征 UUID 是官方 UUID(格式为
xxxxxxxx-0000-1000-8000-00805F9B34FB
),您可以从中获取 16 位和 32 位标识符。有关详细信息,请参阅如何将蓝牙 16 位服务 UUID 转换为 128 位 UUID?。
使用此 16 或 32 位标识符,您可以在官方规范中查找它:https://www.bluetooth.com/specifications/signed-numbers/
目前有一个 PDF 文档,您可以在其中搜索
Services by UUID
和 Characteristics by UUID
部分,您可以在其中找到从 16 位 UUID 到其名称的映射表。
如果您想以编程方式生成映射数据库,现在还有一个 BitBucket 存储库,其中包含 YAML 格式的所有值。
一些库包含 BLE GATT 查找表,例如 RxAndroidBle: https://github.com/dariuszseweryn/RxAndroidBle/blob/master/rxandroidble/src/main/java/com/polidea/rxandroidble2/utils/StandardUUIDsParser.java
但我不知道这些映射表是否是最新的。蓝牙 SIG 每年多次添加新的标准化服务和特性。