惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

月光博客
月光博客
Stack Overflow Blog
Stack Overflow Blog
L
LangChain Blog
Jina AI
Jina AI
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
雷峰网
雷峰网
T
Tailwind CSS Blog
MongoDB | Blog
MongoDB | Blog
博客园 - 【当耐特】
博客园 - 聂微东
V
Visual Studio Blog
博客园_首页
Engineering at Meta
Engineering at Meta
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
The Cloudflare Blog
人人都是产品经理
人人都是产品经理
Apple Machine Learning Research
Apple Machine Learning Research
阮一峰的网络日志
阮一峰的网络日志
Microsoft Security Blog
Microsoft Security Blog
GbyAI
GbyAI
F
Fortinet All Blogs
C
Check Point Blog
罗磊的独立博客
H
Hackread – Cybersecurity News, Data Breaches, AI and More

博客园 - 麦壳饼

JekyllNet .Net 版本的Jekyll , 你博客 文档的静态生成利器 。 为什么要做 WinForms over LVGL 我把 WinFormsVncDemo 真正带到了 VNC 链路上 Ubuntu 22.04 systemd 升级失败解决全记录:dpkg “无效的跨设备链接” 错误(bind mount 导致) .Net 7.0 AOT /usr/bin/ld: cannot find -lz 暴力升级你的 ST-Link 及 STM32CubeIDE 龙芯.Net 6.0 SDK安装 用C#为国产智能手表写“Hello, China. ” CANopen伺服控制-服务数据对象(SDO)详细解析 IoTSharp部署教程-Sqlite分表篇 IoTSharp 已支持国产松果时序数据库PinusDB IoTSharp v1.6.0 发布 增加多种数据库支持 Cannot open libmwv206dec.so, libmwv206dec.so: cannot open shared object file: No such file or directory 引用了Maikebing.Data.Taos的.Net Core项目,在 docker 部署的时候提示缺少taos依赖 基于.Net Core开发的物联网平台 IoTSharp V1.5 发布 如何在龙芯3B4000上部署基于.Net Core 开发的物联网平台IoTSharp 使用C#编写STM32对接物联网平台IoTSharp发送遥测数据 用C#在STM32上写第一个Hello world SilkierQuartz 1.0.21 发布, 是一个 Quartz.NET 的强大且简单的Web管理工具和承载组件
如何像使用AspNetCore中的Controllers 和 Actions一样处理MQT...
麦壳饼 · 2022-11-17 · via 博客园 - 麦壳饼

在物联网项目中, 处理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 configurations
        o.WithoutDefaultEndpoint();
    })
    .AddMqttConnectionHandler()
    .AddConnections()
    .AddMqttControllers( // <== NOTICE THIS PART
    /*
       默认情况下,所有控制类在这里都会被自动发现, 那么这里就是空的, 但是这里也提供了加入其他程序集的方法。
    */); 
    
var app = builder.Build();

app.MapControllers();
app.UseMqttServer(server => {  
    // other MqttServer configurations, for example client connect intercepts
    server.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)
    {
        // 我们这里可以直接访问MqttContext
        if (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; }

}

还有关注我们的公众号