如何读取蓝牙低功耗GAP特征值作为字符串?

问题描述 投票:0回答:1

您好,我是开发应用程序的新手,对 BLE 的概念也比较陌生。我正在使用 Java 在 Android 上开发一个应用程序,该应用程序能够扫描附近的 BLE 设备。主要目的是获取设备型号/制造商并将其以可读格式发送到服务器。该应用程序能够发现它们并单击即可连接。连接后,我可以从所述设备读取和查看所有服务 UUID。 GAP 配置文件的 UUID 是 x180A,我理解它应该是 GAP 的 UUID。该设备能够读取下面屏幕截图中以灰色突出显示的特征。问题是我得到的值是十六进制字符串格式。有什么办法可以将它们转换成可读的字符串吗?Screenshot of device services 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);
    }

我尝试读取十六进制值,但不知道如何将其转换为可读的字符串格式。

java android bluetooth-lowenergy android-bluetooth bluetooth-gatt
1个回答
0
投票

您需要维护自己的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 查找表,例如 RxAndroidBlehttps://github.com/dariuszseweryn/RxAndroidBle/blob/master/rxandroidble/src/main/java/com/polidea/rxandroidble2/utils/StandardUUIDsParser.java

但我不知道这些映射表是否是最新的。蓝牙 SIG 每年多次添加新的标准化服务和特性。

© www.soinside.com 2019 - 2024. All rights reserved.