すべての参加者がUDP経由で最も簡単な形式で通信する必要があるESP32(偉大なプラットフォームbtw)を使用して分散アプリケーションを構築しています:ブロードキャスト経由でメッセージを送信し、メッセージはの周囲に浮かんでいます。各参加者は、関連するメッセージを単独でフィルタリングします。ESP32 - ネイティブLwIPライブラリを使用するUDPブロードキャスタ/レシーバ
これまでのところ、私は、次の初期化ルーチンがあります。そして、
int lavor_wifi_openUDPsocket(){
// Create a socket
int sckt = socket(AF_INET, SOCK_DGRAM, 0);
if (sckt < 0){
printf("socket call failed");
exit(0);
}
// Prepare binding to port
struct sockaddr_in sLocalAddr;
// Initialize the address
memset((char *)&sLocalAddr, 0, sizeof(sLocalAddr));
sLocalAddr.sin_family = AF_INET;
sLocalAddr.sin_len = sizeof(sLocalAddr);
sLocalAddr.sin_addr.s_addr = htonl(INADDR_ANY);
sLocalAddr.sin_port = UDP_SOCKET_PORT;
bind(sckt, (struct sockaddr *)&sLocalAddr, sizeof(sLocalAddr));
return sckt;
}
を、メッセージがで送信されます:
void lavor_wifi_sendUDPmsg(int sckt, char* msg, int len){
// Prepare the address to sent to via BROADCAST
struct sockaddr_in sDestAddr;
// Initialize the address
// memset((char *)&sDestAddr, 0, sizeof(sDestAddr));
sDestAddr.sin_family = AF_INET;
sDestAddr.sin_len = sizeof(sDestAddr);
sDestAddr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
sDestAddr.sin_port = UDP_SOCKET_PORT;
if(sendto(sckt, msg, len, 0, (struct sockaddr *)&sDestAddr, sizeof(sDestAddr)) < len){
printf("UDP message couldn't be sent.");
}
}
そして最後に、メッセージを受信すると、このように動作します:
void lavor_wifi_processor(void* sckt){
int nbytes;
char buffer[UDP_BUFF_LEN];
// Listen for incoming messages as long as the socket is open
while(1){ // TO DO: Test if socket open
// Try to read new data arrived at the socket
nbytes = recv(*((int *)sckt), buffer, sizeof(buffer), 0);
...
私は上記の初期化関数を呼び出そうとしても、ESPは1つのGuru Meditationエラーを別のものの後に投げます。
誰もUDP通信の経験がありますか?