查看: 415|回复: 0
打印 上一主题 下一主题

[Seeed BeagleBone Green学习笔记] MQTT炫閃燈

[复制链接] qrcode

33

主题

42

帖子

121

积分

注册会员

Rank: 2

积分
121
楼主
跳转到指定楼层
发表于 2015-12-22 05:13 PM | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

<前言>

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社區

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表