Android:蓝牙UUID如何工作?

时间:2012-12-20 02:21:06

标签: android bluetooth uuid rfcomm

我不明白蓝牙UUID是什么意思。 UUID是否表示协议(例如RFCOMM)?如果是这样,为什么createRfcommSocketToServiceRecord()方法需要UUID,当他们在名字中指定rfcomm时?为什么BluetoothChat示例代码有一个看似随意的,硬编码的UUID?

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

修改:我已根据this answer(使用UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");)对串口服务的UUID进行硬编码解决了该问题。

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

有人可以理顺我吗?

7 个答案:

答案 0 :(得分:24)

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

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

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

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

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

答案 1 :(得分:20)

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

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

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

请参阅here

答案 2 :(得分:5)

UUID与Internet中的端口号概念类似。然而,蓝牙和因特网之间的区别在于,在蓝牙中,端口号由SDP(服务发现协议)服务器在运行时期间动态分配,其中每个UUID被给予端口号。其他设备将询问在保留端口号下注册的SDP服务器有关设备上的可用服务,并且它将通过在不同的UUID下注册而以不同的服务进行回复。

答案 3 :(得分:4)

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

答案 4 :(得分:2)

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

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

如果您要实现标准服务(例如,串行端口,键盘,耳机等),则应使用该服务的标准UUID-这将使您可以与未开发的设备进行互操作。

如果要实现自定义服务,则应生成唯一的UUID,以确保不兼容的第三方设备不要尝试使用您的服务,而认为这是另一回事。最简单的方法是生成随机结果,然后将结果硬编码到您的应用程序中(当然,并在将要连接到您的服务的设备中使用相同的UUID)。

答案 5 :(得分:1)

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

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

答案 6 :(得分:0)

UUID代表通用唯一标识符。 UUID是一个简单的128位数字,在全球范围内唯一分布。

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

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