inicial.py 5.12 KB
Newer Older
Bruno Thomazi Zanette's avatar
Bruno Thomazi Zanette committed
1
2
#!/usr/bin/env python3

3
######
4
###### Programa que roda (python3 [nome]) até ser encerrado (ctrl+c) recebendo mensagens de um tópico por mqtt
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
###### 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)
    
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
    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)
    
77
78
79
80
81
82
83
84
85
    # 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")
86
87
88
89
90
91
92
93
94
95
    
        # 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)

96
97
        # 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):
98
99
100
            mensag = "temperatura errada"
            print( mensag+str(hoje),file = open(output,'a'))
            client.publish("feedback",mensag)
101
102
103
104
105
106
        else:
            colunas += ",temperatura"
            valores += "," + str(temp)
            
        # Checa se umidade está entre 0% e 100%
        if (0>umid or umid>100):
107
108
109
            mensag= "umidade errada"
            print( mensag+str(hoje),file = open(output,'a'))
            client.publish("feedback",mensag)
110
111
112
        else:
            colunas += ",umidade"
            valores += "," + str(umid)
113

114
115
        # Pressao > 0
        if (pres<=0):
116
117
118
            mensag = "pressao menor que zero"
            print( mensag+str(hoje),file = open(output,'a'))
            client.publish("feedback",mensag)
119
120
121
        else:
            colunas += ",pressao"
            valores += "," + str(pres)
122
123
        
        #valores que completam a string
124
125
126
127
128
129
130
131
132
        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

133
134
135
136
    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)
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154


############ 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