CoreBluetooth 发现外设广告数据格式

Posted

技术标签:

【中文标题】CoreBluetooth 发现外设广告数据格式【英文标题】:CoreBluetooth discover pheriperal advertisementData format 【发布时间】:2015-04-29 14:07:01 【问题描述】:

我正在使用 CoreBluetooth 发现 BLE 设备。 在

- (void)centralManager:(CBCentralManager *)central
 didDiscoverPeripheral:(CBPeripheral *)peripheral
     advertisementData:(NSDictionary *)advertisementData
                  RSSI:(NSNumber *)RSSI

我收到advertisementData 字典


    kCBAdvDataIsConnectable = 1;
    kCBAdvDataLocalName = "Gate_02";
    kCBAdvDataManufacturerData = <00ff0102 0303>;

如果我尝试阅读advertisementData[@"kCBAdvDataManufacturerData"] 类,我会得到_NSInlineData。如何转换为 NSStringNSData 对象?

【问题讨论】:

NSData *mftData = advertisementData[@"kCBAdvDataManufacturerData"]; 不起作用? 不...如果我将 NSData 转换为 NSString 我得到空字符串 什么记录mftData(来自我的示例)?你想用NSString 做什么? NSString 应该是什么样的? 我必须拆分字符串并将十六进制数字转换为十进制。但这不是问题的核心。我的问题是如何解码_NSInlineData 广告包中的数据是什么格式的?数据可能不代表字符串.. 【参考方案1】:

NSInlineData NSData。更具体地说,它是NSData 的(私有)子类——它是Cocoa 中的一种常见模式,称为class cluster。

因此您可以在NSInlineData 的实例上使用NSData 的所有方法。

我不确定“将 NSData 转换为 NSString”是什么意思。 kCBAdvDataManufacturerData 的值看起来不像NSString(因为它的第一个字节是0x00,通常用于终止字符串)。

如果要将十六进制数据转换为十进制,则无需先将其转换为NSString。您可以逐字节迭代NSData,如下所示:

  for(NSUInteger i = 0; i < data.length; ++i) 
    Byte byte = 0;
    [data getBytes:&byte range:NSMakeRange(i, 1)];
    //do something with byte

【讨论】:

【参考方案2】:

您需要使用objectForKey来访问广告数据中的不同对象

//Pull the localName and manufacturing Data out of the advertising data
NSString *localName = [advertisementData objectForKey:CBAdvertisementDataLocalNameKey];
NSData   *mfgData   = [advertisementData objectForKey:CBAdvertisementDataManufacturerDataKey];

【讨论】:

这没有回答问题 - OP 知道如何访问字典的内容,但他不知道如何处理它们。

以上是关于CoreBluetooth 发现外设广告数据格式的主要内容,如果未能解决你的问题,请参考以下文章

为啥 CoreBluetooth 一次又一次地发现相同的外设?

使用 AltBeacon 库以 CoreBluetooth 格式做广告

ios设备app作为蓝牙外设端

iOS CoreBluetooth 获取唯一的外设 ID

在 mac osx 10.13 CoreBluetooth 框架上的 CBPeripheralStateDisconnecting 状态之后,外设状态永远不会改变

首次设置 BLE 外设名称的方式和时间