Bash脚本扫描iBeacons并在Raspberry Pi上使用GPIO
我遵循教程来阐述Raspberry Pi上的LED,以便当iBeacon检测到使用GPIO引脚启用LED时,但我需要更改脚本当不再检测到iBeacon时LED再次熄灭。Bash脚本扫描iBeacons并在Raspberry Pi上使用GPIO
此刻的脚本是:
#!/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
是:
[email protected] ~ $ 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打开一次,然后重置状态的唯一方法是停止脚本并重新启动它。 谢谢
你可以用你现有的代码完成它的一种方法是将变量设置为if语句中的时间戳。然后,在if语句之外(但在这段时间内),可以将当前时间与时间戳进行比较。如果从检测到信标(例如5秒)开始已经过了足够的时间,则您的代码可以关闭LED。
这种方法的缺点是,如果根本没有检测到信标,您的代码将在read line
声明上阻塞。所以这只有在你确定知道至少有一个信标将永远保持你的程序运行的情况下才可行。这种编程不适合简单的bash脚本,因为你真的需要两个线程来处理这个。但如果你想保持你的基本工具集,这是一个体面的选择。
我制定了一个(坏的)解决方案,并认为我会在这里分享它。它具有当检测到信标时灯闪烁,然后当信标超出范围时灯停止闪烁的效果。我将这段代码设置为在Pi启动时运行,并且已经完成了我需要的功能(一个非常粗略的概念验证原型!)。
我使用了非常好的Radius网络开发套件(这是原始脚本的来源),并强烈建议,如果其他人有兴趣弄乱与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
“line”的内容究竟是什么?你甚至可能根本不需要'grep'。试试:'if [[$ line = *“2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6 1 1”*]]; then'。 – 2014-11-02 16:33:24
@gniourf_gniourf行变量是从stdin填充的,那么它就是'beacon scan -b'输出。 – mpromonet 2014-11-02 16:42:12
信标扫描命令正在输出它看到的iBeacons的uuids的巨大列表,然后grep用于在此输出中查找数据。是否有可能知道“信标扫描”输出最近没有更新过,或者是否最好创建一个每几秒钟启动一次信标扫描命令的脚本,以便输出被清除,然后可以使用相同的if语句? – hdworld 2014-11-02 16:48:19