如何配置Docker部署的Orion Context Broker接收Mosquitto MQTT数据
问题根因
你的部署架构缺失了核心的协议转换组件。原生Eclipse Mosquitto仅作为MQTT消息broker实现消息的路由、投递,没有内置对接Orion Context Broker NGSI接口的能力,不会自动将收到的MQTT消息转换为NGSI请求更新Orion实体,这是数据无法同步的根本原因。你手动curl更新实体正常,已经说明Orion本身运行、实体创建都没有问题。
修复配置步骤
- 补充部署FIWARE IoT Agent for JSON(MQTT协议适配组件)
这个组件是FIWARE官方提供的MQTT设备接入代理,负责订阅Mosquitto上的设备消息主题,将设备上报的JSON格式数据转换为标准NGSI v2请求,自动更新Orion中的对应实体。
在原有docker-compose.yml中新增如下服务配置:
- 补充部署FIWARE IoT Agent for JSON(MQTT协议适配组件)
iot-agent: image: fiware/iotagent-json:latest container_name: fiware-iot-agent depends_on: - mongo-db - mqtt - orion expose: - "4041" ports: - "4041:4041" environment: - IOTA_CB_HOST=orion - IOTA_CB_PORT=1026 - IOTA_MQTT_HOST=mqtt - IOTA_MQTT_PORT=1883 - IOTA_NORTH_PORT=4041 - IOTA_REGISTRY_TYPE=mongodb - IOTA_MONGO_HOST=mongo-db - IOTA_MONGO_PORT=27017 - IOTA_MONGO_DB=iotagentjson - IOTA_PROVIDER_URL=http://iot-agent:4041 - IOTA_DEFAULT_RESOURCE=/iot/json networks: - default
- 修复Mosquitto默认配置问题
新版Eclipse Mosquitto镜像默认禁止匿名连接,且没有加载默认配置,会导致IoT Agent无法连接MQTT broker。你需要先在宿主机创建Mosquitto配置文件,比如在/opt/mosquitto/config/mosquitto.conf写入如下内容:
- 修复Mosquitto默认配置问题
listener 1883 allow_anonymous true persistence true persistence_location /mosquitto/data/
然后修改原有mqtt服务的volumes配置,把配置文件和数据目录挂载进去,删掉原来无效的/opt/mosquitto/var/run:/var/run挂载:
volumes: - /opt/mosquitto/config/mosquitto.conf:/mosquitto/config/mosquitto.conf - /opt/mosquitto/data:/mosquitto/data - /opt/mosquitto/log:/mosquitto/log
- 重启所有服务
执行docker compose down && docker compose up -d,等所有服务启动完成后验证服务状态:
- 访问
http://localhost:1026/version能正常返回Orion版本信息 - 访问
http://localhost:4041/iot/about能正常返回IoT Agent版本信息
- 重启所有服务
- 注册设备映射关系
调用IoT Agent的北向接口,把树莓派的上报主题和你已经创建的SensTemp实体做绑定,注意把MQTT主题替换成你树莓派实际上报用的主题:
- 注册设备映射关系
curl -X POST http://localhost:4041/iot/devices \ -H 'Content-Type: application/json' \ -H 'fiware-service: openiot' \ -H 'fiware-servicepath: /' \ -d '{ "devices": [ { "device_id": "raspi-sensor-001", "entity_name": "SensTemp", "entity_type": "Sensor", "attributes": [ { "name": "temperature", "type": "Float", "object_id": "temperature" } ], "transport": "MQTT" } ] }'
注册完成后,IoT Agent会自动订阅对应MQTT主题,树莓派上报的JSON数据只要包含temperature字段,就会自动同步到Orion的实体属性中。
- 链路验证
树莓派上报一条测试数据后,执行如下命令查询实体值:
- 链路验证
curl localhost:1026/v2/entities/SensTemp?options=keyValues
如果返回的temperature值和上报值一致,说明链路配置完成。
注意事项
- 不要用
localhost作为容器内部的服务访问地址,Docker Compose同网络内的服务直接用服务名(orion、mqtt、iot-agent、mongo-db)做内部域名解析即可,否则会出现容器内服务访问不通的问题。 - 如果上报的数据格式是UltraLight而非纯JSON,可以替换IoT Agent镜像为
fiware/iotagent-ul,配置逻辑基本一致。 - 你提供的Mosquitto消息接收证明截图如下,确认消息正常到达broker后,只要上述配置正确就可以自动同步:

内容的提问来源于stack exchange,提问作者Srdjan Zec
相关产品推荐
相关产品推荐

