@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
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
# Bridging painlessMesh to Internet via Router
|
|
2
|
+
|
|
3
|
+
You can bridge your mesh network to the Internet by creating a **gateway node** that connects to both the mesh network and your WiFi router simultaneously.
|
|
4
|
+
|
|
5
|
+
## Quick Start (Recommended: Auto Channel Detection)
|
|
6
|
+
|
|
7
|
+
The **new bridge-centric approach** automatically detects your router's channel and configures the mesh accordingly. No manual channel configuration required!
|
|
8
|
+
|
|
9
|
+
```cpp
|
|
10
|
+
#include "painlessMesh.h"
|
|
11
|
+
|
|
12
|
+
#define MESH_PREFIX "MyMeshNetwork"
|
|
13
|
+
#define MESH_PASSWORD "somethingSneaky"
|
|
14
|
+
#define MESH_PORT 5555
|
|
15
|
+
|
|
16
|
+
// Your router credentials
|
|
17
|
+
#define ROUTER_SSID "YourRouterSSID"
|
|
18
|
+
#define ROUTER_PASSWORD "YourRouterPassword"
|
|
19
|
+
|
|
20
|
+
Scheduler userScheduler;
|
|
21
|
+
painlessMesh mesh;
|
|
22
|
+
|
|
23
|
+
void setup() {
|
|
24
|
+
Serial.begin(115200);
|
|
25
|
+
mesh.setDebugMsgTypes(ERROR | STARTUP | CONNECTION);
|
|
26
|
+
|
|
27
|
+
// Single call does everything:
|
|
28
|
+
// 1. Connects to router and detects its channel
|
|
29
|
+
// 2. Initializes mesh on detected channel
|
|
30
|
+
// 3. Sets node as root/bridge
|
|
31
|
+
// 4. Maintains router connection
|
|
32
|
+
mesh.initAsBridge(MESH_PREFIX, MESH_PASSWORD,
|
|
33
|
+
ROUTER_SSID, ROUTER_PASSWORD,
|
|
34
|
+
&userScheduler, MESH_PORT);
|
|
35
|
+
|
|
36
|
+
mesh.onReceive(&receivedCallback);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
void loop() {
|
|
40
|
+
mesh.update();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
void receivedCallback(uint32_t from, String& msg) {
|
|
44
|
+
Serial.printf("Received from mesh node %u: %s\n", from, msg.c_str());
|
|
45
|
+
// Forward to Internet services (HTTP, MQTT, etc.)
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**Expected Output:**
|
|
50
|
+
```
|
|
51
|
+
=== Bridge Mode Initialization ===
|
|
52
|
+
Step 1: Connecting to router YourRouterSSID...
|
|
53
|
+
✓ Router connected on channel 6
|
|
54
|
+
✓ Router IP: 192.168.1.100
|
|
55
|
+
Step 2: Initializing mesh on channel 6...
|
|
56
|
+
STARTUP: init(): Mesh channel set to 6
|
|
57
|
+
Step 3: Establishing bridge connection...
|
|
58
|
+
=== Bridge Mode Active ===
|
|
59
|
+
Mesh SSID: MyMeshNetwork
|
|
60
|
+
Mesh Channel: 6 (matches router)
|
|
61
|
+
Router: YourRouterSSID
|
|
62
|
+
Port: 5555
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Regular Nodes with Auto-Detection
|
|
66
|
+
|
|
67
|
+
Regular mesh nodes can also auto-detect the mesh channel:
|
|
68
|
+
|
|
69
|
+
```cpp
|
|
70
|
+
void setup() {
|
|
71
|
+
Serial.begin(115200);
|
|
72
|
+
mesh.setDebugMsgTypes(ERROR | STARTUP | CONNECTION);
|
|
73
|
+
|
|
74
|
+
// channel=0 means auto-detect
|
|
75
|
+
mesh.init(MESH_PREFIX, MESH_PASSWORD, &userScheduler, MESH_PORT,
|
|
76
|
+
WIFI_AP_STA, 0);
|
|
77
|
+
|
|
78
|
+
mesh.onReceive(&receivedCallback);
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
**Expected Output:**
|
|
83
|
+
```
|
|
84
|
+
STARTUP: Auto-detecting mesh channel...
|
|
85
|
+
CONNECTION: Scanning all channels for mesh 'MyMeshNetwork'...
|
|
86
|
+
CONNECTION: Found mesh on channel 6 (RSSI: -45)
|
|
87
|
+
STARTUP: Mesh channel auto-detected: 6
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Automatic Channel Re-synchronization
|
|
91
|
+
|
|
92
|
+
Nodes automatically follow the mesh if the bridge changes channels:
|
|
93
|
+
|
|
94
|
+
- When nodes can't find the mesh on their current channel for ~30 seconds, they trigger a full channel scan
|
|
95
|
+
- If the mesh is found on a different channel, nodes automatically switch to that channel
|
|
96
|
+
- This ensures the mesh stays connected even if the bridge switches channels (e.g., during bridge election)
|
|
97
|
+
|
|
98
|
+
For detailed information about channel synchronization, see [Channel Synchronization Documentation](docs/CHANNEL_SYNCHRONIZATION.md).
|
|
99
|
+
|
|
100
|
+
## Manual Configuration (Legacy Approach)
|
|
101
|
+
|
|
102
|
+
If you prefer the traditional approach or need more control, you can still manually configure the channel:
|
|
103
|
+
|
|
104
|
+
```cpp
|
|
105
|
+
void setup() {
|
|
106
|
+
Serial.begin(115200);
|
|
107
|
+
mesh.setDebugMsgTypes(ERROR | STARTUP | CONNECTION);
|
|
108
|
+
|
|
109
|
+
// Initialize mesh with AP+STA mode on specific channel
|
|
110
|
+
mesh.init(MESH_PREFIX, MESH_PASSWORD, &userScheduler, MESH_PORT, WIFI_AP_STA, 6);
|
|
111
|
+
|
|
112
|
+
// Connect to your router
|
|
113
|
+
mesh.stationManual(ROUTER_SSID, ROUTER_PASSWORD);
|
|
114
|
+
mesh.setHostname("MESH_BRIDGE");
|
|
115
|
+
|
|
116
|
+
// Configure as root/bridge node
|
|
117
|
+
mesh.setRoot(true);
|
|
118
|
+
mesh.setContainsRoot(true);
|
|
119
|
+
|
|
120
|
+
mesh.onReceive(&receivedCallback);
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## Important Requirements
|
|
125
|
+
|
|
126
|
+
### WiFi Channel Behavior
|
|
127
|
+
|
|
128
|
+
#### With initAsBridge() (Recommended)
|
|
129
|
+
|
|
130
|
+
The new `initAsBridge()` method automatically handles all channel detection and configuration:
|
|
131
|
+
|
|
132
|
+
1. Connects to your router first in STA mode
|
|
133
|
+
2. Detects the router's actual channel
|
|
134
|
+
3. Initializes the mesh AP on the detected channel
|
|
135
|
+
4. Maintains both connections on the same channel
|
|
136
|
+
|
|
137
|
+
**No manual channel configuration needed!** Just provide your router and mesh credentials.
|
|
138
|
+
|
|
139
|
+
#### With Manual Configuration
|
|
140
|
+
|
|
141
|
+
When using the legacy `stationManual()` approach, the library will automatically handle channel switching. The ESP32/ESP8266 will:
|
|
142
|
+
|
|
143
|
+
1. Initially operate the mesh AP on your specified channel (e.g., channel 6)
|
|
144
|
+
2. Automatically switch to the router's channel when connecting via `stationManual()`
|
|
145
|
+
3. The mesh AP channel will adjust to match the router's channel
|
|
146
|
+
|
|
147
|
+
**Note:** While ESP32/ESP8266 hardware can only operate on one channel at a time in AP+STA mode, the WiFi stack automatically coordinates this. When connected to a router on a different channel, the mesh AP will operate on that channel instead.
|
|
148
|
+
|
|
149
|
+
**Best Practices:**
|
|
150
|
+
|
|
151
|
+
- Use `initAsBridge()` for new projects - it handles everything automatically
|
|
152
|
+
- Use channels 1, 6, or 11 (non-overlapping 2.4GHz channels) if not using a router
|
|
153
|
+
- Regular nodes should use `channel=0` to auto-detect the mesh
|
|
154
|
+
- For optimal performance, you may choose to configure your router to use your preferred mesh channel
|
|
155
|
+
|
|
156
|
+
### Other Requirements
|
|
157
|
+
|
|
158
|
+
1. **WIFI_AP_STA Mode**: This enables simultaneous AP (for mesh) and Station (for router) operation.
|
|
159
|
+
|
|
160
|
+
2. **Root Configuration**:
|
|
161
|
+
- Call `mesh.setRoot(true)` on the bridge node
|
|
162
|
+
- Call `mesh.setContainsRoot(true)` on all mesh nodes for optimal routing
|
|
163
|
+
|
|
164
|
+
3. **ESP32-C6 Compatibility**: If using ESP32-C6 or experiencing crashes with `tcp_alloc` errors, ensure you have AsyncTCP v3.3.0+ installed. See the [ESP32-C6 Compatibility Guide](docs/troubleshooting/ESP32_C6_COMPATIBILITY.md) for details.
|
|
165
|
+
|
|
166
|
+
## Complete Examples
|
|
167
|
+
|
|
168
|
+
We provide several working bridge examples in the repository:
|
|
169
|
+
|
|
170
|
+
- **Basic Bridge**: `examples/bridge/bridge.ino`
|
|
171
|
+
- **MQTT Bridge**: `examples/mqttBridge/mqttBridge.ino` - Bridges mesh to MQTT broker
|
|
172
|
+
- **Web Server Bridge**: `examples/webServer/webServer.ino` - Provides web interface
|
|
173
|
+
- **Enhanced MQTT Bridge**: `examples/bridge/enhanced_mqtt_bridge_example.ino` - Advanced MQTT integration with metrics and health monitoring
|
|
174
|
+
|
|
175
|
+
## Forwarding Data to Internet
|
|
176
|
+
|
|
177
|
+
Once the bridge is established, you can forward mesh data to Internet services:
|
|
178
|
+
|
|
179
|
+
```cpp
|
|
180
|
+
void receivedCallback(uint32_t from, String& msg) {
|
|
181
|
+
// Check if connected to router
|
|
182
|
+
if (WiFi.status() == WL_CONNECTED) {
|
|
183
|
+
// Forward to MQTT broker
|
|
184
|
+
mqttClient.publish("mesh/data", msg.c_str());
|
|
185
|
+
|
|
186
|
+
// Or send via HTTP
|
|
187
|
+
HTTPClient http;
|
|
188
|
+
http.begin("http://myserver.com/api/data");
|
|
189
|
+
http.POST(msg);
|
|
190
|
+
http.end();
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
## Architecture Diagram
|
|
196
|
+
|
|
197
|
+
```text
|
|
198
|
+
Internet
|
|
199
|
+
|
|
|
200
|
+
Router (WiFi)
|
|
201
|
+
|
|
|
202
|
+
Bridge Node (AP+STA mode)
|
|
203
|
+
|
|
|
204
|
+
Mesh Network
|
|
205
|
+
/ | \
|
|
206
|
+
Node1 Node2 Node3...
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
## Frequently Asked Questions
|
|
210
|
+
|
|
211
|
+
### Why does `mesh.init()` require a separate `mesh.stationManual()` call?
|
|
212
|
+
|
|
213
|
+
Great question! The library now offers **three ways** to connect a bridge:
|
|
214
|
+
|
|
215
|
+
1. **Original**: `init()` + `stationManual()` (most flexible)
|
|
216
|
+
2. **Convenience**: Pass credentials directly to `init()` (new feature)
|
|
217
|
+
3. **Modern**: Use `initAsBridge()` with auto-detection (recommended)
|
|
218
|
+
|
|
219
|
+
See [Station Credentials Design Rationale](docs/design/STATION_CREDENTIALS_DESIGN.md) for detailed explanations and comparisons.
|
|
220
|
+
|
|
221
|
+
## Additional Resources
|
|
222
|
+
|
|
223
|
+
- [painlessMesh Wiki](https://github.com/Alteriom/painlessMesh/wiki)
|
|
224
|
+
- [Bridge Examples](https://github.com/Alteriom/painlessMesh/tree/main/examples/bridge)
|
|
225
|
+
- [MQTT Bridge Example](https://github.com/Alteriom/painlessMesh/tree/main/examples/mqttBridge)
|
|
226
|
+
- [Configuration API Reference](https://github.com/Alteriom/painlessMesh/wiki)
|
|
227
|
+
- [Station Credentials Design](docs/design/STATION_CREDENTIALS_DESIGN.md) - Why three approaches exist
|
|
228
|
+
|
|
229
|
+
Feel free to ask if you need help with specific use cases like MQTT integration, web servers, or custom data forwarding!
|
package/CHANGELOG.md
CHANGED
|
@@ -5,7 +5,95 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
-
## [
|
|
8
|
+
## [1.9.0] - 2025-11-30
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- **Mesh Connectivity Detection** - New APIs to detect mesh connection state
|
|
13
|
+
- `hasActiveMeshConnections()` - Check if node has active mesh connections
|
|
14
|
+
- `getLastKnownBridge()` - Get last known bridge regardless of timeout
|
|
15
|
+
- Allows distinguishing between "bridge unavailable" vs "disconnected from mesh"
|
|
16
|
+
|
|
17
|
+
- **Improved Bridge Detection** - Enhanced `getPrimaryBridge()` behavior
|
|
18
|
+
- When disconnected from mesh, returns last known bridge instead of nullptr
|
|
19
|
+
- Stale bridge info is better than no info for reconnection scenarios
|
|
20
|
+
- `hasInternetConnection()` now uses last known state when disconnected
|
|
21
|
+
|
|
22
|
+
- **Election Guard** - Skip election trigger when node is disconnected from mesh
|
|
23
|
+
- Prevents unnecessary elections when issue is local connectivity
|
|
24
|
+
- More accurate diagnosis of bridge availability problems
|
|
25
|
+
|
|
26
|
+
- **Configurable Bridge Election Timing** - New API methods to prevent split-brain scenarios
|
|
27
|
+
- `setElectionStartupDelay(delayMs)` - Configure startup delay before first election (default: 60s, min: 10s)
|
|
28
|
+
- `setElectionRandomDelay(minMs, maxMs)` - Configure random delay range for elections (default: 1-3s)
|
|
29
|
+
- Longer delays allow more time for mesh formation when nodes start simultaneously
|
|
30
|
+
- Prevents race condition where multiple nodes become bridges in isolation
|
|
31
|
+
- All timing parameters are user-configurable without hard-coded values
|
|
32
|
+
- **Impact**: Users can now tune election timing for their specific deployment scenarios
|
|
33
|
+
|
|
34
|
+
### Fixed
|
|
35
|
+
|
|
36
|
+
- **Bridge Discovery** - Fixed regular nodes unable to discover bridge nodes in bridge failover examples
|
|
37
|
+
- **Root Cause**: Regular nodes were using default channel=1 instead of channel=0 (auto-detect)
|
|
38
|
+
- Bridge nodes operate on router's WiFi channel (e.g., channel 6), not channel 1
|
|
39
|
+
- Nodes on fixed channel cannot discover bridges on different channels
|
|
40
|
+
- **Solution**: Updated examples to use `channel=0` for automatic mesh channel detection
|
|
41
|
+
- **Affected Examples**:
|
|
42
|
+
- `bridge_failover/bridge_failover.ino` - Both regular node and fallback initialization
|
|
43
|
+
- `multi_bridge/regular_node.ino` - Regular node initialization
|
|
44
|
+
- `bridgeAwareSensorNode/bridgeAwareSensorNode.ino` - Sensor node initialization
|
|
45
|
+
- `ntpTimeSyncNode/ntpTimeSyncNode.ino` - Time sync node initialization
|
|
46
|
+
- **Documentation**: Added channel detection explanation to bridge_failover README
|
|
47
|
+
- **Impact**: Regular nodes now properly discover and connect to bridges regardless of router channel
|
|
48
|
+
- Users experiencing "No primary bridge available!" / "Known bridges: 0" should update to this version
|
|
49
|
+
|
|
50
|
+
- **Split-Brain Prevention** - Addressed race condition when multiple nodes start simultaneously
|
|
51
|
+
- **Root Cause**: 60-63s window insufficient for mesh formation before elections start
|
|
52
|
+
- Both nodes detect "no bridge", run isolated elections, each wins and becomes bridge
|
|
53
|
+
- **Solution**: Added configurable timing parameters (see Added section above)
|
|
54
|
+
- **Documentation**: Added comprehensive troubleshooting section to bridge_failover README
|
|
55
|
+
- **Recommended Settings**: 90s startup delay + 10-30s random delay for simultaneous startups
|
|
56
|
+
- **Alternative**: Stagger node startup by 10-20 seconds or use pre-designated bridge mode
|
|
57
|
+
|
|
58
|
+
### Changed
|
|
59
|
+
|
|
60
|
+
- **Examples Consolidated** - Reduced from 32 to 14 essential examples
|
|
61
|
+
- Removed 18 redundant/developmental examples
|
|
62
|
+
- Kept: alteriom, basic, bridge, bridge_failover, logClient/Server, mqttBridge, namedMesh, otaReceiver/Sender, priority, sharedGateway, startHere, webServer
|
|
63
|
+
- Cleaner, more maintainable example set focusing on core functionality
|
|
64
|
+
|
|
65
|
+
- **Documentation Consolidated** - Cleaned up repository documentation
|
|
66
|
+
- Removed obsolete release notes, issue resolution docs, and development artifacts
|
|
67
|
+
- Retained: README.md, CHANGELOG.md, CONTRIBUTING.md, RELEASE_GUIDE.md, BRIDGE_TO_INTERNET.md
|
|
68
|
+
- Cleaner root directory with only essential documentation
|
|
69
|
+
|
|
70
|
+
## [1.8.15] - 2025-11-23
|
|
71
|
+
|
|
72
|
+
### Added
|
|
73
|
+
|
|
74
|
+
- **Simulator Integration** - Integrated painlessMesh-simulator for automated example validation
|
|
75
|
+
- Added painlessMesh-simulator as git submodule at `test/simulator/`
|
|
76
|
+
- Created YAML-based test scenarios for example validation
|
|
77
|
+
- Configured CI/CD to automatically run simulator tests on every push/PR
|
|
78
|
+
- Validates mesh formation, message broadcasting, and time synchronization with 5+ virtual nodes
|
|
79
|
+
- Provides framework for testing with 100+ nodes without hardware
|
|
80
|
+
- Resolves GitHub issue #163
|
|
81
|
+
- Merged via PR #164
|
|
82
|
+
|
|
83
|
+
### Documentation
|
|
84
|
+
|
|
85
|
+
- **Release Readiness Assessment** - Created comprehensive release readiness plan
|
|
86
|
+
- `RELEASE_READINESS_PLAN.md` - Complete audit of test infrastructure, performance issues, and security
|
|
87
|
+
- Confirmed library is production-ready with all 119+ test assertions passing
|
|
88
|
+
- Documented Issue #161 resolution (architectural clarification, not a bug)
|
|
89
|
+
- `TESTING_WITH_SIMULATOR.md` - Quick start guide for simulator
|
|
90
|
+
- `docs/SIMULATOR_TESTING.md` - Complete simulator integration guide with CI details
|
|
91
|
+
|
|
92
|
+
### Fixed
|
|
93
|
+
|
|
94
|
+
- **Build System** - Fixed references to removed test files in CMakeLists.txt
|
|
95
|
+
- **CI/CD** - Added missing libboost-program-options-dev dependency for simulator build
|
|
96
|
+
- **Documentation** - Updated all simulator paths and dependency lists
|
|
9
97
|
|
|
10
98
|
## [1.8.14] - 2025-11-21
|
|
11
99
|
|
package/CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
We try to follow the [git flow](https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow) development model. Which means that we have a `develop` branch and `master` branch. All development is done under feature branches, which are (when finished) merged into the development branch. When a new version is released we merge the `develop` branch into the `master` branch.
|
|
4
|
+
|
|
5
|
+
## Git flow
|
|
6
|
+
|
|
7
|
+
If you would like to use [git flow tools](http://danielkummer.github.io/git-flow-cheatsheet/) you are more than welcome to. We use it and it's pretty nifty. If you see a `feature\` prefix on a comment then that is git flow automating branch creation. It does need more typing than just plain git so I suggest creating shell aliases for the commands.
|
|
8
|
+
|
|
9
|
+
## Submit a pull request:
|
|
10
|
+
|
|
11
|
+
* If your push triggered a 'you just pushed...' message from GitLab then click on the button provided by that pop up to create a pull request.
|
|
12
|
+
* If not, then create a pull request and point it to your branch.
|
|
13
|
+
* Make sure that you're attempting to merge into `develop` and not `master`.
|
|
14
|
+
* Get your code reviewed by another contributor. If there are no contributors who possess the same set of skills then get them to review it anyway but explain what the code does beforehand and why. Use it as an opportunity for discussion around the feature set, to transfer knowledge, and to possibly [rubber duck](https://en.wikipedia.org/wiki/Rubber_duck_debugging) your code.
|
|
15
|
+
* Once the code is reviewed then have your reviewer merge your code.
|
|
16
|
+
|
|
17
|
+
NOTE: Tests *must* pass in order for the code to be merged.
|
|
18
|
+
|
|
19
|
+
NOTE: Always do a `git pull` on `develop` before you start working to capture the latest changes.
|
|
20
|
+
|
|
21
|
+
## Testing Requirements
|
|
22
|
+
|
|
23
|
+
### Running Tests
|
|
24
|
+
|
|
25
|
+
Before submitting a pull request, ensure all tests pass:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
# Build and run unit/integration tests
|
|
29
|
+
cmake -G Ninja .
|
|
30
|
+
ninja
|
|
31
|
+
run-parts --regex catch_ bin/
|
|
32
|
+
|
|
33
|
+
# Run simulator tests (for examples)
|
|
34
|
+
cd test/simulator
|
|
35
|
+
mkdir build && cd build
|
|
36
|
+
cmake -G Ninja .. && ninja
|
|
37
|
+
bin/painlessmesh-simulator --config ../../../examples/basic/test/simulator/scenarios/basic_mesh_test.yaml
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Adding Tests for New Features
|
|
41
|
+
|
|
42
|
+
When adding new features or examples:
|
|
43
|
+
|
|
44
|
+
1. **Unit Tests**: Add tests in `test/catch/` for new components
|
|
45
|
+
2. **Integration Tests**: Add to `test/boost/tcp_integration.cpp` for core functionality
|
|
46
|
+
3. **Simulator Tests**: Create test scenarios in `examples/your_example/test/simulator/` for new examples
|
|
47
|
+
4. **Documentation**: Update relevant test documentation
|
|
48
|
+
|
|
49
|
+
### Example Validation with Simulator
|
|
50
|
+
|
|
51
|
+
All example sketches should have simulator tests that validate behavior with multiple virtual nodes:
|
|
52
|
+
|
|
53
|
+
1. Create firmware adapter in `examples/your_example/test/simulator/firmware/`
|
|
54
|
+
2. Create YAML test scenarios in `examples/your_example/test/simulator/scenarios/`
|
|
55
|
+
3. Document test setup in `examples/your_example/test/simulator/README.md`
|
|
56
|
+
|
|
57
|
+
See [Simulator Testing Guide](docs/SIMULATOR_TESTING.md) for complete instructions.
|
|
58
|
+
|
|
59
|
+
This ensures examples:
|
|
60
|
+
- Work as documented with multiple nodes
|
|
61
|
+
- Handle edge cases properly
|
|
62
|
+
- Don't regress with library changes
|
|
63
|
+
- Serve as validated references for users
|
|
64
|
+
|
|
65
|
+
## Versioning
|
|
66
|
+
|
|
67
|
+
This project will try its best to adhere to [semver](http://semver.org/) i.e, a codified guide to versioning software. When a new feature is developed or a bug is fixed the version will need to be bumped to signify the change.
|
|
68
|
+
|
|
69
|
+
The semver string is built like this:
|
|
70
|
+
|
|
71
|
+
Major.Minor.Patch
|
|
72
|
+
|
|
73
|
+
A major version bump means that a massive change took place and that application will probably have to be redeployed because a *backwards incompatible* version was released. Example: A library => model relationship change which requires previous configuration options to become invalid.
|
|
74
|
+
|
|
75
|
+
A minor version is a *backwards compatible* addition or change to the core software. Most development activity will be this type of version bump. Example: A new feature or model.
|
|
76
|
+
|
|
77
|
+
A patch version is a *backwards compatible* bug fix or application configuration change.
|
|
78
|
+
|
|
79
|
+
Documentation doesn't require a version bump.
|