搜索所有iBeacon,而不仅限于特定UUID

20

是否可能搜索附近的所有?我知道可以通过UUID搜索。但我想找到附近的所有。


出于安全原因,API不允许这样的调用,但我可以看出这将是非常有趣的。一个想法是反向工程iBeacon规范,扫描所有附近的外围设备,然后查看广播的广告是否为iBeacons。不幸的是,苹果没有发布iBeacon规范。但似乎他们在广告中使用编码信息来创建iBeacon。因为iBeacon的UUID将是随机的,所以除非你是苹果,否则很难仅从广告中确定外围设备是否为iBeacon。 - PaulWoodIII
4
我有一个Mac应用程序,非常适合调试,但无法在iOS设备上运行...如果您感兴趣,可以在此处找到它:https://github.com/liamnichols/iBeaconScanner - liamnichols
我制作了一个可以在iOS设备上运行的应用程序(需要越狱):http://www.malcolmhall.com/products/ibeaconscanner/ - malhal
5个回答

12

iBeacon是一个区域,其定义属性为UUID。因此,您只能搜索与特定UUID匹配的iBeacon。 通过使用委托回调,您可以找到具有特定UUID的一个或多个iBeacon,并确定哪个离您最近,在这个过程中,iBeacon存储在一个根据距离排序的数组中。

有很好的示例代码以及相当详细的WWDC视频会议:"Core Location新功能"


我也搜索了一些示例代码。你在开发网站上找到这段代码的吗? - Christian
1
https://developer.apple.com/downloads/index.action 是从顶部数起的第五个链接。您想要下载“Airlocate”示例。 - Joride
3
我已经编写了一个非常简单的应用程序,演示了iBeacons API的工作原理:https://github.com/nicktoumpelis/HiBeacons。希望它有用。 - Nick Toumpelis
你可以在安卓上做到这一点,但在iOS上不行。这里有一个详细的讨论,解释为什么在iOS上不可能实现:http://developer.radiusnetworks.com/2013/10/21/corebluetooth-doesnt-let-you-see-ibeacons.html - davidgyoung
1
@NickToumpelis 我无法感谢你。非常感谢。这对我非常有帮助。谢谢。 - Christian

7
iBeacons是比普通BLE外设更高级别的构造。从苹果文档中可以确定,beacons与其服务UUID相关联。也就是说,一组beacons是一个“区域”,你会进入和退出一个区域,基于beacon对于你的范围和可见性,而不是相反。遗憾的是,苹果使用了术语“区域”,这大多数人可能会将其与MapKit相关联,因此增加了普遍的混淆。
坏消息是:你只能扫描你知道的ProximityUUIDs,没有“通配符”ProximityUUID。此外,CLBeacons在CoreBluetooth底层方面没有公开太多东西,因此如果您想找到附近所有的beacons,您将需要使用CoreBluetooth来扫描外设,然后查看返回的外设并查询每个外设以查找beacon。当然,苹果既没有向Bluetooth SIG注册iBeacon特性,也没有(但)发布它,因此您需要一个BT嗅探器来反向工程分析何为iBeacon与任何其他BLE设备的区别。

3
根据http://developer.radiusnetworks.com/2013/10/21/corebluetooth-doesnt-let-you-see-ibeacons.html,使用CoreBluetooth无法识别iBeacon。 - TomTasche

5
很遗憾,目前您无法在不事先知道proximityUUID值的情况下搜索任意iBeacon。我曾尝试直接编写COREBluetooth,虽然您可以发现并连接到区域内的发射信标,但是您得到的返回信息是无关BLE UUID的胡言乱语。因此,您甚至无法确认已连接的外围设备实际上是iBeacon。
这似乎不是BLE规范的限制,而是由苹果强加的限制。同样,Android平台似乎不存在这种限制。
在填补这个差距之前,Android在这个领域将比iOS具有显着优势。
我不同意以前的评论认为扫描UUID是无用的。相反,如果您知道信标UUID,您可以在云中创建信标/位置/主题地图,并使用它来导航(假设信标是固定的)使用网络服务。您可以众包数据,以便终究所有想要编写位置应用程序的人都可以获得非常丰富的信标UUID /位置对数据库。也许这就是苹果隐藏信息的原因;他们可能将这些信息保留给自己的目的。

5
每个应用程序都会使用自己特定的UUID,使用“major”和“minor”整数值来区分信标。
例如,UUID将与一系列商店相关联,major将识别商店,而minor则是过道,甚至是一组产品。
扫描未知的UUID不是很有用,因为您的应用程序不知道如何处理这些信息。
UUID仅需生成一次,使用终端中的“uuidgen”命令即可。
遗憾的是,实际上没有与信标通信的协议,因此没有获取信标位置或任何其他有用信息的标准。
如果我们可以打开到信标的连接(通常是最近的一个),并从中获取其他数据,而无需在同一WIFI网络上,那将会更好。
您可以使用Bonjour通过WIFI与设备通信,也可以使用major和minor ID从某种WebService中获取数据。

“扫描未知UUID可能没有太大用处,因为您的应用程序不知道如何处理这些信息。” 这是非常错误的,因为有时候需要查看所有信标而没有任何上下文。 - Terminus

0

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