我想询问是否可以从 Core Bluetooth API 中使用Raspberry Pi构建的自定义BLE设备访问原始广告数据?< / p>
用例是将广播不断更改的数据从Raspberry Pi广播到附近的多个iOS设备,并在iOS应用中使用它们。请参阅this article中的拓扑描述。
我已经发现iBeacon广告已从Core Bluetooth API中过滤掉,并且只能从Core Location API访问,这需要了解UUID。由于数据不断变化,自定义iBeacon无论如何都不适用于此特定用例。但我不确定我是否可以通过Core Bluetooth实现这一目标?
答案 0 :(得分:3)
如果更改Raspberry Pi以传输非iBeacon格式,则可以执行所需操作。 CoreBluetooth
仅过滤掉广告的原始字节(如果它们是iBeacon广告)。见这里:Obtaining Bluetooth LE scan response data with iOS
一个简单的解决方案是将您的iBeacon广告更改为开源AltBeacon广告。 CoreLocation
将不再提取,但CoreBluetooth
会。
以下是您在NSDictionary
CoreBluetooth
回调中的advertisementData centralManager:didDiscoverPeripheral:advertisementData:RSSI:
中获得的内容的示例。此示例是检测到AltBeacon广告(开源信标标准)的结果,标识为2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6 1 2:
{
kCBAdvDataIsConnectable = 0;
kCBAdvDataManufacturerData = <1801beac 2f234454 cf6d4a0f adf2f491 1ba9ffa6 00010002 be00>;
}
您可以通过查看AltBeacon规范here.来了解如何解码上述字节。请注意,以上是iOS8上已检测到的广告的NSDictionary
的实际内容,这些内容已打印到控制台使用NSLog
语句。
答案 1 :(得分:2)
快速回答是“没有直接的方法”。
<强>为什么:强>
因为CoreBluetooth会过滤除kCBAdvDataServiceUUIDs
,kCBAdvDataLocalName
以外的广告数据,所以现在可以通过广告将自定义数据从外围设备传递到中心。
我们如何解决方法:
的 周边 强>
1)保留一些自定义服务(让我们将其命名为'BeaconService')
2)BeaconService包含Beacon的UUID,主要,次要特征
3)通告BeaconService UUID(通过kCBAdvDataServiceUUIDs
密钥)。
<强> 中部 强>
1)扫描具有BeaconService UUID的外围设备
2)发现外围设备排队
3)连接打开到排队的外围设备,并从BeaconService读取iBeacon信息
4)读取值可用于启动CoreLocation信标监视/测距。
通过这种方式,您可以建立从CoreBluetooth到CoreLocation的桥接。