1、什么是MQTT?
  MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。

  MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。
(具体描述自行百度)

  本文将基于.Net C# Socket WinForm MQTT 客户端开发,实现服务端连接,消息发布,消息订阅,取消订阅及接收服务端返回消息功能。

2、连接服务端

  客户端连接服务端,启动异步接收服务端消息。

 1                     //连接选项
2 var option = new MQTT.MQTTClientOption()
3 {
4 ClientId = this.txtClientId.Text,
5 IpString = this.txtServer.Text,
6 Port = Convert.ToInt32(this.txtPort.Text),
7 UserName = this.txtUserName.Text,
8 Password = this.txtPassword.Text
9 };
10 //实例客户端
11 this.mqttClient = new MQTT.MQTTClient();
12 this.mqttClient.ClientReceived += MqttClient_ClientReceived;
13 var result = await this.mqttClient.ConnectAsync(option);
14 if(result.State == false)
15 {
16 MessageBox.Show(result.Fail, "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
17 return;
18 }
19 //开始接收
20 this.mqttClient.BeginReceive();

3、发布消息

  客户端向服务端发送消息,主要包括主题,内容及消息质量。

  发送消息程序

 1         private short _PacketId = 1;
2 private async void BtnPublish_Click(object sender, EventArgs e)
3 {
4 this.btnPublish.Enabled = false;
5 this.Cursor = Cursors.WaitCursor;
6 try
7 {
8 short qos = 0;
9 if (rdbLevel1.Checked)
10 qos = 1;
11 if (rdbLevel2.Checked)
12 qos = 2;
13
14 var data = new MQTT.PublishEntity()
15 {
16 Topic = this.txtTopic.Text,
17 Reload = System.Text.Encoding.UTF8.GetBytes(this.txtContent.Text),
18 Qos = qos,
19 PacketId=_PacketId
20 };
21 var result = await this.mqttClient.PublishAsync(data,false);
22 if(result.State == false)
23 {
24 this.AppendText("发送失败:" + result.Fail);
25 return;
26 }
27 this._PacketId++;
28 this.AppendText("发送成功,返回结果:" + result.Result);
29 }
30 finally
31 {
32 this.btnPublish.Enabled = true;
33 this.Cursor = Cursors.Default;
34 }
35 }

4、订阅消息

  客户端订阅消息,主要包括过滤主题及消息质量。

  订阅消息方法:

 1 private async void BtnSubscribe_Click(object sender, EventArgs e)
2 {
3 this.btnSubscribe.Enabled = false;
4 this.Cursor = Cursors.WaitCursor;
5
6 try
7 {
8 string fail = string.Empty;
9
10 short qos = 0;
11 if (rdbQos1.Checked)
12 qos = 1;
13 if (rdbQos2.Checked)
14 qos = 2;
15
16 MQTT.SubscribeEntity entity = new MQTT.SubscribeEntity();
17 entity.Filter = this.txtFilter.Text;
18 entity.Qos = qos;
19
20 this.AppendText("开始订阅...");
21 //if (mqttClient.Subscribe(this.txtFilter.Text, qos, out result, out fail) == false)
22 //{
23 // this.AppendText(fail);
24 // return;
25 //}
26 var result = await mqttClient.SubscribeAsync(entity.Filter,entity.Qos);
27 if (result.State == false)
28 {
29 this.AppendText(result.Fail);
30 return;
31 }
32
33 this.AppendText("订阅成功!返回结果:" + result.Result);
34 MQTT.SubscribeHelper.Save(entity);
35
36 DataRow drData = this.dtSubscribes.NewRow();
37 drData["Id"] = entity.Id;
38 drData["Filter"] = entity.Filter;
39 drData["Qos"] = entity.Qos;
40 drData["Count"] = 0;
41 dtSubscribes.Rows.Add(drData);
42 }
43 finally
44 {
45 this.btnSubscribe.Enabled = true;
46 this.Cursor = Cursors.Default;
47 }
48 }

5、取消订阅

  客户端取消某一订阅消息。双击订阅消息行,取消订阅消息。

  取消订阅方法:

 1         private async void DataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
2 {
3 if (this.dataGridView1.CurrentCell == null)
4 return;
5
6 DataRowView drv = this.dataGridView1.CurrentRow.DataBoundItem as DataRowView;
7 if (drv == null)
8 return;
9
10 if (MessageBox.Show("确认取消当前选择:" + drv["Filter"].ToString() + " 订阅?", "确认", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) != DialogResult.OK)
11 return;
12 try
13 {
14 this.AppendText("开始取消订阅...");
15 var result = await mqttClient.UnSubscribeAsync(drv["Filter"].ToString());
16 if (result.State == false)
17 {
18 this.AppendText(result.Fail);
19 return;
20 }
21 this.AppendText("取消订阅成功!返回结果:" + result.Result);
22 MQTT.SubscribeHelper.Delete(drv["Id"].ToString());
23 this.dataGridView1.Rows.RemoveAt(this.dataGridView1.CurrentCell.RowIndex);
24 }
25 catch (Exception ex)
26 {
27 this.AppendText("取消订阅异常:" + ex.ToString());
28 }
29
30 }

6、接收服务端消息

  客户端接收服务端转发过来的消息。

1         private void MqttClient_ClientReceived(MQTT.MQTTClient client, MQTT.ReceiveResult receive)
2 {
3 if(receive.Data != null)
4 this.AppendText("DataReceived state="+receive.State+" topic="+ receive.Data.Topic + " content=" + System.Text.Encoding.UTF8.GetString(receive.Data.Reload));
5 else if(receive.State)
6 this.AppendText("DataReceived state=" + receive.State + " result=" + receive.Result);
7 else
8 this.AppendText("DataReceived state=" + receive.State + " fail=" + receive.Fail);
9 }

至此,客户端工具主要功能简介完毕,不当之处,欢迎指正!

客户端下载地址(码云服务器):https://gitee.com/ShiQuan25/full-product-management/raw/master/WinMQTTClient/WinMQTTClient.zip

基于.net C# Socket WinForm MQTT 客户端开发的更多相关文章

  1. 基于Android的小巫新闻客户端开发系列教程

    <ignore_js_op> 141224c6n6x7wmu1aacap7.jpg (27.51 KB, 下载次数: 0) 下载附件  保存到相册 23 秒前 上传   <ignor ...

  2. 基于TCP的socket套接字的网络编程(客户端/服务端模式)

    于数据完整性要求较高的场合,就应采用TCP协议. IP网络层提供IP寻址和路由.因为在网络上数据可以经由多条线路到达目的地,网络层负责找出最佳的传输线路. IP地址与数据包: IP层就是把数据分组从一 ...

  3. Ajax跨域问题及解决方案 asp.net core 系列之允许跨越访问(Enable Cross-Origin Requests:CORS) c#中的Cache缓存技术 C#中的Cookie C#串口扫描枪的简单实现 c#Socket服务器与客户端的开发(2)

    Ajax跨域问题及解决方案   目录 复现Ajax跨域问题 Ajax跨域介绍 Ajax跨域解决方案 一. 在服务端添加响应头Access-Control-Allow-Origin 二. 使用JSONP ...

  4. ABP VNext框架中Winform终端的开发和客户端授权信息的处理

    在ABP VNext框架中,即使在它提供的所有案例中,都没有涉及到Winform程序的案例介绍,不过微服务解决方案中提供了一个控制台的程序供了解其IDS4的调用和处理,由于我开发过很多Winform项 ...

  5. c#Socket服务器与客户端的开发(1)

    上个项目中用到了Socket通讯,项目中直接借助SuperSocket实现,但是我觉得这毕竟是一个我没接触过的东西,所以也顺便学习了一下原生socket的使用,做了一个socket服务器与客户端的开发 ...

  6. cross socket tcp客户端开发

    cross socket tcp客户端开发 uses Net.SocketAPI, Net.CrossSocket.Base, Net.CrossSocket FCrossTcp: ICrossSoc ...

  7. 基于第三方开源库的OPC服务器开发指南(3)——OPC客户端

    本篇将讲解如何编写一个OPC客户端程序测试我们在前文<基于第三方开源库的OPC服务器开发指南(2)——LightOPC的编译及部署>一篇建立的服务器.本指南的目的是熟悉OPC服务器的开发流 ...

  8. 网络编程懒人入门(八):手把手教你写基于TCP的Socket长连接

    本文原作者:“水晶虾饺”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.引言 好多小白初次接触即时通讯(比如:IM或者消息推送应用)时,总是不 ...

  9. MQTT客户端

    MQTT客户端 最近公司项目中使用到了一个MQTT的协议,用这个通讯协议将嵌入式端收集到的数据接入到物联网中,很是方便的解决了,嵌入式端存储空间小,也解决了用户需要自定义使用这些记录数据的需求.而且相 ...

  10. Python进阶(1)_Socket网络编程(基于tcp的socket)

    网络协议参考:http://www.cnblogs.com/hedeyong/p/6889774.html 一.TCP/IP五层模型 学习socket一定要先学习互联网协议: 1.首先:本节课程的目标 ...

随机推荐

  1. vCenter 升级错误 VCSServiceManager 1603

    近日,看到了VMware发布的vCenter 6.7 Update 1b的更新消息.其中有一条比较震撼.有误删所有VM的概率,这种BUG谁也承受不起. Removing a virtual machi ...

  2. Elasticsearch实现类Google高级检索

    文章转载自: https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247483914&idx=1&sn=436f814 ...

  3. 重学Java泛型

    一丶从字节码层面看范型擦除 public class Type1<T> { private T t; } 使用jclasslib插件查看其字节码: 可以看到 t属性的类型是List< ...

  4. [题解] Atcoder Regular Contest ARC 147 A B C D E 题解

    点我看题 A - Max Mod Min 非常诈骗.一开始以为要观察什么神奇的性质,后来发现直接模拟就行了.可以证明总操作次数是\(O(nlog a_i)\)的.具体就是,每次操作都会有一个数a被b取 ...

  5. 2022.9.30 Java第四次课后总结

    1.public class BoxAndUnbox { /** * @param args */ public static void main(String[] args) { int value ...

  6. vue2双向绑定原理:深入响应式原理defineProperty、watcher、get、set

    响应式是什么?Vue 最独特的特性之一- 就是我们在页面开发时,修改data值的时候,数据.视图页面需要变化的地方变化. 主要使用到哪些方法? 用 Object.defineProperty给watc ...

  7. 使用开源计算引擎提升Excel格式文件处理效率

    对Excel进行解析\生成\查询\计算等处理是Java下较常见的任务,但Excel的文件格式很复杂,自行编码读写太困难,有了POI\EasyExcel\JExcel等类库就方便多了,其中POI最为出色 ...

  8. .NET性能系列文章一:.NET7的性能改进

    这些方法在.NET7中变得更快 照片来自 CHUTTERSNAP 的 Unsplash 欢迎阅读.NET性能系列的第一章.这一系列的特点是对.NET世界中许多不同的主题进行研究.比较性能.正如标题所说 ...

  9. Tauri-Vue3桌面端聊天室|tauri+vite3仿微信|tauri聊天程序EXE

    基于tauri+vue3.js+vite3跨桌面端仿微信聊天实例TauriVue3Chat. tauri-chat 运用最新tauri+vue3+vite3+element-plus+v3layer等 ...

  10. 一、Vue.js介绍

    一.介绍 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不仅易于上手 ...