@alteriom/painlessmesh 1.6.1 → 1.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +380 -143
- package/LICENSE +674 -674
- package/README.md +477 -434
- package/RELEASE_GUIDE.md +504 -418
- package/docs/DOCUMENTATION_MIGRATION_PLAN.md +175 -175
- package/docs/IMPLEMENTATION_PLAN_MESH_TOPOLOGY.md +1062 -0
- package/docs/MESH_TOPOLOGY_GUIDE.md +992 -0
- package/docs/MESH_TOPOLOGY_PROGRESS.md +422 -0
- package/docs/MQTT_BRIDGE_COMMANDS.md +894 -0
- package/docs/MQTT_BRIDGE_IMPLEMENTATION_SUMMARY.md +324 -0
- package/docs/MQTT_COMMAND_SCHEMA_PROPOSAL.md +576 -0
- package/docs/MQTT_SCHEMA_COMPLIANCE.md +285 -0
- package/docs/MQTT_SCHEMA_PROPOSALS.md +446 -0
- package/docs/MQTT_SCHEMA_REVIEW.md +690 -0
- package/docs/OTA_COMMANDS_REFERENCE.md +554 -0
- package/docs/PHASE1_GUIDE.md +349 -0
- package/docs/PHASE2_GUIDE.md +543 -0
- package/docs/README.md +77 -70
- package/docs/SCHEMA_VALIDATION_CHECKLIST.md +222 -0
- package/docs/alteriom/overview.md +507 -507
- package/docs/api/core-api.md +606 -606
- package/docs/architecture/mesh-architecture.md +378 -378
- package/docs/architecture/plugin-system.md +516 -516
- package/docs/getting-started/first-mesh.md +409 -409
- package/docs/getting-started/installation.md +274 -274
- package/docs/getting-started/quickstart.md +157 -157
- package/docs/improvements/FEATURE_PROPOSALS.md +337 -0
- package/docs/improvements/PHASE1_IMPLEMENTATION.md +325 -0
- package/docs/improvements/PHASE2_IMPLEMENTATION.md +567 -0
- package/docs/improvements/README.md +86 -68
- package/docs/improvements/ota-and-status-enhancements.md +911 -0
- package/docs/improvements/ota-status-architecture-diagrams.md +658 -0
- package/docs/improvements/ota-status-quick-reference.md +284 -0
- package/docs/platformio-publishing.md +255 -0
- package/docs/platformio-setup-summary.md +121 -0
- package/docs/troubleshooting/common-issues.md +520 -520
- package/docs/troubleshooting/faq.md +472 -472
- package/docs/tutorials/basic-examples.md +717 -717
- package/docs/wiki/API-Reference.md +245 -245
- package/docs/wiki/Complete-Documentation.md +122 -122
- package/examples/alteriom/README.md +139 -81
- package/examples/alteriom/alteriom.ino +186 -185
- package/examples/alteriom/alteriom_sensor_package.hpp +240 -127
- package/examples/alteriom/platformio.ini +24 -24
- package/examples/alteriomImproved/alteriom_sensor_package.hpp +224 -0
- package/examples/{alteriom → alteriomImproved}/improved_sensor_node.ino +245 -245
- package/examples/alteriomImproved/platformio.ini +25 -0
- package/examples/alteriomPhase1/alteriom_sensor_package.hpp +224 -0
- package/examples/alteriomPhase1/phase1_features.ino +242 -0
- package/examples/alteriomPhase1/platformio.ini +25 -0
- package/examples/alteriomPhase2/alteriom_sensor_package.hpp +224 -0
- package/examples/alteriomPhase2/phase2_features.ino +186 -0
- package/examples/alteriomPhase2/platformio.ini +25 -0
- package/examples/{alteriom → alteriomSensorNode}/alteriom_sensor_node.ino +183 -183
- package/examples/alteriomSensorNode/alteriom_sensor_package.hpp +224 -0
- package/examples/alteriomSensorNode/platformio.ini +25 -0
- package/examples/basic/basic.ino +66 -66
- package/examples/basic/platformio.ini +25 -25
- package/examples/bridge/bridge.ino +51 -51
- package/examples/bridge/mesh_event_publisher.hpp +253 -0
- package/examples/bridge/mesh_topology_reporter.hpp +303 -0
- package/examples/bridge/mqtt_command_bridge.hpp +459 -0
- package/examples/bridge/mqtt_status_bridge.hpp +519 -0
- package/examples/bridge/platformio.ini +25 -25
- package/examples/echoNode/echoNode.ino +33 -33
- package/examples/echoNode/platformio.ini +25 -25
- package/examples/logClient/logClient.ino +109 -109
- package/examples/logClient/platformio.ini +25 -25
- package/examples/logServer/logServer.ino +81 -81
- package/examples/logServer/platformio.ini +25 -25
- package/examples/meshCommandNode/alteriom_sensor_package.hpp +235 -0
- package/examples/meshCommandNode/meshCommandNode.ino +263 -0
- package/examples/meshCommandNode/platformio.ini +25 -0
- package/examples/mqttBridge/mqttBridge.ino +118 -118
- package/examples/mqttBridge/platformio.ini +26 -26
- package/examples/mqttCommandBridge/alteriom_sensor_package.hpp +235 -0
- package/examples/mqttCommandBridge/mesh_event_publisher.hpp +253 -0
- package/examples/mqttCommandBridge/mesh_topology_reporter.hpp +303 -0
- package/examples/mqttCommandBridge/mqttCommandBridge.ino +252 -0
- package/examples/mqttCommandBridge/mqtt_command_bridge.hpp +459 -0
- package/examples/mqttCommandBridge/platformio.ini +26 -0
- package/examples/mqttStatusBridge/mqttStatusBridge.ino +216 -0
- package/examples/mqttStatusBridge/mqtt_status_bridge.hpp +522 -0
- package/examples/mqttStatusBridge/platformio.ini +26 -0
- package/examples/mqttTopologyTest/README.md +467 -0
- package/examples/mqttTopologyTest/mqttTopologyTest.ino +748 -0
- package/examples/mqttTopologyTest/platformio.ini +26 -0
- package/examples/namedMesh/namedMesh.ino +97 -97
- package/examples/namedMesh/platformio.ini +25 -25
- package/examples/otaReceiver/otaReceiver.ino +79 -79
- package/examples/otaReceiver/platformio.ini +25 -25
- package/examples/otaSender/otaSender.ino +160 -151
- package/examples/otaSender/platformio.ini +25 -25
- package/examples/startHere/platformio.ini +25 -25
- package/examples/startHere/startHere.ino +159 -159
- package/examples/webServer/platformio.ini +27 -27
- package/examples/webServer/webServer.ino +89 -89
- package/keywords.txt +48 -48
- package/library.json +55 -34
- package/library.properties +10 -10
- package/package.json +86 -78
- package/src/AlteriomPainlessMesh.h +97 -97
- package/src/arduino/wifi.hpp +365 -365
- package/src/boost/asynctcp.hpp +279 -279
- package/src/painlessMesh.h +70 -70
- package/src/painlessMeshSTA.cpp +236 -236
- package/src/painlessMeshSTA.h +58 -58
- package/src/painlessTaskOptions.h +4 -4
- package/src/painlessmesh/base64.hpp +111 -111
- package/src/painlessmesh/buffer.hpp +229 -229
- package/src/painlessmesh/callback.hpp +91 -91
- package/src/painlessmesh/configuration.hpp +77 -77
- package/src/painlessmesh/connection.hpp +192 -192
- package/src/painlessmesh/layout.hpp +188 -188
- package/src/painlessmesh/logger.hpp +158 -158
- package/src/painlessmesh/memory.hpp +119 -119
- package/src/painlessmesh/mesh.hpp +761 -560
- package/src/painlessmesh/metrics.hpp +322 -322
- package/src/painlessmesh/ntp.hpp +263 -263
- package/src/painlessmesh/ota.hpp +582 -553
- package/src/painlessmesh/plugin.hpp +188 -188
- package/src/painlessmesh/protocol.hpp +813 -813
- package/src/painlessmesh/router.hpp +322 -322
- package/src/painlessmesh/tcp.hpp +71 -71
- package/src/painlessmesh/validation.hpp +238 -238
- package/src/plugin/performance.hpp +214 -214
- package/src/plugin/remote.hpp +64 -64
- package/src/scheduler.cpp +10 -10
- package/src/wifi.cpp +2 -2
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
[platformio]
|
|
2
|
+
src_dir = .
|
|
3
|
+
|
|
4
|
+
[env]
|
|
5
|
+
lib_deps =
|
|
6
|
+
bblanchon/ArduinoJson
|
|
7
|
+
arkhipenko/TaskScheduler
|
|
8
|
+
knolleary/PubSubClient
|
|
9
|
+
|
|
10
|
+
[env:esp8266]
|
|
11
|
+
platform = espressif8266
|
|
12
|
+
board = nodemcuv2
|
|
13
|
+
framework = arduino
|
|
14
|
+
lib_extra_dirs = ../../
|
|
15
|
+
lib_deps =
|
|
16
|
+
${env.lib_deps} ; Inherit common dependencies
|
|
17
|
+
esp32async/ESPAsyncTCP@^2.0.0 ; Only for ESP8266
|
|
18
|
+
|
|
19
|
+
[env:esp32]
|
|
20
|
+
platform = espressif32
|
|
21
|
+
board = esp32dev
|
|
22
|
+
framework = arduino
|
|
23
|
+
lib_extra_dirs = ../../
|
|
24
|
+
lib_deps =
|
|
25
|
+
${env.lib_deps} ; Inherit common dependencies
|
|
26
|
+
esp32async/AsyncTCP
|
|
@@ -1,97 +1,97 @@
|
|
|
1
|
-
//************************************************************
|
|
2
|
-
// this is a simple example that uses the painlessMesh library
|
|
3
|
-
//
|
|
4
|
-
// This example shows how to build a mesh with named nodes using the plugin
|
|
5
|
-
// system
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//************************************************************
|
|
9
|
-
#include <cstdint>
|
|
10
|
-
#include <map>
|
|
11
|
-
#include "Arduino.h"
|
|
12
|
-
#include "painlessMesh.h"
|
|
13
|
-
#include "painlessmesh/plugin.hpp"
|
|
14
|
-
|
|
15
|
-
#define MESH_PREFIX "whateverYouLike"
|
|
16
|
-
#define MESH_PASSWORD "somethingSneaky"
|
|
17
|
-
#define MESH_PORT 5555
|
|
18
|
-
|
|
19
|
-
painlessMesh mesh;
|
|
20
|
-
|
|
21
|
-
// NOTE: various ideas for improvement
|
|
22
|
-
// - Send new names regularly and only send all names sometimes
|
|
23
|
-
// - Keep track of the names the neighbour already knows (when we receive them)
|
|
24
|
-
// and only send unknown names/nodes
|
|
25
|
-
// - Use some kind of bidirectoral map, so both get_name_from_id and
|
|
26
|
-
// get_id_from_name are fast
|
|
27
|
-
|
|
28
|
-
// Send the names you know to your neighbours
|
|
29
|
-
class NamePackage : public painlessmesh::plugin::NeighbourPackage {
|
|
30
|
-
public:
|
|
31
|
-
std::map<TSTRING, uint32_t> names;
|
|
32
|
-
|
|
33
|
-
// Set an id for the package. Id can be any unique int not already in use. The
|
|
34
|
-
// mesh uses the numbers 1..12, so using a number larger than that
|
|
35
|
-
NamePackage() : painlessmesh::plugin::NeighbourPackage(21) {}
|
|
36
|
-
|
|
37
|
-
NamePackage(JsonObject jsonObj)
|
|
38
|
-
: painlessmesh::plugin::NeighbourPackage(jsonObj) {
|
|
39
|
-
for (JsonPair kv : jsonObj) {
|
|
40
|
-
names.insert(std::pair<TSTRING, uint32_t>(kv.key().c_str(), kv.value()));
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
JsonObject addTo(JsonObject&& jsonObj) const {
|
|
45
|
-
jsonObj = painlessmesh::plugin::NeighbourPackage::addTo(std::move(jsonObj));
|
|
46
|
-
for (auto&& kv : names) {
|
|
47
|
-
jsonObj[kv.first] = kv.second;
|
|
48
|
-
}
|
|
49
|
-
return jsonObj;
|
|
50
|
-
}
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
std::map<TSTRING, uint32_t> known_names;
|
|
54
|
-
TSTRING get_name_from_id(uint32_t id) {
|
|
55
|
-
for (auto&& kv : known_names) {
|
|
56
|
-
if (kv.second == id) {
|
|
57
|
-
return kv.first;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
return String(id);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
uint32_t get_id_from_name(TSTRING name) {
|
|
64
|
-
auto it = known_names.find(name);
|
|
65
|
-
return (it != known_names.end()) ? it->second : 0;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
void setup() {
|
|
69
|
-
Serial.begin(115200);
|
|
70
|
-
mesh.setDebugMsgTypes(ERROR | STARTUP);
|
|
71
|
-
|
|
72
|
-
mesh.init(MESH_PREFIX, MESH_PASSWORD, MESH_PORT);
|
|
73
|
-
|
|
74
|
-
auto sendPkg = std::make_shared<NamePackage>();
|
|
75
|
-
sendPkg->names = known_names;
|
|
76
|
-
// Every minute we send the names we know to our neighbours
|
|
77
|
-
mesh.addTask(TASK_MINUTE, TASK_FOREVER, [sendPkg, &mesh]() {
|
|
78
|
-
sendPkg->names = known_names;
|
|
79
|
-
mesh.sendPackage(sendPkg.get());
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
// When we receive a message of the correct type, then insert the names they
|
|
83
|
-
// know into our map of names
|
|
84
|
-
mesh.onPackage(sendPkg->type, [](painlessmesh::protocol::Variant& var) {
|
|
85
|
-
const auto& pkg = var.to<NamePackage>();
|
|
86
|
-
for (auto&& kv : pkg.names) {
|
|
87
|
-
known_names.insert(kv);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
return false;
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
void loop() {
|
|
95
|
-
// it will run the user scheduler as well
|
|
96
|
-
mesh.update();
|
|
97
|
-
}
|
|
1
|
+
//************************************************************
|
|
2
|
+
// this is a simple example that uses the painlessMesh library
|
|
3
|
+
//
|
|
4
|
+
// This example shows how to build a mesh with named nodes using the plugin
|
|
5
|
+
// system
|
|
6
|
+
//
|
|
7
|
+
//
|
|
8
|
+
//************************************************************
|
|
9
|
+
#include <cstdint>
|
|
10
|
+
#include <map>
|
|
11
|
+
#include "Arduino.h"
|
|
12
|
+
#include "painlessMesh.h"
|
|
13
|
+
#include "painlessmesh/plugin.hpp"
|
|
14
|
+
|
|
15
|
+
#define MESH_PREFIX "whateverYouLike"
|
|
16
|
+
#define MESH_PASSWORD "somethingSneaky"
|
|
17
|
+
#define MESH_PORT 5555
|
|
18
|
+
|
|
19
|
+
painlessMesh mesh;
|
|
20
|
+
|
|
21
|
+
// NOTE: various ideas for improvement
|
|
22
|
+
// - Send new names regularly and only send all names sometimes
|
|
23
|
+
// - Keep track of the names the neighbour already knows (when we receive them)
|
|
24
|
+
// and only send unknown names/nodes
|
|
25
|
+
// - Use some kind of bidirectoral map, so both get_name_from_id and
|
|
26
|
+
// get_id_from_name are fast
|
|
27
|
+
|
|
28
|
+
// Send the names you know to your neighbours
|
|
29
|
+
class NamePackage : public painlessmesh::plugin::NeighbourPackage {
|
|
30
|
+
public:
|
|
31
|
+
std::map<TSTRING, uint32_t> names;
|
|
32
|
+
|
|
33
|
+
// Set an id for the package. Id can be any unique int not already in use. The
|
|
34
|
+
// mesh uses the numbers 1..12, so using a number larger than that
|
|
35
|
+
NamePackage() : painlessmesh::plugin::NeighbourPackage(21) {}
|
|
36
|
+
|
|
37
|
+
NamePackage(JsonObject jsonObj)
|
|
38
|
+
: painlessmesh::plugin::NeighbourPackage(jsonObj) {
|
|
39
|
+
for (JsonPair kv : jsonObj) {
|
|
40
|
+
names.insert(std::pair<TSTRING, uint32_t>(kv.key().c_str(), kv.value()));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
JsonObject addTo(JsonObject&& jsonObj) const {
|
|
45
|
+
jsonObj = painlessmesh::plugin::NeighbourPackage::addTo(std::move(jsonObj));
|
|
46
|
+
for (auto&& kv : names) {
|
|
47
|
+
jsonObj[kv.first] = kv.second;
|
|
48
|
+
}
|
|
49
|
+
return jsonObj;
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
std::map<TSTRING, uint32_t> known_names;
|
|
54
|
+
TSTRING get_name_from_id(uint32_t id) {
|
|
55
|
+
for (auto&& kv : known_names) {
|
|
56
|
+
if (kv.second == id) {
|
|
57
|
+
return kv.first;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return String(id);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
uint32_t get_id_from_name(TSTRING name) {
|
|
64
|
+
auto it = known_names.find(name);
|
|
65
|
+
return (it != known_names.end()) ? it->second : 0;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
void setup() {
|
|
69
|
+
Serial.begin(115200);
|
|
70
|
+
mesh.setDebugMsgTypes(ERROR | STARTUP);
|
|
71
|
+
|
|
72
|
+
mesh.init(MESH_PREFIX, MESH_PASSWORD, MESH_PORT);
|
|
73
|
+
|
|
74
|
+
auto sendPkg = std::make_shared<NamePackage>();
|
|
75
|
+
sendPkg->names = known_names;
|
|
76
|
+
// Every minute we send the names we know to our neighbours
|
|
77
|
+
mesh.addTask(TASK_MINUTE, TASK_FOREVER, [sendPkg, &mesh]() {
|
|
78
|
+
sendPkg->names = known_names;
|
|
79
|
+
mesh.sendPackage(sendPkg.get());
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
// When we receive a message of the correct type, then insert the names they
|
|
83
|
+
// know into our map of names
|
|
84
|
+
mesh.onPackage(sendPkg->type, [](painlessmesh::protocol::Variant& var) {
|
|
85
|
+
const auto& pkg = var.to<NamePackage>();
|
|
86
|
+
for (auto&& kv : pkg.names) {
|
|
87
|
+
known_names.insert(kv);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return false;
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
void loop() {
|
|
95
|
+
// it will run the user scheduler as well
|
|
96
|
+
mesh.update();
|
|
97
|
+
}
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
[platformio]
|
|
2
|
-
src_dir = .
|
|
3
|
-
|
|
4
|
-
[env]
|
|
5
|
-
lib_deps =
|
|
6
|
-
bblanchon/ArduinoJson
|
|
7
|
-
arkhipenko/TaskScheduler
|
|
8
|
-
|
|
9
|
-
[env:esp8266]
|
|
10
|
-
platform = espressif8266
|
|
11
|
-
board = nodemcuv2
|
|
12
|
-
framework = arduino
|
|
13
|
-
lib_extra_dirs = ../../
|
|
14
|
-
lib_deps =
|
|
15
|
-
${env.lib_deps} ; Inherit common dependencies
|
|
16
|
-
esp32async/ESPAsyncTCP ; Only for ESP8266
|
|
17
|
-
|
|
18
|
-
[env:esp32]
|
|
19
|
-
platform = espressif32
|
|
20
|
-
board = esp32dev
|
|
21
|
-
framework = arduino
|
|
22
|
-
lib_extra_dirs = ../../
|
|
23
|
-
lib_deps =
|
|
24
|
-
${env.lib_deps} ; Inherit common dependencies
|
|
25
|
-
esp32async/AsyncTCP
|
|
1
|
+
[platformio]
|
|
2
|
+
src_dir = .
|
|
3
|
+
|
|
4
|
+
[env]
|
|
5
|
+
lib_deps =
|
|
6
|
+
bblanchon/ArduinoJson
|
|
7
|
+
arkhipenko/TaskScheduler
|
|
8
|
+
|
|
9
|
+
[env:esp8266]
|
|
10
|
+
platform = espressif8266
|
|
11
|
+
board = nodemcuv2
|
|
12
|
+
framework = arduino
|
|
13
|
+
lib_extra_dirs = ../../
|
|
14
|
+
lib_deps =
|
|
15
|
+
${env.lib_deps} ; Inherit common dependencies
|
|
16
|
+
esp32async/ESPAsyncTCP ; Only for ESP8266
|
|
17
|
+
|
|
18
|
+
[env:esp32]
|
|
19
|
+
platform = espressif32
|
|
20
|
+
board = esp32dev
|
|
21
|
+
framework = arduino
|
|
22
|
+
lib_extra_dirs = ../../
|
|
23
|
+
lib_deps =
|
|
24
|
+
${env.lib_deps} ; Inherit common dependencies
|
|
25
|
+
esp32async/AsyncTCP
|
|
@@ -1,79 +1,79 @@
|
|
|
1
|
-
//************************************************************
|
|
2
|
-
// this is a simple example that uses the painlessMesh library
|
|
3
|
-
//
|
|
4
|
-
// 1. sends a silly message to every node on the mesh at a random time between 1
|
|
5
|
-
// and 5 seconds
|
|
6
|
-
// 2. prints anything it receives to Serial.print
|
|
7
|
-
// 3. has OTA support and can be updated remotely
|
|
8
|
-
//
|
|
9
|
-
//************************************************************
|
|
10
|
-
#include "painlessMesh.h"
|
|
11
|
-
|
|
12
|
-
#define MESH_PREFIX "whateverYouLike"
|
|
13
|
-
#define MESH_PASSWORD "somethingSneaky"
|
|
14
|
-
#define MESH_PORT 5555
|
|
15
|
-
|
|
16
|
-
Scheduler userScheduler; // to control your personal task
|
|
17
|
-
painlessMesh mesh;
|
|
18
|
-
|
|
19
|
-
// User stub
|
|
20
|
-
void sendMessage(); // Prototype so PlatformIO doesn't complain
|
|
21
|
-
|
|
22
|
-
Task taskSendMessage(TASK_SECOND * 1, TASK_FOREVER, &sendMessage);
|
|
23
|
-
|
|
24
|
-
void sendMessage() {
|
|
25
|
-
String msg = "Hello from node ";
|
|
26
|
-
msg += mesh.getNodeId();
|
|
27
|
-
mesh.sendBroadcast(msg);
|
|
28
|
-
taskSendMessage.setInterval(random(TASK_SECOND * 1, TASK_SECOND * 5));
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// Needed for painless library
|
|
32
|
-
void receivedCallback(uint32_t from, String &msg) {
|
|
33
|
-
Serial.printf("startHere: Received from %u msg=%s\n", from, msg.c_str());
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
void newConnectionCallback(uint32_t nodeId) {
|
|
37
|
-
Serial.printf("--> startHere: New Connection, nodeId = %u\n", nodeId);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
void changedConnectionCallback() { Serial.printf("Changed connections\n"); }
|
|
41
|
-
|
|
42
|
-
void nodeTimeAdjustedCallback(int32_t offset) {
|
|
43
|
-
Serial.printf("Adjusted time %u. Offset = %d\n", mesh.getNodeTime(), offset);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
void setup() {
|
|
47
|
-
Serial.begin(115200);
|
|
48
|
-
|
|
49
|
-
// mesh.setDebugMsgTypes( ERROR | MESH_STATUS | CONNECTION | SYNC |
|
|
50
|
-
// COMMUNICATION | GENERAL | MSG_TYPES | REMOTE ); // all types on
|
|
51
|
-
mesh.setDebugMsgTypes(
|
|
52
|
-
ERROR | STARTUP |
|
|
53
|
-
DEBUG); // set before init() so that you can see startup messages
|
|
54
|
-
|
|
55
|
-
mesh.init(MESH_PREFIX, MESH_PASSWORD, &userScheduler, MESH_PORT);
|
|
56
|
-
mesh.onReceive(&receivedCallback);
|
|
57
|
-
mesh.onNewConnection(&newConnectionCallback);
|
|
58
|
-
mesh.onChangedConnections(&changedConnectionCallback);
|
|
59
|
-
mesh.onNodeTimeAdjusted(&nodeTimeAdjustedCallback);
|
|
60
|
-
|
|
61
|
-
// if you want your node to accept OTA firmware, simply include this line
|
|
62
|
-
// with whatever role you want your hardware to be. For instance, a
|
|
63
|
-
// mesh network may have a thermometer, rain detector, and bridge. Each of
|
|
64
|
-
// those may require different firmware, so different roles are preferrable.
|
|
65
|
-
//
|
|
66
|
-
// MAKE SURE YOUR UPLOADED OTA FIRMWARE INCLUDES OTA SUPPORT OR YOU WILL LOSE
|
|
67
|
-
// THE ABILITY TO UPLOAD MORE FIRMWARE OVER OTA. YOU ALSO WANT TO MAKE SURE
|
|
68
|
-
// THE ROLES ARE CORRECT
|
|
69
|
-
mesh.initOTAReceive("otareceiver");
|
|
70
|
-
mesh.setContainsRoot(true);
|
|
71
|
-
|
|
72
|
-
userScheduler.addTask(taskSendMessage);
|
|
73
|
-
taskSendMessage.enable();
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
void loop() {
|
|
77
|
-
// it will run the user scheduler as well
|
|
78
|
-
mesh.update();
|
|
79
|
-
}
|
|
1
|
+
//************************************************************
|
|
2
|
+
// this is a simple example that uses the painlessMesh library
|
|
3
|
+
//
|
|
4
|
+
// 1. sends a silly message to every node on the mesh at a random time between 1
|
|
5
|
+
// and 5 seconds
|
|
6
|
+
// 2. prints anything it receives to Serial.print
|
|
7
|
+
// 3. has OTA support and can be updated remotely
|
|
8
|
+
//
|
|
9
|
+
//************************************************************
|
|
10
|
+
#include "painlessMesh.h"
|
|
11
|
+
|
|
12
|
+
#define MESH_PREFIX "whateverYouLike"
|
|
13
|
+
#define MESH_PASSWORD "somethingSneaky"
|
|
14
|
+
#define MESH_PORT 5555
|
|
15
|
+
|
|
16
|
+
Scheduler userScheduler; // to control your personal task
|
|
17
|
+
painlessMesh mesh;
|
|
18
|
+
|
|
19
|
+
// User stub
|
|
20
|
+
void sendMessage(); // Prototype so PlatformIO doesn't complain
|
|
21
|
+
|
|
22
|
+
Task taskSendMessage(TASK_SECOND * 1, TASK_FOREVER, &sendMessage);
|
|
23
|
+
|
|
24
|
+
void sendMessage() {
|
|
25
|
+
String msg = "Hello from node ";
|
|
26
|
+
msg += mesh.getNodeId();
|
|
27
|
+
mesh.sendBroadcast(msg);
|
|
28
|
+
taskSendMessage.setInterval(random(TASK_SECOND * 1, TASK_SECOND * 5));
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Needed for painless library
|
|
32
|
+
void receivedCallback(uint32_t from, String &msg) {
|
|
33
|
+
Serial.printf("startHere: Received from %u msg=%s\n", from, msg.c_str());
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
void newConnectionCallback(uint32_t nodeId) {
|
|
37
|
+
Serial.printf("--> startHere: New Connection, nodeId = %u\n", nodeId);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
void changedConnectionCallback() { Serial.printf("Changed connections\n"); }
|
|
41
|
+
|
|
42
|
+
void nodeTimeAdjustedCallback(int32_t offset) {
|
|
43
|
+
Serial.printf("Adjusted time %u. Offset = %d\n", mesh.getNodeTime(), offset);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
void setup() {
|
|
47
|
+
Serial.begin(115200);
|
|
48
|
+
|
|
49
|
+
// mesh.setDebugMsgTypes( ERROR | MESH_STATUS | CONNECTION | SYNC |
|
|
50
|
+
// COMMUNICATION | GENERAL | MSG_TYPES | REMOTE ); // all types on
|
|
51
|
+
mesh.setDebugMsgTypes(
|
|
52
|
+
ERROR | STARTUP |
|
|
53
|
+
DEBUG); // set before init() so that you can see startup messages
|
|
54
|
+
|
|
55
|
+
mesh.init(MESH_PREFIX, MESH_PASSWORD, &userScheduler, MESH_PORT);
|
|
56
|
+
mesh.onReceive(&receivedCallback);
|
|
57
|
+
mesh.onNewConnection(&newConnectionCallback);
|
|
58
|
+
mesh.onChangedConnections(&changedConnectionCallback);
|
|
59
|
+
mesh.onNodeTimeAdjusted(&nodeTimeAdjustedCallback);
|
|
60
|
+
|
|
61
|
+
// if you want your node to accept OTA firmware, simply include this line
|
|
62
|
+
// with whatever role you want your hardware to be. For instance, a
|
|
63
|
+
// mesh network may have a thermometer, rain detector, and bridge. Each of
|
|
64
|
+
// those may require different firmware, so different roles are preferrable.
|
|
65
|
+
//
|
|
66
|
+
// MAKE SURE YOUR UPLOADED OTA FIRMWARE INCLUDES OTA SUPPORT OR YOU WILL LOSE
|
|
67
|
+
// THE ABILITY TO UPLOAD MORE FIRMWARE OVER OTA. YOU ALSO WANT TO MAKE SURE
|
|
68
|
+
// THE ROLES ARE CORRECT
|
|
69
|
+
mesh.initOTAReceive("otareceiver");
|
|
70
|
+
mesh.setContainsRoot(true);
|
|
71
|
+
|
|
72
|
+
userScheduler.addTask(taskSendMessage);
|
|
73
|
+
taskSendMessage.enable();
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
void loop() {
|
|
77
|
+
// it will run the user scheduler as well
|
|
78
|
+
mesh.update();
|
|
79
|
+
}
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
[platformio]
|
|
2
|
-
src_dir = .
|
|
3
|
-
|
|
4
|
-
[env]
|
|
5
|
-
lib_deps =
|
|
6
|
-
bblanchon/ArduinoJson
|
|
7
|
-
arkhipenko/TaskScheduler
|
|
8
|
-
|
|
9
|
-
[env:esp8266]
|
|
10
|
-
platform = espressif8266
|
|
11
|
-
board = nodemcuv2
|
|
12
|
-
framework = arduino
|
|
13
|
-
lib_extra_dirs = ../../
|
|
14
|
-
lib_deps =
|
|
15
|
-
${env.lib_deps} ; Inherit common dependencies
|
|
16
|
-
esp32async/ESPAsyncTCP ; Only for ESP8266
|
|
17
|
-
|
|
18
|
-
[env:esp32]
|
|
19
|
-
platform = espressif32
|
|
20
|
-
board = esp32dev
|
|
21
|
-
framework = arduino
|
|
22
|
-
lib_extra_dirs = ../../
|
|
23
|
-
lib_deps =
|
|
24
|
-
${env.lib_deps} ; Inherit common dependencies
|
|
25
|
-
esp32async/AsyncTCP
|
|
1
|
+
[platformio]
|
|
2
|
+
src_dir = .
|
|
3
|
+
|
|
4
|
+
[env]
|
|
5
|
+
lib_deps =
|
|
6
|
+
bblanchon/ArduinoJson
|
|
7
|
+
arkhipenko/TaskScheduler
|
|
8
|
+
|
|
9
|
+
[env:esp8266]
|
|
10
|
+
platform = espressif8266
|
|
11
|
+
board = nodemcuv2
|
|
12
|
+
framework = arduino
|
|
13
|
+
lib_extra_dirs = ../../
|
|
14
|
+
lib_deps =
|
|
15
|
+
${env.lib_deps} ; Inherit common dependencies
|
|
16
|
+
esp32async/ESPAsyncTCP ; Only for ESP8266
|
|
17
|
+
|
|
18
|
+
[env:esp32]
|
|
19
|
+
platform = espressif32
|
|
20
|
+
board = esp32dev
|
|
21
|
+
framework = arduino
|
|
22
|
+
lib_extra_dirs = ../../
|
|
23
|
+
lib_deps =
|
|
24
|
+
${env.lib_deps} ; Inherit common dependencies
|
|
25
|
+
esp32async/AsyncTCP
|