么岁月静好,不过是有人替你负重前行!哪有什

MQTT服务器及客户端功能说明

1、用VS开发工具创建基于.NetCore 的Winform项目工程注意创建的项目类型为Windows窗体应用。

 

 

 2、采用NuGet添加引用MQTTnet在项目中的包右键,选择管理NuGet程序包

 

 

 在搜索框中输入MQTTnet,本项目用的是MQTTnet2.8.2版本,你也可以选择适合自己的版本,选择好后安装即可。

 

 

 3、设计MQTT操作页面可以创建个控制台应用程序,这样简单,但为了便于演示MQTT的操作及信息查看,我们创建了Winform界面程序,来实现MQTT服务。服务端界面设计如图

 

服务端上端为MQTT启动需要的参数,下侧为日志信息

 

 

 

 客户端上端为MQTT启动需要的参数,中间为日志信息,下面为客户端发送数据。

4、MQTT服务器程序设计 界面设计完后,进行程序设计,MQTT服务器的程序设计主要包含:服务器对象初始化及启动,MQTT服务器事件注册及处理。其中事件主要有客户端连接及断开连接事件、接收客户端数据事件、发送消息、客户端topic订阅/取消订阅事件等。  部分代码贴出如下

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
//创建一个服务器对象
 
private IMqttServer mqttServer = null;
 
private string CurrentTime
{
    get { return DateTime.Now.ToString("HH:mm:ss"); }
}
 
private AddLogDelegate AddLog;
 
private void btn_Start_Click(object sender, EventArgs e)
{
 
    //验证
 
    if (mqttServer != null)
    {
        return;
    }
 
    //创建一个OptionBuilder
    var optionBuilder = new MqttServerOptionsBuilder();
 
    optionBuilder.WithConnectionBacklog(10);
 
    optionBuilder.WithDefaultEndpointPort(Convert.ToInt32(this.txt_Port.Text));
 
    optionBuilder.WithDefaultEndpointBoundIPAddress(IPAddress.Parse(this.cmb_IPList.Text));
 
    mqttServer = new MqttFactory().CreateMqttServer();
 
    //账号密码
    MqttServerOptions option = optionBuilder.Build() as MqttServerOptions;
 
    //验证ID长度
    option.ConnectionValidator += context =>
      {
          if (context.ClientId.Length < 10)
          {
              context.ReturnCode = MqttConnectReturnCode.ConnectionRefusedIdentifierRejected;
              return;
          }
 
          if (chk_IsUsePwd.Checked)
          {
              //验证账户和密码
              if (context.Username != this.txt_UserName.Text)
              {
                  context.ReturnCode = MqttConnectReturnCode.ConnectionRefusedBadUsernameOrPassword;
                  return;
              }
 
              if (context.Password != this.txt_Pwd.Text)
              {
                  context.ReturnCode = MqttConnectReturnCode.ConnectionRefusedBadUsernameOrPassword;
                  return;
              }
          }
          context.ReturnCode = MqttConnectReturnCode.ConnectionAccepted;
 
      };
 
    //绑定事件
    mqttServer.ClientConnected += MqttServer_ClientConnected;
 
    mqttServer.ClientDisconnected += MqttServer_ClientDisconnected;
 
    mqttServer.ClientSubscribedTopic += MqttServer_ClientSubscribedTopic;
 
    mqttServer.ClientUnsubscribedTopic += MqttServer_ClientUnsubscribedTopic;
 
    mqttServer.ApplicationMessageReceived += MqttServer_ApplicationMessageReceived;
 
    mqttServer.Started += MqttServer_Started;
 
    mqttServer.Stopped += MqttServer_Stopped;
 
    mqttServer.StartAsync(option);
 
}

  

复制代码
 1  /// <summary>
 2         /// 写入日志方法体
 3         /// </summary>
 4         /// <param name="index"></param>
 5         /// <param name="info"></param>
 6         private void AddLogMethod(int index, string info)
 7         {
 8             if (this.lstInfo.InvokeRequired)
 9             {
10                 this.lstInfo.Invoke(new Action(() =>
11                 {
12                     ListViewItem lst = new ListViewItem("  " + CurrentTime, index);
13 
14                     lst.SubItems.Add(info);
15 
16                     lstInfo.Items.Insert(0, lst);
17 
18                 }));
19 
20             }
21             else
22             {
23                 ListViewItem lst = new ListViewItem("  " + CurrentTime, index);
24 
25                 lst.SubItems.Add(info);
26 
27                 lstInfo.Items.Insert(0, lst);
28 
29             }
30 
31         }
复制代码

 

 四、小结 以上介绍了MQTT服务器的设计过程,主要介绍了服务器程序设计的服务器对象初始化及启动,MQTT服务器事件注册及处理,发送数据三个环节。当然这只是比较简单的示例,但是通过该示例你可以掌握MQTT服务器程序设计最重要的几个环节,其余你就可以再此基础上进行扩展就可了。有需要源码的同学可以留言索要。

posted @   大果冻  阅读(1374)  评论(4编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示