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

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