找回密码
 会员注册
查看: 183|回复: 0

MQTT学习(七)--使用MQTTNet+ASP.NET Core创建MQTT服务器(broker)

[复制链接]

250

主题

1

回帖

819

积分

管理员

积分
819
发表于 2024-2-29 08:26:10 | 显示全部楼层 |阅读模式

经过漫长的等待,MQTT专题终于等到了第七篇,本次将在ASP.NET Core框架下利用MQTTnet创建自有服务器。


由于最近刚开始接触ASP.NET Core,很多具体的用法还没有研究透彻,所以本篇重点在核心的几段代码,示例参考了MQTTnet官方源码。

本示例将融合ASP.NET Core WebAPI,以便在API接口调用中实现消息推送。

1.创建项目并引用MQTTnet

在这里插入图片描述

在VS2017中新建ASP.NET Core Web应用程序,打开NuGet管理器,搜索并安装MQTTnet.AspNetCore。

2.实现MQTT服务器功能

2.1.启动配置项-Startup.cs
  1. public class Startup
  2. {
  3. public Startup(IConfiguration configuration)
  4. {
  5. Configuration = configuration;
  6. }
  7. public IConfiguration Configuration { get; }
  8. // This method gets called by the runtime. Use this method to add services to the container.
  9. public void ConfigureServices(IServiceCollection services)
  10. {
  11. services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
  12. #region MQTT配置
  13. string hostIp = Configuration["MqttOption:HostIp"];//IP地址
  14. int hostPort = int.Parse(Configuration["MqttOption:HostPort"]);//端口号
  15. int timeout = int.Parse(Configuration["MqttOption:Timeout"]);//超时时间
  16. string username = Configuration["MqttOption:UserName"];//用户名
  17. string password = Configuration["MqttOption:Password"];//密码
  18. //构建配置项
  19. var optionBuilder = new MqttServerOptionsBuilder()
  20. .WithDefaultEndpointBoundIPAddress(System.Net.IPAddress.Parse(hostIp))
  21. .WithDefaultEndpointPort(hostPort)
  22. .WithDefaultCommunicationTimeout(TimeSpan.FromMilliseconds(timeout))
  23. .WithConnectionValidator(t =>
  24. {
  25. if (t.Username != username || t.Password != password)
  26. {
  27. t.ReturnCode = MqttConnectReturnCode.ConnectionRefusedBadUsernameOrPassword;
  28. }
  29. t.ReturnCode = MqttConnectReturnCode.ConnectionAccepted;
  30. });
  31. var option = optionBuilder.Build();
  32. //服务注入
  33. services
  34. .AddHostedMqttServer(option)
  35. .AddMqttConnectionHandler()
  36. .AddConnections();
  37. #endregion
  38. }
  39. // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
  40. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  41. {
  42. if (env.IsDevelopment())
  43. {
  44. app.UseDeveloperExceptionPage();
  45. }
  46. app.UseMvc();
  47. app.UseConnections(c => c.MapConnectionHandler<MqttConnectionHandler>("/data", options =>
  48. {
  49. options.WebSockets.SubProtocolSelector = MQTTnet.AspNetCore.ApplicationBuilderExtensions.SelectSubProtocol;
  50. }));
  51. app.UseMqttEndpoint("/data");
  52. //MQTT声明周期事件
  53. app.UseMqttServer(server =>
  54. {
  55. //服务启动事件
  56. server.Started += async (sender, args) =>
  57. {
  58. var msg = new MqttApplicationMessageBuilder().WithPayload("welcome to mqtt").WithTopic("start");
  59. while (true)
  60. {
  61. try
  62. {
  63. await server.PublishAsync(msg.Build());
  64. msg.WithPayload("you are welcome to mqtt");
  65. }
  66. catch (Exception e)
  67. {
  68. Console.WriteLine(e);
  69. }
  70. finally
  71. {
  72. await Task.Delay(TimeSpan.FromSeconds(5));
  73. }
  74. }
  75. };
  76. //服务停止事件
  77. server.Stopped += (sender, args) =>
  78. {
  79. };
  80. //客户端连接事件
  81. server.ClientConnected += (sender, args) =>
  82. {
  83. var clientId = args.ClientId;
  84. };
  85. //客户端断开事件
  86. server.ClientDisconnected += (sender, args) =>
  87. {
  88. var clientId = args.ClientId;
  89. };
  90. });
  91. }
  92. }
复制代码
2.2.配置文件-appsetting.json
  1. {
  2. "Logging": {
  3. "LogLevel": {
  4. "Default": "Warning"
  5. }
  6. },
  7. "AllowedHosts": "*",
  8. "MqttOption": {
  9. "HostIp": "127.0.0.1",
  10. "HostPort": 61613,
  11. "Timeout": 5000,
  12. "UserName": "admin",
  13. "Password": "passwod"
  14. }
  15. }
复制代码
2.3.程序入口-Program.cs
  1. public class Program
  2. {
  3. public static void Main(string[] args)
  4. {
  5. CreateWebHostBuilder(args).Build().Run();
  6. //上述方法与下方注释代码效果一致
  7. //WebHost
  8. // .CreateDefaultBuilder(args)
  9. // .UseKestrel()
  10. // .UseStartup<Startup>()
  11. // .Build()
  12. // .Run();
  13. }
  14. public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
  15. WebHost.CreateDefaultBuilder(args)
  16. .UseKestrel(o =>
  17. {
  18. o.ListenAnyIP(61613, m => m.UseMqtt());//绑定MQTT服务端口
  19. //o.ListenAnyIP(5000);
  20. })
  21. .UseStartup<Startup>();
  22. }
复制代码

3.在API接口中使用MQTT服务

由于ASP.NET Core使用依赖注入(Dependency Injection)来实现控制反转(IoC),MQTTServer正是通过依赖注入添加到应用程序的服务集合中去,同样通过ASP.NET Core中的机制可以在API控制器类中获取当前实例中的MQTT服务。具体实现要借助接口IServiceProvider。创建一个辅助类如下:

  1. public static class ServiceLocator
  2. {
  3. public static IServiceProvider Instance { get; set; }
  4. }
复制代码

在Startup类的Configure方法中添加如下代码:

  1. //获取当前应用的服务集合
  2. ServiceLocator.Instance = app.ApplicationServices;
复制代码

在API控制器中就可以通过ServiceLocator获取服务并使用了。

  1. [Route("v1/api/values")]
  2. [ApiController]
  3. public class ValuesController : RootController
  4. {
  5. public string Test()
  6. {
  7. string result = "";
  8. //从服务集合中获取MQTT服务
  9. var service = ServiceLocator.Instance.GetService(typeof(MQTTnet.Server.MqttServer));
  10. var messager = (MQTTnet.Server.MqttServer)service;
  11. //这里你可以构建消息并发布
  12. return result;
  13. }
  14. }
复制代码

示例代码

经过上述过程中的探索研究,虽然暂未实现图形化界面,但基本了解了如何使用ASP.NET Core构建MQTT代理服务器,同时掌握了在API接口中使用MQTT服务的方法,后续将做更深一步的研究。


来源:https://blog.csdn.net/lordwish/article/details/86708777
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?会员注册

×
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2024-12-27 01:59 , Processed in 0.450714 second(s), 27 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表