【问题标题】:Bluetooth on Android - how to connect to the CORRECT bluetooth device?Android 上的蓝牙 - 如何连接到正确的蓝牙设备?
【发布时间】:2011-07-06 16:24:48
【问题描述】:

我正在编写一个通过 rfcomm 与外部附件对话的程序。 我的问题是我不知道识别设备的正确方法是什么。 我现在的做法是这样的:

Set<BluetoothDevice> pairedDevices = mBluetoothAdapter
                .getBondedDevices();
        for (BluetoothDevice device : pairedDevices) {
            if (device.getName().equals(MY_DEVICE_NAME)) {
                this.myDevice = device;
                break;
            }
        }

然而,这种方法依赖于设备的名称,在我看来这很脏而且很糟糕 :) 有一个更好的方法吗? 我尝试查看BluetoothDevice 的所有方法,但似乎没有任何帮助 - 名称真的是最好的方法吗? 我看到在某些地方人们说我应该使用 UUID,但它用于在我拥有它后打开设备的套接字:

            _socket = myDevice.createRfcommSocketToServiceRecord(MY_UUID);

有没有更好的方法?

【问题讨论】:

    标签: java android bluetooth uuid rfcomm


    【解决方案1】:

    相同种类/功能和/或品牌的设备通常具有相似的名称。例如,所有RN-41 devices from Roving Networks 都具有以下名称:

    FireFly-XXXX
    

    其中XXXX 是设备地址的最后 4 位数字。这意味着您可以使用以下方式连接到其中的任何:

            if (device.getName().startsWith("FireFly-")) {
                this.myDevice = device;
                break;
            }
    

    这正是我在我的应用程序中所做的,并且还没有找到任何更可靠/一致的方法来做到这一点。作为概括,如果您感兴趣的设备中的名称比上面的示例更复杂,您应该能够使用常规模式。

    【讨论】:

    • 这也是我现在正在做的,但我希望有一种更好的方法,不依赖于名称......
    【解决方案2】:

    您可以使用myDevice.getAddress()获取蓝牙设备地址并进行比较,它始终是唯一的(与名称不同)

    【讨论】:

    • 我正在尝试连接到特定类别的设备(假设是特定型号的 jabra 耳机),因此事先不知道地址。我在想类似 device.getBluetoothClass() 但我不确定它是如何工作的......
    • getBluetoothClass 将为您提供设备类型和设备支持的服务类型。这对于进一步过滤到种类设备很有用。但最终要连接到设备,您需要获取其蓝牙地址并进行连接。
    • 那么答案是class是识别设备的方式吗?文档说:BluetoothClass 可用作粗略描述设备的提示(例如在 UI 中显示图标),但不能可靠地描述设备实际支持的蓝牙配置文件或服务。准确的服务发现是通过 SDP 请求完成的,这些请求在使用 createRfcommSocketToServiceRecord(UUID) 和 listenUsingRfcommWithServiceRecord(String, UUID) 创建 RFCOMM 套接字时自动执行我认为这意味着这还不够——这很粗糙——我需要一种识别方法!
    【解决方案3】:

    您还可以使用 BluetoothDevice.getBluetoothClass() 来缩小可能相关的设备范围。

    BluetoothClass.getMajorDeviceClass() 将大致告诉您它是什么类型的设备 - 电话、计算机、音频或视频设备,等等。 BluetoothClass.hasService() 进一步指定了设备的一些功能。

    在每个大类中,定义了一些小类——它是什么类型的计算机/音视频设备/电话/健康设备等。

    此外,在最新版本的 Android 平台(API 级别 15+)上,您无需连接即可查询设备的服务记录。请参阅 BluetoothDevice.fetchUuidsWithSdp() 和 BluetoothDevice.getUuids()。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-31
      • 2014-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多