<前言>
BB系列預先安裝了一個完整的Cloud9 IDE可做開發使用,本應用就實際利用此IDE編寫一個MQTT的簡易炫閃燈,MQTT主要用在物聯網中的M2M的溝通方式,取代傳統的TCP/IP大封包的缺點,使得此協定在物聯網中被廣泛應用,本篇使用node.js實作
<準備>
1. MicroUSB傳輸線
2. RJ45網路線
3. BBG開發板
1. MQTT是什麼? 即Message Queuing Telemetry Transport為IBM和Eurotech共同製定出來的傳輸協定,主要就是為了物聯網所設計的,大幅降低了TCP/IP封包的Head大小,佔據的頻寬就降低,因此對硬體的需求也降低,此協定透過Publish和Subscribe的方式來做訊息傳送
2. 使用方法很簡單,首先要知道Publisher,Subscriber和Topic放在Broker(Server)上,概念如下圖
其中Publisher傳送資料到Broker上的Topic Entry,然後Subscriber向Broker註冊要接收Topic這個Entry裡的資料
一般而言我們會將一塊開發板上的感測器的資料做讀取,然後經由MQTT送上Broker,另一塊開發板可從特定的Topic讀取到感測器的資料,並以此做出對應的控制或者功能,因此達到Machine to Machine (M2M)概念
<實作>
3. 將開發板使用MicroUSB傳輸線連上電腦,會自動安裝好驅動,然後打開開發板所產生USB Storage下的START.htm
點擊START.htm開啟網頁
點擊網頁步驟3的連結,確認可以連接上開發板
4. 點選左邊的Cloud9 IDE,啟動開發環境
啟動Cloud9 IDE
5. 將RJ45網路線連接開發板和網路,在底下有提供Bash Terminal可供使用,輸入以下指令編輯網路
cd
nano /etc/network/inteface
將eth0網路設定啟用,即以下兩行前面的#字元去掉
auto eth0
iface eth0 inet dhcp
輸入以下指令重新啟動網路服務
/etc/init.d/networking restart
這時候您就可以連上網路了
6. 重新啟動網路服務後,首先要先更新開發板上的套件,,輸入以下指令
apt-get update
apt-get upgrade
7. 更新完畢以後,輸入以下指令安裝node.js管理工具npm,預設版本較舊會出現Bug
npm install npm -g
cd /usr/local/bin
rm -f npm
ln -s ../lib/node_modules/npm/bin/npm-cli.js npm
npm config set prefix "/usr/local"
以上指令目的是要變更npm版本,舊版本為1.4.21
安裝新版npm,舊版的套件結構樹會被覆蓋,經過設定值的修改,讓套件安裝目錄指向/usr/local/lib中的node_modules,即如下設定值
; prefix = "/usr" (overridden)
至此完成npm更新和設定,可以開始安裝套件
新版本npm的套件結構樹
8. 利用npm套件工具來檢查結構樹套件更新,輸入以下指令來更新
npm update -g
更新完畢
9. 安裝MQTT的node.js函式庫,輸入以下指令
npm install mqtt -g
安裝完成的結構樹
10. 創建新檔案,並輸入以下程式碼
創建新檔案,編寫程式碼
var mqtt = require(\'mqtt\');
var b = require(\'bonescript\');
var client = mqtt.connect(\'mqtt://test.mosquitto.org\');
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(\'presence\');
client.publish(\'presence\', \'Hello mqtt\');
});
client.on(\'message\', function (topic, message) {
// message is Buffer
console.log(message.toString());
if(message.toString().valueOf()==\'Hello mqtt\'.valueOf())
{
console.log(\'Do LED blinking!\');
periodicActivity(); //call the periodicActivity function
}
else
{
console.log(\'Do nothing!\');
}
client.end();
});
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)
setTimeout(periodicActivity,1000); //call the indicated function after 1 second (1000 milliseconds)
}
function level(x)
{
if(x>=5)
return b.LOW
else
return b.HIGH
}
其中Math.random是取0~1之間的亂數,而setTimeout為每超時1秒時就執行一次函式的內容,MQTT主要由Publish函式對Broker的presence這個Topic寫入訊息,之後就可由Subscribe取得presence裡的訊息,完成MQTT的傳輸,判斷是否是觸發的字串來決定是否啟動閃燈函式,valueOf()是幫助判斷字串相等性重要的方法之一,主要是將字串值做轉換後再作比較,不轉換直接比較的話會一直回傳Flase,這是跟其他程式語言稍微不同的地方
12. 將檔案儲存,命名為mqtt.js,會依照副檔名,決定檔案使用的語言框架,如下圖所示
儲存檔案,完成設計
<編譯和實測>
13. 按下在工具列上的Run,將會自動編譯並執行程式,node.js採用直譯式的程式語言,所以不需要額外編譯
運行mqtt.js
14. 觀看輸出訊息,和LED隨機閃爍的現象
其中第一個訊息是Broker傳送來的JSON訊息,所以不做任何事情,第二個訊息是我們設定的,所以觸發了LED閃爍
15. 接下來置換Broker,這Broker提供了傳送的訊息,方面觀看的Dashboard,變更以下程式碼
var client = mqtt.connect(\'mqtt://broker.mqttdashboard.com\');
儲存並運行,打開MQTT Dashboard
可發現以presence為Topic的訊息,完成驗證
MQTT炫閃燈
<小結>
本篇使用物聯網相當實用的M2M的傳輸協定MQTT,可方便物件之間的溝通,使得應用更為廣泛
作者:MOP 發布於:ICKEY社區
|