iBeacon iOS 10:设备可以扫描并接收来自其他外围设备的广告吗?

Opr*_*mus 2 ios bluetooth-lowenergy ibeacon swift

这里是全新的。

Tl; dr:iOS 设备是否可以发布可由另一台 iOS 设备扫描的 CB 广告(CBAdvertisementDataServiceUUIDsKey 和/或 CBAdvertisementDataLocalNameKey)?

我相信我的问题是基于 iOS 更高版本中对 CoreBluetooth 和 CoreLocation 的弃用和更改的新鲜问题。另外,就目前而言,我仅指“前台”操作。

从我阅读和测试的内容来看,外围设备可以使用 CL 传输信标区域(唯一的邻近 UUID,主要和次要(但特别是没有“标识符”))。使用 CB,外围设备还可以“通告”两个少量额外数据中的任何一个:CBAdvertisementDataServiceUUIDsKey 和 CBAdvertisementDataLocalNameKey。

我无法实现的是让设备(例如 iPhone)使用 CB 扫描这些附加键中的任何一个,也没有我提到的使用 CL 或 CB 的可选“标识符”。

指定扫描的唯一选项需要 CBUUID,但未发现的 iOS 外围设备在技术上不能宣传:

central.scanForPeripherals(withServices: [CBUUID]?, options: [String : Any]?)
Run Code Online (Sandbox Code Playgroud)

似乎以下内容可行,但似乎 adsData 不包含上面的键,即使是 [String : Any]:

func centralManager(_ central: CBCentralManager,
                             didDiscover peripheral: CBPeripheral,
                             advertisementData: [String : Any],
                             rssi RSSI: NSNumber){
//code
}
Run Code Online (Sandbox Code Playgroud)

任何帮助/答案将不胜感激。谢谢!

dav*_*ung 5

不幸的是,iOS 在这里非常无用。Apple 以多种方式锁定 CoreBluetooth。

发送/接收广告有三种基本方式:

信标

  • 您可以在前台和后台使用 CoreLocation 扫描 iBeacon 广告,响应迅速,但数据字段仅限于 ProximityUUID,主要和次要。

  • 您只能在前台使用 CoreBluetooth 传输 iBeacon 广告。

低功耗蓝牙服务广告

  • 您可以使用 CoreBluetooth 在前台(而不是后台)传输这些数据,但不能附加任意数据。但是,您可以发送 16 字节的任意服务 UUID。

  • 您可以在前台和后台使用 CoreBluetooth 扫描服务广告,并以快速的前台响应和缓慢的后台响应读取服务 UUID。如果使用 16 位服务 UUID,您还可以从这些广告中读取最多 18 个字节的附加数据。埃迪斯通就是这样工作的。

蓝牙 LE 制造商广告

  • 除了上述特殊的 iBeacon 广告外,您根本无法在 iOS 上使用 CoreBluetooth 为制造商广告做广告。

  • 您可以使用 CoreBluetooth 扫描制造商广告,并且可以读取最多 23 个字节的附加数据。您根本无法在后台进行检测,但前台检测很快。

底线:如果您想在前台或后台将广告数据从一台 iOS 设备发送到另一台,iBeacon 是唯一的方法。