4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[Azure x IoT]Azure IoTHubにメッセージを送ろう

Last updated at Posted at 2022-02-23

Azure IoT Hubとは

AzureのIoT関連サービスの1つです。物理デバイスから受信したメッセージを他のAzureリソースに連携することができます。

リソース連携の例

  • Azure FunctionとDBサービス
    受信したメッセージをDBへ保存
  • Azure FunctionとSignalR(Azureのリアルタイム通知サービス)
    メッセージの受信をトリガーに、フロントエンドアプリケーションへリアルタイム通知

IoT Hub | Microsoft Azure

今回はそんな便利なAzure IoTHubにHTTPS,MQTTの2つのプロトコルでメッセージを送信する方法を紹介します。

本記事のゴール
image.png

事前準備

Azure CLIをインストールする

以下を参考にAzure cliをインストールしてください

https://docs.microsoft.com/en-us/cli/azure/install-azure-cli

Macの場合は以下です

brew update && brew install azure-cli

以下の値をPortalまたコマンドで取得しておく

  • iothubの名前
    image.png

  • デバイス名
    IoTHubに登録したデバイス名です。もしまだ登録してなければ登録しましょう。今回は物理デバイスは不要ですが、本来はIoTHubにメッセージを送るIoTデバイスを登録します。
    image.png

  • Event Hub-compatible endpoint

image.png

  • SAS(Shared Access Signiture)
    az iot コマンドを使って取得します。
    先にinstallしたazコマンドに対し拡張機能を追加インストールする必要があり、以下のコマンドで行います(参考)

    az extension add --name azure-iot
    

    トークン発行コマンド(コマンドリファレンス)

    az iot hub generate-sas-token -n $IOTHUB_NAME
    

    寿命を指定したい場合

    —duオプションをつけて、秒[s]単位で指定可能

    # 60秒で寿命が切れるトークンを作成するとき
    az iot hub generate-sas-token -n $IOTHUB_NAME --du 60
    

受信環境を用意する

AzureIoTHubで受信したメッセージの中身が意図したものになってるかを確認する環境を作成します。
一番簡単なのはAzureCLIのaz iot hub monitor-eventsを利用することですが、こちらはM1Mac上ではうまく動かないのでNode.jsの受信環境を構築します.

(自分は大抵IoTHub連携するFunctionもサクッとデプロイしてしまってそこで中身を確認することもあります)

  1. 公式のサンプルをcloneまたはコピペする

    利用するのはhttps://github.com/Azure-Samples/azure-iot-samples-nodeのうち,azure-iot-samples-node/iot-hub/Quickstarts/read-d2c-messagesです。

  2. 利用するサンプルに接続情報を渡す

    1. SampleCodeの38行目connectionStringに準備で用意したEvent Hub-compatible endpointをコピペします。
      サンプルコードは複数の情報をテンプレートリテラルに埋め込んでますが、結局上記のEvent Hub-compatible endpointを作っているだけなので右辺を全部削除して代入してしまってOKです。
      下記の形式を見ても、Portalから取得できる値と一致していることがわかるかと思います。

      サンプルの実装

      const connectionString = `Endpoint=${eventHubsCompatibleEndpoint};EntityPath=${eventHubsCompatiblePath};SharedAccessKeyName=service;SharedAccessKey=${iotHubSasKey}`;
      

      おすすめ

      const connectionString = ここに丸ごと代入
      
    2. プログラムを実行

      node ReadDeviceToCloudMessages.js
      

あとはメッセージを送れば以下のような形でメッセージを確認できます

xxxx@xxx read-d2c-messages % node ReadDeviceToCloudMessages.js
IoT Hub Quickstarts - Read device to cloud messages.
Telemetry received: 
{"value":"okay"}
Properties (set by device): 
undefined
System properties (set by IoT Hub): 
{"iothub-connection-device-id":"device0","iothub-connection-auth-method":"{\"scope\":\"hub\",\"type\":\"sas\",\"issuer\":\"iothub\",\"acceptingIpFilterRule\":null}","iothub-connection-auth-generation-id":"637769437000012500","iothub-enqueuedtime":1645585954048,"iothub-message-source":"Telemetry","contentType":"application/json","contentEncoding":""}

メッセージを送る

さて準備もできたので実際にメッセージを送っていきます

HTTPSで送る

以下の形式で送ればOK

IOTHUB_NAME=xxxxx
DEVICE_NAME=xxxxx
SAS=xxxx
curl -i -X POST \
-H "Content-Type:application/json" \
-H "Authorization:$SAS" \
-d '{"value":"hello,world with https"}' \
'https://$IOTHUBNAME.azure-devices.net/devices/$DEVICE_NAME/messages/events?api-version=2018-06-30'

以下の記事を参考にしました。
Azure IoT HubにHTTP POSTでメッセージを送信するメモ - Qiita

受信スクリプト側で以下のようなログが見れればOK

Telemetry received: 
{"value":"hello,world with https"}
Properties (set by device): 
undefined
System properties (set by IoT Hub): 
{"iothub-connection-device-id":"device0","iothub-connection-auth-method":"{\"scope\":\"hub\",\"type\":\"sas\",\"issuer\":\"iothub\",\"acceptingIpFilterRule\":null}","iothub-connection-auth-generation-id":"637769437000012500","iothub-enqueuedtime":1645587259557,"iothub-message-source":"Telemetry","contentType":"application/json","contentEncoding":""}

MQTTで送る

MQTTとは?

http,httpsのような通信プロトコルの一種です。なぜこれがIoT界隈で使われているのかというと以下のような理由があるみたいです.

「MQTT」は、シンプル、軽量、省電力

また「MQTT」のトラフィックは、HTTPに比べると10分の1になります。すなわち通信量やCPU負荷、電力消費量などを、従来の10分の1に抑えることができるのです。

MQTTとは | かもめエンジニアリング

確かに、途方もない数の物理デバイスからデータを収集するのであれば軽量で省電力なのはメリットが大きそうですね。

送り方

今回はmosquittoというMQTTクライアントを利用する

  1. mosquittoのインストール

    Download

  2. メッセージの送信
    MQTTメッセージからIoTHubにメッセージを送るときにcontent-typeとencodingを設定する場合はトピックの末尾に以下をつける必要があるので注意です(参考)

    $.ct=application%2Fjson&$.ce=utf-8
    
    IOTHUB_NAME=xxxx
    DEVICE_NAME=xxxx
    SAS=xxxx
    mosquitto_pub -d -q 1 \
      -V mqttv311 \
      -p 8883 \
      -h "$IOTHUB_NAME.azure-devices.net" \
      -i $DEVICE_NAME \
      -u "$IOTHUB_NAME.azure-devices.net/$DEVICE_NAME/api-version=2016-11-14" \
      -P $SAS \
      -t "devices/$DEVICE_NAME/messages/events/$.ct=application%2Fjson&$.ce=utf-8" \
      -m '{"value":"Hello,world with MQTT"}'
    

受信スクリプト側で以下のようなログが見れればOK

Telemetry received: 
{"value":"Hello,world with MQTT"}
Properties (set by device): 
undefined
System properties (set by IoT Hub): 
{"iothub-connection-device-id":"device0","iothub-connection-auth-method":"{\"scope\":\"hub\",\"type\":\"sas\",\"issuer\":\"iothub\",\"acceptingIpFilterRule\":null}","iothub-connection-auth-generation-id":"637769437000012500","iothub-enqueuedtime":1645588086679,"iothub-message-source":"Telemetry","contentType":"application/json","contentEncoding":"utf-8"}

終わりに

いかがでしたでしょうか。これでデバイス→IoTHubへメッセージを送ることはできるようになったのではないでしょうか。

この次はIoTHubに届いたメッセージを加工、保存等したくなりますよね。そんな方向けにAzureIoTHubとAzureFunction,DBを連携する方法を紹介する記事も執筆予定です。お楽しみに!

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?