From 7db9b9a3747744b9d758f5351b5d05811de6b564 Mon Sep 17 00:00:00 2001 From: Dooho Yi Date: Tue, 26 Apr 2022 01:47:29 +0900 Subject: [PATCH] revised esp32<->esp32 broadcast comm. --- audioooo/lib/ESP32-audioI2S | 2 +- audioooo/src/main.cpp | 67 +++++++++++---------- q/lib/ESP32-audioI2S | 2 +- q/src/main.cpp | 114 ++++++++++++++++++++---------------- 4 files changed, 104 insertions(+), 81 deletions(-) diff --git a/audioooo/lib/ESP32-audioI2S b/audioooo/lib/ESP32-audioI2S index e5e7497..5d289fd 160000 --- a/audioooo/lib/ESP32-audioI2S +++ b/audioooo/lib/ESP32-audioI2S @@ -1 +1 @@ -Subproject commit e5e7497cc468cb1814e490a721c6d32384561b88 +Subproject commit 5d289fd8151796d5c1861b02360d3a8c8971fea0 diff --git a/audioooo/src/main.cpp b/audioooo/src/main.cpp index 9838ca2..bb486c4 100644 --- a/audioooo/src/main.cpp +++ b/audioooo/src/main.cpp @@ -16,8 +16,9 @@ //======================== // #define MY_GROUP_ID (10000) -#define MY_ID (MY_GROUP_ID + 1) +#define MY_ID (MY_GROUP_ID + 2) #define MY_SIGN ("AUDIOOOO") +#define ADDRESSBOOK_TITLE ("broadcast only") // //======================== @@ -35,15 +36,14 @@ // + then, network would be flooded by infinite duplicating msg., // unless they stop reacting to 'known' req. for some seconds. (e.g. 3 seconds) // -// 'USE_ALTERNATIVE_ADDRESSES' +// 'ADDRESSBOOK_TITLE' // --> peer list limited max. 20. -// so, we have alternative address book that covers after 20th. +// so, we might use different address books for each node to cover a network of more than 20 nodes. // //==================== // #define DISABLE_AP #define REPLICATE_NOTE_REQ -#define USE_ALTERNATIVE_ADDRESSES //======================== #define GAIN_MAX 1.0 // if 1.0 is too loud, give max. limit here. @@ -256,7 +256,29 @@ void repeat() { memcpy(frm + 1, (uint8_t *) ¬e_now, sizeof(Note)); frm[frm_size - 1] = ']'; // - esp_now_send(NULL, frm, frm_size); // to all peers in the list. + // strange but following didn't work as expected. (instead, i have to send one-by-one.) + // esp_now_send(NULL, frm, frm_size); // to all peers in the list. + + // so, forget about peer list -> just pick a broadcast peer to be sent. + uint8_t broadcastmac[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; + esp_now_send(broadcastmac, frm, frm_size); + + // (DEBUG) fetch full peer list + esp_now_peer_num_t num; + esp_now_get_peer_num(&num); + esp_now_peer_info_t peer_info; + bool first = true; + for (uint8_t ii = 0; ii < num.total_num; ii++) { + esp_now_fetch_peer(first, &peer_info); + if (first) first = false; + MONITORING_SERIAL.printf("# peer: %02X:%02X:%02X:%02X:%02X:%02X\n", + peer_info.peer_addr[0], + peer_info.peer_addr[1], + peer_info.peer_addr[2], + peer_info.peer_addr[3], + peer_info.peer_addr[4], + peer_info.peer_addr[5]); + } // MONITORING_SERIAL.print("repeat! ==> "); MONITORING_SERIAL.println(note_now.to_string()); @@ -298,21 +320,6 @@ void hello() { if (hello_delay < 100) hello_delay = 100; hello_task.restartDelayed(hello_delay); } - - // //TEST - // Note n = { - // 10001, // int32_t id; - // 1, // float pitch; - // 127, // float velocity; - // 1, // float onoff; - // 0, // float x1; - // 0, // float x2; - // 0, // float x3; - // 0, // float x4; - // 5000 // float ps; - // }; - // note_now = n; - // repeat_task.restart(); } Task hello_task(0, TASK_ONCE, &hello, &runner, false); @@ -372,7 +379,7 @@ void onNoteHandler(Note & n) { void onDataReceive(const uint8_t * mac, const uint8_t *incomingData, int32_t len) { // - //MONITORING_SERIAL.write(incomingData, len); + // MONITORING_SERIAL.write(incomingData, len); // #if defined(HAVE_CLIENT) @@ -402,7 +409,6 @@ void onDataReceive(const uint8_t * mac, const uint8_t *incomingData, int32_t len } } - // MONITORING_SERIAL.println(note.to_string()); #if defined(REPLICATE_NOTE_REQ) @@ -417,7 +423,11 @@ void onDataReceive(const uint8_t * mac, const uint8_t *incomingData, int32_t len // on 'sent' void onDataSent(const uint8_t *mac_addr, esp_now_send_status_t sendStatus) { - if (sendStatus != 0) MONITORING_SERIAL.println("Delivery failed!"); + // well, i think this cb should be called once for EVERY single TX attempts, + // but in reality, it doesn't get called that often. + // i think this is sorta bug. but have no clear clue. + MONITORING_SERIAL.printf("* delivery attempt! ~~~>>> %02X:%02X:%02X:%02X:%02X:%02X\n", mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]); + if (sendStatus != 0) MONITORING_SERIAL.printf("* ==>> FAILED :(\n\n"); } // SD TEST @@ -505,6 +515,7 @@ void setup() { Serial.println("-"); Serial.println("- my id: " + String(MY_ID) + ", gid: " + String(MY_GROUP_ID) + ", call me ==> \"" + String(MY_SIGN) + "\""); Serial.println("- mac address: " + WiFi.macAddress() + ", channel: " + String(WIFI_CHANNEL)); + Serial.println("- my peer book ==> \"" + String(ADDRESSBOOK_TITLE) + "\""); #if defined(HAVE_CLIENT) Serial.println("- ======== 'HAVE_CLIENT' ========"); #endif @@ -543,20 +554,16 @@ void setup() { // uint8_t broadcastmac[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; // // // - // esp_now_peer_info_t peerInfo; + // esp_now_peer_info_t peerInfo = {}; // memcpy(peerInfo.peer_addr, broadcastmac, 6); // peerInfo.channel = 0; // peerInfo.encrypt = false; // esp_now_add_peer(&peerInfo); -#if defined(USE_ALTERNATIVE_ADDRESSES) - AddressBook * book = lib.getBookByTitle("audioooo alt"); -#else - AddressBook * book = lib.getBookByTitle("audioooo"); -#endif + AddressBook * book = lib.getBookByTitle(ADDRESSBOOK_TITLE); for (int idx = 0; idx < book->list.size(); idx++) { Serial.println("- ! (esp_now_add_peer) ==> add a '" + book->list[idx].name + "'."); - esp_now_peer_info_t peerInfo; + esp_now_peer_info_t peerInfo = {}; memcpy(peerInfo.peer_addr, book->list[idx].mac, 6); peerInfo.channel = 0; peerInfo.encrypt = false; diff --git a/q/lib/ESP32-audioI2S b/q/lib/ESP32-audioI2S index e5e7497..5d289fd 160000 --- a/q/lib/ESP32-audioI2S +++ b/q/lib/ESP32-audioI2S @@ -1 +1 @@ -Subproject commit e5e7497cc468cb1814e490a721c6d32384561b88 +Subproject commit 5d289fd8151796d5c1861b02360d3a8c8971fea0 diff --git a/q/src/main.cpp b/q/src/main.cpp index 5efc330..be93ba5 100644 --- a/q/src/main.cpp +++ b/q/src/main.cpp @@ -15,9 +15,10 @@ //======================== // -#define MY_GROUP_ID (70000) -#define MY_ID (MY_GROUP_ID + 1) -#define MY_SIGN ("Q") +#define MY_GROUP_ID (70000) +#define MY_ID (MY_GROUP_ID + 1) +#define MY_SIGN ("Q") +#define ADDRESSBOOK_TITLE ("broadcast only") // //======================== @@ -38,15 +39,14 @@ // 'GEN_NOTE_REQ' // --> this will generate 'note' msg. // -// 'USE_ALTERNATIVE_ADDRESSES' +// 'ADDRESSBOOK_TITLE' // --> peer list limited max. 20. -// so, we have alternative address book that covers after 20th. +// so, we might use different address books for each node to cover a network of more than 20 nodes. // //==================== // #define DISABLE_AP #define GEN_NOTE_REQ -// #define USE_ALTERNATIVE_ADDRESSES //======================== // @@ -234,7 +234,7 @@ void screen() { // create a NOTE req. and send it out. Note note_composed = { - 10001, // int32_t id; + 10000, // int32_t id; song_request, // float pitch; 127, // float velocity; 1, // float onoff; @@ -244,6 +244,9 @@ void screen() { 0, // float x4; 0 // float ps; }; + MONITORING_SERIAL.print("# posting a req.# ==> "); + MONITORING_SERIAL.println(note_composed.to_string()); + // uint8_t frm_size = sizeof(Note) + 2; uint8_t frm[frm_size]; @@ -251,11 +254,29 @@ void screen() { memcpy(frm + 1, (uint8_t *) ¬e_composed, sizeof(Note)); frm[frm_size - 1] = ']'; // - esp_now_send(NULL, frm, frm_size); // to all peers in the list. - // - MONITORING_SERIAL.print("# posting a req.# ==> "); - MONITORING_SERIAL.println(note_composed.to_string()); - // + // strange but following didn't work as expected. (instead, i have to send one-by-one.) + // esp_now_send(NULL, frm, frm_size); // to all peers in the list. + + // so, forget about peer list -> just pick a broadcast peer to be sent. + uint8_t broadcastmac[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; + esp_now_send(broadcastmac, frm, frm_size); + + // (DEBUG) fetch full peer list + esp_now_peer_num_t num; + esp_now_get_peer_num(&num); + esp_now_peer_info_t peer_info; + bool first = true; + for (uint8_t ii = 0; ii < num.total_num; ii++) { + esp_now_fetch_peer(first, &peer_info); + if (first) first = false; + MONITORING_SERIAL.printf("# peer: %02X:%02X:%02X:%02X:%02X:%02X\n", + peer_info.peer_addr[0], + peer_info.peer_addr[1], + peer_info.peer_addr[2], + peer_info.peer_addr[3], + peer_info.peer_addr[4], + peer_info.peer_addr[5]); + } //+ play start for myself sample_now = song_request; @@ -428,7 +449,29 @@ void repeat() { memcpy(frm + 1, (uint8_t *) ¬e_now, sizeof(Note)); frm[frm_size - 1] = ']'; // - esp_now_send(NULL, frm, frm_size); // to all peers in the list. + // strange but following didn't work as expected. (instead, i have to send one-by-one.) + // esp_now_send(NULL, frm, frm_size); // to all peers in the list. + + // so, forget about peer list -> just pick a broadcast peer to be sent. + uint8_t broadcastmac[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; + esp_now_send(broadcastmac, frm, frm_size); + + // (DEBUG) fetch full peer list + esp_now_peer_num_t num; + esp_now_get_peer_num(&num); + esp_now_peer_info_t peer_info; + bool first = true; + for (uint8_t ii = 0; ii < num.total_num; ii++) { + esp_now_fetch_peer(first, &peer_info); + if (first) first = false; + MONITORING_SERIAL.printf("# peer: %02X:%02X:%02X:%02X:%02X:%02X\n", + peer_info.peer_addr[0], + peer_info.peer_addr[1], + peer_info.peer_addr[2], + peer_info.peer_addr[3], + peer_info.peer_addr[4], + peer_info.peer_addr[5]); + } // MONITORING_SERIAL.print("repeat! ==> "); MONITORING_SERIAL.println(note_now.to_string()); @@ -470,33 +513,6 @@ void hello() { if (hello_delay < 100) hello_delay = 100; hello_task.restartDelayed(hello_delay); } - - // //TEST - // { - // Note note_composed = { - // 10001, // int32_t id; - // 1, // float pitch; - // 127, // float velocity; - // 1, // float onoff; - // 0, // float x1; - // 0, // float x2; - // 0, // float x3; - // 0, // float x4; - // 5000 // float ps; - // }; - // // - // uint8_t frm_size = sizeof(Note) + 2; - // uint8_t frm[frm_size]; - // frm[0] = '['; - // memcpy(frm + 1, (uint8_t *) ¬e_composed, sizeof(Note)); - // frm[frm_size - 1] = ']'; - // // - // esp_now_send(NULL, frm, frm_size); // to all peers in the list. - // // - // MONITORING_SERIAL.print("# posting a req.# ==> "); - // MONITORING_SERIAL.println(note_composed.to_string()); - // // - // } } Task hello_task(0, TASK_ONCE, &hello, &runner, false); @@ -593,13 +609,16 @@ void onDataReceive(const uint8_t * mac, const uint8_t *incomingData, int32_t len new_note_time = millis(); } #endif - } } // on 'sent' void onDataSent(const uint8_t *mac_addr, esp_now_send_status_t sendStatus) { - if (sendStatus != 0) MONITORING_SERIAL.println("Delivery failed!"); + // well, i think this cb should be called once for EVERY single TX attempts, + // but in reality, it doesn't get called that often. + // i think this is sorta bug. but have no clear clue. + MONITORING_SERIAL.printf("* delivery attempt! ~~~>>> %02X:%02X:%02X:%02X:%02X:%02X\n", mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]); + if (sendStatus != 0) MONITORING_SERIAL.printf("* ==>> FAILED :(\n\n"); } // SD TEST @@ -695,6 +714,7 @@ void setup() { Serial.println("-"); Serial.println("- my id: " + String(MY_ID) + ", gid: " + String(MY_GROUP_ID) + ", call me ==> \"" + String(MY_SIGN) + "\""); Serial.println("- mac address: " + WiFi.macAddress() + ", channel: " + String(WIFI_CHANNEL)); + Serial.println("- my peer book ==> \"" + String(ADDRESSBOOK_TITLE) + "\""); #if defined(HAVE_CLIENT) Serial.println("- ======== 'HAVE_CLIENT' ========"); #endif @@ -733,20 +753,16 @@ void setup() { // uint8_t broadcastmac[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; // // // - // esp_now_peer_info_t peerInfo; + // esp_now_peer_info_t peerInfo = {}; // memcpy(peerInfo.peer_addr, broadcastmac, 6); // peerInfo.channel = 0; // peerInfo.encrypt = false; // esp_now_add_peer(&peerInfo); -#if defined(USE_ALTERNATIVE_ADDRESSES) - AddressBook * book = lib.getBookByTitle("audioooo alt"); -#else - AddressBook * book = lib.getBookByTitle("audioooo"); -#endif + AddressBook * book = lib.getBookByTitle(ADDRESSBOOK_TITLE); for (int idx = 0; idx < book->list.size(); idx++) { Serial.println("- ! (esp_now_add_peer) ==> add a '" + book->list[idx].name + "'."); - esp_now_peer_info_t peerInfo; + esp_now_peer_info_t peerInfo = {}; memcpy(peerInfo.peer_addr, book->list[idx].mac, 6); peerInfo.channel = 0; peerInfo.encrypt = false;