我的问题是CBPeripheral的UUID似乎并不是唯一的。
我有两个iPad2和一个bluetooth4.0设备。
蓝牙设备的UUID与两台iPad不同。
如下图所示。
有没有办法在iOS设备上找到蓝牙设备的唯一UUID?
我需要找到一个在不同设备之间不会改变的UUID或mac地址。
非常感谢,请帮助我!!
答案 0 :(得分:9)
我一直在寻找一种方法来部署与平台无关的静态BLE设备配置。我感到沮丧(Apple的UUID是+/-无意义,并且无法从CoreBluetooth访问可在大多数/所有其他平台上获得的MAC / BDADDR)。幸运的是,我注意到“设备信息服务”配置文件(0x180A)包含“系统ID”属性(0x2A23),该属性对设备的唯一MAC / BDADDR地址进行编码。但是,我不知道BLE设备是否必须公开此服务。
答案 1 :(得分:5)
外围设备使用随机可解析的地址,该地址至少每15分钟更改一次,此时外围设备将显示为新的。要更改此行为,您需要与外围设备配对,然后您将看到UUID并且它将是持久的。
答案 2 :(得分:1)
要回答你的问题,UUID在同一对iDevice-btDevice下是唯一的,但是如果你改变了iOS设备就会改变,正如你在试试中注意到的那样。
为了实现具有唯一标识符的目标,遗憾的是,您必须修改固件并添加应用程序标识符。
答案 3 :(得分:0)
如果您开发和控制蓝牙4.0+设备,
将您的蓝牙设备地址指定为设备名称,并通过扫描响应包进行广播。
扫描响应包是主设备(例如智能手机)发送扫描请求后蓝牙设备广播的31字节数据。
重要强>
某些蓝牙设备允许在不编程的情况下设置其名称,例如可以使用AT + NAME文本命令更改HM-10蓝牙模块名称。
您可以在蓝牙广告数据包中添加一些独特的“制造商特定数据”,并从iOS中读取。它比从“设备信息服务”中读取“系统ID”属性要快得多,正如其他答案所提出的那样,因为它不需要连接到蓝牙设备。
广告数据是31个字节的数据,蓝牙4.0+在某个时间间隔(从20ms到10s)播放到空中(在任何人连接之前),具体取决于此设备配置。
还有扫描响应数据,它是主设备(例如智能手机)发送扫描请求后蓝牙设备广播的31字节的额外包。它与广告数据包具有相同的结构。
我们可以使用31 + 31 = 62个字节的数据。
第一个字节描述AD Struct的长度,包括1个字节的数据类型+可变大小的有效载荷。
第二个字节描述了存储在AD Struct中的数据类型here list of identifiers。
所有后来的字节都是有效载荷数据。
对于广告数据,必须包含配置Flags AD Struct(与扫描响应无关),需要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字节有效载荷。