Encapsulate Mqtt client in a class

master
esensar 2018-05-03 22:30:34 +02:00
parent 41394f2c2d
commit 4dbba2b44c
2 changed files with 67 additions and 62 deletions

View File

@ -1,13 +1,14 @@
import atexit import atexit
from flask import Blueprint from flask import Blueprint
from .mqtt_client import tear_down_mqtt, setup_mqtt from .mqtt_client import MqttClient
devices = Blueprint('devices', __name__) devices = Blueprint('devices', __name__)
mqtt_client = MqttClient()
# When app dies, stop mqtt connection # When app dies, stop mqtt connection
def on_stop(): def on_stop():
tear_down_mqtt() mqtt_client.tear_down()
atexit.register(on_stop) atexit.register(on_stop)
@ -21,4 +22,4 @@ def hello():
@devices.record @devices.record
def on_blueprint_setup(setup_state): def on_blueprint_setup(setup_state):
setup_mqtt(setup_state.app) mqtt_client.setup(setup_state.app)

View File

@ -4,46 +4,50 @@ from flask_mqtt import Mqtt
from .models import Recording from .models import Recording
from app import db, app from app import db, app
mqtt = Mqtt() class MqttClient:
def __init__(self):
self.mqtt = Mqtt()
self.initialized = False
# Mqtt setup # Mqtt setup
def setup_mqtt(app): def setup(self, app):
mqtt.init_app(app) if not self.initialized:
mqtt.client.on_message = handle_mqtt_message self.mqtt.init_app(app)
mqtt.client.on_subscribe = handle_subscribe self.mqtt.client.on_message = self.handle_mqtt_message
print('MQTT client initialized') self.mqtt.client.on_subscribe = self.handle_subscribe
initialized = True
@self.mqtt.on_connect()
def tear_down_mqtt():
mqtt.unsubscribe_all()
if hasattr(mqtt, 'client') and mqtt.client is not None:
mqtt.client.disconnect()
print('MQTT client destroyed')
@mqtt.on_connect()
def handle_connect(client, userdata, flags, rc): def handle_connect(client, userdata, flags, rc):
print('MQTT client connected') print('MQTT client connected')
mqtt.subscribe('device/+') self.mqtt.subscribe('device/+')
@self.mqtt.on_disconnect()
@mqtt.on_disconnect()
def handle_disconnect(): def handle_disconnect():
print('MQTT client disconnected') print('MQTT client disconnected')
print('MQTT client initialized')
def handle_subscribe(client, userdata, mid, granted_qos):
def tear_down(self):
self.mqtt.unsubscribe_all()
if hasattr(self.mqtt, 'client') and self.mqtt.client is not None:
self.mqtt.client.disconnect()
print('MQTT client destroyed')
def handle_subscribe(self, client, userdata, mid, granted_qos):
print('MQTT client subscribed') print('MQTT client subscribed')
def handle_mqtt_message(client, userdata, message): def handle_mqtt_message(self, client, userdata, message):
print("Received message!") print("Received message!")
print("Topic: " + message.topic) print("Topic: " + message.topic)
print("Payload: " + message.payload.decode()) print("Payload: " + message.payload.decode())
try: try:
# If type is JSON # If type is JSON
recording = parse_json_message(message.topic, message.payload.decode()) recording = self.parse_json_message(message.topic, message.payload.decode())
with app.app_context(): with app.app_context():
recording.save() recording.save()
except ValueError: except ValueError:
@ -54,10 +58,10 @@ def handle_mqtt_message(client, userdata, message):
return return
def parse_json_message(topic, payload) -> Recording: def parse_json_message(self, topic, payload) -> Recording:
try: try:
json_msg = json.loads(payload) json_msg = json.loads(payload)
device_id = get_device_id(topic) device_id = self.get_device_id(topic)
return Recording(device_id=device_id, return Recording(device_id=device_id,
record_type=json_msg["record_type"], record_type=json_msg["record_type"],
record_value=json_msg["record_value"], record_value=json_msg["record_value"],
@ -69,7 +73,7 @@ def parse_json_message(topic, payload) -> Recording:
+ str(error_instance)) + str(error_instance))
def get_device_id(topic) -> int: def get_device_id(self, topic) -> int:
device_token, device_id = topic.split("/") device_token, device_id = topic.split("/")
if device_token == "device": if device_token == "device":
return int(device_id) return int(device_id)