Version 1.4

Added simple XOR crypting.
This commit is contained in:
Alexey Zholtikov 2023-01-19 18:36:57 +03:00
parent 32f7c013b8
commit 341f314895
6 changed files with 55 additions and 12 deletions

View File

@ -4,14 +4,15 @@ A simple library for creating ESP-NOW based Mesh network for ESP8266/ESP32.
## Features ## Features
1. The maximum size of transmitted data is 200 bytes. Currently only unencrypted messages. 1. The maximum size of transmitted data is 200 bytes.
2. All nodes are not visible to the network scanner. 2. Encrypted and unencrypted messages. Simple XOR crypting.
3. Not required a pre-pairings for data transfer. 3. All nodes are not visible to the network scanner.
4. Broadcast or unicast data transmission. 4. Not required a pre-pairings for data transfer.
5. There are no periodic/synchronous messages on the network. All devices are in "silent mode" and do not "hum" into the air. 5. Broadcast or unicast data transmissions.
6. Each node has its own independent routing table, updated only as needed. 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 will receive/send a message if it "sees" at least one device on the network. 7. Each node has its own independent routing table, updated only as needed.
8. The number of devices on the network and the area of use is not limited (hypothetically). :-) 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 ## Testing
@ -126,6 +127,14 @@ uint8_t mac[6]
myNet.stringToMac(string, mac); 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 ### Sets max number of attempts to send message
1-10. 3 default value. 1-10. 3 default value.
@ -188,6 +197,7 @@ void setup()
Serial.begin(115200); Serial.begin(115200);
Serial.println(); Serial.println();
myNet.begin("ZHNetwork"); myNet.begin("ZHNetwork");
myNet.setCryptKey("VERY_LONG_CRYPT_KEY");
myNet.setOnBroadcastReceivingCallback(onBroadcastReceiving); myNet.setOnBroadcastReceivingCallback(onBroadcastReceiving);
myNet.setOnUnicastReceivingCallback(onUnicastReceiving); myNet.setOnUnicastReceivingCallback(onUnicastReceiving);
myNet.setOnConfirmReceivingCallback(onConfirmReceiving); myNet.setOnConfirmReceivingCallback(onConfirmReceiving);

View File

@ -10,6 +10,7 @@ void setup()
Serial.begin(115200); Serial.begin(115200);
Serial.println(); Serial.println();
myNet.begin("ZHNetwork"); myNet.begin("ZHNetwork");
myNet.setCryptKey("VERY_LONG_CRYPT_KEY");
myNet.setOnBroadcastReceivingCallback(onBroadcastReceiving); myNet.setOnBroadcastReceivingCallback(onBroadcastReceiving);
myNet.setOnUnicastReceivingCallback(onUnicastReceiving); myNet.setOnUnicastReceivingCallback(onUnicastReceiving);
Serial.print("MAC: "); Serial.print("MAC: ");

View File

@ -13,6 +13,7 @@ void setup()
Serial.begin(115200); Serial.begin(115200);
Serial.println(); Serial.println();
myNet.begin("ZHNetwork"); myNet.begin("ZHNetwork");
myNet.setCryptKey("VERY_LONG_CRYPT_KEY");
myNet.setOnConfirmReceivingCallback(onConfirmReceiving); myNet.setOnConfirmReceivingCallback(onConfirmReceiving);
Serial.print("MAC: "); Serial.print("MAC: ");
Serial.print(myNet.getNodeMac()); Serial.print(myNet.getNodeMac());

View File

@ -1,5 +1,5 @@
name=ZHNetwork name=ZHNetwork
version=1.32 version=1.4
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

@ -11,6 +11,7 @@ bool ZHNetwork::sentMessageSemaphore{false};
bool ZHNetwork::confirmReceivingSemaphore{false}; bool ZHNetwork::confirmReceivingSemaphore{false};
bool ZHNetwork::confirmReceiving{false}; bool ZHNetwork::confirmReceiving{false};
char ZHNetwork::netName_[20]{0}; char ZHNetwork::netName_[20]{0};
char ZHNetwork::key_[20]{0};
uint8_t ZHNetwork::localMAC[6]{0}; uint8_t ZHNetwork::localMAC[6]{0};
uint16_t ZHNetwork::lastMessageID[10]{0}; uint16_t ZHNetwork::lastMessageID[10]{0};
@ -35,7 +36,7 @@ ZHNetwork &ZHNetwork::setOnConfirmReceivingCallback(on_confirm_t onConfirmReceiv
error_code_t ZHNetwork::begin(const char *netName, const bool gateway) error_code_t ZHNetwork::begin(const char *netName, const bool gateway)
{ {
randomSeed(analogRead(0)); randomSeed(analogRead(0));
if (strlen(netName) > 1 && strlen(netName) < 20) if (strlen(netName) >= 1 && strlen(netName) <= 20)
strcpy(netName_, netName); strcpy(netName_, netName);
#ifdef PRINT_LOG #ifdef PRINT_LOG
Serial.begin(115200); Serial.begin(115200);
@ -192,7 +193,12 @@ void ZHNetwork::maintenance()
Serial.println(F(" received.")); Serial.println(F(" received."));
#endif #endif
if (onBroadcastReceivingCallback) 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); onBroadcastReceivingCallback(incomingData.transmittedData.message, incomingData.transmittedData.originalSenderMAC);
}
forward = true; forward = true;
break; break;
case UNICAST: case UNICAST:
@ -208,7 +214,12 @@ void ZHNetwork::maintenance()
if (macToString(incomingData.transmittedData.originalTargetMAC) == macToString(localMAC)) if (macToString(incomingData.transmittedData.originalTargetMAC) == macToString(localMAC))
{ {
if (onUnicastReceivingCallback) 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); onUnicastReceivingCallback(incomingData.transmittedData.message, incomingData.transmittedData.originalSenderMAC);
}
} }
else else
unicastMessage(incomingData.transmittedData.message, incomingData.transmittedData.originalTargetMAC, incomingData.transmittedData.originalSenderMAC, UNICAST); unicastMessage(incomingData.transmittedData.message, incomingData.transmittedData.originalTargetMAC, incomingData.transmittedData.originalSenderMAC, UNICAST);
@ -226,7 +237,12 @@ void ZHNetwork::maintenance()
if (macToString(incomingData.transmittedData.originalTargetMAC) == macToString(localMAC)) if (macToString(incomingData.transmittedData.originalTargetMAC) == macToString(localMAC))
{ {
if (onUnicastReceivingCallback) 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); onUnicastReceivingCallback(incomingData.transmittedData.message, incomingData.transmittedData.originalSenderMAC);
}
confirmation_id_t id; confirmation_id_t id;
memcpy(&id.messageID, &incomingData.transmittedData.messageID, 2); memcpy(&id.messageID, &incomingData.transmittedData.messageID, 2);
char temp[sizeof(transmitted_data_t::message)]; char temp[sizeof(transmitted_data_t::message)];
@ -405,7 +421,7 @@ void ZHNetwork::maintenance()
for (uint16_t i{0}; i < confirmationVector.size(); ++i) for (uint16_t i{0}; i < confirmationVector.size(); ++i)
{ {
confirmation_waiting_data_t confirmationData = confirmationVector[i]; confirmation_waiting_data_t confirmationData = confirmationVector[i];
if ((millis() - confirmationData.time) > 1000) if ((millis() - confirmationData.time) > maxTimeForRoutingInfoWaiting_)
{ {
confirmationVector.erase(confirmationVector.begin() + i); confirmationVector.erase(confirmationVector.begin() + i);
broadcastMessage("", confirmationData.targetMAC, SEARCH_REQUEST); broadcastMessage("", confirmationData.targetMAC, SEARCH_REQUEST);
@ -448,6 +464,13 @@ uint8_t *ZHNetwork::stringToMac(const String &string, uint8_t *mac)
return 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) error_code_t ZHNetwork::setMaxNumberOfAttempts(const uint8_t maxNumberOfAttempts)
{ {
if (maxNumberOfAttempts < 1 || maxNumberOfAttempts > 10) if (maxNumberOfAttempts < 1 || maxNumberOfAttempts > 10)
@ -551,6 +574,9 @@ uint16_t ZHNetwork::broadcastMessage(const char *data, const uint8_t *target, me
memcpy(&outgoingData.transmittedData.originalTargetMAC, target, 6); memcpy(&outgoingData.transmittedData.originalTargetMAC, target, 6);
memcpy(&outgoingData.transmittedData.originalSenderMAC, &localMAC, 6); memcpy(&outgoingData.transmittedData.originalSenderMAC, &localMAC, 6);
strcpy(outgoingData.transmittedData.message, data); 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); memcpy(&outgoingData.intermediateTargetMAC, &broadcastMAC, 6);
queueForOutgoingData.push(outgoingData); queueForOutgoingData.push(outgoingData);
#ifdef PRINT_LOG #ifdef PRINT_LOG
@ -586,6 +612,9 @@ uint16_t ZHNetwork::unicastMessage(const char *data, const uint8_t *target, cons
memcpy(&outgoingData.transmittedData.originalTargetMAC, target, 6); memcpy(&outgoingData.transmittedData.originalTargetMAC, target, 6);
memcpy(&outgoingData.transmittedData.originalSenderMAC, sender, 6); memcpy(&outgoingData.transmittedData.originalSenderMAC, sender, 6);
strcpy(outgoingData.transmittedData.message, data); 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) for (uint16_t i{0}; i < routingVector.size(); ++i)
{ {
routing_table_t routingTable = routingVector[i]; routing_table_t routingTable = routingVector[i];

View File

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