11 Commits
v1.32 ... v1.41

Author SHA1 Message Date
a080869c5c Version 1.41
Fixed one bug with generating of message ID.
2023-03-05 15:05:40 +03:00
9c3d35e1c3 Minor changes 2023-02-11 09:35:25 +03:00
49a4bd210d Minor changes 2023-02-11 08:39:58 +03:00
5e0822b8e9 Merge branch 'main' of http://git.zh.com.ru/alexey.zholtikov/ZHNetwork 2023-02-11 08:26:45 +03:00
915e2bf7b7 Minor changes 2023-02-11 08:26:43 +03:00
0812c15b85 Merge branch 'main' of http://git.zh.com.ru/alexey.zholtikov/ZHNetwork 2023-02-11 08:17:36 +03:00
4189c860aa Minor changes 2023-02-11 08:17:28 +03:00
7a8dbe40f0 Merge branch 'main' of http://git.zh.com.ru/alexey.zholtikov/ZHNetwork 2023-02-11 08:16:20 +03:00
6eab8cde49 Minor changes 2023-02-11 08:16:18 +03:00
d94bbe028c Minor Changes 2023-02-10 15:33:49 +03:00
341f314895 Version 1.4
Added simple XOR crypting.
2023-01-19 18:36:57 +03:00
6 changed files with 66 additions and 14 deletions

View File

@ -4,14 +4,15 @@ A simple library for creating ESP-NOW based Mesh network for ESP8266/ESP32.
## Features
1. The maximum size of transmitted data is 200 bytes. Currently only unencrypted messages.
2. All nodes are not visible to the network scanner.
3. Not required a pre-pairings for data transfer.
4. Broadcast or unicast data transmission.
5. There are no periodic/synchronous messages on the network. All devices are in "silent mode" and do not "hum" into the air.
6. Each node has its own independent routing table, updated only as needed.
7. Each node will receive/send a message if it "sees" at least one device on the network.
8. The number of devices on the network and the area of use is not limited (hypothetically). :-)
1. The maximum size of transmitted data is 200 bytes.
2. Encrypted and unencrypted messages. Simple XOR crypting.
3. All nodes are not visible to the network scanner.
4. Not required a pre-pairings for data transfer.
5. Broadcast or unicast data transmissions.
6. There are no periodic/synchronous messages on the network. All devices are in "silent mode" and do not "hum" into the air.
7. Each node has its own independent routing table, updated only as needed.
8. Each node will receive/send a message if it "sees" at least one device on the network.
9. The number of devices on the network and the area of use is not limited (hypothetically). :-)
## Testing
@ -126,6 +127,14 @@ uint8_t mac[6]
myNet.stringToMac(string, mac);
```
### Sets crypt key
1-20 characters.
```cpp
myNet.setCryptKey("VERY_LONG_CRYPT_KEY");
```
### Sets max number of attempts to send message
1-10. 3 default value.
@ -188,6 +197,7 @@ void setup()
Serial.begin(115200);
Serial.println();
myNet.begin("ZHNetwork");
// myNet.setCryptKey("VERY_LONG_CRYPT_KEY"); // If encryption is used, the key must be set same of all another ESP-NOW devices in network.
myNet.setOnBroadcastReceivingCallback(onBroadcastReceiving);
myNet.setOnUnicastReceivingCallback(onUnicastReceiving);
myNet.setOnConfirmReceivingCallback(onConfirmReceiving);
@ -229,6 +239,7 @@ void onBroadcastReceiving(const char *data, const uint8_t *sender)
Serial.print("Message: ");
Serial.println(data);
}
void onUnicastReceiving(const char *data, const uint8_t *sender)
{
Serial.print("Unicast message from MAC ");
@ -247,3 +258,5 @@ void onConfirmReceiving(const uint8_t *target, const uint16_t id, const bool sta
Serial.println(status ? " delivered." : " undelivered.");
}
```
Any feedback via [e-mail](mailto:github@zh.com.ru) would be appreciated. Or... [Buy me a coffee](https://paypal.me/aZholtikov).

View File

@ -10,6 +10,7 @@ void setup()
Serial.begin(115200);
Serial.println();
myNet.begin("ZHNetwork");
// myNet.setCryptKey("VERY_LONG_CRYPT_KEY"); // If encryption is used, the key must be set same of all another ESP-NOW devices in network.
myNet.setOnBroadcastReceivingCallback(onBroadcastReceiving);
myNet.setOnUnicastReceivingCallback(onUnicastReceiving);
Serial.print("MAC: ");
@ -32,6 +33,7 @@ void onBroadcastReceiving(const char *data, const uint8_t *sender)
Serial.print("Message: ");
Serial.println(data);
}
void onUnicastReceiving(const char *data, const uint8_t *sender)
{
Serial.print("Unicast message from MAC ");

View File

@ -13,6 +13,7 @@ void setup()
Serial.begin(115200);
Serial.println();
myNet.begin("ZHNetwork");
// myNet.setCryptKey("VERY_LONG_CRYPT_KEY"); // If encryption is used, the key must be set same of all another ESP-NOW devices in network.
myNet.setOnConfirmReceivingCallback(onConfirmReceiving);
Serial.print("MAC: ");
Serial.print(myNet.getNodeMac());
@ -32,7 +33,7 @@ void loop()
Serial.print(myNet.macToString(target));
Serial.println(" sended.");
myNet.sendUnicastMessage("Hello world!", target);
Serial.print("Unicast with confirm message to MAC ");
Serial.print(myNet.macToString(target));
Serial.print(" ID ");

View File

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

View File

@ -11,6 +11,7 @@ bool ZHNetwork::sentMessageSemaphore{false};
bool ZHNetwork::confirmReceivingSemaphore{false};
bool ZHNetwork::confirmReceiving{false};
char ZHNetwork::netName_[20]{0};
char ZHNetwork::key_[20]{0};
uint8_t ZHNetwork::localMAC[6]{0};
uint16_t ZHNetwork::lastMessageID[10]{0};
@ -34,8 +35,13 @@ ZHNetwork &ZHNetwork::setOnConfirmReceivingCallback(on_confirm_t onConfirmReceiv
error_code_t ZHNetwork::begin(const char *netName, const bool gateway)
{
randomSeed(analogRead(0));
if (strlen(netName) > 1 && strlen(netName) < 20)
#if defined(ESP8266)
randomSeed(os_random());
#endif
#if defined(ESP32)
randomSeed(esp_random());
#endif
if (strlen(netName) >= 1 && strlen(netName) <= 20)
strcpy(netName_, netName);
#ifdef PRINT_LOG
Serial.begin(115200);
@ -192,7 +198,12 @@ void ZHNetwork::maintenance()
Serial.println(F(" received."));
#endif
if (onBroadcastReceivingCallback)
{
if (key_[0])
for (uint8_t i{0}; i < strlen(incomingData.transmittedData.message); ++i)
incomingData.transmittedData.message[i] = incomingData.transmittedData.message[i] ^ key_[i % strlen(key_)];
onBroadcastReceivingCallback(incomingData.transmittedData.message, incomingData.transmittedData.originalSenderMAC);
}
forward = true;
break;
case UNICAST:
@ -208,7 +219,12 @@ void ZHNetwork::maintenance()
if (macToString(incomingData.transmittedData.originalTargetMAC) == macToString(localMAC))
{
if (onUnicastReceivingCallback)
{
if (key_[0])
for (uint8_t i{0}; i < strlen(incomingData.transmittedData.message); ++i)
incomingData.transmittedData.message[i] = incomingData.transmittedData.message[i] ^ key_[i % strlen(key_)];
onUnicastReceivingCallback(incomingData.transmittedData.message, incomingData.transmittedData.originalSenderMAC);
}
}
else
unicastMessage(incomingData.transmittedData.message, incomingData.transmittedData.originalTargetMAC, incomingData.transmittedData.originalSenderMAC, UNICAST);
@ -226,7 +242,12 @@ void ZHNetwork::maintenance()
if (macToString(incomingData.transmittedData.originalTargetMAC) == macToString(localMAC))
{
if (onUnicastReceivingCallback)
{
if (key_[0])
for (uint8_t i{0}; i < strlen(incomingData.transmittedData.message); ++i)
incomingData.transmittedData.message[i] = incomingData.transmittedData.message[i] ^ key_[i % strlen(key_)];
onUnicastReceivingCallback(incomingData.transmittedData.message, incomingData.transmittedData.originalSenderMAC);
}
confirmation_id_t id;
memcpy(&id.messageID, &incomingData.transmittedData.messageID, 2);
char temp[sizeof(transmitted_data_t::message)];
@ -405,7 +426,7 @@ void ZHNetwork::maintenance()
for (uint16_t i{0}; i < confirmationVector.size(); ++i)
{
confirmation_waiting_data_t confirmationData = confirmationVector[i];
if ((millis() - confirmationData.time) > 1000)
if ((millis() - confirmationData.time) > maxTimeForRoutingInfoWaiting_)
{
confirmationVector.erase(confirmationVector.begin() + i);
broadcastMessage("", confirmationData.targetMAC, SEARCH_REQUEST);
@ -448,6 +469,13 @@ uint8_t *ZHNetwork::stringToMac(const String &string, uint8_t *mac)
return mac;
}
error_code_t ZHNetwork::setCryptKey(const char *key)
{
if (strlen(key) >= 1 && strlen(key) <= 20)
strcpy(key_, key);
return SUCCESS;
}
error_code_t ZHNetwork::setMaxNumberOfAttempts(const uint8_t maxNumberOfAttempts)
{
if (maxNumberOfAttempts < 1 || maxNumberOfAttempts > 10)
@ -551,6 +579,9 @@ uint16_t ZHNetwork::broadcastMessage(const char *data, const uint8_t *target, me
memcpy(&outgoingData.transmittedData.originalTargetMAC, target, 6);
memcpy(&outgoingData.transmittedData.originalSenderMAC, &localMAC, 6);
strcpy(outgoingData.transmittedData.message, data);
if (key_[0] && outgoingData.transmittedData.messageType == BROADCAST)
for (uint8_t i{0}; i < strlen(outgoingData.transmittedData.message); ++i)
outgoingData.transmittedData.message[i] = outgoingData.transmittedData.message[i] ^ key_[i % strlen(key_)];
memcpy(&outgoingData.intermediateTargetMAC, &broadcastMAC, 6);
queueForOutgoingData.push(outgoingData);
#ifdef PRINT_LOG
@ -586,6 +617,9 @@ uint16_t ZHNetwork::unicastMessage(const char *data, const uint8_t *target, cons
memcpy(&outgoingData.transmittedData.originalTargetMAC, target, 6);
memcpy(&outgoingData.transmittedData.originalSenderMAC, sender, 6);
strcpy(outgoingData.transmittedData.message, data);
if (key_[0] && macToString(outgoingData.transmittedData.originalSenderMAC) == macToString(localMAC) && outgoingData.transmittedData.messageType != DELIVERY_CONFIRM_RESPONSE)
for (uint8_t i{0}; i < strlen(outgoingData.transmittedData.message); ++i)
outgoingData.transmittedData.message[i] = outgoingData.transmittedData.message[i] ^ key_[i % strlen(key_)];
for (uint16_t i{0}; i < routingVector.size(); ++i)
{
routing_table_t routingTable = routingVector[i];

View File

@ -108,6 +108,7 @@ public:
static String macToString(const uint8_t *mac);
uint8_t *stringToMac(const String &string, uint8_t *mac);
error_code_t setCryptKey(const char *key = "");
error_code_t setMaxNumberOfAttempts(const uint8_t maxNumberOfAttempts);
uint8_t getMaxNumberOfAttempts(void);
error_code_t setMaxWaitingTimeBetweenTransmissions(const uint8_t maxWaitingTimeBetweenTransmissions);
@ -129,8 +130,9 @@ private:
static uint8_t localMAC[6];
static uint16_t lastMessageID[10];
static char netName_[20];
static char key_[20];
const char *firmware{"1.32"};
const char *firmware{"1.41"};
const uint8_t broadcastMAC[6]{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
uint8_t maxNumberOfAttempts_{3};
uint8_t maxWaitingTimeBetweenTransmissions_{50};