wtm 的netcore web中 增加一个MQTT服务,这样如果后端数据想要快速的绕过 API的限制 达到前端 就成为了可能,一些不敏感的数据可以如此下放到客户端,或者页面通过MQTT数据来着展示数据成为可能。有的宝宝就好奇了,说“MQTT是TCP协议, 你弄个网页websocket协议 这都不通 你怎么做到的?”
哈哈哈,这就是做到了,并且还很好用,接下来你试试就知道了,全网也没几个能理解的(吹牛了哈。。。)
接下来就看看如何实现(netcore 3.1项目):
第一步,首先给WTM项目应用一个nuget包 mqttnet
第二部,关键来了,开始写代码:
public static IHostBuilder CreateWebHostBuilder(string[] args)
{
return
Host.CreateDefaultBuilder(args)
.ConfigureLogging((hostingContext, logging) =>
{
logging.ClearProviders();
logging.AddConsole();
logging.AddDebug();
logging.AddWTMLogger();
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.ConfigureServices(x =>
{
x.AddFrameworkService();
x.AddMqttTcpServerAdapter();
x.AddHostedMqttServer()
.AddMqttConnectionHandler()
.AddConnections();
x.AddCors(options =>
{
options.AddPolicy("mqtt", builder =>
{
builder.AllowAnyOrigin() //允许任何来源的主机访问
//builder.WithOrigins("http://localhost:8080") 允许http://localhost:8080的主机访问
.AllowAnyMethod()
.AllowAnyHeader();
//.AllowCredentials();//指定处理cookie
});
});
x.AddCors(options =>
{
options.AddPolicy("all", builder =>
{
builder.SetIsOriginAllowed(_ => true) //允许任何来源的主机访问
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials();//指定处理cookie
});
});
x.AddLayui();
x.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
var bearer = new OpenApiSecurityScheme()
{
Description = "JWT Bearer",
Name = "Authorization",
In = ParameterLocation.Header,
Type = SecuritySchemeType.ApiKey
};
c.AddSecurityDefinition("Bearer", bearer);
var sr = new OpenApiSecurityRequirement();
sr.Add(new OpenApiSecurityScheme
{
Reference = new OpenApiReference
{
Type = ReferenceType.SecurityScheme,
Id = "Bearer"
}
}, new string[] { });
c.AddSecurityRequirement(sr);
});
x.AddSpaStaticFiles(configuration =>
{
configuration.RootPath = "ClientApp/dist";
});
});
webBuilder.Configure(x =>
{
var env = x.ApplicationServices.GetService<IWebHostEnvironment>();
x.UseSwagger();
x.UseCors("all");
x.UseCors("mqtt");
x.UseMqttEndpoint("/mqtt");
x.UseMqttServer(server =>
{
server.StartedHandler = new MqttServerStartedHandlerDelegate(async args =>
{
});
server.ClientConnectedHandler = new MqttServerClientConnectedHandlerDelegate(async args =>
{
Console.WriteLine(args.ClientId.ToString());
});
}
x.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
});
if (env.IsDevelopment())
{
x.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
{
HotModuleReplacement = false,
ConfigFile = "config/webpack.dev.js",
ProjectPath = System.IO.Path.Combine(env.ContentRootPath, "ClientApp/")
});
}
x.UseSpaStaticFiles();
x.UseFrameworkService();
});
}
);
}
不得不说WTM真是方便,在webBuilder.ConfigureServices 和webBuilder.Configure里边增加MQTT对应的配置就好了。至于端口什么的我就不详细说了,目前只是在http端口有效。IIS express 和 host self 都支持运行。
下边这个就是在实验过程中做的一个页面,给展示一下用WTM跑起来的一个页面中订阅了WTM后台咱们增加的MQTT服务,他可以订阅到 后台设备提供的 温湿度 和PM25 等: