Android:蓝牙 UUID 如何工作?

Posted

技术标签:

【中文标题】Android:蓝牙 UUID 如何工作?【英文标题】:Android: How do bluetooth UUIDs work? 【发布时间】:2012-12-07 12:15:52 【问题描述】:

我不明白蓝牙 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 套接字,我对此感到更加困惑。

谁能帮我解惑?

【问题讨论】:

除学术目的外,从未使用过蓝牙连接,但我所知道的是,UUID 是设备的标识符,类似于设备的地址,对于设备来说保持不变。 @Creator:这与这个答案相矛盾:***.com/a/4963069/1286571 这就是我对蓝牙 UUID 的全部了解,您可以尝试阅读此 pdf 以更好地了解蓝牙协议和 UUID -people.csail.mit.edu/rudolph/Teaching/Articles/PartOfBTBook.pdf 问题:当Android手机不支持远程设备的UUID时是否有任何后果。 (Android 中未列出 UUID ... getUuids() )? 嘿嘿嘿!我想问一些事情,@ForeverWintr,如果我用自己的格式定义一个 UUID 并在两个 android 设备中使用,可以吗?我的意思是,他们可以互相交流吗? 【参考方案1】:

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

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

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

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

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

【讨论】:

所以 RFCOMM 服务的完整 UUID 是:00000003-0000-1000-8000-00805F9B34FB ? 注意:它们列出了服务 ID 的缩写形式,即 32 位。您将它与 BT SIG 的基本 UUID 00000000-0000-1000-8000-00805F9B34FB 结合使用,替换 GUID 的前 4 位。前任。 RFCOMM 为 0x0003,因此 RFCOMM 服务的 UUID 为 00030000-0000-1000-8000-00805F9B34FB【参考方案2】:

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

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

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

见here

【讨论】:

通常会吗?什么时候没有?我不明白为什么,如果我正在创建 RCOMM 服务器,我不会使用 RFCOMM UUID。 嗯,UUID通用标识符。 RFCOMM 只是蓝牙协议栈上的一层,根据蓝牙规范有关联的 UUID;并且被 SDP 使用,不完全确定是为了什么;但你总是可以在规范中阅读它。现在,如果您在 RFCOMM 协议之上创建服务,则必须提供 SDP 要求的 UUID,否则您的服务将不会被发现。 在网上找到了这个。全部?? BT 的 UUID。 sviluppomobile.blogspot.de/2012/11/… 链接已失效 - 它是常见 UUID 的列表吗?【参考方案3】:

在蓝牙中,所有对象都由 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。如果您是蓝牙 SIG 成员,那么他们会提供一种算法来生成与您的成员 ID 相关联的 UUID。【参考方案4】:

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

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

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

所以,为每个设备使用相同的UUid

【讨论】:

【参考方案7】:

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

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

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

【讨论】:

以上是关于Android:蓝牙 UUID 如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

Android:获取蓝牙设备的uuid

转Android低功耗蓝牙应用开发获取的服务UUID

Android 到 Linux 蓝牙未找到所有 UUID

Linux蓝牙找不到带有UUID的Android服务

Android BLE蓝牙开发-读写数据 获取UUID

求助,求大神,android与串口通信