树莓派配备BLE Dongle可以探测iBeacons吗?

39

我从Radius Networks购买了一个开发人员套件,其中包括一个ioGear GBU521 BLE 4.0 dongle和一个Raspberry Pi。我还买了他们的一个RadBeacon iBeacons。它们都按照所述方式工作,但我有些惊讶我获得了什么。

我一直认为RaspPi可以检测iBeacons。而事实上,这个套件是设置用于创建一个iBeacon。我的用例是检测叉车何时进入特定的房间,以便我可以给他们发送工作。我的想法是在叉车上放置一个iBeacon,然后放置一个搜寻iBeacons的RaspPi。当检测到一个iBeacon(叉车)时,可以得出结论它附近。我将把RaspPi连接到LAN并通过REST或类似通信协议通信。我知道我可以使用适当的Android或Apple设备来完成它,但我不明白为什么这个dongle不能检测这些iBeacons并告诉我它们的UUID是什么?我错过了什么吗?


sudo hcitool lescan 可以检测到包括“iBeacon”格式在内的BLE广告,但只会显示硬件地址,这可能足够或不足以满足您的目的。您可能需要运行hcidump或修改hcitool的源代码,以便从中转储广告数据包内容,从中提取iBeacon样式的UUID、major、minor和传输功率字段。阅读文档和/或代码可以帮助您找到接收功率水平,并与传输级别一起使用,进行非常粗略的距离估计。 - Chris Stratton
这对Chris很有帮助。当我运行 sudo hcitool lescan 时,我能够在RaspPi上看到RadBeacon,并收到MAC地址的响应。然后在另一个SSH窗口中,我运行了 sudo hcidump -a 命令,并能够看到一些统计数据,包括RSSI。但我无法看到UUID、Major和Minor。使用 sudo hcidump -a -w outfile 命令,我可以找出UUID、Major和Minor。我也看到了功率数据的位置,但尚未对其进行解码。 - user1153660
请注意,尽管标题和标签中提到了树莓派,但这个问题基本上适用于任何使用bluez的Linux系统,只要有特权访问权限即可。 - Chris Stratton
嗨,我也想做同样的事情。自从二月份以来,你有反馈吗?有好的/小型设备可以使用吗?有相关文章吗? - Jean-Philippe Encausse
我们正在探索使用英特尔Edison内置的蓝牙功能,但他们说BLE要到第四季度才会出来。Edison似乎是理想的选择,因为它在SoC上集成了蓝牙和Wifi功能。应该可以构建一个价格与Pi竞争且在尺寸和功率方面超越它的真正小型设备。它还专门为工业设备设计。 - user1153660
3个回答

74

是的!您可以使用树莓派扫描iBeacon。下面我们提供了一个脚本来完成此操作,您也可以按照以下步骤自己完成:

  1. Start a background process that does a bluetooth LE scan:

    sudo hcitool lescan --duplicates &
    

    With the --duplicates setting the scan will not ignore multiple packets from the same iBeacon.

  2. Start an hcidump and pipe the raw output to a script that will filter for iBeacon packets:

    sudo hcidump --raw 
    
过滤是棘手的部分,hcidump 的原始输出格式不好,并且显示了不是 iBeacon 传输的数据包。为了解决这个问题,我们编写了一个过滤脚本,逐行读取输出并将原始数据包与其他输出(例如 MAC 地址等)分离开来。在 Radius Networks,我们进行了大量研究iBeacon 蓝牙配置文件,用于识别 iBeacon 数据包并将它们从其他设备的数据包中过滤出来。
我们将所有内容整合到一个名为ibeacon_scan的脚本中,包括将原始标识符转换为可读形式。你可以在此处下载它。很快,我们将在iBeacon 开发套件中包含它以添加扫描功能。
以下是脚本输出的示例:
$ ./ibeacon_scan
UUID: 74278BDA-B644-4520-8F0C-720EAF059935 MAJOR: 0 MINOR: 73 POWER: -50
UUID: 2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6 MAJOR: 1 MINOR: 6 POWER: -59
UUID: E2C56DB5-DFFB-48D2-B060-D0F5A71096E0 MAJOR: 6 MINOR: 9 POWER: -55

我们还包含了一个-b选项,用于生成易于解析到其他脚本的裸输出。以下是一个示例:
$ ./ibeacon_scan -b
2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6 1 6 -59
E2C56DB5-DFFB-48D2-B060-D0F5A71096E0 6 9 -55
74278BDA-B644-4520-8F0C-720EAF059935 0 73 -50

你可以使用此选项并将脚本的输出导入到您的脚本中,以在检测到具有特定标识符的iBeacon时触发操作。
编辑:我们已经重新制作了这个脚本,使其更加响应和健壮,并将其纳入了开发套件的最新版本中。更新可在此处下载。
编辑2:如@sai-ramachandran所指出的那样,您可以增强此脚本以捕获每个iBeacon数据包的RSSI,除了POWER之外。要实现此目的,请将以下行添加到脚本中:
 RSSI=`echo $packet | sed 's/^.\{132\}\(.\{2\}\).*$/\1/'`
 RSSI=`echo "ibase=16; $RSSI" | bc`
 RSSI=$[RSSI - 256]

并确保将RSSI添加到输出中:
 echo "UUID: $UUID MAJOR: $MAJOR MINOR: $MINOR POWER: $POWER RSSI: $RSSI"

1
针对有关 RSSI vs. POWER 的回答的编辑,似乎正确的做法是在每个数据包的第 132 个字符位置捕获以读取每个 iBeacon 数据包的 RSSI。但是,最初并没有打算在这个答案中包括 RSSI。相反,我们打算捕获 tx 校准常数,这是一个不同的字段,并且始终是相同的值(每个 iBeacon)。一旦确认这是正确的,我将编辑此答案以包括捕获 RSSI 和校准功率。 - jjnebeker
@jjnebeker 别忘了也要打印它 :) - Will Faithfull
1
如果您已经购买了我们的开发套件,您可以直接在命令行中输入“ibeacon scan”。 - jjnebeker
是的!正在运行,我该如何访问脚本?它存储在哪里?谢谢你的帮助。 - ncubica
@jjnebeker 我也遇到了同样的问题,我的 MOTE G2 手机发送了大量的 Android 5 广告数据(我认为我无法在手机端太多地控制频率),这导致即使我关闭广告,RPi 中的脚本仍然看到幻影数据,我相信脚本缓冲了大量的旧历史数据,并试图逐个处理它们。通常需要等待几分钟,然后就会消失,你有什么解决办法吗? - Shawn
显示剩余11条评论

3
你说得对,iBeacon开发套件并不是用来检测iBeacon的,而是用来作为iBeacon进行传输的。
话虽如此,使用树莓派可以检测iBeacon,方法类似于@ChrisStratton在评论中提到的。请参考我的同事@jjnebeker的答案,他已经编写了一个脚本来实现你所需要的功能。

这个脚本能够与Estimote或Gimbal信标一起使用吗? - user2005121
万向锁标签必须被设置为iBeacon模式才能工作。Estimote默认处于此模式。 - davidgyoung
@davidgyoung 我也遇到了同样的问题,我的 MOTE G2 手机发送了大量的 Android 5 广告数据(我认为我无法在手机端太多地控制频率),即使我关闭了广告,这个 RPi 中的脚本仍然看到幽灵数据,我相信这个脚本缓冲了大量的旧历史数据,并试图逐一处理它们。通常需要等待几分钟,然后它就消失了,你有什么想法如何解决这个问题吗? - Shawn

-1

https://github.com/RadiusNetworks/android-ibeacon-service

使用此功能可检测iBeacon。

它允许Android设备像iOS设备一样使用iBeacon。应用程序可以请求在一个或多个iBeacon出现或消失时接收通知。应用程序还可以请求以每秒1次的频率从一个或多个iBeacon获取范围更新。


2
我想使用RaspPi进行检测,而不是使用Android。 - user1153660

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