87

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

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

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

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

任何人都可以理顺我吗?

4

7 回答 7

29

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

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

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

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

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

于 2014-02-13T16:38:06.007 回答
22

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

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

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

这里

于 2012-12-20T17:22:50.600 回答
13

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

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

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

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

于 2019-07-03T21:02:37.600 回答
8

UUID 在概念上类似于 Internet 中的端口号。然而,蓝牙和 Internet 之间的区别在于,在蓝牙中,端口号由 SDP(服务发现协议)服务器在运行时动态分配,其中每个 UUID 都被赋予一个端口号。其他设备将向注册在保留端口号下的 SDP 服务器询问设备上的可用服务,它会回复通过注册在不同 UUID 下彼此区分的不同服务。

于 2014-02-14T03:49:06.487 回答
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 套接字 = server.accept();

于 2015-07-09T17:28:24.560 回答
2

综上所述:UUid用于唯一标识应用程序。每个应用程序都有一个独特的UUid

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

于 2012-12-21T16:15:39.447 回答
1

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

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

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

于 2019-11-20T06:38:14.397 回答