经过漫长的等待,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
2.2.配置文件-appsetting.json - {
- "Logging": {
- "LogLevel": {
- "Default": "Warning"
- }
- },
- "AllowedHosts": "*",
- "MqttOption": {
- "HostIp": "127.0.0.1",
- "HostPort": 61613,
- "Timeout": 5000,
- "UserName": "admin",
- "Password": "passwod"
- }
- }
复制代码
2.3.程序入口-Program.cs - public class Program
- {
- public static void Main(string[] args)
- {
- CreateWebHostBuilder(args).Build().Run();
- //上述方法与下方注释代码效果一致
- //WebHost
- // .CreateDefaultBuilder(args)
- // .UseKestrel()
- // .UseStartup<Startup>()
- // .Build()
- // .Run();
- }
- public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
- WebHost.CreateDefaultBuilder(args)
- .UseKestrel(o =>
- {
- o.ListenAnyIP(61613, m => m.UseMqtt());//绑定MQTT服务端口
- //o.ListenAnyIP(5000);
- })
- .UseStartup<Startup>();
- }
复制代码
3.在API接口中使用MQTT服务
由于ASP.NET Core使用依赖注入(Dependency Injection)来实现控制反转(IoC),MQTTServer正是通过依赖注入添加到应用程序的服务集合中去,同样通过ASP.NET Core中的机制可以在API控制器类中获取当前实例中的MQTT服务。具体实现要借助接口IServiceProvider。创建一个辅助类如下: - public static class ServiceLocator
- {
- public static IServiceProvider Instance { get; set; }
- }
复制代码
在Startup类的Configure方法中添加如下代码: - //获取当前应用的服务集合
- ServiceLocator.Instance = app.ApplicationServices;
复制代码
在API控制器中就可以通过ServiceLocator获取服务并使用了。 - [Route("v1/api/values")]
- [ApiController]
- public class ValuesController : RootController
- {
- public string Test()
- {
- string result = "";
- //从服务集合中获取MQTT服务
- var service = ServiceLocator.Instance.GetService(typeof(MQTTnet.Server.MqttServer));
- var messager = (MQTTnet.Server.MqttServer)service;
-
- //这里你可以构建消息并发布
- return result;
- }
- }
复制代码
示例代码
经过上述过程中的探索研究,虽然暂未实现图形化界面,但基本了解了如何使用ASP.NET Core构建MQTT代理服务器,同时掌握了在API接口中使用MQTT服务的方法,后续将做更深一步的研究。 来源:https://blog.csdn.net/lordwish/article/details/86708777 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |