5 Commits
v1.0 ... v1.11

Author SHA1 Message Date
4f58a04eae Version 1.11
Minor code optimization.
2022-12-12 18:58:03 +03:00
2ed860b78b Version 1.1
Added stop() function.
2022-12-11 09:39:20 +03:00
425e5035c9 Version 1.02
Minor code optimization.
2022-12-11 09:13:25 +03:00
7a1b67102e Minor changes 2022-12-10 15:18:15 +03:00
67dcf3f407 Version 1.01
Optimizing using RAM on PRINT_LOG mode.
2022-12-10 15:11:11 +03:00
4 changed files with 145 additions and 133 deletions

View File

@ -116,6 +116,12 @@ myNet.setApSetting("SSID", "PASSWORD");
myNet.begin(); myNet.begin();
``` ```
### ESP-NOW Mesh network deinitialization
```cpp
myNet.stop();
```
### Sends broadcast message to all nodes ### Sends broadcast message to all nodes
```cpp ```cpp

View File

@ -1,5 +1,5 @@
name=ZHNetwork name=ZHNetwork
version=1.0 version=1.11
author=Alexey Zholtikov author=Alexey Zholtikov
maintainer=Alexey Zholtikov maintainer=Alexey Zholtikov
sentence=ESP-NOW based Mesh network for ESP8266/ESP32 sentence=ESP-NOW based Mesh network for ESP8266/ESP32

View File

@ -1,31 +1,17 @@
#include "ZHNetwork.h" #include "ZHNetwork.h"
routing_vector_t routingVector; routing_vector_t ZHNetwork::routingVector;
incoming_queue_t queueForIncomingData; incoming_queue_t ZHNetwork::queueForIncomingData;
outgoing_queue_t queueForOutgoingData; outgoing_queue_t ZHNetwork::queueForOutgoingData;
waiting_queue_t queueForRoutingVectorWaiting; waiting_queue_t ZHNetwork::queueForRoutingVectorWaiting;
const String firmware{"1.0"}; bool ZHNetwork::criticalProcessSemaphore{false};
const uint8_t broadcastMAC[6]{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; bool ZHNetwork::sentMessageSemaphore{false};
bool ZHNetwork::confirmReceivingSemaphore{false};
bool criticalProcessSemaphore{false}; bool ZHNetwork::confirmReceiving{false};
bool sentMessageSemaphore{false}; char ZHNetwork::netName_[20]{0};
bool confirmReceivingSemaphore{false}; uint8_t ZHNetwork::localMAC[6]{0};
bool confirmReceiving{false}; uint16_t ZHNetwork::lastMessageID[10]{0};
uint8_t localMAC[6]{0};
uint8_t numberOfAttemptsToSend{1};
uint16_t lastMessageID[10]{0};
uint64_t lastMessageSentTime{0};
work_mode_t workMode_{ESP_NOW};
char netName_[20]{0};
char apSsid_[32]{"ESP-NOW NODE"};
char apPassword_[64]{0};
char staSsid_[32]{0};
char staPassword_[64]{0};
uint8_t maxNumberOfAttempts_{3};
uint8_t maxWaitingTimeBetweenTransmissions_{50};
uint16_t maxTimeForRoutingInfoWaiting_{500};
ZHNetwork &ZHNetwork::setOnBroadcastReceivingCallback(on_message_t onBroadcastReceivingCallback) ZHNetwork &ZHNetwork::setOnBroadcastReceivingCallback(on_message_t onBroadcastReceivingCallback)
{ {
@ -62,23 +48,20 @@ error_code_t ZHNetwork::setNetName(const char *netName)
{ {
if (strlen(netName) < 1 || strlen(netName) > 20) if (strlen(netName) < 1 || strlen(netName) > 20)
return ERROR; return ERROR;
memset(&netName_, 0, strlen(netName));
strcpy(netName_, netName); strcpy(netName_, netName);
return SUCCESS; return SUCCESS;
} }
String ZHNetwork::getNetName() String ZHNetwork::getNetName()
{ {
return String(netName_); return netName_;
} }
error_code_t ZHNetwork::setStaSetting(const char *ssid, const char *password) error_code_t ZHNetwork::setStaSetting(const char *ssid, const char *password)
{ {
if (strlen(ssid) < 1 || strlen(ssid) > 32 || strlen(password) > 64) if (strlen(ssid) < 1 || strlen(ssid) > 32 || strlen(password) > 64)
return ERROR; return ERROR;
memset(&staSsid_, 0, strlen(ssid));
strcpy(staSsid_, ssid); strcpy(staSsid_, ssid);
memset(&staPassword_, 0, strlen(password));
strcpy(staPassword_, password); strcpy(staPassword_, password);
return SUCCESS; return SUCCESS;
} }
@ -87,9 +70,7 @@ error_code_t ZHNetwork::setApSetting(const char *ssid, const char *password)
{ {
if (strlen(ssid) < 1 || strlen(ssid) > 32 || strlen(password) < 8 || strlen(password) > 64) if (strlen(ssid) < 1 || strlen(ssid) > 32 || strlen(password) < 8 || strlen(password) > 64)
return ERROR; return ERROR;
memset(&apSsid_, 0, strlen(ssid));
strcpy(apSsid_, ssid); strcpy(apSsid_, ssid);
memset(&apPassword_, 0, strlen(password));
strcpy(apPassword_, password); strcpy(apPassword_, password);
return SUCCESS; return SUCCESS;
} }
@ -135,6 +116,15 @@ error_code_t ZHNetwork::begin()
return SUCCESS; return SUCCESS;
} }
error_code_t stop()
{
WiFi.mode(WIFI_OFF);
esp_now_deinit();
esp_now_unregister_recv_cb();
esp_now_unregister_send_cb();
return SUCCESS;
}
void ZHNetwork::sendBroadcastMessage(const char *data) void ZHNetwork::sendBroadcastMessage(const char *data)
{ {
broadcastMessage(data, broadcastMAC, BROADCAST); broadcastMessage(data, broadcastMAC, BROADCAST);
@ -154,7 +144,7 @@ void ZHNetwork::maintenance()
if (confirmReceiving) if (confirmReceiving)
{ {
#ifdef PRINT_LOG #ifdef PRINT_LOG
Serial.println("OK."); Serial.println(F("OK."));
#endif #endif
outgoing_data_t outgoingData = queueForOutgoingData.front(); outgoing_data_t outgoingData = queueForOutgoingData.front();
queueForOutgoingData.pop(); queueForOutgoingData.pop();
@ -167,7 +157,7 @@ void ZHNetwork::maintenance()
else else
{ {
#ifdef PRINT_LOG #ifdef PRINT_LOG
Serial.println("FAULT."); Serial.println(F("FAULT."));
#endif #endif
if (numberOfAttemptsToSend < maxNumberOfAttempts_) if (numberOfAttemptsToSend < maxNumberOfAttempts_)
++numberOfAttemptsToSend; ++numberOfAttemptsToSend;
@ -186,14 +176,13 @@ void ZHNetwork::maintenance()
{ {
routingVector.erase(routingVector.begin() + i); routingVector.erase(routingVector.begin() + i);
#ifdef PRINT_LOG #ifdef PRINT_LOG
Serial.print("CHECKING ROUTING TABLE... Routing to MAC "); Serial.print(F("CHECKING ROUTING TABLE... Routing to MAC "));
Serial.print(macToString(outgoingData.transmittedData.originalTargetMAC)); Serial.print(macToString(outgoingData.transmittedData.originalTargetMAC));
Serial.println(" deleted."); Serial.println(F(" deleted."));
#endif #endif
} }
} }
waiting_data_t waitingData; waiting_data_t waitingData;
esp_memset(&waitingData, 0, sizeof(waiting_data_t));
waitingData.time = millis(); waitingData.time = millis();
memcpy(&waitingData.intermediateTargetMAC, &outgoingData.intermediateTargetMAC, 6); memcpy(&waitingData.intermediateTargetMAC, &outgoingData.intermediateTargetMAC, 6);
memcpy(&waitingData.transmittedData, &outgoingData.transmittedData, sizeof(transmitted_data_t)); memcpy(&waitingData.transmittedData, &outgoingData.transmittedData, sizeof(transmitted_data_t));
@ -220,33 +209,33 @@ void ZHNetwork::maintenance()
switch (outgoingData.transmittedData.messageType) switch (outgoingData.transmittedData.messageType)
{ {
case BROADCAST: case BROADCAST:
Serial.print("BROADCAST"); Serial.print(F("BROADCAST"));
break; break;
case UNICAST: case UNICAST:
Serial.print("UNICAST"); Serial.print(F("UNICAST"));
break; break;
case UNICAST_WITH_CONFIRM: case UNICAST_WITH_CONFIRM:
Serial.print("UNICAST_WITH_CONFIRM"); Serial.print(F("UNICAST_WITH_CONFIRM"));
break; break;
case DELIVERY_CONFIRM_RESPONSE: case DELIVERY_CONFIRM_RESPONSE:
Serial.print("DELIVERY_CONFIRM_RESPONSE"); Serial.print(F("DELIVERY_CONFIRM_RESPONSE"));
break; break;
case SEARCH_REQUEST: case SEARCH_REQUEST:
Serial.print("SEARCH_REQUEST"); Serial.print(F("SEARCH_REQUEST"));
break; break;
case SEARCH_RESPONSE: case SEARCH_RESPONSE:
Serial.print("SEARCH_RESPONSE"); Serial.print(F("SEARCH_RESPONSE"));
break; break;
default: default:
break; break;
} }
Serial.print(" message from MAC "); Serial.print(F(" message from MAC "));
Serial.print(macToString(outgoingData.transmittedData.originalSenderMAC)); Serial.print(macToString(outgoingData.transmittedData.originalSenderMAC));
Serial.print(" to MAC "); Serial.print(F(" to MAC "));
Serial.print(macToString(outgoingData.transmittedData.originalTargetMAC)); Serial.print(macToString(outgoingData.transmittedData.originalTargetMAC));
Serial.print(" via MAC "); Serial.print(F(" via MAC "));
Serial.print(macToString(outgoingData.intermediateTargetMAC)); Serial.print(macToString(outgoingData.intermediateTargetMAC));
Serial.print(" sended. Status "); Serial.print(F(" sended. Status "));
#endif #endif
} }
if (!queueForIncomingData.empty()) if (!queueForIncomingData.empty())
@ -261,9 +250,9 @@ void ZHNetwork::maintenance()
{ {
case BROADCAST: case BROADCAST:
#ifdef PRINT_LOG #ifdef PRINT_LOG
Serial.print("BROADCAST message from MAC "); Serial.print(F("BROADCAST message from MAC "));
Serial.print(macToString(incomingData.transmittedData.originalSenderMAC)); Serial.print(macToString(incomingData.transmittedData.originalSenderMAC));
Serial.println(" received."); Serial.println(F(" received."));
#endif #endif
if (onBroadcastReceivingCallback) if (onBroadcastReceivingCallback)
onBroadcastReceivingCallback(incomingData.transmittedData.message, incomingData.transmittedData.originalSenderMAC); onBroadcastReceivingCallback(incomingData.transmittedData.message, incomingData.transmittedData.originalSenderMAC);
@ -271,13 +260,13 @@ void ZHNetwork::maintenance()
break; break;
case UNICAST: case UNICAST:
#ifdef PRINT_LOG #ifdef PRINT_LOG
Serial.print("UNICAST message from MAC "); Serial.print(F("UNICAST message from MAC "));
Serial.print(macToString(incomingData.transmittedData.originalSenderMAC)); Serial.print(macToString(incomingData.transmittedData.originalSenderMAC));
Serial.print(" to MAC "); Serial.print(F(" to MAC "));
Serial.print(macToString(incomingData.transmittedData.originalTargetMAC)); Serial.print(macToString(incomingData.transmittedData.originalTargetMAC));
Serial.print(" via MAC "); Serial.print(F(" via MAC "));
Serial.print(macToString(incomingData.intermediateSenderMAC)); Serial.print(macToString(incomingData.intermediateSenderMAC));
Serial.println(" received."); Serial.println(F(" received."));
#endif #endif
if (macToString(incomingData.transmittedData.originalTargetMAC) == macToString(localMAC)) if (macToString(incomingData.transmittedData.originalTargetMAC) == macToString(localMAC))
{ {
@ -289,13 +278,13 @@ void ZHNetwork::maintenance()
break; break;
case UNICAST_WITH_CONFIRM: case UNICAST_WITH_CONFIRM:
#ifdef PRINT_LOG #ifdef PRINT_LOG
Serial.print("UNICAST_WITH_CONFIRM message from MAC "); Serial.print(F("UNICAST_WITH_CONFIRM message from MAC "));
Serial.print(macToString(incomingData.transmittedData.originalSenderMAC)); Serial.print(macToString(incomingData.transmittedData.originalSenderMAC));
Serial.print(" to MAC "); Serial.print(F(" to MAC "));
Serial.print(macToString(incomingData.transmittedData.originalTargetMAC)); Serial.print(macToString(incomingData.transmittedData.originalTargetMAC));
Serial.print(" via MAC "); Serial.print(F(" via MAC "));
Serial.print(macToString(incomingData.intermediateSenderMAC)); Serial.print(macToString(incomingData.intermediateSenderMAC));
Serial.println(" received."); Serial.println(F(" received."));
#endif #endif
if (macToString(incomingData.transmittedData.originalTargetMAC) == macToString(localMAC)) if (macToString(incomingData.transmittedData.originalTargetMAC) == macToString(localMAC))
{ {
@ -308,13 +297,13 @@ void ZHNetwork::maintenance()
break; break;
case DELIVERY_CONFIRM_RESPONSE: case DELIVERY_CONFIRM_RESPONSE:
#ifdef PRINT_LOG #ifdef PRINT_LOG
Serial.print("DELIVERY_CONFIRM_RESPONSE message from MAC "); Serial.print(F("DELIVERY_CONFIRM_RESPONSE message from MAC "));
Serial.print(macToString(incomingData.transmittedData.originalSenderMAC)); Serial.print(macToString(incomingData.transmittedData.originalSenderMAC));
Serial.print(" to MAC "); Serial.print(F(" to MAC "));
Serial.print(macToString(incomingData.transmittedData.originalTargetMAC)); Serial.print(macToString(incomingData.transmittedData.originalTargetMAC));
Serial.print(" via MAC "); Serial.print(F(" via MAC "));
Serial.print(macToString(incomingData.intermediateSenderMAC)); Serial.print(macToString(incomingData.intermediateSenderMAC));
Serial.println(" received."); Serial.println(F(" received."));
#endif #endif
if (macToString(incomingData.transmittedData.originalTargetMAC) == macToString(localMAC)) if (macToString(incomingData.transmittedData.originalTargetMAC) == macToString(localMAC))
{ {
@ -326,11 +315,11 @@ void ZHNetwork::maintenance()
break; break;
case SEARCH_REQUEST: case SEARCH_REQUEST:
#ifdef PRINT_LOG #ifdef PRINT_LOG
Serial.print("SEARCH_REQUEST message from MAC "); Serial.print(F("SEARCH_REQUEST message from MAC "));
Serial.print(macToString(incomingData.transmittedData.originalSenderMAC)); Serial.print(macToString(incomingData.transmittedData.originalSenderMAC));
Serial.print(" to MAC "); Serial.print(F(" to MAC "));
Serial.print(macToString(incomingData.transmittedData.originalTargetMAC)); Serial.print(macToString(incomingData.transmittedData.originalTargetMAC));
Serial.println(" received."); Serial.println(F(" received."));
#endif #endif
if (macToString(incomingData.transmittedData.originalTargetMAC) == macToString(localMAC)) if (macToString(incomingData.transmittedData.originalTargetMAC) == macToString(localMAC))
broadcastMessage("", incomingData.transmittedData.originalSenderMAC, SEARCH_RESPONSE); broadcastMessage("", incomingData.transmittedData.originalSenderMAC, SEARCH_RESPONSE);
@ -340,11 +329,11 @@ void ZHNetwork::maintenance()
break; break;
case SEARCH_RESPONSE: case SEARCH_RESPONSE:
#ifdef PRINT_LOG #ifdef PRINT_LOG
Serial.print("SEARCH_RESPONSE message from MAC "); Serial.print(F("SEARCH_RESPONSE message from MAC "));
Serial.print(macToString(incomingData.transmittedData.originalSenderMAC)); Serial.print(macToString(incomingData.transmittedData.originalSenderMAC));
Serial.print(" to MAC "); Serial.print(F(" to MAC "));
Serial.print(macToString(incomingData.transmittedData.originalTargetMAC)); Serial.print(macToString(incomingData.transmittedData.originalTargetMAC));
Serial.println(" received."); Serial.println(F(" received."));
#endif #endif
if (macToString(incomingData.transmittedData.originalTargetMAC) != macToString(localMAC)) if (macToString(incomingData.transmittedData.originalTargetMAC) != macToString(localMAC))
forward = true; forward = true;
@ -375,11 +364,11 @@ void ZHNetwork::maintenance()
memcpy(&routingTable.intermediateTargetMAC, &incomingData.intermediateSenderMAC, 6); memcpy(&routingTable.intermediateTargetMAC, &incomingData.intermediateSenderMAC, 6);
routingVector.at(i) = routingTable; routingVector.at(i) = routingTable;
#ifdef PRINT_LOG #ifdef PRINT_LOG
Serial.print("CHECKING ROUTING TABLE... Routing to MAC "); Serial.print(F("CHECKING ROUTING TABLE... Routing to MAC "));
Serial.print(macToString(incomingData.transmittedData.originalSenderMAC)); Serial.print(macToString(incomingData.transmittedData.originalSenderMAC));
Serial.print(" updated. Target is "); Serial.print(F(" updated. Target is "));
Serial.print(macToString(incomingData.intermediateSenderMAC)); Serial.print(macToString(incomingData.intermediateSenderMAC));
Serial.println("."); Serial.println(F("."));
#endif #endif
} }
} }
@ -393,11 +382,11 @@ void ZHNetwork::maintenance()
memcpy(&routingTable.intermediateTargetMAC, &incomingData.intermediateSenderMAC, 6); memcpy(&routingTable.intermediateTargetMAC, &incomingData.intermediateSenderMAC, 6);
routingVector.push_back(routingTable); routingVector.push_back(routingTable);
#ifdef PRINT_LOG #ifdef PRINT_LOG
Serial.print("CHECKING ROUTING TABLE... Routing to MAC "); Serial.print(F("CHECKING ROUTING TABLE... Routing to MAC "));
Serial.print(macToString(incomingData.transmittedData.originalSenderMAC)); Serial.print(macToString(incomingData.transmittedData.originalSenderMAC));
Serial.print(" added. Target is "); Serial.print(F(" added. Target is "));
Serial.print(macToString(incomingData.intermediateSenderMAC)); Serial.print(macToString(incomingData.intermediateSenderMAC));
Serial.println("."); Serial.println(F("."));
#endif #endif
} }
} }
@ -413,16 +402,15 @@ void ZHNetwork::maintenance()
{ {
queueForRoutingVectorWaiting.pop(); queueForRoutingVectorWaiting.pop();
outgoing_data_t outgoingData; outgoing_data_t outgoingData;
esp_memset(&outgoingData, 0, sizeof(outgoing_data_t));
memcpy(&outgoingData.transmittedData, &waitingData.transmittedData, sizeof(transmitted_data_t)); memcpy(&outgoingData.transmittedData, &waitingData.transmittedData, sizeof(transmitted_data_t));
memcpy(&outgoingData.intermediateTargetMAC, &routingTable.intermediateTargetMAC, 6); memcpy(&outgoingData.intermediateTargetMAC, &routingTable.intermediateTargetMAC, 6);
queueForOutgoingData.push(outgoingData); queueForOutgoingData.push(outgoingData);
#ifdef PRINT_LOG #ifdef PRINT_LOG
Serial.print("CHECKING ROUTING TABLE... Routing to MAC "); Serial.print(F("CHECKING ROUTING TABLE... Routing to MAC "));
Serial.print(macToString(outgoingData.transmittedData.originalTargetMAC)); Serial.print(macToString(outgoingData.transmittedData.originalTargetMAC));
Serial.print(" found. Target is "); Serial.print(F(" found. Target is "));
Serial.print(macToString(outgoingData.intermediateTargetMAC)); Serial.print(macToString(outgoingData.intermediateTargetMAC));
Serial.println("."); Serial.println(F("."));
#endif #endif
return; return;
} }
@ -431,30 +419,30 @@ void ZHNetwork::maintenance()
{ {
queueForRoutingVectorWaiting.pop(); queueForRoutingVectorWaiting.pop();
#ifdef PRINT_LOG #ifdef PRINT_LOG
Serial.print("CHECKING ROUTING TABLE... Routing to MAC "); Serial.print(F("CHECKING ROUTING TABLE... Routing to MAC "));
Serial.print(macToString(waitingData.transmittedData.originalTargetMAC)); Serial.print(macToString(waitingData.transmittedData.originalTargetMAC));
Serial.println(" not found."); Serial.println(F(" not found."));
switch (waitingData.transmittedData.messageType) switch (waitingData.transmittedData.messageType)
{ {
case UNICAST: case UNICAST:
Serial.print("UNICAST"); Serial.print(F("UNICAST"));
break; break;
case UNICAST_WITH_CONFIRM: case UNICAST_WITH_CONFIRM:
Serial.print("UNICAST_WITH_CONFIRM"); Serial.print(F("UNICAST_WITH_CONFIRM"));
break; break;
case DELIVERY_CONFIRM_RESPONSE: case DELIVERY_CONFIRM_RESPONSE:
Serial.print("DELIVERY_CONFIRM_RESPONSE"); Serial.print(F("DELIVERY_CONFIRM_RESPONSE"));
break; break;
default: default:
break; break;
} }
Serial.print(" message from MAC "); Serial.print(F(" message from MAC "));
Serial.print(macToString(waitingData.transmittedData.originalSenderMAC)); Serial.print(macToString(waitingData.transmittedData.originalSenderMAC));
Serial.print(" to MAC "); Serial.print(F(" to MAC "));
Serial.print(macToString(waitingData.transmittedData.originalTargetMAC)); Serial.print(macToString(waitingData.transmittedData.originalTargetMAC));
Serial.print(" via MAC "); Serial.print(F(" via MAC "));
Serial.print(macToString(waitingData.intermediateTargetMAC)); Serial.print(macToString(waitingData.intermediateTargetMAC));
Serial.println(" undelivered."); Serial.println(F(" undelivered."));
#endif #endif
if (waitingData.transmittedData.messageType == UNICAST_WITH_CONFIRM && macToString(waitingData.transmittedData.originalSenderMAC) == macToString(localMAC)) if (waitingData.transmittedData.messageType == UNICAST_WITH_CONFIRM && macToString(waitingData.transmittedData.originalSenderMAC) == macToString(localMAC))
if (onConfirmReceivingCallback) if (onConfirmReceivingCallback)
@ -601,7 +589,6 @@ void IRAM_ATTR ZHNetwork::onDataReceive(uint8_t *mac, uint8_t *data, uint8_t len
void ZHNetwork::broadcastMessage(const char *data, const uint8_t *target, message_type_t type) void ZHNetwork::broadcastMessage(const char *data, const uint8_t *target, message_type_t type)
{ {
outgoing_data_t outgoingData; outgoing_data_t outgoingData;
esp_memset(&outgoingData, 0, sizeof(outgoing_data_t));
outgoingData.transmittedData.messageType = type; outgoingData.transmittedData.messageType = type;
outgoingData.transmittedData.messageID = ((uint16_t)random(32767) << 8) | (uint16_t)random(32767); outgoingData.transmittedData.messageID = ((uint16_t)random(32767) << 8) | (uint16_t)random(32767);
memcpy(&outgoingData.transmittedData.netName, &netName_, 20); memcpy(&outgoingData.transmittedData.netName, &netName_, 20);
@ -614,29 +601,28 @@ void ZHNetwork::broadcastMessage(const char *data, const uint8_t *target, messag
switch (outgoingData.transmittedData.messageType) switch (outgoingData.transmittedData.messageType)
{ {
case BROADCAST: case BROADCAST:
Serial.print("BROADCAST"); Serial.print(F("BROADCAST"));
break; break;
case SEARCH_REQUEST: case SEARCH_REQUEST:
Serial.print("SEARCH_REQUEST"); Serial.print(F("SEARCH_REQUEST"));
break; break;
case SEARCH_RESPONSE: case SEARCH_RESPONSE:
Serial.print("SEARCH_RESPONSE"); Serial.print(F("SEARCH_RESPONSE"));
break; break;
default: default:
break; break;
} }
Serial.print(" message from MAC "); Serial.print(F(" message from MAC "));
Serial.print(macToString(outgoingData.transmittedData.originalSenderMAC)); Serial.print(macToString(outgoingData.transmittedData.originalSenderMAC));
Serial.print(" to MAC "); Serial.print(F(" to MAC "));
Serial.print(macToString(outgoingData.transmittedData.originalTargetMAC)); Serial.print(macToString(outgoingData.transmittedData.originalTargetMAC));
Serial.println(" added to queue."); Serial.println(F(" added to queue."));
#endif #endif
} }
void ZHNetwork::unicastMessage(const char *data, const uint8_t *target, const uint8_t *sender, message_type_t type) void ZHNetwork::unicastMessage(const char *data, const uint8_t *target, const uint8_t *sender, message_type_t type)
{ {
outgoing_data_t outgoingData; outgoing_data_t outgoingData;
esp_memset(&outgoingData, 0, sizeof(outgoing_data_t));
outgoingData.transmittedData.messageType = type; outgoingData.transmittedData.messageType = type;
outgoingData.transmittedData.messageID = ((uint16_t)random(32767) << 8) | (uint16_t)random(32767); outgoingData.transmittedData.messageID = ((uint16_t)random(32767) << 8) | (uint16_t)random(32767);
memcpy(&outgoingData.transmittedData.netName, &netName_, 20); memcpy(&outgoingData.transmittedData.netName, &netName_, 20);
@ -651,32 +637,32 @@ void ZHNetwork::unicastMessage(const char *data, const uint8_t *target, const ui
memcpy(&outgoingData.intermediateTargetMAC, &routingTable.intermediateTargetMAC, 6); memcpy(&outgoingData.intermediateTargetMAC, &routingTable.intermediateTargetMAC, 6);
queueForOutgoingData.push(outgoingData); queueForOutgoingData.push(outgoingData);
#ifdef PRINT_LOG #ifdef PRINT_LOG
Serial.print("CHECKING ROUTING TABLE... Routing to MAC "); Serial.print(F("CHECKING ROUTING TABLE... Routing to MAC "));
Serial.print(macToString(outgoingData.transmittedData.originalTargetMAC)); Serial.print(macToString(outgoingData.transmittedData.originalTargetMAC));
Serial.print(" found. Target is "); Serial.print(F(" found. Target is "));
Serial.print(macToString(outgoingData.intermediateTargetMAC)); Serial.print(macToString(outgoingData.intermediateTargetMAC));
Serial.println("."); Serial.println(F("."));
switch (outgoingData.transmittedData.messageType) switch (outgoingData.transmittedData.messageType)
{ {
case UNICAST: case UNICAST:
Serial.print("UNICAST"); Serial.print(F("UNICAST"));
break; break;
case UNICAST_WITH_CONFIRM: case UNICAST_WITH_CONFIRM:
Serial.print("UNICAST_WITH_CONFIRM"); Serial.print(F("UNICAST_WITH_CONFIRM"));
break; break;
case DELIVERY_CONFIRM_RESPONSE: case DELIVERY_CONFIRM_RESPONSE:
Serial.print("DELIVERY_CONFIRM_RESPONSE"); Serial.print(F("DELIVERY_CONFIRM_RESPONSE"));
break; break;
default: default:
break; break;
} }
Serial.print(" message from MAC "); Serial.print(F(" message from MAC "));
Serial.print(macToString(outgoingData.transmittedData.originalSenderMAC)); Serial.print(macToString(outgoingData.transmittedData.originalSenderMAC));
Serial.print(" to MAC "); Serial.print(F(" to MAC "));
Serial.print(macToString(outgoingData.transmittedData.originalTargetMAC)); Serial.print(macToString(outgoingData.transmittedData.originalTargetMAC));
Serial.print(" via MAC "); Serial.print(F(" via MAC "));
Serial.print(macToString(outgoingData.intermediateTargetMAC)); Serial.print(macToString(outgoingData.intermediateTargetMAC));
Serial.println(" added to queue."); Serial.println(F(" added to queue."));
#endif #endif
return; return;
} }
@ -684,31 +670,31 @@ void ZHNetwork::unicastMessage(const char *data, const uint8_t *target, const ui
memcpy(&outgoingData.intermediateTargetMAC, target, 6); memcpy(&outgoingData.intermediateTargetMAC, target, 6);
queueForOutgoingData.push(outgoingData); queueForOutgoingData.push(outgoingData);
#ifdef PRINT_LOG #ifdef PRINT_LOG
Serial.print("CHECKING ROUTING TABLE... Routing to MAC "); Serial.print(F("CHECKING ROUTING TABLE... Routing to MAC "));
Serial.print(macToString(outgoingData.transmittedData.originalTargetMAC)); Serial.print(macToString(outgoingData.transmittedData.originalTargetMAC));
Serial.print(" not found. Target is "); Serial.print(F(" not found. Target is "));
Serial.print(macToString(outgoingData.intermediateTargetMAC)); Serial.print(macToString(outgoingData.intermediateTargetMAC));
Serial.println("."); Serial.println(F("."));
switch (outgoingData.transmittedData.messageType) switch (outgoingData.transmittedData.messageType)
{ {
case UNICAST: case UNICAST:
Serial.print("UNICAST"); Serial.print(F("UNICAST"));
break; break;
case UNICAST_WITH_CONFIRM: case UNICAST_WITH_CONFIRM:
Serial.print("UNICAST_WITH_CONFIRM"); Serial.print(F("UNICAST_WITH_CONFIRM"));
break; break;
case DELIVERY_CONFIRM_RESPONSE: case DELIVERY_CONFIRM_RESPONSE:
Serial.print("DELIVERY_CONFIRM_RESPONSE"); Serial.print(F("DELIVERY_CONFIRM_RESPONSE"));
break; break;
default: default:
break; break;
} }
Serial.print(" message from MAC "); Serial.print(F(" message from MAC "));
Serial.print(macToString(outgoingData.transmittedData.originalSenderMAC)); Serial.print(macToString(outgoingData.transmittedData.originalSenderMAC));
Serial.print(" to MAC "); Serial.print(F(" to MAC "));
Serial.print(macToString(outgoingData.transmittedData.originalTargetMAC)); Serial.print(macToString(outgoingData.transmittedData.originalTargetMAC));
Serial.print(" via MAC "); Serial.print(F(" via MAC "));
Serial.print(macToString(outgoingData.intermediateTargetMAC)); Serial.print(macToString(outgoingData.intermediateTargetMAC));
Serial.println(" added to queue."); Serial.println(F(" added to queue."));
#endif #endif
} }

View File

@ -15,46 +15,39 @@
// #define PRINT_LOG // Uncomment to display to serial port the full operation log. // #define PRINT_LOG // Uncomment to display to serial port the full operation log.
#if defined(ESP8266)
#define esp_memset memset // Just for remove the compiler notice for ESP8266 at "memset". I don't know why this is happening...
#endif
#if defined(ESP32)
#define esp_memset memset
#endif
typedef struct typedef struct
{ {
uint8_t messageType; uint8_t messageType{0};
uint16_t messageID; uint16_t messageID{0};
char netName[20]; char netName[20]{0};
uint8_t originalTargetMAC[6]; uint8_t originalTargetMAC[6]{0};
uint8_t originalSenderMAC[6]; uint8_t originalSenderMAC[6]{0};
char message[200]; char message[200]{0};
} transmitted_data_t; } transmitted_data_t;
typedef struct typedef struct
{ {
uint8_t intermediateTargetMAC[6]; uint8_t intermediateTargetMAC[6]{0};
transmitted_data_t transmittedData; transmitted_data_t transmittedData;
} outgoing_data_t; } outgoing_data_t;
typedef struct typedef struct
{ {
uint8_t intermediateSenderMAC[6]; uint8_t intermediateSenderMAC[6]{0};
transmitted_data_t transmittedData; transmitted_data_t transmittedData;
} incoming_data_t; } incoming_data_t;
typedef struct typedef struct
{ {
uint64_t time; uint64_t time{0};
uint8_t intermediateTargetMAC[6]; uint8_t intermediateTargetMAC[6]{0};
transmitted_data_t transmittedData; transmitted_data_t transmittedData;
} waiting_data_t; } waiting_data_t;
typedef struct typedef struct
{ {
uint8_t originalTargetMAC[6]; uint8_t originalTargetMAC[6]{0};
uint8_t intermediateTargetMAC[6]; uint8_t intermediateTargetMAC[6]{0};
} routing_table_t; } routing_table_t;
typedef enum typedef enum
@ -104,6 +97,7 @@ public:
error_code_t setApSetting(const char *ssid, const char *password); error_code_t setApSetting(const char *ssid, const char *password);
error_code_t begin(void); error_code_t begin(void);
error_code_t stop(void);
void sendBroadcastMessage(const char *data); void sendBroadcastMessage(const char *data);
void sendUnicastMessage(const char *data, const uint8_t *target, const bool confirm = false); void sendUnicastMessage(const char *data, const uint8_t *target, const bool confirm = false);
@ -126,6 +120,32 @@ public:
uint16_t getMaxWaitingTimeForRoutingInfo(void); uint16_t getMaxWaitingTimeForRoutingInfo(void);
private: private:
static routing_vector_t routingVector;
static incoming_queue_t queueForIncomingData;
static outgoing_queue_t queueForOutgoingData;
static waiting_queue_t queueForRoutingVectorWaiting;
static bool criticalProcessSemaphore;
static bool sentMessageSemaphore;
static bool confirmReceivingSemaphore;
static bool confirmReceiving;
static uint8_t localMAC[6];
static uint16_t lastMessageID[10];
static char netName_[20];
const char *firmware{"1.11"};
const uint8_t broadcastMAC[6]{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
work_mode_t workMode_{ESP_NOW};
char apSsid_[32]{"ESP-NOW NODE"};
char apPassword_[64]{0};
char staSsid_[32]{0};
char staPassword_[64]{0};
uint8_t maxNumberOfAttempts_{3};
uint8_t maxWaitingTimeBetweenTransmissions_{50};
uint8_t numberOfAttemptsToSend{1};
uint16_t maxTimeForRoutingInfoWaiting_{500};
uint64_t lastMessageSentTime{0};
#if defined(ESP8266) #if defined(ESP8266)
static void onDataSent(uint8_t *mac, uint8_t status); static void onDataSent(uint8_t *mac, uint8_t status);
static void onDataReceive(uint8_t *mac, uint8_t *data, uint8_t length); static void onDataReceive(uint8_t *mac, uint8_t *data, uint8_t length);