簡體   English   中英

django-channels 中的套接字上的 mqtt

[英]mqtt over socket in django-channels

我正在嘗試在 django-channels 中通過 websocket 啟動一個 mqtt 代理,以將特定主題的數據發布給授權用戶。 我已經定義了一個 url 來過濾我接受套接字請求的特定使用者中的 mqtt 請求。 這一切工作正常,但是當我建立一個 mqtt 連接時,套接字會一次又一次地重新啟動,我不知道為什么會這樣? 而且我將如何從我的觀點中發送信息也有點令人困惑。

代碼片段:

路由.py

from django.urls import re_path

from . import consumer

websocket_urlpatterns = [
     re_path(r'ws/data/(?P<room_name>\w+)/(?P<auth_data>\S+)/$',consumer.ChatConsumer.as_asgi()),
     re_path(r'mqtt', consumer.ChatTwoConsumer.as_asgi())
]

消費者.py

class ChatTwoConsumer(WebsocketConsumer):
def connect(self):
    print('here')
    self.accept()
    

如果您在 Django 應用程序中使用 ASGI,則可以使用MQTTAsgi

完全披露我是 MQTTAsgi 的作者。

它是 Django 和 MQTT 的完整協議服務器。

要使用 mqtt 協議服務器,您可以運行您的應用程序,首先您需要創建一個 MQTT 消費者:

from mqttasgi.consumers import MqttConsumer
class MyMqttConsumer(MqttConsumer):

    async def connect(self):
        await self.subscribe('Testing', 1)

    async def receive(self, mqtt_message):
        print('Received a message at topic:', mqtt_mesage['topic'])
        print('With payload', mqtt_message['payload'])
        print('And QOS:', mqtt_message['qos'])
        pass

    async def disconnect(self):
        await self.unsubscribe('my/testing/topic')

然后你應該將此協議添加到協議路由器:

application = ProtocolTypeRouter({
      'websocket': AllowedHostsOriginValidator(URLRouter([
          url('.*', WebsocketConsumer)
      ])),
      'mqtt': MyMqttConsumer,
      ....
    })

然后你可以使用 * 運行 mqtt 協議服務器:

mqttasgi -H localhost -p 1883 my_application.asgi:application

*假設代理位於本地主機和端口 1883。

問題是,如果您嘗試連接 Websocket 消費者 tp MQTT 協議。 這是兩種不同的協議,因此 Websocket 消費者無法工作。 要連接到 mqtt 代理,您需要特定的協議服務器。 我已經開發了一個可以使用的協議服務器MQTTAsgi的完整實現。

要使用 mqtt 協議服務器,您可以運行您的應用程序,首先您需要創建一個 MQTT 消費者:

from mqttasgi.consumers import MqttConsumer
class MyMqttConsumer(MqttConsumer):

    async def connect(self):
        await self.subscribe('Testing', 1)

    async def receive(self, mqtt_message):
        print('Received a message at topic:', mqtt_mesage['topic'])
        print('With payload', mqtt_message['payload'])
        print('And QOS:', mqtt_message['qos'])
        pass

    async def disconnect(self):
        await self.unsubscribe('my/testing/topic')

然后你應該將此協議添加到協議路由器:

application = ProtocolTypeRouter({
      'websocket': AllowedHostsOriginValidator(URLRouter([
          url('.*', WebsocketConsumer)
      ])),
      'mqtt': MyMqttConsumer,
      ....
    })

然后你可以使用 * 運行 mqtt 協議服務器:

mqttasgi -H localhost -p 1883 my_application.asgi:application

*假設代理位於本地主機和端口 1883。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM