【问题标题】:Can RaspberryPi with BLE Dongle detect iBeacons?带有 BLE 加密狗的 Raspberry Pi 可以检测到信标吗?
【发布时间】:2014-03-11 02:11:11
【问题描述】:

我从Radius Networks 购买了一个开发工具包,其中包括一个ioGear GBU521 BLE 4.0 dongle 和一个Raspberry Pi。我还买了他们的RadBeacon iBeacons 之一。他们都像宣传的那样工作,但我对我得到的结果有点惊讶。

我曾假设RaspPi 可以检测到iBeacons。相反,该工具包设置为创建 iBeacon。我的用例是检测forklift 何时进入特定房间,以便我可以将工作发送给他们。我的想法是在叉车上放一个 iBeacon,然后放一个 RaspPi 搜索 iBeacon。当检测到 iBeacon(叉车)时,您可以断定它就在附近。我会将 RaspPi 连接到 LAN 并让它通过 REST or similar 传达信息。我知道我可以放置一个合适的Android or Apple device 并以这种方式完成它,但我不明白为什么这个加密狗无法检测到这些iBeacons 并告诉我它们的UUID's 是什么?我错过了什么?

【问题讨论】:

  • sudo hcitool lescan 将检测 BLE 广告,包括“iBeacon”格式的广告,但只会显示硬件地址,这可能足以满足您的目的,也可能不足以满足您的目的。您可能还需要运行 hcidump 或 修改 hcitool 的源代码,以便转储广告数据包内容,您可以从中提取 iBeacon 样式的 UUID、主要、次要和传输功率字段。稍微阅读一下文档和/或代码应该会揭示如何找到接收功率电平,并与发射电平一起使用来进行非常粗略的距离估计。
  • 这帮助了克里斯。当我sudo hcitool lescan 时,我可以看到带有 RaspPi 的 RadBeacon。它以 MAC 地址回答。然后在另一个 SSH 窗口中,我 sudo hcidump -a 并能够看到一些统计数据,包括 RSSI。但我无法看到 UUID、Major 和 Minor。 sudo hcidump -a -w outfile 我可以选择 UUID、Major 和 Minor。我也看到了功率数据在哪里,但还没有解码。
  • 请注意,虽然标题和标签中提到了 raspberry-pi,但这个问题对于任何使用 bluez 且具有特权访问权限的 Linux 系统基本上都是通用的。
  • 嗨,我想做同样的事情。自二月以来你有反馈吗?有没有好/小的设备可以使用?关于它的文章?
  • 我们正在探索使用英特尔爱迪生的内置蓝牙,但他们说第四季度使用 BLE。 Edison 似乎很理想,因为它在 SoC 上集成了蓝牙和 Wifi。应该有可能构建一个真正的小型设备,在价格上与 Pi 竞争,并在尺寸和功率方面击败它。它也适用于工业设备。

标签: raspberry-pi ibeacon


【解决方案1】:

iBeacon Development Kit 并非设计用于检测 iBeacon 是正确的,它旨在作为 iBeacon 进行传输。

也就是说,可以使用@ChrisStratton 在他的评论中建议的变体来检测带有 Raspberry Pi 的 iBeacons。请参阅我的同事@jjnebeker 的答案,他制作了一个脚本来做你想要的。

【讨论】:

  • 此脚本是否适用于 Estimote 或 Gimbal 信标?
  • 云台信标必须设置为 iBeacon 模式才能正常工作。 Estumotes 默认处于这种模式。
  • @davidgyoung 我遇到了从我的 MOTE G2 手机发送的 巨大的 Android 5 广告数据 相同的问题(我认为我无法在 Phone 中控制太多频率侧面),这导致即使我关闭了广告,RPi中的这个脚本仍然看到幻像数据,我相信该脚本缓冲了大量的旧历史数据并尝试将它们一一处理。通常需要等待几分钟,然后它就消失了,你知道如何解决这个问题吗?
【解决方案2】:

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

使用它来检测 iBeacon。

它允许 Android 设备像 iOS 设备一样使用 iBeacons。当一个或多个 iBeacon 出现或消失时,应用程序可以请求获取通知。应用还可以请求以 1Hz 的频率从一个或多个 iBeacon 获取测距更新。

【讨论】:

  • 我想用RaspPi来检测,而不是Android。
【解决方案3】:

是的!您可以使用 Raspberry Pi 扫描 iBeacons。我们在下面编写了一个脚本来执行此操作,您也可以通过以下步骤自行完成:

  1. 启动执行蓝牙 LE 扫描的后台进程:

    sudo hcitool lescan --duplicates &
    

    使用--duplicates 设置,扫描不会忽略来自同一个 iBeacon 的多个数据包。

  2. 启动 hcidump 并将原始输出通过管道传输到将过滤 iBeacon 数据包的脚本:

    sudo hcidump --raw 
    

过滤是棘手的部分,hcidump 的原始输出格式不正确,并且还显示不是 iBeacon 传输的数据包。为了解决这个问题,我们制作了一个过滤器脚本,它逐行读取输出并将原始数据包与其他输出(即 MAC 地址等)分离出来。我们在 Radius Networks 对iBeacon bluetooth profile 进行了大量研究,我们用它来识别 iBeacon 数据包并将它们从来自其他设备的数据包中过滤掉。

我们已将所有这些整合到一个 ibeacon_scan 脚本中,该脚本可以执行所有操作,包括将原始标识符转换为人类可读的形式。你可以下载它here。很快,我们将把它包含在iBeacon Development Kit 中以添加扫描功能。

以下是脚本输出的示例:

$ ./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 时,您可以使用此选项并将脚本的输出通过管道传输到您的脚本以触发操作。

编辑:我们重新设计了此脚本,使其响应速度更快、更健壮,并将其合并到最新版本的development kit 中。更新可下载here

EDIT2: 正如@sai-ramachandran 所指出的,除了POWER 之外,您还可以扩充此脚本以捕获每个iBeacon 数据包的RSSI。为此,请在脚本中添加以下行:

 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"

【讨论】:

  • 这正是我所需要的。谢谢。
  • 为了解决这个关于 RSSI 与 POWER 的答案的编辑问题,从每个数据包中的 char 位置 132 捕获似乎是为每个 iBeacon 数据包读取 RSSI 的方法是正确的。但是,RSSI 最初并不打算包含在此答案中。相反,我们打算使用 POWER 捕获 tx 校准常数,这是一个不同的字段,并且始终是相同的值(根据 iBeacon)。一旦我确认这是正确的,我将编辑此答案以包括捕获 RSSI 以及校准功率。
  • 感谢@jjnebeker 这个脚本。我注意到在最新的 BDK 中它已经变成了一个 ruby​​ 脚本。我添加了以下行来获取 rssi:rssi = packet.gsub(/^.{132}(.{2}).*$/, '\1').to_i(16) - 256,它似乎可以工作。
  • @WillFaithfull 太好了,谢谢。我将更新脚本以将其添加到最新的 BDK。
  • 如果您购买了我们的开发套件,您只需在命令行中输入ibeacon scan
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-09
相关资源
最近更新 更多