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

  • 基于.net C# Socket WinForm MQTT 客户端开发已关闭评论
  • 150 次浏览
  • A+
所属分类:.NET技术
摘要

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

 

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

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

 

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

基于.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、发布消息

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

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

  发送消息程序

 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、订阅消息

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

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

  订阅消息方法:

 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、取消订阅

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

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

 

  取消订阅方法:

 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、接收服务端消息

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

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

 

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