Encapsulate Mqtt client in a class
parent
41394f2c2d
commit
4dbba2b44c
|
@ -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)
|
||||||
|
|
|
@ -4,74 +4,78 @@ 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 handle_connect(client, userdata, flags, rc):
|
||||||
|
print('MQTT client connected')
|
||||||
|
self.mqtt.subscribe('device/+')
|
||||||
|
|
||||||
|
@self.mqtt.on_disconnect()
|
||||||
|
def handle_disconnect():
|
||||||
|
print('MQTT client disconnected')
|
||||||
|
|
||||||
|
print('MQTT client initialized')
|
||||||
|
|
||||||
|
|
||||||
def tear_down_mqtt():
|
def tear_down(self):
|
||||||
mqtt.unsubscribe_all()
|
self.mqtt.unsubscribe_all()
|
||||||
if hasattr(mqtt, 'client') and mqtt.client is not None:
|
if hasattr(self.mqtt, 'client') and self.mqtt.client is not None:
|
||||||
mqtt.client.disconnect()
|
self.mqtt.client.disconnect()
|
||||||
print('MQTT client destroyed')
|
print('MQTT client destroyed')
|
||||||
|
|
||||||
|
|
||||||
@mqtt.on_connect()
|
def handle_subscribe(self, client, userdata, mid, granted_qos):
|
||||||
def handle_connect(client, userdata, flags, rc):
|
print('MQTT client subscribed')
|
||||||
print('MQTT client connected')
|
|
||||||
mqtt.subscribe('device/+')
|
|
||||||
|
|
||||||
|
|
||||||
@mqtt.on_disconnect()
|
def handle_mqtt_message(self, client, userdata, message):
|
||||||
def handle_disconnect():
|
print("Received message!")
|
||||||
print('MQTT client disconnected')
|
print("Topic: " + message.topic)
|
||||||
|
print("Payload: " + message.payload.decode())
|
||||||
|
try:
|
||||||
|
# If type is JSON
|
||||||
|
recording = self.parse_json_message(message.topic, message.payload.decode())
|
||||||
|
with app.app_context():
|
||||||
|
recording.save()
|
||||||
|
except ValueError:
|
||||||
|
print("ERROR!")
|
||||||
|
error_type, error_instance, traceback = sys.exc_info()
|
||||||
|
print("Type: " + str(error_type))
|
||||||
|
print("Instance: " + str(error_instance))
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
def handle_subscribe(client, userdata, mid, granted_qos):
|
def parse_json_message(self, topic, payload) -> Recording:
|
||||||
print('MQTT client subscribed')
|
try:
|
||||||
|
json_msg = json.loads(payload)
|
||||||
|
device_id = self.get_device_id(topic)
|
||||||
|
return Recording(device_id=device_id,
|
||||||
|
record_type=json_msg["record_type"],
|
||||||
|
record_value=json_msg["record_value"],
|
||||||
|
recorded_at=json_msg["recorded_at"],
|
||||||
|
raw_json=json_msg)
|
||||||
|
except KeyError:
|
||||||
|
error_type, error_instance, traceback = sys.exc_info()
|
||||||
|
raise ValueError("JSON parsing failed! Key error: "
|
||||||
|
+ str(error_instance))
|
||||||
|
|
||||||
|
|
||||||
def handle_mqtt_message(client, userdata, message):
|
def get_device_id(self, topic) -> int:
|
||||||
print("Received message!")
|
device_token, device_id = topic.split("/")
|
||||||
print("Topic: " + message.topic)
|
if device_token == "device":
|
||||||
print("Payload: " + message.payload.decode())
|
return int(device_id)
|
||||||
try:
|
else:
|
||||||
# If type is JSON
|
raise ValueError("Topic is in invalid format")
|
||||||
recording = parse_json_message(message.topic, message.payload.decode())
|
|
||||||
with app.app_context():
|
|
||||||
recording.save()
|
|
||||||
except ValueError:
|
|
||||||
print("ERROR!")
|
|
||||||
error_type, error_instance, traceback = sys.exc_info()
|
|
||||||
print("Type: " + str(error_type))
|
|
||||||
print("Instance: " + str(error_instance))
|
|
||||||
return
|
|
||||||
|
|
||||||
|
|
||||||
def parse_json_message(topic, payload) -> Recording:
|
|
||||||
try:
|
|
||||||
json_msg = json.loads(payload)
|
|
||||||
device_id = get_device_id(topic)
|
|
||||||
return Recording(device_id=device_id,
|
|
||||||
record_type=json_msg["record_type"],
|
|
||||||
record_value=json_msg["record_value"],
|
|
||||||
recorded_at=json_msg["recorded_at"],
|
|
||||||
raw_json=json_msg)
|
|
||||||
except KeyError:
|
|
||||||
error_type, error_instance, traceback = sys.exc_info()
|
|
||||||
raise ValueError("JSON parsing failed! Key error: "
|
|
||||||
+ str(error_instance))
|
|
||||||
|
|
||||||
|
|
||||||
def get_device_id(topic) -> int:
|
|
||||||
device_token, device_id = topic.split("/")
|
|
||||||
if device_token == "device":
|
|
||||||
return int(device_id)
|
|
||||||
else:
|
|
||||||
raise ValueError("Topic is in invalid format")
|
|
||||||
|
|
Loading…
Reference in New Issue