Linux Bash脚本扫描iBeacons并在Raspberry Pi上使用GPIO
我按照一个教程来点亮Raspberry Pi上的LED,这样当检测到iBeacon时,LED会使用GPIO引脚打开,但我需要更改脚本,以便在不再检测到iBeacon时LED会再次熄灭 目前的剧本是:Linux Bash脚本扫描iBeacons并在Raspberry Pi上使用GPIO,linux,bash,raspberry-pi,ibeacon,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" ` ]]
#!/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
信标扫描的输出为:
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时停止更新
目的是让脚本始终运行,并使用信标扫描
命令的输出来确定LED是否应亮起-如果检测到iBeacon,则LED应亮起,如果iBeacon随后移出范围,则LED再次熄灭。现有条带将LED打开一次,然后重置情况的唯一方法是停止脚本并再次启动。
谢谢使用现有代码可以实现的一种方法是在if语句中设置一个变量作为时间戳。然后,在if语句外部(但在while内部),可以将当前时间与时间戳进行比较。如果检测到信标后经过了足够的时间(例如5秒),您可以关闭LED
这种方法的缺点是,如果根本没有检测到信标,代码将阻塞读取行
语句。因此,只有当您确信至少有一个信标将始终存在以保持程序运行时,这才是可行的。这种编程并不适合于简单的bash脚本,因为您确实需要两个线程来处理它。但是,如果您想保留相同的基本工具集,这是一个不错的选择。我想出了一个(糟糕的?)解决方案,并想在这里与大家分享。它的作用是,当检测到信标时,指示灯闪烁,然后当信标超出范围时,指示灯停止闪烁。我将这段代码设置为在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
行
的具体内容是什么?您很可能根本不需要grep
。尝试:if[[$line=*“2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6 1”*];然后
@gniourf\u gniour如果从stdin填充行变量,那么它就是信标扫描-b
输出。信标扫描命令输出它看到的iBeacon的UUID的巨大列表,然后使用grep在该输出中查找数据。是否有可能判断“信标扫描”输出最近没有更新,或者最好创建一个脚本,每隔几秒钟启动一次信标扫描命令,以便清除输出,然后使用相同的if语句?您是否尝试过我的建议?您的脚本中没有任何代码会在未检测到iBeacon。您的while
语句实际上是一个无限循环,因为信标扫描
命令永远不会完成。trap
语句中的代码永远不会执行,因为脚本永远不会退出。