【问题标题】:CoreBluetooth discover pheriperal advertisementData formatCoreBluetooth 发现外设广告数据格式
【发布时间】: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
  • 广告包中的数据是什么格式的?数据可能不代表字符串..

标签: ios objective-c core-bluetooth


【解决方案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 知道如何访问字典的内容,但他不知道如何处理它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    • 2017-01-30
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多