当前位置: 首页 > news >正文

MQTTnet.Server同时支持mqtt及websocket协议

Net6后写法

 Net6前写法

Program.cs

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using MQTTnet.AspNetCore;
using System;
using System.IO;namespace MQTTnet.Server
{public class Program{public static int WebPort { get; set; } public static void Main(string[] args){var configuration = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json").Build();var appSettings = configuration.GetSection("AppSettings");WebPort = Convert.ToInt32(appSettings["WebPort"]);  CreateHostBuilder(args).Build().Run();}public static IHostBuilder CreateHostBuilder(string[] args){ return Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder => {webBuilder.UseKestrel(o =>{o.ListenAnyIP(2883, l => l.UseMqtt());o.ListenAnyIP(WebPort); // http & websocket});webBuilder.UseStartup<Startup>();});}}
}

Startup.cs

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using MQTTnet.AspNetCore;
using MQTTnet.Server.Util.mqtt;
using System.Linq;namespace MQTTnet.Server
{public class Startup{public Startup(IConfiguration configuration){Configuration = configuration;}public IConfiguration Configuration { get; }public void ConfigureServices(IServiceCollection services){services.AddControllers();MQServer.UserName = "admin";MQServer.Password = "123456";services.AddHostedMqttServer(optionsBuilder =>{optionsBuilder.WithMaxPendingMessagesPerClient(10000)//限制每个客户端连接在 MQTT 代理上可以拥有的待处理消息数量的设置,默认值是100 .WithKeepAlive();});services.AddMqttConnectionHandler();services.AddConnections();services.AddSingleton<MQServer>();}// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.public void Configure(IApplicationBuilder app, IWebHostEnvironment env, MQServer mqttController){ if (env.IsDevelopment()){app.UseDeveloperExceptionPage();} app.UseRouting();app.UseEndpoints(endpoints =>{ endpoints.MapControllerRoute(name: "default", pattern: "{controller=Demo}/{action=Info}/{id?}");//endpoints.MapConnectionHandler<MqttConnectionHandler>("/mqtt",httpConnectionDispatcherOptions => httpConnectionDispatcherOptions.WebSockets.SubProtocolSelector =protocolList => protocolList.FirstOrDefault() ?? string.Empty);});app.UseMqttServer(server =>{ server.ValidatingConnectionAsync += MQServer.ValidateConnectionAsync;server.ClientConnectedAsync += MQServer.ClientConnectedAsync;server.ClientDisconnectedAsync += MQServer.ClientDisconnectedAsync;});}}
}

MQServer.cs

using MQTTnet.Protocol;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;namespace MQTTnet.Server.Util.mqtt
{public class MQServer{ public static string UserName { get; set; } = "admin";public static string Password { get; set; } = "123456"; static readonly HashSet<string> clientIds = new();/// <summary>/// Validates the MQTT connection./// </summary>/// <param name="args">The arguments.</param>public static Task ValidateConnectionAsync(ValidatingConnectionEventArgs args){try{if (string.IsNullOrWhiteSpace(args.UserName)){args.ReasonCode = MqttConnectReasonCode.BadUserNameOrPassword;Logger.Error($"MQServer,身份校验失败(用户名为空),ClientId:{args.ClientId}");return Task.CompletedTask;}if (clientIds.TryGetValue(args.ClientId, out var _)){args.ReasonCode = MqttConnectReasonCode.ClientIdentifierNotValid;Logger.Error($"MQServer,身份校验失败(有相同clientid已连接),ClientId:{args.ClientId}");return Task.CompletedTask;}if (args.UserName != UserName || args.Password != Password){args.ReasonCode = MqttConnectReasonCode.BadUserNameOrPassword;Logger.Error($"MQServer,身份校验失败(用户名或密码错误),ClientId:{args.ClientId},UserName:{args.UserName},Password:{args.Password}");return Task.CompletedTask;} args.ReasonCode = MqttConnectReasonCode.Success; return Task.CompletedTask;}catch (Exception ex){ Logger.Error("MQServer,ValidateConnectionAsync", ex);return Task.FromException(ex);}}public static async Task ClientConnectedAsync(ClientConnectedEventArgs args){Logger.Info($"MQServer,mqtt客户端上线,id:{args.ClientId},Endpoint:{args.Endpoint},ProtocolVersion:{args.ProtocolVersion}");clientIds.Add(args.ClientId); }/// <summary>/// Handles the client connected event./// </summary>/// <param name="args">The arguments.</param>public static async Task ClientDisconnectedAsync(ClientDisconnectedEventArgs args){Logger.Error($"MQServer,mqtt客户端离线,id:{args.ClientId},Endpoint:{args.Endpoint},DisconnectType:{args.DisconnectType},ReasonString:{args.ReasonCode}");clientIds.Remove(args.ClientId); }}
}

http://www.lryc.cn/news/460867.html

相关文章:

  • 【数据结构】二叉树(一)遍历
  • 【C++ 贪心】1616. 分割两个字符串得到回文串|1868
  • 识别秒拨风险的具体方法及策略
  • [Python]如何在Ubuntu中建置python venv虛擬環境,並安裝TensorFlow和OpenCV函式庫?
  • Excel:Cells(Rows.Count, 1).End(xlUp).Row和Cells(Rows.Count, 1).End(xlUp)有什么区别
  • E. Count Paths
  • 集合论(ZFC)之良创关系(Well-Founded Relation)
  • centos 安装达梦数据库
  • 《Windows PE》6.4.1 无 DLL远程注入
  • 浙大数据结构:10-排序6 Sort with Swap(0, i)
  • 基于vue框架的的爱心捐赠物资信息系统85gsu(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
  • AI对抗AI:如何应对自动化攻击新时代?
  • 【微服务】微服务注册:构建灵活的服务管理机制
  • AsyncTask的工作原理和缺陷
  • 【React】事件绑定的方式
  • Android ImageView scaleType使用
  • 【PhpSpreadsheet】ThinkPHP5+PhpSpreadsheet实现批量导出数据
  • Python剪辑视频
  • LabVIEW提高开发效率技巧----高效文件I/O
  • 影刀RPA接口_查询应用主流程参数结构
  • 2d实时数字人聊天语音对话使用案例,对接大模型
  • LeetCode | 69.x的平方根
  • 使用Windows创建一个MFC应用【带界面】
  • springboot整合lombok
  • 使用Arcgis批量自动出图
  • Web Worker加载外部文件实践
  • 2024年中国工业大模型行业发展研究报告|附43页PDF文件下载
  • 99. UE5 GAS RPG 被动技能实现
  • U盘装系统,使用U盘启动,提示需要装驱动
  • gaussdb 主备 8 数据库安全学习