SORACOMのDownlink APIをNode-REDで受信する

# はじめに
IoTデバイスをクラウドから操作したい──そんなニーズは昔からありますが、その要望を手軽に実装できる[SORACOM Downlink API](https://soracom.com/ja/news/20250324-downlink-api-supports-device-control)の提供が始まりました。

本記事ではこのDownlink APIのHTTPを[Node-REDをインストールしたWindows PC](https://qiita.com/ozk009/items/52ef82063b5a4b579628)で受信する方法を紹介します。

# 事前準備
## Windows PCのセットアップ
以下を参考にWindows PCに[Node-RED](https://nodered.org/)、[Wireguard](https://www.wireguard.com/)をインストールし、[SORACOM Arc](https://soracom.jp/services/arc/)を設定して、SORACOM接続環境を構築します。

https://qiita.com/ozk009/items/52ef82063b5a4b579628

## Node-REDで受信環境構築
Node-REDでDownlinkの通信を受信するための環境を作ります。
下の図の赤で囲んだフローです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/2691e26f-aef5-43bc-96e0-b51ea880074d.png)

:::note info
上の図の「データ送信」のフローは[前出の記事](https://qiita.com/ozk009/items/52ef82063b5a4b579628)で作ったのデータ送信です。後ほど使うので、記事を参考に作っておいてください。
:::

以下にそれぞれのノードの設定を記載します。

### http inノード
HTTPでのリクエストを受けるため、http inノードを置きます。
今回はメソッドをPOST、URLをhttp://ホスト名<font color="red">/api</font>で受けることにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/932ab1d5-6697-4d38-a34b-5bc66b45c4e2.png)
- メソッドでPOSTを選択
- URLに「/api」を記入

### changeノード
リクエストへのレスポンス文字列をpayloadにセットします。
今回は「API called」という文字列を返すことにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/774e3c5d-e20e-4e41-88a0-f85b16b9c0d5.png)
- msg.payloadに代入する値を文字列の「API Called」を記入

:::note info
実際に遠隔から現場の操作をする際はこの場所（http inとhttp responseの間）に操作用のノードを組み込みます。
:::

### http responseノード
レスポンスを返すhttp responseノードを設置し、ステータスコード200を返すようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/bbcc425d-4cfc-4044-89da-88764c258200.png)
- ステータスコードに「200」を記入

以上の設定が終わったらデプロイします。

## Node-REDの動作確認
Node-REDが動作するPCのコマンドプロンプトで以下のコマンドを実行します。
```
curl -X POST http://localhost:1880/api
```
「API Called」と表示されたらNode-REDの設定は完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/ebc9190d-b457-4f73-b608-52ad6862bf34.png)

:::note warn
curlコマンドがうまくいかない場合、Windows Defender ファイアウォールの設定が必要であったり、セキュリティシステムが影響している可能性があります。
:::

# SORACOM Downlink APIの実行
[SORACOM API リファレンス](https://users.soracom.io/ja-jp/tools/api/reference/)からDownlink APIを実行してみます。
## SAMユーザーの追加
APIを実行するためのSAMユーザーを追加します。
SORACOMユーザーコンソールから以下の手順で実行します。
1. SORACOMユーザーコンソールにログインし、画面右上のメールアドレスをクリックし、「セキュリティ」を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/32be0ceb-f0e9-45d9-93f8-3b552f0c3d07.png)
1. ユーザー名「downlink」を入力し、「作成」をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/fc0b298a-f41c-427d-b311-2370eb7e0890.png)
1. 作成したユーザーの設定画面を開き、「権限設定」を選択して、JSONを記入し、「保存」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/f6337ca7-fa3c-460d-855a-bf80923090dc.png)
    ```
    {
      "statements": [
        {
          "api": "*",
          "effect": "allow"
        }
      ]
    }
    ```
1. 続いて「認証設定」を選択して、「認証キーを生成」をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/fc8bd49d-d634-473b-b549-1f465c8d0ba3.png)
1. 表示された認証キー ID（keyID-から始まる文字列）と認証キー シークレット（secret-から始まる文字列）をメモしておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/165688e1-4a02-4e40-b014-3e81dcd8710b.png)

## SIM IDの確認
以下を参考にSIM IDを確認し、メモしておきます。

https://qiita.com/ozk009/items/7379e6dc2f3d96e3ea8d

## APIの実行
SORACOM API リファレンスの[sendDownlinkHttpDownlink](https://users.soracom.io/ja-jp/tools/api/reference/#/Sim/sendDownlinkHttpDownlink)からAPIを実行してみます。

1. SORACOM API リファレンス画面上部の「注意点を理解して認証する」をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/7d35e141-eb3c-4baa-a0e8-e6d292e9bdf3.png)

1. 前の工程でメモしたSAMユーザーの認証キー ID（keyID-から始まる文字列）と認証キー シークレット（secret-から始まる文字列）を入力し、「認証」をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/fb53a6c9-949c-49f8-88e8-3052ed2fe607.png)

1. API キー、API トークン、オペレーター IDが入ったことを確認して、sendDownlinkHttpDownlinkの箇所に移動する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/b3227117-299f-4875-a963-c1355b5a6c08.png)

1. 「Try it out」をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/941ab01d-3364-4a7f-8011-2c5a5f4168c4.png)

1. 前の工程でメモしたSIM IDを入力し、Request bodyに以下を入力して、「Execute」をクリックする
    ```
    {
      "method": "POST",
      "path": "/api",
      "port": 1880,
      "skipVerify": true,
      "ssl": false
    }
    ```
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/443ffb81-e5ef-4ecd-93a3-59696854ee05.png)

1. 実行結果が表示され、statusCodeに「200」、bodyに「API called」が表示されたら成功
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/71795558-86e8-4f36-b73e-4e9ea44e51c2.png)

:::note warn
APIの実行（Execute）に失敗する場合、実行前にNode-REDのデータ送信を実行（injectノードの左のボタンをクリック）した後にAPIを実行すると成功することがあります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/2ae48236-cdf0-4120-b19b-94793f162955.png)

:::

# おわりに
いかがでしたでしょうか。
[次回](https://qiita.com/ozk009/items/677d01d17a3c32098d7d)は今回行ったAPI呼び出しを[SORACOM Flux](https://soracom.jp/services/flux/)から実行してみます。
どなたかの参考になると幸いです。