Ir al contenido

← Todas las funcionalidades

Mezclado industrial (HMI táctil)TouchBerry PiMQTTSQL ServerComunicación

Un puente bidireccional MQTT / SQL Server con paho-mqtt y pyodbc

Los dispositivos de planta hablan MQTT; la base de datos de la empresa es SQL Server. Este script en Python une ambos mundos en una TouchBerry Pi: cada 5 segundos lee la disponibilidad de máquina de la base de datos y la publica para los LEDs de la HMI, y en sentido contrario inserta en una tabla de histórico cada activación recibida por MQTT. Es el patrón exacto de un despliegue real en una línea de mezclado industrial, con la lógica de reconexión de ambos lados incluida.

Dos direcciones, un solo script

El puente consulta una tabla EstadoMaquinas cada cinco segundos y publica el flag de disponibilidad de cada máquina como mensaje MQTT retenido, de modo que los dashboards muestran siempre estado fresco incluso después de reiniciarse. Mientras tanto, el hilo de callbacks de paho-mqtt recibe activaciones JSON del panel táctil y las escribe en RegistroActivaciones con un INSERT parametrizado — placeholders, nunca concatenación de cadenas, para que una comilla perdida en un campo de comentario no pueda romper la consulta.

Los dos enlaces se caerán — cuenta con ello

loop_start() da a paho-mqtt su propio hilo en segundo plano con reconexión automática al broker, y el callback on_connect se vuelve a suscribir cada vez, así que un reinicio del broker no cuesta nada. El lado de base de datos envuelve cada operación de cursor: ante un error de pyodbc el script entra en un bucle de reintento, reconecta con un backoff de 10 segundos y repite el insert pendiente, en lugar de morir en silencio de madrugada y perder un turno entero de registros de activación.

La configuración queda fuera del código

El nombre del servidor, la base de datos, las credenciales y los nombres de topics están juntos al principio del script como placeholders evidentes (SERVIDOR_SQL, bd_produccion), pensados para cargarse desde variables de entorno o un fichero de configuración en producción en lugar de subirse a un repositorio. La cadena de conexión ODBC apunta a msodbcsql17, que Microsoft distribuye para ARM Linux, así que el mismo script corre sin cambios en la Raspberry Pi del interior del panel táctil.

Un fragmento de la implementación

Tal cual del ejemplo desplegado en el TouchBerry Pi — cópialo libremente:

def connect_db():
    """Returns a valid connection, retrying until it succeeds."""
    global db_connection
    while True:
        try:
            db_connection = pyodbc.connect(SQL_CONN_STR, timeout=5)
            db_connection.autocommit = True
            print("[DB] Connected to SQL Server")
            return db_connection
        except pyodbc.Error as e:
            print(f"[DB] No connection ({e}); retrying in {DB_RETRY_S} s")
            time.sleep(DB_RETRY_S)

El ejemplo completo es un programa entero — cabecera de conexionado, setup y bucle principal — listo para adaptar a tu aplicación.

Preguntas frecuentes

¿Puede una Raspberry Pi conectarse a Microsoft SQL Server?

Sí. Instala el driver ODBC msodbcsql17/18 (o FreeTDS) y usa pyodbc desde Python; la cadena de conexión es la misma que en Windows.

¿Por qué sondear la base de datos en lugar de empujar desde SQL Server?

Un SELECT cada 5 segundos sobre una tabla pequeña es una carga trivial y no necesita Service Broker ni triggers. Para reaccionar más rápido puedes acortar el periodo o añadir una columna de control de cambios.

¿Qué pasa con los mensajes MQTT mientras la base de datos está caída?

El ejemplo reintenta el insert fallido tras reconectar. Para cortes más largos, añade una cola local (un fichero o SQLite) para que las activaciones sobrevivan hasta que SQL Server vuelva.

Funcionalidades relacionadas