@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.
Files changed (208) hide show
  1. package/BRIDGE_TO_INTERNET.md +229 -0
  2. package/CHANGELOG.md +89 -1
  3. package/CONTRIBUTING.md +79 -0
  4. package/README.md +70 -143
  5. package/docs/README.md +1 -0
  6. package/docs/api/shared-gateway.md +1207 -0
  7. package/docs/troubleshooting/common-issues.md +28 -0
  8. package/docs/troubleshooting/faq.md +113 -12
  9. package/examples/basic/test/simulator/CMakeLists.txt +40 -0
  10. package/examples/basic/test/simulator/README.md +149 -0
  11. package/examples/basic/test/simulator/firmware/basic_firmware.hpp +117 -0
  12. package/examples/basic/test/simulator/scenarios/basic_mesh_test.yaml +81 -0
  13. package/examples/bridge/bridge.ino +17 -4
  14. package/examples/bridge_failover/README.md +81 -0
  15. package/examples/bridge_failover/bridge_failover.ino +51 -6
  16. package/examples/sharedGateway/README.md +235 -0
  17. package/examples/{meshCommandNode → sharedGateway}/platformio.ini +3 -2
  18. package/examples/sharedGateway/sharedGateway.ino +303 -0
  19. package/library.json +3 -22
  20. package/library.properties +1 -1
  21. package/package.json +3 -3
  22. package/src/arduino/wifi.hpp +380 -13
  23. package/src/painlessmesh/gateway.hpp +2120 -0
  24. package/src/painlessmesh/mesh.hpp +1034 -6
  25. package/src/painlessmesh/message_tracker.hpp +311 -0
  26. package/src/painlessmesh/protocol.hpp +6 -0
  27. package/DOCUMENTATION_INDEX.md +0 -146
  28. package/docs/API_DESIGN_GUIDELINES.md +0 -414
  29. package/docs/ARDUINO_LIBRARY_MANAGER_SUBMISSION.md +0 -331
  30. package/docs/BOOLEAN_NAMING_CONVENTION.md +0 -235
  31. package/docs/BRIDGE_FAILOVER.md +0 -512
  32. package/docs/BRIDGE_HEALTH_MONITORING.md +0 -293
  33. package/docs/CHANNEL_SYNCHRONIZATION.md +0 -209
  34. package/docs/CREATE_MISSING_RELEASES.md +0 -321
  35. package/docs/DOCUMENTATION_MIGRATION_PLAN.md +0 -176
  36. package/docs/FAQ_VERSION_NUMBERS.md +0 -152
  37. package/docs/IMPLEMENTATION_PLAN_MESH_TOPOLOGY.md +0 -1062
  38. package/docs/MESH_TOPOLOGY_GUIDE.md +0 -992
  39. package/docs/MESH_TOPOLOGY_PROGRESS.md +0 -422
  40. package/docs/MQTT_BRIDGE_COMMANDS.md +0 -894
  41. package/docs/MQTT_BRIDGE_IMPLEMENTATION_SUMMARY.md +0 -324
  42. package/docs/MQTT_COMMAND_SCHEMA_PROPOSAL.md +0 -576
  43. package/docs/MQTT_SCHEMA_COMPLIANCE.md +0 -340
  44. package/docs/MQTT_SCHEMA_PROPOSALS.md +0 -446
  45. package/docs/MQTT_SCHEMA_REVIEW.md +0 -690
  46. package/docs/OTA_COMMANDS_REFERENCE.md +0 -554
  47. package/docs/PHASE1_GUIDE.md +0 -349
  48. package/docs/PHASE2_GUIDE.md +0 -543
  49. package/docs/QUICK_REFERENCE_VERSIONING.md +0 -127
  50. package/docs/RELEASE_AGENT_SUMMARY.md +0 -386
  51. package/docs/SCHEMA_VALIDATION_CHECKLIST.md +0 -222
  52. package/docs/VERSION_MANAGEMENT.md +0 -213
  53. package/docs/archive/DOCUSAURUS_DEPLOYMENT.md +0 -166
  54. package/docs/archive/FEATURE_PROPOSALS.md +0 -337
  55. package/docs/archive/LIBRARY_JSON_FIX.md +0 -98
  56. package/docs/archive/LIBRARY_STRUCTURE_FIX.md +0 -215
  57. package/docs/archive/PHASE1_IMPLEMENTATION.md +0 -325
  58. package/docs/archive/PHASE2_IMPLEMENTATION.md +0 -567
  59. package/docs/archive/RELEASE_SUMMARY.md +0 -173
  60. package/docs/archive/SCONS_BUILD_FIX.md +0 -313
  61. package/docs/archive/TRIGGER_RELEASE.md +0 -280
  62. package/docs/archive/VECTOR_INCLUDE_FIX.md +0 -129
  63. package/docs/archive/ota-and-status-enhancements.md +0 -911
  64. package/docs/archive/ota-status-architecture-diagrams.md +0 -658
  65. package/docs/archive/ota-status-quick-reference.md +0 -284
  66. package/docs/design/.gitkeep +0 -1
  67. package/docs/design/STATION_CREDENTIALS_DESIGN.md +0 -182
  68. package/docs/development/ARDUINO_COMPLIANCE_SUMMARY.md +0 -71
  69. package/docs/development/CODE_REFACTORING_RECOMMENDATIONS.md +0 -1011
  70. package/docs/development/DOCKER_TESTING.md +0 -196
  71. package/docs/development/PLATFORMIO_USAGE.md +0 -180
  72. package/docs/development/TESTING_SUMMARY.md +0 -126
  73. package/docs/development/contributing.md +0 -301
  74. package/docs/development/documentation.md +0 -583
  75. package/docs/features/DIAGNOSTICS_API.md +0 -534
  76. package/docs/implementation/BRIDGE_ARCHITECTURE_IMPLEMENTATION.md +0 -340
  77. package/docs/implementation/BRIDGE_HEALTH_MONITORING_IMPLEMENTATION.md +0 -213
  78. package/docs/implementation/BRIDGE_STATUS_FEATURE.md +0 -635
  79. package/docs/implementation/DIAGNOSTICS_API_IMPLEMENTATION.md +0 -232
  80. package/docs/implementation/IMPLEMENTATION_COMPLETE.md +0 -228
  81. package/docs/implementation/IMPLEMENTATION_NTP_TIME_SYNC.md +0 -325
  82. package/docs/implementation/IMPLEMENTATION_SUMMARY.md +0 -316
  83. package/docs/implementation/MESSAGE_QUEUE_IMPLEMENTATION.md +0 -405
  84. package/docs/implementation/MULTI_BRIDGE_IMPLEMENTATION.md +0 -520
  85. package/docs/implementation/NTP_TIME_SYNC_FEATURE.md +0 -392
  86. package/docs/improvements/FUTURE_PROPOSALS.md +0 -1016
  87. package/docs/improvements/IMPLEMENTATION_HISTORY.md +0 -1091
  88. package/docs/improvements/OTA_STATUS_ENHANCEMENTS.md +0 -709
  89. package/docs/improvements/README.md +0 -212
  90. package/docs/internal/CUSTOM_AGENT_ANALYSIS.md +0 -391
  91. package/docs/internal/ISSUE_65_VERIFICATION.md +0 -947
  92. package/docs/internal/ISSUE_66_CLOSURE.md +0 -249
  93. package/docs/internal/ISSUE_66_STATUS.md +0 -316
  94. package/docs/internal/PR_SUMMARY.md +0 -315
  95. package/docs/internal/REVIEW_SUMMARY.md +0 -332
  96. package/docs/multi-bridge-setup.md +0 -1025
  97. package/docs/platformio-publishing.md +0 -255
  98. package/docs/platformio-setup-summary.md +0 -121
  99. package/docs/releases/ANNOUNCEMENT_v1.8.6.md +0 -63
  100. package/docs/releases/ANNOUNCEMENT_v1.8.7.md +0 -113
  101. package/docs/releases/BRIDGE_STATUS_SELF_REGISTRATION_FIX.md +0 -221
  102. package/docs/releases/FEATURE_HISTORY.md +0 -543
  103. package/docs/releases/GITHUB_RELEASE_v1.8.6.md +0 -71
  104. package/docs/releases/GITHUB_RELEASE_v1.8.7.md +0 -90
  105. package/docs/releases/PATCH_v1.7.2.md +0 -262
  106. package/docs/releases/PATCH_v1.7.3.md +0 -262
  107. package/docs/releases/PATCH_v1.7.4.md +0 -219
  108. package/docs/releases/PHASE1_SUMMARY.md +0 -246
  109. package/docs/releases/PHASE2_SUMMARY.md +0 -499
  110. package/docs/releases/PUBLISH_v1.8.0_INSTRUCTIONS.md +0 -163
  111. package/docs/releases/QUICK_START_RELEASES.md +0 -113
  112. package/docs/releases/RELEASE_CHECKLIST_1.8.10.md +0 -331
  113. package/docs/releases/RELEASE_CHECKLIST_1.8.9.md +0 -207
  114. package/docs/releases/RELEASE_CHECKLIST_v1.7.4.md +0 -253
  115. package/docs/releases/RELEASE_CHECKLIST_v1.7.5.md +0 -315
  116. package/docs/releases/RELEASE_CHECKLIST_v1.7.6.md +0 -389
  117. package/docs/releases/RELEASE_CHECKLIST_v1.8.0.md +0 -331
  118. package/docs/releases/RELEASE_CHECKLIST_v1.8.2.md +0 -309
  119. package/docs/releases/RELEASE_NOTES_1.7.0.md +0 -539
  120. package/docs/releases/RELEASE_NOTES_1.8.10.md +0 -239
  121. package/docs/releases/RELEASE_NOTES_1.8.9.md +0 -213
  122. package/docs/releases/RELEASE_NOTES_v1.8.0.md +0 -685
  123. package/docs/releases/RELEASE_NOTES_v1.8.1.md +0 -221
  124. package/docs/releases/RELEASE_NOTES_v1.8.2.md +0 -421
  125. package/docs/releases/RELEASE_NOTES_v1.8.3.md +0 -292
  126. package/docs/releases/RELEASE_NOTES_v1.8.4.md +0 -277
  127. package/docs/releases/RELEASE_NOTES_v1.8.6.md +0 -205
  128. package/docs/releases/RELEASE_NOTES_v1.8.7.md +0 -184
  129. package/docs/releases/RELEASE_PLAN_v1.7.6.md +0 -816
  130. package/docs/releases/RELEASE_SUMMARY_1.8.10.md +0 -193
  131. package/docs/releases/RELEASE_SUMMARY_v1.7.4.md +0 -276
  132. package/docs/releases/RELEASE_SUMMARY_v1.7.5.md +0 -322
  133. package/docs/releases/RELEASE_SUMMARY_v1.7.6.md +0 -436
  134. package/docs/releases/RELEASE_SUMMARY_v1.7.7.md +0 -391
  135. package/docs/releases/RELEASE_SUMMARY_v1.7.8.md +0 -523
  136. package/docs/releases/RELEASE_SUMMARY_v1.7.9.md +0 -542
  137. package/docs/troubleshooting/ARDUINO_IDE_VERSION_FIX_SUMMARY.md +0 -229
  138. package/docs/troubleshooting/ARDUINO_LIBRARY_NAME_FIX.md +0 -197
  139. package/docs/troubleshooting/CRASH_QUICK_REF.md +0 -93
  140. package/docs/troubleshooting/ESP32_C6_COMPATIBILITY.md +0 -157
  141. package/docs/troubleshooting/FREERTOS_ASSERTION_FAILURE.md +0 -288
  142. package/docs/troubleshooting/FREERTOS_FIX_IMPLEMENTATION.md +0 -267
  143. package/docs/troubleshooting/NPM_PUBLISHING_ISSUE_SUMMARY.md +0 -110
  144. package/docs/troubleshooting/PAINLESSMESH_V1.7.4_COMPILATION_ISSUES.md +0 -547
  145. package/docs/troubleshooting/QUICK_FIX_FREERTOS.md +0 -164
  146. package/docs/troubleshooting/SENSOR_NODE_CONNECTION_CRASH.md +0 -264
  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 -96
  197. package/examples/multi_bridge/regular_node.ino +0 -141
  198. package/examples/multi_bridge/secondary_bridge.ino +0 -111
  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,392 +0,0 @@
1
- # NTP Time Synchronization Feature
2
-
3
- ## Overview
4
-
5
- The NTP Time Synchronization feature enables bridge nodes with Internet connectivity to distribute authoritative NTP time to all nodes in the mesh network. This eliminates the need for each node to query NTP servers individually, saving bandwidth, power, and reducing network congestion.
6
-
7
- ## Type ID: 614 (TIME_SYNC_NTP)
8
-
9
- ## Architecture
10
-
11
- ```
12
- Internet
13
- |
14
- | NTP Query
15
- v
16
- Bridge Node ---------> Regular Node 1
17
- | |
18
- | Broadcast | Update Time
19
- | Type 614 | Sync RTC
20
- | |
21
- +----------------> Regular Node 2
22
- | |
23
- +----------------> Regular Node 3
24
- |
25
- v
26
- Application Code
27
- ```
28
-
29
- ## Package Structure
30
-
31
- ### NTPTimeSyncPackage (Type 614)
32
-
33
- ```cpp
34
- class NTPTimeSyncPackage : public painlessmesh::plugin::BroadcastPackage {
35
- public:
36
- uint32_t ntpTime = 0; // Unix timestamp from NTP server (seconds)
37
- uint16_t accuracy = 0; // Milliseconds uncertainty/precision
38
- TSTRING source = ""; // NTP server source (e.g., "pool.ntp.org")
39
- uint32_t timestamp = 0; // Collection timestamp (millis())
40
- uint16_t messageType = 614; // MQTT Schema message_type
41
- };
42
- ```
43
-
44
- ### JSON Format
45
-
46
- ```json
47
- {
48
- "type": 614,
49
- "from": 123456,
50
- "routing": 2,
51
- "ntpTime": 1699564800,
52
- "accuracy": 50,
53
- "source": "pool.ntp.org",
54
- "timestamp": 12345678,
55
- "message_type": 614
56
- }
57
- ```
58
-
59
- ## Implementation Guide
60
-
61
- ### Bridge Node (Sender)
62
-
63
- The bridge node queries NTP and broadcasts time to the mesh:
64
-
65
- ```cpp
66
- #include "painlessMesh.h"
67
- #include "examples/alteriom/alteriom_sensor_package.hpp"
68
-
69
- using namespace alteriom;
70
-
71
- painlessMesh mesh;
72
-
73
- // Periodic task to broadcast NTP time
74
- Task taskBroadcastNTP(60000, TASK_FOREVER, [](){
75
- auto pkg = NTPTimeSyncPackage();
76
- pkg.from = mesh.getNodeId();
77
- pkg.ntpTime = mesh.getNodeTime() / 1000000; // Convert to seconds
78
- pkg.accuracy = 50; // 50ms uncertainty
79
- pkg.source = "pool.ntp.org";
80
- pkg.timestamp = millis();
81
-
82
- mesh.sendBroadcast(pkg.toJson());
83
- });
84
-
85
- void setup() {
86
- mesh.init(MESH_PREFIX, MESH_PASSWORD, &userScheduler, MESH_PORT);
87
- mesh.stationManual(ROUTER_SSID, ROUTER_PASSWORD); // Bridge mode
88
-
89
- userScheduler.addTask(taskBroadcastNTP);
90
- taskBroadcastNTP.enable();
91
- }
92
- ```
93
-
94
- ### Regular Node (Receiver)
95
-
96
- Regular nodes receive and apply NTP time:
97
-
98
- ```cpp
99
- #include "painlessMesh.h"
100
- #include "examples/alteriom/alteriom_sensor_package.hpp"
101
-
102
- using namespace alteriom;
103
-
104
- void receivedCallback(uint32_t from, String& msg) {
105
- DynamicJsonDocument doc(1024);
106
- deserializeJson(doc, msg);
107
- JsonObject obj = doc.as<JsonObject>();
108
-
109
- if (obj["type"] == 614) {
110
- auto pkg = NTPTimeSyncPackage(obj);
111
-
112
- // Verify sender is a bridge (optional but recommended)
113
- if (isBridgeNode(from)) {
114
- // Apply time synchronization
115
- mesh.setTimeFromNTP(pkg.ntpTime);
116
-
117
- // Optional: Sync RTC module if available
118
- #ifdef HAS_RTC
119
- rtc.setTime(pkg.ntpTime);
120
- #endif
121
-
122
- Serial.printf("Time synced from %s (±%ums)\n",
123
- pkg.source.c_str(), pkg.accuracy);
124
- }
125
- }
126
- }
127
-
128
- void setup() {
129
- mesh.init(MESH_PREFIX, MESH_PASSWORD, &userScheduler, MESH_PORT);
130
- mesh.onReceive(&receivedCallback);
131
- }
132
- ```
133
-
134
- ## Field Details
135
-
136
- ### ntpTime (uint32_t)
137
- - Unix timestamp in seconds since epoch (1970-01-01 00:00:00 UTC)
138
- - Range: 0 to 4,294,967,295 (year 2106)
139
- - Example: 1699564800 = 2023-11-09 20:00:00 UTC
140
-
141
- ### accuracy (uint16_t)
142
- - Time uncertainty in milliseconds
143
- - Range: 0 to 65,535ms (0 to 65.5 seconds)
144
- - Typical values:
145
- - 10-50ms: Good NTP connection
146
- - 50-200ms: Average NTP connection
147
- - 200-1000ms: Poor/distant NTP server
148
- - 1000-5000ms: Very poor connection or local time source
149
-
150
- ### source (TSTRING)
151
- - NTP server hostname or IP address
152
- - Examples:
153
- - "pool.ntp.org"
154
- - "time.google.com"
155
- - "time.nist.gov"
156
- - "192.168.1.1" (local router)
157
- - Empty string if no NTP available
158
-
159
- ### timestamp (uint32_t)
160
- - When the time was collected/broadcast (millis())
161
- - Used for calculating staleness of time data
162
- - Wraps around every 49.7 days
163
-
164
- ## Best Practices
165
-
166
- ### For Bridge Nodes
167
-
168
- 1. **Update Frequency**: Broadcast every 30-60 seconds
169
- - Too frequent: Wastes bandwidth
170
- - Too infrequent: Nodes may drift
171
-
172
- 2. **NTP Query Strategy**: Query NTP less frequently than broadcast
173
- - Query NTP every 5-15 minutes
174
- - Cache and reuse recent NTP time
175
- - Update accuracy field based on staleness
176
-
177
- 3. **Error Handling**: Handle NTP failures gracefully
178
- - Stop broadcasting if NTP unavailable for >15 minutes
179
- - Or increase accuracy value to indicate uncertainty
180
-
181
- ### For Regular Nodes
182
-
183
- 1. **Validation**: Verify sender is bridge before applying time
184
- ```cpp
185
- bool isBridgeNode(uint32_t nodeId) {
186
- // Check if node is in bridge list
187
- // Or check if node has Internet connectivity flag
188
- }
189
- ```
190
-
191
- 2. **Staleness Check**: Don't apply very old time data
192
- ```cpp
193
- uint32_t age = millis() - pkg.timestamp;
194
- if (age > 120000) { // Older than 2 minutes
195
- Serial.println("Time data too old, ignoring");
196
- return;
197
- }
198
- ```
199
-
200
- 3. **Accuracy Threshold**: Only apply if accuracy is acceptable
201
- ```cpp
202
- if (pkg.accuracy > 1000) { // Worse than 1 second
203
- Serial.println("Time accuracy too poor, ignoring");
204
- return;
205
- }
206
- ```
207
-
208
- 4. **RTC Integration**: Sync RTC for offline operation
209
- ```cpp
210
- if (rtcEnabled && pkg.accuracy < 500) {
211
- rtc.setTime(pkg.ntpTime);
212
- Serial.println("RTC synced with NTP time");
213
- }
214
- ```
215
-
216
- ## Benefits
217
-
218
- ### Network Efficiency
219
- - **Reduced NTP queries**: Only bridge queries NTP, not every node
220
- - **Lower bandwidth**: One NTP query serves entire mesh
221
- - **Less congestion**: Fewer nodes competing for Internet access
222
-
223
- ### Power Savings
224
- - **No WiFi switching**: Nodes stay on mesh, don't need router connection
225
- - **Lower power**: No NTP protocol overhead per node
226
- - **Longer battery life**: Especially important for sensor nodes
227
-
228
- ### Improved Accuracy
229
- - **Authoritative source**: Bridge has better NTP access than distant nodes
230
- - **Lower latency**: Mesh broadcast faster than Internet NTP
231
- - **Better synchronization**: All nodes sync to same time source
232
-
233
- ### Offline Operation
234
- - **RTC sync**: Nodes can sync RTC modules for offline timekeeping
235
- - **Time continuity**: Time available even when bridge loses Internet
236
- - **Graceful degradation**: Mesh continues with cached time
237
-
238
- ## Security Considerations
239
-
240
- ### Trust and Validation
241
-
242
- 1. **Bridge Authentication**: Verify time source is trusted bridge
243
- - Use bridge node whitelist
244
- - Check sender's bridge status flag
245
- - Validate against multiple bridges if available
246
-
247
- 2. **Replay Attack Prevention**: Check timestamp freshness
248
- ```cpp
249
- static uint32_t lastTimestamp = 0;
250
- if (pkg.timestamp <= lastTimestamp) {
251
- // Potential replay attack or clock rollback
252
- return;
253
- }
254
- lastTimestamp = pkg.timestamp;
255
- ```
256
-
257
- 3. **Sanity Checks**: Validate time is reasonable
258
- ```cpp
259
- const uint32_t MIN_TIME = 1609459200; // 2021-01-01
260
- const uint32_t MAX_TIME = 2147483647; // 2038-01-19
261
-
262
- if (pkg.ntpTime < MIN_TIME || pkg.ntpTime > MAX_TIME) {
263
- Serial.println("Time out of valid range");
264
- return;
265
- }
266
- ```
267
-
268
- 4. **Large Jump Detection**: Reject suspicious time changes
269
- ```cpp
270
- uint32_t currentTime = getCurrentTime();
271
- int32_t timeDelta = pkg.ntpTime - currentTime;
272
-
273
- if (abs(timeDelta) > 86400) { // More than 1 day
274
- Serial.println("Time change too large, manual intervention needed");
275
- return;
276
- }
277
- ```
278
-
279
- ## Example Applications
280
-
281
- ### Sensor Network
282
- - All sensors use synchronized timestamps
283
- - Data correlation across nodes is accurate
284
- - Event ordering is consistent
285
-
286
- ### Coordinated Actions
287
- - Multiple nodes can trigger actions at specific times
288
- - Light shows with precise timing
289
- - Scheduled operations across mesh
290
-
291
- ### Data Logging
292
- - Consistent timestamps for all log entries
293
- - Time-series data from multiple sources can be merged
294
- - Historical analysis is accurate
295
-
296
- ### Security Systems
297
- - Event timestamps are reliable for audit logs
298
- - Video/sensor correlation across devices
299
- - Alarm scheduling with accurate time
300
-
301
- ## Testing
302
-
303
- ### Unit Tests
304
-
305
- The feature includes comprehensive unit tests in `test/catch/catch_alteriom_packages.cpp`:
306
-
307
- - Basic serialization/deserialization
308
- - JSON field validation
309
- - Different NTP sources
310
- - Edge cases (0 values, max values)
311
- - Long source hostnames
312
- - High accuracy values
313
-
314
- Run tests:
315
- ```bash
316
- cd painlessMesh
317
- cmake -G Ninja .
318
- ninja
319
- ./bin/catch_alteriom_packages
320
- ```
321
-
322
- ### Integration Testing
323
-
324
- Test with example sketches:
325
-
326
- 1. Upload `ntpTimeSyncBridge.ino` to bridge node with Internet
327
- 2. Upload `ntpTimeSyncNode.ino` to regular mesh nodes
328
- 3. Monitor serial output to verify:
329
- - Bridge broadcasts NTP time
330
- - Nodes receive and apply time
331
- - Timestamps are consistent
332
-
333
- ## Troubleshooting
334
-
335
- ### Bridge Not Broadcasting
336
-
337
- **Symptoms**: No NTP broadcasts seen by nodes
338
-
339
- **Solutions**:
340
- 1. Check Internet connectivity: `ping 8.8.8.8`
341
- 2. Verify NTP server is reachable
342
- 3. Check broadcast task is enabled
343
- 4. Increase debug level: `mesh.setDebugMsgTypes(ERROR | STARTUP | CONNECTION)`
344
-
345
- ### Nodes Not Receiving Time
346
-
347
- **Symptoms**: Nodes connected but not syncing time
348
-
349
- **Solutions**:
350
- 1. Verify receiver callback is registered: `mesh.onReceive(&receivedCallback)`
351
- 2. Check message type parsing: `obj["type"] == 614`
352
- 3. Ensure JSON buffer is large enough: `DynamicJsonDocument doc(1024)`
353
- 4. Monitor for JSON parse errors
354
-
355
- ### Poor Time Accuracy
356
-
357
- **Symptoms**: High accuracy values (>500ms)
358
-
359
- **Solutions**:
360
- 1. Use closer NTP server (local or regional)
361
- 2. Check network latency to NTP server
362
- 3. Reduce NTP query frequency
363
- 4. Consider using multiple NTP sources and averaging
364
-
365
- ### Time Drift
366
-
367
- **Symptoms**: Time gradually becomes inaccurate
368
-
369
- **Solutions**:
370
- 1. Increase broadcast frequency (30-60 seconds)
371
- 2. Verify NTP queries are successful
372
- 3. Check for mesh network stability issues
373
- 4. Use RTC module for drift compensation
374
-
375
- ## Related Features
376
-
377
- - **Bridge Status (Type 610)**: Indicates bridge connectivity status
378
- - **RTC Integration**: Offline timekeeping when NTP unavailable
379
- - **Mesh Time Sync**: Built-in mesh time synchronization protocol
380
-
381
- ## Version History
382
-
383
- - **v1.8.1**: Initial implementation of NTP time sync feature
384
- - Type ID 614 allocated for TIME_SYNC_NTP
385
- - Examples and documentation added
386
-
387
- ## References
388
-
389
- - Issue: Enhancement: Bridge-to-Mesh NTP Time Distribution
390
- - Examples: `examples/ntpTimeSyncBridge/` and `examples/ntpTimeSyncNode/`
391
- - Tests: `test/catch/catch_alteriom_packages.cpp`
392
- - Package: `examples/alteriom/alteriom_sensor_package.hpp`