Este es el séptimo tutorial de IOT
(internet de las cosas) usando MQTT en un ESP8266; en estos videos (Parte A y
B) explico
cómo integrar MQTT (usando el bróker CloudMQTT) con MySQL, para eso vamos a
usar Python y dos librerías, “paho-mqtt 1.3.0” para conectarse con MQTT y “MySQL-python
1.2.5” para trabajar con la base de datos. En la parte B del tutorial termino
de explicar cómo crear la base de datos usando la herramienta phpMyAdmin
incluida en el servidor local WAMP “Uniform Server – Coral 8.9.2”; y agrego lo
que falta del código de Python como trabajar con la base de datos.
Parte A:
Parte B:
#!/usr/bin/env python 1 # -*- coding: utf-8 -*- import paho.mqtt.client as mqtt import sys # The callback for when the client receives a CONNACK response from the server. def on_connect(client, userdata, flags, rc): print("Conectado - Codigo de resultado: "+str(rc)) # Subscribing in on_connect() means that if we lose the connection and # reconnect then subscriptions will be renewed. client.subscribe("/#") # The callback for when a PUBLISH message is received from the server. def on_message(client, userdata, msg): print(msg.topic+" "+str(msg.payload)) client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message try: client.connect("m13.cloudmqtt.com", 11948, 60) except: print("No se pudo conectar con el MQTT Broker...") print("Cerrando...") sys.exit() client.username_pw_set("lqeamtbn", "vh0cU_Vcszxp") try: client.loop_forever() except KeyboardInterrupt: #precionar Crtl + C para salir print("Cerrando...")
tutorial17b.py:
#!/usr/bin/env python 1 # -*- coding: utf-8 -*- import paho.mqtt.client as mqtt import sys import MySQLdb # Abrir conexión con bases de datos try: db = MySQLdb.connect("127.0.0.1","root","root","tutorial17") except: print("No se pudo conectar con la base de datos") print("Cerrando...") sys.exit() # Preparando cursor cursor = db.cursor() # The callback for when the client receives a CONNACK response from the server. def on_connect(client, userdata, flags, rc): print("Conectado - Codigo de resultado: "+str(rc)) # Subscribing in on_connect() means that if we lose the connection and # reconnect then subscriptions will be renewed. client.subscribe("/#") # The callback for when a PUBLISH message is received from the server. def on_message(client, userdata, msg): print(msg.topic+" "+str(msg.payload)) lista = msg.topic.split("/") sql = """INSERT INTO `tutorial17`.`tabla` (`id`, `usuario`, `topic`, `mensaje`, `fecha`) VALUES (NULL, '""" + lista[1]+ """', '""" + lista[2] + """', '""" + str(msg.payload) + """', CURRENT_TIMESTAMP);""" try: # Ejecutar un comando SQL cursor.execute(sql) db.commit() print("Guardando en base de datos...OK") except: db.rollback() print("Guardando en base de datos...Falló") client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message try: client.connect("m13.cloudmqtt.com", 11948, 60) except: print("No se pudo conectar con el MQTT Broker...") print("Cerrando...") db.close() sys.exit() client.username_pw_set("lqeamtbn", "vh0cU_Vcszxp") try: client.loop_forever() except KeyboardInterrupt: #precionar Crtl + C para salir print("Cerrando...") db.close()
Python y Librerías:
Enlaces externos:
Este comentario ha sido eliminado por el autor.
ResponderEliminarque servidor externo podria funcionar???? ya probe infinitum y no funciona
ResponderEliminarMuy buenos tutoriales Alejandro. Una consulta por favor, si quisiera hacer funcionar python desde un servidor remoto, que es necesario hacer? Ya que para que funcione en servidor local el script de python debe estar corriendo. Es necesario configurar o subir algo en el servidor remoto? Agradecere mucho tu ayuda. Saludos
ResponderEliminarNo es tan fácil, necesitas un servidor en el que corras Python en el backend. No creo que encuentres uno gratuito. Deberías hacerlo vos, o contratar algo en la nube. Saludos.
ResponderEliminarBuenos dias! Muchas gracias por compartir tus conocimientos. consulta:
ResponderEliminarme aparecen los feeds de esta manera con esa comilla (`) y no logro darme cuenta porqué. Los mensajes funcionan correctamente. Podrias darme una pista de que pueda estar pasando? Muchas gracias.
Me topé con tu mismo problema. Te paso solución.
Eliminar'bXXX'significa bytes . Debe convertir esto a UTF-8 antes de usarlo:
msg.payload = msg.payload.decode("utf-8")
Excelente Nico, Muchas gracias!!
EliminarAdjunto out:
ResponderEliminarfeeds/casa/bridge/puerta/relay/0 b'0'
feeds/casa/bridge/puerta/relay/1 b'0'
feeds/casa/bridge/puerta/relay/2 b'0'
feeds/casa/bridge/puerta/relay/3 b'0'
feeds/casa/bridge/puerta/relay/4 b'0'
feeds/casa/bridge/puerta/relay/5 b'0'
feeds/casa/bridge/puerta/relay/6 b'0'
feeds/casa/bridge/puerta/relay/7 b'0'
feeds/casa/bridge/puerta/app b'ESPURNA'
feeds/casa/bridge/puerta/version b'1.14.1'
feeds/casa/bridge/puerta/board b'ITEAD_SONOFF_RFBRIDGE'
feeds/casa/bridge/puerta/host b'RFBRIDGE'
feeds/casa/bridge/puerta/ssid b'LOSLOPEZ'
feeds/casa/bridge/puerta/ip b'192.168.1.242'
feeds/casa/bridge/puerta/mac b'DC:4F:22:82:4A:70'
feeds/casa/bridge/puerta/rssi b'-80'
feeds/casa/bridge/puerta/uptime b'551105'
feeds/casa/bridge/puerta/datetime b'2021-04-10 22:12:10'
feeds/casa/bridge/puerta/freeheap b'18840'
feeds/casa/bridge/puerta/vcc b'3223'
feeds/casa/bridge/puerta/status b'1'
feeds/casa/bridge/puerta/loadavg b'1'
Este comentario ha sido eliminado por el autor.
EliminarHave you ever been steadily winning taking part in} a certain amount|a specific amount|a sure quantity}, e.g., $1, so you resolve to bet more to win more and enhance your bet per spin to $2. The machine "instantly" stops paying and turns into deader than a Dodo bird! Strange, is not it, contemplating slots are alleged to be so-called "random" . Modern gaming machines use 카지노 사이트 laptop expertise to operate their capabilities.
ResponderEliminar