Я использую Django Channels для запуска прослушивателя MQTT в фоновом режиме и отправки событий MQTT в браузер с помощью веб-сокетов.
Для этого я написал SyncConsumer
, который я запускаю при запуске веб-приложения и внутри него.потребитель, я устанавливаю MQTT Client и регистрирую обработчик on_message
.
Проблема заключается в том, что когда я получаю событие MQTT в обработчике on_message
, я не могу отправить событие в именованный канал или Group
.
Пожалуйста, помогите.Спасибо
Код:
class MQTTSubscriber(SyncConsumer):
def subscribe_mqtt(self, message):
print('starting MQTT listener worker...')
import paho.mqtt.client as mqtt
client = mqtt.Client()
self.client = client
client.connect(settings.MQTT_HOST)
def on_connect(client, userdata, flags, rc):
print('Connected to mqtt broker!')
client.subscribe('vf/reported/#')
def on_disconnect(client, userdata, flags, rc):
print('Disconnected from MQTT broker, reconnecting...')
client.connect(settings.MQTT_HOST)
def on_message(client, userdata, msg):
print('MQTT event received!')
async_to_sync(get_channel_layer().send)(
'notify-browser',
{
'type': 'notify.observers',
}
)
client.on_connect = on_connect
client.on_message = on_message
client.on_disconnect = on_disconnect
client.loop_forever()
class NotificationsConsumer(SyncConsumer):
def notify_observers(self, message):
print(message)
### never called
routing.py
application = ProtocolTypeRouter({
'websocket': AuthMiddlewareStack(
URLRouter([
url(r'^events/', WebsocketConsumer),
])
),
'channel': ChannelNameRouter({
'subscribe-mqtt': MQTTSubscriber,
'publish-mqtt': MQTTPublisher,
'notify-browser': NotificationsConsumer,
})
})