Python por mqtt a Mysql
Enviar datos PYTHON por MQTT a MySQL

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.

No hay texto alternativo para esta imagen
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:

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.

No hay texto alternativo para esta imagen

El resultado final sería este, en el que podemos observar en el MySQL como se insertan los valores:


No hay texto alternativo para esta imagen
No hay texto alternativo para esta imagen

Si te a gustado este post puedes visitar mi web joelbenitez.com

Inicia sesión para ver o añadir un comentario.

Otros usuarios han visto

Ver temas