You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

364 line
24 KiB

  1. // Licensed to the .NET Foundation under one or more agreements.
  2. // The .NET Foundation licenses this file to you under the MIT license.
  3. // See the LICENSE file in the project root for more information.
  4. using System;
  5. using System.Diagnostics;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading;
  9. using System.Threading.Tasks;
  10. using MQTTnet.Client;
  11. using MQTTnet.Protocol;
  12. using MQTTnet.Server;
  13. using MqttClient = MQTTnet.Client.MqttClient;
  14. namespace MQTTnet.TestApp
  15. {
  16. public static class PerformanceTest
  17. {
  18. public static void RunClientOnly()
  19. {
  20. try
  21. {
  22. var options = new MqttClientOptions
  23. {
  24. ChannelOptions = new MqttClientTcpOptions
  25. {
  26. Server = "127.0.0.1"
  27. },
  28. CleanSession = true
  29. };
  30. var client = new MqttFactory().CreateMqttClient();
  31. client.ConnectAsync(options).GetAwaiter().GetResult();
  32. var message = CreateMessage();
  33. var stopwatch = new Stopwatch();
  34. for (var i = 0; i < 10; i++)
  35. {
  36. var sentMessagesCount = 0;
  37. stopwatch.Restart();
  38. while (stopwatch.ElapsedMilliseconds < 1000)
  39. {
  40. client.PublishAsync(message).GetAwaiter().GetResult();
  41. sentMessagesCount++;
  42. }
  43. Console.WriteLine($"Sending {sentMessagesCount} messages per second. #" + (i + 1));
  44. GC.Collect();
  45. }
  46. }
  47. catch (Exception exception)
  48. {
  49. Console.WriteLine(exception);
  50. }
  51. }
  52. public static async Task RunClientAndServer()
  53. {
  54. try
  55. {
  56. var mqttFactory = new MqttFactory();
  57. var mqttServerOptions = new MqttServerOptionsBuilder().WithDefaultEndpoint().Build();
  58. var mqttServer = mqttFactory.CreateMqttServer(mqttServerOptions);
  59. await mqttServer.StartAsync().ConfigureAwait(false);
  60. var options = new MqttClientOptions
  61. {
  62. ChannelOptions = new MqttClientTcpOptions
  63. {
  64. Server = "127.0.0.1"
  65. }
  66. };
  67. var client = mqttFactory.CreateMqttClient();
  68. await client.ConnectAsync(options).ConfigureAwait(false);
  69. var message = new MqttApplicationMessageBuilder().WithTopic("t")
  70. .Build();
  71. var stopwatch = new Stopwatch();
  72. for (var i = 0; i < 10; i++)
  73. {
  74. stopwatch.Restart();
  75. var sentMessagesCount = 0;
  76. while (stopwatch.ElapsedMilliseconds < 1000)
  77. {
  78. await client.PublishAsync(message, CancellationToken.None).ConfigureAwait(false);
  79. sentMessagesCount++;
  80. }
  81. Console.WriteLine($"Sending {sentMessagesCount} messages per second. #" + (i + 1));
  82. }
  83. }
  84. catch (Exception exception)
  85. {
  86. Console.WriteLine(exception);
  87. }
  88. }
  89. static Task RunClientsAsync(int msgChunkSize, TimeSpan interval, bool concurrent)
  90. {
  91. return Task.WhenAll(Enumerable.Range(0, 3).Select(i => Task.Run(() => RunClientAsync(msgChunkSize, interval, concurrent))));
  92. }
  93. static async Task RunClientAsync(int msgChunkSize, TimeSpan interval, bool concurrent)
  94. {
  95. try
  96. {
  97. var options = new MqttClientOptions
  98. {
  99. ChannelOptions = new MqttClientTcpOptions { Server = "localhost" },
  100. ClientId = "Client1",
  101. CleanSession = true
  102. };
  103. var client = new MqttFactory().CreateMqttClient();
  104. try
  105. {
  106. await client.ConnectAsync(options).ConfigureAwait(false);
  107. }
  108. catch (Exception exception)
  109. {
  110. Console.WriteLine("### CONNECTING FAILED ###" + Environment.NewLine + exception);
  111. }
  112. var message = CreateMessage();
  113. var stopwatch = Stopwatch.StartNew();
  114. var testMessageCount = 10000;
  115. for (var i = 0; i < testMessageCount; i++)
  116. {
  117. await client.PublishAsync(message);
  118. }
  119. stopwatch.Stop();
  120. Console.WriteLine($"Sent 10.000 messages within {stopwatch.ElapsedMilliseconds} ms ({stopwatch.ElapsedMilliseconds / (float)testMessageCount} ms / message).");
  121. var last = DateTime.Now;
  122. var msgCount = 0;
  123. while (true)
  124. {
  125. var msgs = Enumerable.Range(0, msgChunkSize)
  126. .Select(i => CreateMessage())
  127. .ToList();
  128. if (concurrent)
  129. {
  130. //send concurrent (test for raceconditions)
  131. var sendTasks = msgs
  132. .Select(msg => PublishSingleMessage(client, msg, ref msgCount))
  133. .ToList();
  134. await Task.WhenAll(sendTasks);
  135. }
  136. else
  137. {
  138. foreach (var msg in msgs)
  139. {
  140. await client.PublishAsync(msg);
  141. msgCount += msgs.Count;
  142. //send multiple
  143. }
  144. }
  145. var now = DateTime.Now;
  146. if (last < now - TimeSpan.FromSeconds(1))
  147. {
  148. Console.WriteLine($"sending {msgCount} intended {msgChunkSize / interval.TotalSeconds}");
  149. msgCount = 0;
  150. last = now;
  151. }
  152. await Task.Delay(interval).ConfigureAwait(false);
  153. }
  154. }
  155. catch (Exception exception)
  156. {
  157. Console.WriteLine(exception);
  158. }
  159. }
  160. static MqttApplicationMessage CreateMessage()
  161. {
  162. //const string Payload = "###############################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################"
  163. //const string Payload = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
  164. const string Payload = "Hello World";
  165. return new MqttApplicationMessage
  166. {
  167. Topic = "A/B/C",
  168. Payload = Encoding.UTF8.GetBytes(Payload),
  169. QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce
  170. };
  171. }
  172. static Task PublishSingleMessage(MqttClient client, MqttApplicationMessage applicationMessage, ref int count)
  173. {
  174. Interlocked.Increment(ref count);
  175. return Task.Run(() => client.PublishAsync(applicationMessage));
  176. }
  177. public static async Task RunQoS2Test()
  178. {
  179. try
  180. {
  181. var mqttServer = new MqttFactory().CreateMqttServer(new MqttServerOptions());
  182. await mqttServer.StartAsync();
  183. var options = new MqttClientOptions
  184. {
  185. ChannelOptions = new MqttClientTcpOptions
  186. {
  187. Server = "127.0.0.1"
  188. },
  189. CleanSession = true
  190. };
  191. var client = new MqttFactory().CreateMqttClient();
  192. await client.ConnectAsync(options);
  193. var message = new MqttApplicationMessage
  194. {
  195. Topic = "A/B/C",
  196. Payload = Encoding.UTF8.GetBytes("Hello World"),
  197. QualityOfServiceLevel = MqttQualityOfServiceLevel.ExactlyOnce
  198. };
  199. var stopwatch = new Stopwatch();
  200. var iteration = 1;
  201. while (true)
  202. {
  203. var sentMessagesCount = 0;
  204. stopwatch.Restart();
  205. while (stopwatch.ElapsedMilliseconds < 1000)
  206. {
  207. await client.PublishAsync(message).ConfigureAwait(false);
  208. sentMessagesCount++;
  209. }
  210. Console.WriteLine($"Sent {sentMessagesCount} messages in iteration #" + iteration);
  211. iteration++;
  212. }
  213. }
  214. catch (Exception exception)
  215. {
  216. Console.WriteLine(exception);
  217. }
  218. }
  219. public static async Task RunQoS1Test()
  220. {
  221. try
  222. {
  223. var mqttServer = new MqttFactory().CreateMqttServer(new MqttServerOptions());
  224. await mqttServer.StartAsync();
  225. var options = new MqttClientOptions
  226. {
  227. ChannelOptions = new MqttClientTcpOptions
  228. {
  229. Server = "127.0.0.1"
  230. },
  231. CleanSession = true
  232. };
  233. var client = new MqttFactory().CreateMqttClient();
  234. await client.ConnectAsync(options);
  235. var message = new MqttApplicationMessage
  236. {
  237. Topic = "A/B/C",
  238. Payload = Encoding.UTF8.GetBytes("Hello World"),
  239. QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce
  240. };
  241. var stopwatch = new Stopwatch();
  242. var iteration = 1;
  243. while (true)
  244. {
  245. var sentMessagesCount = 0;
  246. stopwatch.Restart();
  247. while (stopwatch.ElapsedMilliseconds < 1000)
  248. {
  249. await client.PublishAsync(message).ConfigureAwait(false);
  250. sentMessagesCount++;
  251. }
  252. Console.WriteLine($"Sent {sentMessagesCount} messages in iteration #" + iteration);
  253. iteration++;
  254. }
  255. }
  256. catch (Exception exception)
  257. {
  258. Console.WriteLine(exception);
  259. }
  260. }
  261. public static async Task RunQoS0Test()
  262. {
  263. try
  264. {
  265. //var mqttServer = new MqttFactory().CreateMqttServer();
  266. //await mqttServer.StartAsync(new MqttServerOptions());
  267. var options = new MqttClientOptions
  268. {
  269. ChannelOptions = new MqttClientTcpOptions
  270. {
  271. Server = "127.0.0.1"
  272. },
  273. CleanSession = true
  274. };
  275. var client = new MqttFactory().CreateMqttClient();
  276. await client.ConnectAsync(options);
  277. var message = new MqttApplicationMessage
  278. {
  279. Topic = "A/B/C",
  280. Payload = Encoding.UTF8.GetBytes("Hello World"),
  281. QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce
  282. };
  283. var stopwatch = new Stopwatch();
  284. var iteration = 1;
  285. while (true)
  286. {
  287. var sentMessagesCount = 0;
  288. stopwatch.Restart();
  289. while (stopwatch.ElapsedMilliseconds < 1000)
  290. {
  291. await client.PublishAsync(message).ConfigureAwait(false);
  292. sentMessagesCount++;
  293. }
  294. Console.WriteLine($"Sent {sentMessagesCount} messages in iteration #" + iteration);
  295. iteration++;
  296. }
  297. }
  298. catch (Exception exception)
  299. {
  300. Console.WriteLine(exception);
  301. }
  302. }
  303. }
  304. }