Corebluetooth,如何获得独特的UUID?

时间:2012-09-21 05:42:52

标签: ios5 core-bluetooth

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

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

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

如下图所示。 The UUID get by the first iPad

The UUID get by the second iPad

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

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

非常感谢,请帮助我!!

4 个答案:

答案 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+设备,

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

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

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

重要

某些蓝牙设备允许在不编程的情况下设置其名称,例如可以使用AT + NAME文本命令更改HM-10蓝牙模块名称。

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

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

长解释

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

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

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

广告数据包含一组广告数据结构(AD结构)enter image description here

第一个字节描述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字节有效载荷。