iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 25
0
Microsoft Azure

Azure 的奇幻之旅系列 第 25

Azure 系列文(25) - IoT Hub 遠端控制裝置

前幾篇提到了IoT Device怎麼註冊到IoT Hub的方法,但好像都沒有提到如果透過IoT Hub控制IoT Device該如何實作,方法其實也有許多種,比如說: 直接方法、IoT Hub Twins...等等,那今天會使用IoT Hub Twins的方法來實作控制,我們繼續看下去吧!

準備

  • Azure 帳號
  • IoT Hub

什麼是IoT Hub Twins

裝置 twins是儲存裝置狀態資訊的 JSON 檔,包括中繼資料、設定和條件。 Azure IoT 中樞會維持連線到 IoT 中樞的每部裝置其裝置對應項。

簡單來說就是你的裝置在雲端上也有一個分身在上面,然後兩個透過連線的方式,持續的更新JSON的內容達到控制的效果!

附上一個微軟的IoT Hub Twins圖
https://ithelp.ithome.com.tw/upload/images/20201004/20127994MGWiUqtTJr.png

裝置端: 讀取Desired(需要) -> 寫入Report(報告)

應用程式端: 讀取Report(報告) -> 寫入Desired(需要)

這次會簡單的實作上面的架構以達到可以控制裝置的應用程式

建立IoT Hub

如果有實作前幾篇,可以跳過本節

到Azure Portal搜尋IoT 中樞,並且新增

基本
https://ithelp.ithome.com.tw/upload/images/20201004/20127994KzxThqV0Hp.png

網路功能
https://ithelp.ithome.com.tw/upload/images/20201004/20127994n0i4vec23x.png

大小與級別
https://ithelp.ithome.com.tw/upload/images/20201004/20127994tpwpTpbtXz.png

建立
https://ithelp.ithome.com.tw/upload/images/20201004/20127994zLi1mYB4h0.png

註冊裝置

到IoT Hub的IoT裝置,並且點擊新增
https://ithelp.ithome.com.tw/upload/images/20201004/20127994Lle1oaD5M6.png

輸入裝置ID後,按下儲存
https://ithelp.ithome.com.tw/upload/images/20201004/20127994vPhtfcPzuB.png

取得Device連接字串

到裝置詳細資料後,在主要連接字串按下複製
https://ithelp.ithome.com.tw/upload/images/20201004/20127994HKnfWlYK6H.png

取得IoT Hub連接字串

到共用存取原則,按下新增
https://ithelp.ithome.com.tw/upload/images/20201004/20127994pEHONHyGTT.png

新增一個規則
https://ithelp.ithome.com.tw/upload/images/20201004/20127994yYvYNPW9pv.png

複製連接字串 - 主要金鑰
https://ithelp.ithome.com.tw/upload/images/20201004/20127994BURg38LsXW.png

建立應用程式

先安裝依賴

pip install azure-iot-hub
pip install azure-iot-device

新增後端程式

backend.py

import sys
from azure.iot.hub import IoTHubRegistryManager
from azure.iot.hub.models import Twin, TwinProperties


IOTHUB_CONNECTION_STRING = "{your-iot-hut-connectionString}"
DEVICE_ID = "python-device"


def iot_update():
    try:
        iothub_registry_manager = IoTHubRegistryManager(IOTHUB_CONNECTION_STRING)

        twin = iothub_registry_manager.get_twin(DEVICE_ID)
        twin_patch = Twin(properties= TwinProperties(desired={'power' : 'false'}))
        twin = iothub_registry_manager.update_twin(DEVICE_ID, twin_patch, twin.etag)

        print("Okay!")

    except Exception as ex:
        print("Unexpected error {0}".format(ex))
        return
    except KeyboardInterrupt:
        print("IoT Hub Device Twin service sample stopped")


if __name__ == '__main__':

    iot_update()

新增裝置應用程式

device.py

import time
import threading
from azure.iot.device import IoTHubModuleClient

CONNECTION_STRING = "{your-device-connectionString}"


def twin_update_listener(client):
    while True:
        patch = client.receive_twin_desired_properties_patch()
        print("Twin patch received:")
        print(patch)
        if(patch['power'] == false):
            print('I\'m shutdown now!)

def iothub_client_init():
    client = IoTHubModuleClient.create_from_connection_string(CONNECTION_STRING)
    return client

def iothub_client_sample_run():
    try:
        client = iothub_client_init()

        twin_update_listener(client)

    except KeyboardInterrupt:
        print ( "IoT Hub Device Twin device sample stopped" )

if __name__ == '__main__':
    print ( "Starting the Python IoT Hub Device Twin device sample..." )

    iothub_client_sample_run()

執行應用程式


python3 device.py
python3 backend.py

device: 會有一個blocking的地方會等待desired更新
backend: 會傳送一個desire的參數

完成之後device.py會輸出下面的訊息

$ python3 device.py 

Starting the Python IoT Hub Device Twin device sample...
Twin patch received:
{'power': 'false', '$version': 11}

透過上面的方法就可以控制Device的所有控制項了,除了Desire之外,也可以透過Report傳送目前裝置的狀態,比如說開關機、其他Sensor的狀態...等等,但實際應用上會有許多問題需要注意!!


上一篇
Azure 系列文(24) - Device Provision Service 幫 Device 找到自己的家
下一篇
Azure 系列文(26) - IoT Edge
系列文
Azure 的奇幻之旅30

尚未有邦友留言

立即登入留言