#!/usr/bin/env python3 ###### ###### Programa que roda (python3 [nome]) até ser encerrado (ctrl+c) recebendo mensagens de um tópico por mqtt ###### e salva em uma date base. As mensagens de erro são mandadas para o tópico feedback no localhost ###### import logging import paho.mqtt.client as mqtt import time import hashlib import mysql.connector ############ valores iniciais ############ global cur broker_address="localhost" topico= "cosmic" user_db = '[usuario mysql]' password_db = '[senha mysql]' db_connection = mysql.connector.connect(host='localhost',user = user_db, passwd = password_db, auth_plugin='mysql_native_password') cur = db_connection.cursor() ############ funções ############ def insert_bd(colunas,valores): cur.execute("USE [nome Banco de dados];") cur.execute("INSERT INTO eventos ({}) VALUES({})".format(colunas,valores)) #Salva comando no cursor def on_message(client, userdata, message): # Funcao que roda toda vez que se recebe uma mensagem # mensagens no terminal (opcional) print("message received " ,str(message.payload.decode("utf-8"))) #imprime msg no terminal print("message topic=",message.topic) # imprime tópico #print("message qos=",message.qos) #print("message retain flag=",message.retain) # colocando dados em variaveis que representam as grandezas medidas pre_dados = str(message.payload.decode("utf-8")) # transforma a mensagem recebida em string dados = list(pre_dados.split(" ")) # separando string que chegou em uma lista por espaços hora= float(dados[0]) loca= "'{}'".format(dados[1]) inte= float(dados[2]) temp= float(dados[3]) umid= float(dados[4]) pres= float(dados[5]) usua= "'{}'".format(dados[6]) hash= "'{}'".format(dados[7]) # começo das strings colunas e valores, desta forma só se salva no bd o que está correto colunas="hora,local,intensidade" valores= str(hora)+","+str(loca)+","+str(inte) today = datetime.now() hoje = " " + today.strftime("%Y|%m|%d %H:%M:%S") # Checa o usuario usuarios_cadastrados = check_usuario() for x in usuarios_cadastrados: d=0 usuario_comparacao= str(usua)[1:-1] if (usuario_comparacao == str(x)[2:-3]): d=1 break if ( d == 0 ): mensag = "usuario não cadastrado: "+usua print( mensag+ str(hoje),file = open(output,'a')) client.publish("feedback", mensag) # Checa o Hash string = str(hora)+str(loca)+str(inte)+str(temp)+str(umid)+str(pres)+usua result = hashlib.md5(string.encode()) hash2 = result.hexdigest() hash1= "{}".format(dados[7]) # hash específico para comparação, sem '' if (hash2==hash1): # só manda para o BD se o HASH for igual client.publish("feedback","dadosHASH confere") # intensidade > 0 if (inte<0): mensag = "intensidade menor que zero" print( mensag+str(hoje),file = open(output,'a')) client.publish("feedback",mensag) else: colunas += ",intensidade" valores += "," + str(inte) # Checa se temp está entre o zero absoluto e um número grande para todas escalas (C° K F°) if (-274>temp or umid>1000): mensag = "temperatura errada" print( mensag+str(hoje),file = open(output,'a')) client.publish("feedback",mensag) else: colunas += ",temperatura" valores += "," + str(temp) # Checa se umidade está entre 0% e 100% if (0>umid or umid>100): mensag= "umidade errada" print( mensag+str(hoje),file = open(output,'a')) client.publish("feedback",mensag) else: colunas += ",umidade" valores += "," + str(umid) # Pressao > 0 if (pres<=0): mensag = "pressao menor que zero" print( mensag+str(hoje),file = open(output,'a')) client.publish("feedback",mensag) else: colunas += ",pressao" valores += "," + str(pres) #valores que completam a string colunas += ",usuario,HASH" valores += ","+usua+","+hash ## Inserção no banco de dados insert_bd(colunas,valores) #chama a função que INSERT no banco de dados db_connection.commit() # executa o comando do curso elif(d==1): #caso hash não confira mensag = "HASH diferentes hash1: "+hash1+"hash2: "+hash2 print( mensag+str(hoje),file = open(output,'a')) client.publish("feedback", mensag) ############ Subscribe ao tópico ############ username_MQTT="[usuario MQTT]" #user para MQTT password_MQTT="[senha MQTT]" #senha para MQTT client = mqtt.Client("P1") #create new instance client.on_message=on_message #attach function to callback client.username_pw_set(username_MQTT, password_MQTT) # passa o user e senha do mqtt client.connect(broker_address) #connect to broker client.subscribe(topico) # se inscreve no tópico (quando chega mensagem chama a função on_message) client.loop_forever() # repete tudo relacionado ao mqtt