@alteriom/painlessmesh 1.8.14 → 1.9.0
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/BRIDGE_TO_INTERNET.md +229 -0
- package/CHANGELOG.md +89 -1
- package/CONTRIBUTING.md +79 -0
- package/README.md +70 -143
- package/docs/README.md +1 -0
- package/docs/api/shared-gateway.md +1207 -0
- package/docs/troubleshooting/common-issues.md +28 -0
- package/docs/troubleshooting/faq.md +113 -12
- package/examples/basic/test/simulator/CMakeLists.txt +40 -0
- package/examples/basic/test/simulator/README.md +149 -0
- package/examples/basic/test/simulator/firmware/basic_firmware.hpp +117 -0
- package/examples/basic/test/simulator/scenarios/basic_mesh_test.yaml +81 -0
- package/examples/bridge/bridge.ino +17 -4
- package/examples/bridge_failover/README.md +81 -0
- package/examples/bridge_failover/bridge_failover.ino +51 -6
- package/examples/sharedGateway/README.md +235 -0
- package/examples/{meshCommandNode → sharedGateway}/platformio.ini +3 -2
- package/examples/sharedGateway/sharedGateway.ino +303 -0
- package/library.json +3 -22
- package/library.properties +1 -1
- package/package.json +3 -3
- package/src/arduino/wifi.hpp +380 -13
- package/src/painlessmesh/gateway.hpp +2120 -0
- package/src/painlessmesh/mesh.hpp +1034 -6
- package/src/painlessmesh/message_tracker.hpp +311 -0
- package/src/painlessmesh/protocol.hpp +6 -0
- package/DOCUMENTATION_INDEX.md +0 -146
- package/docs/API_DESIGN_GUIDELINES.md +0 -414
- package/docs/ARDUINO_LIBRARY_MANAGER_SUBMISSION.md +0 -331
- package/docs/BOOLEAN_NAMING_CONVENTION.md +0 -235
- package/docs/BRIDGE_FAILOVER.md +0 -512
- package/docs/BRIDGE_HEALTH_MONITORING.md +0 -293
- package/docs/CHANNEL_SYNCHRONIZATION.md +0 -209
- package/docs/CREATE_MISSING_RELEASES.md +0 -321
- package/docs/DOCUMENTATION_MIGRATION_PLAN.md +0 -176
- package/docs/FAQ_VERSION_NUMBERS.md +0 -152
- package/docs/IMPLEMENTATION_PLAN_MESH_TOPOLOGY.md +0 -1062
- package/docs/MESH_TOPOLOGY_GUIDE.md +0 -992
- package/docs/MESH_TOPOLOGY_PROGRESS.md +0 -422
- package/docs/MQTT_BRIDGE_COMMANDS.md +0 -894
- package/docs/MQTT_BRIDGE_IMPLEMENTATION_SUMMARY.md +0 -324
- package/docs/MQTT_COMMAND_SCHEMA_PROPOSAL.md +0 -576
- package/docs/MQTT_SCHEMA_COMPLIANCE.md +0 -340
- package/docs/MQTT_SCHEMA_PROPOSALS.md +0 -446
- package/docs/MQTT_SCHEMA_REVIEW.md +0 -690
- package/docs/OTA_COMMANDS_REFERENCE.md +0 -554
- package/docs/PHASE1_GUIDE.md +0 -349
- package/docs/PHASE2_GUIDE.md +0 -543
- package/docs/QUICK_REFERENCE_VERSIONING.md +0 -127
- package/docs/RELEASE_AGENT_SUMMARY.md +0 -386
- package/docs/SCHEMA_VALIDATION_CHECKLIST.md +0 -222
- package/docs/VERSION_MANAGEMENT.md +0 -213
- package/docs/archive/DOCUSAURUS_DEPLOYMENT.md +0 -166
- package/docs/archive/FEATURE_PROPOSALS.md +0 -337
- package/docs/archive/LIBRARY_JSON_FIX.md +0 -98
- package/docs/archive/LIBRARY_STRUCTURE_FIX.md +0 -215
- package/docs/archive/PHASE1_IMPLEMENTATION.md +0 -325
- package/docs/archive/PHASE2_IMPLEMENTATION.md +0 -567
- package/docs/archive/RELEASE_SUMMARY.md +0 -173
- package/docs/archive/SCONS_BUILD_FIX.md +0 -313
- package/docs/archive/TRIGGER_RELEASE.md +0 -280
- package/docs/archive/VECTOR_INCLUDE_FIX.md +0 -129
- package/docs/archive/ota-and-status-enhancements.md +0 -911
- package/docs/archive/ota-status-architecture-diagrams.md +0 -658
- package/docs/archive/ota-status-quick-reference.md +0 -284
- package/docs/design/.gitkeep +0 -1
- package/docs/design/STATION_CREDENTIALS_DESIGN.md +0 -182
- package/docs/development/ARDUINO_COMPLIANCE_SUMMARY.md +0 -71
- package/docs/development/CODE_REFACTORING_RECOMMENDATIONS.md +0 -1011
- package/docs/development/DOCKER_TESTING.md +0 -196
- package/docs/development/PLATFORMIO_USAGE.md +0 -180
- package/docs/development/TESTING_SUMMARY.md +0 -126
- package/docs/development/contributing.md +0 -301
- package/docs/development/documentation.md +0 -583
- package/docs/features/DIAGNOSTICS_API.md +0 -534
- package/docs/implementation/BRIDGE_ARCHITECTURE_IMPLEMENTATION.md +0 -340
- package/docs/implementation/BRIDGE_HEALTH_MONITORING_IMPLEMENTATION.md +0 -213
- package/docs/implementation/BRIDGE_STATUS_FEATURE.md +0 -635
- package/docs/implementation/DIAGNOSTICS_API_IMPLEMENTATION.md +0 -232
- package/docs/implementation/IMPLEMENTATION_COMPLETE.md +0 -228
- package/docs/implementation/IMPLEMENTATION_NTP_TIME_SYNC.md +0 -325
- package/docs/implementation/IMPLEMENTATION_SUMMARY.md +0 -316
- package/docs/implementation/MESSAGE_QUEUE_IMPLEMENTATION.md +0 -405
- package/docs/implementation/MULTI_BRIDGE_IMPLEMENTATION.md +0 -520
- package/docs/implementation/NTP_TIME_SYNC_FEATURE.md +0 -392
- package/docs/improvements/FUTURE_PROPOSALS.md +0 -1016
- package/docs/improvements/IMPLEMENTATION_HISTORY.md +0 -1091
- package/docs/improvements/OTA_STATUS_ENHANCEMENTS.md +0 -709
- package/docs/improvements/README.md +0 -212
- package/docs/internal/CUSTOM_AGENT_ANALYSIS.md +0 -391
- package/docs/internal/ISSUE_65_VERIFICATION.md +0 -947
- package/docs/internal/ISSUE_66_CLOSURE.md +0 -249
- package/docs/internal/ISSUE_66_STATUS.md +0 -316
- package/docs/internal/PR_SUMMARY.md +0 -315
- package/docs/internal/REVIEW_SUMMARY.md +0 -332
- package/docs/multi-bridge-setup.md +0 -1025
- package/docs/platformio-publishing.md +0 -255
- package/docs/platformio-setup-summary.md +0 -121
- package/docs/releases/ANNOUNCEMENT_v1.8.6.md +0 -63
- package/docs/releases/ANNOUNCEMENT_v1.8.7.md +0 -113
- package/docs/releases/BRIDGE_STATUS_SELF_REGISTRATION_FIX.md +0 -221
- package/docs/releases/FEATURE_HISTORY.md +0 -543
- package/docs/releases/GITHUB_RELEASE_v1.8.6.md +0 -71
- package/docs/releases/GITHUB_RELEASE_v1.8.7.md +0 -90
- package/docs/releases/PATCH_v1.7.2.md +0 -262
- package/docs/releases/PATCH_v1.7.3.md +0 -262
- package/docs/releases/PATCH_v1.7.4.md +0 -219
- package/docs/releases/PHASE1_SUMMARY.md +0 -246
- package/docs/releases/PHASE2_SUMMARY.md +0 -499
- package/docs/releases/PUBLISH_v1.8.0_INSTRUCTIONS.md +0 -163
- package/docs/releases/QUICK_START_RELEASES.md +0 -113
- package/docs/releases/RELEASE_CHECKLIST_1.8.10.md +0 -331
- package/docs/releases/RELEASE_CHECKLIST_1.8.9.md +0 -207
- package/docs/releases/RELEASE_CHECKLIST_v1.7.4.md +0 -253
- package/docs/releases/RELEASE_CHECKLIST_v1.7.5.md +0 -315
- package/docs/releases/RELEASE_CHECKLIST_v1.7.6.md +0 -389
- package/docs/releases/RELEASE_CHECKLIST_v1.8.0.md +0 -331
- package/docs/releases/RELEASE_CHECKLIST_v1.8.2.md +0 -309
- package/docs/releases/RELEASE_NOTES_1.7.0.md +0 -539
- package/docs/releases/RELEASE_NOTES_1.8.10.md +0 -239
- package/docs/releases/RELEASE_NOTES_1.8.9.md +0 -213
- package/docs/releases/RELEASE_NOTES_v1.8.0.md +0 -685
- package/docs/releases/RELEASE_NOTES_v1.8.1.md +0 -221
- package/docs/releases/RELEASE_NOTES_v1.8.2.md +0 -421
- package/docs/releases/RELEASE_NOTES_v1.8.3.md +0 -292
- package/docs/releases/RELEASE_NOTES_v1.8.4.md +0 -277
- package/docs/releases/RELEASE_NOTES_v1.8.6.md +0 -205
- package/docs/releases/RELEASE_NOTES_v1.8.7.md +0 -184
- package/docs/releases/RELEASE_PLAN_v1.7.6.md +0 -816
- package/docs/releases/RELEASE_SUMMARY_1.8.10.md +0 -193
- package/docs/releases/RELEASE_SUMMARY_v1.7.4.md +0 -276
- package/docs/releases/RELEASE_SUMMARY_v1.7.5.md +0 -322
- package/docs/releases/RELEASE_SUMMARY_v1.7.6.md +0 -436
- package/docs/releases/RELEASE_SUMMARY_v1.7.7.md +0 -391
- package/docs/releases/RELEASE_SUMMARY_v1.7.8.md +0 -523
- package/docs/releases/RELEASE_SUMMARY_v1.7.9.md +0 -542
- package/docs/troubleshooting/ARDUINO_IDE_VERSION_FIX_SUMMARY.md +0 -229
- package/docs/troubleshooting/ARDUINO_LIBRARY_NAME_FIX.md +0 -197
- package/docs/troubleshooting/CRASH_QUICK_REF.md +0 -93
- package/docs/troubleshooting/ESP32_C6_COMPATIBILITY.md +0 -157
- package/docs/troubleshooting/FREERTOS_ASSERTION_FAILURE.md +0 -288
- package/docs/troubleshooting/FREERTOS_FIX_IMPLEMENTATION.md +0 -267
- package/docs/troubleshooting/NPM_PUBLISHING_ISSUE_SUMMARY.md +0 -110
- package/docs/troubleshooting/PAINLESSMESH_V1.7.4_COMPILATION_ISSUES.md +0 -547
- package/docs/troubleshooting/QUICK_FIX_FREERTOS.md +0 -164
- package/docs/troubleshooting/SENSOR_NODE_CONNECTION_CRASH.md +0 -264
- package/docs/troubleshooting/station-reconnection-issues.md +0 -172
- package/docs/v1.7.7_MQTT_IMPROVEMENTS.md +0 -794
- package/docs/wiki/API-Reference.md +0 -246
- package/docs/wiki/Complete-Documentation.md +0 -123
- package/examples/alteriomImproved/alteriom_sensor_package.hpp +0 -224
- package/examples/alteriomImproved/improved_sensor_node.ino +0 -248
- package/examples/alteriomImproved/platformio.ini +0 -32
- package/examples/alteriomMetricsHealth/alteriom_sensor_package.hpp +0 -796
- package/examples/alteriomMetricsHealth/metrics_health_node.ino +0 -429
- package/examples/alteriomMetricsHealth/platformio.ini +0 -26
- package/examples/alteriomPhase1/alteriom_sensor_package.hpp +0 -224
- package/examples/alteriomPhase1/phase1_features.ino +0 -242
- package/examples/alteriomPhase1/platformio.ini +0 -26
- package/examples/alteriomPhase2/alteriom_sensor_package.hpp +0 -224
- package/examples/alteriomPhase2/phase2_features.ino +0 -186
- package/examples/alteriomPhase2/platformio.ini +0 -26
- package/examples/alteriomSensorNode/alteriom_sensor_node.ino +0 -186
- package/examples/alteriomSensorNode/alteriom_sensor_package.hpp +0 -1227
- package/examples/alteriomSensorNode/platformio.ini +0 -26
- package/examples/bridge/alteriom_sensor_package.hpp +0 -1170
- package/examples/bridge/bridge_health_monitoring_example.ino +0 -188
- package/examples/bridge/enhanced_mqtt_bridge.hpp +0 -610
- package/examples/bridge/enhanced_mqtt_bridge_example.ino +0 -226
- package/examples/bridge/mesh_event_publisher.hpp +0 -253
- package/examples/bridge/mesh_topology_reporter.hpp +0 -303
- package/examples/bridge/mqtt_command_bridge.hpp +0 -459
- package/examples/bridge/mqtt_status_bridge.hpp +0 -519
- package/examples/bridgeAwareSensorNode/alteriom_sensor_package.hpp +0 -1227
- package/examples/bridgeAwareSensorNode/bridgeAwareSensorNode.ino +0 -342
- package/examples/bridgeAwareSensorNode/platformio.ini +0 -26
- package/examples/diagnosticsExample/diagnosticsExample.ino +0 -171
- package/examples/diagnosticsExample/platformio.ini +0 -26
- package/examples/echoNode/echoNode.ino +0 -33
- package/examples/echoNode/platformio.ini +0 -26
- package/examples/meshCommandNode/alteriom_sensor_package.hpp +0 -235
- package/examples/meshCommandNode/meshCommandNode.ino +0 -265
- package/examples/mqttCommandBridge/alteriom_sensor_package.hpp +0 -235
- package/examples/mqttCommandBridge/mesh_event_publisher.hpp +0 -253
- package/examples/mqttCommandBridge/mesh_topology_reporter.hpp +0 -303
- package/examples/mqttCommandBridge/mqttCommandBridge.ino +0 -254
- package/examples/mqttCommandBridge/mqtt_command_bridge.hpp +0 -462
- package/examples/mqttCommandBridge/platformio.ini +0 -27
- package/examples/mqttStatusBridge/mqttStatusBridge.ino +0 -218
- package/examples/mqttStatusBridge/mqtt_status_bridge.hpp +0 -522
- package/examples/mqttStatusBridge/platformio.ini +0 -27
- package/examples/mqttTopologyTest/README.md +0 -467
- package/examples/mqttTopologyTest/mqttTopologyTest.ino +0 -754
- package/examples/mqttTopologyTest/platformio.ini +0 -27
- package/examples/multi_bridge/README.md +0 -346
- package/examples/multi_bridge/primary_bridge.ino +0 -96
- package/examples/multi_bridge/regular_node.ino +0 -141
- package/examples/multi_bridge/secondary_bridge.ino +0 -111
- package/examples/ntpTimeSyncBridge/alteriom_sensor_package.hpp +0 -1383
- package/examples/ntpTimeSyncBridge/ntpTimeSyncBridge.ino +0 -86
- package/examples/ntpTimeSyncNode/alteriom_sensor_package.hpp +0 -1383
- package/examples/ntpTimeSyncNode/ntpTimeSyncNode.ino +0 -109
- package/examples/queued_alarms/README.md +0 -390
- package/examples/queued_alarms/queued_alarms.ino +0 -265
- package/examples/routing_demo/README.md +0 -172
- package/examples/routing_demo/routing_demo.ino +0 -102
- package/examples/rtcIntegration/README.md +0 -294
- package/examples/rtcIntegration/rtcIntegration.ino +0 -210
|
@@ -1,265 +0,0 @@
|
|
|
1
|
-
//************************************************************
|
|
2
|
-
// Queued Alarms Example - Message Queueing for Offline Mode
|
|
3
|
-
//
|
|
4
|
-
// Demonstrates priority-based message queueing for critical alarms
|
|
5
|
-
// when Internet connection is unavailable. Perfect for IoT systems
|
|
6
|
-
// that cannot afford to lose critical data.
|
|
7
|
-
//
|
|
8
|
-
// Use Case: Fish farm dissolved oxygen monitoring
|
|
9
|
-
// - CRITICAL alarms (low O2) must never be lost
|
|
10
|
-
// - Queue messages during Internet outages
|
|
11
|
-
// - Automatic delivery when connection restored
|
|
12
|
-
//
|
|
13
|
-
// Hardware: ESP32 or ESP8266
|
|
14
|
-
//************************************************************
|
|
15
|
-
|
|
16
|
-
#include "painlessMesh.h"
|
|
17
|
-
|
|
18
|
-
// Mesh configuration
|
|
19
|
-
#define MESH_PREFIX "FishFarmMesh"
|
|
20
|
-
#define MESH_PASSWORD "somethingSneaky"
|
|
21
|
-
#define MESH_PORT 5555
|
|
22
|
-
|
|
23
|
-
// Router credentials for bridge node
|
|
24
|
-
#define ROUTER_SSID "YourWiFiSSID"
|
|
25
|
-
#define ROUTER_PASSWORD "YourWiFiPassword"
|
|
26
|
-
|
|
27
|
-
// Sensor thresholds (mg/L for dissolved oxygen)
|
|
28
|
-
#define CRITICAL_O2_THRESHOLD 3.0
|
|
29
|
-
#define WARNING_O2_THRESHOLD 5.0
|
|
30
|
-
|
|
31
|
-
// Queue configuration
|
|
32
|
-
#define MAX_QUEUE_SIZE 500
|
|
33
|
-
#define QUEUE_PRUNE_AGE (24 * 60 * 60 * 1000) // 24 hours in ms
|
|
34
|
-
|
|
35
|
-
Scheduler userScheduler;
|
|
36
|
-
painlessMesh mesh;
|
|
37
|
-
|
|
38
|
-
bool offlineMode = false;
|
|
39
|
-
uint32_t lastO2Check = 0;
|
|
40
|
-
uint32_t lastQueuePrune = 0;
|
|
41
|
-
|
|
42
|
-
// Simulated sensor reading (replace with actual sensor code)
|
|
43
|
-
float readDissolvedOxygenSensor() {
|
|
44
|
-
// In real application, read from actual sensor
|
|
45
|
-
// For demo, simulate varying O2 levels
|
|
46
|
-
static float o2Level = 7.0;
|
|
47
|
-
o2Level += random(-20, 20) / 10.0; // +/- 2.0 mg/L variation
|
|
48
|
-
o2Level = constrain(o2Level, 2.0, 10.0);
|
|
49
|
-
return o2Level;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
// Send critical O2 alarm
|
|
53
|
-
void sendCriticalAlarm(float o2Level) {
|
|
54
|
-
// Create alarm message (in real app, use JSON)
|
|
55
|
-
String payload = String("{\"type\":\"CRITICAL_ALARM\",\"sensor\":\"O2\",\"value\":")
|
|
56
|
-
+ String(o2Level, 2) + ",\"threshold\":"
|
|
57
|
-
+ String(CRITICAL_O2_THRESHOLD, 2) + ",\"tankId\":\"TANK_A\",\"nodeId\":"
|
|
58
|
-
+ mesh.getNodeId() + ",\"timestamp\":" + mesh.getNodeTime() + "}";
|
|
59
|
-
|
|
60
|
-
if (offlineMode || !mesh.hasInternetConnection()) {
|
|
61
|
-
// CRITICAL: Queue for guaranteed delivery
|
|
62
|
-
uint32_t msgId = mesh.queueMessage(
|
|
63
|
-
payload,
|
|
64
|
-
"mqtt://cloud.farm.com/alarms/critical",
|
|
65
|
-
PRIORITY_CRITICAL
|
|
66
|
-
);
|
|
67
|
-
|
|
68
|
-
if (msgId) {
|
|
69
|
-
Serial.printf("🚨 CRITICAL O2 ALARM: %.2f mg/L - QUEUED #%u\n", o2Level, msgId);
|
|
70
|
-
} else {
|
|
71
|
-
Serial.printf("🚨 CRITICAL O2 ALARM: %.2f mg/L - QUEUE FAILED!\n", o2Level);
|
|
72
|
-
}
|
|
73
|
-
} else {
|
|
74
|
-
// Send immediately via bridge (in real app, use MQTT client)
|
|
75
|
-
Serial.printf("🚨 CRITICAL O2 ALARM: %.2f mg/L - SENT IMMEDIATELY\n", o2Level);
|
|
76
|
-
// mqttClient.publish("alarms/critical", payload.c_str());
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// Send warning alarm
|
|
81
|
-
void sendWarningAlarm(float o2Level) {
|
|
82
|
-
String payload = String("{\"type\":\"WARNING\",\"sensor\":\"O2\",\"value\":")
|
|
83
|
-
+ String(o2Level, 2) + ",\"threshold\":"
|
|
84
|
-
+ String(WARNING_O2_THRESHOLD, 2) + ",\"nodeId\":"
|
|
85
|
-
+ mesh.getNodeId() + "}";
|
|
86
|
-
|
|
87
|
-
if (offlineMode) {
|
|
88
|
-
uint32_t msgId = mesh.queueMessage(
|
|
89
|
-
payload,
|
|
90
|
-
"mqtt://cloud.farm.com/alarms/warning",
|
|
91
|
-
PRIORITY_HIGH
|
|
92
|
-
);
|
|
93
|
-
|
|
94
|
-
if (msgId) {
|
|
95
|
-
Serial.printf("⚠️ WARNING O2: %.2f mg/L - QUEUED #%u\n", o2Level, msgId);
|
|
96
|
-
} else {
|
|
97
|
-
Serial.printf("⚠️ WARNING O2: %.2f mg/L - QUEUE FULL\n", o2Level);
|
|
98
|
-
}
|
|
99
|
-
} else {
|
|
100
|
-
Serial.printf("⚠️ WARNING O2: %.2f mg/L - SENT\n", o2Level);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
// Send normal telemetry
|
|
105
|
-
void sendNormalTelemetry(float o2Level) {
|
|
106
|
-
String payload = String("{\"sensor\":\"O2\",\"value\":") + String(o2Level, 2)
|
|
107
|
-
+ ",\"nodeId\":" + mesh.getNodeId() + "}";
|
|
108
|
-
|
|
109
|
-
if (offlineMode) {
|
|
110
|
-
// Low priority - queue only if space available
|
|
111
|
-
uint32_t msgId = mesh.queueMessage(
|
|
112
|
-
payload,
|
|
113
|
-
"mqtt://cloud.farm.com/telemetry",
|
|
114
|
-
PRIORITY_LOW
|
|
115
|
-
);
|
|
116
|
-
|
|
117
|
-
if (msgId) {
|
|
118
|
-
Serial.printf("📊 Telemetry: %.2f mg/L - queued #%u\n", o2Level, msgId);
|
|
119
|
-
} else {
|
|
120
|
-
Serial.printf("📊 Telemetry: %.2f mg/L - dropped (queue full)\n", o2Level);
|
|
121
|
-
}
|
|
122
|
-
} else {
|
|
123
|
-
Serial.printf("📊 Telemetry: %.2f mg/L\n", o2Level);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
// Check O2 sensor and send appropriate message
|
|
128
|
-
void checkO2Sensor() {
|
|
129
|
-
float o2Level = readDissolvedOxygenSensor();
|
|
130
|
-
|
|
131
|
-
if (o2Level < CRITICAL_O2_THRESHOLD) {
|
|
132
|
-
sendCriticalAlarm(o2Level);
|
|
133
|
-
} else if (o2Level < WARNING_O2_THRESHOLD) {
|
|
134
|
-
sendWarningAlarm(o2Level);
|
|
135
|
-
} else {
|
|
136
|
-
sendNormalTelemetry(o2Level);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
// Bridge status callback - Internet connectivity changed
|
|
141
|
-
void bridgeStatusCallback(uint32_t bridgeNodeId, bool hasInternet) {
|
|
142
|
-
if (!hasInternet) {
|
|
143
|
-
offlineMode = true;
|
|
144
|
-
Serial.println("\n⚠️ OFFLINE MODE ACTIVATED");
|
|
145
|
-
Serial.printf(" Bridge node %u lost Internet\n", bridgeNodeId);
|
|
146
|
-
Serial.printf(" Queue size: %u messages\n", mesh.getQueuedMessageCount());
|
|
147
|
-
|
|
148
|
-
uint32_t critical = mesh.getQueuedMessageCount(PRIORITY_CRITICAL);
|
|
149
|
-
if (critical > 0) {
|
|
150
|
-
Serial.printf(" ⚠️ %u CRITICAL messages queued!\n", critical);
|
|
151
|
-
}
|
|
152
|
-
} else {
|
|
153
|
-
offlineMode = false;
|
|
154
|
-
Serial.println("\n✅ ONLINE MODE - Internet restored");
|
|
155
|
-
Serial.printf(" Bridge node %u has Internet\n", bridgeNodeId);
|
|
156
|
-
|
|
157
|
-
// Flush queued messages
|
|
158
|
-
uint32_t queuedCount = mesh.getQueuedMessageCount();
|
|
159
|
-
if (queuedCount > 0) {
|
|
160
|
-
Serial.printf(" Flushing %u queued messages...\n", queuedCount);
|
|
161
|
-
|
|
162
|
-
auto messages = mesh.flushMessageQueue();
|
|
163
|
-
for (auto& msg : messages) {
|
|
164
|
-
// In real application, send via MQTT or HTTP
|
|
165
|
-
Serial.printf(" Sending queued message #%u (priority=%d, attempts=%u)\n",
|
|
166
|
-
msg.id, msg.priority, msg.attempts);
|
|
167
|
-
|
|
168
|
-
// Simulate sending (in real app, check if send succeeded)
|
|
169
|
-
bool sent = true; // Replace with: mqttClient.publish(...)
|
|
170
|
-
|
|
171
|
-
if (sent) {
|
|
172
|
-
mesh.removeQueuedMessage(msg.id);
|
|
173
|
-
} else {
|
|
174
|
-
// Increment attempt counter
|
|
175
|
-
mesh.incrementQueuedMessageAttempts(msg.id);
|
|
176
|
-
|
|
177
|
-
// Remove if too many attempts
|
|
178
|
-
if (msg.attempts >= 3) {
|
|
179
|
-
Serial.printf(" ❌ Message #%u failed after 3 attempts, removing\n", msg.id);
|
|
180
|
-
mesh.removeQueuedMessage(msg.id);
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
Serial.printf(" ✅ Queue flushed (%u messages sent)\n", queuedCount);
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
// Queue state callback - Monitor queue health
|
|
191
|
-
void queueStateCallback(QueueState state, uint32_t messageCount) {
|
|
192
|
-
switch (state) {
|
|
193
|
-
case QUEUE_EMPTY:
|
|
194
|
-
Serial.println("ℹ️ Queue empty");
|
|
195
|
-
break;
|
|
196
|
-
case QUEUE_NORMAL:
|
|
197
|
-
Serial.printf("ℹ️ Queue normal (%u messages)\n", messageCount);
|
|
198
|
-
break;
|
|
199
|
-
case QUEUE_75_PERCENT:
|
|
200
|
-
Serial.printf("⚠️ Queue 75%% full (%u messages)\n", messageCount);
|
|
201
|
-
break;
|
|
202
|
-
case QUEUE_FULL:
|
|
203
|
-
Serial.printf("🚨 Queue FULL (%u messages) - dropping LOW priority\n", messageCount);
|
|
204
|
-
break;
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
void setup() {
|
|
209
|
-
Serial.begin(115200);
|
|
210
|
-
Serial.println("\n\n=== Fish Farm O2 Monitoring with Message Queue ===\n");
|
|
211
|
-
|
|
212
|
-
// Initialize mesh
|
|
213
|
-
mesh.setDebugMsgTypes(ERROR | STARTUP | CONNECTION);
|
|
214
|
-
mesh.init(MESH_PREFIX, MESH_PASSWORD, &userScheduler, MESH_PORT);
|
|
215
|
-
|
|
216
|
-
// For bridge node: set router credentials
|
|
217
|
-
// Uncomment if this is the bridge node
|
|
218
|
-
// mesh.stationManual(ROUTER_SSID, ROUTER_PASSWORD);
|
|
219
|
-
// mesh.setHostname("FishFarmBridge");
|
|
220
|
-
|
|
221
|
-
// Enable message queue
|
|
222
|
-
mesh.enableMessageQueue(true, MAX_QUEUE_SIZE);
|
|
223
|
-
Serial.printf("Message queue enabled (capacity: %u)\n", MAX_QUEUE_SIZE);
|
|
224
|
-
|
|
225
|
-
// Set callbacks
|
|
226
|
-
mesh.onBridgeStatusChanged(&bridgeStatusCallback);
|
|
227
|
-
mesh.onQueueStateChanged(&queueStateCallback);
|
|
228
|
-
|
|
229
|
-
Serial.println("Setup complete. Monitoring O2 levels...\n");
|
|
230
|
-
|
|
231
|
-
// Initialize random for sensor simulation
|
|
232
|
-
randomSeed(analogRead(0));
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
void loop() {
|
|
236
|
-
mesh.update();
|
|
237
|
-
|
|
238
|
-
// Check O2 sensor every 10 seconds
|
|
239
|
-
if (millis() - lastO2Check > 10000) {
|
|
240
|
-
lastO2Check = millis();
|
|
241
|
-
checkO2Sensor();
|
|
242
|
-
|
|
243
|
-
// Print queue status
|
|
244
|
-
uint32_t queueSize = mesh.getQueuedMessageCount();
|
|
245
|
-
if (queueSize > 0) {
|
|
246
|
-
Serial.printf(" [Queue: %u messages", queueSize);
|
|
247
|
-
|
|
248
|
-
uint32_t critical = mesh.getQueuedMessageCount(PRIORITY_CRITICAL);
|
|
249
|
-
if (critical > 0) {
|
|
250
|
-
Serial.printf(" (%u CRITICAL)", critical);
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
Serial.println("]");
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
// Prune old messages every hour
|
|
258
|
-
if (millis() - lastQueuePrune > 3600000) {
|
|
259
|
-
lastQueuePrune = millis();
|
|
260
|
-
uint32_t pruned = mesh.pruneQueue(QUEUE_PRUNE_AGE);
|
|
261
|
-
if (pruned > 0) {
|
|
262
|
-
Serial.printf("ℹ️ Pruned %u old messages from queue\n", pruned);
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
}
|
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
# Multi-Hop Routing Demo
|
|
2
|
-
|
|
3
|
-
This example demonstrates the new multi-hop routing capabilities implemented in painlessMesh.
|
|
4
|
-
|
|
5
|
-
## Features Demonstrated
|
|
6
|
-
|
|
7
|
-
### 1. Hop Count Calculation (`getHopCount()`)
|
|
8
|
-
- Calculates the actual number of hops to reach any node in the mesh
|
|
9
|
-
- Returns 0 for self, 1 for direct connections, actual count for multi-hop paths
|
|
10
|
-
- Returns -1 if the node is unreachable
|
|
11
|
-
|
|
12
|
-
### 2. Routing Table (`getRoutingTable()`)
|
|
13
|
-
- Returns a complete routing table mapping each destination to its next hop
|
|
14
|
-
- For direct connections, destination equals next hop
|
|
15
|
-
- For multi-hop paths, shows which neighbor to route through
|
|
16
|
-
|
|
17
|
-
### 3. Path Discovery (`getPathToNode()`)
|
|
18
|
-
- Finds the complete path from this node to any target node
|
|
19
|
-
- Returns a vector of node IDs representing the shortest path
|
|
20
|
-
- Useful for visualizing mesh topology and debugging connectivity
|
|
21
|
-
|
|
22
|
-
## How It Works
|
|
23
|
-
|
|
24
|
-
The implementation uses **Breadth-First Search (BFS)** to:
|
|
25
|
-
- Find shortest paths in the mesh topology
|
|
26
|
-
- Build accurate routing tables
|
|
27
|
-
- Calculate hop counts efficiently
|
|
28
|
-
|
|
29
|
-
### Algorithm Complexity
|
|
30
|
-
- **Time**: O(V + E) where V = nodes, E = edges
|
|
31
|
-
- **Space**: O(V) for visited set and queue
|
|
32
|
-
- **Suitable for**: ESP8266 (80KB RAM) and ESP32 (320KB RAM)
|
|
33
|
-
|
|
34
|
-
## Running the Example
|
|
35
|
-
|
|
36
|
-
### Hardware Requirements
|
|
37
|
-
- 2 or more ESP32 or ESP8266 boards
|
|
38
|
-
- No additional hardware needed
|
|
39
|
-
|
|
40
|
-
### Software Requirements
|
|
41
|
-
- painlessMesh library (with multi-hop routing support)
|
|
42
|
-
- TaskScheduler library
|
|
43
|
-
- ArduinoJson library
|
|
44
|
-
|
|
45
|
-
### Setup Instructions
|
|
46
|
-
|
|
47
|
-
1. Upload this sketch to multiple ESP devices
|
|
48
|
-
2. Each device will automatically join the mesh
|
|
49
|
-
3. Open Serial Monitor (115200 baud) on any device
|
|
50
|
-
4. Observe routing information every 10 seconds
|
|
51
|
-
|
|
52
|
-
### Expected Output
|
|
53
|
-
|
|
54
|
-
```
|
|
55
|
-
Routing Demo Started
|
|
56
|
-
Node ID: 123456789
|
|
57
|
-
|
|
58
|
-
=== Routing Information ===
|
|
59
|
-
Mesh contains 3 nodes (plus this node)
|
|
60
|
-
|
|
61
|
-
Hop Counts:
|
|
62
|
-
Node 234567890: 1 hop
|
|
63
|
-
Node 345678901: 2 hops
|
|
64
|
-
Node 456789012: 3 hops
|
|
65
|
-
|
|
66
|
-
Routing Table (Destination -> Next Hop):
|
|
67
|
-
To 234567890 -> via 234567890 (direct connection)
|
|
68
|
-
To 345678901 -> via 234567890
|
|
69
|
-
To 456789012 -> via 234567890
|
|
70
|
-
|
|
71
|
-
Path to node 456789012:
|
|
72
|
-
123456789 -> 234567890 -> 345678901 -> 456789012
|
|
73
|
-
(Total: 3 hops)
|
|
74
|
-
========================
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
## Use Cases
|
|
78
|
-
|
|
79
|
-
### Network Diagnostics
|
|
80
|
-
- Monitor mesh topology changes in real-time
|
|
81
|
-
- Identify connectivity issues
|
|
82
|
-
- Measure network depth
|
|
83
|
-
|
|
84
|
-
### Load Balancing
|
|
85
|
-
- Choose optimal paths for data transmission
|
|
86
|
-
- Distribute traffic across multiple routes
|
|
87
|
-
- Avoid overloading single-hop nodes
|
|
88
|
-
|
|
89
|
-
### Network Visualization
|
|
90
|
-
- Build visual representations of mesh topology
|
|
91
|
-
- Display on OLED/LCD screens
|
|
92
|
-
- Create web-based network maps
|
|
93
|
-
|
|
94
|
-
## Performance Considerations
|
|
95
|
-
|
|
96
|
-
### Memory Usage
|
|
97
|
-
- Routing table size: ~8 bytes per node
|
|
98
|
-
- BFS temporary storage: ~16 bytes per node
|
|
99
|
-
- Example mesh of 50 nodes: ~1.2KB total
|
|
100
|
-
|
|
101
|
-
### CPU Usage
|
|
102
|
-
- Routing calculation: ~1-5ms for typical meshes
|
|
103
|
-
- Triggered only on topology changes
|
|
104
|
-
- No continuous overhead
|
|
105
|
-
|
|
106
|
-
## Advanced Usage
|
|
107
|
-
|
|
108
|
-
### Custom Routing Logic
|
|
109
|
-
|
|
110
|
-
```cpp
|
|
111
|
-
// Find nodes within N hops
|
|
112
|
-
std::vector<uint32_t> findNodesWithinRange(int maxHops) {
|
|
113
|
-
std::vector<uint32_t> nearby;
|
|
114
|
-
auto nodeList = mesh.getNodeList(false);
|
|
115
|
-
|
|
116
|
-
for (auto nodeId : nodeList) {
|
|
117
|
-
int hops = mesh.getHopCount(nodeId);
|
|
118
|
-
if (hops > 0 && hops <= maxHops) {
|
|
119
|
-
nearby.push_back(nodeId);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
return nearby;
|
|
124
|
-
}
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
### Route Optimization
|
|
128
|
-
|
|
129
|
-
```cpp
|
|
130
|
-
// Select best route based on hop count
|
|
131
|
-
uint32_t selectBestRoute(std::vector<uint32_t> candidates) {
|
|
132
|
-
uint32_t best = 0;
|
|
133
|
-
int minHops = 999;
|
|
134
|
-
|
|
135
|
-
for (auto candidate : candidates) {
|
|
136
|
-
int hops = mesh.getHopCount(candidate);
|
|
137
|
-
if (hops > 0 && hops < minHops) {
|
|
138
|
-
minHops = hops;
|
|
139
|
-
best = candidate;
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
return best;
|
|
144
|
-
}
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
## Troubleshooting
|
|
148
|
-
|
|
149
|
-
### "All nodes show 2 hops"
|
|
150
|
-
- Old firmware without multi-hop support
|
|
151
|
-
- Update to latest painlessMesh version
|
|
152
|
-
|
|
153
|
-
### "Routing table is empty"
|
|
154
|
-
- No other nodes in the mesh
|
|
155
|
-
- Check mesh credentials (SSID/password)
|
|
156
|
-
- Verify mesh is initialized
|
|
157
|
-
|
|
158
|
-
### "Path discovery returns empty vector"
|
|
159
|
-
- Target node is unreachable or left the mesh
|
|
160
|
-
- Check connectivity with `getHopCount()` first
|
|
161
|
-
|
|
162
|
-
## Related Examples
|
|
163
|
-
|
|
164
|
-
- `namedMesh.ino` - Basic mesh setup
|
|
165
|
-
- `diagnosticsExample.ino` - Advanced diagnostics
|
|
166
|
-
- `bridge_failover.ino` - Multi-bridge routing
|
|
167
|
-
|
|
168
|
-
## References
|
|
169
|
-
|
|
170
|
-
- [painlessMesh Documentation](https://alteriom.github.io/painlessMesh/)
|
|
171
|
-
- [Multi-Hop Routing Issue #XXX](https://github.com/Alteriom/painlessMesh/issues/XXX)
|
|
172
|
-
- BFS Algorithm: [Wikipedia](https://en.wikipedia.org/wiki/Breadth-first_search)
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Multi-Hop Routing Demo
|
|
3
|
-
*
|
|
4
|
-
* This example demonstrates the new multi-hop routing capabilities of painlessMesh.
|
|
5
|
-
* It shows how to:
|
|
6
|
-
* - Calculate hop count to any node in the mesh
|
|
7
|
-
* - Get the complete routing table
|
|
8
|
-
* - Find the path from this node to any other node
|
|
9
|
-
*
|
|
10
|
-
* The functions work automatically with any mesh topology - linear chains,
|
|
11
|
-
* star configurations, or complex multi-hop meshes.
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
#include "painlessMesh.h"
|
|
15
|
-
|
|
16
|
-
#define MESH_PREFIX "routingDemo"
|
|
17
|
-
#define MESH_PASSWORD "meshPassword"
|
|
18
|
-
#define MESH_PORT 5555
|
|
19
|
-
|
|
20
|
-
Scheduler userScheduler;
|
|
21
|
-
painlessMesh mesh;
|
|
22
|
-
|
|
23
|
-
// Task to periodically display routing information
|
|
24
|
-
Task taskShowRouting(10000, TASK_FOREVER, []() {
|
|
25
|
-
Serial.println("\n=== Routing Information ===");
|
|
26
|
-
|
|
27
|
-
// Get list of all nodes in the mesh
|
|
28
|
-
auto nodeList = mesh.getNodeList(false); // false = don't include self
|
|
29
|
-
Serial.printf("Mesh contains %d nodes (plus this node)\n", nodeList.size());
|
|
30
|
-
|
|
31
|
-
// Display hop count to each node
|
|
32
|
-
Serial.println("\nHop Counts:");
|
|
33
|
-
for (auto nodeId : nodeList) {
|
|
34
|
-
int hops = mesh.getHopCount(nodeId);
|
|
35
|
-
Serial.printf(" Node %u: %d hop%s\n", nodeId, hops, hops == 1 ? "" : "s");
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
// Display complete routing table
|
|
39
|
-
Serial.println("\nRouting Table (Destination -> Next Hop):");
|
|
40
|
-
auto routingTable = mesh.getRoutingTable();
|
|
41
|
-
for (auto& entry : routingTable) {
|
|
42
|
-
Serial.printf(" To %u -> via %u", entry.first, entry.second);
|
|
43
|
-
if (entry.first == entry.second) {
|
|
44
|
-
Serial.print(" (direct connection)");
|
|
45
|
-
}
|
|
46
|
-
Serial.println();
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// Example: Show path to first node in list
|
|
50
|
-
if (!nodeList.empty()) {
|
|
51
|
-
uint32_t targetNode = nodeList.front();
|
|
52
|
-
auto path = mesh.getPathToNode(targetNode);
|
|
53
|
-
|
|
54
|
-
if (!path.empty()) {
|
|
55
|
-
Serial.printf("\nPath to node %u:\n ", targetNode);
|
|
56
|
-
for (size_t i = 0; i < path.size(); i++) {
|
|
57
|
-
Serial.printf("%u", path[i]);
|
|
58
|
-
if (i < path.size() - 1) {
|
|
59
|
-
Serial.print(" -> ");
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
Serial.printf("\n (Total: %d hop%s)\n", path.size() - 1,
|
|
63
|
-
path.size() - 1 == 1 ? "" : "s");
|
|
64
|
-
} else {
|
|
65
|
-
Serial.printf("\nNode %u is unreachable\n", targetNode);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
Serial.println("========================\n");
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
void setup() {
|
|
73
|
-
Serial.begin(115200);
|
|
74
|
-
|
|
75
|
-
// Initialize mesh
|
|
76
|
-
mesh.setDebugMsgTypes(ERROR | STARTUP | CONNECTION);
|
|
77
|
-
mesh.init(MESH_PREFIX, MESH_PASSWORD, &userScheduler, MESH_PORT);
|
|
78
|
-
|
|
79
|
-
// Setup callbacks
|
|
80
|
-
mesh.onNewConnection([](uint32_t nodeId) {
|
|
81
|
-
Serial.printf("\nNew connection: Node %u joined the mesh\n", nodeId);
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
mesh.onDroppedConnection([](uint32_t nodeId) {
|
|
85
|
-
Serial.printf("\nConnection dropped: Node %u left the mesh\n", nodeId);
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
mesh.onChangedConnections([]() {
|
|
89
|
-
Serial.println("\nMesh topology changed - routing tables updated");
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
// Add routing display task
|
|
93
|
-
userScheduler.addTask(taskShowRouting);
|
|
94
|
-
taskShowRouting.enable();
|
|
95
|
-
|
|
96
|
-
Serial.println("\nRouting Demo Started");
|
|
97
|
-
Serial.printf("Node ID: %u\n", mesh.getNodeId());
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
void loop() {
|
|
101
|
-
mesh.update();
|
|
102
|
-
}
|