8 byte mac addr instead of 6 byte

This commit is contained in:
Nic Limper
2023-05-23 21:06:50 +02:00
parent f1df44fbb1
commit 0641547d73
10 changed files with 104 additions and 148 deletions

View File

@@ -255,6 +255,9 @@ select {
.alias {
font-size: 1.4em;
font-weight: bold;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.received {

View File

@@ -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);

View File

@@ -8,7 +8,7 @@
<body>
<form method="post" enctype="multipart/form-data" action="/imgupload">
<label for="mac">Enter a 6 byte MAC address:</label><br>
<label for="mac">Enter a 6 or 8 byte MAC address:</label><br>
<input type="text" id="mac" name="mac"><br>
<label for="dither">Floyd Steinberg dithering (0=off, 1=on)</label><br>
<input type="text" id="dither" name="dither"><br>

View File

@@ -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;

View File

@@ -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<tagRecord*> 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();

View File

@@ -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;

View File

@@ -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<JsonObject>();
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<int>() < 5 ? 5 : cfgobj["interval"].as<int>());
updateTagImage(filename, mac, cfgobj["interval"].as<int>(), 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;

View File

@@ -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("<XFC %02X%02X%02X%02X%02X%02\n", src[2], src[3], src[4], src[5], src[6], src[7]);
Serial.printf("<XFC %02X%02X%02X%02X%02X%02X%02X%02X\n", xfc->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("<REMOTE XFC %02X%02X%02X%02X%02X%02\n", src[2], src[3], src[4], src[5], src[6], src[7]);
Serial.printf("<REMOTE XFC %02X%02X%02X%02X%02X%02X%02X%02X\n", xfc->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("<XTO %02X%02X%02X%02X%02X%02\n", src[2], src[3], src[4], src[5], src[6], src[7]);
Serial.printf("<XTO %02X%02X%02X%02X%02X%02X%02X%02X\n", xfc->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("<REMOTE XTO %02X%02X%02X%02X%02X%02\n", src[2], src[3], src[4], src[5], src[6], src[7]);
Serial.printf("<REMOTE XTO %02X%02X%02X%02X%02X%02X%02X%02X\n", xfc->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, "<ADR %02X%02X%02X%02X%02X%02X\n\0", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
sprintf(buffer, "<ADR %02X%02X%02X%02X%02X%02X%02X%02X\n\0", eadr->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, "<REMOTE ADR %02X%02X%02X%02X%02X%02X\n\0", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
sprintf(buffer, "<REMOTE ADR %02X%02X%02X%02X%02X%02X%02X%02X\n\0", eadr->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);

View File

@@ -11,22 +11,22 @@
std::vector<tagRecord*> 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<String>();
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) {

View File

@@ -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) {