带有BLE Dongle的RaspberryPi能否检测到iBeacons?

use*_*660 38 raspberry-pi ibeacon

我买了一个开发工具包Radius Networks,包括a ioGear GBU521 BLE 4.0 dongle和a Raspberry Pi.我也买了他们的一个RadBeacon iBeacons.他们都像宣传的那样工作,但我对我得到的东西感到惊讶.

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

jjn*_*ker 71

是! 您可以使用Raspberry Pi扫描iBeacons.我们在下面放了一个脚本,你也可以自己完成这些步骤:

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

    sudo hcitool lescan --duplicates &
    
    Run Code Online (Sandbox Code Playgroud)

    通过该--duplicates设置,扫描不会忽略来自同一iBeacon的多个数据包.

  2. 启动hcidump并将原始输出传递给将过滤iBeacon数据包的脚本:

    sudo hcidump --raw 
    
    Run Code Online (Sandbox Code Playgroud)

过滤是棘手的部分,原始输出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
Run Code Online (Sandbox Code Playgroud)

我们还提供了一个-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
Run Code Online (Sandbox Code Playgroud)

您可以使用此选项将脚本的输出传递给脚本,以便在检测到具有特定标识符的iBeacons时触发操作.

编辑:我们重新编写了这个脚本,使其更具响应性和强大性,并将其整合到最新版本的开发套件中.此更新可从此处下载.

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

 RSSI=`echo $packet | sed 's/^.\{132\}\(.\{2\}\).*$/\1/'`
 RSSI=`echo "ibase=16; $RSSI" | bc`
 RSSI=$[RSSI - 256]
Run Code Online (Sandbox Code Playgroud)

并确保将RSSI添加到输出:

 echo "UUID: $UUID MAJOR: $MAJOR MINOR: $MINOR POWER: $POWER RSSI: $RSSI"
Run Code Online (Sandbox Code Playgroud)