2014-11-02 145 views
0

我遵循教程来阐述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打开一次,然后重置状态的唯一方法是停止脚本并重新启动它。 谢谢

+0

“line”的内容究竟是什么?你甚至可能根本不需要'grep'。试试:'if [[$ line = *“2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6 1 1”*]]; then'。 – 2014-11-02 16:33:24

+0

@gniourf_gniourf行变量是从stdin填充的,那么它就是'beacon scan -b'输出。 – mpromonet 2014-11-02 16:42:12

+0

信标扫描命令正在输出它看到的iBeacons的uuids的巨大列表,然后grep用于在此输出中查找数据。是否有可能知道“信标扫描”输出最近没有更新过,或者是否最好创建一个每几秒钟启动一次信标扫描命令的脚本,以便输出被清除,然后可以使用相同的if语句? – hdworld 2014-11-02 16:48:19

回答

1

你可以用你现有的代码完成它的一种方法是将变量设置为if语句中的时间戳。然后,在if语句之外(但在这段时间内),可以将当前时间与时间戳进行比较。如果从检测到信标(例如5秒)开始已经过了足够的时间,则您的代码可以关闭LED。

这种方法的缺点是,如果根本没有检测到信标,您的代码将在read line声明上阻塞。所以这只有在你确定知道至少有一个信标将永远保持你的程序运行的情况下才可行。这种编程不适合简单的bash脚本,因为你真的需要两个线程来处理这个。但如果你想保持你的基本工具集,这是一个体面的选择。

0

我制定了一个(坏的)解决方案,并认为我会在这里分享它。它具有当检测到信标时灯闪烁,然后当信标超出范围时灯停止闪烁的效果。我将这段代码设置为在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 
相关问题