Autor: Manuel Muñoz Rodríguez
Contacto: mmr411@ual.es
Asignatura: Aplicaciones de IoT
Infraestructura completa para la práctica de Aplicaciones de IoT basada en el stack FIWARE con broker MQTT Mosquitto.
Dispositivo / Script
│
│ Publica en MQTT
│ topic: /practica01/sensor001/attrs
│ payload: {"t": 25.3, "h": 60}
▼
Mosquitto (1883)
Broker MQTT
│
▼
IoT Agent JSON (4041 / 7896)
Traduce MQTT+JSON → NGSIv2
│
▼
Orion Context Broker (1026)
Almacena entidades NGSI
│
▼
MongoDB (27017)
Persistencia
- Docker Desktop instalado y en ejecución
- Postman para las peticiones REST
- MQTT Explorer (opcional) para publicar mensajes MQTT visualmente
Mac Apple Silicon (M1/M2/M3): las imágenes de Orion e IoT Agent son
linux/amd64y se ejecutan mediante emulación Rosetta. Funciona correctamente para uso docente.
Proyecto_completo/
├── docker-compose.yml # Definición de servicios
├── mosquitto/
│ ├── config/mosquitto.conf # Configuración del broker MQTT
│ ├── data/ # Persistencia de mensajes
│ └── log/ # Logs de Mosquitto
├── mongodocker/
│ └── data/ # Persistencia de MongoDB
├── FIWARE_Practica_IoT.postman_collection.json # Colección Postman
├── README.md # Este fichero
└── DOCUMENTACION.md # Guía didáctica completa
| Servicio | Imagen | Puerto(s) | Descripción |
|---|---|---|---|
orion |
telefonicaiot/fiware-orion |
1026 |
Context Broker NGSI v2 |
iot-agent |
fiware/iotagent-json:3.4.0 |
4041 (gestión) / 7896 (datos HTTP) |
IoT Agent JSON |
mqtt-broker |
eclipse-mosquitto:latest |
1883 (MQTT) / 9001 (WebSockets) |
Broker MQTT |
mongo |
mongo:6.0 |
27017 (interno) |
Base de datos |
docker compose up -dVerificar que todos los contenedores están en ejecución:
docker compose psTodos deben aparecer como Up o healthy.
docker compose downPara eliminar también los datos persistidos:
docker compose down -v
rm -rf mongodocker/data mosquitto/data mosquitto/logGET http://localhost:1026/version
GET http://localhost:4041/iot/about
Crear, leer, actualizar y borrar entidades directamente en Orion.
Crear grupo de servicio:
POST http://localhost:4041/iot/services
Fiware-Service: practica
Fiware-ServicePath: /{
"services": [{
"apikey": "practica01",
"cbroker": "http://orion:1026",
"entity_type": "Sensor",
"resource": "/iot/json"
}]
}Registrar dispositivo:
POST http://localhost:4041/iot/devices
Fiware-Service: practica
Fiware-ServicePath: /{
"devices": [{
"device_id": "sensor001",
"entity_name": "urn:ngsi-ld:Sensor:001",
"entity_type": "Sensor",
"transport": "MQTT",
"apikey": "practica01",
"attributes": [
{"object_id": "t", "name": "temperatura", "type": "Float"},
{"object_id": "h", "name": "humedad", "type": "Integer"}
],
"static_attributes": [
{"name": "ubicacion", "type": "Text", "value": "Laboratorio IoT"}
]
}]
}Topic:
/practica01/sensor001/attrs
Payload:
{"t": 25.3, "h": 60}Con MQTT Explorer: conectar a localhost:1883, publicar en el topic anterior.
Con línea de comandos:
mosquitto_pub -h localhost -p 1883 \
-t "/practica01/sensor001/attrs" \
-m '{"t": 25.3, "h": 60}'GET http://localhost:1026/v2/entities/urn:ngsi-ld:Sensor:001?options=keyValues
Fiware-Service: practica
Fiware-ServicePath: /
Respuesta esperada:
{
"id": "urn:ngsi-ld:Sensor:001",
"type": "Sensor",
"temperatura": 25.3,
"humedad": 60,
"ubicacion": "Laboratorio IoT"
}| Variable | Valor | Descripción |
|---|---|---|
orion_url |
http://localhost:1026 |
URL de Orion |
iota_url |
http://localhost:4041 |
URL del IoT Agent |
fiware_service |
practica |
Namespace lógico |
entity_id |
urn:ngsi-ld:Sensor:001 |
ID de la entidad |
device_id |
sensor001 |
ID del dispositivo |
apikey |
practica01 |
Clave del grupo de servicio |
Todas las peticiones al IoT Agent y a Orion (excepto /version y /iot/about) deben incluir:
Fiware-Service: practica
Fiware-ServicePath: /
Sin estas cabeceras las peticiones buscan en un namespace diferente y no encuentran los datos.