Proyecto aTIC (IV) - Bridge MQTT/InfluxDB

 Bridge MQTT/InfluxDB. 

En el post anterior (Proyecto aTIC (III) - Broker MQTT) ya se ha comentado que la RPI2 funciona como bridge entre los datos publicados en el topic MQTT y la base de datos de InfluxDB. Esta función de brigde la realiza ejecutando un script en python que se define a continuación.

 1
 2
 3
 4
 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
from influxdb import InfluxDBClient
from typing import NamedTuple
import random
import time
import paho.mqtt.client as mqtt
import json
from ast import literal_eval

MQTT_CLIENT = 'RPI2'
MQTT_ADDRESS = 'aticrpi2.duckdns.org'
MQTT_TOPIC = 'Datos OBD'


def on_connect(client, userdata, flags, rc):    # Conexión y suscripción al topic
    print('Connected with result code ' + str(rc))
    client.subscribe(MQTT_TOPIC)


def on_message(client, userdata, msg):      #Callback cuando se recibe mensaje en topic
    json_message = [json.loads(msg.payload)]
    print (str(json_message))
    _send_sensor_data_to_influxdb(json_message)

INFLUXDB_ADDRESS = 'aticrpi1.duckdns.org'
INFLUXDB_USER = 'root'
INFLUXDB_PASSWORD = 'root'
INFLUXDB_DATABASE = 'OBD_DB'

influxdb_client = InfluxDBClient(INFLUXDB_ADDRESS, 8086, INFLUXDB_USER, INFLUXDB_PASSWORD, None)


def _send_sensor_data_to_influxdb(sensor_data):

    return influxdb_client.write_points(sensor_data)


def _init_influxdb_database():
    databases = influxdb_client.get_list_database()
    if len(list(filter(lambda x: x['name'] == INFLUXDB_DATABASE, databases))) == 0:
        influxdb_client.create_database(INFLUXDB_DATABASE)
    influxdb_client.switch_database(INFLUXDB_DATABASE)

def main():
    _init_influxdb_database()

    mqtt_client = mqtt.Client(MQTT_CLIENT)
    mqtt_client.on_connect = on_connect
    mqtt_client.on_message = on_message

    mqtt_client.connect(MQTT_ADDRESS)
    mqtt_client.loop_forever()


if __name__ == "__main__":
    print('Bridge running...')
    main()

Los pasos principales que ha de realizar la aplicación para funcionar como bridge correctamente se pueden resumir en los siguientes:

1.- Inicializar una tabla en InfluxDB para escribir los datos. Se realiza mediante la función _init_influxdb_database() definida también en este script con los datos de la base de datos de la RPI1.

2.- Acceder al broker de MQTT de la RPI2 y suscribirse al topic "Datos OBD". En el script se comienza definiendo los datos necesarios para establecer la conexión MQTT con el broker de la RPI2. Se define el cliente y con la función on_connect se suscribe al topic "Datos OBD".

3.- Mandar los datos recogidos del topic "Datos OBD" y enviarlos por HTTP a InfluxDB. Una vez suscrito al topic "Datos OBD", mediante la función on_message, la aplicación queda a la espera de que se publiquen datos en el topic, y cuando se recibe un dato, se guarda con formato json y se envía a la base de datos mediante HTTP con la función wite_points.


Para continuar al siguiente post del proyecto, accede a Proyecto aTIC (V) - Grafana.

Comentarios

Entradas populares de este blog

Proyecto aTIC (I) - Introducción

Proyecto aTIC (V) - Grafana