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 是唯一的方法。
这里是全新的。
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 是唯一的方法。