经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
基于.net C# Socket WinForm MQTT 客户端开发
来源:cnblogs  作者:衡斅  时间:2022/11/28 8:58:07  对本文有异议

 

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

3、发布消息

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

  发送消息程序

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

 

4、订阅消息

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

  订阅消息方法:

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

 

5、取消订阅

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

 

  取消订阅方法:

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

 

6、接收服务端消息

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

 

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

 

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

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


原文链接:https://www.cnblogs.com/henxiao25/p/16930708.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号