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

最新文章

  1. http执行过程分析
  2. Understand Lambda Expressions in 3 minutes(翻译)
  3. GUI
  4. Beta版本冲刺——day5
  5. IOS开发札记
  6. hihoCoder #1174 : 拓扑排序·一 (判断循环图)
  7. TCP三次握手/四次握手
  8. composer的create-project安装php框架laravel for mac教程
  9. kindle
  10. sun.misc.BASE64Encoder我找不到jar一揽子解决方案
  11. 【unix网络编程第三版】阅读笔记(四):TCP客户/服务器实例
  12. 深入浅出KNN算法(一) KNN算法原理
  13. Codeforces Round #522 (Div. 2, based on Technocup 2019 Elimination Round 3)B. Personalized Cup
  14. 【.net】The source was not found, but some or all event logs could not be searched
  15. redis学习链接收藏
  16. 正则匹配报文中的XML(HTML)标签,替换重新输出
  17. Python全栈开发-执行字符串形式的语句和字符串形式的表达式方法(即exec和eval方法)
  18. 利用python库计算person相关系数
  19. navicat下载安装和激活一分钟完成
  20. 火狐对SVG的兼容性

热门文章

  1. 《Java基础——异常的捕获与抛出》
  2. 如何通过Java应用程序创建Word表格
  3. Form表单数据
  4. 详解centos7中配置keepalived日志为别的路径
  5. Kubernetes Node的隔离与恢复
  6. 线性回归大结局(岭(Ridge)、 Lasso回归原理、公式推导),你想要的这里都有
  7. aardio + PowerShell 可视化快速开发独立 EXE 桌面程序
  8. Wine 安装迅雷5.8.14.176
  9. 手把手教你玩转 Gitea|在 Windows 系统上安装 Gitea
  10. struts项目向前台返回图片。