@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.
- package/CHANGELOG.md +380 -143
- package/LICENSE +674 -674
- package/README.md +477 -434
- package/RELEASE_GUIDE.md +504 -418
- package/docs/DOCUMENTATION_MIGRATION_PLAN.md +175 -175
- package/docs/IMPLEMENTATION_PLAN_MESH_TOPOLOGY.md +1062 -0
- package/docs/MESH_TOPOLOGY_GUIDE.md +992 -0
- package/docs/MESH_TOPOLOGY_PROGRESS.md +422 -0
- package/docs/MQTT_BRIDGE_COMMANDS.md +894 -0
- package/docs/MQTT_BRIDGE_IMPLEMENTATION_SUMMARY.md +324 -0
- package/docs/MQTT_COMMAND_SCHEMA_PROPOSAL.md +576 -0
- package/docs/MQTT_SCHEMA_COMPLIANCE.md +285 -0
- package/docs/MQTT_SCHEMA_PROPOSALS.md +446 -0
- package/docs/MQTT_SCHEMA_REVIEW.md +690 -0
- package/docs/OTA_COMMANDS_REFERENCE.md +554 -0
- package/docs/PHASE1_GUIDE.md +349 -0
- package/docs/PHASE2_GUIDE.md +543 -0
- package/docs/README.md +77 -70
- package/docs/SCHEMA_VALIDATION_CHECKLIST.md +222 -0
- package/docs/alteriom/overview.md +507 -507
- package/docs/api/core-api.md +606 -606
- package/docs/architecture/mesh-architecture.md +378 -378
- package/docs/architecture/plugin-system.md +516 -516
- package/docs/getting-started/first-mesh.md +409 -409
- package/docs/getting-started/installation.md +274 -274
- package/docs/getting-started/quickstart.md +157 -157
- package/docs/improvements/FEATURE_PROPOSALS.md +337 -0
- package/docs/improvements/PHASE1_IMPLEMENTATION.md +325 -0
- package/docs/improvements/PHASE2_IMPLEMENTATION.md +567 -0
- package/docs/improvements/README.md +86 -68
- package/docs/improvements/ota-and-status-enhancements.md +911 -0
- package/docs/improvements/ota-status-architecture-diagrams.md +658 -0
- package/docs/improvements/ota-status-quick-reference.md +284 -0
- package/docs/platformio-publishing.md +255 -0
- package/docs/platformio-setup-summary.md +121 -0
- package/docs/troubleshooting/common-issues.md +520 -520
- package/docs/troubleshooting/faq.md +472 -472
- package/docs/tutorials/basic-examples.md +717 -717
- package/docs/wiki/API-Reference.md +245 -245
- package/docs/wiki/Complete-Documentation.md +122 -122
- package/examples/alteriom/README.md +139 -81
- package/examples/alteriom/alteriom.ino +186 -185
- package/examples/alteriom/alteriom_sensor_package.hpp +240 -127
- package/examples/alteriom/platformio.ini +24 -24
- package/examples/alteriomImproved/alteriom_sensor_package.hpp +224 -0
- package/examples/{alteriom → alteriomImproved}/improved_sensor_node.ino +245 -245
- package/examples/alteriomImproved/platformio.ini +25 -0
- package/examples/alteriomPhase1/alteriom_sensor_package.hpp +224 -0
- package/examples/alteriomPhase1/phase1_features.ino +242 -0
- package/examples/alteriomPhase1/platformio.ini +25 -0
- package/examples/alteriomPhase2/alteriom_sensor_package.hpp +224 -0
- package/examples/alteriomPhase2/phase2_features.ino +186 -0
- package/examples/alteriomPhase2/platformio.ini +25 -0
- package/examples/{alteriom → alteriomSensorNode}/alteriom_sensor_node.ino +183 -183
- package/examples/alteriomSensorNode/alteriom_sensor_package.hpp +224 -0
- package/examples/alteriomSensorNode/platformio.ini +25 -0
- package/examples/basic/basic.ino +66 -66
- package/examples/basic/platformio.ini +25 -25
- package/examples/bridge/bridge.ino +51 -51
- package/examples/bridge/mesh_event_publisher.hpp +253 -0
- package/examples/bridge/mesh_topology_reporter.hpp +303 -0
- package/examples/bridge/mqtt_command_bridge.hpp +459 -0
- package/examples/bridge/mqtt_status_bridge.hpp +519 -0
- package/examples/bridge/platformio.ini +25 -25
- package/examples/echoNode/echoNode.ino +33 -33
- package/examples/echoNode/platformio.ini +25 -25
- package/examples/logClient/logClient.ino +109 -109
- package/examples/logClient/platformio.ini +25 -25
- package/examples/logServer/logServer.ino +81 -81
- package/examples/logServer/platformio.ini +25 -25
- package/examples/meshCommandNode/alteriom_sensor_package.hpp +235 -0
- package/examples/meshCommandNode/meshCommandNode.ino +263 -0
- package/examples/meshCommandNode/platformio.ini +25 -0
- package/examples/mqttBridge/mqttBridge.ino +118 -118
- package/examples/mqttBridge/platformio.ini +26 -26
- package/examples/mqttCommandBridge/alteriom_sensor_package.hpp +235 -0
- package/examples/mqttCommandBridge/mesh_event_publisher.hpp +253 -0
- package/examples/mqttCommandBridge/mesh_topology_reporter.hpp +303 -0
- package/examples/mqttCommandBridge/mqttCommandBridge.ino +252 -0
- package/examples/mqttCommandBridge/mqtt_command_bridge.hpp +459 -0
- package/examples/mqttCommandBridge/platformio.ini +26 -0
- package/examples/mqttStatusBridge/mqttStatusBridge.ino +216 -0
- package/examples/mqttStatusBridge/mqtt_status_bridge.hpp +522 -0
- package/examples/mqttStatusBridge/platformio.ini +26 -0
- package/examples/mqttTopologyTest/README.md +467 -0
- package/examples/mqttTopologyTest/mqttTopologyTest.ino +748 -0
- package/examples/mqttTopologyTest/platformio.ini +26 -0
- package/examples/namedMesh/namedMesh.ino +97 -97
- package/examples/namedMesh/platformio.ini +25 -25
- package/examples/otaReceiver/otaReceiver.ino +79 -79
- package/examples/otaReceiver/platformio.ini +25 -25
- package/examples/otaSender/otaSender.ino +160 -151
- package/examples/otaSender/platformio.ini +25 -25
- package/examples/startHere/platformio.ini +25 -25
- package/examples/startHere/startHere.ino +159 -159
- package/examples/webServer/platformio.ini +27 -27
- package/examples/webServer/webServer.ino +89 -89
- package/keywords.txt +48 -48
- package/library.json +55 -34
- package/library.properties +10 -10
- package/package.json +86 -78
- package/src/AlteriomPainlessMesh.h +97 -97
- package/src/arduino/wifi.hpp +365 -365
- package/src/boost/asynctcp.hpp +279 -279
- package/src/painlessMesh.h +70 -70
- package/src/painlessMeshSTA.cpp +236 -236
- package/src/painlessMeshSTA.h +58 -58
- package/src/painlessTaskOptions.h +4 -4
- package/src/painlessmesh/base64.hpp +111 -111
- package/src/painlessmesh/buffer.hpp +229 -229
- package/src/painlessmesh/callback.hpp +91 -91
- package/src/painlessmesh/configuration.hpp +77 -77
- package/src/painlessmesh/connection.hpp +192 -192
- package/src/painlessmesh/layout.hpp +188 -188
- package/src/painlessmesh/logger.hpp +158 -158
- package/src/painlessmesh/memory.hpp +119 -119
- package/src/painlessmesh/mesh.hpp +761 -560
- package/src/painlessmesh/metrics.hpp +322 -322
- package/src/painlessmesh/ntp.hpp +263 -263
- package/src/painlessmesh/ota.hpp +582 -553
- package/src/painlessmesh/plugin.hpp +188 -188
- package/src/painlessmesh/protocol.hpp +813 -813
- package/src/painlessmesh/router.hpp +322 -322
- package/src/painlessmesh/tcp.hpp +71 -71
- package/src/painlessmesh/validation.hpp +238 -238
- package/src/plugin/performance.hpp +214 -214
- package/src/plugin/remote.hpp +64 -64
- package/src/scheduler.cpp +10 -10
- 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)
|