C# MQTT协议进行通讯

4 篇文章 0 订阅
2 篇文章 0 订阅

我们需要在Nuget中引用包MQTTNET

导入MQTTService通讯类,做了封装直接用就可以

using MQTTnet.Client;
using MQTTnet.Protocol;
using MQTTnet;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;

namespace Fatdick
{
    public class MqttClientService
    {
        public static IMqttClient _mqttClient;


     
        public void MqttClientStart()
        {
            var optionsBuilder = new MqttClientOptionsBuilder()
                .WithTcpServer("127.0.0.1", 8080) // 要访问的mqtt服务端的 ip 和 端口号
                .WithCredentials("dick", "dick") // 要访问的mqtt服务端的用户名和密码
                .WithClientId("dick1") // 设置客户端id
                .WithCleanSession()
                .WithTls(new MqttClientOptionsBuilderTlsParameters
                {
                    UseTls = false  // 是否使用 tls加密
                });

            var clientOptions = optionsBuilder.Build();
            _mqttClient = new MqttFactory().CreateMqttClient();

            _mqttClient.ConnectedAsync += _mqttClient_ConnectedAsync; // 客户端连接成功事件
            _mqttClient.DisconnectedAsync += _mqttClient_DisconnectedAsync; // 客户端连接关闭事件
            _mqttClient.ApplicationMessageReceivedAsync += _mqttClient_ApplicationMessageReceivedAsync; // 收到消息事件

            _mqttClient.ConnectAsync(clientOptions);
        }

        /// <summary>
        /// 客户端连接关闭事件
        /// </summary>
        /// <param name="arg"></param>
        /// <returns></returns>
        private Task _mqttClient_DisconnectedAsync(MqttClientDisconnectedEventArgs arg)
        {
            Trace.WriteLine($"客户端已断开与服务端的连接……");
           // MessageBox.Show("客户端已断开与服务端的连接……");
            return Task.CompletedTask;
        }

        /// <summary>
        /// 客户端连接成功事件
        /// </summary>
        /// <param name="arg"></param>
        /// <returns></returns>
        private Task _mqttClient_ConnectedAsync(MqttClientConnectedEventArgs arg)
        {
             Trace.WriteLine($"客户端已连接服务端……");
           // MessageBox.Show("客户端已连接服务端……");
            // 订阅消息主题
            // MqttQualityOfServiceLevel: (QoS):  0 最多一次,接收者不确认收到消息,并且消息不被发送者存储和重新发送提供与底层 TCP 协议相同的保证。
            // 1: 保证一条消息至少有一次会传递给接收方。发送方存储消息,直到它从接收方收到确认收到消息的数据包。一条消息可以多次发送或传递。
            // 2: 保证每条消息仅由预期的收件人接收一次。级别2是最安全和最慢的服务质量级别,保证由发送方和接收方之间的至少两个请求/响应(四次握手)。
            _mqttClient.SubscribeAsync("topic1", MqttQualityOfServiceLevel.AtLeastOnce); //topic_02

            return Task.CompletedTask;
        }

        /// <summary>
        /// 收到消息事件
        /// </summary>
        /// <param name="arg"></param>
        /// <returns></returns>
        private Task _mqttClient_ApplicationMessageReceivedAsync(MqttApplicationMessageReceivedEventArgs arg)
        {
            Trace.WriteLine($"ApplicationMessageReceivedAsync:客户端ID=【{arg.ClientId}】接收到消息。 Topic主题=【{arg.ApplicationMessage.Topic}】 消息=【{Encoding.UTF8.GetString(arg.ApplicationMessage.Payload)}】 qos等级=【{arg.ApplicationMessage.QualityOfServiceLevel}】");
            //   Console.WriteLine($"ApplicationMessageReceivedAsync:客户端ID=【{arg.ClientId}】接收到消息。 Topic主题=【{arg.ApplicationMessage.Topic}】 消息=【{Encoding.UTF8.GetString(arg.ApplicationMessage.Payload)}】 qos等级=【{arg.ApplicationMessage.QualityOfServiceLevel}】");
            return Task.CompletedTask;
        }

        public void Publish(string data)
        {
            var message = new MqttApplicationMessage
            {
                Topic = "topic2",
                Payload = Encoding.Default.GetBytes(data),
                QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce,
                Retain = true  // 服务端是否保留消息。true为保留,如果有新的订阅者连接,就会立马收到该消息。
            };
            _mqttClient.PublishAsync(message);
        }
    }

}

调用

 MqttClientService dick = new MqttClientService();
 dick.MqttClientStart();
 dick.publish("123456");

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,常用于物联网设备之间的通信。在C#中使用MQTT协议,可以通过引入第三方库来实现。 一个常用的MQTT库是M2Mqtt,下面是一个使用M2Mqtt库的C#代码示例: 首先,你需要在项目中引入M2Mqtt库。你可以通过NuGet包管理器来安装M2Mqtt库。 然后,你可以使用以下代码来连接到MQTT服务器、发布消息和订阅主题: ```csharp using System; using System.Text; using uPLibrary.Networking.M2Mqtt; using uPLibrary.Networking.M2Mqtt.Messages; class Program { static void Main(string[] args) { // 创建一个MQTT客户端实例 MqttClient client = new MqttClient("broker.mqtt-dashboard.com"); // 注册连接成功的回调函数 client.MqttMsgConnected += Client_MqttMsgConnected; // 注册接收消息的回调函数 client.MqttMsgPublishReceived += Client_MqttMsgPublishReceived; // 连接到MQTT服务器 client.Connect(Guid.NewGuid().ToString()); // 订阅主题 client.Subscribe(new string[] { "topic1" }, new byte[] { MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE }); // 发布消息 string message = "Hello, MQTT!"; client.Publish("topic1", Encoding.UTF8.GetBytes(message), MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, false); // 等待用户输入,保持程序运行 Console.ReadLine(); // 断开与MQTT服务器的连接 client.Disconnect(); } private static void Client_MqttMsgConnected(object sender, MqttMsgConnectEventArgs e) { Console.WriteLine("Connected to MQTT broker."); } private static void Client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e) { string message = Encoding.UTF8.GetString(e.Message); Console.WriteLine("Received message: " + message); } } ``` 上述代码中,我们首先创建了一个MqttClient实例,然后注册了连接成功和接收消息的回调函数。接着,我们使用client.Connect方法连接到MQTT服务器,并使用client.Subscribe方法订阅了一个主题。最后,我们使用client.Publish方法发布了一条消息,并通过Console.ReadLine方法等待用户输入,以保持程序运行。当接收到消息时,会触发Client_MqttMsgPublishReceived回调函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值