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

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订阅/取消订阅事件等。  部分代码贴出如下

 

        //创建一个服务器对象

        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 @ 2022-06-14 16:16  大果冻  阅读(1515)  评论(4)    收藏  举报