close

今天我們要來細細闡述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服務又進了一大步喔!

大家可以趕快去玩玩看囉!

arrow
arrow

    C牛(norman kung) 發表在 痞客邦 留言(0) 人氣()