Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用核心蓝牙在iOS 8上访问自定义BLE设备的原始广告数据_Ios_Objective C_Bluetooth_Core Bluetooth_Ibeacon - Fatal编程技术网

使用核心蓝牙在iOS 8上访问自定义BLE设备的原始广告数据

使用核心蓝牙在iOS 8上访问自定义BLE设备的原始广告数据,ios,objective-c,bluetooth,core-bluetooth,ibeacon,Ios,Objective C,Bluetooth,Core Bluetooth,Ibeacon,我想问一下,是否可以从使用核心蓝牙API中的Raspberry Pi构建的自定义BLE设备访问原始广告数据 用例是将不断变化的数据从Raspberry Pi广播到附近的多个iOS设备,并在iOS应用程序中使用它们。请参见中的拓扑描述 我已经发现iBeacon广告是从核心蓝牙API中过滤出来的,只能从核心位置API访问,这需要了解UUID。由于数据不断变化,定制的iBeacon无论如何都不能用于这个特定的用例。但我不确定我是否能通过核心蓝牙实现这一点。快速回答是“没有直接的方法” 原因: 因为Co

我想问一下,是否可以从使用核心蓝牙API中的Raspberry Pi构建的自定义BLE设备访问原始广告数据

用例是将不断变化的数据从Raspberry Pi广播到附近的多个iOS设备,并在iOS应用程序中使用它们。请参见中的拓扑描述

我已经发现iBeacon广告是从核心蓝牙API中过滤出来的,只能从核心位置API访问,这需要了解UUID。由于数据不断变化,定制的iBeacon无论如何都不能用于这个特定的用例。但我不确定我是否能通过核心蓝牙实现这一点。

快速回答是“没有直接的方法”

原因:
因为CoreBluetooth过滤掉广告数据,除了
kCBAdvDataServiceUUIDs
KCBADVDATAOCALNAME
,所以现在可以通过广告将自定义数据从外围设备传递到中心设备

我们如何解决:
外围设备
1) 拥有一些定制服务(我们称之为“BeaconService”)。
2) BeaconService包含信标的UUID、主要和次要特征。
3) 播发BearConservice UUID(通过
KCBADVDATAServiceUUID
key)

中央
1) 扫描具有BEAService UUID的外围设备。
2) 找到的外围设备已排队。
3) 将打开与排队的外围设备的连接,并从BearConservice读取iBeacon信息。
4) 读取值可用于启动CoreLocation信标监测/测距


因此,通过这种方式,您可以建立从CoreBluetooth到CoreLocation的桥接。

如果您将Raspberry Pi更改为传输非iBeacon格式,则可以执行您想要的操作
CoreBluetooth
仅过滤出iBeacon广告的原始字节。请看这里:

一个简单的解决方案是将iBeacon广告更改为开源广告
CoreLocation
将不再拾取它,但
CoreBluetooth
将拾取它

下面是一个示例,说明您在
CoreBluetooth
回调中的advertisementData
NSDictionary
中得到了什么。此示例是检测到AltBeacon广告(开源信标标准)的结果,其标识符为2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6 1 2:

{
    kCBAdvDataIsConnectable = 0;
    kCBAdvDataManufacturerData = <1801beac 2f234454 cf6d4a0f adf2f491 1ba9ffa6 00010002 be00>;
}
{
KCBadvDataDisconnectable=0;
kCBAdvDataManufacturerData=;
}

通过查看AltBeacon规范,您可以了解如何解码上述字节。请注意,以上是iOS8上检测到的广告的
NSDictionary
的实际内容,这些内容是使用
NSLog
语句打印到控制台的。

但是您可以在不建立连接的情况下获取这些特征数据吗与外围设备,即仅来自广告?(这个问题实际上不是关于iBeacons的,我不需要任何邻近UUID,而是一个自定义生成的数据。)我们正在做的是,从外围设备端宣传我们的服务UUID,所以中心只扫描具有特定serviceUUID的外围设备,然后我们将这些外围设备排队,并读取信标特征。是的,我们正在连接到外围设备。但是,你必须连接到外围设备,还是只是在扫描过程中获取数据?我认为这个答案只适用于iBeacon广告。对于非iBeacon广告,iOS上的
CoreBooth
不会过滤数据。我问这个问题是为了澄清这是否适用于非iBeacon格式,因为大多数人不区分BLE设备和iBeacon。我有点困惑,因为@l0gg3r(另一个答案的作者)说广告数据被过滤掉了所有的BLE设备。。。那么这是错的吗?我看你也更新了你的另一个答案,这也让我感到困惑:这是一份来自Apple doc的副本“虽然广告数据包通常可以保存有关外围设备的各种信息,但您可以只宣传设备的本地名称和您想要宣传的任何服务的UUID。也就是说,当您创建广告词典时,您可以只指定以下两个键:CBAdvertisementDataLocalNameKey和CBAdvertisementDataServiceUUIDsKey“您的参考是关于从iOS设备进行传输。在您的问题中,您询问的是从Raspberry Pi发送和从iOS设备接收。所以我不认为复制适用。我只是测试了这个,并确认原始广告字节没有在iOS8上对非iBeacon广告进行过滤。请参阅我编辑的答案,其中粘贴了扫描AltBeacon和读取iOS 8设备上原始字节的实际结果。若要复制,请运行modify your transmitter发送非iBeacon广告,并使用示例代码从以下博客文章中检测它: