一、概述
有人提议我用kestrel代替Dotnetty ,那是不可能的, 物联网平台MQTT,rtmp,rtsp,httpflv,tcp,udp,rpc 都是基于dotnetty实现,压测没有问题,每秒可以达到20w/s,当中因为SingleThreadEventExecutor的问题 导致每天内存会增加的问题,我会通过源码修复,修复完成我会开通MQTT,http,tcp,udp,coap端口提供给大家测试。
凯亚 (Kayak) 是什么?
凯亚(Kayak)是基于.NET6.0软件环境下的surging微服务引擎进行开发的, 平台包含了微服务和物联网平台。支持异步和响应式编程开发,功能包含了物模型,设备,产品,网络组件的统一管理和微服务平台下的注册中心,服务路由,模块,中间服务等管理。还有多协议适配(TCP,MQTT,UDP,CoAP,HTTP,Grpc,websocket,rtmp,httpflv,webservice,等),通过灵活多样的配置适配能够接入不同厂家不同协议等设备。并且通过设备告警,消息通知,数据可视化等功能。能够让你能快速建立起微服务物联网平台系统。
凯亚物联网平台:http://117.72.121.2:3100(用户名:fanly 密码:123456)
链路跟踪Skywalking V8:http://117.72.121.2:8080/
surging 微服务引擎开源地址:https://github.com/fanliang11/surging(后面surging 会移动到microsurging进行维护)
二、网络组件
1.编辑创建MQTT协议的网络组件,可以选择共享配置和独立配置(独立配置是集群模式)

三、自定义协议
- 如何创建自定义协议模块
如果是网络编程开发,必然会涉及到协议报文的编码解码处理,那么对于平台也是做到了灵活处理,首先是协议模块创建,通过以下代码看出协议模块可以添加协议说明md文档, 身份鉴权处理,HTTP路由,消息编解码,元数据配置。下面一一介绍如何进行编写
public class Demo5ProtocolSupportProvider : ProtocolSupportProvider {
private readonly DefaultConfigMetadata _mqttConfig = new DefaultConfigMetadata(
"Mqtt认证配置"
, "secureId以及secureKey在创建设备产品或设备实例时进行配置.rn timestamp为当前时间戳(毫秒), 与服务器时间不能相差5分钟.rn md5为32位, 不区分大小写")
.Add("secureId", "secureId", "用户唯一标识编号", StringType.Instance)
.Add("secureKey", "secureKey", "密钥", StringType.Instance);
public override IObservable<ProtocolSupport> Create(ProtocolContext context) {
var support = new ComplexProtocolSupport();
support.Id = "demo5";
support.Name = "演示协议5";
support.Description = "演示协议5"; support.AddDocument(MessageTransport.Mqtt, "Document/document-mqtt.md"); support.AddAuthenticator(MessageTransport.Mqtt, new DefaultAuthenticator());
support.AddRoutes(MessageTransport.Mqtt, new List<TopicMessageCodec>() {
TopicMessageCodec.DeviceOnline,
TopicMessageCodec.ReportProperty,
TopicMessageCodec.WriteProperty,
TopicMessageCodec.ReadProperty,
TopicMessageCodec.Event
}.Select(p => MqttDescriptor.Instance(p.Pattern)
.GroupName(p.Route.GroupName())
.Path(p.Pattern)
.ContentType(MediaType.ToString(MediaType.ApplicationJson))
.Description(p.Route.Description())
.Example(p.Route.Example())
).ToList()); support.AddMessageCodecSupport(MessageTransport.Mqtt, () => Observable.Return(new ScriptDeviceMessageCodec(support.Script)));
support.AddConfigMetadata(MessageTransport.Mqtt, _mqttConfig); return Observable.Return(support); } }