Каналы Django - Невозможно отправить событие потребителю - PullRequest
0 голосов
/ 24 сентября 2018

Я использую 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,
    })
})
...