[IoT] Azure IoT整合應用四:將訊息透過IoT Hub回傳至裝置上

  • 905
  • 0
  • IoT
  • 2016-11-06

在前三篇文章中,說明了如何透過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