千千梦丶琪 发表于 2022-11-27 22:54:09

基于.net C# Socket WinForm MQTT 客户端开发

 
1、什么是MQTT?
  MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。
  MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。
(具体描述自行百度)
 
  本文将基于.Net C# Socket WinForm MQTT 客户端开发,实现服务端连接,消息发布,消息订阅,取消订阅及接收服务端返回消息功能。
https://img2023.cnblogs.com/blog/28607/202211/28607-20221127204558163-1427995261.png
 
 
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、发布消息
  客户端向服务端发送消息,主要包括主题,内容及消息质量。
https://img2023.cnblogs.com/blog/28607/202211/28607-20221127210027067-1241681536.png
  发送消息程序
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、订阅消息
  客户端订阅消息,主要包括过滤主题及消息质量。
https://img2023.cnblogs.com/blog/28607/202211/28607-20221127210400688-741288656.png
  订阅消息方法:
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、取消订阅
  客户端取消某一订阅消息。双击订阅消息行,取消订阅消息。
https://img2023.cnblogs.com/blog/28607/202211/28607-20221127210751428-1386417540.png
 
  取消订阅方法:
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、接收服务端消息
  客户端接收服务端转发过来的消息。
https://img2023.cnblogs.com/blog/28607/202211/28607-20221127211536783-2094336007.png
 
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]
查看完整版本: 基于.net C# Socket WinForm MQTT 客户端开发