Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Bash脚本扫描iBeacons并在Raspberry Pi上使用GPIO_Linux_Bash_Raspberry Pi_Ibeacon - Fatal编程技术网

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

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" ` ]]

我按照一个教程来点亮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
信标扫描的输出为:

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
语句中的代码永远不会执行,因为脚本永远不会退出。