想一想都快两年没有编写代码,这公众号也快有两年没更新了,人闲久了总想找些活干,为了保持代码编写技能于是把之前写的MQTT协议扩展出一个网关服务,并实现对3.X和5.0协议版本的支持。作为一个服务网关在性能上也是有着一定的要求,其实现目标能支持数十万的消息订阅转发。
简介
项目是基于BeetleX通讯组件扩展的MQTT协议通讯服务,服务包括两大模块分别是:BeetleX.MQTT.Protocols和BeetleX.MQTT.Server。前者是对MQTT通讯协议的实现,分别实现了V3.X和V5.0两个版本;而后者则是网关服务的实现并集成了基础的管理界面,两个项目都是都提供了完整的实现代码并存放在Gitub上。
项目开源地址:github.com/beetlex-io/mqtt
运行项目
项目的运行非常简单,只需要创建一个控制台项目并在Main方法中添加以下代码即可以运行
class Program
{
private static MQTTServer mServer;
static void Main(string[] args)
{
mServer = new MQTTServer(ProtocolType.V3);
mServer.RegisterComponent<BeetleX.MQTT.Server.Controller>();
mServer.MQTTListen(o =>
{
o.DefaultListen.Port = 8089;
//o.DefaultListen.SSL = true;
//o.DefaultListen.CertificateFile = "";
//o.DefaultListen.CertificatePassword = "";
})
.Setting(o =>
{
o.LogToConsole = true;
o.Port = 80;
o.LogLevel = EventArgs.LogType.Info;
})
.UseJWT()
.UseEFCore<Storages.MQTTDB>()
.UseElement(PageStyle.ElementDashboard)
.Initialize((http, vue, resoure) =>
{
resoure.AddAssemblies(typeof(BeetleX.MQTT.Server.MQTTUser).Assembly);
resoure.AddCss("website.css");
resoure.AddScript("echarts.js");
vue.Debug();
})
.Run();
}
}
以上代码在80端口上打开WEB管理服务,在8089端口上打开MQTT服务;服务启动后就可以通过浏览器进入到简单的管理界面。在协议版本选择上可以在MQTTServer创建时指定V3或V5(暂时不能同一端口服务同时支持V3和V5)。
首页
用户管理
设备管理
管理界面只推荐简单的帐号管理和转发统计,基础框架已经搭建完成,可以根据实际需求进行扩展开发。
单独使用协议分析器
如果使用其他网络服务组件又不想自己编写MQTT协议,那可以单独使用BeetleX.MQTT.Protocols对网络数据进行协议分析。组件是基于Stream数据流规范开发,只需要传对一个标准的Stream数据流即可以完成MQTT协议读取和写入。
//v5
var mqttparse = new BeetleX.MQTT.Protocols.V5.MQTTParseV5();
mqttparse.Read(stream, null);
mqttparse.Write(msg, stream, null);
//v3.x
var mqttparse = new BeetleX.MQTT.MQTTParseV3();
mqttparse.Read(stream, null);
mqttparse.Write(msg, stream, null);
性能:由于MQTT是支持通配符订阅的,高并发时大量消息在订阅匹配上往往会比较损耗性能;组件在这方面做了特别的优化,对于通配符订阅上也能非常轻松地应对每秒上10万订阅转发(具体上限取决于硬件搭配)。
提醒:由于项目仅个人兴趣编写,并没有在自有商业项目中使用,因此会存在一定的问题;如果碰到问题可以去Github对应的项目上提出相应的问题。
BeetleX
开源跨平台通讯框架(支持TLS)
提供HTTP,Websocket,MQTT,Redis,RPC和服务网关开源组件
http://beetlex-io.com