###### tags: `Azure` `Cloud` `Microsoft` `雲端平台` `Python` `IoT`
# IoT Hub 簡單介紹
## 簡介
IoT Hub是託管於雲端中的受控服務(managed service),其做為IoT終端裝置與管理裝置之間雙向通訊的橋樑。

IoT Hub能在IoT裝置與雲端控制後端間建立可靠且安全的通訊,IoT Hub提供多種傳輸方式,例如裝置到雲端遙測、從裝置上傳檔案,以及透過「request-reply」方法從雲端控制您的裝置。
IoT Hub支援監視可追蹤裝置的建立、裝置失敗,以及裝置連線等事件,以協助維護IoT解決方案的健全狀況。
---
## 測試說明
### IoT Hub簡單架構及說明
IoT Hub簡單架構圖:

說明:
+ IoT Hub本身是一種Queue的概念
+ 左方設備訊號可以透過IoT Hub傳輸至右方IoT Hub設定的端點。
+ 控制設備可以透過IoT Hub控制IoT設備(紅線部分)或直接透過Azure網頁介面從雲端發送控制。
+ 本次測試分為兩階段,如下圖所示:
1. 使用的架構為"設備->IoT Hub->Built-in Endpoint"並監聽"Built-in Endpoint"確認IoT Hub有收到訊號。
2. 從地端控制設備發送控制訊號給IoT設備。

### 測試環境
+ 雲端
+ 雲端平台:Microsoft Azure
+ 地端
+ 虛擬環境:VirtualBox
+ 作業系統:Windows 10
+ 程式語言:Python 3.6.5 :: Anaconda, Inc.
+ 通訊協定:MQTT (Port 8883 (TCP))
+ 傳輸格式:JSON
+ 資料
+ 採用模擬資料
+ 模擬資料包含以下兩種內容:
1. 溫度(temperature)
2. 濕度(humidity)
---
## 測試
### 雲端IoT Hub部署
**1. 進入[Azure入口網站](https://portal.azure.com/)點選建立資源:**

**2. 選擇物聯網,再選擇IoT中樞。或者直接在上方搜尋打"IoT Hub":**

**3. 本次測試訂用帳戶使用免費版,所以不做更動。**
**4. Azure服務管理群組為資源群組,由於尚未創立過資源群組,因此點選新建,名稱為"myTestResource",並確定:**

**5. 請選擇符合自己需求的區域,本測試選擇"東亞",IoT中樞名稱為"myTestIoTHub-1",並點選"下一步":**

**6. 這部分請依個案需求調整,會即時顯示成本,在測試過程中請記得選擇"F1:免費層",並點選"檢閱+建立":**

**7. 確認沒問題,按下"建立":**

**8. 等待部署:**

**9. 部署完成:**

### 地端模擬環境
**1. 請確定[適用於 Visual Studio 2015、2017 和 2019 的 Microsoft Visual C++ 可轉散發套件](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads)已針對您的架構 (x86 或 x64) 安裝。**
**2. 請在本機終端機視窗(cmd)中確定[Python](https://www.python.org/downloads/)已順利安裝及版本(目前Windows系統僅支援[Python 3.6.x](https://www.python.org/downloads/release/python-368/))**
+ 您可以使用下列命令之一,以確認開發電腦上目前的 Python 版本:
`python --version`
`python3 --version`
**3. 下載[Azure官方範例Python專案](https://github.com/Azure-Samples/azure-iot-samples-python/archive/master.zip)**
**4. 在本機終端機視窗中,安裝模擬裝置應用程式所需的程式庫(傳送模擬遙測訊號):**
`pip install azure-iothub-device-client`
**5. 在本機終端機視窗中,安裝模擬裝置應用程式所需的程式庫(呼叫直接方法):**
`pip install azure-iothub-service-client future`
### 註冊裝置
IoT裝置必須先向IoT Hub註冊,才能進行連線。
**1. 點選"myTestIoTHub-1",選擇IoT裝置,新增:**

**2. 輸入裝置名稱"MyTestPythonDevice",金鑰自動產生,儲存:**

**3. 選擇創建好的裝置:**

**4. 複製裝置連接字串(地端裝置連IoT Hub認證用):**

### 實際測試
#### ==傳輸測試==
**1. 進入"azure-iot-samples-python-master\iot-hub\Quickstarts\simulated-device-2" Azure範例程式資料夾,開啟範例程式:**

**2. 將複製的裝置連接字串填入:**
```
# The device connection string to authenticate the device with your IoT hub.
# Using the Azure CLI:
# az iot hub device-identity show-connection-string --hub-name {YourIoTHubName} --device-id MyNodeDevice --output table
CONNECTION_STRING = "填入IoT Hub裝置連接字串"
```
**3. 執行程式碼:**
```
python SimulatedDevice.py
```
**4. 到Azure入口網站,點選CLI,跳出下面視窗,建立儲存體:**

**5. 將適用於 Azure CLI 的 Microsoft Azure IoT 擴充功能新增至您的 Cloud Shell 執行個體(IoT 擴充功能可將 IoT 中樞、IoT Edge 和 IoT 裝置佈建服務的特定命令新增至 Azure CLI):**
```
az extension add --name azure-cli-iot-ext
```

**6. 監聽IoT Hub是否有收到訊號**
```
az iot hub monitor-events --hub-name YourIoTHubName --device-id MyPythonDevice
```
**7. 結果:**
地端:

雲端:

#### ==控制測試==
**1. 進入Azure入口網站,到 IoT Hub複製要連接裝置的名稱:**

**2. 進入IoT Hub,點選共用存取原則,點選"service",複製連接字串:**

**3. 進入"azure-iot-samples-python-master\iot-hub\Quickstarts\back-end-application" Azure範例程式資料夾,開啟範例程式::**

**4. 填入IoT Hub服務連接字串跟裝置名稱:**
```
# The service connection string to authenticate with your IoT hub.
# Using the Azure CLI:
# az iot hub show-connection-string --hub-name {your iot hub name}
CONNECTION_STRING = "填入IoT Hub 服務連接字串"
DEVICE_ID = "填入裝置識別碼(裝置名稱)"
```
**5. 在`SimulatedDevice.py`執行期間,執行`BackEndApplication.py`:**
`python BackEndApplication.py`
**6. 結果**
控制裝置:

IoT裝置:

---
## 補充資料
### 傳輸問題
1. IoT Hub訊息一則大小限制為256KB,超過限制需用檔案上傳功能(例如:圖片)。

2. ==由於測試是監聽內建端點(Built-in Endpoint),如果有使用訊息路由,該訊息會因為被導入其他端點而監聽不到。==
### `SimulatedDevice.py`程式碼
1. 這個客製化屬性是未來在IoT Hub做訊息路由時,可以用查詢的方式將資料存到不同端點。
```
# Add a custom application property to the message.
# An IoT hub can filter on these properties without access to the message body.
prop_map = message.properties()
if temperature > 30:
prop_map.add("temperatureAlert", "true")
else:
prop_map.add("temperatureAlert", "false")
```
### `BackEndApplication.py`程式碼
1. 發送直接方法函式,回傳訊息發送狀態
`response = iothub_device_method.invoke(DEVICE_ID, METHOD_NAME, METHOD_PAYLOAD, TIMEOUT)`
### Azure 雲端操作
對個別裝置,裝置詳細資料中有直接方法(Direct method)及裝置對應項(Device twin):

1. 雲端直接方法(Direct method),可以直接從雲端控制裝置,將要傳送的訊息填入裝載。

2. 裝置對應項(Device twin)用於設備版本更新及版本控管,也可以設定Tag協助裝置分類(例如:地區)。
架構圖:

3. IoT 裝置設定(IoT device configuration)在裝置非常多時,將裝置對應項(Device twin)利用Query指令進行大量設備控管。
流程圖:

位置:

---
## 參考文章
[何謂 Azure IoT 中心?](https://docs.microsoft.com/zh-tw/azure/iot-hub/about-iot-hub)
[【物聯網線 05】不可不知的裝置連網秘訣(1):裝置管理面面觀](https://www.youtube.com/watch?v=qc65NxZp2aQ)
[Azure IoT: 上傳訊息到雲端 (有字幕)](https://www.youtube.com/watch?v=SSUBvl-385U)
[Azure IoT: 使用路由儲存訊息 (有字幕)](https://www.youtube.com/watch?v=FAprw9_8EHI)
[Azure IoT: 雙向通訊 - 接收來自雲端的訊息 (有字幕)](https://www.youtube.com/watch?v=fttp2SDVwYg)
[Azure IoT: 處理上傳檔案的機制 (有字幕)](https://www.youtube.com/watch?v=6dXkybgDJRo)
[快速入門:將遙測從裝置傳送至 IoT 中樞,並使用後端應用程式讀取遙測 (Python)](https://docs.microsoft.com/zh-tw/azure/iot-hub/quickstart-send-telemetry-python)
[快速入門:控制連線到 IoT 中樞的裝置 (Python)](https://docs.microsoft.com/zh-tw/azure/iot-hub/quickstart-control-device-python)