【问题标题】:Corebluetooth, How to get a unique UUID?Corebluetooth,如何获得唯一的 UUID?
【发布时间】:2012-09-13 13:00:50
【问题描述】:

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

我有两台 iPad2 和一台蓝牙 4.0 设备。

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

如下图所示。

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

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

非常感谢,请帮帮我!!

【问题讨论】:

    标签: ios5 core-bluetooth


    【解决方案1】:

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

    【讨论】:

    • 很好,这给了我一个唯一的设备 ID,在 iOS 设备上是相同的。这不太可能适用于所有设备,但它适用于我测试的设备(Mio Alpha 心率监测器)。谢谢
    • Gelo Beacons 似乎没有提供有用的系统 ID。至少在我的情况下,它总是00:00:00:00:00:00:00:00
    【解决方案2】:

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

    【讨论】:

    • 这是正确的实际结论,但解释错误。真正的解释不是外围设备正在随机化其地址(尽管这是可能的),而是 iOS 不会向应用程序报告实际的硬件地址,而是报告一个本地分配的临时标识符,该标识符没有已知的映射回实际源传输地址,除了在 iOS 蓝牙堆栈中维护的私有数据表。
    【解决方案3】:

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

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

    【讨论】:

    【解决方案4】:

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

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

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

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

    重要

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

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

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

    长解释

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

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

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

    广告数据由一组广告数据结构(AD struct)

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

    【讨论】:

      猜你喜欢
      • 2013-07-08
      • 1970-01-01
      • 2017-12-09
      • 2014-12-04
      • 1970-01-01
      • 2011-11-24
      • 2012-03-29
      • 2018-03-19
      相关资源
      最近更新 更多