2014-11-02 175 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 
相關問題