首页 > 其他分享 >MQTTnet4入门(二)实现客户端

MQTTnet4入门(二)实现客户端

时间:2023-08-18 22:11:27浏览次数:43  
标签:入门 await client new MQTTnet4 连接 服务端 客户端

上一篇写服务端的文章《MQTTnet4入门(一)实现服务端》已经是去年年底,现在MQTTnet的版本是4.2.1.781,总的来说改动不大。下面以新版为例实现一个客户端。

        var mqttClientOptions = new MqttClientOptionsBuilder()
            .WithTcpServer("地址", 端口)
            .WithClientId("我是客户端名称")//连接id
            .WithCredentials("demo","123456")//如果有用户名密码
            .WithTls()//如果启用了ssl/tls
            .WithProtocolVersion(MqttProtocolVersion.V500)//如果用mqtt5
            .Build();//配置
        IMqttClient client = new MqttFactory().CreateMqttClient();//创建连接
        client.ApplicationMessageReceivedAsync += MqttClient_ApplicationMessageReceivedAsync;//收到消息的方法
        client.ConnectedAsync += Client_ConnectedAsync;//连接成功的方法
        client.ConnectingAsync += Client_ConnectingAsync;//连接中的方法

配置里面一个大坑害我调了一个小时,如果mqtt服务端需要用户名和密码,那么使用.WithCredentials()来填写。我一直以为是.WithUserProperty(),极有迷惑性。

连接并订阅主题:

while (true)
{
    try
    {
        if (!await client.TryPingAsync())
        {
            await client.ConnectAsync(mqttClientOptions, CancellationToken.None);
            var mqttSubscribeOptions = new MqttFactory().CreateSubscribeOptionsBuilder()
                .WithTopicFilter(
                f =>
                {
                    f.WithTopic("shi");//订阅主题
                })
                .Build();
            await client.SubscribeAsync(mqttSubscribeOptions);
        }
    }
    catch
    {
        // 错误
    }
    finally
    {
        // 每5秒检查一次连接状态,连接失败重连
        await Task.Delay(TimeSpan.FromSeconds(5));
    }
}

 

标签:入门,await,client,new,MQTTnet4,连接,服务端,客户端
From: https://www.cnblogs.com/xpszy/p/17641731.html

相关文章

  • JS入门第一节
    <!DOCTYPE><html><head><!--注意两个标签之间不能有任何内容,否则会导致页面失效--><scriptsrc="my.js"></script></head><body><!--行内JS--><buttononclick="alert('努力,奋斗')">点......
  • ansible入门指南 - 常用的Ad-Hoc指令
    常用的Ad-Hoc指令ansible命令的基本语法为ansible-mmodule-aparams-iinventory.yaml-f5-uusernameall-m指定运行的模块,缺省值为ansible.builtin.command,即在服务器上直接运行命令-a指定模块的参数-i指定inventory文件-f指定同时运行的数量,缺省值为......
  • ansible入门指南 - ansible的常用命令
    ansible的常用命令运行ansible命令的时候会使用ansible.cfg配置文件配置文件优先级为ANSIBLE_CONFIG指定的文件>~/.ansible.cfg>/etc/ansible/ansible.cfgansibleansible命令可以用来运行ad-hoc指令ansible-config配置文件相关的功能,可以运行以下命令生成一个默......
  • C++快速入门 第四十二讲:链接和作用域
    与作用域有关的另一个概念是链接,当同时编译多个文件时,每个源文件被称为一个翻译单元,在某一个翻译单元里定义的东西在另一个翻译单元里使用正是链接发挥作用的地方。存储类(storageclass):每个变量都有一个存储类,它决定着程序将把变量的值储存在计算机的什么地方、如何存储、以及变......
  • C++快速入门 第四十三讲:链接和作用域2
    1header.h文件23#ifndefHEADER_H4#defineHEADER_H56unsignedlongreturnFactorial(unsignedshortnum);7staticconstunsignedshortheaderNum=5;//定义静态恒定值的全局变量89#endif1011that.cpp文件:1213#include"header.h"14uns......
  • C++快速入门 第四十五讲:类模板
    类模板与函数模板非常相似,同样是先由你编写一个类的模板,再由编译器在你第一次使用这个模板时生成的实际代码。实例:栈的出入栈1#include<iostream>2#include<string>34template<classT>5classStack//栈类6{7public:8Stack(unsignedintsize=......
  • C++快速入门 第四十四讲:函数模板swap使用
    泛型编程技术支持程序员创建函数和类的蓝图(即模板,template),而不是具体的函数和类。标准模板库STL(StandardTemplateLibrary),STL库是泛型编程技术的经典之作,它包含了许多非常有用的数据类型和算法。当拥有一个模板时,编译器将根据模板自动创建一个函数,该函数会使用正确的数据类型......
  • C++快速入门 第四十六讲:内联模板
    内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质。编译时类似宏替换,使用函数体替换调用处的函数名。(在程序中,调用其函数时,该函数在编译时被替换,而不是像一般函数那样是在运行时被调用)实例:栈1#include<iostream>2#include<string>34template<class......
  • C++快速入门 第四十七讲:容器和算法
    C++标准库提供的向量(vector)类型从根本上解决了数组先天不足的问题(内存固定,如果不用那么多内存编译器也会为其分配)我们用不着对一个向量能容纳多少元素做出限定,因为向量可以动态地随着你往它里面添加元素而无限增大。还可以用它的size()方法查知某给定向量的当前长度(即包含的元素......
  • C++快速入门 第三十六讲:副本构造器
    我们可以把一个对象赋值给一个类型与之相同的变量,编译器将生成必要的代码把“源”对象各属性的值分别赋值给“目标”对象的对应成员。这种赋值行为称之为逐位复制。(但如果某些成员变量是指针的话,对象成员逐位复制的结果是你将拥有两个一模一样的实例,而这两个副本里的同名指针会指......