デバイスへ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);
}
}
実行手順
Spresense で上記スケッチをビルドし、実行します。
シリアルモニタは、UDPパケット待受状態の表示になります。start. attach succeeded. IPAddress = 10.xxx.xxx.xxx begin UDP: port = 9999
- PCから IoTサービスのコントロールパネルにログインします。
- メニューの「API」を開き、アクセスキー・シークレットアクセスキーをメモします。
同様に、メニューの「デバイス」をラ引き、対象のSIMの Device ID をメモします。 IIJ IoTサービス Web API のページを開き、以下のとおり操作します。
- 画面上部の "AccessKeyID" "SecretAccessKey" に、メモしておいた アクセスキー・シークレットアクセスキー を入力します。
- UDP送信API の欄を開き、画面上の "Try it out" ボタンを押します。
"deviceId" の欄に、メモしておいた Device ID を入力します。
"udpRequest" の欄に、送信先デバイスのポート番号と送信するペイロードをJSON形式で入力します。今回は、M5Stack に対して "udp packet test" という文字列を 9999番ポートに 送信します。
{ "port": 9999, "payload": "udp packet test" }画面上の "Execute" ボタンを押すと API実行結果が表示されます。 202のレスポンスが返ってくればOKです。
シリアルモニタに、クライアント側で受信した(=サーバ側から送信した)パケットが表示されます。
Recieve 15 byte(s). udp packet test
各種情報へのリンク
IIJ IoTサービスマニュアル
- Gateway API (UDP送信)
Spresense