Compare commits
9 Commits
Author | SHA1 | Date | |
---|---|---|---|
62acd2a386 | |||
506acf1fc0 | |||
b328ad916c | |||
1d5198e0ab | |||
aae51f907c | |||
8942471c6f | |||
c1fe139756 | |||
4f58a04eae | |||
2ed860b78b |
89
README.md
89
README.md
@ -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,60 +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();
|
||||
myNet.begin("ZHNetwork");
|
||||
myNet.begin("ZHNetwork", true); // Gateway mode.
|
||||
```
|
||||
|
||||
### Sends broadcast message to all nodes
|
||||
@ -143,12 +103,6 @@ myNet.maintenance();
|
||||
myNet.getNodeMac();
|
||||
```
|
||||
|
||||
### Gets node IP address
|
||||
|
||||
```cpp
|
||||
myNet.getNodeIp();
|
||||
```
|
||||
|
||||
### Gets version of this library
|
||||
|
||||
```cpp
|
||||
@ -221,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};
|
||||
|
||||
@ -229,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(".");
|
||||
@ -257,7 +196,7 @@ void setup()
|
||||
|
||||
void loop()
|
||||
{
|
||||
if ((millis() - messagelastTime) > messageTimerDelay)
|
||||
if ((millis() - messageLastTime) > messageTimerDelay)
|
||||
{
|
||||
Serial.println("Broadcast message sended.");
|
||||
myNet.sendBroadcastMessage("Hello world!");
|
||||
@ -269,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();
|
||||
}
|
||||
|
@ -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(".");
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
name=ZHNetwork
|
||||
version=1.02
|
||||
version=1.31
|
||||
author=Alexey Zholtikov
|
||||
maintainer=Alexey Zholtikov
|
||||
sentence=ESP-NOW based Mesh network for ESP8266/ESP32
|
||||
|
@ -1,31 +1,17 @@
|
||||
#include "ZHNetwork.h"
|
||||
|
||||
routing_vector_t routingVector;
|
||||
incoming_queue_t queueForIncomingData;
|
||||
outgoing_queue_t queueForOutgoingData;
|
||||
waiting_queue_t queueForRoutingVectorWaiting;
|
||||
routing_vector_t ZHNetwork::routingVector;
|
||||
incoming_queue_t ZHNetwork::queueForIncomingData;
|
||||
outgoing_queue_t ZHNetwork::queueForOutgoingData;
|
||||
waiting_queue_t ZHNetwork::queueForRoutingVectorWaiting;
|
||||
|
||||
const char *firmware PROGMEM{"1.02"};
|
||||
const uint8_t broadcastMAC[6]{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
|
||||
|
||||
bool criticalProcessSemaphore{false};
|
||||
bool sentMessageSemaphore{false};
|
||||
bool confirmReceivingSemaphore{false};
|
||||
bool confirmReceiving{false};
|
||||
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};
|
||||
bool ZHNetwork::criticalProcessSemaphore{false};
|
||||
bool ZHNetwork::sentMessageSemaphore{false};
|
||||
bool ZHNetwork::confirmReceivingSemaphore{false};
|
||||
bool ZHNetwork::confirmReceiving{false};
|
||||
char ZHNetwork::netName_[20]{0};
|
||||
uint8_t ZHNetwork::localMAC[6]{0};
|
||||
uint16_t ZHNetwork::lastMessageID[10]{0};
|
||||
|
||||
ZHNetwork &ZHNetwork::setOnBroadcastReceivingCallback(on_message_t onBroadcastReceivingCallback)
|
||||
{
|
||||
@ -45,85 +31,22 @@ 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);
|
||||
@ -461,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;
|
||||
|
@ -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,16 +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 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);
|
||||
@ -104,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.
|
||||
|
||||
@ -119,6 +102,27 @@ public:
|
||||
uint16_t getMaxWaitingTimeForRoutingInfo(void);
|
||||
|
||||
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.31"};
|
||||
const uint8_t broadcastMAC[6]{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
|
||||
uint8_t maxNumberOfAttempts_{3};
|
||||
uint8_t maxWaitingTimeBetweenTransmissions_{50};
|
||||
uint8_t numberOfAttemptsToSend{1};
|
||||
uint16_t maxTimeForRoutingInfoWaiting_{500};
|
||||
uint32_t lastMessageSentTime{0};
|
||||
|
||||
#if defined(ESP8266)
|
||||
static void onDataSent(uint8_t *mac, uint8_t status);
|
||||
static void onDataReceive(uint8_t *mac, uint8_t *data, uint8_t length);
|
||||
|
Reference in New Issue
Block a user