From 0641547d73a41f69a41cc769ed341e088f3c25e4 Mon Sep 17 00:00:00 2001 From: Nic Limper Date: Tue, 23 May 2023 21:06:50 +0200 Subject: [PATCH] 8 byte mac addr instead of 6 byte --- ESP32_AP-Flasher/data/www/main.css | 3 + ESP32_AP-Flasher/data/www/main.js | 2 +- ESP32_AP-Flasher/data/www/upload-test.html | 2 +- ESP32_AP-Flasher/include/commstructs.h | 2 +- ESP32_AP-Flasher/include/tag_db.h | 10 +- ESP32_AP-Flasher/include/web.h | 3 +- ESP32_AP-Flasher/src/contentmanager.cpp | 38 +++---- ESP32_AP-Flasher/src/newproto.cpp | 116 +++++++-------------- ESP32_AP-Flasher/src/tag_db.cpp | 44 +++++--- ESP32_AP-Flasher/src/web.cpp | 32 ++---- 10 files changed, 104 insertions(+), 148 deletions(-) diff --git a/ESP32_AP-Flasher/data/www/main.css b/ESP32_AP-Flasher/data/www/main.css index 0e360ce5..04896a6f 100644 --- a/ESP32_AP-Flasher/data/www/main.css +++ b/ESP32_AP-Flasher/data/www/main.css @@ -255,6 +255,9 @@ select { .alias { font-size: 1.4em; font-weight: bold; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } .received { diff --git a/ESP32_AP-Flasher/data/www/main.js b/ESP32_AP-Flasher/data/www/main.js index c05dc1d9..31b75e52 100644 --- a/ESP32_AP-Flasher/data/www/main.js +++ b/ESP32_AP-Flasher/data/www/main.js @@ -113,7 +113,7 @@ function processTags(tagArray) { $('#tag' + tagmac + ' .mac').innerHTML = tagmac; } let alias = element.alias; - if (!alias) alias = tagmac; + if (!alias) alias = tagmac.replace(/^0{1,4}/, ''); $('#tag' + tagmac + ' .alias').innerHTML = alias; let contentDefObj = getContentDefById(element.contentMode); diff --git a/ESP32_AP-Flasher/data/www/upload-test.html b/ESP32_AP-Flasher/data/www/upload-test.html index a21e671a..5e2164ca 100644 --- a/ESP32_AP-Flasher/data/www/upload-test.html +++ b/ESP32_AP-Flasher/data/www/upload-test.html @@ -8,7 +8,7 @@
-
+



diff --git a/ESP32_AP-Flasher/include/commstructs.h b/ESP32_AP-Flasher/include/commstructs.h index b45756ab..27646ab5 100644 --- a/ESP32_AP-Flasher/include/commstructs.h +++ b/ESP32_AP-Flasher/include/commstructs.h @@ -84,7 +84,7 @@ struct APlist { } __packed; struct TagInfo { - uint8_t mac[6]; + uint8_t mac[8]; char alias[32]; uint32_t lastseen; uint32_t nextupdate; diff --git a/ESP32_AP-Flasher/include/tag_db.h b/ESP32_AP-Flasher/include/tag_db.h index 3f0c1cb8..652eb34a 100644 --- a/ESP32_AP-Flasher/include/tag_db.h +++ b/ESP32_AP-Flasher/include/tag_db.h @@ -16,7 +16,7 @@ class tagRecord { tagRecord() : mac{0}, alias(""), lastseen(0), nextupdate(0), contentMode(0), pending(false), md5{0}, md5pending{0}, expectedNextCheckin(0), modeConfigJson(""), LQI(0), RSSI(0), temperature(0), batteryMv(0), hwType(0), wakeupReason(0), capabilities(0), lastfullupdate(0), isExternal(false), pendingIdle(0), filename(""), data(nullptr), len(0) {} - uint8_t mac[6]; + uint8_t mac[8]; String alias; uint32_t lastseen; uint32_t nextupdate; @@ -41,17 +41,19 @@ class tagRecord { uint8_t* data; uint32_t len; - static tagRecord* findByMAC(uint8_t mac[6]); + static tagRecord* findByMAC(uint8_t mac[8]); }; extern std::vector tagDB; extern DynamicJsonDocument APconfig; -String tagDBtoJson(uint8_t mac[6] = nullptr, uint8_t startPos = 0); -bool deleteRecord(uint8_t mac[6]); +String tagDBtoJson(uint8_t mac[8] = nullptr, uint8_t startPos = 0); +bool deleteRecord(uint8_t mac[8]); void fillNode(JsonObject &tag, tagRecord* &taginfo); void saveDB(String filename); void loadDB(String filename); uint8_t getTagCount(); +void mac2hex(uint8_t* mac, char* hexBuffer); +bool hex2mac(const String& hexString, uint8_t* mac); void clearPending(tagRecord* taginfo); void initAPconfig(); void saveAPconfig(); diff --git a/ESP32_AP-Flasher/include/web.h b/ESP32_AP-Flasher/include/web.h index e1e3a3c2..4baded89 100644 --- a/ESP32_AP-Flasher/include/web.h +++ b/ESP32_AP-Flasher/include/web.h @@ -9,12 +9,11 @@ void doImageUpload(AsyncWebServerRequest *request, String filename, size_t index extern void webSocketSendProcess(void *parameter); void wsLog(String text); void wsErr(String text); -void wsSendTaginfo(uint8_t mac[6]); +void wsSendTaginfo(uint8_t *mac); void wsSendSysteminfo(); void wsSendAPitem(struct APlist* apitem); uint8_t wsClientCount(); -extern uint64_t swap64(uint64_t x); extern AsyncWebSocket ws; extern SemaphoreHandle_t wsMutex; diff --git a/ESP32_AP-Flasher/src/contentmanager.cpp b/ESP32_AP-Flasher/src/contentmanager.cpp index 6ab6a076..137ec15e 100644 --- a/ESP32_AP-Flasher/src/contentmanager.cpp +++ b/ESP32_AP-Flasher/src/contentmanager.cpp @@ -48,13 +48,8 @@ void contentRunner() { tagRecord *taginfo = nullptr; taginfo = tagDB.at(c); - uint8_t mac8[8] = {0, 0, 0, 0, 0, 0, 0, 0}; - memcpy(mac8 + 2, taginfo->mac, 6); - uint8_t src[8]; - *((uint64_t *)src) = swap64(*((uint64_t *)mac8)); - if (taginfo->RSSI && (now >= taginfo->nextupdate || taginfo->wakeupReason == WAKEUP_REASON_GPIO || taginfo->wakeupReason == WAKEUP_REASON_NFC)) { - drawNew(src, (taginfo->wakeupReason == WAKEUP_REASON_GPIO), taginfo); + drawNew(taginfo->mac, (taginfo->wakeupReason == WAKEUP_REASON_GPIO), taginfo); taginfo->wakeupReason = 0; } @@ -64,7 +59,7 @@ void contentRunner() { if (minutesUntilNextUpdate > MIN_RESPONSE_TIME) minutesUntilNextUpdate = MIN_RESPONSE_TIME; if (minutesUntilNextUpdate > 1 && wsClientCount() == 0) { taginfo->pendingIdle = minutesUntilNextUpdate; - if (taginfo->isExternal == false) prepareIdleReq(src, minutesUntilNextUpdate); + if (taginfo->isExternal == false) prepareIdleReq(taginfo->mac, minutesUntilNextUpdate); } } @@ -76,13 +71,9 @@ void drawNew(uint8_t mac[8], bool buttonPressed, tagRecord *&taginfo) { time_t now; time(&now); - char buffer[64]; - uint8_t src[8]; - *((uint64_t *)src) = swap64(*((uint64_t *)mac)); - sprintf(buffer, "%02X%02X%02X%02X%02X%02X\0", src[2], src[3], src[4], src[5], src[6], src[7]); - String dst = (String)buffer; - - String filename = "/" + dst + ".raw"; + char hexmac[17]; + mac2hex(mac, hexmac); + String filename = "/" + String(hexmac) + ".raw"; struct tm time_info; getLocalTime(&time_info); @@ -95,8 +86,9 @@ void drawNew(uint8_t mac[8], bool buttonPressed, tagRecord *&taginfo) { DynamicJsonDocument doc(500); deserializeJson(doc, taginfo->modeConfigJson); JsonObject cfgobj = doc.as(); + char buffer[64]; - wsLog("Updating " + dst); + wsLog("Updating " + String(hexmac)); taginfo->nextupdate = now + 60; imgParam imageParams; @@ -194,7 +186,7 @@ void drawNew(uint8_t mac[8], bool buttonPressed, tagRecord *&taginfo) { case ImageUrl: - if (getImgURL(filename, cfgobj["url"], (time_t)cfgobj["#fetched"], imageParams, dst)) { + if (getImgURL(filename, cfgobj["url"], (time_t)cfgobj["#fetched"], imageParams, String(hexmac))) { taginfo->nextupdate = now + 60 * (cfgobj["interval"].as() < 5 ? 5 : cfgobj["interval"].as()); updateTagImage(filename, mac, cfgobj["interval"].as(), taginfo, imageParams); cfgobj["#fetched"] = now; @@ -733,20 +725,22 @@ void drawIdentify(String &filename, tagRecord *&taginfo, imgParam &imageParams) TFT_eSprite spr = TFT_eSprite(&tft); LittleFS.begin(); + char hexmac[17]; + mac2hex(taginfo->mac, hexmac); if (taginfo->hwType == SOLUM_29_SSD1619 || taginfo->hwType == SOLUM_29_UC8151) { initSprite(spr, 296, 128); drawString(spr, taginfo->alias, 10, 10, "fonts/bahnschrift20"); - drawString(spr, mac62hex(taginfo->mac), 10, 50, "fonts/bahnschrift20", TL_DATUM, PAL_RED); + drawString(spr, String(hexmac), 10, 50, "fonts/bahnschrift20", TL_DATUM, PAL_RED); } else if (taginfo->hwType == SOLUM_154_SSD1619) { initSprite(spr, 152, 152); drawString(spr, taginfo->alias, 5, 5, "fonts/bahnschrift20"); - drawString(spr, mac62hex(taginfo->mac), 10, 50, "fonts/bahnschrift20", TL_DATUM, PAL_RED); + drawString(spr, String(hexmac), 10, 50, "fonts/bahnschrift20", TL_DATUM, PAL_RED); } else if (taginfo->hwType == SOLUM_42_SSD1619) { initSprite(spr, 400, 300); drawString(spr, taginfo->alias, 20, 20, "fonts/bahnschrift20"); - drawString(spr, mac62hex(taginfo->mac), 20, 70, "fonts/bahnschrift20", TL_DATUM, PAL_RED); + drawString(spr, String(hexmac), 20, 70, "fonts/bahnschrift20", TL_DATUM, PAL_RED); } spr2buffer(spr, filename, imageParams); @@ -1085,12 +1079,6 @@ String windDirectionIcon(int degrees) { return directions[index]; } -String mac62hex(uint8_t *mac) { - char buffer[16]; - sprintf(buffer, "%02X%02X%02X%02X%02X%02X\0", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); - return (String)buffer; -} - void getLocation(JsonObject &cfgobj) { HTTPClient http; StaticJsonDocument<1000> doc; diff --git a/ESP32_AP-Flasher/src/newproto.cpp b/ESP32_AP-Flasher/src/newproto.cpp index 325ef0ae..43e2986e 100644 --- a/ESP32_AP-Flasher/src/newproto.cpp +++ b/ESP32_AP-Flasher/src/newproto.cpp @@ -52,19 +52,15 @@ void prepareCancelPending(uint8_t dst[8]) { memcpy(pending.targetMac, dst, 8); sendCancelPending(&pending); - uint8_t src[8]; - *((uint64_t*)src) = swap64(*((uint64_t*)dst)); - uint8_t mac[6]; - memcpy(mac, src + 2, sizeof(mac)); tagRecord* taginfo = nullptr; - taginfo = tagRecord::findByMAC(mac); + taginfo = tagRecord::findByMAC(dst); if (taginfo == nullptr) { wsErr("Tag not found, this shouldn't happen."); return; } clearPending(taginfo); - wsSendTaginfo(mac); + wsSendTaginfo(dst); } void prepareIdleReq(uint8_t* dst, uint16_t nextCheckin) { @@ -77,22 +73,15 @@ void prepareIdleReq(uint8_t* dst, uint16_t nextCheckin) { pending.attemptsLeft = 10 + MIN_RESPONSE_TIME; char buffer[64]; - uint8_t src[8]; - *((uint64_t*)src) = swap64(*((uint64_t*)dst)); - sprintf(buffer, ">SDA %02X%02X%02X%02X%02X%02X NOP\n\0", src[2], src[3], src[4], src[5], src[6], src[7]); + sprintf(buffer, ">SDA %02X%02X%02X%02X%02X%02X%02X%02X NOP\n", dst[7], dst[6], dst[5], dst[4], dst[3], dst[2], dst[1], dst[0]); Serial.print(buffer); sendDataAvail(&pending); } } void prepareNFCReq(uint8_t* dst, const char* url) { - uint8_t src[8]; - *((uint64_t*)src) = swap64(*((uint64_t*)dst)); - uint8_t mac[6]; - memcpy(mac, src + 2, sizeof(mac)); - tagRecord* taginfo = nullptr; - taginfo = tagRecord::findByMAC(mac); + taginfo = tagRecord::findByMAC(dst); if (taginfo == nullptr) { wsErr("Tag not found, this shouldn't happen."); return; @@ -130,19 +119,15 @@ void prepareNFCReq(uint8_t* dst, const char* url) { pending.attemptsLeft = 10; sendDataAvail(&pending); - wsSendTaginfo(mac); + wsSendTaginfo(dst); } bool prepareDataAvail(String* filename, uint8_t dataType, uint8_t* dst, uint16_t nextCheckin) { if (nextCheckin > MIN_RESPONSE_TIME) nextCheckin = MIN_RESPONSE_TIME; if (wsClientCount()) nextCheckin=0; - uint8_t src[8]; - *((uint64_t*)src) = swap64(*((uint64_t*)dst)); - uint8_t mac[6]; - memcpy(mac, src + 2, sizeof(mac)); tagRecord* taginfo = nullptr; - taginfo = tagRecord::findByMAC(mac); + taginfo = tagRecord::findByMAC(dst); if (taginfo == nullptr) { wsErr("Tag not found, this shouldn't happen."); return true; @@ -179,7 +164,7 @@ bool prepareDataAvail(String* filename, uint8_t dataType, uint8_t* dst, uint16_t if (memcmp(md5bytes, taginfo->md5pending, 16) == 0) { wsLog("new image is the same as current or already pending image. not updating tag."); - wsSendTaginfo(mac); + wsSendTaginfo(dst); if (LittleFS.exists(*filename)) { LittleFS.remove(*filename); } @@ -196,7 +181,7 @@ bool prepareDataAvail(String* filename, uint8_t dataType, uint8_t* dst, uint16_t if (dataType != DATATYPE_FW_UPDATE) { char dst_path[64]; - sprintf(dst_path, "/current/%02X%02X%02X%02X%02X%02X.pending\0", dst[5], dst[4], dst[3], dst[2], dst[1], dst[0]); + sprintf(dst_path, "/current/%02X%02X%02X%02X%02X%02X%02X%02X.pending\0", dst[7], dst[6], dst[5], dst[4], dst[3], dst[2], dst[1], dst[0]); if (LittleFS.exists(dst_path)) { LittleFS.remove(dst_path); } @@ -230,27 +215,21 @@ bool prepareDataAvail(String* filename, uint8_t dataType, uint8_t* dst, uint16_t pending.attemptsLeft = attempts; if (taginfo->isExternal == false) { char buffer[64]; - uint8_t src[8]; - *((uint64_t*)src) = swap64(*((uint64_t*)dst)); - sprintf(buffer, ">SDA %02X%02X%02X%02X%02X%02X TYPE 0x%02X\n\0", src[2], src[3], src[4], src[5], src[6], src[7], pending.availdatainfo.dataType); + sprintf(buffer, ">SDA %02X%02X%02X%02X%02X%02X%02X%02X TYPE 0x%02X\n\0", dst[7], dst[6], dst[5], dst[4], dst[3], dst[2], dst[1], dst[0], pending.availdatainfo.dataType); Serial.print(buffer); sendDataAvail(&pending); } else { udpsync.netSendDataAvail(&pending); } - wsSendTaginfo(mac); + wsSendTaginfo(dst); return true; } void prepareExternalDataAvail(struct pendingData* pending, IPAddress remoteIP) { - uint8_t src[8]; - *((uint64_t*)src) = swap64(*((uint64_t*)pending->targetMac)); - uint8_t mac[6]; - memcpy(mac, src + 2, sizeof(mac)); tagRecord* taginfo = nullptr; - taginfo = tagRecord::findByMAC(mac); + taginfo = tagRecord::findByMAC(pending->targetMac); if (taginfo == nullptr) { return; } @@ -258,9 +237,9 @@ void prepareExternalDataAvail(struct pendingData* pending, IPAddress remoteIP) { if (pending->availdatainfo.dataType != DATATYPE_UK_SEGMENTED) { LittleFS.begin(); - char buffer[64]; - sprintf(buffer, "%02X%02X%02X%02X%02X%02X\0", src[2], src[3], src[4], src[5], src[6], src[7]); - String filename = "/current/" + (String)buffer + ".pending"; + char hexmac[17]; + mac2hex(pending->targetMac, hexmac); + String filename = "/current/" + String(hexmac) + ".pending"; String imageUrl = "http://" + remoteIP.toString() + filename; wsLog("GET " + imageUrl); HTTPClient http; @@ -277,7 +256,7 @@ void prepareExternalDataAvail(struct pendingData* pending, IPAddress remoteIP) { uint32_t filesize = file.size(); if (filesize == 0) { file.close(); - wsErr("File has size 0. " + filename); + wsErr("Remote file not found. " + filename); return; } @@ -301,7 +280,7 @@ void prepareExternalDataAvail(struct pendingData* pending, IPAddress remoteIP) { taginfo->nextupdate = 3216153600; sendDataAvail(pending); - wsSendTaginfo(mac); + wsSendTaginfo(pending->targetMac); } } @@ -311,15 +290,11 @@ void processBlockRequest(struct espBlockRequest* br) { return; } - uint8_t src[8]; - *((uint64_t*)src) = swap64(*((uint64_t*)br->src)); - uint8_t mac[6]; - memcpy(mac, src + 2, sizeof(mac)); tagRecord* taginfo = nullptr; - taginfo = tagRecord::findByMAC(mac); + taginfo = tagRecord::findByMAC(br->src); if (taginfo == nullptr) { prepareCancelPending(br->src); - Serial.printf("blockrequest: couldn't find taginfo %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X\n", br->src[7], br->src[6], br->src[5], br->src[4], br->src[3], br->src[2], br->src[1], br->src[0]); + Serial.printf("blockrequest: couldn't find taginfo %02X%02X%02X%02X%02X%02X%02X%02X\n", br->src[7], br->src[6], br->src[5], br->src[4], br->src[3], br->src[2], br->src[1], br->src[0]); return; } @@ -353,23 +328,19 @@ void processBlockRequest(struct espBlockRequest* br) { void processXferComplete(struct espXferComplete* xfc, bool local) { char buffer[64]; - uint8_t src[8]; - *((uint64_t*)src) = swap64(*((uint64_t*)xfc->src)); - sprintf(buffer, "< %02X%02X%02X%02X%02X%02X reports xfer complete\n\0", src[2], src[3], src[4], src[5], src[6], src[7]); + sprintf(buffer, "< %02X%02X%02X%02X%02X%02X%02X%02X reports xfer complete\n\0", xfc->src[7], xfc->src[6], xfc->src[5], xfc->src[4], xfc->src[3], xfc->src[2], xfc->src[1], xfc->src[0]); wsLog((String)buffer); if (local) { - Serial.printf("src[7], xfc->src[6], xfc->src[5], xfc->src[4], xfc->src[3], xfc->src[2], xfc->src[1], xfc->src[0]); } else { - Serial.printf("src[7], xfc->src[6], xfc->src[5], xfc->src[4], xfc->src[3], xfc->src[2], xfc->src[1], xfc->src[0]); } - uint8_t mac[6]; - memcpy(mac, src + 2, sizeof(mac)); char src_path[64]; char dst_path[64]; - sprintf(src_path, "/current/%02X%02X%02X%02X%02X%02X.pending\0", src[2], src[3], src[4], src[5], src[6], src[7]); - sprintf(dst_path, "/current/%02X%02X%02X%02X%02X%02X.raw\0", src[2], src[3], src[4], src[5], src[6], src[7]); + sprintf(src_path, "/current/%02X%02X%02X%02X%02X%02X%02X%02X.pending\0", xfc->src[7], xfc->src[6], xfc->src[5], xfc->src[4], xfc->src[3], xfc->src[2], xfc->src[1], xfc->src[0]); + sprintf(dst_path, "/current/%02X%02X%02X%02X%02X%02X%02X%02X.raw\0", xfc->src[7], xfc->src[6], xfc->src[5], xfc->src[4], xfc->src[3], xfc->src[2], xfc->src[1], xfc->src[0]); if (LittleFS.exists(dst_path) && LittleFS.exists(src_path)) { LittleFS.remove(dst_path); } @@ -380,57 +351,48 @@ void processXferComplete(struct espXferComplete* xfc, bool local) { time_t now; time(&now); tagRecord* taginfo = nullptr; - taginfo = tagRecord::findByMAC(mac); + taginfo = tagRecord::findByMAC(xfc->src); if (taginfo != nullptr) { memcpy(taginfo->md5, taginfo->md5pending, sizeof(taginfo->md5pending)); clearPending(taginfo); taginfo->wakeupReason = 0; } - wsSendTaginfo(mac); + wsSendTaginfo(xfc->src); if (local) udpsync.netProcessXferComplete(xfc); } void processXferTimeout(struct espXferComplete* xfc, bool local) { char buffer[64]; - uint8_t src[8]; - *((uint64_t*)src) = swap64(*((uint64_t*)xfc->src)); - sprintf(buffer, "< %02X%02X%02X%02X%02X%02X xfer timeout\n\0", src[2], src[3], src[4], src[5], src[6], src[7]); + sprintf(buffer, "< %02X%02X%02X%02X%02X%02X%02X%02X xfer timeout\n\0", xfc->src[7], xfc->src[6], xfc->src[5], xfc->src[4], xfc->src[3], xfc->src[2], xfc->src[1], xfc->src[0]); wsErr((String)buffer); if (local) { - Serial.printf("src[7], xfc->src[6], xfc->src[5], xfc->src[4], xfc->src[3], xfc->src[2], xfc->src[1], xfc->src[0]); } else { - Serial.printf("src[7], xfc->src[6], xfc->src[5], xfc->src[4], xfc->src[3], xfc->src[2], xfc->src[1], xfc->src[0]); } - uint8_t mac[6]; - memcpy(mac, src + 2, sizeof(mac)); time_t now; time(&now); tagRecord* taginfo = nullptr; - taginfo = tagRecord::findByMAC(mac); + taginfo = tagRecord::findByMAC(xfc->src); if (taginfo != nullptr) { taginfo->expectedNextCheckin = now + 60; memset(taginfo->md5pending, 0, 16 * sizeof(uint8_t)); clearPending(taginfo); } - wsSendTaginfo(mac); + wsSendTaginfo(xfc->src); if (local) udpsync.netProcessXferTimeout(xfc); } void processDataReq(struct espAvailDataReq* eadr, bool local) { char buffer[64]; - uint8_t src[8]; - *((uint64_t*)src) = swap64(*((uint64_t*)eadr->src)); tagRecord* taginfo = nullptr; - uint8_t mac[6]; - memcpy(mac, src + 2, sizeof(mac)); - - taginfo = tagRecord::findByMAC(mac); + taginfo = tagRecord::findByMAC(eadr->src); if (taginfo == nullptr) { taginfo = new tagRecord; - memcpy(taginfo->mac, src + 2, sizeof(taginfo->mac)); + memcpy(taginfo->mac, eadr->src, sizeof(taginfo->mac)); taginfo->pending = false; tagDB.push_back(taginfo); } @@ -467,13 +429,13 @@ void processDataReq(struct espAvailDataReq* eadr, bool local) { } } if (local) { - sprintf(buffer, "src[7], eadr->src[6], eadr->src[5], eadr->src[4], eadr->src[3], eadr->src[2], eadr->src[1], eadr->src[0]); } else { - sprintf(buffer, "src[7], eadr->src[6], eadr->src[5], eadr->src[4], eadr->src[3], eadr->src[2], eadr->src[1], eadr->src[0]); } Serial.print(buffer); - wsSendTaginfo(mac); + wsSendTaginfo(eadr->src); if (local) udpsync.netProcessDataReq(eadr); } @@ -514,9 +476,7 @@ bool sendAPSegmentedData(uint8_t* dst, String data, uint16_t icons, bool inverte pending.availdatainfo.nextCheckIn = 0; pending.attemptsLeft = 120; char buffer[64]; - uint8_t srcc[8]; - *((uint64_t*)srcc) = swap64(*((uint64_t*)dst)); - sprintf(buffer, ">AP Segmented Data %02X%02X%02X%02X%02X%02X%02X%02X\n\0", srcc[0], srcc[1], srcc[2], srcc[3], srcc[4], srcc[5], srcc[6], srcc[7]); + sprintf(buffer, ">AP Segmented Data %02X%02X%02X%02X%02X%02X%02X%02X\n\0", dst[7], dst[6], dst[5], dst[4], dst[3], dst[2], dst[1], dst[0]); Serial.print(buffer); if (local) { return sendDataAvail(&pending); @@ -536,9 +496,7 @@ bool showAPSegmentedInfo(uint8_t* dst, bool local) { pending.availdatainfo.nextCheckIn = 0; pending.attemptsLeft = 120; char buffer[64]; - uint8_t srcc[8]; - *((uint64_t*)srcc) = swap64(*((uint64_t*)dst)); - sprintf(buffer, ">SDA %02X%02X%02X%02X%02X%02X%02X%02X\n\0", srcc[0], srcc[1], srcc[2], srcc[3], srcc[4], srcc[5], srcc[6], srcc[7]); + sprintf(buffer, ">SDA %02X%02X%02X%02X%02X%02X%02X%02X\n\0", dst[7], dst[6], dst[5], dst[4], dst[3], dst[2], dst[1], dst[0]); Serial.print(buffer); if (local) { return sendDataAvail(&pending); diff --git a/ESP32_AP-Flasher/src/tag_db.cpp b/ESP32_AP-Flasher/src/tag_db.cpp index da97901a..f7295a6f 100644 --- a/ESP32_AP-Flasher/src/tag_db.cpp +++ b/ESP32_AP-Flasher/src/tag_db.cpp @@ -11,22 +11,22 @@ std::vector tagDB; DynamicJsonDocument APconfig(150); -tagRecord* tagRecord::findByMAC(uint8_t mac[6]) { +tagRecord* tagRecord::findByMAC(uint8_t mac[8]) { for (int16_t c = 0; c < tagDB.size(); c++) { tagRecord* tag = nullptr; tag = tagDB.at(c); - if (memcmp(tag->mac, mac, 6) == 0) { + if (memcmp(tag->mac, mac, 8) == 0) { return tag; } } return nullptr; } -bool deleteRecord(uint8_t mac[6]) { +bool deleteRecord(uint8_t mac[8]) { for (int16_t c = 0; c < tagDB.size(); c++) { tagRecord* tag = nullptr; tag = tagDB.at(c); - if (memcmp(tag->mac, mac, 6) == 0) { + if (memcmp(tag->mac, mac, 8) == 0) { if (tag->data != nullptr) { free(tag->data); } @@ -39,7 +39,28 @@ bool deleteRecord(uint8_t mac[6]) { return false; } -String tagDBtoJson(uint8_t mac[6], uint8_t startPos) { +void mac2hex(uint8_t* mac, char* hexBuffer) { + sprintf(hexBuffer, "%02X%02X%02X%02X%02X%02X%02X%02X", + mac[7], mac[6], mac[5], mac[4], mac[3], mac[2], mac[1], mac[0]); +} + +bool hex2mac(const String& hexString, uint8_t* mac) { + size_t hexLength = hexString.length(); + if (hexLength != 12 && hexLength != 16) { + return false; + } + if (hexLength / 2 == 6) { + mac[6] = 0; + mac[7] = 0; + return (sscanf(hexString.c_str(), "%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX", + &mac[5], &mac[4], &mac[3], &mac[2], &mac[1], &mac[0]) == 6); + } else { + return (sscanf(hexString.c_str(), "%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX", + &mac[7], &mac[6], &mac[5], &mac[4], &mac[3], &mac[2], &mac[1], &mac[0]) == 8); + } +} + +String tagDBtoJson(uint8_t mac[8], uint8_t startPos) { DynamicJsonDocument doc(2500); JsonArray tags = doc.createNestedArray("tags"); @@ -49,7 +70,7 @@ String tagDBtoJson(uint8_t mac[6], uint8_t startPos) { bool select = false; if (mac) { - if (memcmp(taginfo->mac, mac, 6) == 0) { + if (memcmp(taginfo->mac, mac, 8) == 0) { select = true; } } else { @@ -71,10 +92,9 @@ String tagDBtoJson(uint8_t mac[6], uint8_t startPos) { } void fillNode(JsonObject &tag, tagRecord* &taginfo) { - char buffer[16]; - sprintf(buffer, "%02X%02X%02X%02X%02X%02X\0", taginfo->mac[0], taginfo->mac[1], taginfo->mac[2], taginfo->mac[3], taginfo->mac[4], taginfo->mac[5]); - tag["mac"] = (String)buffer; - + char hexmac[17]; + mac2hex(taginfo->mac, hexmac); + tag["mac"] = String(hexmac); char hex[33]; for (uint8_t i = 0; i < 16; i++) { sprintf(hex + (i * 2), "%02x", taginfo->md5[i]); @@ -154,8 +174,8 @@ void loadDB(String filename) { if (!err) { JsonObject tag = doc[0]; String dst = tag["mac"].as(); - uint8_t mac[12]; - if (sscanf(dst.c_str(), "%02X%02X%02X%02X%02X%02X", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]) == 6) { + uint8_t mac[8]; + if (hex2mac(dst, mac)) { tagRecord* taginfo = nullptr; taginfo = tagRecord::findByMAC(mac); if (taginfo == nullptr) { diff --git a/ESP32_AP-Flasher/src/web.cpp b/ESP32_AP-Flasher/src/web.cpp index ca3a8bb2..33654100 100644 --- a/ESP32_AP-Flasher/src/web.cpp +++ b/ESP32_AP-Flasher/src/web.cpp @@ -29,20 +29,6 @@ AsyncWebSocket ws("/ws"); SemaphoreHandle_t wsMutex; TaskHandle_t websocketUpdater; -uint64_t swap64(uint64_t x) { - uint64_t byte1 = x & 0xff00000000000000; - uint64_t byte2 = x & 0x00ff000000000000; - uint64_t byte3 = x & 0x0000ff0000000000; - uint64_t byte4 = x & 0x000000ff00000000; - uint64_t byte5 = x & 0x00000000ff000000; - uint64_t byte6 = x & 0x0000000000ff0000; - uint64_t byte7 = x & 0x000000000000ff00; - uint64_t byte8 = x & 0x00000000000000ff; - - return (uint64_t)(byte1 >> 56 | byte2 >> 40 | byte3 >> 24 | byte4 >> 8 | - byte5 << 8 | byte6 << 24 | byte7 << 40 | byte8 << 56); -} - void webSocketSendProcess(void *parameter) { websocketUpdater = xTaskGetCurrentTaskHandle(); wsMutex = xSemaphoreCreateMutex(); @@ -161,7 +147,7 @@ void wsSendSysteminfo() { xSemaphoreGive(wsMutex); } -void wsSendTaginfo(uint8_t mac[6]) { +void wsSendTaginfo(uint8_t *mac) { String json = ""; json = tagDBtoJson(mac); @@ -242,8 +228,8 @@ void init_web() { String json = ""; if (request->hasParam("mac")) { String dst = request->getParam("mac")->value(); - uint8_t mac[6]; - if (sscanf(dst.c_str(), "%02X%02X%02X%02X%02X%02X", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]) == 6) { + uint8_t mac[8]; + if (hex2mac(dst,mac)) { json = tagDBtoJson(mac); } } else { @@ -259,8 +245,8 @@ void init_web() { server.on("/save_cfg", HTTP_POST, [](AsyncWebServerRequest *request) { if (request->hasParam("mac", true)) { String dst = request->getParam("mac", true)->value(); - uint8_t mac[6]; - if (sscanf(dst.c_str(), "%02X%02X%02X%02X%02X%02X", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]) == 6) { + uint8_t mac[8]; + if (hex2mac(dst, mac)) { tagRecord *taginfo = nullptr; taginfo = tagRecord::findByMAC(mac); if (taginfo != nullptr) { @@ -284,8 +270,8 @@ void init_web() { server.on("/delete_cfg", HTTP_POST, [](AsyncWebServerRequest *request) { if (request->hasParam("mac", true)) { String dst = request->getParam("mac", true)->value(); - uint8_t mac[6]; - if (sscanf(dst.c_str(), "%02X%02X%02X%02X%02X%02X", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]) == 6) { + uint8_t mac[8]; + if (hex2mac(dst, mac)) { if (deleteRecord(mac)) { request->send(200, "text/plain", "Ok, deleted"); } else { @@ -367,8 +353,8 @@ void doImageUpload(AsyncWebServerRequest *request, String filename, size_t index if (request->hasParam("dither", true)) { if (request->getParam("dither", true)->value() == "0") dither = false; } - uint8_t mac[6]; - if (sscanf(dst.c_str(), "%02X%02X%02X%02X%02X%02X", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]) == 6) { + uint8_t mac[8]; + if (hex2mac(dst, mac)) { tagRecord *taginfo = nullptr; taginfo = tagRecord::findByMAC(mac); if (taginfo != nullptr) {