Actualizado a 21/7/2026
Un observer (Observador) es un nodo de la red MeshCore (Repeater -repetidor, room server-buzón o Companion-cliente) que escucha el tráfico de la malla cercana e informa a uno o mas brokers MQTT por Internet.
Los observers pueden configurarse para compartir solamente los avisos o anuncios (advertisements) sin mostrar el reso del tráfico de la malla.
Una vez creado un observer, el propietario puede gestionar si quiere compartir los datos o no con un determinado broker (procesador que centraliza y explota los datos recibidos).
Los tipos de mensajes que genera un observer son:
- INFO - [SERVICE]: informa sobre los aprametros de servicio (numero de mensajes recibidos y trnasmitidos, numero de brokers o MQTT conectados , numerod e falolos, etc. en un intervalo de tiempo (p.e. 5 minutos)
- INFO - [DEVICE]: informa sobre los parametros de funcionamiento delnodo (Nivel de ruido, tiempo en el aire en TX y RX, estado de las baterias, etc.
- INFO -[SERIAL]: Informa de los parámetros de los paquete o mensaje recibido
- INFO- [MQTT]: informa de los paquetes publicos
![]() |
| Fuente: https://www.lorameshdevices.com/blog/meshcore/how-to-build-a-meshcore-observer-with-heltec-v3.html |
Los tipos de paquetes que identifica un Observer son:
- Tipo 0 REQ (Request / petición ): petición identificada por los hashes de destino y origen más un MAC (código de autenticación) — es la forma estándar (autenticada) en que un nodo pide algo a otro; por ejemplo obtener información sobre el nodo, estadísticas, telemetría, etc.
- Tipo 1 RESPONSE (Respuesta): es la respuesta a un REQ o un ANON_REQ de un nodo. Su contenido son datos de aplicación opacos; no hay un formato genérico de respuesta más allá de la envoltura cifrada, así que el significado exacto depende de qué se pidió originalmente (estadísticas, telemetría, info del nodo, etc.).
- Tipo 2 TXT_MSG (Text Message)
- Tipo 3 ACK (Acknowledgment)
- Tipo 4 ADVERT (Advertisement /anuncio de nodo): este tipo de payload notifica a los receptores que un nodo existe y da información sobre él — incluye el hash del nodo (primer byte de su clave pública) y, según la herramienta que lo decodifique, también su rol, ubicación, funciones soportadas y nombre. Se puede solicitar su envio o planificarlo para que se haga cada periodo de tiempo (p.e. cada hora)
- Tipo 5 = GRP_TXT (Group Text, mensaje de texto de grupo)
- Tipo 6 = GRP_DATA (Group Data): un dato de grupo (Group Data) sin verificar — es un mensaje binario dirigido a un canal/grupo, similar al mensaje de texto de grupo (tipo 5), pero pensado para datos de aplicación en vez de texto, y sin autenticación.
- Tipo 7 = ANON_REQ (Anonymous Request)
- Tipo 8 PATH (Ruta devuelta): estos mensajes describen la ruta que siguió un paquete desde su autor original; los receptores envían mensajes de ruta devuelta de vuelta al autor del mensaje original. Es decir, sirve para que el nodo que originó un mensaje sepa por qué camino (qué repetidores) llegó su paquete hasta el destino. Además, en estos mensajes de ruta devuelta, un acuse de recibo (ACK) puede ir incluido en el campo "extra" en vez de enviarse como paquete separado.
- Tipo 9 = TRACE
- Tipo 10 = MULTIPART
- Tipo 11 = CONTROL
- Tipo 12-14 = Reserved: los tipos 12 a 14 están reservados para uso futuro, es decir, todavía no tienen una función definida en el protocolo.
- Tipo 15 RAW_CUSTOM: un paquete personalizado (bytes en bruto, con cifrado propio) sin formato definido — MeshCore lo deja libre para que aplicaciones concretas metan ahí lo que necesiten, con su propio esquema de cifrado y estructura.
El observer tiene dos funciones o partes
- El NODO que se encarga de la recepción de los mensajes de la malla
- El GATEWAY que se encarga de enviar al servidor la información de funcionamineto del NODO y del GATEWAY y la información de los mensajes publicos y provados recibidos al MQTT BROKER para que los procese
Así para configurar un OBSERVER tenemos dos posibles soluciones:
- Conectar un nodo meshcore a un procesador 24/7 (p.e. una raspberry con el software adecuado y conexión a Internet) (ESTA ES LA SOLUCIÓN QUE SE VA A ANALIZAR EN ESTA ENTRADA).
- Crear un único dispositivo especifico OBSERVER sobre un hardware capaz de soportar ambas funciones (ESTA SOLUCIÓN NO SE VA A ANALIZAR EN ESTA ENTRADA)
Los OBSERVERs pueden consultarse vía web, por ejemplo para VLC (Valencia, España): https://live.meshcorecv.eu/#/observers
OBSERVER: Nodo + procesador
- Lilygo LORA 32 T3_V1.6.1 (No se consiguió que enviara datos del trafico, únicamente de su estado ¿?)
- Seeed Studio Xiao S3 WIO (si que funcionó)
![]() |
| Estadisticas del Observer/Repeater VC. VEA5JTT-X R8 en el broker mqtt https://live.meshcorecv.eu/ |
Hemos optado por compartir una Raspberry Pi 3B en la que ya se ejecutan otros programas.
El programa puede instalarse como
- Manual
- Como servicio
- Como docker (la tendencia actual al aislarse la instalación del entorno).
Preparando la instalación
- sudo apt update
- sudo apt install -y python3 python3-venv python3-dev build-essential
- python3 --version # ha de ser 3.11+
- Python 3.13.5
- Conectar el nodo meshcore a un puerto USB de la Raspberry con un cable adecuado (USB datos)
- Ejecutar ls /dev/ttyUSB* /dev/ttyACM* 2>/dev/null
- Si devuelve algo como /dev/ttyACM0 todo OK
- Si no devuelve nada es que no detecta la placa, la causa mas común es que el cable USB sea unicamente de alimentación y no de datos
- Antes de continuar hay que recopilar la información del broker o brokers MQTT a los que queremos enviar la información:
- Locales
- Globales
- Como consejo pruebe con uno y cuando funcione probar con otros MQTT, se pueden cambiar con facilidad y en cualquier momento y se puede enviar a uno a mas de uno o a ninguno. basta con editar el fichero de configuración y para y arrancar el programas/servicio/docker y esto no afecta al funcionamiento del nodo.
- Ejecutar el proceso de instalación curl -fsSL https://raw.githubusercontent.com/Cisien/meshcoretomqtt/main/install.sh | sudo bash
- Información sobre los directorios de innstalacion
- Installation directory: /opt/mctomqtt (Por defecto)
- Configuration directory: /etc/mctomqtt (Por defecto)
- Usuario
- Service account username [mctomqtt]: mctomqtt (Por defecto)
- Elegir el procedimiento de instalación:
- 1) System service (systemd/launchd) - installs Python dependencies on host
- 2) Docker container - all dependencies in container (requires docker to be installed) => Se elige esta al disponer ya de docker
- 3) Manual run only (install files, no auto-start)
- Solicita el path del USB /dev/ttyACM0
- Enter your IATA code (3 letters
- BCN - Barcelona
- VLC - Valencia)
- Server hostname/IP: broker.livemap-meshcorecat.com
- Port [1883]: 8883
- Use WebSockets transport? [y/N]: y
- Use TLS/SSL encryption? [y/N]: y
- Verify TLS certificates? [Y/n]: n
- ℹ Authentication method:
- 1) Username/Password
- 2) MeshCore Auth Token
- 3) None (anonymous)
- Choose authentication method [1-3] [1]: 1
- Username: cat-pub
- Password: CatMesh2026pub
- ✓ Broker 1 configured
- Construir el DOCker
- docker build -t mctomqtt:latest /path/to/meshcoretomqtt
- Arrancar el DOCker
- Gestion del Docker
- Start: docker start mctomqtt
- Stop: docker stop mctomqtt
- Status:
- docker ps -a | grep mctomqtt
- sudo docker ps -a | grep mctomqtt
- Para que no arramque solo cuando se haga reboot
- docker update --restart=no mctomqtt
- Logs: docker logs -f mctomqtt
- 2026-06-30 18:00:09,319 - INFO - Loaded base config from /etc/mctomqtt/config.toml
- 2026-06-30 18:00:09,324 - INFO - Loading config override: /etc/mctomqtt/config.d/99-user.toml
- 2026-06-30 18:00:09,330 - INFO - Configuration loaded from TOML
- 2026-06-30 18:00:09,333 - INFO - IATA: BCN
- 2026-06-30 18:00:09,334 - INFO - Serial ports: ['/dev/ttyACM0']
- 2026-06-30 18:00:09,334 - INFO - Brokers configured: 1
- 2026-06-30 18:00:09,339 - INFO - Connected to /dev/ttyACM0
- 2026-06-30 18:00:09,346 - WARNING - timedatectl not found — skipping sync check and continuing.
- 2026-06-30 18:00:10,352 - INFO - Repeater name: VC.V EA5JTT R8
- 2026-06-30 18:00:11,356 - INFO - Repeater pub key: ...
- 2026-06-30 18:00:12,365 - INFO - Repeater priv key: D018... (truncated for security)
- 2026-06-30 18:00:13,369 - INFO - Firmware version: v1.16.0-07a3ca9 (Build: 06-Jun-2026)
- 2026-06-30 18:00:13,871 - INFO - Board type: LILYGO T-LoRa V2.1-1.6
- 2026-06-30 18:00:15,378 - INFO - Device stats: {'battery_mv': 4194, 'uptime_secs': 1947, 'debug_flags': 0, 'queue_len': 0, 'noise_floor': -120, 'tx_air_secs': 10, 'rx_air_secs': 15, 'recv_errors': 35}
- 2026-06-30 18:00:15,379 - INFO - Client version: meshcoretomqtt/1.3.0.0-preview
- 2026-06-30 18:00:15,380 - INFO - Remote serial: DISABLED
- Todo OK
- Restart: docker restart mctomqtt
- PAra VALENCIA con dótigo IATA "VLC" https://live.meshcorecv.eu/
- Para "CATALUNYA" con código "VLC" debe verse en https://www.livemap-meshcorecat.com/ => Analyzer => observadors
![]() |
| Listado de los observers en donde vemos VC.V EA5JTT R8" con la etiqueta "VLC" |
![]() |
| Detalle del un observer de VC.V EA5JTT R8" |
Se comprueba que arranca con docker logs -f mctomqtt y tenemos que ver
- /etc/mctomqtt/config.toml: Valores predeterminados (se sobrescriben con las actualizaciones; no los edite).
- /etc/mctomqtt/config.d/10-*.toml: Preajustes del broker seleccionados durante la instalación.
- /etc/mctomqtt/config.d/99-user.toml => : Su configuración personalizada (nunca se sobrescribe).
- sudo rm -rf /opt/meshcoretomqtt
- sudo rm -rf ~/meshcoretomqtt
2 - FALTA DE PERMISOS EN EL DOCKER
permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.45/containers/json?all=1": dial unix /var/run/docker.sock: connect: permission denied
- sudo usermod -aG docker $USER
- newgrp docker
3 - ERROR EN LOS PARAMETROS DE CONFIGURACIÓN
Observe la estructura de los ficheros de parámetros o definiciones. Existen tres ficheros de configuración que uno sobre escribe al anterior y son comunes a cualquier tipo de instalción (manual, servicio o docker)
# =============================================================================
# MeshCore to MQTT - Configuration Reference
# =============================================================================
# This file documents all available configuration options with their defaults.
#
# Config loading order (default):
# 1. /etc/mctomqtt/config.toml (base defaults, overwritten on updates)
# 2. /etc/mctomqtt/config.d/10-*.toml (broker presets)
# 3. /etc/mctomqtt/config.d/99-user.toml (local overrides, loaded last)
#
# Put your customizations in /etc/mctomqtt/config.d/99-user.toml
#
# The --config flag bypasses default loading entirely. Multiple --config flags
# are supported; files are loaded in order, each overlaying the previous.
# =============================================================================
Editar el fichero de parametros en este caso para docker
- sudo nano /etc/mctomqtt/config.d/99-user.toml
name = "catalunya"
enabled = true
server = "broker.livemap-meshcorecat.com"
port = 8883
keepalive = 60
qos = 0
retain = true
[broker.tls]
enabled = true
verify = true
[broker.auth]
method = "password"
username = "cat-pub"
password = "CatMesh2026pub"
4 - EL OBSERVER NO ENVIA INFORMACIÖN DE TRAFICO AL BROKER (Packet Healt = Never)
Pero no se ven mensajes de tráfico que son del tipo
[SERIAL] Received packet...
[MQTT] [catalunya] Published packet to .../packet/advertsCosas que se pueden hacer
Comprobar USB
ls -la /dev/ttyACM*
crw-rw---- 1 root dialout 166, 0 jul 2 10:59 /dev/ttyACM0
Incluir nuevos parámetros
- docker restart mctomqtt
- docker logs -f mctomqtt
5 FALLO EN EL TIEMPO / RELOJ
jul 02 12:47:16 raspberrypi python3[902]: Universal time: jue 2026-07-02 10:47:16 UTC
jul 02 12:47:16 raspberrypi python3[902]: RTC time: n/a
jul 02 12:47:16 raspberrypi python3[902]: Time zone: Europe/Madrid (CEST, +0200)
jul 02 12:47:16 raspberrypi python3[902]: System clock synchronized: no
jul 02 12:47:16 raspberrypi python3[902]: NTP service: active
jul 02 12:47:16 raspberrypi python3[902]: RTC in local TZ: no
reiniciar hilos
6- REINICIO TOTAL
- sudo systemctl restart docker
- docker restart mctomqtt && docker logs -f mctomqtt
- sudo docker restart docker-node-sdr-1
- sudo docker restart ultrafeeder
-> > VC.V EA5JTT R8
8 - COMPROBACION DEL TIME EN LA RASPBERRY
timedatectl
Local time: jue 2026-07-02 17:06:04 CEST
Universal time: jue 2026-07-02 15:06:04 UTC
RTC time: n/a
Time zone: Europe/Madrid (CEST, +0200)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no
9 - Conectividad
ping -c 4 8.8.8.8
64 bytes from 8.8.8.8: icmp_seq=1 ttl=119 time=20.2 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=119 time=19.4 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=119 time=32.7 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=119 time=25.3 ms
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 19.379/24.395/32.685/5.302 ms
10- Resolución DNS
PING google.com (172.217.20.238) 56(84) bytes of data.
64 bytes from fra07s28-in-f238.1e100.net (172.217.20.238): icmp_seq=1 ttl=118 time=17.9 ms
64 bytes from fra07s28-in-f238.1e100.net (172.217.20.238): icmp_seq=2 ttl=118 time=25.9 ms
64 bytes from fra07s28-in-f238.1e100.net (172.217.20.238): icmp_seq=3 ttl=118 time=50.7 ms
64 bytes from fra07s28-in-f238.1e100.net (172.217.20.238): icmp_seq=3 ttl=118 time=56.5 ms (DUP!)
64 bytes from fra07s28-in-f238.1e100.net (172.217.20.238): icmp_seq=4 ttl=118 time=23.2 ms
--- google.com ping statistics ---
4 packets transmitted, 4 received, +1 duplicates, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 17.939/34.837/56.482/15.622 ms
11- TIME
date
lun 20 jul 2026 14:25:22 CEST
12 - CONFIGURACION
sudo systemctl status mctomqtt.service
● mctomqtt.service - MeshCore to MQTT Native Service
Loaded: loaded (/etc/systemd/system/mctomqtt.service; enabled; preset: enabled)
Active: active (running) since Tue 2026-07-21 19:33:31 CEST; 2min 55s ago
Invocation: 5871079263b84fad8f01bf6a3b1139d0
Main PID: 1790504 (python3)
Tasks: 23 (limit: 806)
CPU: 17.669s
CGroup: /system.slice/mctomqtt.service
└─1790504 /usr/bin/python3 /opt/meshcoretomqtt/mctomqtt.py --config /etc/mctomqtt/co>
CONCLUSIONES
La red MESHCORE es y será lo que cada uno aporte
- Divulgación
- Instalación de repetidores
- Actualización del mapa de cobertura con MESHMAPPER
- Información sobre el tráfico con OBSERVER
Ver más
Referencias
Advertencia importante
Las modificaciones, configuraciones y procedimientos descritos en este sitio pueden implicar riesgos técnicos, legales o de seguridad. El autor no se responsabiliza del mal funcionamiento de los equipos, daños permanentes, pérdida de garantía ni de posibles infracciones legales derivadas del uso de esta información.
El lector asume plena responsabilidad por cualquier acción que decida realizar basándose en el contenido de este blog.
© 2026 EA5JTT. Queda prohibida la reproducción total o parcial sin autorización expresa del autor.










No hay comentarios:
Publicar un comentario