iOS后台BLE广播Android无法检测到。

9
当iOS BLE外设进入后台状态时,广告包不会以常规方式发出,而是放置在一个特殊的“溢出”区域中,只有另一个明确寻找该设备的iOS设备才能检测到它们。
引用: 蓝牙外设后台执行模式 也就是说,在您的应用程序在后台广告时,与您的应用程序在前台时不同。特别是,在应用程序在后台广告时:
• CBAdvertisementDataLocalNameKey广告键被忽略,外设的本地名称不会被广告。
• CBAdvertisementDataServiceUUIDsKey广告键值中包含的所有服务UUID都放置在一个特殊的“溢出”区域中;它们只能被明确扫描它们的iOS设备发现。
是否有任何方法可以使Android中央(扫描器)在不连接到iOS外设的情况下检测到任何已广告的自定义UUID?

1
@KaizerSozay 不行。唯一的解决方法可能是... 将每个其他的iOS设备排队 -> 连接 -> 查找您的serviceUUID -> 如果存在,则执行您的操作 -> 断开连接。是的,这很慢,而且不像只读取广告数据包那样异步,但这是我目前所知道的唯一解决方法。 - Ahimsa Das
1
一个Android中心设备(扫描器)可以检测到处于后台状态的iOS外围设备(广告者),但是如果没有连接,将无法读取任何自定义服务UUID。您可以通过阅读制造商ID来确定这是苹果设备 - 寻找Apple即可。 - Ahimsa Das
1
是的,没错!你可以尝试使用这个Blessed Library - 但是你需要根据自己的需求/条件自己编写排队和连接逻辑。 - Ahimsa Das
1
你不能编写通用代码,使其适用于每种情况。你必须定义自己的UUID、扫描/广告条件和设置。请仔细阅读Android和iOS BLE文档,一旦明确定义了您的用例和要求,就可以轻松实现它。此外,苹果和谷歌已经联手(https://www.theverge.com/2020/4/10/21216484/google-apple-coronavirus-contract-tracing-bluetooth-location-tracking-data-app)努力使用BLE来追踪COVID-19大流行的接触者。我们*可能*会看到一些核心BLE堆栈的变化,以实现更好的跨平台互操作性。 - Ahimsa Das
1
只需执行非过滤扫描,然后手动查看每个scanResult以查找您的自定义serviceUUID。如果在此处找不到它,请检查它是否为苹果设备并将其排队进行连接(如上所述)。 - Ahimsa Das
显示剩余9条评论
1个回答

1
我猜“overflow”区域指的是扫描响应数据。要获取该数据,设备必须执行主动扫描,而不是被动扫描。在主动扫描中,扫描器在检测到广告包后立即发送扫描请求包。只有在广告设备检测到扫描请求时,才会广播扫描响应数据。
Android 设备仅执行主动扫描,因此您应该没问题。
编辑:上面的答案是不正确的。请参见http://www.davidgyoungtech.com/2020/05/07/hacking-the-overflow-area获取正确的信息。

1
iOS中央(扫描器)可以通过在实例方法scanForPeripherals()中指定要查找的serviceUUID,来检测处于后台或前台状态的iOS外设(广告者)。因此,您不必担心iOS扫描器进行主动或被动扫描。 - Ahimsa Das
1
@FilipLuchianenco,“溢出区”是由iOS外设(广告者)发出的BLE广告数据包的一个部分,除了明确寻找它的iOS中央(扫描器)之外,任何设备都无法读取或检测到它 - 使用我最初评论中提到的serviceUUID。 - Ahimsa Das
1
我在这里找到了一些调查资料:https://github.com/crownstone/bluenet-ios-basic-localization/blob/master/BROADCASTING_AS_BEACON.md。 - Emil
3
是的,基本上无法解密处于后台状态的iOS外围设备(广告主)发出的广告数据包(更具体地说是溢出区域数据)。 - Ahimsa Das
3
这取决于你对“看到”这个词的定义。你可以检测任何状态下的设备,但如果外围设备(广告者)是后台运行的 iOS 设备并且中央设备(扫描器)是非 iOS 设备,则无法在连接外围设备之前读取自定义服务UUID。 - Ahimsa Das
显示剩余10条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接