#1. はじめに
WEBを探しまくっても確かにUDPの良い例(分かりやすい例)がありませんが
きっとUDPを扱える方々は ササっとこの辺りは組んでしまうのでわと思われます
昨今のブームで大量のデータ転送(100KByteほど)やそのやりとりを簡単な登録済ライブラリとして作成してみました
空いた時間は LogicやUI の強化に回して頂ければと考えております
- まだまだ皆さまの pull request には追い付かないと思われますが よろしくお願い申し上げます
#2. UDP通信の開始
UDPにて通信をする場合には単純に udp.begin(PORT) すれば良いようで
##2.1. 直書きする場合
サーバにする場合
WiFi.softAPConfig(SERVER_IP, GW_IP, SUBNET);
WiFi.softAP(ssid, pass);
クライアントにする自宅ルータに接続する場合
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, pass);
WiFi.waitForConnectResult();
で...
udp.begin(PORT);
##2.2. tinyUDP™の場合
サーバにする場合
tinyUDP tudp(TUDP_RECV);
クライアントにする場合
tinyUDP tudp(TUDP_SEND);
だけで完了となります
自動的に TUDP_SERVER側になった方に接続します
#3. tinyUDP™ によるデータ送受信
##3.0. 共通準備
他の library の負荷とならないようにバッファを内部的に new します
#define BUF_SIZE (1024 * 80)
tudp.begin(BUF_SIZE);
##3.1. TUDP_SEND側から巨大データを送信する場合
バッファを確保サイズを取得後
データに設定を行い転送アレイにput
tudp.send(bool) もしくは tudp.update(bool) で自動的に送信を行います
static uint8_t c = 0x0;
if (tudp.delay(10)) { // 大きいバッファの場合は 10Msec程 delay
uint8_t *buf = tudp.get(); // バッファ確保
uint32_t bufSize = tudp.getArySize(); // バッファサイズ取得
memset(buf, c, bufSize); // データ設定
tudp.put(buf, bufSize); // バッファを転送アレイにput
Serial.printf(
"send : 0x%02x, size=%d\n",
c,
bufSize);
c = (c + 1) % 256;
tudp.update(false); // 送信
}
##3.2. TUDP_RECV側が巨大データを受信する場合
if (tudp.isRecv()) { // データが来たか?
uint8_t *buf = tudp.get(); // 受信バッファ確保
uint32_t recvSize = tudp.getRecvSize(); // 受信バッファサイズ取得
Serial.printf(
"recv : 0x%02x, size=%d\n",
buf[0],
recvSize);
tudp.dump(buf, 128); // 受信した 先頭128Byteをダンプします
}
tudp.update(false); // 受信
#4. ライブラリ化に関して
この tinyUDP™ を使えば他の処理のことだけを考える事が出来ますので
便利かなぁと思い無理無理ライブラリ化させて頂きました
おかげさまで 2個めのライブラリとなり
気を付けないといけない所が判って来ましたので
もう あなたの ino ライブラリ化します 等々しようかなぁとか
#5. さいごに
申請にあたり 困った時の lang-ship さんのページを参考にさせて頂きました
いつもありがとうございます
皆様 末永くよろしくお願い申し上げます