使用FIWARE IoT Agent-JSON与Mosquitto时Orion显示无关传感器数据问题
问题描述
基于FIWARE IoT Agent-JSON和Mosquitto开发IoT应用,已创建测试设备并分配传感器,通过Mosquitto发布传感器数据。MongoDB中IoT Agent的iotagentul.devices和iotagentul.EysDevices表能正常查看设备关联的传感器属性,但Orion Context Broker的orion-acd表却显示所有通过Mosquitto发布的传感器属性,包括未关联到设备的属性。希望Orion仅显示与设备关联的传感器属性,咨询以下问题:
- 如何阻止通过Mosquitto传入的未关联设备的传感器属性出现在Orion的表中?
- 需对IoT Agent或Orion做哪些配置修改以解决该问题?
配置详情
Docker-compose.yml文件
version: "3.8" services: # Orion 上下文代理 orion: image: fiware/orion:3.7.0 hostname: orion container_name: fiware-orion-pms networks: - default expose: - "${ORION_PORT}" ports: - "${ORION_PORT}:${ORION_PORT}" # localhost:1026 command: -dbhost $IP_ADDRESS:27030 -dbuser $DB_USER -dbpwd $DB_PWD -dbAuthDb admin -db orion -logLevel DEBUG healthcheck: test: curl --fail -s http://orion:${ORION_PORT}/version || exit 1 interval: 5s restart: always labels: maintainer: ino description: fiware-orion project: pms version: v1.0.0 type: fiware deploy: resources: limits: cpus: '0.5' # 最大0.5 CPU核心 memory: 512M # 最大512MB内存 logging: driver: "json-file" # 使用json-file日志驱动 options: max-size: "1g" # 单个日志文件最大1GB max-file: "5" # 最多保留5个日志文件 iot-agent: image: fiware/iotagent-json hostname: iot-agent container_name: fiware-iot-agent-pms networks: - default expose: - "${IOTA_NORTH_PORT}" ports: - "${IOTA_NORTH_PORT}:${IOTA_NORTH_PORT}" # localhost:4041 environment: - IOTA_CB_HOST=${IP_ADDRESS} # 上下文代理地址 - IOTA_CB_PORT=1026 # 上下文代理端口 - IOTA_NORTH_PORT=4041 - IOTA_REGISTRY_TYPE=mongodb # 设备信息存储方式 - IOTA_LOG_LEVEL=DEBUG # IoT Agent日志级别 - IOTA_TIMESTAMP=true # 为每条数据添加时间戳 - IOTA_CB_NGSI_VERSION=v2 # 使用NGSIv2协议更新上下文 - IOTA_AUTOCAST=true # 将数值型属性自动转换为数字类型 - IOTA_MONGO_USER=$DB_USER - IOTA_MONGO_PASSWORD=$DB_PWD - IOTA_MONGO_AUTH_SOURCE=admin - IOTA_MONGO_HOST=$IP_ADDRESS # MongoDB地址 - IOTA_MONGO_PORT=27030 # MongoDB端口 - IOTA_MONGO_DB=iotagentul # IoT Agent使用的数据库名 - IOTA_MQTT_HOST=$MQTT_HOST # MQTT代理地址 - IOTA_MQTT_PORT=1883 # MQTT代理端口 - IOTA_DEFAULT_RESOURCE= # MQTT模式下无需设置资源 - IOTA_PROVIDER_URL=http://iot-agent:${IOTA_NORTH_PORT} - IOTA_DEFAULT_TRANSPORT=MQTT healthcheck: interval: 5s restart: always labels: maintainer: ino description: fiware-orion-agent-json project: pms version: v1.0.0 type: fiware deploy: resources: limits: cpus: '0.5' # 最大0.5 CPU核心 memory: 512M # 最大512MB内存 logging: driver: "json-file" # 使用json-file日志驱动 options: max-size: "1g" # 单个日志文件最大1GB max-file: "5" # 最多保留5个日志文件 networks: default: labels: org.fiware: 'fiware-networks-pms' ipam: config: - subnet: 172.50.1.0/24
iotagentul.devices表示例记录
{ "_id": { "$oid": "665ee84cfc6591f112df952a" }, "lazy": [], "active": [ { "name": "Current_L1", "type": "Double", "object_id": "Current_L1" } ], "commands": [], "staticAttributes": [ { "name": "refStore", "type": "Relationship", "value": "urn:ngsi-ld:pa_DEVICE1:001" } ], "creationDate": { "$date": "2024-06-04T10:11:24.071Z" }, "id": "PA_DEVICE1", "type": "pa", "name": "PA_DEVICE1", "service": "acd", "subservice": "/pa/DEVICE1", "internalId": null, "transport": "HTTP", "polling": true, "__v": 1, "apikey": "acd_PA_DEVICE1", "subscriptions": [] }
orion-acd表示例记录
{ "_id": { "id": "PA_DEVICE1", "type": "pa", "servicePath": "/pa/DEVICE1" }, "attrNames": [ "refStore", "Current_L1", "Voltage_UL1_N", "Voltage_UL2_N", "Voltage_UL3_N", "Current_L2", "Current_L3", "Total_Consumed_Energy", "Total_Power_Factor", "Total_Reactive_Power", "Total_Apparent_Power", "Total_Active_Power", "TimeInstant" ], "attrs": { ... }, "creDate": 1717495904.300415, "modDate": 1717583504.3732698, "lastCorrelator": "ce017f3a-2326-11ef-b4d0-0242ac320102" }
原因分析
当前IoT Agent-JSON默认未启用属性过滤,会接收MQTT主题中的所有属性并转发给Orion,不管这些属性是否在设备的active属性列表中定义,导致未关联的属性也被同步到Orion的表中。
解决方案
问题1解决方法
启用IoT Agent的属性过滤功能,让它仅转发设备active列表中预定义的属性到Orion,未关联的属性会被直接丢弃,不会进入Orion的表中。
问题2配置修改
1. 修改IoT Agent环境变量
在Docker-compose.yml的iot-agent服务环境变量中添加IOTA_FILTER_ATTRS=true,启用属性过滤:
environment: - IOTA_CB_HOST=${IP_ADDRESS} - IOTA_CB_PORT=1026 - IOTA_NORTH_PORT=4041 - IOTA_REGISTRY_TYPE=mongodb - IOTA_LOG_LEVEL=DEBUG - IOTA_TIMESTAMP=true - IOTA_CB_NGSI_VERSION=v2 - IOTA_AUTOCAST=true - IOTA_MONGO_USER=$DB_USER - IOTA_MONGO_PASSWORD=$DB_PWD - IOTA_MONGO_AUTH_SOURCE=admin - IOTA_MONGO_HOST=$IP_ADDRESS - IOTA_MONGO_PORT=27030 - IOTA_MONGO_DB=iotagentul - IOTA_MQTT_HOST=$MQTT_HOST - IOTA_MQTT_PORT=1883 - IOTA_DEFAULT_RESOURCE= - IOTA_PROVIDER_URL=http://iot-agent:${IOTA_NORTH_PORT} - IOTA_DEFAULT_TRANSPORT=MQTT - IOTA_FILTER_ATTRS=true # 新增:启用属性过滤
2. 重启IoT Agent容器
修改配置后执行以下命令重启容器,使配置生效:
docker-compose restart iot-agent
3. 清理Orion中已存在的多余属性
若之前已有未关联属性同步到Orion,可通过API删除:
curl -X DELETE http://<ORION_IP>:1026/v2/entities/PA_DEVICE1/attrs/Voltage_UL1_N -H "Fiware-Service: acd" -H "Fiware-ServicePath: /pa/DEVICE1"
替换<ORION_IP>为Orion实际地址,重复此命令删除其他多余属性。
内容的提问来源于stack exchange,提问作者rumeysa yuk
相关产品推荐
相关产品推荐

