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
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)
OBSERVER: Nodo + procesador
- Nodo
- 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ó)
- Un procesador funcionando 24/7 con conexión a InternetHemos 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).
Se pueden compartir varios tipos de instalaciones teniendo el cuidado de para servicios y dockers para que no se interfieran unos en otros al compartir recursos.
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+
Instalación como docker - 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:
- 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)
A partir de aqui se configura el MQTT BROKER al que vayamos a enviar la información recopilada por el OBSERVER, en el caso de "CATALUNYA" sería (Siempre puede modificar a posteriori las configuraciones creadas por el proceso de instalación:
- 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
- Construir el DOCker
- docker build -t mctomqtt:latest /path/to/meshcoretomqtt
docker run -d \
--name mctomqtt \
--restart unless-stopped \
-v /path/to/mctomqtt-config:/etc/mctomqtt:ro \
--device=/dev/ttyACM0 \
mctomqtt:latest
- 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
Instalación como servicio (mas habitual)
cd /opt
sudo git clone https://github.com/Cisien/meshcoretomqtt.git
Clonando en 'meshcoretomqtt'...
remote: Enumerating objects: 733, done.
remote: Counting objects: 100% (241/241), done.
remote: Compressing objects: 100% (84/84), done.
remote: Total 733 (delta 198), reused 160 (delta 157), pack-reused 492 (from 1)
Recibiendo objetos: 100% (733/733), 474.00 KiB | 1.21 MiB/s, listo.
Resolviendo deltas: 100% (431/431), listo.
Comprobaciones
cd meshcoretomqtt
sudo pip3 install pyserial paho-mqtt toml --break-system-packages
sudo pip3 install ed25519-orlp --break-system-packages
sudo nano /etc/systemd/system/mctomqtt.service
[Unit]
Description=MeshCore to MQTT Native Service
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/opt/meshcoretomqtt
ExecStart=/usr/bin/python3 /opt/meshcoretomqtt/mctomqtt.py --config /etc/mctomqtt/config.toml
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable mctomqtt.service
sudo systemctl start mctomqtt.service
o
sudo systemctl restart mctomqtt.service
Comprobaciones previas
ls -la /dev/ttyACM*
crw-rw---- 1 root dialout 166, 0 jul 2 11:51 /dev/ttyACM0
sudo journalctl -u mctomqtt.service -f
sudo journalctl -u mctomqtt.service -n 50 --no-pager
Funcionamiento
El Observer definido para enviar la información de estado y tráfico del repetidor en neustro caso "VC.V EA5JTT R8"
 |
Listado de los observers en donde vemos VC.V EA5JTT R8" con la etiqueta "VLC"
|
 |
| Detalle del un observer de VC.V EA5JTT R8" |
Si los brokers están interconectados como es el caso de el de CATALUNYA y el de VALENCIA con subirlo a uno de los dos brokers MQTT basara
MQTT Brokers
Un mismo observer puede publicar en varios MQTT BROKERS de forma simultánea, veacomos a continuación las deficiciones para : CATALUNYA, VALENCIA, LETSMESH y MESHMAPPER
CATALUNYA
[[broker]]
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"
MESHMAPPER
Editar con sudo nano /etc/mctomqtt/config.toml e incluir a continuación:
# 2. BROKER MESHMAPPER (WebSockets + TLS + Token)
[[broker]]
name = "meshmapper"
enabled = true
server = "mqtt.meshmapper.net"
port = 443
transport = "websockets"
keepalive = 60
qos = 0
retain = false
[broker.tls]
enabled = true
verify = true
[broker.auth]
method = "token"
audience = "mqtt.meshmapper.net"
Se comprueba que arranca con docker logs -f mctomqtt y tenemos que ver
2026-06-30 19:55:29,438 - INFO - [meshmapper] Connected to broker
LETSMESH
[[broker]]
name = "letsmesh"
enabled = true
server = "mqtt-us-v1.letsmesh.net"
port = 443
transport = "websockets"
keepalive = 60
qos = 0
retain = false
[broker.tls]
enabled = true
verify = true
[broker.auth]
method = "token"
audience = "mqtt-us-v1.letsmesh.net"
Se comprueba que arranca con docker logs -f mctomqtt y tenemos que ver
2026-06-30 20:17:18,656 - INFO - [letsmesh] Connecting to mqtt-us-v1.letsmesh.net:443 (transport=websockets, tls=True, keepalive=60s)
2026-06-30 20:17:18,838 - INFO - [letsmesh] Connected to broker
MESHCORECV
[general]
iata = "VLC"
[serial]
ports = ["/dev/ttyACM0"]
[[broker]]
name = "meshcorecv"
enabled = true
server = "mqtt.meshcorecv.eu"
port = 1883
transport = "tcp"
keepalive = 60
qos = 0
retain = true
[broker.tls]
enabled = false
verify = false
[broker.auth]
method = "none"
Se comprueba que arranca con docker logs -f mctomqtt y tenemos que ver
jul 21 19:40:52 raspberrypi python3[1796785]: 2026-07-21 19:40:52,758 - INFO - [meshcorecv] Connecting to mqtt.meshcorecv.eu:1883 (transport=tcp, tls=False, keepalive=60s)
jul 21 19:40:52 raspberrypi python3[1796785]: 2026-07-21 19:40:52,794 - INFO - [meshcorecv] Connected to broker
Visualización
Parámetros
La configuración utiliza archivos TOML con un sistema de anulación por capas:
- /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).
Resolucion de problemas
1 - ERROR EN LA INSTACIÓN
Si se aborta la instalación, se borran las carpetas y se vuelve a comenzar- 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.
# =============================================================================
Por lo que sea cuando es un servicio hay que tocar /etc/mctomqtt/config.toml mientras que como docker se hace en /etc/mctomqtt/config.d/99-user.toml
Editar el fichero de parametros en este caso para docker
- sudo nano /etc/mctomqtt/config.d/99-user.toml
[[broker]]
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)

En el log se observa que se envian al broker mensajes de estado del procesador
2026-07-02 04:08:03,585 - INFO - [SERVICE] Uptime: 5m | RX/TX: 0/0 (5m: 0.0/min) | RX bytes: 0B | MQTT: 3/3 | Reconnects/24h: none | Failures: 0
2026-07-02 04:08:03,586 - INFO - [DEVICE] Noise: -120dB | Air (5m): Tx 2.0s (0.66%), Rx 3.0s (0.99%) | Battery: 4228mV | Uptime: 13h 12m | Debug Flags: 0 | Queue: 0 | Err/min (5m): 0.0
Pero no se ven mensajes de tráfico que son del tipo
[SERIAL] Received packet...
[MQTT] [catalunya] Published packet to .../packet/adverts
Cosas 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
# --- NUEVA SECCIÓN DE ACTIVACIÓN DE TRÁFICO ---
[mqtt]
# Habilitamos el envío de paquetes de datos puros de radio
publish_packets = true
[filters]
# Dejamos la lista de bloqueos vacía para asegurarnos de que NO filtre nada
disallowed_packet_types = []
# -----------------------------------------------
Tras modificar los parametros en los ficheros de configuración con un editor como nano hay que rearrancar los docjers o servicios y listr el log correspondiente
- docker restart mctomqtt
- docker logs -f mctomqtt
comprobar el flujo de salida de datos del nodo hacia el observer
sudo apt-get install screen -y
screen /dev/ttyACM0 115200
CTRL-A K
5 FALLO EN EL TIEMPO / RELOJ
jul 02 12:47:16 raspberrypi python3[902]: 2026-07-02 12:47:16,238 - WARNING - System clock is not synchronized: Local time: jue 2026-07-02 12:47:16 CEST
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
sudo systemctl restart systemd-timesyncd
timedatectl status
Local time: jue 2026-07-02 12:54:19 CEST
Universal time: jue 2026-07-02 10:54:19 UTC
RTC time: n/a
Time zone: Europe/Madrid (CEST, +0200)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no
6- REINICIO TOTAL
- sudo systemctl restart docker
- docker restart mctomqtt && docker logs -f mctomqtt
OJO Si tiene mas aplicaciones en docker las tendra que reiniciar de nuevo asi para ADS-B se hará
- sudo docker restart docker-node-sdr-1
- sudo docker restart ultrafeeder
7 - TERMINAL REMOTO
sudo systemctl stop mctomqtt.service
python3 -m serial.tools.miniterm /dev/ttyACM0 921600
--- Miniterm on /dev/ttyACM0 921600,8,N,1 ---
--- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
get name
-> > 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
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
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 -c 4 google.com
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
Sin embargo al ser una tecnología relativamente reciente el hardwware y software no estan muy depurados y los procedimientos no estan muy claros, por ello no hay que desanimarse si las cosas no salen a la primera y hay que perseverar, como es en este caso el hecho de que por el momento no se haya conseguido enviar información del tráfico a los brokers.
No se aprende con el éxito , sino con los fracasos que nos llevan al éxito
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.