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)
任何帮助/答案将不胜感激。谢谢!
不幸的是,iOS 在这里非常无用。Apple 以多种方式锁定 CoreBluetooth。
发送/接收广告有三种基本方式:
信标
您可以在前台和后台使用 CoreLocation 扫描 iBeacon 广告,响应迅速,但数据字段仅限于 ProximityUUID,主要和次要。
您只能在前台使用 CoreBluetooth 传输 iBeacon 广告。
低功耗蓝牙服务广告
您可以使用 CoreBluetooth 在前台(而不是后台)传输这些数据,但不能附加任意数据。但是,您可以发送 16 字节的任意服务 UUID。
您可以在前台和后台使用 CoreBluetooth 扫描服务广告,并以快速的前台响应和缓慢的后台响应读取服务 UUID。如果使用 16 位服务 UUID,您还可以从这些广告中读取最多 18 个字节的附加数据。埃迪斯通就是这样工作的。
蓝牙 LE 制造商广告
除了上述特殊的 iBeacon 广告外,您根本无法在 iOS 上使用 CoreBluetooth 为制造商广告做广告。
您可以使用 CoreBluetooth 扫描制造商广告,并且可以读取最多 23 个字节的附加数据。您根本无法在后台进行检测,但前台检测很快。
底线:如果您想在前台或后台将广告数据从一台 iOS 设备发送到另一台,iBeacon 是唯一的方法。