Android:蓝牙UUID如何工作?


80

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

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

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

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

谁能理我?


除出于学术目的外,从未使用过蓝牙连接,但我知道的是,UUID是设备的标识符,类似于设备的地址,并且对于设备保持不变。
noob 2012年

@Creator:这与以下答案矛盾:stackoverflow.com/a/4963069/1286571
ForeverWintr 2012年

3
好,这就是我对蓝牙UUID的全部了解,您可以尝试阅读此pdf文件,以更好地了解蓝牙协议和UUID-people.csail.mit.edu/rudolph/Teaching/Articles/PartOfBTBook.pdf
noob 2012年

问题:当Android手机不支持来自远程设备的UUID时,是否有任何后果?(UUID未在Android中列出... getUuids())?
Orri 2014年

嘿嘿嘿!我想问一些问题,@ ForeverWintr,如果我用自己的格式定义一个UUID并在两个android设备中使用可以吗?我的意思是,他们可以互相交流吗?
gumuruh 2014年

Answers:


6

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

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

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

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


我从哪里获得这些UUID,为什么它们总是看起来似乎是随机的字符串?
路加福音

UUID是根据RFC 4122生成的。有五个不同的UUID版本可供选择。最受欢迎的是版本1(基于时间戳和MAC地址)和版本4(随机)。另请参见en.wikipedia.org/wiki/Universally_unique_identifier。可以为您生成UUID的网页是uuidgenerator.net。如果您是Bluetooth SIG成员,则它们提供了一种算法,用于生成与您的会员ID绑定的UUID。
David C.

28

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

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

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

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

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


因此,RFCOMM服务的完整UUID为:00000003-0000-1000-8000-00805F9B34FB?
gyozo kudor 2015年

1
注意:它们列出了32位服务ID的缩写形式。您可以将其与BT SIG的基本UUID 00000000-0000-1000-8000-00805F9B34FB结合起来,替换GUID的前4位。例如 RFCOMM为0x0003,因此RFCOMM服务的UUID为00030000-0000-1000-8000-00805F9B34FB
sam msft

22

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

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

否则,某些通用服务具有相同的UUID,只需找到所需的UUID并使用它即可。

这里


3
通常呢?什么时候不 我不明白的原因是,如果要创建RCOMM服务器,就不会使用RFCOMM UUID。
ForeverWintr

1
好吧,UUID通用标识符。RFCOMM只是蓝牙协议栈上的一层,并且按照蓝牙规范具有关联的UUID。并由SDP使用,但不完全确定其用途;但您始终可以在规范中阅读它。现在,如果要基于RFCOMM协议创建服务,则必须提供SDP要求的UUID,否则将不会发现您的服务。
nullpotent 2012年

3
在网上找到了这个。所有??BT的UUID。sviluppomobile.blogspot.de/2012/11/…–
Orri

链接已失效-是常见UUID的列表吗?
user172514519年

7

UUID在概念上类似于Internet中的端口号。但是,蓝牙和Internet之间的区别在于,在蓝牙中,端口号是由SDP(服务发现协议)服务器在运行期间动态分配的,其中每个UUID都被赋予了一个端口号。其他设备将询问在保留端口号下注册的SDP服务器有关该设备上的可用服务,并且它将通过在不同的UUID下进行注册来以彼此不同的不同服务进行答复。


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


1

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

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


0

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.