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

サンプルソースコード

概要

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

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

事前準備

今回の環境は、クライアント(M5Stack)とサーバの間にモバイルルーターがあるため、サーバからクライアントに向けて直接パケットを送り届けることができません。そこで、モバイルルーターにポートフォワードの設定を行うことで、パケットをクライアント(M5Stack)まで送り届けられるようにします。

ポートフォワード設定

今回は、PIX-MT100 を例にしてポートフォワードの設定をしてみます。

  1. PIX-MT100 をPCに挿して、そのPC上でWebブラウザを開きます。
  2. ブラウザから http://192.168.0.1/ を開きます。
  3. ユーザー名・パスワードを入力してログインします。
  4. 画面上の「ネットワーク」→「ポートフォワーディング」を選択します。
  5. ポートフォワードの設定を入力します。

    例として、9999番ポートへの udpパケットを M5Stack側に転送したい場合は、以下のように入力します。

    プロトコルWANポートLANポートLAN IPアドレス
    UDP99999999M5StackのIPアドレスを入力

他のモバイルルーターを使用する場合は、同様にポートフォワードの設定等を行ってください。


ソースコード
m5stack_iijiot_udp.ino
#include <M5Stack.h>
#include <WiFi.h>
#include <WiFiUdp.h>

//--- TODO: モバイルルーターの SSIDとパスワードを指定してください
const char* ssid = "SSID";
const char* pass = "SSID_PASSWORD";
//---

const int udpPort = 9999;

WiFiUDP udp;

/*
  setup関数
*/
void setup() {
  //M5Stackを初期化
  M5.begin();
  M5.Power.begin();

  //Wi-Fi接続
  WiFi.begin(ssid,pass);
  M5.Lcd.printf("Waiting connect to WiFi: %s ", ssid);
  while(WiFi.status() != WL_CONNECTED) {
    //接続完了まで待つ
    delay(1000);
    M5.Lcd.print(".");
  }
  //接続完了したらIPアドレスとMacアドレスを表示する
  M5.Lcd.println("\nWiFi connected");
  M5.Lcd.print("IP address: ");
  M5.Lcd.println(WiFi.localIP());
  M5.Lcd.print("MAC address:");
  M5.Lcd.println(WiFi.macAddress());
  delay(500);

  //udp待受開始
  udp.begin(udpPort);
  M5.Lcd.println("Waiting udp packet...");
}

/*
  loop関数
*/
void loop() {
  //udpパケットを受信した場合
  if (int len = udp.parsePacket()) {
    //udpパケットを読み込む
    char buff[len + 1];
    memset(buff, '\0', sizeof(buff));
    udp.read((uint8_t*)buff, len);
    //読み込んだudpパケットを表示する
    M5.Lcd.printf("Recieved: %d byte(s)\n", len);
    M5.Lcd.println(buff);
  }
}
実行手順
  1. M5Stackで上記スケッチをビルドし、実行します。
    パケット待受状態の表示になります。
  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. M5Stackの画面に、送信したパケットが表示されます。


各種情報へのリンク

IIJ IoTサービスマニュアル

M5Stack