From 22e2adf4a94cff614a39d5d2ccbf1affed41ce1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=A5=E6=B1=9D=E6=A3=8B=E8=8C=97?= <505554090@qq.com> Date: Fri, 27 Jun 2025 22:37:14 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E6=A1=A3=EF=BC=9A=E6=9B=B4=E6=96=B0mq?= =?UTF-8?q?tt=E6=9C=8D=E5=8A=A1=E5=99=A8=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- handbook/docs/mqttservice.mdx | 101 ++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) diff --git a/handbook/docs/mqttservice.mdx b/handbook/docs/mqttservice.mdx index efa1bfcfc..7d0d94ab7 100644 --- a/handbook/docs/mqttservice.mdx +++ b/handbook/docs/mqttservice.mdx @@ -82,3 +82,104 @@ await service.SetupAsync(new TouchSocketConfig() await service.StartAsync(); ``` + +## 七、接收消息 + +在Mqtt服务端创建好之后,Mqtt组件的消息都是通过插件抛出的。你可以订阅`IMqttReceivingPlugin`插件和`IMqttReceivedPlugin`插件来接收消息。 + +正如插件说明所示,`IMqttReceivingPlugin`插件可以在收到所有消息时触发,`IMqttReceivedPlugin`插件可以在收到发布消息时触发。 + +所以如果你只关心发布成功的消息,那么可以只订阅`IMqttReceivedPlugin`插件即可。 + +但是对于服务器来说,也可能需要获取到的消息可能是订阅、发布、取消订阅等。所以你可以通过`IMqttReceivingPlugin`的`e.MqttMessage`来获取到具体的消息类型。 + +下列将简单演示。 + +### 7.1 订阅消息 + +```csharp showLineNumbers +.ConfigurePlugins(a => +{ + a.AddMqttReceivingPlugin(async (client, e) => + { + switch (e.MqttMessage) + { + case MqttSubscribeMessage message: + { + //订阅消息 + Console.WriteLine("Reving:" + e.MqttMessage.MessageType); + foreach (var subscribeRequest in message.SubscribeRequests) + { + var topic = subscribeRequest.Topic; + var qosLevel = subscribeRequest.QosLevel; + //或者其他属性 + Console.WriteLine($"Subscribe Topic:{topic},QosLevel:{qosLevel}"); + } + break; + } + default: + break; + } + Console.WriteLine("Reving:" + e.MqttMessage.MessageType); + await e.InvokeNext(); + }); +}) +``` + +### 7.2 取消订阅消息 + +```csharp showLineNumbers +.ConfigurePlugins(a => +{ + a.AddMqttReceivingPlugin(async (client, e) => + { + switch (e.MqttMessage) + { + case MqttUnsubscribeMessage message: + { + + //取消订阅消息 + Console.WriteLine("Reving:" + e.MqttMessage.MessageType); + foreach (var topic in message.TopicFilters) + { + //取消订阅的主题 + Console.WriteLine($"Unsubscribe Topic:{topic}"); + } + break; + } + default: + break; + } + Console.WriteLine("Reving:" + e.MqttMessage.MessageType); + await e.InvokeNext(); + }); +}) +``` + +### 7.3 发布消息 + +所以如果你只关心发布成功的消息,那么可以只订阅`IMqttReceivedPlugin`插件即可。 + +你可以直接使用委托实现订阅: + +```csharp {3-17} showLineNumbers +.ConfigurePlugins(a => +{ + a.AddMqttReceivedPlugin(async (client, e) => + { + var mqttMessage = e.MqttMessage; + Console.WriteLine("Reved:" + mqttMessage); + + //订阅消息的主题 + var topicName = mqttMessage.TopicName; + + //订阅消息的Qos级别 + var qosLevel = mqttMessage.QosLevel; + + //订阅消息的Payload + var payload = mqttMessage.Payload; + await e.InvokeNext(); + }); +}) +``` +