Python por mqtt a Mysql
En este post enviare datos de un archivo Python a MySQL por medio de MQTT
En publicaciones anteriores de mi página web se explica cómo enviar datos de Python a MySQL y cómo enviar y recibir datos por medio de MQTT.
En este post veremos cómo enviamos datos desde un archivo Python a un Topic MQTT desde el Broker mosquitto. Un suscriptor de nuestro Topic leerá el dato publicado y lo enviaremos ese dato a nuestra tabla MySQL.
Creamos un cliente que envíe los valores a unos Topics de mqtt.
Importamos su librería paho.mqtt , con esta librería podremos seguir y publicar en los topics MQTT del broker mosquitto utilizando archivos python.
import paho.mqtt.publish as publish
Configuramos la conexión MQTT
Utilizaremos dos Topics, un topic donde enviaremos la id del panel y en otro topic enviaremos el nombre del panel.
broker_address = "localhost"
topic_id = "Panel/id"
topic_name = "Panel/nombre"
Mensaje que enviaremos a nuestros topics será el siguiente:
mensaje1 = "1"
mensaje2 = "Panel 1"
msjs = [{'topic': topic_id, 'payload': mensaje1},
(topic_name, mensaje2, 0, False)]
publicar.multiple(msgs, hostname=broker_address)#publicamos
En resumen quedaría así nuestro cliente que envié a MQTT:
import paho.mqtt.publish como publicación
broker_address = "localhost"
topic_id = "Panel/id"
topic_name = "Panel/name"
mensaje1 = "1"
mensaje2 = "Panel 1"
msgs = [{'topic': topic_id, 'payload ': mensaje1},
(topic_name, mensaje2, 0, False)]
publique.multiple(msgs, hostname=broker_address)#publicamos
Leer los TOPICS y enviarlos a la tabla MySQL:
Haremos un cliente que recoja los datos de los Topics y que los envié esos datos a una tabla MySQL
Importamos estas librerías:
Recomendado por LinkedIn
import paho.mqtt.client as mqtt # para leer
import pymysql #libreria
from pickle import GLOBAL
Configuramos la conexión a nuestro MySQL
#crea conexión con motor mysql
conn = pymysql.connect(
host="127.0.0.1",#ip donde este nuestro mysql
user="user", #usuario
passwd="123", #password de usuario
database="db"# Servidor DB
)
# Establece cursor
cursor = conn.cursor()
Configuramos el enlace con el Topic mqtt de mosquitto.
#conexion mqtt
broker_address = "localhost"
topic = "Panel/+"
topic_name = "Panel/nombre"
broker_port = 1883
La parte importante de nuestro código está aquí, tendremos dos valores importantes los cuales enviaremos a MySQL esos son la id del panel y el nombre del panel . No enviaremos la id del panel hasta recibir el nombre del panel así que con unos 'if' hemos hecho la sentencia en la cual publicamos los valores recibidos de los Topics MQTT a MySQL al recibir la id y el nombre del panel:
n_1 = "9"
n_2 = "9"
#utilizamos la funcion on_message()
def on_message(client, userdata, message):
if message.topic == "Panel/name":
print("Nombre del panel=", str(message.payload.decode("utf-8 ")))
global id_panel
id_panel= str(mensaje.payload.decode("utf-8"))
global n_1
n_1 = "1"
if mensaje.topic == "Panel/id":
print("Id del panel=" , str(mensaje.payload.decode("utf-8")))
global nombre_id_panel
nombre_id_panel = str(mensaje.payload.decode("utf-8"))
global n_2
n_2= "1"
#print("mensaje=" , str(mensaje.payload.decode("utf-8")))
print("Topic=", mensaje.topic)
print("Nivel de calidad [0|1|2]=", mensaje.qos)
print("Flag de retención =", mensaje.retain)
print(n_1,n_2)
if n_2 == "1" and n_1 == "1":
cursor.execute("INSERT INTO Paneles VALUES (%s, %s) ", (name_id_panel, id_panel))
n_1= "0"
n_2 = "0"
conn.commit()
conn.close()
print("Envio correcto de datos")
Para terminar el programa aquí hacemos los últimos pasos la conexión y seguimiento de los Topics.
client = mqtt.Client("Sub_cliente_id")# hacemos cliente
client.on_message = on_message
client.connect(broker_address, broker_port, 60)
client.subscribe(topic) # Subscripción al topic server broker\\server_broker_test.py
# Guardar los cambios de nuestros datos
client.loop_forever()
El resultado final sería este:
from pickle import GLOBAL
import paho.mqtt.client as mqtt #para leer
import pymysql #libreria
#crea conexión con motor mysql
conn = pymysql.connect(
host="127.0.0.1",#ip donde este nuestro mysql
user="user", #usuario
passwd="123", #password de usuario
database="db"# Servidor DB
)
# Establece cursor
cursor = conn.cursor()
#conexion mqtt
broker_address = "localhost"
topic = "Panel/+"
topic_name = "Panel/nombre"
broker_port = 1883
n_1 = "9"
n_2 = "9"
#utilizamos la funcion on_message()
def on_message(client, userdata, message):
if message.topic == "Panel/name":
print("Nombre del panel=", str(message.payload.decode("utf-8 ")))
global id_panel
id_panel= str(mensaje.payload.decode("utf-8"))
global n_1
n_1 = "1"
if mensaje.topic == "Panel/id":
print("Id del panel=" , str(mensaje.payload.decode("utf-8")))
global nombre_id_panel
nombre_id_panel = str(mensaje.payload.decode("utf-8"))
global n_2
n_2= "1"
#print("mensaje=" , str(mensaje.payload.decode("utf-8")))
print("Topic=", mensaje.topic)
print("Nivel de calidad [0|1|2]=", mensaje.qos)
print("Flag de retención =", mensaje.retain)
print(n_1,n_2)
if n_2 == "1" and n_1 == "1":
cursor.execute("INSERT INTO Paneles VALUES (%s, %s) ", (name_id_panel, id_panel))
n_1= "0"
n_2 = "0"
conn.commit()
conn.close()
print("Envio correcto de datos")
client = mqtt.Client("Sub_cliente_id")# hacemos cliente
client.on_message = on_message
client.connect(broker_address, broker_port, 60)
client.subscribe(topic) # Subscripción al topic server broker\\server_broker_test.py
# Guardar los cambios de nuestros datos
client.loop_forever()
Activamos los dos archivos Python, primero el archivo que sigue el Topic y luego el archivo que publica en el Topic que queremos.
El resultado final sería este, en el que podemos observar en el MySQL como se insertan los valores:
Si te a gustado este post puedes visitar mi web joelbenitez.com