zoukankan      html  css  js  c++  java
  • C# MQTT mqtt客户端,发布订阅消息

    如果想用C#来和mqtt的服务器进行数据交互的话,有一个常见的选择,那就是 MQTTNET

    地址如下:https://github.com/chkr1011/MQTTnet

    那个库在最近几个版本升级的过程中,更改了一些api接口,造成了大家的困惑,所以我在hsl中也提供了mqtt的实现类,用法很简单。现在来介绍一下

    本库的demo源代码地址:https://github.com/dathlin/HslCommunication

    如果想要联系作者,请访问官网:  http://www.hslcommunication.cn/

    详细的API参考如下:

    http://api.hslcommunication.cn/html/41e2aff2-d1ad-d10c-bad0-61b644d686fb.htm

    配合同步客户端非常的好用。

    测试的MQTT界面如下:

    然后需要准备mqtt的服务器了,当然了,你可以安装EMQtt的服务器,也可以安装mqttnet的服务器,当然为了尽快的测试,可以使用hsl支持的服务器,虽然目前的支持的功能比较简陋,但是基本的功能都有的。

    好了,我们先运行demo,打开服务器

     

    点击start即可。

    然后我们新建一个winform项目,然后nuget安装hslcommunication

    安装完成后,我们就要在主界面添加一个按钮了。

    先定义对象,然后在构造方法里初始化。

    public Form1( )
    {
        InitializeComponent( );
     
        // 实例化
        mqttClient = new MqttClient( new MqttConnectionOptions( )
        {
            ClientId = "ABC",
            IpAddress = "127.0.0.1"
        } );
    }
     
     
    private MqttClient mqttClient = null;
    private void button1_Click( object sender, EventArgs e )
    {
        // 连接
        OperateResult connect = mqttClient.ConnectServer( );
        if (connect.IsSuccess)
        {
            MessageBox.Show( "Success" );
        }
        else
        {
            MessageBox.Show( "Failed" );
        }
    }

    实例化的时候支持设置客户端的ID信息,服务器的地址,端口,超时时间,如果服务器设置了用户名和密码。那么实例化的时候修改成下面的信息

    // 实例化
    mqttClient = new MqttClient( new MqttConnectionOptions( )
    {
        ClientId = "ABC",
        IpAddress = "127.0.0.1",
        Credentials = new MqttCredential( "admin", "123456" ),   // 设置了用户名和密码
    } );

    如何发布消息呢?我们再增加一个按钮。

    private void button2_Click( object sender, EventArgs e )
    {
        // 测试发布
        mqttClient.PublishMessage( new MqttApplicationMessage( )
        {
            Topic = "A",                                                      // 主题
            QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce,     // 消息等级
            Payload = Encoding.UTF8.GetBytes( this.textBox1.Text ),        // 数据
            Retain = false,                                                   // 是否保留
        } );
    }

    我们来看看测试效果。

     

    我们看到服务器上接收到客户端的信息,可以方便的知道哪个客户端,发的什么主题,内容是什么。

    我们再来看看订阅操作。我们再增加一个按钮,用来订阅操作

    private void button3_Click( object sender, EventArgs e )
    {
        // 订阅测试,在label1上显示结果
        mqttClient.OnMqttMessageReceived += MqttClient_OnMqttMessageReceived; // 调用一次即可
        mqttClient.SubscribeMessage( "A" );     // 订阅A的主题
    }
     
    private void MqttClient_OnMqttMessageReceived( string topic, byte[] payload )
    {
        // 跨线程更新了UI界面的内容
        Invoke( new Action( ( ) =>
         {
             label1.Text = $"Topic[{topic}] {Encoding.UTF8.GetString( payload )}";
         } ) );
    }

    好了我们再来操作以下

    我们可以看到我们订阅的A,然后发布的A确实是收到消息了。

    实际上MQTT协议的操作就只有这么点,基本就差不多了,但是在发布消息的时候有个属性:QualityOfServiceLevel

    这个需要额外注意一下。有三个选项,最多一次,最少一次,刚好一次,从性能上来说,最多一次最高性能,刚好一次最损耗性能。

    所以一般工业现场的实时数据的推送都是最多一次即可。

    还有 Retain 属性,含义是,你推上去的消息是否要在服务器本地缓存,缓存之后有什么好处呢?新的客户端订阅消息的时候,会立即推送一次旧数据。这样,你就可以及时的在界面上显示出来。

  • 相关阅读:
    Openstack----学习笔记
    如何往gitlab/github上游贡献代码
    搭建python虚拟环境virtualenv
    YAML格式
    mysql安装
    使用mysql服务实现负载均衡
    tomcat web服务的搭建
    通过SQL查询SQL服务器和客户端IP地址
    验证数字的正则表达式
    C# WinForm控件美化扩展系列之给TextBox加水印
  • 原文地址:https://www.cnblogs.com/nayilvyangguang/p/15151649.html
Copyright © 2011-2022 走看看