Bash脚本扫描iBeacons并在Raspberry Pi上使用GPIO

时间:2014-11-02 16:31:51

标签: linux bash raspberry-pi ibeacon

我按照教程点亮了Raspberry Pi上的LED,这样当iBeacon检测到LED使用GPIO引脚打开时,我需要改变脚本,以便当iBeacon不再亮时LED再次熄灭检测

目前的剧本是:

#!/bin/bash
gpio mode 1 out
trap "gpio write 1 0" exit
while read line
do
    if [[ `echo $line | grep "2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6 1 1" ` ]]; then
        gpio write 1 1
    fi     
done

被称为:

$ beacon scan -b | ./scriptName

beacon scan的输出是:

pi@pibeacon ~ $ sudo beacon scan
BLE Beacon Scan ...
iBeacon     UUID: 92AB49BE-4127-42F4-B532-90FAF1E26491   MAJOR: 1       MINOR: 1       POWER:    -59   RSSI: -62 
iBeacon     UUID: 92AB49BE-4127-42F4-B532-90FAF1E26491   MAJOR: 1       MINOR: 1       POWER: -59   RSSI: -65 
iBeacon     UUID: 92AB49BE-4127-42F4-B532-90FAF1E26491   MAJOR: 1       MINOR: 1       POWER: -59   RSSI: -65 

一直检测到iBeacon的持续更新,并在未检测到iBeacon时停止。

目标是让脚本一直运行并使用beacon scan命令的输出来确定LED应该打开还是关闭 - 如果检测到iBeacon,LED应该打开,如果然后iBeacon移出范围,LED再次关闭。现有的条带打开LED一次,然后重置情况的唯一方法是停止脚本并再次启动它。 感谢

2 个答案:

答案 0 :(得分:1)

使用现有代码完成它的一种方法是将变量设置为if语句中的时间戳。然后,在if语句之外(但在while内),您可以将当前时间与时间戳进行比较。如果检测到信标已经过了足够的时间(例如5秒),则代码可以关闭LED。

这种方法的缺点是,如果根本没有检测到信标,那么您的代码将阻塞read line语句。因此,只有在确定至少有一个信标始终存在以保持程序运行时,这才是可行的。这种编程并不适合简单的bash脚本,因为你真的需要两个线程来处理它。但是如果你想保留相同的基本工具集,这是一个不错的选择。

答案 1 :(得分:0)

我制定了一个(糟糕的?)解决方案,并认为我在这里分享。它具有以下效果:当检测到信标时,灯闪烁,然后当信标超出范围时,灯停止闪烁。我将此代码设置为在启动Pi时运行,并且已经完成了我需要的功能(概念原型的非常粗略的证明!)。

我使用了非常好的Radius Networks开发工具包(这是原始脚本的来源),并强烈建议如果其他人有兴趣搞乱iBeacons。

#!/bin/bash
gpio mode 1 out
trap "gpio write 1 0" exit
while read line
do
    if [[ $line = *"2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6 1 1"* ]]; then
       gpio write 1 1
    fi     
gpio write 1 0
done