Skip to content

Mario2211-debug/edgeX

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 

Repository files navigation

EdgeX Foundry — MQTT IoT Device Simulation

Universidade Portucalense Colaboração

Docker Node.js MQTT EdgeX Foundry

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.

Goal

Configure EdgeX Foundry with an MQTT device that sends random float values via MQTT, and read them back out through the EdgeX core services.

Prerequisites

  • 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.

Project structure

├── README.md
├── docker-compose.yml
├── mqtt
│   └── configuration.yaml
└── mqtt-scripts
    ├── mock-device.js
    └── subscriber.js
  • mqtt/configuration.yaml for the device-mqtt service.
  • mqtt-scripts/ — the Node.js publisher and subscriber.
  • docker-compose.yml — the EdgeX Foundry service stack.

Publisher (mock-device.js)

  • 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.

Subscriber (subscriber.js)

  • Connects to the same broker and listens on the same topic, so you can see the values the publisher is sending in real time.

Setup steps

1. Start EdgeX Foundry

docker-compose up -d
docker-compose ps   # confirm core-data, core-metadata, core-command, core-keeper, emq and device-mqtt are all running

The stack uses an EMQ broker by default; Mosquitto also works if you'd rather swap it in.

2. Load the device-mqtt configuration

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.

3. Run the publisher and subscriber

sudo apt update
sudo apt install nodejs mosquitto-client
cd mqtt-scripts
npm install mqtt

Then, in two separate terminals:

node mock-device.js
node subscriber.js

4. Verify

mosquitto_sub -h localhost -t incoming/data/#
curl http://localhost:59880/api/v3/event/device/MQTT-test-device

The event should show resourceName: randfloat64 and valueType: Float64. You can also check the container logs:

docker logs edgex-device-mqtt

Troubleshooting

source 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-device

Fix the name in the publisher or recreate the device with the expected name, then restart:

docker restart edgex-device-mqtt

MQTT data not being processed Usually a topic mismatch — check device-mqtt's config:

docker exec -it edgex-device-mqtt cat /etc/device-mqtt/configuration.toml

Make sure Incoming.Topic = "incoming/data/#".

Conclusion

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.


🇵🇹 Versão em português

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.

Objetivo

Configurar o EdgeX Foundry com um dispositivo MQTT que envia valores aleatórios via MQTT.

Pré-requisitos

  • 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.

Estrutura do projeto

├── 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ço device-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.

Publisher (mock-device.js)

  • 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.

Subscriber (subscriber.js)

  • Conecta ao mesmo broker e escuta o mesmo tópico, permitindo ver em tempo real os valores enviados pelo publisher.

Passos de configuração

1. Iniciar o EdgeX Foundry

docker-compose up -d
docker-compose ps

Confirme 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 mqtt

Depois, em dois terminais separados:

node mock-device.js
node subscriber.js

4. Testar e verificar

mosquitto_sub -h localhost -t incoming/data/#
curl http://localhost:59880/api/v3/event/device/MQTT-test-device

Deve conter eventos com resourceName: randfloat64 e valueType: Float64. Também pode monitorizar os logs:

docker logs edgex-device-mqtt

Solução de problemas

Erro: source name randfloat64 not found as Device Command or Device Resource

  • Causa: mismatch no nome do dispositivo (ex.: MQTT-Test-Device vs. MQTT-test-device).
  • Solução:
    curl -X GET http://localhost:59881/api/v3/device/name/MQTT-test-device
    Atualize o publisher para usar o nome correto ou recrie o dispositivo com o nome desejado, depois reinicie:
    docker restart edgex-device-mqtt

Erro: dados MQTT não processados

  • Causa: tópico incorreto.
  • Solução: verifique o configuration.yaml do device-mqtt:
    docker exec -it edgex-device-mqtt cat /etc/device-mqtt/configuration.toml
    Certifique-se de que Incoming.Topic = "incoming/data/#".

Conclusão

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.

About

Simulação de dispositivo IoT via MQTT no EdgeX Foundry (Docker) — projeto colaborativo do Mestrado UPT

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors