Tutoriales

OwnTracks con tu propio broker MQTT: configuración, TLS y ACLs

Conecta la app OwnTracks a tu propio broker MQTT: ajustes de conexión, TLS en el puerto 8883, topics, ACLs por usuario para amigos, el Recorder y cómo probarlo.

Actualizado · 9 min de lectura

OwnTracks con tu propio broker MQTT: configuración, TLS y ACLs

OwnTracks es una app de ubicación de código abierto para Android e iOS que puede publicar la posición de tu móvil directamente en un broker MQTT. Con tu propio broker decides quién ve los datos, cuánto tiempo se guardan y qué otros sistemas (Home Assistant, Node-RED, una base de datos) los consumen. La configuración requiere cuatro valores en la app (host, puerto, usuario, contraseña), más TLS y una ACL en el broker.

Esta guía cubre los ajustes de la app, los topics y payloads que usa OwnTracks, las ACLs del broker para compartir con amigos, el OwnTracks Recorder y cómo verificar cada paso desde una terminal.

Qué necesitas

ElementoPor quéNotas
Un broker MQTT accesible desde internetLos móviles publican desde redes móvilesAutoalojado o gestionado, MQTT 3.1.1 es suficiente
TLS en el puerto 8883Las ubicaciones son datos personalesUn certificado de confianza pública es lo más sencillo
Un usuario por personaEl topic y las ACLs se derivan de élNunca compartas un login entre miembros de la familia
App OwnTracksPublica la ubicaciónAndroid (Google Play / F-Droid) o iOS
Opcional: OwnTracks RecorderGuarda el histórico y sirve un mapa webImagen Docker owntracks/recorder

Un broker público de pruebas vale para comprobar que la app conecta, pero no dejes un flujo de ubicación real en un endpoint compartido: cualquiera que se suscriba allí a owntracks/# lo vería.

Configura la app

En la app, abre Preferences → Connection (Android) o Settings (iOS) y cambia el modo de HTTP a MQTT. Los nombres de los campos varían un poco según la plataforma y la versión, pero los valores son los mismos:

AjusteValor
ModeMQTT
Hostbroker.connectmq.com (el hostname de tu broker)
Port8883
TLSActivado
Username / PasswordLas credenciales de esta persona en tu broker
Device IDNombre corto del móvil, p. ej. pixel o iphone
Tracker IDDos caracteres que se muestran en el mapa, p. ej. AL
Client IDDeja el valor por defecto; debe ser único por dispositivo

Guarda y desliza hacia abajo en el mapa o pulsa el botón de subida para publicar una ubicación manualmente. La pantalla de estado debería mostrar la conexión como conectada. Si no tienes claro que el broker acepte las credenciales, pruébalas antes desde tu portátil con el cliente MQTT online: así separas los problemas del broker de los de la app.

Topics y payloads

Con el usuario alice y el device ID pixel, la app usa:

Topics de OwnTracks
owntracks/alice/pixel          location messages (_type: location), retained by default
owntracks/alice/pixel/event    region enter/leave events (_type: transition)
owntracks/alice/pixel/info     card with name and avatar (_type: card)
owntracks/alice/pixel/cmd      commands TO the phone (_type: cmd)

Un mensaje de ubicación tiene este aspecto (campos abreviados; los campos exactos dependen de la plataforma y la versión):

owntracks/alice/pixel
{
  "_type": "location",
  "tid": "AL",
  "lat": 48.856613,
  "lon": 2.352222,
  "acc": 12,
  "alt": 35,
  "batt": 78,
  "conn": "m",
  "t": "u",
  "tst": 1792236000
}

tst es la hora UTC de la posición, acc la precisión en metros, batt el nivel de batería, conn el tipo de conexión (w Wi-Fi, m móvil) y t el disparador (u usuario, p ping, c región, entre otros). La app también registra un mensaje Last Will (_type: lwt) en el topic base, de modo que un suscriptor sabe cuándo el móvil se desconecta de forma abrupta.

El modo de monitorización controla cada cuánto informa el móvil: Significant (el predeterminado, cuida la batería y se basa en cambios de ubicación significativos), Move (actualizaciones frecuentes en movimiento, gasta más batería), Manual y Quiet. Empieza con Significant.

Si construyes tu propio rastreador por hardware, publica el mismo JSON con la misma estructura de topics y aparecerá junto a los móviles. El tutorial del rastreador GPS construye uno con un ESP32.

Verifica desde una terminal

Suscríbete con las credenciales de un usuario que pueda leer los topics de Alice:

Observar el tráfico de OwnTracks
mosquitto_sub -h broker.connectmq.com -p 8883 --capath /etc/ssl/certs \
  -u "$MQTT_USER" -P "$MQTT_PASS" -t 'owntracks/#' -v

Pulsa publish en la app; el JSON aparece en uno o dos segundos. Para probar la dirección contraria, pide una ubicación al móvil con un comando remoto. Los comandos remotos deben activarse en los ajustes avanzados de la app, y en iOS la entrega en segundo plano no está garantizada:

Pedir al móvil que informe
mosquitto_pub -h broker.connectmq.com -p 8883 --capath /etc/ssl/certs \
  -u "$MQTT_USER" -P "$MQTT_PASS" \
  -t 'owntracks/alice/pixel/cmd' -q 1 \
  -m '{"_type":"cmd","action":"reportLocation"}'

También puedes hacerte pasar por un móvil para probar el Recorder o un dashboard sin salir a caminar:

Simular una ubicación desde la línea de comandos
mosquitto_pub -h broker.connectmq.com -p 8883 --capath /etc/ssl/certs \
  -u "$MQTT_USER" -P "$MQTT_PASS" -t 'owntracks/alice/pixel' -q 1 -r \
  -m "{\"_type\":\"location\",\"tid\":\"AL\",\"lat\":48.8584,\"lon\":2.2945,\"acc\":10,\"tst\":$(date +%s)}"

ACLs: quién ve a quién

La app se suscribe a owntracks/+/+ por defecto y dibuja como amigo cada ubicación que recibe. Eso convierte la ACL del broker en el control de privacidad: un usuario ve exactamente los topics que tiene permiso para leer. En sintaxis de Mosquitto:

acl_file (Mosquitto)
# every user may publish and read under its own username
pattern readwrite owntracks/%u/#

# alice and bob share locations with each other
user alice
topic read owntracks/bob/#

user bob
topic read owntracks/alice/#

# the recorder reads everyone, publishes nothing
user recorder
topic read owntracks/#

En un broker gestionado expresas las mismas reglas como permisos por topic para cada usuario. Dos detalles a recordar:

  • El usuario de la app debe coincidir con el segundo nivel del topic; si no, se deniega cada publicación. Muchos brokers descartan una publicación denegada sin desconectar al cliente, así que el móvil parece conectado pero no llega nada. Consulta ACL denegada en silencio.
  • Prueba las reglas desde fuera: inicia sesión como Bob e intenta leer a alguien que no ha compartido con él. Tienes un script corto para esto en probar permisos ACL de MQTT.

Guarda el histórico con el Recorder

El OwnTracks Recorder se suscribe al broker, guarda cada ubicación en disco y sirve un mapa web y una API HTTP. La imagen Docker se configura con variables de entorno:

Ejecutar el OwnTracks Recorder
docker run -d --name ot-recorder -p 8083:8083 \
  -e OTR_HOST=broker.connectmq.com \
  -e OTR_PORT=8883 \
  -e OTR_USER=recorder \
  -e OTR_PASS="$MQTT_PASS" \
  -e OTR_CAFILE=/etc/ssl/certs/ca-certificates.crt \
  -v ot-store:/store \
  owntracks/recorder

Abre http://localhost:8083 para la interfaz web propia del Recorder. Dale al Recorder su propio usuario de solo lectura, como en la ACL anterior, y decide cuánto tiempo guardas el histórico. El puerto 8083 es aquí el puerto HTTP del Recorder en tu máquina, sin relación con el puerto WebSocket del broker.

Cifrado de extremo a extremo (opcional)

OwnTracks puede cifrar los payloads con una clave secreta compartida (libsodium). El broker entonces solo ve {"_type":"encrypted","data":"…"} y todo lector, incluido el Recorder, necesita la clave. Protege los datos frente al operador del broker, pero pierdes la posibilidad de inspeccionar los mensajes con las herramientas habituales. TLS más ACLs estrictas basta para la mayoría de instalaciones; consulta cifrado del payload MQTT para ver los pros y contras.

Solución de problemas

SíntomaCausa probableSolución
La app muestra un error justo al conectarUsuario o contraseña incorrectos, o CONNACK "Not authorized"Prueba las mismas credenciales en el cliente online; busca el código con la herramienta de reason codes
Error de TLS o de certificadoCertificado autofirmado o cadena incompletaUsa un certificado de confianza pública o instala tu CA en la app
Conectado, pero nada en mosquitto_subLa ACL deniega la publicación, o username ≠ usuario del topicRevisa los logs del broker y el patrón de la ACL
Faltan amigos en el mapaSin permiso de lectura sobre sus topicsAñade reglas read y vuelve a conectar la app
Las actualizaciones se detienen al rato en AndroidLa optimización de batería mata el servicio en segundo planoExcluye OwnTracks de la optimización de batería; consulta desconexiones en segundo plano en Android

OwnTracks en tu propio broker es uno de los despliegues MQTT útiles más sencillos: un móvil, un topic por dispositivo y unas pocas reglas de ACL. Asegura primero TLS y los permisos por usuario, verifica cada dirección con mosquitto_sub y mosquitto_pub, y solo después añade el Recorder o las integraciones de domótica.

Preguntas frecuentes

¿En qué topic publica OwnTracks?

Por defecto la app publica las ubicaciones en owntracks/<username>/<deviceID>, donde el username es el usuario MQTT y el device ID se define en la app. Los eventos, las tarjetas de información y los comandos usan subtopics como /event, /info y /cmd.

¿Puede OwnTracks usar un certificado autofirmado?

Sí, pero el móvil debe confiar en él: instala tu certificado de CA en los ajustes TLS de la app (Android) o en el dispositivo (iOS). Un certificado de una CA pública como Let's Encrypt evita este paso y funciona directamente en el puerto 8883.

¿Cómo se ven los amigos entre sí en OwnTracks?

La app se suscribe a owntracks/+/+ por defecto y muestra todas las ubicaciones que recibe. Qué amigos aparecen lo deciden por tanto las ACLs del broker: da a cada usuario permiso de lectura solo sobre las personas que deben verse.