デバイスへudpパケット送信 (Spresense)

サンプルソースコード

概要

前回のサンプル 「ラベル機能」を使用することで、サーバからクライアントに向けて指示を出すことができます。しかし、ラベル機能では、クライアント側からサーバにあるラベル(指示内容)を取りに行く必要があり、どうしてもリアルタイム性には欠けます。

今回は、「サーバからクライアントに向けて指示を出す」もう1つの方法である、udpパケット送信APIを利用してみます。
クライアント側でudpのポートを開けて待ち受け状態にしておき、サーバ側からAPIを使用してそこに向けてパケットを送信することで、よりリアルタイム性がある指示を出すことができます。


ソースコード
spresense_iijiot_udp.ino
#include <LTE.h>
#include <LTEUDP.h>

//--- TODO: 使用するSIMのAPN情報に書き換えてください。
const char apn[]      = "iot.iijmobile.jp"; // "h.iijmobile.biz";
const char lte_user[] = "mobile@iot";
const char lte_pass[] = "iot";
//---

const int  udp_port = 9999;

LTE lteAccess;
LTEUDP udp;

/*
  setup関数
*/
void setup() {
  Serial.begin(115200);
  Serial.println("\nstart.");
  delay(3000);

  while (true) {
    //LTE接続
    if (lteAccess.begin() == LTE_SEARCHING) {
      if (lteAccess.attach(apn, lte_user, lte_pass) == LTE_READY) {
        Serial.println("attach succeeded.");
        break;
      }
      Serial.println("An error occurred, shutdown and try again.");
      lteAccess.shutdown();
      sleep(1);
    }
  }
  Serial.print("IPAddress = ");  Serial.println(lteAccess.getIPAddress());

  //udp待受開始
  udp.begin(udp_port);
  Serial.printf("begin UDP: port = %d\n", udp_port);

}

/*
  loop関数
*/
void loop() {
  //udpパケットを受信した場合
  while (int len = udp.parsePacket()) {
    //udpパケットを読み込む
    char buff[len + 1];
    memset(buff, 0, sizeof(buff));
    udp.read((uint8_t*)buff, len);
    //読み込んだudpパケットを表示する
    Serial.printf("\nRecieve %d byte(s).\n", len);
    Serial.println(buff);
  }
}
実行手順
  1. Spresense で上記スケッチをビルドし、実行します。
    シリアルモニタは、UDPパケット待受状態の表示になります。

    start.
    attach succeeded.
    IPAddress = 10.xxx.xxx.xxx
    begin UDP: port = 9999
  2. PCから IoTサービスのコントロールパネルにログインします。
  3. メニューの「API」を開き、アクセスキー・シークレットアクセスキーをメモします。
    同様に、メニューの「デバイス」をラ引き、対象のSIMの Device ID をメモします。
  4. IIJ IoTサービス Web API のページを開き、以下のとおり操作します。

    1. 画面上部の "AccessKeyID" "SecretAccessKey" に、メモしておいた アクセスキー・シークレットアクセスキー を入力します。
    2. UDP送信API の欄を開き、画面上の "Try it out" ボタンを押します。
    3. "deviceId" の欄に、メモしておいた Device ID を入力します。

    4. "udpRequest" の欄に、送信先デバイスのポート番号と送信するペイロードをJSON形式で入力します。今回は、M5Stack に対して "udp packet test" という文字列を 9999番ポートに 送信します。

      {
        "port": 9999,
        "payload": "udp packet test"
      }
    5. 画面上の "Execute" ボタンを押すと API実行結果が表示されます。 202のレスポンスが返ってくればOKです。

  5. シリアルモニタに、クライアント側で受信した(=サーバ側から送信した)パケットが表示されます。

    Recieve 15 byte(s).
    udp packet test
    
    


各種情報へのリンク

IIJ IoTサービスマニュアル

Spresense