@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.
- package/BRIDGE_TO_INTERNET.md +229 -0
- package/CHANGELOG.md +61 -1
- package/CONTRIBUTING.md +79 -0
- package/README.md +69 -144
- package/docs/README.md +1 -0
- package/docs/api/shared-gateway.md +1207 -0
- package/examples/bridge_failover/README.md +81 -0
- package/examples/bridge_failover/bridge_failover.ino +35 -4
- 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 -6
- package/src/arduino/wifi.hpp +342 -4
- 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/RELEASE_NOTES_1.8.15.md +0 -160
- package/RELEASE_READINESS_PLAN.md +0 -323
- package/TESTING_WITH_SIMULATOR.md +0 -259
- 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/BRIDGE_INITIALIZATION_FALLBACK.md +0 -357
- 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/SIMULATOR_TESTING.md +0 -408
- 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/common-architecture-mistakes.md +0 -438
- package/docs/troubleshooting/internet-access-faq.md +0 -299
- 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 -108
- package/examples/multi_bridge/regular_node.ino +0 -141
- package/examples/multi_bridge/secondary_bridge.ino +0 -123
- 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,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.
|