技術科普2017.05.17

Azure IoT整合應用一:建立Azure上的IoT Hub並發送訊息至IoT Hub中

雲端服務 物聯網

作者:Maduka

IoT的應用是網際網路上非常熱門的一個趨勢,這篇文章會說明如何在Microsoft Azure上建立一個IoT Hub,
並從裝置上傳送訊息至IoT Hub之中。

要在雲端服務中整合IoT的應用,若是使用Microsoft Azure的話,在整合與操作上是非常簡單的,下面會一步一步的說明,如何將Client的裝置註冊進Azure IoT Hub中,並發送訊息到Azure IoT Hub上。

 

1.首先先在Azure上面建立一個Azure IoT Hub的服務,至於區域以及資源群組則可以自行調整。

2.在建立Azure IoT Hub時,可以進行的設定主要有兩個,[IoT Hub單位]代表Hub的數量,若是裝置越多,則建議Hub的數量需要增加才能應付更多的裝置同時的連線,[裝置到雲端的磁碟分割]代表訊息送到IoT Hub後,存放訊息的磁碟分割數量,若是訊息量越大,則磁碟分割的數量也建議越大,在資料的存取效能上會較佳。

每一個訂閱只能有一個免費的Azure IoT Hub可以使用

3.建立好Azure IoT Hub之後,我們先進入到Azure IoT Hub的設定中,查看[存取共用原則]的內容,在[存取共用原則]的設定中預設會有5個不同的角色,分別是iothubowner、service、device、registryRead與registryWrite。這5個角色的權限是不一樣的,所以可以在Client端裝置傳訊、註冊以及後端管理上,使用不同的權限角色進行連線的操作。

裝置使用的原則名稱與權限,在正式環境上最好作使用上的區隔,避免權限過高的問題發生。

在這篇文章中,為了方便進行管理以及模擬器的操作,所以使用iothubowner作為服務連接的原則名稱,取得設定連接的方式,先點選iothubowner之後,將[連接字串-主要金鑰]的值複製起來,後面在編寫裝置的模擬器會用到。

 

另一個需要複製起來的資訊,就是Azure IoT Hub的[主機名稱],這個資訊可以在Azure IoT Hub主要畫面中找到。

 

4.在Visual Studio之中,建立一個Windows Form的專案,並設計註冊裝置反註冊裝置傳送訊息的功能。如果習慣寫Web,或是Console的人也可以開熟悉的專案進行模擬器程式碼的編寫。

專案請建立.NET Framework 4.5以上的版本,不然Azure的套件不支援

5.建立完專案之後,請在管理Nuget套件中,加入[Microsoft.Azure.Devices]以及[Microsoft.Azure.Devices.Client]兩個套件

6.接著在註冊的按鈕按下的事件中加上註冊裝置至Azure IoT Hub的程式碼

string strDeviceId = txtDeviceId.Text;

Device objDevice = null;
RegistryManager registryManager = RegistryManager.CreateFromConnectionString(strIoTHubConnectionString);

// 先從Azure IoT Hub上取得裝置是不是已經存在
objDevice = await registryManager.GetDeviceAsync(strDeviceId);

// 如果裝置不存在Azure IoT Hub上的話,就註冊進IoT Hub
if (objDevice == null)
    objDevice = await registryManager.AddDeviceAsync(new Device(strDeviceId));

// 取得裝置註冊之後的Device Key
if (objDevice != null)
{
    txtDeviceKey.Text = objDevice.Authentication.SymmetricKey.PrimaryKey;
}
else
{
    MessageBox.Show("該裝置無法於Azure IoT Hub中註冊");
}

這段程式碼主要的功能就是將輸入的裝置代碼註冊至Azure IoT Hub之中,並取得在Azure IoT Hub上該裝置所註冊的Key值

7.當裝置已經成功的註冊進Azure IoT Hub之中,就可以透過傳送訊息的方式,將訊息送至Azure IoT Hub上了,在傳送訊息的事件中,可以加入下面的程式碼

string strJsonMessage = txtMessage.Text;
string strDeviceId = txtDeviceId.Text;
string strDeviceKey = txtDeviceKey.Text;

DeviceClient deviceClient = DeviceClient.Create(strIoTHubUrl,
    new DeviceAuthenticationWithRegistrySymmetricKey(strDeviceId, strDeviceKey));

await deviceClient.SendEventAsync(new Microsoft.Azure.Devices.Client.Message(Encoding.UTF8.GetBytes(strJsonMessage)));

上面的程式碼就是將取得的裝置代碼與註冊Key值,連同訊息一起送進Azure IoT Hub之中

目前Azure IoT Hub支援的通訊協定共有四種,分別是HTTPS、AMQP、AMQP over WebSockets、MQTT
雖然說支援這四種通訊協定,但是傳入的訊息目前還是只有支援JSON格式的字串,所以要傳入的內容必須為JSON格式的內容

裝置必須先註冊才能推送訊息至Azure IoT Hub上

透過這樣的方式,我們可以看到訊息已經推送至Azure IoT Hub,包含裝置也註冊在Azure IoT Hub裡了

在Azure IoT Hub的資訊頁面上也可以看到有裝置與訊息被推送進去

Microsoft.Azure.Devices與Microsoft.Azure.Devices.Client這兩個套件已經Open Source在GitHub上
網址是:https://github.com/Azure/azure-
iot-sdks
微軟同時也在這個GitHub上放了一些管理Azure IoT Hub的工具,在tools的資料夾下有名為DeviceExplorer的專案,開啟後編譯得到的執行檔,可以透過這個執行程式查看目前已經註冊的裝置資訊,使用起來非常的方便與清楚明瞭,有興趣的人可以下載並使用

有關Azure IoT的應用範圍是非常廣的,這篇文章先簡單的帶大家進入Azure IoT世界的第一步,整體的運用還有更多的服務可以供企業IoT的運用

本篇文章的範例程式放置於GitHub中,想實際試試看的人,也可以透過GitHub下載模擬器的程式碼回去玩看看
GitHub網址: https://github.com/madukapai/maduka-Azure-IoT

參考資料:
Azure IoT Hub developer guide
Supporting additional protocols for IoT Hub
Get started with Azure IoT Hub
for .NET

延伸討論

技術科普

Pi3 安裝Windows10 IoT Core教學

樹莓派中不止可以安裝Linux的作業系統並撰寫程式,同時微軟也有提供可以安裝於樹莓派的作業系統 (Windows 10 IoT Core),除了可以安裝Windows 10 IoT Core之外,也可以使用Visual Studio撰寫C#的程式並部署到樹莓派中,要在樹莓派中安裝Windows 10 IoT Core的作業系統不難,照著下面的步驟就可以完成了。
技術科普

設定 MediaTek Cloud Sandbox 串接IoT Studio

與 IoT 相關的雲端服務為數眾多,例如:ThingSpeak、WoT.City、AWS、IBM Bluemix、MediaTek MCS 等,並在透過這些雲端服務可在對資料進行資料視覺化、資料分析與其它的應用,而本文描述 MediaTek Cloud Sandbox 服務相關設定,以供 IoT Studio 串接使用。
技術科普

[ MediaTek ] LinkIt 7697 起手式基礎教學

聯發科於 2017 年 5 月推出 LinkIt 7697, 它是一片高度整合的系統單晶片的物聯網應用開發板,特色包含一個 Cortex-M4 微控制器、低功耗 1T1R 802.11b/g/n 2.4GHz Wi-Fi 子系統、低功耗藍牙子系統,以及 PMU。LinkIt 7697D 是強化版本,額外提供了 802.11a,以及 5GHz 頻帶的支援。目前建議售價為 13.9 美金,相當的親民,本文描述如何從 0 開始快速上手 Linkit 7697 使用方法。