Есть ли способ отправки сообщений брокеру комаров MQTT при изменении базы данных? - PullRequest
0 голосов
/ 19 февраля 2019

Я работаю над проектом, который в конечном итоге станет веб-сайтом, отображающим данные устройства с возможностью управления этими устройствами.В настоящее время я работаю над кодом на Python, используя библиотеку Paho MQTT Python.Мне удалось отправить и получить зашифрованные сообщения через брокера Mosquitto.Я создал клиента, который является своего рода клиентом для мониторинга, который подписывается на тему с подстановочными знаками, чтобы получать все сообщения, проходящие через посредника, и в конечном итоге собирается сохранять их в базе данных.Я использую django 2.1.5, Mosquitto Broker 1.5, работающий в Python.

Проблема, с которой я сталкиваюсь сейчас, заключается в том, что я не могу найти способ отправки сообщений брокеру Mosquitto, как толькоизменение базы данных происходит.Допустим, у меня есть веб-сайт, который показывает все подключенные устройства, и я хочу выключить одно, я бы нажал кнопку, которая изменила бы таблицу базы данных, затем необходимо отправить сообщение брокеру, чтобы уведомить устройство о том, что оно должновыключить.Я знаю, что могу сделать веб-сайт клиентом, который затем будет использовать MQTT поверх веб-сокетов, но это нежелательный вариант.

Я пробовал сигналы django, которые, кажется, работают нормально.Проблема в том, что функция, которую запускает сигнал django, создает новый экземпляр нового клиента mqtt.Я бы хотел, чтобы уже запущенный клиент мониторинга отправил сообщение, то есть активировал одну из своих определенных функций, которая отправляла бы сообщение при отправке сигнала.

class Post(models.Model):
    title = models.CharField(max_length=50)
    def __str__(self):
        return self.title

def save_post(sender, instance, **kwargs):
    message = {
        "client_id": "abc",
        "message": "Created new model: " + str(instance),
    }
     publish.single("house/StateServer/receive", 
         payload=json.dumps(message), 
         port=8081, hostname="localhost", retain=False, 
         auth = {'username':"abc", 'password':"abc"}, 
         client_id="abc",tls = {"ca_certs":"","certfile":"","keyfile":"",})


post_save.connect(save_post, sender=Post)

Я бы хотел, чтобы функция "save_post"вызвать функцию клиента мониторинга, который работает 24/7 и хранится в другом файле, скажем, «monitor.py».Эта функция клиента мониторинга будет получать желаемые данные: полезную нагрузку сообщения и тему конечного устройства и отправлять их брокеру Mosquitto.

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Да, вы можете сделать это с помощью сигнала post_save. См. ответ .Но я бы порекомендовал сделать это в потоке, и вы можете оставить qos=2 для доставки, но это не будет гарантией, если вы захотите опубликовать подтверждение от получателя

0 голосов
/ 19 февраля 2019

Мне недавно пришлось сделать что-то похожее из django post_save.В моем случае эквивалентный «другой файл monitor.py», запущенный как другой процесс, запускает поток, выполняющий простой SimpleHTTPServer, который выполняет всю работу по публикации.Это также позволяет вам делать вещи асинхронно, поскольку ваш SimpleHTTPServer может добавить полученные данные для публикации в очередь и позволить другому потоку обрабатывать публикуемую часть, в то время как ваш обработчик POST сразу же возвращается.

Для справки, здесь есть SO о json и simplehttpserver: Чтение JSON из SimpleHTTPServer Post data

...