【问题标题】:Get advertisement data for BLE in iOS在 iOS 中获取 BLE 的广告数据
【发布时间】:2014-05-15 00:28:38
【问题描述】:

我正在创建一个应用程序,它可以获取范围内所有 BLE 设备的 UUID。我已经让它在 Android 中运行良好,它以字节数组的形式提供广告数据。现在我正在尝试在 iOS 中做同样的事情。

我正在运行扫描,它正在检测设备,并且在回调中有一个名为 adsData 的 NSDictionary。但里面唯一的信息如下:

kCBAdvDataChannel = 39;
kCBAdvDataIsConnectable = 1;
kCBAdvDataLocalName = jaalee;
kCBAdvDataTxPowerLevel = 0;

我认为我应该获得整个广告包的想法是否正确?如果没有,我怎样才能得到它?

【问题讨论】:

  • 您不能,除非 BLE 设备在其广告数据中明确添加其他信息。 Core-Bluetooth 提供高级实现。你还想要什么其他信息?
  • Corebluetooth 提供了 CBPeripheral 对象。 identity 属性提供 UUID,它等同于但不是 MAC 地址。 UUID 也可以定期更改,尤其是在外围设备是 iOS 设备时
  • 另外,我注意到您标记了您的问题 [ibeacon] - 您是否尝试收集 BLE 外围设备或 iBeacons - 在 iOS 上,前者由 CoreBluetooth 框架处理,后者由 CoreLocation 框架处理跨度>
  • 这适用于所有 BLE 设备,包括 iBeacons。 CBPeripheral 对象没有标识属性——它有一个标识符属性,但这只是 iOS 内部的一个临时标识符。我需要 BLE 设备在其广告中广播的内容。
  • 基本上,在 iOS 上,您不能执行“所有 BLE 设备,包括 iBeacons”——您必须为具有服务的通用可连接设备与仅广告 iBeacons 使用不同的 API。

标签: ios objective-c bluetooth-lowenergy ibeacon


【解决方案1】:

很遗憾,iOS 不允许您访问原始广告数据。我写了一个blog post 来证明这一点。 虽然这篇文章专门针对 iBeacons,但它适用于任何 BLE 广告。

编辑:为了澄清,您可以读取非 iBeacon 广告的原始制造商数据字节或服务数据字节。只有 iBeacon 广告的制造商数据字节被CoreLocation 隐藏。见这里:Obtaining Bluetooth LE scan response data with iOS

等效的 MacOS CoreLocation 方法确实允许这样做,因此这可能是对 iOS 的故意安全或省电限制。

【讨论】:

  • 我实际上只是在看那篇博文。除了我设备上的其他应用程序这样做之外,我所看到的一切都同意你的看法。一个名为 Locate iB 的工具显示 BLE 设备的 UUID 以及其他信息。所以我在“因为别人可以做到”这一点上犯了错误。
  • 其他应用程序可能只是使用特性来获取此信息,假设它们会到位,所以我会接受你的回答,因为此时它似乎最有可能。
  • 我实际上是您提到的 Locate IB 应用程序的作者。它获取 iBeacon Proximity UUID 的方式来自 CoreLocation 的 didRangeBeaconsInRegion 回调,该回调依赖于操作系统级代码来解析原始广告数据,并且只为您提供某些字段,在本例中为 iBeacon Proximity UUID、Major 和 Minor。
  • 听起来这就是我需要做的。感谢您的帮助。
  • 这似乎缺少主要功能。即使它不允许读取原始广告,它也应该允许读取至少一些字节的自定义数据。我可以在固件中修改的唯一内容是kCBAdvDataLocalName,但发送让我们说温度没有意义。
【解决方案2】:

基于 Apple iOS 的官方文档和我的个人经验:

是的,iOS 不允许您访问 RAW 广告数据。

但是

如果您的目的是将信息放入广告包中并从 iOS 应用程序中读取它们而不连接外围设备,则可以这样做。 这里描述了如何:

1) 在外设固件中,您必须在广告包中插入制造商指定数据,数据类型为 GAP_ADTYPE_MANUFACTURER_SPECIFIC (0xFF ) 请记住,在制造商特定数据中,前 2 个八位字节包含公司标识符代码,然后是附加的制造商特定数据

2) 在 iOS 中

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

您可以在advertisingData字典中查看制造商特定数据,键为:

CBAdvertisementDataManufacturerDataKey

3) 如果您希望在您的应用程序中收到每个外围设备发送到 iOS 的广告数据包的回调通知,请记住将扫描选项更改为 YES。看看这个帖子:Core Bluetooth - constant RSSI updates of in-range devices

在我的博文中很快会有教程:http://www.megabri.com/

【讨论】:

    猜你喜欢
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    相关资源
    最近更新 更多