Azure IoT Hub使い方: メッセージ送信

# Azure IoT Hub使い方: メッセージ送信

Azure IoT Hubのメッセージの送信方法を学びつつ、メッセージ送信のAPI呼び出しをElixirで試してみる。
(記事作成にあたって画像の一部を透過処理しています)

記事作成時の環境
* EndeavourOS
* elixir          1.16.3-otp-26
* erlang          26.2.4

関連リポジトリ

https://github.com/BlackTanuTanuNinjas1035/sample_azure

目次
- [Azure IoT Hub使い方: メッセージ送信](#azure-iot-hub使い方-メッセージ送信)
  - [前提](#前提)
  - [Iot Hubを作成する](#iot-hubを作成する)
  - [IoT Deviceを作成する](#iot-deviceを作成する)
  - [SASトークンを生成する](#sasトークンを生成する)
  - [データを送信する](#データを送信する)
  - [実行例](#実行例)
  - [結論](#結論)
  - [Iot Hub作成詳細](#iot-hub作成詳細)
    - [Iot Hub: 基本](#iot-hub-基本)
    - [Iotハブ: ネットワーク](#iotハブ-ネットワーク)
    - [Iotハブ: 確認および作成](#iotハブ-確認および作成)
  - [Iot Device作成詳細](#iot-device作成詳細)

## 前提

下記リンクにリダイレクトしてAzureアカウント登録を行う

https://portal.azure.com

以後上記のURL先のAzureコンソールで操作を行う

## Iot Hubを作成する

Iot Hubを作成するにはAzureのコンソールで次の操作を行う

1. リソースの作成を選択する
2. 「開始」-> 検索ボックスから「Iot Hub」を検索して選択
3. IoT Hubを作成する

詳細は [## Iot Hub作成詳細](#iot-hub作成詳細)を参照

## IoT Deviceを作成する

IoT Deviceを作成するには、Azureのコンソールで次の操作を行う

* 「リソース」から「[Iot Hubを作成する](#iot-hubを作成する)」で作成したリソースを選択
* 「デバイス管理」から「デバイス」を選択し、「デバイスの追加」をクリック
* 設定を入力して保存

詳細は [## Iot Device作成詳細](#iot-device作成詳細)を参照

## SASトークンを生成する

SASトークンを作成するにはAzureのコンソールで次の操作を行う

1. リソースの作成を選択する
2. 「開始」-> 検索ボックスに「共有アクセス ポリシー」を検索して選択

メッセージを送信したいデバイス(ラズパイ等)で、次の作業を行う

1. azure-cliをインストール
2. `az login`でログインを行う
3. `az account set --subscription "<サブスクリプション ID>"`でサブスクリプションを指定
4. "az iot hub generate-sas-token -n <IoT Hub名>"を実行して、SASトークン生成

azure-cliはパッケージリポジトリにないので、下記のリンクからインストールを行う。

https://learn.microsoft.com/ja-jp/cli/azure/install-azure-cli-linux?pivots=apt#option-1-install-with-one-command

サブスクリプションIDは、Azureコンソールから次のようにして参照する

1. リソースから作成したIoT Hubを選択
2. 「概要」の「サブスクリプション」からサブスクリプション名をクリック
3. 遷移先に「サブスクリプションID」があるのでそれをコピー

## データを送信する

メッセージを送信するときに使用するAPIのエンドポイントは下記のようになる

`"https://<IoT Hub名>.azure-devices.net/devices/<デバイスID>/messages/events?api-version=2018-06-30"`

またヘッダーはSASトークンを含める必要がある。

`Authorization: <SASトークン>`

## 実行例

下記ブランチにAPIによるメッセージ送信を行うElixirコードをおいているので、そちらから実際のメッセージを試せる

https://github.com/BlackTanuTanuNinjas1035/sample_azure

`iex -S mix`から関数を実行する前に、`config.exs`に必要な設定を記述する。

次のような出力が出ると送信が成功している。

```elixir
%HTTPoison.Response{
  status_code: 204,
  body: "",
  headers: [
    {"Content-Length", "0"},
    {"Vary", "Origin"},
    {"Server", "Microsoft-HTTPAPI/2.0"},
    {"x-ms-request-id", "<リクエストID>"},
    {"Date", "Wed, 03 Jul 2024 05:23:26 GMT"}
  ],
  request_url: "https://<IoTHub名>.azure-devices.net/devices/<デバイスID>/messages/events?api-version=2018-06-30",
  request: %HTTPoison.Request{
    method: :post,
    url: "https://<IoTHub名>.azure-devices.net/devices/<デバイスID>/messages/events?api-version=2018-06-30",
    headers: [
      {"Authorization", "SharedAccessSignature sr=<IoTHub名>.azure-devices.net&sig=<SASトークン>&se=<有効期限>&skn=iothubowner"},
      {"Content-Type", "application/json"}
    ],
    body: "{\"message\":\"<メッセージ>\"}",
    params: %{},
    options: []
  }
}
```

Azure Potalのリソースからメッセージの送信を確認できる

![使用されたメッセージの数.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3455723/b8424cf2-ed7a-0549-963d-9ab0436302e4.png)


## 結論

IoTデバイスからのメッセージ送信を実装する際には、下記を行う必要がある

* Azureアカウントを作成する
* IoT Hubを作成する
* IoT Deviceを作成する
* azコマンドをインストールする
* azコマンドでログインする
* azコマンドでサブスクリプションを設定する
* azコマンドでsasトークンを生成する
* メッセージ送信のAPI実行する

## Iot Hub作成詳細

### Iot Hub: 基本

次の設定項目が存在する

* プロジェクトの詳細
  * サブスクリプション、リソースグループ
* インスタンスの詳細
  * IotHub名、領域(ロケール)、レベル、1 日あたりのメッセージの制限


プロジェクト詳細ではサブスクリプションとリソースグループを設定する。

デフォルトでアカウントに紐付けされた「Azure subscription 1」というサブスクリプションがある。(あとから名前変更できる)
とりあえずそれをサブスクリプションに設定する。

リソースグループはデフォルトでは作成されていない。
ここでは「チュートリアル」という名前で作成し、これを指定する。

インスタンスの詳細ではIotHub名、領域(ロケール)、レベル、1 日あたりのメッセージの制限を設定する。

IotHub名は省略する。
領域(ロケール)は「Japan West」か「Japan East」どちらか。
今回はレベルを「無料」に指定。
その場合は1 日あたりのメッセージの制限は「8,000 ($0/月)」に指定されるのでそのまま。

ここまでで以下のように設定できる
![IotHub設定_基本 (1 をコピー).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3455723/a341219b-f179-da09-b24f-a01311226ef4.png)


### Iotハブ: ネットワーク

この項目では接続の構成を設定する。
「パブリックアクセス」「プライベートアクセス」のどちらかを選ぶ。

今回はパブリックを選択。

### Iotハブ: 確認および作成

あとの設定はデフォルトに指定すると「確認および作成」の項目は次のようになる。

![Iotハブ確認 (1 をコピー).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3455723/12ce37f7-dd55-88d3-7bf5-93a9fe53a712.png)


## Iot Device作成詳細

デバイスIDをIot Hub内で一意に設定する。
あとはデフォルトで良い

下記のような設定となる

![Iotデバイス作成 (1 をコピー).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3455723/6ce9e321-738b-bf57-0961-28a86141439c.png)