mirror of
https://github.com/OpenEPaperLink/OpenEPaperLink.git
synced 2026-03-21 07:06:36 +01:00
8 byte mac addr instead of 6 byte
This commit is contained in:
@@ -255,6 +255,9 @@ select {
|
||||
.alias {
|
||||
font-size: 1.4em;
|
||||
font-weight: bold;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.received {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user