我按照一个教程来点亮一个树莓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一次打开,然后重置情况的唯一方法是停止脚本并重新启动它。谢谢
最佳答案
用现有代码实现它的一种方法是将变量设置为IF语句中的时间戳。然后,在if语句外部(但在while内部),可以将当前时间与时间戳进行比较。如果检测到信标后经过了足够的时间(比如5秒),则可以通过编码关闭LED。
这种方法的缺点是,如果根本没有检测到信标,那么您的代码将阻塞read line
语句。因此,这是唯一可行的,如果你确定至少有一个信标将始终保持你的程序运行。这种编程不适合于简单的bash脚本,因为您确实需要两个线程来处理这个问题。但如果你想保留你的基本工具集,这是一个不错的选择。