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

iBeacon iOS 10: Can device scan for and receive advertisements from other peripheral devices?

这里是全新的。

Tl;dr:iOS 设备能否发布可由另一个 iOS 设备扫描的 CB 广告 (CBAdvertisementDataServiceUUIDsKey and/or CBAdvertisementDataLocalNameKey)?

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

根据我阅读和测试的内容,外围设备可以使用 CL 传输信标区域(唯一的邻近 UUID、主要和次要(但值得注意的是没有 "identifier"))。使用 CB,外围设备还可以 "advertise" 两个少量的额外数据之一:CBAdvertisementDataServiceUUIDsKey 和 CBAdvertisementDataLocalNameKey。

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

指定扫描的唯一选项需要 CBUUID,但未发现的 iOS 外围设备在技术上无法通告:

central.scanForPeripherals(withServices: [CBUUID]?, options: [String : Any]?)

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

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

任何 help/answers 这里将不胜感激。谢谢!

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

sending/receiving广告的三种基本方式:

iBeacon

  • 可以在前台和后台使用CoreLocation扫描iBeacon广告,响应速度快,但数据字段仅限于ProximityUUID,major和minor。

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

蓝牙 LE 服务广告

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

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

蓝牙 LE 制造商广告

  • 你不能在 iOS 上使用 CoreBluetooth 做制造商广告,除了上面描述的特殊 iBeacon 广告。

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

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