【发布时间】:2012-09-13 13:00:50
【问题描述】:
我的问题是 CBPeripheral 的 UUID 似乎不是唯一的。
我有两台 iPad2 和一台蓝牙 4.0 设备。
蓝牙设备的UUID与两个iPad不同。
如下图所示。
有没有办法在 iOS 设备上找到蓝牙设备的唯一 UUID?
我需要找到一个在不同设备之间不会改变的 UUID 或 mac 地址。
非常感谢,请帮帮我!!
【问题讨论】:
标签: ios5 core-bluetooth
我的问题是 CBPeripheral 的 UUID 似乎不是唯一的。
我有两台 iPad2 和一台蓝牙 4.0 设备。
蓝牙设备的UUID与两个iPad不同。
如下图所示。
有没有办法在 iOS 设备上找到蓝牙设备的唯一 UUID?
我需要找到一个在不同设备之间不会改变的 UUID 或 mac 地址。
非常感谢,请帮帮我!!
【问题讨论】:
标签: ios5 core-bluetooth
我一直在寻找一种方法来部署独立于平台的 BLE 设备静态配置。我越来越气馁(Apple 的 UUID 是 +/- 无意义的,并且可以在大多数/所有其他平台上获得的 MAC/BDADDR 无法从 CoreBluetooth 访问)。幸运的是,我注意到“设备信息服务”配置文件 (0x180A) 包含一个“系统 ID”属性 (0x2A23),它对设备的唯一 MAC/BDADDR 地址进行编码。但是,我不知道 BLE 设备是否必须公开此服务。
【讨论】:
00:00:00:00:00:00:00:00。
外设使用至少每 15 分钟更改一次的随机可解析地址,此时外设看起来是新的。要更改此行为,您需要与外围设备配对,然后您将看到 UUID 并且它将是持久的。
【讨论】:
为了回答您的问题,UUID 在同一对 iDevice-btDevice 下是唯一的,但如果您更改 iOS 设备,它会发生变化,正如您在尝试中注意到的那样。
不幸的是,要达到拥有唯一标识符的目标,您必须修改固件并添加应用程序标识符。
【讨论】:
如果您在开发和控制蓝牙 4.0+ 设备时,
将您的蓝牙设备地址指定为设备名称,并通过扫描响应包进行广播。
扫描响应包是蓝牙设备在主设备(例如智能手机)发送扫描请求后广播的31字节数据。
重要
有些蓝牙设备允许在不编程的情况下设置它们的名称,例如HM-10蓝牙模块名称可以通过AT+NAME文本命令来更改。
您可以在蓝牙广告数据包中添加一些独特的“制造商特定数据”并从iOS读取。正如其他答案中提出的那样,它比从“设备信息服务”中读取“系统 ID”属性要快得多,因为它不需要连接到蓝牙设备。
广告数据是蓝牙 4.0+ 在某个时间间隔(从 20 毫秒到 10 秒)向空中(在任何人连接之前)广播的 31 字节数据,具体取决于此设备配置。
还有扫描响应数据,是蓝牙设备在主设备(例如智能手机)发送扫描请求后广播的额外的31字节包。与广告数据包结构相同。
总共有 31+31=62 字节的数据可供我们使用。
第一个字节描述了 AD Struct 的长度,包括 1 个字节的数据类型 + 可变大小的有效负载。
第二个字节描述了存储在 AD Struct 中的数据类型,here list of identifiers。
所有后面的字节都是有效载荷数据。
对于广告数据必须包含配置标志 AD 结构(不关心扫描响应),它需要 3 个字节。我们还剩下 28 个字节。
假设您开发自己的 GATT 服务,因此您需要在广告数据中指定它的标识符。自定义 GATT 服务 UUID 标识符只能是 128 位全长格式(不同于蓝牙标准预定义的 16 位和 32 位服务标识符)。在广告数据中,它将消耗 2+16=18 个字节。所以,我们还剩下 10 个字节。
现在我们可以定义制造商数据 2个字节用于长度和数据类型
有效载荷中的前 2 个字节用于公司标识符(根据文档补充蓝牙核心规范第 1.4 节的要求),公司标识符由 Bluetooth Special Interest Group 分配
出于测试目的,您可以使用 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 字节的有效负载。
【讨论】: