.NET使用MQTT通信实例

2023-11-15

最近项目里面需要用到MQTT,刚开始听到这个词一脸茫然,不知道是什么,最后通过自己百度整理一点资料,希望最大家有帮助。
在这里需要引用MQTTnet,可在解决方案在右键单击-选择“管理解决方案的 NuGet 程序包”-在“浏览”选项卡下面搜索 MQTTnet,为服务端项目和客户端项目都安装上 MQTTnet 库。示例中使用的是2.4版本,不同版本最低要求的.net版本或其它支持,在NuGet选中MQTTNet,右侧可以看到具体描述
相关MQTTnet dll文件下载
1.首先创建一个winform项目作为服务端,MqttService
下面是代码的实例

    private MqttServer mqttServer=null;
    public Server_Form()
    {
    InitializeComponent();
    MqttNetTrace.TraceMessagePublished += MqttNetTrace_TraceMessagePublished;
    this.button2.Enabled = false;
    }
    /// <summary>
    /// 开启连接
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            this.button1.Enabled = false;
            this.button2.Enabled = true;
            StartMqttServer();
        }
        catch (Exception ex)
        {
            this.textBox1.AppendText("" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "" + ex.Message + "" + " \r\n\r\n");
        }
    }

    /// <summary>
    /// 断开连接
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void button2_Click(object sender, EventArgs e)
    {
        this.button1.Enabled = true;
        this.button2.Enabled = false;
        mqttServer.StopAsync();
        this.textBox1.AppendText("" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "MQTT服务停止成功!" + " \r\n\r\n");
    }
    /// <summary>
    /// 清除日志
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void button3_Click(object sender, EventArgs e)
    {
        this.textBox1.Text = "";
    }
    #region 自定义方法
    /// <summary>
    /// MQTT服务开启
    /// </summary>
    private void StartMqttServer()
    {
        if (mqttServer == null)
        {
            try
            {
                var options = new MqttServerOptions
                {
                    ConnectionValidator = p =>
                    {
                        if (p.ClientId == "c001")
                        {
                            if (p.Username != "u001" || p.Password != "p001")
                            {
                                return MqttConnectReturnCode.ConnectionRefusedBadUsernameOrPassword;
                            }
                        }
                        return MqttConnectReturnCode.ConnectionAccepted;
                    }
                };

                mqttServer = new MqttServerFactory().CreateMqttServer(options) as MqttServer;
                mqttServer.ApplicationMessageReceived += MqttServer_ApplicationMessageReceived;
                mqttServer.ClientConnected += MqttServer_ClientConnected;
                mqttServer.ClientDisconnected += MqttServer_ClientDisconnected;
            }
            catch (Exception ex)
            {
                this.textBox1.AppendText("" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "" + ex.Message + "" + " \r\n\r\n");
                return;
            }
        }

        mqttServer.StartAsync();
        this.textBox1.AppendText("" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "MQTT服务启动成功!" + " \r\n\r\n");
    }

    /// <summary>
    /// 客户端连接触发的事件
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void MqttServer_ClientConnected(object sender, MqttClientConnectedEventArgs e)
    {
        try
        {
            this.textBox1.AppendText("" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "客户端[{" + e.Client.ClientId + "}]已连接,协议版本:{" + e.Client.ProtocolVersion + "}" + " \r\n\r\n");
        }
        catch (Exception ex)
        {
            this.textBox1.AppendText("" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "" + ex.Message + "" + " \r\n\r\n");
        }
    }

    /// <summary>
    /// 客户端断开触发的事件
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void MqttServer_ClientDisconnected(object sender, MqttClientDisconnectedEventArgs e)
    {
        try
        {
            this.textBox1.AppendText("" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "客户端[{" + e.Client.ClientId + "}]已断开连接!" + "" + " \r\n\r\n");
        }
        catch (Exception ex)
        {
            this.textBox1.AppendText("" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "" + ex.Message + "" + " \r\n\r\n");
        }
    }

    /// <summary>
    /// 消息事件
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void MqttServer_ApplicationMessageReceived(object sender, MqttApplicationMessageReceivedEventArgs e)
    {
        try
        {
            this.textBox1.AppendText("" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "客户端[{" + e.ClientId + "}]>> 主题:{" + e.ApplicationMessage.Topic + "} 负荷:{" + Encoding.UTF8.GetString(e.ApplicationMessage.Payload) + "} Qos:{" + e.ApplicationMessage.QualityOfServiceLevel + "} 保留:{" + e.ApplicationMessage.Retain + "}" + " \r\n\r\n");
        }
        catch (Exception ex)
        {
            this.textBox1.AppendText("" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "" + ex.Message + "" + " \r\n\r\n");
        }
    }

    private void MqttNetTrace_TraceMessagePublished(object sender, MqttNetTraceMessagePublishedEventArgs e)
    {
        //Console.WriteLine($">> 线程ID:{e.ThreadId} 来源:{e.Source} 跟踪级别:{e.Level} 消息: {e.Message}");
        //if (e.Exception != null)
        //{
        //    Console.WriteLine(e.Exception);
        //}
    }
    界面就是以下
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181213110213768.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0NjA5MjY4,size_16,color_FFFFFF,t_70)
   2.创建一个winform项目作为服务端,MqttClient
    
    private MqttClient mqttClient = null;

    public Client_Form1()
    {
       
        InitializeComponent();
        Task.Run(async () => { await ConnectMqttServerAsync(); });
    }

    /// <summary>
    /// 发布
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void button1_Click(object sender, EventArgs e)
    {
        string topic = txtPubTopic.Text.Trim();

        if (string.IsNullOrEmpty(topic))
        {
            MessageBox.Show("发布主题不能为空!");
            return;
        }

        string inputString = txtSendMessage.Text.Trim();
        var appMsg = new MqttApplicationMessage(topic, Encoding.UTF8.GetBytes(inputString), MqttQualityOfServiceLevel.AtMostOnce, false);
        mqttClient.PublishAsync(appMsg);
    }

    /// <summary>
    /// 订阅
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void button2_Click(object sender, EventArgs e)
    {
        string topic = txtSubTopic.Text.Trim();

        if (string.IsNullOrEmpty(topic))
        {
            MessageBox.Show("订阅主题不能为空!");
            return;
        }

        if (!mqttClient.IsConnected)
        {
            MessageBox.Show("MQTT客户端尚未连接!");
            return;
        }

        mqttClient.SubscribeAsync(new List<TopicFilter> {
            new TopicFilter(topic, MqttQualityOfServiceLevel.AtMostOnce)
        });

        txtReceiveMessage.AppendText($"已订阅[{topic}]主题" + Environment.NewLine);
        txtSubTopic.Enabled = false;
        button2.Enabled = false;

    }

    #region 自定义方法
    private async Task ConnectMqttServerAsync()
    {
        if (mqttClient == null)
        {
            mqttClient = new MqttClientFactory().CreateMqttClient() as MqttClient;
            mqttClient.ApplicationMessageReceived += MqttClient_ApplicationMessageReceived;
            mqttClient.Connected += MqttClient_Connected;
            mqttClient.Disconnected += MqttClient_Disconnected;
        }
        try
        {
            var options = new MqttClientTcpOptions
            {
                //Server = "127.0.0.1",
                Server = "192.168.16.207",
                ClientId = Guid.NewGuid().ToString().Substring(0, 5),
                UserName = "u0011123",
                Password = "p00112134",
                CleanSession = false,
            };

            await mqttClient.ConnectAsync(options);
        }
        catch (Exception ex)
        {
            Invoke((new Action(() =>
            {
                txtReceiveMessage.AppendText($"连接到MQTT服务器失败!" + Environment.NewLine + ex.Message + Environment.NewLine);
            })));
        }
    }

    /// <summary>
    /// 连接触发事件
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void MqttClient_Connected(object sender, EventArgs e)
    {
        Invoke((new Action(() =>
        {
            txtReceiveMessage.AppendText("已连接到MQTT服务器!" + Environment.NewLine);
        })));
    }

    /// <summary>
    /// 断开连接触发事件
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void MqttClient_Disconnected(object sender, EventArgs e)
    {
        Invoke((new Action(() =>
        {
            txtReceiveMessage.AppendText("已断开MQTT连接!" + Environment.NewLine);
        })));
    }

    /// <summary>
    /// 消息事件
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void MqttClient_ApplicationMessageReceived(object sender,MqttApplicationMessageReceivedEventArgs e)
    {
        Invoke((new Action(() =>
        {
            txtReceiveMessage.AppendText($">> {Encoding.UTF8.GetString(e.ApplicationMessage.Payload)}{Environment.NewLine}");
        })));
    }
    界面
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181213111000377.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0NjA5MjY4,size_16,color_FFFFFF,t_70)
    本人第一次写,有什么问题大家可以指出来,谢谢~~~~
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.NET使用MQTT通信实例 的相关文章

  • -std=c99带来问题

    今天用 std c99编译c文件 内容是信号这一块的 包含了sigprocmask 编译时发现总是显示sigset t类型没有声明 函数中的3个状态的无法找到 后来发现把 std c99去掉就行了 不知道有什么区别

随机推荐

  • 15 玩转STM32之IIC通信(芯片硬件篇)

    15 1 IIC控制器说明 硬件部分 在14 玩转STM32之IIC通信 软件模拟篇 我们讲了软件模拟的方式 本章讲解芯片自带的硬件部分 并非所有的芯片都含有IIC 像51系列的是没有的 但是绝大多数是有的 根据我用过的S32 STM32
  • 高通 ADSP sensor SSC

    1 添加入口函数 adsp sensors dd qcom inc sns dd h extern sns ddf driver if s sns dd
  • 实战:单点登录的两种实现方式,附源码

    最近工作有点忙 好久没更新文章了 正好这两天在整理单点登陆相关的文档 今天趁着小孩睡着了 赶紧码一篇实战文交差 概念 单点登录 Single Sign On SSO 是一种身份验证服务 允许用户使用单个标识来登录多个应用程序或系统 如下图所
  • 关于vue-cli2.9.6 使用vue-video-player,视频播放rtmp视频流error:in ./node_modules/videojs-swf/dist/video-js.swf

    我在做vue前端开发项目的时候 领导让我在别人项目的基础上进行二次开发 我将自己的页面合并至平台 我用的vue cli版本是2 6 9 然后我按照正常流程 引入vue video player video js等 然后配置playerOpt
  • 【算法/剑指Offer】请实现一个函数,用来判断一颗二叉树是不是对称的。

    题目描述 请实现一个函数 用来判断一颗二叉树是不是对称的 注意 如果一个二叉树同此二叉树的镜像是同样的 定义其为对称的 代码很简单 关键还是知道怎么样才能判断一个 二叉树是否对称 只要采用前序 中序 后序 层次遍历等任何一种遍历方法 分为先
  • 复习笔记——计算机组成原理

    2014年12月考研前一周写的笔记 放在这里 希望对其他人有帮助 写到一半时 发现这个公开课的资料挺全的 http share onlinesjtu com course view php id 3 教材 视频 ppt 还有swf
  • 简单使用Linux

    1 创建虚拟机及安装操作系统 一 打开下载好的VMware Workstation软件 二 点击 创建新的虚拟机 三 选择需要创建的虚拟机 建议选自定义 再点击下一步 四 选择系统默认兼容性并选择稍后安装 再点击下一步 五 选择Linux系
  • 互联网晚报

    腾讯回应高考生喊话马化腾 2023高考首日 在杭州十四中考点 第一科语文科目考试还没有结束 一名男生就走出了考场 面对记者采访 男生喊话马化腾 腾讯能不能把QQ空间改回老版 新版太难用了 对此 腾讯QQ在其官方微博回应称 腾讯非常重视其建议
  • golang GET http、https、代理方式

    package utils import crypto tls encoding json io ioutil log net http net url time func GET url string reply interface er
  • CentOS 构建yum本地源

    不管是为了安全起见 还是为了方便 构建本地源对于维护工作肯定会提供一些便利 1 将事先准备好的镜像文件 如 CentOS 7 x86 64 DVD 1908 iso 加载至服务器CD DVD 或虚拟机CD DVD 并将镜像文件挂载至指定的目
  • java &= ~_Java基础一

    一 1 对象 其实对象就是类的实例化 如创建一个类 车 创建一个类的对象 小汽车 而且有颜色 大小 车速等等 2 类 例如车有 小汽车 大卡车 三轮车 四驱车等等 但要用一个词概括它们 则可以统称为车 现在这个 车 就相当于 类 3 方法
  • 1489. 田忌赛马 (贪心,区间dp)

    题目 田忌赛马的故事 田忌每次输一局要付200元 赢一局获得200元 平局获得0元 问 田忌和齐王都有n匹马的情况下 最多可以获得多少元 1489 田忌赛马 AcWing题库 由于田忌赛马的故事背景 我们很快就能够想到合理的贪心策略 上等马
  • mimikatz的使用

    目录 1 远程连接使用 2 本地使用 注意 1 版本问题 2 运行权限 3 抓取范围 4 抓不到密码的解决方法 mimikatz下载链接 mimikatz是个好东西 它的功能很多 最重要的是能从 lsass exe进程中获取windows的
  • 第几个幸运数

    暴力 include
  • Vue中的验证登录状态

    Vue项目中实现用户登录及token验证 先说一下我的实现步骤 使用easy mock新建登录接口 模拟用户数据 使用axios请求登录接口 匹配账号和密码 账号密码验证后 拿到token 将token存储到sessionStorage中
  • git撤回某次commit

    假设我们已经将本地代码提交到远程分分支上 但是我们想撤回某一个commit或者是对某一个文件的修改进行撤回等操作 我们可以使用以下这几种方式 一 git reset git reset 回滚到某次提交 git reset mixed 此次提
  • 数据库系统原理------ER图转化成关系模式

    E R图转换 E R图是由实体 实体的属性和实体之间的联系三个要素组成的 将E R图转换为关系模型实际上就是要将实体 实体的属性和实体之间的联系转化为关系模式 实体集向关系模式的转换 一般转换遵循的原则 实体集的转换规则 一个实体型转换为一
  • 特网科技云服务器适合安装那些操作系统

    通过云主机 择带有预装控制面板的模板 只需单击几下即可安装 可用的操作系统模板 我们在管理虚拟服务器时使用的主要操作系统是Ubuntu Debian Windows CentOS Kali Astra Orel CentOS Communi
  • unity+vuforia+二维码识别

    Easy Code Scanner 下载地址 Easy Code Scanner v2 3 本文转载自http blog csdn net puremilk684 article details 51479245 经本人验证 可以在安卓平台
  • .NET使用MQTT通信实例

    最近项目里面需要用到MQTT 刚开始听到这个词一脸茫然 不知道是什么 最后通过自己百度整理一点资料 希望最大家有帮助 在这里需要引用MQTTnet 可在解决方案在右键单击 选择 管理解决方案的 NuGet 程序包 在 浏览 选项卡下面搜索