基于MQTTnet做了个MQTT协议测试程序,本程序包括服务的和两个客户端,方便在不引入外部支撑的情况下测试MQTT协议。
测试软件界面如下

1:启动MQTT服务

在Server区域,
启动服务可以选择MQTT服务使用的端口、用户名、密码。
如有有客户端需要连接服务,需要把这些信息告诉他们。
右边tab页有启动工程的详细日志。

2:MQTT客户端

在该测试程序中实现了两个客户端,方便测试使用,两个客户端功能万千一致,以客户端1为例介绍配置过程中的相关参数。

首先是需要连接的MQTT服务器IP和端口,这些信息一般有服务端提供,本程序直接连接本机的服务端,因此IP配置为127.0.0.1,端口和服务器端口一致12345。
其次,根据MQTT协议,连接服务器时需要提供用户名、密码用于鉴权认证。
最后,需要一个终端唯一标识,即客户标识,该标识在一个服务器下需要保证唯一。
到此和MQTT服务器连接相关参数就完备了,可以连接服务器了。
Qos是遗嘱消息服务质量等级,取值即含义如下

RETAIN: 保留标志位,如果为1,服务器存储最新一条RETAIN消息,以便分发给新的订阅者

MQTT是发布订阅模式的,客户端如果要收到消息需要先订阅对应的主题,订阅主题数量是没有限制的。
例如:client1订阅主题client1/sub、client2/sub
client2订阅主题client2/sub
然后在已订主题的下拉框中就可以看到本客户端订阅的主题。
如何要取消对应的主题,在下拉列表中先择,然后点击取消,就会取消订阅。
发布主题需要设定主题和发布内容。
例如用client1发布:
主题:client2/sub
内容:新信息。
例如用client2发布:
主题:client1/sub
内容:test
根据刚才设置的订阅信息,两个客户端收到的数据如下:

我们可以看到主题:client2/sub在两个客户端都收到了。
自此,测试功能基本就介绍完了。

3:程序功能实现

该程序是基于MQTTnet库最的。
因为要实现服务端和客户端。因此创建连个类:MQTTServer、MQTTClients,这部分代码也是在网上找的,但功能实现比较完备,所有我就直接使用了。
服务端MQTTServer

public class MQTTServer{public StringBuilder sb = new StringBuilder("");public MqttServer mqttServer = null;public bool MqttServer_runflag = false;public async void StartMqttServer(int port = 12345, string user = "123", string passwd = "123"){if (mqttServer == null){var optionsBuilder = new MqttServerOptionsBuilder().WithDefaultEndpoint().WithDefaultEndpointPort(port).WithConnectionValidator(c =>{var currentUser = user;var currentPWD = passwd;if (currentUser == null || currentPWD == null){c.ReasonCode = MqttConnectReasonCode.BadUserNameOrPassword;return;}if (c.Username != currentUser){c.ReasonCode = MqttConnectReasonCode.BadUserNameOrPassword;return;}if (c.Password != currentPWD){c.ReasonCode = MqttConnectReasonCode.BadUserNameOrPassword;return;}c.ReasonCode = MqttConnectReasonCode.Success;}).WithSubscriptionInterceptor(c =>{c.AcceptSubscription = true;}).WithApplicationMessageInterceptor(c =>{c.AcceptPublish = true;});mqttServer = new MqttFactory().CreateMqttServer() as MqttServer;mqttServer.StartedHandler = new MqttServerStartedHandlerDelegate(OnMqttServerStarted);mqttServer.StoppedHandler = new MqttServerStoppedHandlerDelegate(OnMqttServerStopped);mqttServer.ClientConnectedHandler = new MqttServerClientConnectedHandlerDelegate(OnMqttServerClientConnected);mqttServer.ClientDisconnectedHandler = new MqttServerClientDisconnectedHandlerDelegate(OnMqttServerClientDisconnected);mqttServer.ClientSubscribedTopicHandler = new MqttServerClientSubscribedHandlerDelegate(OnMqttServerClientSubscribedTopic);mqttServer.ClientUnsubscribedTopicHandler = new MqttServerClientUnsubscribedTopicHandlerDelegate(OnMqttServerClientUnsubscribedTopic);mqttServer.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(OnMqttServer_ApplicationMessageReceived);await mqttServer.StartAsync(optionsBuilder.Build());}}public async void StopMqttServer(){await mqttServer?.StopAsync();}public async void PublishMqttTopic(string topic, string payload){var message = new MqttApplicationMessage(){Topic = topic,Payload = Encoding.UTF8.GetBytes(payload)};await mqttServer.PublishAsync(message);}public void OnMqttServerStarted(EventArgs e){sb.Append("MQTT服务启动完成!\r\n");}public void OnMqttServerStopped(EventArgs e){sb.Append("MQTT服务停止完成!\r\n");}public void OnMqttServerClientConnected(MqttServerClientConnectedEventArgs e){sb.Append($"客户端[{e.ClientId}]已连接\r\n");}public void OnMqttServerClientDisconnected(MqttServerClientDisconnectedEventArgs e){sb.Append($"客户端[{e.ClientId}]已断开连接!\r\n");//PublishMqttTopic("client/Disconnected", $"客户端[{ e.ClientId}]已断开连接");}public void OnMqttServerClientSubscribedTopic(MqttServerClientSubscribedTopicEventArgs e){//sb.Append($"客户端[{e.ClientId}]已成功订阅主题[{e.TopicFilter}]!\r\n");sb.Append($"客户端[{e.ClientId}]已成功订阅主题[{e.TopicFilter.Topic}]!\r\n");}public void OnMqttServerClientUnsubscribedTopic(MqttServerClientUnsubscribedTopicEventArgs e){sb.Append($"客户端[{e.ClientId}]已成功取消订阅主题[{e.TopicFilter}]!\r\n");}public void OnMqttServer_ApplicationMessageReceived(MqttApplicationMessageReceivedEventArgs e){sb.Append($"客户端[{e.ClientId}]>> 主题:{e.ApplicationMessage.Topic} \r\n");//Console.WriteLine($"客户端[{e.ClientId}]>> 主题:{e.ApplicationMessage.Topic} 负荷:{Encoding.UTF8.GetString(e.ApplicationMessage.Payload)} Qos:{e.ApplicationMessage.QualityOfServiceLevel} 保留:{e.ApplicationMessage.Retain}");}}

客户端MQTTClients

 public class MQTTClients{private MqttClient mqttClient = null;public StringBuilder sb = new StringBuilder("");public async Task<MqttClientConnectResultCode> ClientStart(string tcpServer, int tcpPort, string mqttUser, string mqttPassword, String ClientId = "01001"){try{var mqttFactory = new MqttFactory();//https://www.cnblogs.com/zhaoqm999/p/12960677.htmlvar options = new MqttClientOptions{ClientId = ClientId,ProtocolVersion = MQTTnet.Formatter.MqttProtocolVersion.V311,ChannelOptions = new MqttClientTcpOptions{Server = tcpServer,Port = tcpPort},WillDelayInterval = 10,WillMessage = new MqttApplicationMessage(){Topic = $"LastWill/121313",Payload = Encoding.UTF8.GetBytes("I Lost the connection!" + ClientId),QualityOfServiceLevel = MqttQualityOfServiceLevel.ExactlyOnce}};if (options.ChannelOptions == null){throw new InvalidOperationException();}if (!string.IsNullOrEmpty(mqttUser)){options.Credentials = new MqttClientCredentials{Username = mqttUser,Password = Encoding.UTF8.GetBytes(mqttPassword)};}options.CleanSession = true;options.KeepAlivePeriod = TimeSpan.FromSeconds(5);mqttClient = mqttFactory.CreateMqttClient() as MqttClient;mqttClient.ConnectedHandler = new MqttClientConnectedHandlerDelegate(OnMqttClientConnected);mqttClient.DisconnectedHandler = new MqttClientDisconnectedHandlerDelegate(OnMqttClientDisConnected);mqttClient.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(OnSubscriberMessageReceived);MqttClientAuthenticateResult result =  await mqttClient.ConnectAsync(options);return result.ResultCode;}catch (Exception ex){return MqttClientConnectResultCode.ServerBusy;//lbxMonitor.BeginInvoke(_updateMonitorAction,//        Logger.TraceLog(Logger.Level.Fatal, $"客户端尝试连接出错.>{ex.Message}"));}}public async Task<int> CLientConnect(string tcpServer, int tcpPort, string mqttUser, string mqttPassword,String ClientId = "01001"){MqttClientConnectResultCode resultCode = await ClientStart(tcpServer, tcpPort, mqttUser, mqttPassword, ClientId);if(resultCode == MqttClientConnectResultCode.Success){return 0;}else{return 1;}}public async Task ClientStop(){try{if (mqttClient == null) return;await mqttClient.DisconnectAsync();mqttClient = null;}catch (Exception ex){}}public void OnMqttClientConnected(MqttClientConnectedEventArgs e){//Console.WriteLine($"客户端[{e.ClientId}]已断开连接!");//btnConnect.Text = "Connected"; ;//btnConnect.BackColor = Color.LightGreen;//btnConnect.Tag = 1;}public void OnMqttClientDisConnected(MqttClientDisconnectedEventArgs e){//Console.WriteLine($"客户端[{e.ClientId}]已断开连接!");}public async Task ClientPublishMqttTopic(string topic, string payload, int qos = 1, bool retain = false){try{var message = new MqttApplicationMessage(){Topic = topic,Payload = Encoding.UTF8.GetBytes(DateTime.Now.ToString("HH:mm:ss:ffff") + ":" + payload),QualityOfServiceLevel = (MqttQualityOfServiceLevel)qos,// cmbQos.SelectedIndex,Retain = retain//bool.Parse(cmbRetain.SelectedItem.ToString())};await mqttClient.PublishAsync(message);//lbxMonitor.BeginInvoke(_updateMonitorAction,//        Logger.TraceLog(Logger.Level.Info, string.Format("客户端[{0}]发布主题[{1}]成功!", mqttClient.Options.ClientId, topic)));}catch (Exception ex){//lbxMonitor.BeginInvoke(_updateMonitorAction,//            Logger.TraceLog(Logger.Level.Fatal, string.Format("客户端[{0}]发布主题[{1}]异常!>{2}", mqttClient.Options.ClientId, topic, ex.Message)));}}public async Task ClientSubscribeTopic(string topic){await mqttClient.SubscribeAsync(topic);//lbxMonitor.BeginInvoke(_updateMonitorAction,//        Logger.TraceLog(Logger.Level.Info, string.Format("客户端[{0}]订阅主题[{1}]成功!", mqttClient.Options.ClientId, topic)));}public async Task ClientUnSubscribeTopic(string topic){await mqttClient.UnsubscribeAsync(topic);//lbxMonitor.BeginInvoke(_updateMonitorAction,//        Logger.TraceLog(Logger.Level.Info, string.Format("客户端[{0}]取消主题[{1}]成功!", mqttClient.Options.ClientId, topic)));}/// <summary>/// 当客户端接收到所订阅的主题消息时/// </summary>/// <param name="e"></param>private void OnSubscriberMessageReceived(MqttApplicationMessageReceivedEventArgs e){string text = Encoding.UTF8.GetString(e.ApplicationMessage.Payload);string Topic = e.ApplicationMessage.Topic;string QoS = e.ApplicationMessage.QualityOfServiceLevel.ToString();string Retained = e.ApplicationMessage.Retain.ToString();Console.WriteLine(Topic +" " +text);sb.Append(DateTime.Now.ToString("HH:mm:ss:ffff") + ">>" + Topic + " " + text);//lbxMonitor.BeginInvoke(_updateMonitorAction,//        Logger.TraceLog(Logger.Level.Info, "MessageReceived >>Topic:" + Topic + "; QoS: " + QoS + "; Retained: " + Retained));//lbxMonitor.BeginInvoke(_updateMonitorAction,//        Logger.TraceLog(Logger.Level.Info, "MessageReceived >>Msg: " + text));}}

然后在Winform的界面程序中定义使用。

MQTT协议测试工具及核心代码相关推荐

  1. MQTT 及其 测试工具

    协议说明书:https://mcxiaoke.gitbooks.io/mqtt-cn/content/mqtt/04-OperationalBehavior.html 官网提供了很多的broker模拟 ...

  2. linux igmp 属于那层协议,Linux下IGMP协议测试工具的开发与应用

    摘要: 组播以其节约网络带宽.降低网络负荷,实现接收者的并行接收等优势而具有广泛的应用,成为重要的网络技术.对于组播各种应用的研究正在成为热点,对组播各种功能及性能的测试也越来越重要.IGMP (In ...

  3. MQTT协议——MQTTX工具使用

    MQTT是什么 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻 ...

  4. Packetdrill(网络协议测试工具)

    最近参加一个内核项目,需要测试linux内核tcp/ip网络代码,最终选择google的开源工具packetdrill,网上搜索了packetdrill的资料有一些,但是并不是很多,结合自己使用过程中 ...

  5. osc协议测试软件,CommsKit(协议测试工具)

    CommsKit是一个为娱乐行业设计的macOS和Windows的协议测试应用程序,通过CommsKit,你可以将MIDI.OSC.HTTP.UDP.TCP.ArtNetsACN协议的测试和监控纳入一 ...

  6. M5310A接入OneNet,基于MQTT协议测试

    该文章以下内容仅针对M5310A模块,其他模块在指令上或许会有所不同,直接进入正题. 一.测试模组介绍. 首先我测试的硬件是M5310A,直接采用移动的NB物联开发板,板载的芯片是STM32F103, ...

  7. MQTT客户端测试工具(模拟器)

    $$给个通用资源的下载地址,所有的版本,任何系统的都有.请叫我活雷锋,点点赞就好啦,哈哈! 下载地址为: https://repo.eclipse.org/content/repositories/p ...

  8. 协议测试与服务器性能测试工具 列表

    提到测试都会知道的几个工具:LoadRunner, JMeter, Apache ab ... 1 协议测试网站 protocoltesting,提供两个可参考的列表: 网络包/流量生产工具 http ...

  9. 整理的一些常见的开源测试工具

    白盒测试工具 linux c/c++内存泄露分析软件:http://valgrind.org/ c/c++单元测试:http://code.google.com/p/googletest/ http: ...

最新文章

  1. 王京春|大学生智能汽车竞赛感想
  2. jquery中动态效果
  3. 加入域时遇到“找不到网络路径”错误解决办法汇总
  4. openfire java集群_优化openfire服务器,达到单机20万,集群50万
  5. react-redux中的持久化数据存储redux-persist
  6. Enterprise Blocks
  7. Python 布尔操作(and/or,Boolean operator)与位操作(/|,Bitwise operator)
  8. 【Linux】04 实验笔记
  9. python实验总结与分析_Python程序设计实验一报告
  10. HTC One/M7 电信专版802d升级版,毒蛇工具,网络流量,永久root,加固信号稳定,流畅ROM
  11. 《量子信息与量子计算简明教程》绪论
  12. RestTemplate总结
  13. Kali新安装时软件安装及配置[自用 欢迎补充]
  14. 为什么我的订单管理里没有发货按钮?
  15. zyt-Linux云计算
  16. 如何锻炼现货白银的心态?
  17. unity 3D物体添加 点击事件
  18. 自动复制吱口令html,解密!手机自动复制“吱口令”“淘口令”陷阱,罪魁祸首就是它!...
  19. 线性动态系统LDS(别名:卡尔曼滤波)
  20. rtx3060ti参数配置

热门文章

  1. 向量空间、列空间和零空间
  2. tinymce自动获取焦点光标移至最后
  3. 解决网页背景图片高度无法达到100%平铺界面问题
  4. 斯坦福应智韬:Graph Neural Network Applications
  5. [实践]CEGUI-0.87编译
  6. 第十一章 Linux账户管理与ACL权限设置(下)
  7. JSONP跨域获取JSON数据(含jQuery方法)——李帅醒博客
  8. 结构体(对齐规则及举例)
  9. APP测试_测试点总结
  10. java使用siger 获取服务器硬件信息(CPU 内存 网络 io等)