@alteriom/painlessmesh 1.6.1 → 1.7.2

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 (129) hide show
  1. package/CHANGELOG.md +380 -143
  2. package/LICENSE +674 -674
  3. package/README.md +477 -434
  4. package/RELEASE_GUIDE.md +504 -418
  5. package/docs/DOCUMENTATION_MIGRATION_PLAN.md +175 -175
  6. package/docs/IMPLEMENTATION_PLAN_MESH_TOPOLOGY.md +1062 -0
  7. package/docs/MESH_TOPOLOGY_GUIDE.md +992 -0
  8. package/docs/MESH_TOPOLOGY_PROGRESS.md +422 -0
  9. package/docs/MQTT_BRIDGE_COMMANDS.md +894 -0
  10. package/docs/MQTT_BRIDGE_IMPLEMENTATION_SUMMARY.md +324 -0
  11. package/docs/MQTT_COMMAND_SCHEMA_PROPOSAL.md +576 -0
  12. package/docs/MQTT_SCHEMA_COMPLIANCE.md +285 -0
  13. package/docs/MQTT_SCHEMA_PROPOSALS.md +446 -0
  14. package/docs/MQTT_SCHEMA_REVIEW.md +690 -0
  15. package/docs/OTA_COMMANDS_REFERENCE.md +554 -0
  16. package/docs/PHASE1_GUIDE.md +349 -0
  17. package/docs/PHASE2_GUIDE.md +543 -0
  18. package/docs/README.md +77 -70
  19. package/docs/SCHEMA_VALIDATION_CHECKLIST.md +222 -0
  20. package/docs/alteriom/overview.md +507 -507
  21. package/docs/api/core-api.md +606 -606
  22. package/docs/architecture/mesh-architecture.md +378 -378
  23. package/docs/architecture/plugin-system.md +516 -516
  24. package/docs/getting-started/first-mesh.md +409 -409
  25. package/docs/getting-started/installation.md +274 -274
  26. package/docs/getting-started/quickstart.md +157 -157
  27. package/docs/improvements/FEATURE_PROPOSALS.md +337 -0
  28. package/docs/improvements/PHASE1_IMPLEMENTATION.md +325 -0
  29. package/docs/improvements/PHASE2_IMPLEMENTATION.md +567 -0
  30. package/docs/improvements/README.md +86 -68
  31. package/docs/improvements/ota-and-status-enhancements.md +911 -0
  32. package/docs/improvements/ota-status-architecture-diagrams.md +658 -0
  33. package/docs/improvements/ota-status-quick-reference.md +284 -0
  34. package/docs/platformio-publishing.md +255 -0
  35. package/docs/platformio-setup-summary.md +121 -0
  36. package/docs/troubleshooting/common-issues.md +520 -520
  37. package/docs/troubleshooting/faq.md +472 -472
  38. package/docs/tutorials/basic-examples.md +717 -717
  39. package/docs/wiki/API-Reference.md +245 -245
  40. package/docs/wiki/Complete-Documentation.md +122 -122
  41. package/examples/alteriom/README.md +139 -81
  42. package/examples/alteriom/alteriom.ino +186 -185
  43. package/examples/alteriom/alteriom_sensor_package.hpp +240 -127
  44. package/examples/alteriom/platformio.ini +24 -24
  45. package/examples/alteriomImproved/alteriom_sensor_package.hpp +224 -0
  46. package/examples/{alteriom → alteriomImproved}/improved_sensor_node.ino +245 -245
  47. package/examples/alteriomImproved/platformio.ini +25 -0
  48. package/examples/alteriomPhase1/alteriom_sensor_package.hpp +224 -0
  49. package/examples/alteriomPhase1/phase1_features.ino +242 -0
  50. package/examples/alteriomPhase1/platformio.ini +25 -0
  51. package/examples/alteriomPhase2/alteriom_sensor_package.hpp +224 -0
  52. package/examples/alteriomPhase2/phase2_features.ino +186 -0
  53. package/examples/alteriomPhase2/platformio.ini +25 -0
  54. package/examples/{alteriom → alteriomSensorNode}/alteriom_sensor_node.ino +183 -183
  55. package/examples/alteriomSensorNode/alteriom_sensor_package.hpp +224 -0
  56. package/examples/alteriomSensorNode/platformio.ini +25 -0
  57. package/examples/basic/basic.ino +66 -66
  58. package/examples/basic/platformio.ini +25 -25
  59. package/examples/bridge/bridge.ino +51 -51
  60. package/examples/bridge/mesh_event_publisher.hpp +253 -0
  61. package/examples/bridge/mesh_topology_reporter.hpp +303 -0
  62. package/examples/bridge/mqtt_command_bridge.hpp +459 -0
  63. package/examples/bridge/mqtt_status_bridge.hpp +519 -0
  64. package/examples/bridge/platformio.ini +25 -25
  65. package/examples/echoNode/echoNode.ino +33 -33
  66. package/examples/echoNode/platformio.ini +25 -25
  67. package/examples/logClient/logClient.ino +109 -109
  68. package/examples/logClient/platformio.ini +25 -25
  69. package/examples/logServer/logServer.ino +81 -81
  70. package/examples/logServer/platformio.ini +25 -25
  71. package/examples/meshCommandNode/alteriom_sensor_package.hpp +235 -0
  72. package/examples/meshCommandNode/meshCommandNode.ino +263 -0
  73. package/examples/meshCommandNode/platformio.ini +25 -0
  74. package/examples/mqttBridge/mqttBridge.ino +118 -118
  75. package/examples/mqttBridge/platformio.ini +26 -26
  76. package/examples/mqttCommandBridge/alteriom_sensor_package.hpp +235 -0
  77. package/examples/mqttCommandBridge/mesh_event_publisher.hpp +253 -0
  78. package/examples/mqttCommandBridge/mesh_topology_reporter.hpp +303 -0
  79. package/examples/mqttCommandBridge/mqttCommandBridge.ino +252 -0
  80. package/examples/mqttCommandBridge/mqtt_command_bridge.hpp +459 -0
  81. package/examples/mqttCommandBridge/platformio.ini +26 -0
  82. package/examples/mqttStatusBridge/mqttStatusBridge.ino +216 -0
  83. package/examples/mqttStatusBridge/mqtt_status_bridge.hpp +522 -0
  84. package/examples/mqttStatusBridge/platformio.ini +26 -0
  85. package/examples/mqttTopologyTest/README.md +467 -0
  86. package/examples/mqttTopologyTest/mqttTopologyTest.ino +748 -0
  87. package/examples/mqttTopologyTest/platformio.ini +26 -0
  88. package/examples/namedMesh/namedMesh.ino +97 -97
  89. package/examples/namedMesh/platformio.ini +25 -25
  90. package/examples/otaReceiver/otaReceiver.ino +79 -79
  91. package/examples/otaReceiver/platformio.ini +25 -25
  92. package/examples/otaSender/otaSender.ino +160 -151
  93. package/examples/otaSender/platformio.ini +25 -25
  94. package/examples/startHere/platformio.ini +25 -25
  95. package/examples/startHere/startHere.ino +159 -159
  96. package/examples/webServer/platformio.ini +27 -27
  97. package/examples/webServer/webServer.ino +89 -89
  98. package/keywords.txt +48 -48
  99. package/library.json +55 -34
  100. package/library.properties +10 -10
  101. package/package.json +86 -78
  102. package/src/AlteriomPainlessMesh.h +97 -97
  103. package/src/arduino/wifi.hpp +365 -365
  104. package/src/boost/asynctcp.hpp +279 -279
  105. package/src/painlessMesh.h +70 -70
  106. package/src/painlessMeshSTA.cpp +236 -236
  107. package/src/painlessMeshSTA.h +58 -58
  108. package/src/painlessTaskOptions.h +4 -4
  109. package/src/painlessmesh/base64.hpp +111 -111
  110. package/src/painlessmesh/buffer.hpp +229 -229
  111. package/src/painlessmesh/callback.hpp +91 -91
  112. package/src/painlessmesh/configuration.hpp +77 -77
  113. package/src/painlessmesh/connection.hpp +192 -192
  114. package/src/painlessmesh/layout.hpp +188 -188
  115. package/src/painlessmesh/logger.hpp +158 -158
  116. package/src/painlessmesh/memory.hpp +119 -119
  117. package/src/painlessmesh/mesh.hpp +761 -560
  118. package/src/painlessmesh/metrics.hpp +322 -322
  119. package/src/painlessmesh/ntp.hpp +263 -263
  120. package/src/painlessmesh/ota.hpp +582 -553
  121. package/src/painlessmesh/plugin.hpp +188 -188
  122. package/src/painlessmesh/protocol.hpp +813 -813
  123. package/src/painlessmesh/router.hpp +322 -322
  124. package/src/painlessmesh/tcp.hpp +71 -71
  125. package/src/painlessmesh/validation.hpp +238 -238
  126. package/src/plugin/performance.hpp +214 -214
  127. package/src/plugin/remote.hpp +64 -64
  128. package/src/scheduler.cpp +10 -10
  129. package/src/wifi.cpp +2 -2
@@ -0,0 +1,467 @@
1
+ # MQTT Topology Test
2
+
3
+ Hardware test sketch for painlessMesh topology reporting with @alteriom/mqtt-schema v0.5.0 compliance.
4
+
5
+ ## 📋 Requirements
6
+
7
+ ### Hardware
8
+ - **3x ESP32 boards** (or ESP8266, but ESP32 recommended for better performance)
9
+ - **3x USB cables** (for programming and Serial monitoring)
10
+ - **MQTT broker** (e.g., Mosquitto, HiveMQ, or cloud service)
11
+ - **WiFi network** accessible by all devices
12
+
13
+ ### Software
14
+ - Arduino IDE 2.x or PlatformIO
15
+ - painlessMesh library (this repository)
16
+ - PubSubClient library (for MQTT)
17
+ - ArduinoJson library (v7.x)
18
+
19
+ ## 🔧 Configuration
20
+
21
+ ### 1. Configure WiFi (Gateway Only)
22
+
23
+ Edit these lines in `mqttTopologyTest.ino`:
24
+
25
+ ```cpp
26
+ #define WIFI_SSID "YourWiFiSSID"
27
+ #define WIFI_PASSWORD "YourWiFiPassword"
28
+ ```
29
+
30
+ ### 2. Configure MQTT Broker (Gateway Only)
31
+
32
+ ```cpp
33
+ #define MQTT_BROKER "192.168.1.100" // Your MQTT broker IP
34
+ #define MQTT_PORT 1883
35
+ #define MQTT_USER "" // Leave empty if no auth
36
+ #define MQTT_PASS "" // Leave empty if no auth
37
+ ```
38
+
39
+ ### 3. Configure Each Node
40
+
41
+ **Node 1 (Gateway):**
42
+ ```cpp
43
+ #define IS_GATEWAY true
44
+ #define NODE_ROLE "gateway"
45
+ ```
46
+
47
+ **Node 2 (Sensor):**
48
+ ```cpp
49
+ #define IS_GATEWAY false
50
+ #define NODE_ROLE "sensor"
51
+ ```
52
+
53
+ **Node 3 (Repeater):**
54
+ ```cpp
55
+ #define IS_GATEWAY false
56
+ #define NODE_ROLE "repeater"
57
+ ```
58
+
59
+ ## 🚀 Installation & Testing
60
+
61
+ ### Step 1: Setup MQTT Broker
62
+
63
+ **Option A: Local Mosquitto (Recommended for testing)**
64
+ ```bash
65
+ # Install Mosquitto
66
+ sudo apt-get install mosquitto mosquitto-clients
67
+
68
+ # Start broker
69
+ sudo systemctl start mosquitto
70
+
71
+ # Test broker
72
+ mosquitto_sub -h localhost -t "alteriom/mesh/#" -v
73
+ ```
74
+
75
+ **Option B: Docker Mosquitto**
76
+ ```bash
77
+ docker run -d -p 1883:1883 -p 9001:9001 eclipse-mosquitto
78
+ ```
79
+
80
+ **Option C: Cloud MQTT** (HiveMQ, CloudMQTT, etc.)
81
+
82
+ ### Step 2: Flash Nodes
83
+
84
+ 1. **Flash Node 1 (Gateway)**
85
+ - Set `IS_GATEWAY = true`, `NODE_ROLE = "gateway"`
86
+ - Upload sketch
87
+ - Open Serial Monitor (115200 baud)
88
+
89
+ 2. **Flash Node 2 (Sensor)**
90
+ - Set `IS_GATEWAY = false`, `NODE_ROLE = "sensor"`
91
+ - Upload sketch
92
+ - Open Serial Monitor
93
+
94
+ 3. **Flash Node 3 (Repeater)**
95
+ - Set `IS_GATEWAY = false`, `NODE_ROLE = "repeater"`
96
+ - Upload sketch
97
+ - Open Serial Monitor
98
+
99
+ ### Step 3: Monitor MQTT Messages
100
+
101
+ **Terminal 1: Monitor all mesh topics**
102
+ ```bash
103
+ mosquitto_sub -h localhost -t "alteriom/mesh/#" -v
104
+ ```
105
+
106
+ **Terminal 2: Monitor topology only**
107
+ ```bash
108
+ mosquitto_sub -h localhost -t "alteriom/mesh/+/topology" -v
109
+ ```
110
+
111
+ **Terminal 3: Monitor events only**
112
+ ```bash
113
+ mosquitto_sub -h localhost -t "alteriom/mesh/+/events" -v
114
+ ```
115
+
116
+ ### Step 4: Test GET_TOPOLOGY Command
117
+
118
+ **Send command:**
119
+ ```bash
120
+ mosquitto_pub -h localhost -t "alteriom/mesh/MESH-001/command" -m '{
121
+ "event": "command",
122
+ "command": "get_topology",
123
+ "correlation_id": "test-001",
124
+ "parameters": {
125
+ "format": "full",
126
+ "include_metrics": true
127
+ }
128
+ }'
129
+ ```
130
+
131
+ **Expected response on** `alteriom/mesh/MESH-001/topology/response`:
132
+ ```json
133
+ {
134
+ "schema_version": 1,
135
+ "device_id": "ALT-...",
136
+ "event": "command_response",
137
+ "command": "get_topology",
138
+ "correlation_id": "test-001",
139
+ "success": true,
140
+ "result": {
141
+ "event": "mesh_topology",
142
+ "nodes": [...],
143
+ "connections": [...],
144
+ "metrics": {...}
145
+ },
146
+ "latency_ms": 850
147
+ }
148
+ ```
149
+
150
+ ## 📊 Expected Behavior
151
+
152
+ ### Mesh Formation (0-30 seconds)
153
+ ```
154
+ ✅ Node 2 joins mesh
155
+ ✅ Node 3 joins mesh
156
+ 🔄 Connections established
157
+ ⏰ Time synchronized
158
+ ```
159
+
160
+ ### Full Topology Publishing (every 60 seconds)
161
+ ```json
162
+ {
163
+ "event": "mesh_topology",
164
+ "mesh_id": "MESH-001",
165
+ "gateway_node_id": "ALT-6825DD341CA4",
166
+ "update_type": "full",
167
+ "nodes": [
168
+ {
169
+ "node_id": "ALT-6825DD341CA4",
170
+ "role": "gateway",
171
+ "status": "online",
172
+ "connection_count": 2
173
+ },
174
+ {
175
+ "node_id": "ALT-441D64F804A0",
176
+ "role": "sensor",
177
+ "status": "online"
178
+ },
179
+ {
180
+ "node_id": "ALT-7F8E9D0A1B2C",
181
+ "role": "repeater",
182
+ "status": "online"
183
+ }
184
+ ],
185
+ "connections": [
186
+ {
187
+ "from_node": "ALT-6825DD341CA4",
188
+ "to_node": "ALT-441D64F804A0",
189
+ "quality": 95,
190
+ "latency_ms": 12,
191
+ "rssi": -42,
192
+ "hop_count": 1
193
+ },
194
+ {
195
+ "from_node": "ALT-6825DD341CA4",
196
+ "to_node": "ALT-7F8E9D0A1B2C",
197
+ "quality": 88,
198
+ "latency_ms": 18,
199
+ "rssi": -55,
200
+ "hop_count": 1
201
+ }
202
+ ],
203
+ "metrics": {
204
+ "total_nodes": 3,
205
+ "online_nodes": 3,
206
+ "network_diameter": 1,
207
+ "avg_connection_quality": 91
208
+ }
209
+ }
210
+ ```
211
+
212
+ ### Incremental Updates (within 5 seconds of change)
213
+
214
+ **When Node 4 joins:**
215
+ ```json
216
+ {
217
+ "event": "mesh_topology",
218
+ "update_type": "incremental",
219
+ "nodes": [
220
+ {
221
+ "node_id": "ALT-NEW12345678",
222
+ "role": "sensor",
223
+ "status": "online"
224
+ }
225
+ ],
226
+ "connections": [
227
+ {
228
+ "from_node": "ALT-6825DD341CA4",
229
+ "to_node": "ALT-NEW12345678",
230
+ "quality": 78
231
+ }
232
+ ]
233
+ }
234
+ ```
235
+
236
+ **Followed by event:**
237
+ ```json
238
+ {
239
+ "event": "mesh_event",
240
+ "event_type": "node_join",
241
+ "affected_nodes": ["ALT-NEW12345678"]
242
+ }
243
+ ```
244
+
245
+ ### Node Leave Event
246
+
247
+ **When node disconnects:**
248
+ ```json
249
+ {
250
+ "event": "mesh_event",
251
+ "event_type": "node_leave",
252
+ "affected_nodes": ["ALT-441D64F804A0"],
253
+ "details": {
254
+ "reason": "timeout",
255
+ "last_seen": "2025-10-14T15:08:45Z",
256
+ "connections_lost": 1
257
+ }
258
+ }
259
+ ```
260
+
261
+ ## 🧪 Test Scenarios
262
+
263
+ ### Test 1: Mesh Formation
264
+ 1. Power on all 3 nodes
265
+ 2. Watch Serial monitors for mesh formation
266
+ 3. Verify full topology published within 60 seconds
267
+ 4. ✅ **Pass:** All nodes appear in topology with correct roles
268
+
269
+ ### Test 2: Incremental Updates
270
+ 1. With mesh running, power off Node 3
271
+ 2. Watch for `node_leave` event within 5 seconds
272
+ 3. Verify incremental topology update shows Node 3 as offline
273
+ 4. Power on Node 3 again
274
+ 5. Watch for `node_join` event
275
+ 6. ✅ **Pass:** Events published within 5 seconds of change
276
+
277
+ ### Test 3: GET_TOPOLOGY Command
278
+ 1. Send `get_topology` command via MQTT
279
+ 2. Verify response on `/topology/response` topic
280
+ 3. Check response includes `correlation_id`
281
+ 4. Verify `latency_ms` is reasonable (< 2000ms)
282
+ 5. ✅ **Pass:** Response received with correct structure
283
+
284
+ ### Test 4: Schema Compliance
285
+ 1. Copy any published message
286
+ 2. Validate against @alteriom/mqtt-schema v0.5.0
287
+ 3. Check all required envelope fields present
288
+ 4. Verify Device ID format: `ALT-XXXXXXXXXXXX` (uppercase hex)
289
+ 5. Verify quality values: 0-100 range
290
+ 6. Verify RSSI values: negative dBm
291
+ 7. ✅ **Pass:** All messages validate successfully
292
+
293
+ ### Test 5: Quality Metrics
294
+ 1. Move nodes physically closer/farther apart
295
+ 2. Watch quality values change in topology updates
296
+ 3. Verify RSSI becomes more negative with distance
297
+ 4. Verify latency increases with poor connections
298
+ 5. ✅ **Pass:** Metrics reflect connection quality
299
+
300
+ ### Test 6: Network Diameter
301
+ 1. Start with 2 nodes (gateway + 1 sensor)
302
+ 2. Add 3rd node in range of sensor but not gateway
303
+ 3. Verify `network_diameter` increases to 2
304
+ 4. Verify `hop_count` shows multi-hop connections
305
+ 5. ✅ **Pass:** Topology correctly represents mesh structure
306
+
307
+ ## 🐛 Troubleshooting
308
+
309
+ ### Issue: Nodes won't join mesh
310
+
311
+ **Symptoms:**
312
+ - Serial shows "Connecting to mesh..."
313
+ - No "New connection" messages
314
+
315
+ **Solutions:**
316
+ 1. Verify all nodes have same `MESH_PREFIX` and `MESH_PASSWORD`
317
+ 2. Check nodes are within WiFi range (< 30m indoors)
318
+ 3. Try changing `MESH_PORT` to avoid conflicts
319
+ 4. Disable WiFi on gateway temporarily to test sensor-to-sensor mesh
320
+
321
+ ### Issue: Gateway won't connect to MQTT
322
+
323
+ **Symptoms:**
324
+ - "Connecting to MQTT broker... failed, rc=-2"
325
+
326
+ **Solutions:**
327
+ 1. Verify `MQTT_BROKER` IP is correct
328
+ 2. Check broker is running: `mosquitto -v`
329
+ 3. Test broker connectivity: `mosquitto_pub -h <IP> -t test -m hello`
330
+ 4. Check firewall allows port 1883
331
+ 5. If using authentication, verify `MQTT_USER` and `MQTT_PASS`
332
+
333
+ ### Issue: Topology messages not publishing
334
+
335
+ **Symptoms:**
336
+ - Mesh formed but no MQTT messages
337
+ - Serial shows "Failed to publish"
338
+
339
+ **Solutions:**
340
+ 1. Check MQTT buffer size (should be 2048+)
341
+ 2. Verify topic permissions on broker
342
+ 3. Check JSON message size (< 2KB recommended)
343
+ 4. Monitor broker logs for errors
344
+ 5. Reduce `FULL_TOPOLOGY_INTERVAL` to 10s for testing
345
+
346
+ ### Issue: Device ID format incorrect
347
+
348
+ **Symptoms:**
349
+ - Device IDs like "ALT-0" or "ALT-12345"
350
+
351
+ **Solutions:**
352
+ 1. Verify using ESP32 (ESP8266 has different chip ID)
353
+ 2. Check `getDeviceId()` function uses `%012llX` format
354
+ 3. Confirm uppercase hex output
355
+ 4. Test: Should be 16 characters total (ALT- + 12 hex digits)
356
+
357
+ ### Issue: Quality metrics always 0 or 100
358
+
359
+ **Symptoms:**
360
+ - Quality stuck at boundary values
361
+ - RSSI always -90 or 0
362
+
363
+ **Solutions:**
364
+ 1. Implement real RSSI measurement (this test uses simulation)
365
+ 2. Add WiFi signal strength reading: `WiFi.RSSI()`
366
+ 3. Calculate quality from packet loss, not simulation
367
+ 4. Add latency measurement with ping/pong messages
368
+
369
+ ### Issue: Incremental updates too slow
370
+
371
+ **Symptoms:**
372
+ - Node joins but update takes > 10 seconds
373
+
374
+ **Solutions:**
375
+ 1. Reduce `INCREMENTAL_INTERVAL` to 1000ms for testing
376
+ 2. Check `lastTopologyUpdate` is being reset on connection changes
377
+ 3. Verify callbacks are triggering: add Serial.println in `newConnectionCallback`
378
+ 4. Confirm MQTT client is connected when change occurs
379
+
380
+ ## 📈 Performance Optimization
381
+
382
+ ### For Large Meshes (10+ nodes)
383
+
384
+ 1. **Increase MQTT buffer:**
385
+ ```cpp
386
+ mqttClient.setBufferSize(4096);
387
+ ```
388
+
389
+ 2. **Reduce full topology frequency:**
390
+ ```cpp
391
+ #define FULL_TOPOLOGY_INTERVAL 300000 // 5 minutes
392
+ ```
393
+
394
+ 3. **Implement topology compression:**
395
+ - Only send changed fields in incremental updates
396
+ - Use shorter field names
397
+ - Remove optional fields when empty
398
+
399
+ 4. **Add QoS levels:**
400
+ ```cpp
401
+ mqttClient.publish(topic.c_str(), jsonString.c_str(), true); // Retained
402
+ ```
403
+
404
+ 5. **Batch incremental updates:**
405
+ - Wait 10s for multiple changes
406
+ - Send single update with all changes
407
+
408
+ ### For ESP8266 (Limited Memory)
409
+
410
+ 1. **Reduce JSON buffer size:**
411
+ ```cpp
412
+ JsonDocument doc; // Uses 1KB by default
413
+ ```
414
+
415
+ 2. **Stream JSON directly to MQTT:**
416
+ ```cpp
417
+ // Instead of String, use streaming
418
+ mqttClient.beginPublish(topic.c_str(), measureJson(doc), false);
419
+ serializeJson(doc, mqttClient);
420
+ mqttClient.endPublish();
421
+ ```
422
+
423
+ 3. **Disable debug messages:**
424
+ ```cpp
425
+ mesh.setDebugMsgTypes(ERROR);
426
+ ```
427
+
428
+ ## 📚 Schema Reference
429
+
430
+ This test implements these schemas from @alteriom/mqtt-schema v0.5.0:
431
+
432
+ - ✅ **Envelope** (schema_version, device_id, device_type, timestamp, firmware_version)
433
+ - ✅ **mesh_topology** (full and incremental updates)
434
+ - ✅ **mesh_event** (node_join, node_leave events)
435
+ - ✅ **command** (GET_TOPOLOGY command ID 300)
436
+ - ✅ **command_response** (topology response with correlation_id)
437
+
438
+ ## 🎯 Success Criteria
439
+
440
+ Test is successful when:
441
+
442
+ - [x] All 3 nodes join mesh within 30 seconds
443
+ - [x] Full topology published every 60 seconds
444
+ - [x] Incremental updates published within 5 seconds of changes
445
+ - [x] Node join/leave events published immediately
446
+ - [x] GET_TOPOLOGY command returns valid response
447
+ - [x] All messages validate against @alteriom/mqtt-schema
448
+ - [x] Device IDs follow ALT-XXXXXXXXXXXX format
449
+ - [x] Quality metrics in 0-100 range
450
+ - [x] RSSI values are negative
451
+ - [x] Connection count matches actual mesh connections
452
+
453
+ ## 📝 Notes
454
+
455
+ - This test uses **simulated quality metrics** (RSSI, latency) based on node IDs
456
+ - For production, implement **real measurements** using `WiFi.RSSI()` and ping/pong
457
+ - The test uses **simplified topology** (all nodes connect to gateway)
458
+ - For multi-hop meshes, implement **hop count tracking** from routing table
459
+ - Message timing is **approximate** due to mesh synchronization delays
460
+ - **Schema compliance** is validated by test/catch/catch_topology_schema.cpp
461
+
462
+ ## 🔗 Related Documentation
463
+
464
+ - [MQTT Schema Review](../../docs/MQTT_SCHEMA_REVIEW.md)
465
+ - [MQTT Bridge Commands](../../docs/MQTT_BRIDGE_COMMANDS.md)
466
+ - [Schema Validation Tests](../../test/catch/catch_topology_schema.cpp)
467
+ - [@alteriom/mqtt-schema Package](https://www.npmjs.com/package/@alteriom/mqtt-schema)