@alteriom/painlessmesh 1.8.15 → 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.
Files changed (208) hide show
  1. package/BRIDGE_TO_INTERNET.md +229 -0
  2. package/CHANGELOG.md +61 -1
  3. package/CONTRIBUTING.md +79 -0
  4. package/README.md +69 -144
  5. package/docs/README.md +1 -0
  6. package/docs/api/shared-gateway.md +1207 -0
  7. package/examples/bridge_failover/README.md +81 -0
  8. package/examples/bridge_failover/bridge_failover.ino +35 -4
  9. package/examples/sharedGateway/README.md +235 -0
  10. package/examples/{meshCommandNode → sharedGateway}/platformio.ini +3 -2
  11. package/examples/sharedGateway/sharedGateway.ino +303 -0
  12. package/library.json +3 -22
  13. package/library.properties +1 -1
  14. package/package.json +3 -6
  15. package/src/arduino/wifi.hpp +342 -4
  16. package/src/painlessmesh/gateway.hpp +2120 -0
  17. package/src/painlessmesh/mesh.hpp +1034 -6
  18. package/src/painlessmesh/message_tracker.hpp +311 -0
  19. package/src/painlessmesh/protocol.hpp +6 -0
  20. package/DOCUMENTATION_INDEX.md +0 -146
  21. package/RELEASE_NOTES_1.8.15.md +0 -160
  22. package/RELEASE_READINESS_PLAN.md +0 -323
  23. package/TESTING_WITH_SIMULATOR.md +0 -259
  24. package/docs/API_DESIGN_GUIDELINES.md +0 -414
  25. package/docs/ARDUINO_LIBRARY_MANAGER_SUBMISSION.md +0 -331
  26. package/docs/BOOLEAN_NAMING_CONVENTION.md +0 -235
  27. package/docs/BRIDGE_FAILOVER.md +0 -512
  28. package/docs/BRIDGE_HEALTH_MONITORING.md +0 -293
  29. package/docs/BRIDGE_INITIALIZATION_FALLBACK.md +0 -357
  30. package/docs/CHANNEL_SYNCHRONIZATION.md +0 -209
  31. package/docs/CREATE_MISSING_RELEASES.md +0 -321
  32. package/docs/DOCUMENTATION_MIGRATION_PLAN.md +0 -176
  33. package/docs/FAQ_VERSION_NUMBERS.md +0 -152
  34. package/docs/IMPLEMENTATION_PLAN_MESH_TOPOLOGY.md +0 -1062
  35. package/docs/MESH_TOPOLOGY_GUIDE.md +0 -992
  36. package/docs/MESH_TOPOLOGY_PROGRESS.md +0 -422
  37. package/docs/MQTT_BRIDGE_COMMANDS.md +0 -894
  38. package/docs/MQTT_BRIDGE_IMPLEMENTATION_SUMMARY.md +0 -324
  39. package/docs/MQTT_COMMAND_SCHEMA_PROPOSAL.md +0 -576
  40. package/docs/MQTT_SCHEMA_COMPLIANCE.md +0 -340
  41. package/docs/MQTT_SCHEMA_PROPOSALS.md +0 -446
  42. package/docs/MQTT_SCHEMA_REVIEW.md +0 -690
  43. package/docs/OTA_COMMANDS_REFERENCE.md +0 -554
  44. package/docs/PHASE1_GUIDE.md +0 -349
  45. package/docs/PHASE2_GUIDE.md +0 -543
  46. package/docs/QUICK_REFERENCE_VERSIONING.md +0 -127
  47. package/docs/RELEASE_AGENT_SUMMARY.md +0 -386
  48. package/docs/SCHEMA_VALIDATION_CHECKLIST.md +0 -222
  49. package/docs/SIMULATOR_TESTING.md +0 -408
  50. package/docs/VERSION_MANAGEMENT.md +0 -213
  51. package/docs/archive/DOCUSAURUS_DEPLOYMENT.md +0 -166
  52. package/docs/archive/FEATURE_PROPOSALS.md +0 -337
  53. package/docs/archive/LIBRARY_JSON_FIX.md +0 -98
  54. package/docs/archive/LIBRARY_STRUCTURE_FIX.md +0 -215
  55. package/docs/archive/PHASE1_IMPLEMENTATION.md +0 -325
  56. package/docs/archive/PHASE2_IMPLEMENTATION.md +0 -567
  57. package/docs/archive/RELEASE_SUMMARY.md +0 -173
  58. package/docs/archive/SCONS_BUILD_FIX.md +0 -313
  59. package/docs/archive/TRIGGER_RELEASE.md +0 -280
  60. package/docs/archive/VECTOR_INCLUDE_FIX.md +0 -129
  61. package/docs/archive/ota-and-status-enhancements.md +0 -911
  62. package/docs/archive/ota-status-architecture-diagrams.md +0 -658
  63. package/docs/archive/ota-status-quick-reference.md +0 -284
  64. package/docs/design/.gitkeep +0 -1
  65. package/docs/design/STATION_CREDENTIALS_DESIGN.md +0 -182
  66. package/docs/development/ARDUINO_COMPLIANCE_SUMMARY.md +0 -71
  67. package/docs/development/CODE_REFACTORING_RECOMMENDATIONS.md +0 -1011
  68. package/docs/development/DOCKER_TESTING.md +0 -196
  69. package/docs/development/PLATFORMIO_USAGE.md +0 -180
  70. package/docs/development/TESTING_SUMMARY.md +0 -126
  71. package/docs/development/contributing.md +0 -301
  72. package/docs/development/documentation.md +0 -583
  73. package/docs/features/DIAGNOSTICS_API.md +0 -534
  74. package/docs/implementation/BRIDGE_ARCHITECTURE_IMPLEMENTATION.md +0 -340
  75. package/docs/implementation/BRIDGE_HEALTH_MONITORING_IMPLEMENTATION.md +0 -213
  76. package/docs/implementation/BRIDGE_STATUS_FEATURE.md +0 -635
  77. package/docs/implementation/DIAGNOSTICS_API_IMPLEMENTATION.md +0 -232
  78. package/docs/implementation/IMPLEMENTATION_COMPLETE.md +0 -228
  79. package/docs/implementation/IMPLEMENTATION_NTP_TIME_SYNC.md +0 -325
  80. package/docs/implementation/IMPLEMENTATION_SUMMARY.md +0 -316
  81. package/docs/implementation/MESSAGE_QUEUE_IMPLEMENTATION.md +0 -405
  82. package/docs/implementation/MULTI_BRIDGE_IMPLEMENTATION.md +0 -520
  83. package/docs/implementation/NTP_TIME_SYNC_FEATURE.md +0 -392
  84. package/docs/improvements/FUTURE_PROPOSALS.md +0 -1016
  85. package/docs/improvements/IMPLEMENTATION_HISTORY.md +0 -1091
  86. package/docs/improvements/OTA_STATUS_ENHANCEMENTS.md +0 -709
  87. package/docs/improvements/README.md +0 -212
  88. package/docs/internal/CUSTOM_AGENT_ANALYSIS.md +0 -391
  89. package/docs/internal/ISSUE_65_VERIFICATION.md +0 -947
  90. package/docs/internal/ISSUE_66_CLOSURE.md +0 -249
  91. package/docs/internal/ISSUE_66_STATUS.md +0 -316
  92. package/docs/internal/PR_SUMMARY.md +0 -315
  93. package/docs/internal/REVIEW_SUMMARY.md +0 -332
  94. package/docs/multi-bridge-setup.md +0 -1025
  95. package/docs/platformio-publishing.md +0 -255
  96. package/docs/platformio-setup-summary.md +0 -121
  97. package/docs/releases/ANNOUNCEMENT_v1.8.6.md +0 -63
  98. package/docs/releases/ANNOUNCEMENT_v1.8.7.md +0 -113
  99. package/docs/releases/BRIDGE_STATUS_SELF_REGISTRATION_FIX.md +0 -221
  100. package/docs/releases/FEATURE_HISTORY.md +0 -543
  101. package/docs/releases/GITHUB_RELEASE_v1.8.6.md +0 -71
  102. package/docs/releases/GITHUB_RELEASE_v1.8.7.md +0 -90
  103. package/docs/releases/PATCH_v1.7.2.md +0 -262
  104. package/docs/releases/PATCH_v1.7.3.md +0 -262
  105. package/docs/releases/PATCH_v1.7.4.md +0 -219
  106. package/docs/releases/PHASE1_SUMMARY.md +0 -246
  107. package/docs/releases/PHASE2_SUMMARY.md +0 -499
  108. package/docs/releases/PUBLISH_v1.8.0_INSTRUCTIONS.md +0 -163
  109. package/docs/releases/QUICK_START_RELEASES.md +0 -113
  110. package/docs/releases/RELEASE_CHECKLIST_1.8.10.md +0 -331
  111. package/docs/releases/RELEASE_CHECKLIST_1.8.9.md +0 -207
  112. package/docs/releases/RELEASE_CHECKLIST_v1.7.4.md +0 -253
  113. package/docs/releases/RELEASE_CHECKLIST_v1.7.5.md +0 -315
  114. package/docs/releases/RELEASE_CHECKLIST_v1.7.6.md +0 -389
  115. package/docs/releases/RELEASE_CHECKLIST_v1.8.0.md +0 -331
  116. package/docs/releases/RELEASE_CHECKLIST_v1.8.2.md +0 -309
  117. package/docs/releases/RELEASE_NOTES_1.7.0.md +0 -539
  118. package/docs/releases/RELEASE_NOTES_1.8.10.md +0 -239
  119. package/docs/releases/RELEASE_NOTES_1.8.9.md +0 -213
  120. package/docs/releases/RELEASE_NOTES_v1.8.0.md +0 -685
  121. package/docs/releases/RELEASE_NOTES_v1.8.1.md +0 -221
  122. package/docs/releases/RELEASE_NOTES_v1.8.2.md +0 -421
  123. package/docs/releases/RELEASE_NOTES_v1.8.3.md +0 -292
  124. package/docs/releases/RELEASE_NOTES_v1.8.4.md +0 -277
  125. package/docs/releases/RELEASE_NOTES_v1.8.6.md +0 -205
  126. package/docs/releases/RELEASE_NOTES_v1.8.7.md +0 -184
  127. package/docs/releases/RELEASE_PLAN_v1.7.6.md +0 -816
  128. package/docs/releases/RELEASE_SUMMARY_1.8.10.md +0 -193
  129. package/docs/releases/RELEASE_SUMMARY_v1.7.4.md +0 -276
  130. package/docs/releases/RELEASE_SUMMARY_v1.7.5.md +0 -322
  131. package/docs/releases/RELEASE_SUMMARY_v1.7.6.md +0 -436
  132. package/docs/releases/RELEASE_SUMMARY_v1.7.7.md +0 -391
  133. package/docs/releases/RELEASE_SUMMARY_v1.7.8.md +0 -523
  134. package/docs/releases/RELEASE_SUMMARY_v1.7.9.md +0 -542
  135. package/docs/troubleshooting/ARDUINO_IDE_VERSION_FIX_SUMMARY.md +0 -229
  136. package/docs/troubleshooting/ARDUINO_LIBRARY_NAME_FIX.md +0 -197
  137. package/docs/troubleshooting/CRASH_QUICK_REF.md +0 -93
  138. package/docs/troubleshooting/ESP32_C6_COMPATIBILITY.md +0 -157
  139. package/docs/troubleshooting/FREERTOS_ASSERTION_FAILURE.md +0 -288
  140. package/docs/troubleshooting/FREERTOS_FIX_IMPLEMENTATION.md +0 -267
  141. package/docs/troubleshooting/NPM_PUBLISHING_ISSUE_SUMMARY.md +0 -110
  142. package/docs/troubleshooting/PAINLESSMESH_V1.7.4_COMPILATION_ISSUES.md +0 -547
  143. package/docs/troubleshooting/QUICK_FIX_FREERTOS.md +0 -164
  144. package/docs/troubleshooting/SENSOR_NODE_CONNECTION_CRASH.md +0 -264
  145. package/docs/troubleshooting/common-architecture-mistakes.md +0 -438
  146. package/docs/troubleshooting/internet-access-faq.md +0 -299
  147. package/docs/troubleshooting/station-reconnection-issues.md +0 -172
  148. package/docs/v1.7.7_MQTT_IMPROVEMENTS.md +0 -794
  149. package/docs/wiki/API-Reference.md +0 -246
  150. package/docs/wiki/Complete-Documentation.md +0 -123
  151. package/examples/alteriomImproved/alteriom_sensor_package.hpp +0 -224
  152. package/examples/alteriomImproved/improved_sensor_node.ino +0 -248
  153. package/examples/alteriomImproved/platformio.ini +0 -32
  154. package/examples/alteriomMetricsHealth/alteriom_sensor_package.hpp +0 -796
  155. package/examples/alteriomMetricsHealth/metrics_health_node.ino +0 -429
  156. package/examples/alteriomMetricsHealth/platformio.ini +0 -26
  157. package/examples/alteriomPhase1/alteriom_sensor_package.hpp +0 -224
  158. package/examples/alteriomPhase1/phase1_features.ino +0 -242
  159. package/examples/alteriomPhase1/platformio.ini +0 -26
  160. package/examples/alteriomPhase2/alteriom_sensor_package.hpp +0 -224
  161. package/examples/alteriomPhase2/phase2_features.ino +0 -186
  162. package/examples/alteriomPhase2/platformio.ini +0 -26
  163. package/examples/alteriomSensorNode/alteriom_sensor_node.ino +0 -186
  164. package/examples/alteriomSensorNode/alteriom_sensor_package.hpp +0 -1227
  165. package/examples/alteriomSensorNode/platformio.ini +0 -26
  166. package/examples/bridge/alteriom_sensor_package.hpp +0 -1170
  167. package/examples/bridge/bridge_health_monitoring_example.ino +0 -188
  168. package/examples/bridge/enhanced_mqtt_bridge.hpp +0 -610
  169. package/examples/bridge/enhanced_mqtt_bridge_example.ino +0 -226
  170. package/examples/bridge/mesh_event_publisher.hpp +0 -253
  171. package/examples/bridge/mesh_topology_reporter.hpp +0 -303
  172. package/examples/bridge/mqtt_command_bridge.hpp +0 -459
  173. package/examples/bridge/mqtt_status_bridge.hpp +0 -519
  174. package/examples/bridgeAwareSensorNode/alteriom_sensor_package.hpp +0 -1227
  175. package/examples/bridgeAwareSensorNode/bridgeAwareSensorNode.ino +0 -342
  176. package/examples/bridgeAwareSensorNode/platformio.ini +0 -26
  177. package/examples/diagnosticsExample/diagnosticsExample.ino +0 -171
  178. package/examples/diagnosticsExample/platformio.ini +0 -26
  179. package/examples/echoNode/echoNode.ino +0 -33
  180. package/examples/echoNode/platformio.ini +0 -26
  181. package/examples/meshCommandNode/alteriom_sensor_package.hpp +0 -235
  182. package/examples/meshCommandNode/meshCommandNode.ino +0 -265
  183. package/examples/mqttCommandBridge/alteriom_sensor_package.hpp +0 -235
  184. package/examples/mqttCommandBridge/mesh_event_publisher.hpp +0 -253
  185. package/examples/mqttCommandBridge/mesh_topology_reporter.hpp +0 -303
  186. package/examples/mqttCommandBridge/mqttCommandBridge.ino +0 -254
  187. package/examples/mqttCommandBridge/mqtt_command_bridge.hpp +0 -462
  188. package/examples/mqttCommandBridge/platformio.ini +0 -27
  189. package/examples/mqttStatusBridge/mqttStatusBridge.ino +0 -218
  190. package/examples/mqttStatusBridge/mqtt_status_bridge.hpp +0 -522
  191. package/examples/mqttStatusBridge/platformio.ini +0 -27
  192. package/examples/mqttTopologyTest/README.md +0 -467
  193. package/examples/mqttTopologyTest/mqttTopologyTest.ino +0 -754
  194. package/examples/mqttTopologyTest/platformio.ini +0 -27
  195. package/examples/multi_bridge/README.md +0 -346
  196. package/examples/multi_bridge/primary_bridge.ino +0 -108
  197. package/examples/multi_bridge/regular_node.ino +0 -141
  198. package/examples/multi_bridge/secondary_bridge.ino +0 -123
  199. package/examples/ntpTimeSyncBridge/alteriom_sensor_package.hpp +0 -1383
  200. package/examples/ntpTimeSyncBridge/ntpTimeSyncBridge.ino +0 -86
  201. package/examples/ntpTimeSyncNode/alteriom_sensor_package.hpp +0 -1383
  202. package/examples/ntpTimeSyncNode/ntpTimeSyncNode.ino +0 -109
  203. package/examples/queued_alarms/README.md +0 -390
  204. package/examples/queued_alarms/queued_alarms.ino +0 -265
  205. package/examples/routing_demo/README.md +0 -172
  206. package/examples/routing_demo/routing_demo.ino +0 -102
  207. package/examples/rtcIntegration/README.md +0 -294
  208. package/examples/rtcIntegration/rtcIntegration.ino +0 -210
@@ -1,299 +0,0 @@
1
- # Internet Access in painlessMesh - Quick Reference
2
-
3
- ## Quick Answer
4
-
5
- **Q: Why can't my mesh nodes access the internet?**
6
-
7
- **A: Only the bridge node has internet access. Regular mesh nodes must forward data through the bridge.**
8
-
9
- ```text
10
- Internet
11
- |
12
- Router ← Your WiFi
13
- |
14
- Bridge Node ← Only this node can access internet
15
- |
16
- Mesh Network ← These nodes cannot access internet directly
17
- / | \
18
- Node1 Node2 Node3
19
- ```
20
-
21
- ## Common Error Messages
22
-
23
- If you see these errors on regular mesh nodes, you're trying to access the internet directly:
24
-
25
- ```
26
- [HTTPS] GET... failed, error: connection refused
27
- WiFi.status() != WL_CONNECTED
28
- HTTP request timeout
29
- Connection failed
30
- ```
31
-
32
- ## Quick Fix
33
-
34
- ### ❌ Wrong Approach (Doesn't Work)
35
-
36
- ```cpp
37
- // Regular mesh node trying to access internet
38
- HTTPClient http;
39
- http.begin("http://api.example.com/data");
40
- http.POST(sensorData); // FAILS!
41
- ```
42
-
43
- ### ✅ Correct Approach (Works)
44
-
45
- ```cpp
46
- // Regular mesh node sends to bridge
47
- mesh.sendSingle(bridgeNodeId, sensorData);
48
-
49
- // Bridge node forwards to internet
50
- void receivedCallback(uint32_t from, String& msg) {
51
- if (WiFi.status() == WL_CONNECTED) {
52
- HTTPClient http;
53
- http.begin("http://api.example.com/data");
54
- http.POST(msg); // WORKS!
55
- http.end();
56
- }
57
- }
58
- ```
59
-
60
- ## Architecture Patterns
61
-
62
- ### Pattern 1: Single Bridge (Basic)
63
-
64
- One designated node is the bridge:
65
-
66
- ```cpp
67
- // ==== BRIDGE NODE ====
68
- mesh.initAsBridge(MESH_PREFIX, MESH_PASSWORD,
69
- ROUTER_SSID, ROUTER_PASSWORD,
70
- &userScheduler, 5555);
71
-
72
- // ==== SENSOR NODES ====
73
- mesh.init(MESH_PREFIX, MESH_PASSWORD, &userScheduler, 5555);
74
- ```
75
-
76
- ### Pattern 2: Bridge Failover (High Availability)
77
-
78
- Multiple nodes can become bridge automatically:
79
-
80
- ```cpp
81
- // All nodes have router credentials
82
- mesh.setRouterCredentials(ROUTER_SSID, ROUTER_PASSWORD);
83
- mesh.enableBridgeFailover(true);
84
-
85
- mesh.onBridgeRoleChanged(&bridgeRoleCallback);
86
- ```
87
-
88
- ### Pattern 3: Multi-Bridge (Load Balancing)
89
-
90
- Multiple simultaneous bridges:
91
-
92
- ```cpp
93
- // Primary bridge (priority 10)
94
- mesh.initAsBridge(..., 10);
95
-
96
- // Secondary bridge (priority 5)
97
- mesh.initAsBridge(..., 5);
98
- ```
99
-
100
- ## By Use Case
101
-
102
- ### HTTP/HTTPS Requests
103
-
104
- ```cpp
105
- // Bridge forwards HTTP requests
106
- void receivedCallback(uint32_t from, String& msg) {
107
- HTTPClient http;
108
- http.begin("https://api.example.com/endpoint");
109
- http.addHeader("Content-Type", "application/json");
110
- http.POST(msg);
111
- http.end();
112
- }
113
- ```
114
-
115
- ### MQTT Publishing
116
-
117
- ```cpp
118
- // Bridge publishes to MQTT
119
- #include "PubSubClient.h"
120
- PubSubClient mqtt(wifiClient);
121
-
122
- void receivedCallback(uint32_t from, String& msg) {
123
- String topic = "mesh/sensor/" + String(from);
124
- mqtt.publish(topic.c_str(), msg.c_str());
125
- }
126
- ```
127
-
128
- ### WhatsApp Notifications
129
-
130
- ```cpp
131
- // Bridge sends WhatsApp messages
132
- #include "Callmebot_ESP32.h"
133
- Callmebot_ESP32 whatsapp;
134
-
135
- void receivedCallback(uint32_t from, String& msg) {
136
- DynamicJsonDocument doc(1024);
137
- deserializeJson(doc, msg);
138
-
139
- if (doc["alarm"] == true) {
140
- String alert = "Alarm from sensor " + String(from);
141
- whatsapp.sendMessage(alert);
142
- }
143
- }
144
- ```
145
-
146
- ### Cloud Services (AWS, Azure, GCP)
147
-
148
- ```cpp
149
- // Bridge forwards to cloud
150
- void receivedCallback(uint32_t from, String& msg) {
151
- // AWS IoT Core
152
- awsClient.publish("iot/sensor/data", msg);
153
-
154
- // Azure IoT Hub
155
- azureClient.sendEvent(msg);
156
-
157
- // Google Cloud IoT
158
- googleClient.publishTelemetry(msg);
159
- }
160
- ```
161
-
162
- ### Email Notifications
163
-
164
- ```cpp
165
- // Bridge sends email
166
- #include "ESP_Mail_Client.h"
167
-
168
- void receivedCallback(uint32_t from, String& msg) {
169
- SMTPData smtpData;
170
- smtpData.setLogin(SMTP_HOST, SMTP_PORT, EMAIL, PASSWORD);
171
- smtpData.setMessage("Sensor Alert", msg);
172
- MailClient.sendMail(smtpData);
173
- }
174
- ```
175
-
176
- ## Technical Explanation
177
-
178
- ### Why Only Bridge Has Internet?
179
-
180
- ESP8266/ESP32 WiFi hardware operates on a single channel:
181
-
182
- **Bridge Node (WIFI_AP_STA):**
183
- - Creates mesh Access Point (AP) on channel X
184
- - Connects to router Station (STA) on channel X
185
- - Both on same channel = Internet access ✅
186
-
187
- **Regular Node (WIFI_AP):**
188
- - Creates mesh Access Point (AP) on channel X
189
- - No router connection
190
- - No internet access ❌
191
-
192
- ### Can I Make All Nodes Bridges?
193
-
194
- Technically yes, but **not recommended** because:
195
-
196
- 1. **Memory overhead**: +5-10KB RAM per node
197
- 2. **Performance degradation**: All compete for router
198
- 3. **Router limits**: Max clients (typically 10-32)
199
- 4. **Power consumption**: Extra WiFi connection
200
- 5. **Loses mesh benefits**: Defeats purpose of mesh
201
-
202
- ## Complete Examples
203
-
204
- ### Sensor Network with Cloud Upload
205
-
206
- **Bridge:**
207
- ```cpp
208
- #include "painlessMesh.h"
209
- #include "HTTPClient.h"
210
-
211
- painlessMesh mesh;
212
-
213
- void setup() {
214
- mesh.initAsBridge(MESH_PREFIX, MESH_PASSWORD,
215
- ROUTER_SSID, ROUTER_PASSWORD,
216
- &userScheduler, 5555);
217
- mesh.onReceive(&receivedCallback);
218
- }
219
-
220
- void receivedCallback(uint32_t from, String& msg) {
221
- if (WiFi.status() == WL_CONNECTED) {
222
- HTTPClient http;
223
- http.begin("https://cloud.example.com/api/sensor");
224
- http.addHeader("Authorization", "Bearer " + API_KEY);
225
- http.addHeader("Content-Type", "application/json");
226
-
227
- int httpCode = http.POST(msg);
228
- if (httpCode == HTTP_CODE_OK) {
229
- Serial.println("Data uploaded to cloud");
230
- }
231
- http.end();
232
- }
233
- }
234
- ```
235
-
236
- **Sensor Node:**
237
- ```cpp
238
- #include "painlessMesh.h"
239
-
240
- painlessMesh mesh;
241
- #define BRIDGE_NODE_ID 1234567890
242
-
243
- void setup() {
244
- mesh.init(MESH_PREFIX, MESH_PASSWORD, &userScheduler, 5555);
245
- }
246
-
247
- void loop() {
248
- mesh.update();
249
- sendSensorData();
250
- }
251
-
252
- void sendSensorData() {
253
- static unsigned long lastSend = 0;
254
- if (millis() - lastSend < 60000) return;
255
- lastSend = millis();
256
-
257
- String data = "{\"sensor\":\"temp\",\"value\":" +
258
- String(readTemperature()) + ",\"nodeId\":" +
259
- String(mesh.getNodeId()) + "}";
260
-
261
- mesh.sendSingle(BRIDGE_NODE_ID, data);
262
- }
263
- ```
264
-
265
- ## Troubleshooting Checklist
266
-
267
- - [ ] Verify which node is the bridge
268
- - [ ] Check bridge has `initAsBridge()` or router credentials
269
- - [ ] Confirm bridge shows `WiFi.status() == WL_CONNECTED`
270
- - [ ] Verify regular nodes use `mesh.init()` without router
271
- - [ ] Check sensor nodes send to bridge, not directly to internet
272
- - [ ] Verify bridge forwards received messages to internet
273
- - [ ] Test bridge internet connection with simple HTTP request
274
- - [ ] Check serial output for connection errors
275
- - [ ] Monitor memory usage on bridge node
276
- - [ ] Verify firewall/router allows bridge's outbound connections
277
-
278
- ## More Information
279
-
280
- - **[Common Architecture Mistakes](common-architecture-mistakes.md)** - Detailed guide
281
- - **[BRIDGE_TO_INTERNET.md](../../BRIDGE_TO_INTERNET.md)** - Complete setup guide
282
- - **[Bridge Failover](../BRIDGE_FAILOVER.md)** - High availability
283
- - **[FAQ](faq.md)** - Common questions
284
- - **[examples/mqttBridge/](../../examples/mqttBridge/)** - Working example
285
-
286
- ## Still Having Issues?
287
-
288
- When asking for help, provide:
289
-
290
- 1. Which node is the bridge? (show setup code)
291
- 2. Which nodes are sensors? (show setup code)
292
- 3. Serial output from bridge (with debug enabled)
293
- 4. Serial output from sensor node (with debug enabled)
294
- 5. Complete error message
295
- 6. What you're trying to access (HTTP API, MQTT, etc.)
296
-
297
- Post in:
298
- - [GitHub Issues](https://github.com/Alteriom/painlessMesh/issues)
299
- - [Community Forum](https://groups.google.com/forum/#!forum/painlessmesh-user)
@@ -1,172 +0,0 @@
1
- # Station Reconnection Issues in Bridge Mode
2
-
3
- ## Problem Description
4
-
5
- When using `stationManual()` to create a bridge node that connects to a router while also maintaining a mesh network, users may experience issues where the station (router) connection drops during mesh initialization and fails to reconnect automatically.
6
-
7
- ### Symptoms
8
-
9
- - Initial connection to router succeeds
10
- - Mesh network initializes successfully
11
- - Station connection drops with `ARDUINO_EVENT_WIFI_STA_DISCONNECTED` events
12
- - Station never reconnects despite reconnection logic being triggered
13
- - Serial output shows repeated disconnect events without successful reconnection
14
-
15
- ### Example Serial Output
16
-
17
- ```
18
- === WiFi Connectivity Diagnostics ===
19
- Step 1: Connecting to router to detect channel...
20
- ✓ Successfully connected to router!
21
- Router Channel: 6 ← Auto-detected!
22
- Router IP: 192.168.18.11
23
-
24
- Step 2: Initializing mesh on channel 6...
25
- STARTUP: init(): 1
26
- STARTUP: init(): Mesh channel set to 6
27
- STARTUP: AP tcp server established on port 5555
28
- STARTUP: stationManual(): Connecting to MyRouter
29
- STARTUP: stationManual(): Connection initiated
30
- ✓ Mesh initialized
31
-
32
- Step 3: Waiting for station reconnection...
33
- CONNECTION: eventSTADisconnectedHandler: ARDUINO_EVENT_WIFI_STA_DISCONNECTED
34
- CONNECTION: eraseClosedConnections():
35
- CONNECTION: eventSTADisconnectedHandler: ARDUINO_EVENT_WIFI_STA_DISCONNECTED
36
- CONNECTION: eraseClosedConnections():
37
- ⚠ Station not connected yet (may connect later)
38
- ```
39
-
40
- ## Root Cause
41
-
42
- The issue was in the `connectToAP()` method in `src/painlessMeshSTA.cpp`. When operating in manual mode (for router connections via `stationManual()`):
43
-
44
- 1. Station disconnects during mesh initialization (normal behavior in AP+STA mode)
45
- 2. Disconnect callback triggers `yieldConnectToAP()` to reconnect
46
- 3. `connectToAP()` checks if router SSID is in the scan results
47
- 4. Router SSID is NOT in scan results (scan only looks for mesh nodes on mesh channel)
48
- 5. Function returns without calling `WiFi.begin()` to reconnect
49
- 6. Station remains disconnected indefinitely
50
-
51
- ### Code Analysis
52
-
53
- **Before Fix** (lines 192-195 in `painlessMeshSTA.cpp`):
54
-
55
- ```cpp
56
- } else if (aps.empty() || !ssid.equals(aps.begin()->ssid)) {
57
- task.enableDelayed(SCAN_INTERVAL);
58
- return; // ← Just delays, never attempts reconnection!
59
- }
60
- ```
61
-
62
- The problem: This conditional assumes the router SSID will appear in the `aps` list from `stationScan()`. However, `stationScan()` only scans on the mesh channel for mesh nodes, not for routers which may be on the same or different channel.
63
-
64
- ## Solution
65
-
66
- **After Fix** (v1.8.1+):
67
-
68
- ```cpp
69
- } else {
70
- // For manual router connections, reconnect directly using WiFi.begin()
71
- // Don't rely on scan results since router may be on different channel
72
- Log(CONNECTION,
73
- "connectToAP(): Manual connection - attempting to reconnect to %s\n",
74
- ssid.c_str());
75
- WiFi.begin(ssid.c_str(), password.c_str());
76
- task.enableDelayed(SCAN_INTERVAL);
77
- return;
78
- }
79
- ```
80
-
81
- The fix:
82
- - Removes dependency on scan results for manual connections
83
- - Calls `WiFi.begin()` directly to reconnect to the router
84
- - Lets ESP hardware auto-detect the router's channel (as designed)
85
- - Adds clear logging to show reconnection attempts
86
-
87
- ## Verification
88
-
89
- After applying the fix, the expected behavior is:
90
-
91
- ```
92
- Step 3: Waiting for station reconnection...
93
- CONNECTION: eventSTADisconnectedHandler: ARDUINO_EVENT_WIFI_STA_DISCONNECTED
94
- CONNECTION: eraseClosedConnections():
95
- CONNECTION: connectToAP(): Manual connection - attempting to reconnect to MyRouter
96
- ✓ Station reconnected successfully!
97
- IP Address: 192.168.18.11
98
- ```
99
-
100
- ## Workaround (for older versions)
101
-
102
- If you're using a version before v1.8.1, you can work around this issue by implementing explicit reconnection logic:
103
-
104
- ```cpp
105
- void setup() {
106
- // ... mesh initialization ...
107
-
108
- // Add a task to monitor and reconnect station
109
- userScheduler.addTask(Task(5000, TASK_FOREVER, [](){
110
- if (WiFi.status() != WL_CONNECTED) {
111
- Serial.println("Station disconnected, reconnecting...");
112
- WiFi.begin(ROUTER_SSID, ROUTER_PASSWORD);
113
- }
114
- }));
115
- }
116
- ```
117
-
118
- ## Related Issues
119
-
120
- - Issue #21: Original user report from @woodlist
121
- - Issue #50: Bug tracking for stationManual() channel issues
122
- - Issue #59: Bridge-centric architecture proposal
123
- - PR #[number]: Fix implementation
124
-
125
- ## Affected Versions
126
-
127
- - **Affected**: v1.5.0 - v1.8.0
128
- - **Fixed**: v1.8.1+
129
-
130
- ## Platforms
131
-
132
- This issue affects all ESP platforms:
133
- - ESP32 (all variants including ESP32-C6, ESP32-S3)
134
- - ESP8266
135
-
136
- ## Additional Notes
137
-
138
- ### Why Does Station Disconnect During Mesh Init?
139
-
140
- When the ESP switches from pure STA mode to AP+STA mode during mesh initialization, the WiFi subsystem may briefly disconnect from the station to reconfigure. This is normal behavior and the library should automatically reconnect.
141
-
142
- ### Channel Matching
143
-
144
- Remember that in AP+STA mode, both the AP (mesh) and STA (router connection) **must use the same WiFi channel**. This is a hardware limitation. The fix ensures reconnection works regardless of channel, but both interfaces will still operate on the same channel.
145
-
146
- ### Best Practice
147
-
148
- For production bridge nodes, consider using the "Station First" pattern to auto-detect the router's channel before initializing the mesh:
149
-
150
- ```cpp
151
- void setup() {
152
- // Step 1: Connect to router first to detect its channel
153
- WiFi.mode(WIFI_STA);
154
- WiFi.begin(ROUTER_SSID, ROUTER_PASSWORD);
155
- while (WiFi.status() != WL_CONNECTED) {
156
- delay(500);
157
- }
158
-
159
- uint8_t detectedChannel = WiFi.channel();
160
- Serial.printf("Router channel: %d\n", detectedChannel);
161
-
162
- WiFi.disconnect();
163
- delay(1000);
164
-
165
- // Step 2: Initialize mesh on the detected channel
166
- mesh.init(MESH_SSID, MESH_PASSWORD, &userScheduler, MESH_PORT,
167
- WIFI_AP_STA, detectedChannel);
168
- mesh.stationManual(ROUTER_SSID, ROUTER_PASSWORD);
169
- }
170
- ```
171
-
172
- This approach guarantees channel compatibility and more reliable connections.