[AWS][IoT] AWS IoT-簡單介紹

前言

萬物聯網(IoT),最近吵得非常兇的話題(炒股話題),跟台灣最愛講的工業4.0息息相關,講白一點就是那些設備連上網路,可以達到自動化、遠端監控…等應用。

身為AWS這雲端服務大帝國,當然也要提供一下這項服務啊,於是他就推出了AWS-IoT服務,他提供類似MQTT Broker的功能(不完全跟MQTT一模一樣),MQTT是一種常用於低效能裝置要用於網路溝通的輕量級Protocol,google一下非常多資訊。

下面就來簡單介紹一下AWS IoT提供了甚麼功能,只會介紹我有接觸到的部份。

AWS IoT基本介紹

AWS IoT,在後台叫做IoT Core,從這邊點擊進去。

AWS IoT會替給一個帳號專屬的MQTT Broker終端節點(End point),就是Broker的伺服器的Domain name,去左邊的”測試”,在點擊右上角有個”檢視終端節點”,就可以看到節點名稱啦,這就是MQTT Broker的連線位址,這個位址不會被改變,跟著帳號走,預設的Port為8883。

“測試”,就提供Web UI介面讓你做一些MQTT Topic,Publish跟Subscribe的操作,蠻方便的,這邊要注意的是,AWS IoT並不提供Qos=2的傳送品質,猜測原因是因為Qos=2的傳輸成本非常的高,因此AWS IoT把它移除了,下面彙整一下這邊與MQTT比較不同的地方

項目AWS IoTMQTT
支援QOS0,10,1,2
登入方式只能使用CA無帳號, 帳密方式, CA
是否可以設定Topic權限皆可皆可
Message retainNo (Shadow)Yes

AWS IoT 特色功能

Device Shadow

前面的表格有提到MQTT有個訊息保存(Message retain)的功能,在AWS IoT上是沒有的,這樣需要存訊息在MQTT Broker上,就沒辦法實現,取而代之的是AWS IoT提供了一個叫做”Shadow”的功能,來取代原本的訊息保存。

下面為訊息保存(Message retain)的情境

下面會簡單介紹一下Shadow的使用方法

首先到左邊,”管理”,建立一個”實物”

並且選取”建立單一實物”

幫你的實物取個名字,如果你實物之後比較多,想要方便搜尋,可以設定群組跟他的屬性(Tag),方便之後做查詢,這邊就都不做設定,直接按下一頁。

下一頁會詢問是否要建立憑證(CA),如果會用其他方式來連MQTT Broker,就需要建立一組CA,本文不會使用其他方式來做示範,會用網頁上的測試功能直接做,故選最後一個直接建立實物。

之後就會看到剛剛建立的實物已經出現

我們點擊進去實物,會看到左側有個”影子(Shadow)”,就可以看到Shadow的功能啦。

Shadow的內容,是有限定的格式,一定要用Json,其他都不吃,且有規定的樣式,如下

{
  "desired": {
    "attribute1": 123,
    "attribute2": "string1"
  },
  "reported": {
    "attribute1": 123,
    "attribute2": "string1"
  }
}

你可以選擇把你要放的值放入”desired”或是”reported”欄位裡面,接著就可以放任何你想要的資料在裡面,至於放哪裡,看自身的需求去決定即可,AWS並沒有強迫你一定要放在哪一個欄位裡面。

我們來試著先改一下Shadow的內容吧。

點擊右側的”編輯”

輸入下面這段Json

{
  "desired": {
    "height": 200,
    "name": "Alien"
  },
  "reported": {
    "height": 777,
    "name": "Hello World"
  }
}

按下儲存,就會發現影子狀態改變了,接著我們到測試功能,透過MQTT的方式來取得影子的內容。

到測試畫面後,先訂閱一個主題
主題名稱,這邊實物名稱為Alien

$aws/things/[實物名稱]/shadow/get/accepted

$aws/things/Alien/shadow/get/accepted

按下訂閱主題,接著來發佈主題

發佈主題名稱

$aws/things/[實物名稱]/shadow/get

$aws/things/Alien/shadow/get

內容為空即可,然後按下發佈到主題,之後往下拉就會在剛剛訂閱的主題拿到Shadow的內容啦。

那如果要透過MQTT的方式去更新影子內容呢?很簡單,操作方式跟Get很像,只是把Get改成Update

首先訂閱update底下的所有topic,原因在於,更新影子內容如果格式是非法的,它也會告訴你非法,因此可以透過這種方式來得知更新是否成功。

$aws/things/[實物名稱]/shadow/update/#

$aws/things/Alien/shadow/update/#

我們先故意送一個非法的格式給他更新看看,我們只要對著update這個主題去送內容就可以了。

$aws/things/[實物名稱]/shadow/update

$aws/things/Alien/shadow/update

發送內容

{
  "desired": {
    "height": 987,
    "name": "Ben"
  },
  "reported": {
    "height": 555,
    "name": "UUUUUU"
  }
}

結果如下

可以發現它出現在rejected這個主題裡面,並且告訴你錯誤原因,相反的,如果你格式是對的,它就會出現在accepted這個主題裡面。

我們來送一個合法的shadow格式看看吧

還是錯了,原因是因為透過MQTT的方式,最外層要再加個”State”來包起來,Shadow才會認得,我們再來送一次

發送內容

{
  "state": {
    "desired": {
      "height": 987,
      "name": "Ben"
    },
    "reported": {
      "height": 555,
      "name": "UUUUUU"
    }
  }
}

結果如下

非常成功!!,這樣就更新成功啦!!

如果今天要刪除某一欄的資料,只要把它的Value設定為null並更新,該欄位就會消失了。

Device Shadow 小結

AWS IoT改用這種方式來取代Message retain其實是不錯的,可以減少傳輸成本,並且只讓需要保存的資料存在上面就好,而且還可以透過本篇沒有介紹的Http API的方式來做更新影子的動作,其實非常方便,因此不用再認為AWS IoT難用啦,只要掌握好Shadow,跟原本的MQTT操作上幾乎是沒甚麼差異的。

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *