蓝牙 LE 设备 - 如何在移动应用程序中识别某种类型的设备?

Bluetooth LE device - how to recognize a certain type of device in mobile app?

我正在学习使用蓝牙 LE 设备编程并编写一个简单的移动应用程序。这是我的入门级问题:

假设我只想连接到某种类型的蓝牙 LE 设备(例如血压设备),但是当我进行扫描时,如果有其他蓝牙 LE,它可能 return 不止一个结果范围内的设备。所以我可能会得到以下结果:

设备1 RSSI、设备1名称、设备1地址;

设备 2 RSSI、设备 2 名称、设备 2 地址 ...

如何让代码选择我想要的设备类型(在本例中为血压设备)?设备地址是否由产品供应商分配,它们是否足够唯一并且遵循我可以用来识别此类设备的方案?如果没有,我还有什么其他选项可以让应用程序自动识别某种类型的蓝牙设备?

如果你想拿起特定的设备意味着你必须在 displayGattServices 中提及。 例如:-用于使用您提到的心率传感器设备

 if (SampleGattAttributes.lookup(uuid, unknownCharaString)
                        .contains("Heart")) {
                    hrt_rate_char = gattCharacteristic;
                }

有关详细信息,请参阅 displayGattServices 方法:

private void displayGattServices(List<BluetoothGattService> gattServices) {
        if (gattServices == null)
            return;
        String uuid = null;
        String unknownServiceString = getResources().getString(
                R.string.unknown_service);

        String unknownCharaString = getResources().getString(
                R.string.unknown_characteristic);

        ArrayList<HashMap<String, String>> gattServiceData = new ArrayList<HashMap<String, String>>();

        ArrayList<ArrayList<HashMap<String, String>>> gattCharacteristicData = new ArrayList<ArrayList<HashMap<String, String>>>();

        mGattCharacteristics = new ArrayList<ArrayList<BluetoothGattCharacteristic>>();

        for (BluetoothGattService gattService : gattServices) {
            HashMap<String, String> currentServiceData = new HashMap<String, String>();

            uuid = gattService.getUuid().toString();
            currentServiceData.put(LIST_NAME,
                    SampleGattAttributes.lookup(uuid, unknownServiceString));

            currentServiceData.put(LIST_UUID, uuid);
            gattServiceData.add(currentServiceData);

            ArrayList<HashMap<String, String>> gattCharacteristicGroupData = new ArrayList<HashMap<String, String>>();
            List<BluetoothGattCharacteristic> gattCharacteristics = gattService
                    .getCharacteristics();

            ArrayList<BluetoothGattCharacteristic> charas = new ArrayList<BluetoothGattCharacteristic>();

            for (BluetoothGattCharacteristic gattCharacteristic : gattCharacteristics) {
                charas.add(gattCharacteristic);

                HashMap<String, String> currentCharaData = new HashMap<String, String>();

                uuid = gattCharacteristic.getUuid().toString();
                if (SampleGattAttributes.lookup(uuid, unknownCharaString)
                        .contains("Heart")) {
                    hrt_rate_char = gattCharacteristic;
                }
                currentCharaData.put(LIST_NAME,
                        SampleGattAttributes.lookup(uuid, unknownCharaString));

                currentCharaData.put(LIST_UUID, uuid);
                gattCharacteristicGroupData.add(currentCharaData);

            }
            mGattCharacteristics.add(charas);

            gattCharacteristicData.add(gattCharacteristicGroupData);

        }
    }

以上代码无效。您将必须扫描设备、连接到它并发现服务。心率设备具有特定的服务特性。这是一个 link : https://developer.bluetooth.org/TechnologyOverview/Pages/HRP.aspx

看看这个 link 的答案,我有一个演示心率设备:

假设您希望您的应用仅连接到心率监测设备,并且如果您可以自由连接和检查,则应该使用标准心率服务实现。但是,假设如果您想在不连接到 BLE 设备的情况下完成它,广告数据包中的 Appearance 字段应该可以帮助您,前提是 BLE 服务器开发人员已适当注意在 GAP 服务中设置设备外观。

外观值 832833 适用于 Generic Heart rate SensorHeart Rate Sensor: Heart Rate Belt

也就是说,请放心,您还可以连接到将心率服务作为其主要应用程序的补充服务的自定义设备,前提是自定义服务的 GAP 特征外观设置为 833 或832.