<前言>
繼上一篇的學習,我們知道在Local端自己觸發MQTT的收發,但事實上是用在物聯網之中Machine To Machine(M2M),因此本篇將實作M2M的溝通方式,採用Intel Edison當Publisher,而BBG當Subscriber,當然,任何可以安裝node.js的開發板也能應用在本篇
<準備>
1. BBG開發板
2. MicroUSB傳輸線(BBG用)
3. Edison開發板或者另外裝有nodejs之開發板
4. MicroUSB傳輸線或者5~12V Adapter(電源) (Edison用)
5. 光敏電阻模塊
<實作>
1. M2M在物聯網之中扮演重要角色,讓訊息可以在各個裝置中傳遞,因為MQTT的特性,使得訊息輕量化,讓開發板不需要花費太多資源在接收和發送的處理上,本篇將詳述如何實作,假設的場景是您回到家中,打開了客廳的電燈,當Edison偵測到光源後,將訊息傳送給MQTT雲端Broker,再將訊息轉送給在房間內的BBG,之後也打開電燈
2. 將Edison利用MicroUSB傳輸線連接電腦或者使用電源供電,這裡我假設您已經設定好Wifi的資訊,已經可連上網路
3. 打開Serial console,這裡我使用MobaXterm,利用SSH連上Edison,輸入您設定好的帳號密碼來登入,並輸入以下指令安裝MQTT和MRAA函式庫,Edison原始鏡像已經有安裝了node.js
npm install mqtt -g
npm install mraa -g
4. 安裝詳細步驟可以參考上一篇,這裡不再贅述,輸入以下指令創建push.js檔案
vi push.js
5. 創建檔案後,輸入以下程式碼,按下按鍵"I"即可編輯檔案
var m = require(\'mraa\'); //require mraa
console.log(\'MRAA Version: \' + m.getVersion()); //write the mraa version to the conso
var analogPin0 = new m.Aio(3); //setup access analog inpuput pin 0
var analogValue = analogPin0.read(); //read the value of the analog pin
var mqtt = require(\'mqtt\');
var client = mqtt.connect(\'mqtt://broker.mqttdashboard.com\');
client.on(\'connect\', function () {
client.publish(\'Light\', analogValue.toString());
client.end();
});
輸入完畢後按下按鍵ESC,再按下按鍵":",輸入wq後,按下按鍵Enter,儲存並離開
6. 將Edison上的A3 Analog腳位插上光敏電阻模塊,即接線如下:
Pin A3 <=> OUT
5V <=> VCC
GND <=> GND
至此完成Publisher的設計
7. 將BBG用MicroUSB傳輸線連接電腦,之後打開Cloud9 IDE,繼上ㄧ篇的mqtt.js為基礎來修改,修改好的程式碼如下
var mqtt = require(\'mqtt\');
var b = require(\'bonescript\');
var client = mqtt.connect(\'mqtt://broker.mqttdashboard.com\');
var timer;
b.pinMode("USR0", b.OUTPUT);
b.pinMode("USR1", b.OUTPUT);
b.pinMode("USR2", b.OUTPUT);
b.pinMode("USR3", b.OUTPUT);
client.on(\'connect\', function () {
client.subscribe(\'Light\');
});
client.on(\'message\', function (topic, message) {
// message is Buffer
console.log(message.toString());
if(parseInt(message.toString()) >= 600)
{
console.log("Do LED Blinking!");
doNothing();
timer=setInterval(periodicActivity, 1000);
}
else
{
console.log("Do Nothing!");
doNothing();
}
});
function periodicActivity()
{
b.digitalWrite("USR0", level(Math.random()*10)); //if ledState is true then write a \'1\' (high) otherwise write a \'0\' (low)
b.digitalWrite("USR1", level(Math.random()*10)); //if ledState is true then write a \'1\' (high) otherwise write a \'0\' (low)
b.digitalWrite("USR2", level(Math.random()*10)); //if ledState is true then write a \'1\' (high) otherwise write a \'0\' (low)
b.digitalWrite("USR3", level(Math.random()*10)); //if ledState is true then write a \'1\' (high) otherwise write a \'0\' (low)
}
function doNothing()
{
clearInterval(timer);
}
function level(x)
{
if(x>=5)
return b.LOW
else
return b.HIGH
}
其中週期觸發改為setInterval方式,此方式可以設定成Timer來開啟跟關閉,避免重複觸發造成LED越閃越快,clearInterval負責關閉Timer的觸發,此外,當Edison將光敏電阻的讀值送上Broker時,BBG去接收資料,並將讀值做判定,當光照高時候就開啟程式中的Timer,以此Callback LED閃爍函式periodicActivity,另外一方面,光照低的時候就關閉Timer,停止LED閃爍函式
至此完成Subscriber設計
<實測>
8. 完成修改後,儲存並運行,按下功能選單上的RUN按鈕即可,如下圖:
執行mqtt.js
9. 回到Edison的Serial console,輸入以下指令來運行,將讀值送上MQTT Broker
node push.js
輸出MRAA版本資訊只是辨認程式正常運行
10. 再度切回Cloud9 IDE,觀看BBG接收到的訊息
其中757代表接收到的光敏電阻讀值,因為大於600,所以觸發LED閃爍
11. 將光敏電阻遮蔽,在Edison的Serial console再次輸入以下指令,輸入完畢後回到Cloud9 IDE,觀看輸出結果
node push.js
遮蔽光敏電阻
因為遮蔽後的讀值為118,未滿600,故關閉Timer,使得LED停止閃爍,完成實測
<小結>
本篇利用M2M的技巧,來達到真正的裝置之間的溝通,這在物聯網之中被廣泛運用,您可以利用此技巧設計出千變萬化的應用產品
作者:MOP 發布於:ICKEY社區
|