在前三篇文章中,說明了如何透過IoT Hub收集裝置上傳的訊息,本篇內容會說明,如何透過IoT Hub回送訊息至裝置上
將訊息透過IoT Hub進行回送的動作很簡單,程式碼會分為發送端以及裝置接收端的部份
要製作發送端的程式之前,有幾個內容需要先取得
首先必須到IoH Hub的設定畫面中,取得IoT Hub的連線字串
第二步,確認要發送訊息的裝置端名稱,取得的方式也一樣可以透過IoT Hub的設定畫面作查詢
這兩個資訊都記下來後,在發送端的程式碼,內容非常簡短,只有下面幾行而已
ServiceClient serviceClient = ServiceClient.CreateFromConnectionString([IoT Hub連線字串]);
var serviceMessage = new Microsoft.Azure.Devices.Message(Encoding.ASCII.GetBytes([要發送的訊息]));
serviceMessage.Ack = DeliveryAcknowledgement.Full;
serviceMessage.MessageId = Guid.NewGuid().ToString();
await serviceClient.SendAsync([裝置代碼], serviceMessage);
await serviceClient.CloseAsync();
接著,在裝置端的部份,因為要接收訊息,所以必需加上一個Receive的function,並在程式一啟動時就執行它
public async Task<string> Receive()
{
string strIoTUrl = "[在這裡加上IoT Hub的Url]";
string strDeviceId = "[裝置的代碼]";
string strDeviceKey = "[裝置的Key值]";
DeviceClient deviceClient = DeviceClient.CreateFromConnectionString($"HostName={strIoTUrl};DeviceId={strDeviceId};SharedAccessKey={strDeviceKey}", TransportType.Amqp);
Message receivedMessage;
string messageData;
while (true)
{
receivedMessage = await deviceClient.ReceiveAsync(TimeSpan.FromSeconds(1));
if (receivedMessage != null)
{
messageData = Encoding.UTF8.GetString(receivedMessage.GetBytes());
await deviceClient.CompleteAsync(receivedMessage);
}
}
return messageData;
}
這樣,就可以讓裝置端接收從IoT Hub來的訊息了
有官傳送端的程式碼,可以參考GitHub上的內容,不過基本上就跟本篇文章是一模一樣的,因為程式碼的內容確實這樣就已經足夠了,有興趣的人還是可以參考一下GitHub上的內容
https://github.com/madukapai/maduka-Azure-IoT
參考資訊:
Tutorial: How to send cloud-to-device messages with IoT Hub