我按照教程点亮了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一次,然后重置情况的唯一方法是停止脚本并再次启动它。
感谢
答案 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