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

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

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

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

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

测试的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 is test message!" ), // 数据
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 属性,含义是,你推上去的消息是否要在服务器本地缓存,缓存之后有什么好处呢?新的客户端订阅消息的时候,会立即推送一次旧数据。这样,你就可以及时的在界面上显示出来。

更多的操作,可以参照demo的源代码。

C# MQTT mqtt客户端,发布订阅消息的更多相关文章

  1. Kafka是分布式发布-订阅消息系统

    Kafka是分布式发布-订阅消息系统 https://www.biaodianfu.com/kafka.html Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apa ...

  2. 高吞吐量的分布式发布订阅消息系统Kafka--安装及测试

    一.Kafka概述 Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据. 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因 ...

  3. 分布式发布订阅消息系统 Kafka 架构设计[转]

    分布式发布订阅消息系统 Kafka 架构设计 转自:http://www.oschina.net/translate/kafka-design 我们为什么要搭建该系统 Kafka是一个消息系统,原本开 ...

  4. 分布式发布订阅消息系统Kafka

    高吞吐量的分布式发布订阅消息系统Kafka--安装及测试   一.Kafka概述 Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据. 这种动作(网页浏览, ...

  5. 发布-订阅消息系统Kafka简介

    转载请注明出处:http://www.cnblogs.com/BYRans/ Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写.Kafka是一种高吞吐量的分布式 ...

  6. Kafka(分布式发布-订阅消息系统)工作流程说明

    Kafka系统架构Apache Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apache项目的一部分.Kafka是一种快速.可扩展的.设计内在就是分布式的,分区的和 ...

  7. kafka 基础知识梳理-kafka是一种高吞吐量的分布式发布订阅消息系统

    一.kafka 简介 今社会各种应用系统诸如商业.社交.搜索.浏览等像信息工厂一样不断的生产出各种信息,在大数据时代,我们面临如下几个挑战: 如何收集这些巨大的信息 如何分析它 如何及时做到如上两点 ...

  8. JMS发布/订阅消息传送例子

    前言 基于上篇文章"基于Tomcat + JNDI + ActiveMQ实现JMS的点对点消息传送"很容易就可以编写一个发布/订阅消息传送例子,相关环境准备与该篇文章基本类似,主要 ...

  9. Kafka logo分布式发布订阅消息系统 Kafka

    分布式发布订阅消息系统 Kafka kafka是一种高吞吐量的分布式发布订阅消息系统,她有如下特性: 通过O(1)的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳 ...

  10. 【9】JMicro微服务-发布订阅消息服务

    如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 1. JMicro消息服务目前实现特性 a. JMicro只支持发布订阅消息服务,不支持队列式消息服务: b. 不支持消息持 ...

随机推荐

  1. MySQL数据库(良心资料)

    一.MySQL数据库 1.数据库简介 1.1.数据库的概念 数据库就是用来存储和管理数据的仓库.数据库存储数据的优点: l  可存储大量数据: l  方便检索: l  保持数据的一致性.完整性: l  ...

  2. Servlet+jsp用户登录加上验证码

    最近公司有个项目被客户拿去进行漏洞扫描,发现用户登录太简单,容易被暴力破解.当然发现的问题很多,什么反射型XSS,存储型XSS,敏感信息泄露等等.但是我们今天不讲这么多,就说说如何修复暴力破解的问题. ...

  3. Spring Boot (三): ORM 框架 JPA 与连接池 Hikari

    前面两篇文章我们介绍了如何快速创建一个 Spring Boot 工程<Spring Boot(一):快速开始>和在 Spring Boot 中如何使用模版引擎 Thymeleaf 渲染一个 ...

  4. Dart函数、类和运算符-处理信息

    编程语言虽然千差万别,但归根结底,它们的设计思想无非就是回答两个问题: 1.如何表示信息: 2.如何处理信息: 函数 函数是一段用来独立地完成某个功能的代码.函数是对象类型,它的类型叫做Functio ...

  5. oracle 11g 下载安装 使用记录

    Oracle 11g 使用记录 1.下载oracle快捷安装版:   (1)下载连接:https://pan.baidu.com/s/1ClC0hQepmTw2lSJ2ODtL7g 无提取码 (2)去 ...

  6. 【带着canvas去流浪(14)】Three.js中凹浮雕模型的生成方式

    目录 一. 方案1:ThreeBSP.js或ThreeCSG.js扩展库 二. 方案2:平面镂空模型拉伸 三. 方案3:Cinema 4D建模后输出模型文件 示例代码托管在:http://www.gi ...

  7. selenium-03-02操作元素-等待

    1.最直接普通的方式:这个是设置固定的等待时间    Thread.sleep(1000);   2.隐式等待方式(implicitlyWait):设置脚本在查找元素时的最大等待时间:    driv ...

  8. 还在用SVN的人,要不要学Git?

    还在用SVN的人,要不要学Git? 提出这个问题,是因为很多小伙伴还不会使用Git. 在Git之前,是SVN的天下. SVN诞生于2001年,由于较为先进的管理方式而迅速取代了CVS. 很多80后小伙 ...

  9. FastDfs之StorageServer的详细配置介绍

    #这个配置文件是否失效 disabled=false #false为有效 true为无效 # 本storage server所属的group名 group_name=group1 # 可以版定一个ip ...

  10. 死磕 java同步系列之redis分布式锁进化史

    问题 (1)redis如何实现分布式锁? (2)redis分布式锁有哪些优点? (3)redis分布式锁有哪些缺点? (4)redis实现分布式锁有没有现成的轮子可以使用? 简介 Redis(全称:R ...