Sets up an EdgeX Foundry stack with a simulated MQTT device that publishes random sensor readings, and shows how those readings become queryable events through EdgeX's REST API. Built as an IoT / edge computing exercise for the Master's in Computer Engineering at Universidade Portucalense.
🇵🇹 Versão em português mais abaixo / Portuguese version further below.
Configure EdgeX Foundry with an MQTT device that sends random float values via MQTT, and read them back out through the EdgeX core services.
- Docker and Docker Compose installed.
- Node.js (v14+) to run the publisher and subscriber scripts.
- EMQ (or another MQTT broker) running on
localhost:1883. - mosquitto-client for testing the topics manually.
- A text editor / VS Code.
├── README.md
├── docker-compose.yml
├── mqtt
│ └── configuration.yaml
└── mqtt-scripts
├── mock-device.js
└── subscriber.js
mqtt/—configuration.yamlfor thedevice-mqttservice.mqtt-scripts/— the Node.js publisher and subscriber.docker-compose.yml— the EdgeX Foundry service stack.
- Connects to the MQTT broker at
localhost:1883. - Publishes a random value (as a string) every 2 seconds to
incoming/data/MQTT-test-device/randfloat64.
Note: resourceName must match one of the types device-mqtt supports (randfloat64, script, randfloat32) — this project uses randfloat64.
- Connects to the same broker and listens on the same topic, so you can see the values the publisher is sending in real time.
docker-compose up -d
docker-compose ps # confirm core-data, core-metadata, core-command, core-keeper, emq and device-mqtt are all runningThe stack uses an EMQ broker by default; Mosquitto also works if you'd rather swap it in.
configuration.yaml is mounted as a volume (./mqtt/configuration.yaml:/res/configuration.yaml), so device-mqtt picks up the profile and device definitions automatically on startup.
sudo apt update
sudo apt install nodejs mosquitto-client
cd mqtt-scripts
npm install mqttThen, in two separate terminals:
node mock-device.js
node subscriber.jsmosquitto_sub -h localhost -t incoming/data/#
curl http://localhost:59880/api/v3/event/device/MQTT-test-deviceThe event should show resourceName: randfloat64 and valueType: Float64. You can also check the container logs:
docker logs edgex-device-mqttsource name randfloat64 not found as Device Command or Device Resource
Usually a device name mismatch (e.g. MQTT-Test-Device vs MQTT-test-device).
curl -X GET http://localhost:59881/api/v3/device/name/MQTT-test-deviceFix the name in the publisher or recreate the device with the expected name, then restart:
docker restart edgex-device-mqttMQTT data not being processed
Usually a topic mismatch — check device-mqtt's config:
docker exec -it edgex-device-mqtt cat /etc/device-mqtt/configuration.tomlMake sure Incoming.Topic = "incoming/data/#".
This sets up an MQTT device in EdgeX Foundry that streams random randfloat64 readings, queryable through EdgeX's REST API — a setup that scales to other resources and device types. See the EdgeX Foundry docs for more.
Configuração de uma rede EDGE sobre a plataforma EdgeX Foundry, com um dispositivo MQTT simulado que envia leituras aleatórias e as torna consultáveis como eventos via API REST da EdgeX. Feito como exercício de IoT / edge computing no âmbito do Mestrado em Engenharia e Computação da Universidade Portucalense.
Este projeto tem como finalidade configurar um dispositivo MQTT no EdgeX Foundry para enviar dados simulados de um sensor usando um publisher em Node.js. O projeto utiliza o serviço device-mqtt para processar mensagens MQTT e gerar eventos que podem ser consultados via API. O dispositivo simulado, chamado MQTT-test-device, envia valores aleatórios para o recurso randfloat64, definido no perfil Test-Device-MQTT-Profile.
Configurar o EdgeX Foundry com um dispositivo MQTT que envia valores aleatórios via MQTT.
- Docker e Docker Compose instalados.
- Node.js (versão 14 ou superior) para executar o publisher e o subscriber.
- EMQ ou outro broker MQTT rodando em
localhost:1883. - Mosquitto-client para testar os tópicos posteriormente.
- VSCode ou um editor de texto que preferir.
├── README.md
├── docker-compose.yml
├── mqtt
│ └── configuration.yaml
└── mqtt-scripts
├── mock-device.js
└── subscriber.js
mqtt/: contém o arquivo de configuração do serviçodevice-mqtt(configuration.yaml).mqtt-scripts/: contém o código do publisher e do subscriber Node.js.docker-compose.yml: configura os serviços do EdgeX Foundry.
- Conecta ao broker MQTT em
localhost:1883. - Publica um valor aleatório (como string) a cada 2 segundos no tópico
incoming/data/MQTT-test-device/randfloat64.
Nota importante: o resourceName deve obedecer um dos tipos suportados pelo device-mqtt (randfloat64, script, randfloat32), no nosso caso: randfloat64.
- Conecta ao mesmo broker e escuta o mesmo tópico, permitindo ver em tempo real os valores enviados pelo publisher.
1. Iniciar o EdgeX Foundry
docker-compose up -d
docker-compose psConfirme que os serviços core-data, core-metadata, core-command, core-keeper, emq e device-mqtt estão todos em execução. O projeto usa um broker EMQ por padrão, mas pode ser trocado por Mosquitto se preferir.
2. Carregar a configuração do device-mqtt
O ficheiro configuration.yaml é montado via volume (./mqtt/configuration.yaml:/res/configuration.yaml). O serviço device-mqtt carrega automaticamente os perfis e os devices por padrão.
3. Configurar o publisher e o subscriber
sudo apt update
sudo apt install nodejs mosquitto-client
cd mqtt-scripts
npm install mqttDepois, em dois terminais separados:
node mock-device.js
node subscriber.js4. Testar e verificar
mosquitto_sub -h localhost -t incoming/data/#
curl http://localhost:59880/api/v3/event/device/MQTT-test-deviceDeve conter eventos com resourceName: randfloat64 e valueType: Float64. Também pode monitorizar os logs:
docker logs edgex-device-mqttErro: source name randfloat64 not found as Device Command or Device Resource
- Causa: mismatch no nome do dispositivo (ex.:
MQTT-Test-Devicevs.MQTT-test-device). - Solução:
Atualize o publisher para usar o nome correto ou recrie o dispositivo com o nome desejado, depois reinicie:
curl -X GET http://localhost:59881/api/v3/device/name/MQTT-test-device
docker restart edgex-device-mqtt
Erro: dados MQTT não processados
- Causa: tópico incorreto.
- Solução: verifique o
configuration.yamldodevice-mqtt:Certifique-se de quedocker exec -it edgex-device-mqtt cat /etc/device-mqtt/configuration.tomlIncoming.Topic = "incoming/data/#".
Este tutorial configurou um dispositivo MQTT no EdgeX Foundry que envia valores aleatórios para o recurso randfloat64. Os eventos gerados podem ser consultados via API, e o setup é escalável para outros recursos ou dispositivos. Para mais detalhes, consulte a documentação do EdgeX Foundry.