今天我們要來細細闡述iot整個運作的流程了
大家搞懂之後就可以很方便的使用這個系統囉!
首先!
還記得上次跟大家講的這個東西嗎
上次說這個藍色的方塊就是我們連接的窗口
其實他還有一個兄弟
長這樣
他們一個負責當"接收端的接口"
一個負責當"送出端的接口"
所以跟去上次所提到的這張圖
他長這樣
好的這樣這兩兄弟的重要性大家應該都知道啦~
那這兩個兄弟到底怎麼用呢
還記得上次要大家亂勾一通的表格嗎
現在要來細細解說了
Authentication:
總共有3個選項
Q S
API K
BS
我們今天應該會著重在第三個BS(bluemix service)就是雲端服務的接頭,要選用BS來開始使用iot服務
QS主要是給一些簡單的測試用的
所以當你選擇QS的選項時
你可以用的參數就比較少了
API K的選項主要是給你連結到其他人的iot雲也就是其他人的物聯網
所以有沒有很興奮
不僅僅自己的裝置們可以互聯
後來還可以跟別人的裝置交換資訊喔喔喔喔A_A!!
好的那回歸正題我們選用BS這個服務來開始今天的主題!
Input Type:
接下來這個非常的重要了!!
這個項目是iot的命脈之一
裡面有兩個選項是我們今天會用到的
一個是device command
一個是device event
這兩個有什麼差別
讓我來畫張圖給大家說明
在所有要從裝置上雲端或是從雲端下到裝置的訊息
都必須要有一個分類不是COMMAND 就是 EVENT
基本上我們都說好從裝置上到雲端就是EVENT
從雲端下到裝置就是COMMAND
這並不是一定規則!但是遵從這樣的默契會讓你的程式好懂很多!
所以我們上次叫大家選擇的是event
原因就是因為
我們那一格input是要接收從裝置送到雲端的資訊
那有人就問
那我從裝置怎麼指定他是發送成event的形式呢?
來來來
拿出上次的04mqtt程式碼
我們來看其中一行程式碼
--------------------------------------------------------------------------------------------------------------------------------------------------
iot_client.on('connect', function() {
console.log('Rapiro client connected to IBM IoT Cloud.');
iot_client.publish('iot-2/evt/status/fmt/json', '{"d":{"status": "connected" }}'); //iot-2/evt/color/fmt/json
}
);
--------------------------------------------------------------------------------------------------------------------------------------------------
這個iot_client.publish就是要把資料發送上去的function
第一個參數'iot-2/evt/status/fmt/json'
代表要發送的位置以及格式
重點要來了
看到EVT我用黃格子標起來了沒有
這就是指定把訊息發送成event的分類
第二個參數就是要發送的東西'{"d":{"status": "connected" }}'
我們將這個json格式發送到雲端上面
有人會問那command呢?
command是由雲端發送下來裝置的
所以要從剛剛兩兄弟的output那一個block來選擇
等等我們會看到
好的event跟command就先到這邊我們等下會很全面的一起講解
大家只要先記得這個觀念就好了
Device Type:
這個部分就是要限制從這個input流出來的資訊是要接收哪個裝置類別所送出來的資料
等於是一個濾網
想一下
如果你的iot上面同時有好幾種裝置
有手機
電腦
藍芽接收裝置
電視
但是你某一個節點只想專門接收電視所傳回來的資料
像是這樣
所以電視的input所收到的資料就只會是電視這種device所收到的資料
其他從電腦以及手機的資料
就不會從電視的input跑到iot裡面
會從各自的節點跑進去
那還記得上次我希望大家去幫自己的裝置申辦一個帳號八
那個帳號的步驟中有一個裝置類別的創建
所建立的就是這個Device Type的類別
所以如果依照我們的案例
想要某個節點只有流入電腦的資訊我們就在devicv type裡面打上 laptop
這樣那個Input就只會流入你在創建帳號的時候用的是laptop類別的裝置的資訊囉
Device ID:
聰明如你們應該想到了
那個這device ID 就是對應到當初的裝置ID了
他也是一個過濾選項
當你有好幾台裝置的類別都依樣
你想要針對某一個裝置來處理他的資訊的話
就在這一格打上那台裝置的ID囉!!
所以在我們的案例
我們就打上laptop01
指的就是我們這台電腦
如果你到時候又新增的好幾台資訊
想要個別處理就從這地方下手!
EVENT/COMMAND:
接下來這個也是非常重要的一個選項,我們都稱這一欄叫做TOPIC
讓我們先看到裝置端的程式碼
iot_client.publish('iot-2/evt/status/fmt/json', '{"d":{"status": "connected" }}'); //iot-2/evt/color/fmt/json
現在我畫黃底的這個
就是我們的EVENT/COMMAND類別
在這行裡面
我們是publish到 event類別裡面的 status topic
在一次的範例中
我叫大家選擇每個一選項都是for all
代表的就是
不管哪一個裝置類別
裝置ID
哪一個TOPIC
都回從那個節點出來
那問題又來了
如果我有一個input後面所連線的function是專門處理'laptop01'這台裝置所傳送的電池選項
我總不能用一個input把所有資訊拉出來
在一個一個寫if else 來看他是哪一個資料類別
這樣太累了
所以
我們就在裝置端寫一個
iot_client.publish('iot-2/evt/power/fmt/json', '電池電量'+power);
這樣我們電池電量的資訊就會傳到power這個topic裡面了
那我們只要在event 那一個欄位打上 power
就代表那一個input只會接收topic為power所傳送的資訊了
這邊觀念可能比較難解釋
如果有問題的話都可以在下面留言
我會一個一個回答的!
format:
iot_client.publish('iot-2/evt/power/fmt/json', '電池電量'+power);
這就是從程式碼黃底的地方看到的
像是這樣子的資訊往iot上丟
你的format要收到的的話
就必須要打json格式
如果你裝置上的資料是string的話
你要往上丟就可以寫成這樣
iot_client.publish('iot-2/evt/power/fmt/string', '電池電量'+power);
那當然在iot的input上就要寫成string
不過小編比較偷懶
我在format的這一格我都直接打for all的選項
到時候在node red上面再來處理就好囉!
總結!
我們接下來以圖片來解說
如果你要從裝置上面丟出一個資料是關於速度speed的話
在你的mqtt程式碼裡你就要打成這樣
iot_client.publish('iot-2/evt/speed/fmt/string', '50');
接著在iot上拉一個input
如果你這個節點只想要接收從
laptop裝置類型
並且ID為 laptop01
而且是event
topic 為 speed
的資訊的話
就這樣選選項
如果用上次的選法
全部都ALL的話
那個節點會把所有只要是送到你的iot的資料全部都收進去喔!
接下來要來講下一個觀念了!
就是在node red上面的資料傳遞
我們直接用一個最簡單的例子來講!
首先我們先從裝置上面傳遞一個speed的訊息上來
接著speed input節點收到之後
會把這資料繼續往下一個截點傳遞
在這個例子上就是那個橘色的方塊
也就是我們的function node
那這個function node 裡面基本上就是寫js 語言
那我們要怎麼拿到從上一個節點傳遞過來的資料呢?
就是msg這個變數了
每個節點互相傳遞都是使用msg這個變數喔!
這是規定
所以我們打了一小段程式碼在function node 裡面測試
來我們來看看
我們從哪裡拿到speed input的資料呢?
就是在msg.payload裡面啦!
這個也是規定的格式喔!
從裝置上來的資料都會塞在msg.payload裡面
好的接下來我們把payload裡面的值隨著大小會有不一樣的回答
最後再把msg return給下一個節點
就會到下一個debug把值印出來了
所以裡面的資料傳遞都是這樣子喔!
都是放在msg裡面傳送
那有時候我們會覺得要測試都要從裝置發訊息出來很麻煩
我們就有一個類似測試工具的節點,他其實還有很多功能像是定時觸發,不過我們先用注入數字的功能
就是inject
我們把他拉出
並且寫上這樣子的資料
第一個是型態
我們先選擇int
接起來的node 會變成這樣
我們把25當成輸入接到function node上面
接著按下deploy
好了之後我們可以藉由點擊inject的左邊框框來觸發
觸發之後可以看到右邊的debug資訊跑出了東西
沒錯!
你超速了!
那如果我們把值改能15看看
觸發之後就變成你的速度剛剛好而已喔!
這樣我們的測試就完成了
那接下來讓我們正式的從裝置送訊息上來
所以把
iot_client.publish('iot-2/evt/speed/fmt/string', '50');
加到程式碼裡面
這邊要注意的是
我們基本上會把這行家在on.('connect',function.....
裡面
因為要記得node .js並不是順序處理
它是類多執行序所以你沒有等connect到了之後在觸發上傳
可能會傳不到iot裡面喔
好那我們來試試看這次我們在input後面再多接條debug看看
長這樣
好執行mqtt程式碼!
看到右邊了沒有~
傳來了50
以及您超速了!!
這就是基本的iot上船以及資料處理了!
那接下來
我們不想要資訊只有在雲端上
要回到裝置上啊!!
所以我們要把output node 往下接
所以長這樣
那我們來解說這個output node 要怎麼用
請點兩下打開
把選項填成這樣
第二欄很重要
剛剛說的event/command
就在這邊用到command了
我們往下丟的資料都有一個默契都是command喔!!
接著
type,id,command type 都是指你要把資料丟到哪個地方去的格式喔!
那我們再來看到程式碼
有一行
-----------------------------------------------------------------------------------------------
iot_client.subscribe('iot-2/cmd/+/fmt/+', function(err, granted){
console.log('subscribed command, granted: '+ JSON.stringify(granted));
});
-------------------------------------------------------------------------------------------------
這個就代表我們訂閱cmd也就是command類別的資料!
而第一個+就代表我們不限什麼topic
第二個+就代表我們不限定什麼format
在程式碼部分就比較麻煩一點了
我們要選用哪一個topic就只能透過if else
不然就是你也要在你的裝置上安裝node red
我們先使用程式碼來進行
所以我們的電腦現在已經訂閱了所有command型態的資料了
那要怎麼接收呢
在往下看
--------------------------------------------------------------------------
iot_client.on("message", function(topic,payload){
console.log('received topic:'+topic+', payload:'+payload);
});
------------------------------------------------------------------------
這行代表
有任何的資料傳下來將會觸發這個function
會把topic以及payload印出來
那我們馬上是是看如果把output node 接上到底會長怎麼樣吧
你看看!!!
你接收到了從雲端上下來的'您超速了'字串拉~
而且看看前面的topic
iot-2/cmd/speed/fmt/string
有沒有發現
你是從speed的topic接收到的喔!
好的於是在這一整個流程中我們實現了這張圖
大家距離熟練運用iot服務又進了一大步喔!
大家可以趕快去玩玩看囉!
留言列表