在物聯網項目中,?處理MQTT的topic時費工費力, 代碼一團亂, 什么才是最好的姿勢?這里面我們極力介紹 MQTTnet.AspNetCore.Routing ?項目,MQTTnet AspNetCore Routing 是https://github.com/Atlas-LiftTech/MQTTnet.AspNetCore.AttributeRouting 的分支項目。這個組件是通過MQTTnet 實現了定義控制類和屬性來路由處理消息的topic , 就像Asp.Net Core 的WebApi 寫法一樣簡單容易。?
為什么要用這個庫?
這個庫完全是一個MQTTnet的可選擴展?,但如果你恰好有如下需求:
你的主要需求是在服務器上驗證和處理MQTT消息。
你的服務器并不主要用于向客戶端發送消息。?
您喜歡以類似于 AspNetCore 和 WebAPI 的方式將消息處理邏輯封裝在控制器中。
您可以自己使用 MQTTnet 委托直接執行此插件執行的所有操作。但是,隨著您為驗證或處理傳入消息而編寫的邏輯量增加,將邏輯組織到控制器中的能力開始變得更加有意義。該庫有助于組織該代碼,并將依賴項注入框架整合到MQTTnet中。
功能
將傳入消息邏輯封裝在控制器中
在 MQTT 邏輯中使用 AspNetCore 中熟悉的范例(Controllers 和?Actions)
在 AspNetCore 項目中使用現有的 ServiceProvider 實現對依賴注入的一流支持
支持控制器上的同步和async/await操作
與任何其他 MQTTnet 選項一起使用
性能說明
此庫尚未針對非常高負載的環境進行測試。確保在生產中使用之前執行自己的負載測試。歡迎所有性能改進 PR。
支持的框架
.NET Standard 2.0+
.NET Core 3.1+
支持的MQTT版本
5.0.0
3.1.1
3.1.0
Nuget 和倉庫地址
Nutget:?https://www.nuget.org/packages/MQTTnet.AspNetCore.Routing/
https://gitee.com/IoTSharp/MQTTnet.AspNetCore.Routing
https://github.com/IoTSharp/MQTTnet.AspNetCore.Routing
使用方法
從nuget安裝此包和MQTTnet。dotnet CLI:
dotnet add package MQTTnet.AspNetCore.Routing
?ASP.NET Core 6 MVC 配置示例
using MQTTnet.AspNetCore;
using MQTTnet.AspNetCore.Routing;var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(o =>{o.ListenAnyIP(iotaboardMqttSettings.Port, l => l.UseMqtt());o.ListenAnyIP(iotaboardHttpSettings.Port);}
);//配置MQTT服務
builder.Services.AddHostedMqttServerWithServices(o =>{// other configurationso.WithoutDefaultEndpoint();}).AddMqttConnectionHandler().AddConnections().AddMqttControllers( // <== NOTICE THIS PART/*默認情況下,所有控制類在這里都會被自動發現, 那么這里就是空的, 但是這里也提供了加入其他程序集的方法。*/); var app = builder.Build();app.MapControllers();
app.UseMqttServer(server => { // other MqttServer configurations, for example client connect interceptsserver.WithAttributeRouting(app.Services, allowUnmatchedRoutes: false);
});
app.Run();
創建你的控制器, 集成?MqttBaseController 并添加方法像下面這樣:
[MqttController]
[MqttRoute("[controller]")] // 指定控制類topic 。
public class MqttWeatherForecastController : MqttBaseController
{private readonly ILogger<MqttWeatherForecastController> _logger;// Controllers支持完整的注入依賴, 就像AspNetCore 控制器一樣。public MqttWeatherForecastController(ILogger<MqttWeatherForecastController> logger){_logger = logger;}//支持模板路由和類型定義就像AspNetCore一樣。// Action 路由與控制器級別的路由前綴一起組成[MqttRoute("{zipCode:int}/temperature")]public Task WeatherReport(int zipCode){// 我們這里可以直接訪問MqttContextif (zipCode != 90210) { MqttContext.CloseConnection = true; }// 我們可以直接訪問原始數據var temperature = BitConverter.ToDouble(Message.Payload);_logger.LogInformation($"It's {temperature} degrees in Hollywood");// 規則判斷if (temperature <= 0 || temperature >= 130){return BadMessage();}return Ok();}//我們也支持 FromPayload , 就像 AspNetCore中的FromBody 一樣。[MqttRoute("viewmodel/{sender}")]public Task DeserializeViewModel(string sender, [FromPayload] SamplePayload payload){_logger.LogInformation("{Sender} says {Message}", sender, payload.Message);? ? ? ? ????return Accepted();}
}
public class SamplePayload
{public string Message { get; set; }
}