2

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

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

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

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

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

4

3 回答 3

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);

        }
    }
于 2015-04-22T14:24:34.173 回答
1

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

查看我有演示心率设备的答案链接: https ://stackoverflow.com/a/29548205/862382

于 2015-04-23T06:13:11.383 回答
1

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

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

也就是说,请放心,只有当自定义服务的 GAP 特征外观设置为 833 或 832 时,您才能连接到将心率服务作为主要应用程序的补充服务的自定义设备。

于 2015-05-08T09:58:00.973 回答