[英]chat socket (web socket)is closing unexpectedly (django-channels)?
[英]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.