8

我的问题是 CBPeripheral 的 UUID 似乎不是唯一的。

我有两个 iPad2 和一个 bluetooth4.0 设备。

蓝牙设备的 UUID 与两个 iPad 不同。

如下图所示。 第一台 iPad 获取的 UUID

第二台 iPad 获取的 UUID

有没有办法在 iOS 设备上找到蓝牙设备的唯一 UUID?

我需要找到一个在不同设备之间不会改变的 UUID 或 mac 地址。

非常感谢,请帮帮我!!

4

4 回答 4

11

我一直在寻找一种方法来部署与平台无关的 BLE 设备静态配置。我越来越气馁(Apple 的 UUID 是 +/- 无意义的,并且无法从 CoreBluetooth 访问可以在大多数/所有其他平台上获得的 MAC/BDADDR)。幸运的是,我注意到“设备信息服务”配置文件 (0x180A) 包含一个“系统 ID”属性 (0x2A23),它对设备的唯一 MAC/BDADDR 地址进行编码。但是,我不知道 BLE 设备是否必须公开此服务。

于 2014-02-15T04:09:02.113 回答
7

外设使用至少每 15 分钟更改一次的随机可解析地址,此时外设看起来是新的。要更改此行为,您需要与外围设备配对,然后您将看到 UUID 并且它将是持久的。

于 2012-09-23T07:02:10.147 回答
2

为了回答您的问题,UUID 在同一对 iDevice-btDevice 的情况下是唯一的,但如果您更改 iOS 设备,它会发生变化,正如您在尝试中注意到的那样。

不幸的是,要达到拥有唯一标识符的目标,您必须修改固件并添加应用程序标识符。

于 2013-07-08T10:13:27.317 回答
2

如果您在开发和控制蓝牙 4.0+ 设备时,

选项 #1 将蓝牙地址分配给设备名称并将其放入扫描响应中

将您的蓝牙设备地址分配为设备名称,并通过扫描响应包进行广播。

Scan Response 包是蓝牙设备在主设备(例如智能手机)发送扫描请求后广播的一个 31 字节的数据。

重要的

一些蓝牙设备允许在不编程的情况下设置它们的名称,例如 HM-10 蓝牙模块名称可以通过 AT+NAME 文本命令进行更改。

选项 #2 在广告数据中发送一些独特的制造商特定数据

您可以在蓝牙广告数据包中添加一些独特的“制造商特定数据”并从 iOS 读取。正如其他答案中所建议的那样,它比从“设备信息服务”中读取“系统 ID”属性要快得多,因为它不需要连接到蓝牙设备。

长解释

广告数据是蓝牙 4.0+ 在某个时间间隔(从 20 毫秒到 10 秒)广播到空中(在任何人连接之前)的 31 字节数据,具体取决于此设备配置。

还有扫描响应数据,它是蓝牙设备在主设备(例如智能手机)发送扫描请求后广播的额外的31字节包。它具有与广告数据包相同的结构。

我们总共可以使用 31+31=62 字节的数据。

广告数据由一组广告数据结构(AD struct)组成在此处输入图像描述

第一个字节描述了 AD Struct 的长度,包括 1 个字节的数据类型 + 可变大小的有效负载。

第二个字节描述了存储在 AD Struct 中的数据类型,这里是标识符列表

所有后面的字节都是有效载荷数据。

对于广告数据,必须包含配置标志 AD 结构(不关心扫描响应),它需要 3 个字节。我们还剩下 28 个字节。

假设您开发自己的 GATT Service,因此您需要在广告数据中指定它的标识符。自定义 GATT 服务 UUID 标识符只能是 128 位全长格式(不同于蓝牙标准预定义的 16 位和 32 位服务标识符)。在广告数据中,它将消耗 2+16=18 个字节。所以,我们还剩下 10 个字节。

现在我们可以定义制造商数据 2 个字节用于长度和数据类型

有效载荷中的前 2 个字节用于公司标识符(如文档补充蓝牙核心规范第 1.4 节所要求的),公司标识符由蓝牙特别兴趣小组分配

出于测试目的,您可以使用 0xFF、0xFF 标识符

使用剩下的 6 个字节,您可以唯一识别 281,474,976,710,656 个设备。

广告数据样本,用 C 编写:

#define GAP_ADV_FLAGS                   0x01
#define GAP_ADV_128_UUID                0x06
#define GAP_ADV_MANUF_DATA              0xFF

uint8_t raw_adv_data[31] = {
//  len     type                        payload....   

    0x02,   GAP_ADV_FLAGS,              0x06,        
        
//                                      GATT service 128 bit UUID
    0x11,   GAP_ADV_128_UUID,           0x1d, 0x15, 0xee, 0x49, 
                                        0x10, 0x78, 0xc8, 0xa3, 
                                        0x9f, 0xaa, 0x82, 0x84, 
                                        0x8e, 0x28, 0xbe, 0x43, 
    
    
//                                      2 bytes of company ID
    0x09,   GAP_ADV_MANUF_DATA,         0xff, 0xff, 


//                                      6 bytes of unique data
                                        0xff, 0xff,  
                                        0xff, 0xff, 
                                        0xff, 0xff, 
};

PS:好吧,如果你需要发送更多的数据,你可以放入扫描响应包,它会给你额外的 31 字节的有效载荷。

于 2017-11-22T19:37:11.023 回答