这里是全新的。
Tl;dr:一个 iOS 设备可以发布一个 CB 广告(CBAdvertisementDataServiceUUIDsKey 和/或 CBAdvertisementDataLocalNameKey),另一个 iOS 设备可以扫描它吗?
我相信我的问题是基于 iOS 的更高版本中对 CoreBluetooth 和 CoreLocation 的弃用和更改而提出的。另外,目前,我仅指“前台”操作。
根据我阅读和测试的内容,外围设备可以使用 CL 传输信标区域(唯一的邻近 UUID、主要和次要(但值得注意的是没有“标识符”))。使用 CB,外围设备还可以“通告”两个少量的额外数据中的任何一个:CBAdvertisementDataServiceUUIDsKey 和 CBAdvertisementDataLocalNameKey。
我无法实现的是让设备(例如 iPhone)使用 CB 扫描这些附加键中的任何一个,也没有像我提到的使用 CL 或 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
}
如有任何帮助/回答,我们将不胜感激。谢谢!
最佳答案
不幸的是,iOS 在这方面毫无帮助。 Apple 以多种方式锁定 CoreBluetooth。
发送/接收广告的三种基本方式:
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 是唯一的方法。
关于ios - iBeacon iOS 10 : Can device scan for and receive advertisements from other peripheral devices?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42730106/