M5stamp PICO UDP相互通信テスト
引き続きUDP通信のテストです。これEthernet2ライブラリのUDPSendReceiveの応用です。特別な問題は無く動作してます。
このソース的に悩んだのは、本筋とは関係が無いですけどIPアドレスやMacAddressを配列化して一つのソースで複数台に使いやすくしたところです。IPアドレスは元々はIPAddressに (192,168,12,177) “,"区切りで書いて入力するため文字変数からの転換がストレートには難しいのですが、.fromString でString文字列から代入できるようになってました。ここでの注意は文字列から入力する場合は一般的な”.”区切りにしないと認識されないところでした。当然と言えば当然ですね。
Macアドレスの方はbyte配列に入れれば良いため、sscanfで文字列の切り出しをしてByte配列に入れてあげれば良いだけですが、実例があまり無かったので悩みました。なので記録してきました。解説するほどの実力ではないので、とりあえず動いているソースを見てください。
17-18行を2台のPICOでhostとlocalの0と1をひっくり返して書き込めばOK
#include <SPI.h> // needed for Arduino versions later than 0018
#include <Ethernet2.h>
#include <EthernetUdp.h> // UDP library from: bjoern@cs.stanford.edu 12/30/2008
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[6];
//親機・子機IP,Mac Addressを設定しておく
const char* mac_addr[] = { "DE:AD:BE:EF:FE:EE", "DE:AD:BE:EF:FE:EA" };
String ip_addr[] = { "192.168.12.177", "192.168.12.178", "192.168.12.2" };//.2のIPはwindowsマシン
IPAddress host_ip;
IPAddress local_ip;
//親機・子機port addressを設定しておく
unsigned int UDP_Port[] = { 8888, 8889, 8890 };
//初期接続子機番号 2台のPICOでhostとlocalの0と1をひっくり返して書き込めばOK
int host_no = 1;
int local_no = 0;
int i = 97;
// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
// An EthernetUDP instance to let us send and receive packets over UDP
EthernetUDP Udp;
void setup() {
Serial.begin(115200);
//mac address IPを生成
sscanf(mac_addr[host_no], "%2hhx:%2hhx:%2hhx:%2hhx:%2hhx:%2hhx", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]);
host_ip.fromString(ip_addr[host_no]);
Ethernet.begin(mac, host_ip);
Udp.begin(UDP_Port[host_no]);
}
void loop() {
// if there's data available, read a packet
int packetSize = Udp.parsePacket();
if (packetSize > 0) {
Serial.print("\nReceived packet of size ");
Serial.println(packetSize);
Serial.print("From ");
IPAddress remote = Udp.remoteIP();
//print out the remote connection's IP address
Serial.print(remote);
Serial.print(" on port : ");
//print out the remote connection's port
Serial.println(Udp.remotePort());
// read the packet into packetBufffer
Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
Serial.print("Contents:");
for (int t = 0; t < packetSize; t++) {
Serial.print(packetBuffer[t]);
}
Serial.println("");
}
local_ip.fromString(ip_addr[local_no]);
// send a reply, to the IP address and port that sent us the packet we received
if (Udp.beginPacket(local_ip, UDP_Port[local_no]) == 0) {
Serial.println("Remort truble:");
};
if (i < 122) {
i = i + 1;
} else {
i = 97;
}
int u;
u = i - 32;
Udp.write(u);
Udp.endPacket();
Serial.print("\nSend packets:");
Serial.print(local_ip);
Serial.print(" : ");
Serial.print(UDP_Port[local_no]);
Serial.print(" Send :");
Serial.println((char)u);
// local_ip.fromString(ip_addr[2]);
// Udp.beginPacket(local_ip, UDP_Port[2]);
// Udp.write(u);
// Udp.endPacket();
delay(1000);
}
MP-101ワイヤレスリモコンの作成 シリーズ
その1 その2 その3 その4 その5 その6 その7 その8
関連