Android:蓝牙UUID是如何工作的



我不明白蓝牙UUID是什么意思。UUID 是否表示协议(例如 RFCOMM)?如果是这样,为什么createRfcommSocketToServiceRecord()方法在名称中指定 rfcomm 时需要 UUID?为什么蓝牙聊天示例代码具有看似任意的硬编码 UUID?

出现我的问题是,根据这个问题,当运行 4.0.4 的设备尝试使用反射连接(到外部非 android 设备)时,我收到空指针异常。但是,这个问题的解决方案对我不起作用。UUID muuid = device.getUuids()[0].getUuid();会引发一个例外。

编辑:我已经通过根据此答案对串行端口服务的UUID进行硬编码(使用UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");)解决了这个问题。

我进一步困惑为什么我需要提供一个 UUID 来使用createInsecureRfcommSocketToServiceRecord(),但不使用反射方法创建不安全的 rfcomm 套接字。

谁能理顺我?

UUID 用于唯一标识信息。 它标识蓝牙设备提供的特定服务。该标准定义了基本BASE_UUID: 00000000-0000-1000-8000-00805F9B34FB

医疗保健传感器等设备可以提供服务,用预定义的代码替换前八位数字。 例如,提供 RFCOMM 连接的设备使用短代码:0x0003

因此,Android手机可以连接到设备,然后使用服务发现协议(SDP)来了解它提供的服务(UUID)。

在许多情况下,不需要使用这些固定的 UUID。 例如,如果您正在创建聊天应用程序,则一部Android手机与另一部使用相同应用程序的Android手机进行交互,因此使用相同的UUID。

因此,您可以使用 Web 上的许多随机 UUID 生成器之一(例如)为应用程序设置任意 UUID。

它通常表示蓝牙设备支持的一些常见服务(协议)。

在创建自己的 rfcomm 服务器(带listenUsingRfcommWithServiceRecord)时,您应该指定自己的 UUID,以便连接到它的客户端可以识别它; 这也是createRfcommSocketToServiceRecord需要 UUID 参数的原因之一。

否则,一些常见的服务具有相同的UUID,只需找到您需要的UUID并使用它即可。

看这里

在蓝牙中,所有对象都由 UUID 标识。 这些包括服务,特征和许多其他东西。 蓝牙维护一个标准对象分配编号的数据库,并为供应商分配子范围(已支付足够的预订费用)。 您可以在此处查看此列表:

https://www.bluetooth.com/specifications/assigned-numbers/

如果您正在实施标准服务(例如串行端口,键盘,耳机等),那么您应该使用该服务的标准UUID - 这将允许您与未开发的设备进行互操作。

如果您正在实现自定义服务,那么您应该生成唯一的 UUID,以确保不兼容的第三方设备不会尝试使用您的服务,认为它是其他东西。 最简单的方法是生成随机的,然后在应用程序中对结果进行硬编码(当然,并在将连接到服务的设备中使用相同的 UUID)。

>UUID在概念上类似于Internet中的端口号。但是,蓝牙和互联网之间的区别在于,在蓝牙中,端口号由SDP(服务发现协议)服务器在运行时动态分配,其中每个UUID都有一个端口号。其他设备将向在保留端口号下注册的SDP服务器询问设备上的可用服务,它将使用不同的服务进行回复,这些服务可以通过在不同的UUID下注册来区分。

>UUID只是一个数字。 除了您在Android应用程序的服务器端创建之外,它没有任何意义。 然后,客户端使用相同的 UUID 进行连接。

例如,在服务器端,您可以先运行uuid = UUID.randomUUID() 生成一个随机数,如 FB36491D-7C21-40EF-9F67-A63237B5BBEA。 然后保存它,然后将其硬编码到侦听器程序中,如下所示:

UUID uuid = UUID.fromString("fb36491d-7c21-40ef-9f67-a63237b5bbea"); 

您的 Android 服务器程序将侦听使用该 UUID 的传入请求,如下所示:

BluetoothServerSocket server = mBluetoothAdapter.listenUsingRfcommWithServiceRecord("anyName", uuid);

BluetoothSocket socket = server.accept();

UUID 代表通用唯一标识符。UUID是一个简单的128位数字,在世界各地唯一分布。

蓝牙通过无线方式发送数据,附近的所有设备都可以接收数据。假设,有时您必须通过蓝牙发送一些重要文件,并且附近的所有设备都可以在范围内访问它。因此,当您与其他设备配对时,它们只需共享 UUID 编号并在共享文件之前进行匹配。当您发送任何文件时,您的设备会使用适当的设备 UUID 加密该文件并通过网络共享。现在,该范围内的所有蓝牙设备都可以访问加密文件,但它们需要正确的UUID号。因此,只有正确的UUID设备才能访问加密文件,而其他设备将拒绝导致错误UUID的原因。

简而言之,您可以使用UUID作为秘密密码,以便在任何两个蓝牙设备之间共享文件。

总结一下:UUid用于唯一标识应用程序。每个应用程序都有独特的UUid

因此,请对每个设备使用相同的UUid

最新更新