FIWARE IoT-Agent MQTT JSON解析错误及MongoDB数据不更新问题求助
问题诊断与解决
核心原因
- 协议不匹配:设备注册时指定了
PDI-IoTA-UltraLight(UltraLight 2.0)协议,但实际通过MQTT发送的是JSON格式数据。IoT-Agent会严格按照注册的协议解析消息,JSON格式无法被UltraLight解析器处理,直接导致解析失败,触发TypeError: parsedMessage.reduce is not a function致命错误,最终数据无法存入MongoDB。 - 服务注册命令语法错误:
resource字段缺少双引号,正确格式应为"resource": "/iot/d",该错误会导致JSON无效,可能影响服务注册的有效性。
解决方法
提供两种可行方案,按需选择:
方案一:切换设备协议为JSON格式
修改设备注册命令,将协议改为PDI-IoTA-JSON,同时修复服务注册的语法错误:
1. 修复并重新注册IoT服务
curl -iX POST 'http://localhost:4041/iot/services' \ -H 'Content-Type: application/json' \ -H 'Fiware-Service: myClassRoom' \ -H 'Fiware-ServicePath: /' \ -d '{ "services": [ { "apikey": "12345", "cbroker": "http://localhost:1026", "entity_type": "Device", "resource": "/iot/d" } ] }'
2. 重新注册设备(使用JSON协议)
curl -iX POST 'http://localhost:4041/iot/devices' \ -H 'Content-Type: application/json' \ -H 'Fiware-Service: myClassRoom' \ -H 'Fiware-ServicePath: /' \ -d '{ "devices": [ { "device_id": "SensTemp", "entity_name": "urn:ngsi-ld:temperature-sensor:001", "entity_type": "Device", "protocol": "PDI-IoTA-JSON", "transport": "MQTT", "timezone": "Europe/Madrid", "attributes":[ { "object_id": "temperature", "name": "temperature", "type": "Integer" } ] } ] }'
方案二:修改MQTT消息格式为UltraLight 2.0
保持设备注册的PDI-IoTA-UltraLight协议不变,将发送的JSON数据改为UltraLight格式:
- 原JSON消息:
{"temperature": 47} - 修改为UltraLight格式:
temperature|47
同时确保MQTT主题符合规则:/<api-key>/<device-id>/attrs,即/12345/SensTemp/attrs,IoT-Agent才能正确识别设备和API密钥。
内容的提问来源于stack exchange,提问作者Srdjan Zec
相关产品推荐
相关产品推荐

