7 Commits
v1.11 ... v1.31

Author SHA1 Message Date
62acd2a386 Version 1.31
Added gateway mode support.
2023-01-03 17:55:08 +03:00
506acf1fc0 Minor changes 2022-12-24 13:48:16 +03:00
b328ad916c Version 1.3
Removed a lot of unnecessary functions.
2022-12-22 18:27:17 +03:00
1d5198e0ab Minor changes 2022-12-18 18:02:23 +03:00
aae51f907c Minor changes 2022-12-18 09:34:51 +03:00
8942471c6f Minor changes 2022-12-18 09:16:28 +03:00
c1fe139756 Version 1.12
Fixed one minor bug.
2022-12-16 10:41:28 +03:00
6 changed files with 29 additions and 230 deletions

View File

@ -5,10 +5,10 @@ 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 (for the ESP_NOW mode only).
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 (for the ESP_NOW mode only).
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). :-)
@ -22,6 +22,11 @@ A simple library for creating ESP-NOW based Mesh network for ESP8266/ESP32.
5. Voila. ;-)
6. P.S. Uncomment #define PRINT_LOG in ZHNetwork.h for display to serial port the full operation log.
## Notes
1. Possibility uses WiFi AP or STA modes at the same time with ESP-NOW using the standard libraries.
2. For correct work at ESP-NOW + STA mode your WiFi router must be set on channel 1 and set gateway mode.
## Function descriptions
### Sets the callback function for processing a received broadcast message
@ -60,66 +65,15 @@ void onConfirmReceiving(const uint8_t *target, const bool status)
}
```
### Sets one of the three possibility operating modes
* ESP_NOW. Default mode. ESP-NOW Mesh network only.
* ESP_NOW_AP. ESP-NOW Mesh network + access point.
* ESP_NOW_STA. ESP-NOW Mesh network + connect to your WiFi router.
Attention! For correct work on ESP_NOW_STA mode at ESP8266 your WiFi router must be set on channel 1.
```cpp
myNet.setWorkMode(ESP_NOW);
```
### Gets used operating mode
```cpp
myNet.getWorkMode();
```
### Sets ESP-NOW Mesh network name
### ESP-NOW Mesh network initialization
1-20 characters.
Note. If network name not set node will work with all ESP-NOW networks. If set node will work with only one network.
```cpp
myNet.setNetName("ZHNetwork");
```
### Gets used ESP-NOW Mesh network name
```cpp
myNet.getNetName();
```
### Sets WiFi ssid and password for ESP_NOW_STA mode
Note. Must be called before Mesh network initialization.
```cpp
myNet.setStaSetting("SSID", "PASSWORD");
```
### Sets access point ssid and password for ESP_NOW_AP mode
Note. Must be called before Mesh network initialization.
```cpp
myNet.setApSetting("SSID", "PASSWORD");
```
### ESP-NOW Mesh network initialization
```cpp
myNet.begin();
```
### ESP-NOW Mesh network deinitialization
```cpp
myNet.stop();
myNet.begin("ZHNetwork");
myNet.begin("ZHNetwork", true); // Gateway mode.
```
### Sends broadcast message to all nodes
@ -149,12 +103,6 @@ myNet.maintenance();
myNet.getNodeMac();
```
### Gets node IP address
```cpp
myNet.getNodeIp();
```
### Gets version of this library
```cpp
@ -227,7 +175,7 @@ void onConfirmReceiving(const uint8_t *target, const bool status);
ZHNetwork myNet;
uint64_t messagelastTime{0};
uint64_t messageLastTime{0};
uint16_t messageTimerDelay{5000};
const uint8_t target[6]{0xA8, 0x48, 0xFA, 0xDC, 0x5B, 0xFA};
@ -235,27 +183,12 @@ void setup()
{
Serial.begin(115200);
Serial.println();
// *** ESP-NOW mode only.
myNet.setWorkMode(ESP_NOW);
// *** Or ESP-NOW + access point mode.
// myNet.setWorkMode(ESP_NOW_AP);
// myNet.setApSetting("ESP NODE TEST", "12345678");
// *** Or ESP-NOW + connect to your router mode.
// myNet.setWorkMode(ESP_NOW_STA);
// myNet.setStaSetting("SSID", "PASSWORD");
// ***
myNet.setNetName("ZHNetwork"); // Optional.
myNet.setMaxNumberOfAttempts(3); // Optional.
myNet.setMaxWaitingTimeBetweenTransmissions(50); // Optional.
myNet.setMaxWaitingTimeForRoutingInfo(500); // Optional.
myNet.begin();
myNet.begin("ZHNetwork");
myNet.setOnBroadcastReceivingCallback(onBroadcastReceiving);
myNet.setOnUnicastReceivingCallback(onUnicastReceiving);
myNet.setOnConfirmReceivingCallback(onConfirmReceiving);
Serial.print("MAC: ");
Serial.print(myNet.getNodeMac());
Serial.print(". IP: ");
Serial.print(myNet.getNodeIp());
Serial.print(". Firmware version: ");
Serial.print(myNet.getFirmwareVersion());
Serial.println(".");
@ -263,7 +196,7 @@ void setup()
void loop()
{
if ((millis() - messagelastTime) > messageTimerDelay)
if ((millis() - messageLastTime) > messageTimerDelay)
{
Serial.println("Broadcast message sended.");
myNet.sendBroadcastMessage("Hello world!");
@ -275,7 +208,7 @@ void loop()
Serial.print(myNet.macToString(target));
Serial.println(" sended.");
myNet.sendUnicastMessage("Hello world!", target, true);
messagelastTime = millis();
messageLastTime = millis();
}
myNet.maintenance();
}

View File

@ -9,26 +9,11 @@ void setup()
{
Serial.begin(115200);
Serial.println();
// *** ESP-NOW mode only.
myNet.setWorkMode(ESP_NOW);
// *** Or ESP-NOW + access point mode.
// myNet.setWorkMode(ESP_NOW_AP);
// myNet.setApSetting("ESP NODE TEST", "12345678");
// *** Or ESP-NOW + connect to your router mode.
// myNet.setWorkMode(ESP_NOW_STA);
// myNet.setStaSetting("SSID", "PASSWORD");
// ***
myNet.setNetName("ZHNetwork"); // Optional.
myNet.setMaxNumberOfAttempts(3); // Optional.
myNet.setMaxWaitingTimeBetweenTransmissions(50); // Optional.
myNet.setMaxWaitingTimeForRoutingInfo(500); // Optional.
myNet.begin();
myNet.begin("ZHNetwork");
myNet.setOnBroadcastReceivingCallback(onBroadcastReceiving);
myNet.setOnUnicastReceivingCallback(onUnicastReceiving);
Serial.print("MAC: ");
Serial.print(myNet.getNodeMac());
Serial.print(". IP: ");
Serial.print(myNet.getNodeIp());
Serial.print(". Firmware version: ");
Serial.print(myNet.getFirmwareVersion());
Serial.println(".");

View File

@ -4,7 +4,7 @@ void onConfirmReceiving(const uint8_t *target, const bool status);
ZHNetwork myNet;
uint64_t messagelastTime{0};
uint64_t messageLastTime{0};
uint16_t messageTimerDelay{5000};
const uint8_t target[6]{0xA8, 0x48, 0xFA, 0xDC, 0x5B, 0xFA};
@ -12,25 +12,10 @@ void setup()
{
Serial.begin(115200);
Serial.println();
// *** ESP-NOW mode only.
myNet.setWorkMode(ESP_NOW);
// *** Or ESP-NOW + access point mode.
// myNet.setWorkMode(ESP_NOW_AP);
// myNet.setApSetting("ESP NODE TEST", "12345678");
// *** Or ESP-NOW + connect to your router mode.
// myNet.setWorkMode(ESP_NOW_STA);
// myNet.setStaSetting("SSID", "PASSWORD");
// ***
myNet.setNetName("ZHNetwork"); // Optional.
myNet.setMaxNumberOfAttempts(3); // Optional.
myNet.setMaxWaitingTimeBetweenTransmissions(50); // Optional.
myNet.setMaxWaitingTimeForRoutingInfo(500); // Optional.
myNet.begin();
myNet.begin("ZHNetwork");
myNet.setOnConfirmReceivingCallback(onConfirmReceiving);
Serial.print("MAC: ");
Serial.print(myNet.getNodeMac());
Serial.print(". IP: ");
Serial.print(myNet.getNodeIp());
Serial.print(". Firmware version: ");
Serial.print(myNet.getFirmwareVersion());
Serial.println(".");
@ -38,7 +23,7 @@ void setup()
void loop()
{
if ((millis() - messagelastTime) > messageTimerDelay)
if ((millis() - messageLastTime) > messageTimerDelay)
{
Serial.println("Broadcast message sended.");
myNet.sendBroadcastMessage("Hello world!");
@ -50,7 +35,7 @@ void loop()
Serial.print(myNet.macToString(target));
Serial.println(" sended.");
myNet.sendUnicastMessage("Hello world!", target, true);
messagelastTime = millis();
messageLastTime = millis();
}
myNet.maintenance();
}

View File

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

View File

@ -31,100 +31,28 @@ ZHNetwork &ZHNetwork::setOnConfirmReceivingCallback(on_confirm_t onConfirmReceiv
return *this;
}
error_code_t ZHNetwork::setWorkMode(const work_mode_t workMode)
{
if (workMode < ESP_NOW || workMode > ESP_NOW_STA)
return ERROR;
workMode_ = workMode;
return SUCCESS;
}
work_mode_t ZHNetwork::getWorkMode()
{
return workMode_;
}
error_code_t ZHNetwork::setNetName(const char *netName)
{
if (strlen(netName) < 1 || strlen(netName) > 20)
return ERROR;
strcpy(netName_, netName);
return SUCCESS;
}
String ZHNetwork::getNetName()
{
return netName_;
}
error_code_t ZHNetwork::setStaSetting(const char *ssid, const char *password)
{
if (strlen(ssid) < 1 || strlen(ssid) > 32 || strlen(password) > 64)
return ERROR;
strcpy(staSsid_, ssid);
strcpy(staPassword_, password);
return SUCCESS;
}
error_code_t ZHNetwork::setApSetting(const char *ssid, const char *password)
{
if (strlen(ssid) < 1 || strlen(ssid) > 32 || strlen(password) < 8 || strlen(password) > 64)
return ERROR;
strcpy(apSsid_, ssid);
strcpy(apPassword_, password);
return SUCCESS;
}
error_code_t ZHNetwork::begin()
error_code_t ZHNetwork::begin(const char *netName, const bool gateway)
{
randomSeed(analogRead(0));
if (strlen(netName) > 1 && strlen(netName) < 20)
strcpy(netName_, netName);
#ifdef PRINT_LOG
Serial.begin(115200);
#endif
switch (workMode_)
{
case ESP_NOW:
WiFi.mode(WIFI_STA);
break;
case ESP_NOW_AP:
WiFi.mode(WIFI_AP_STA);
WiFi.softAP(apSsid_, apPassword_);
break;
case ESP_NOW_STA:
WiFi.mode(WIFI_STA);
WiFi.begin(staSsid_, staPassword_);
while (WiFi.status() != WL_CONNECTED)
{
if (WiFi.status() == WL_NO_SSID_AVAIL || WiFi.status() == WL_CONNECT_FAILED)
return ERROR;
delay(500);
}
break;
default:
break;
}
WiFi.mode(gateway ? WIFI_AP_STA : WIFI_STA);
esp_now_init();
#if defined(ESP8266)
wifi_get_macaddr(STATION_IF, localMAC);
wifi_get_macaddr(gateway ? SOFTAP_IF : STATION_IF, localMAC);
esp_now_set_self_role(ESP_NOW_ROLE_COMBO);
#endif
#if defined(ESP32)
esp_wifi_get_mac((wifi_interface_t)ESP_IF_WIFI_STA, localMAC);
esp_wifi_get_mac(gateway ? (wifi_interface_t)ESP_IF_WIFI_AP : (wifi_interface_t)ESP_IF_WIFI_STA, localMAC);
#endif
esp_now_register_send_cb(onDataSent);
esp_now_register_recv_cb(onDataReceive);
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)
{
broadcastMessage(data, broadcastMAC, BROADCAST);
@ -456,15 +384,6 @@ String ZHNetwork::getNodeMac()
return macToString(localMAC);
}
IPAddress ZHNetwork::getNodeIp()
{
if (workMode_ == ESP_NOW_AP)
return WiFi.softAPIP();
if (workMode_ == ESP_NOW_STA)
return WiFi.localIP();
return IPAddress(0, 0, 0, 0);
}
String ZHNetwork::getFirmwareVersion()
{
return firmware;

View File

@ -50,13 +50,6 @@ typedef struct
uint8_t intermediateTargetMAC[6]{0};
} routing_table_t;
typedef enum
{
ESP_NOW = 1,
ESP_NOW_AP,
ESP_NOW_STA
} work_mode_t;
typedef enum
{
BROADCAST = 1,
@ -87,17 +80,7 @@ public:
ZHNetwork &setOnUnicastReceivingCallback(on_message_t onUnicastReceivingCallback);
ZHNetwork &setOnConfirmReceivingCallback(on_confirm_t onConfirmReceivingCallback);
error_code_t setWorkMode(const work_mode_t workMode);
work_mode_t getWorkMode(void);
error_code_t setNetName(const char *netName);
String getNetName(void);
error_code_t setStaSetting(const char *ssid, const char *password);
error_code_t setApSetting(const char *ssid, const char *password);
error_code_t begin(void);
error_code_t stop(void);
error_code_t begin(const char *netName = "", const bool gateway = false);
void sendBroadcastMessage(const char *data);
void sendUnicastMessage(const char *data, const uint8_t *target, const bool confirm = false);
@ -105,7 +88,6 @@ public:
void maintenance(void);
String getNodeMac(void);
IPAddress getNodeIp(void);
String getFirmwareVersion(void);
String readErrorCode(error_code_t code); // Just for further development.
@ -133,18 +115,13 @@ private:
static uint16_t lastMessageID[10];
static char netName_[20];
const char *firmware{"1.11"};
const char *firmware{"1.31"};
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};
uint32_t lastMessageSentTime{0};
#if defined(ESP8266)
static void onDataSent(uint8_t *mac, uint8_t status);