凯亚物联网平台如何通过MQTT网络组件接入设备
一、概述
有人提议我用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在创建设备产品或设备实例时进行配置.\r\n timestamp为当前时间戳(毫秒), 与服务器时间不能相差5分钟.\r\n 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); } }

1. 添加协议说明文档如代码: support.AddDocument(MessageTransport.Http, "Document/document-http.md");,文档仅支持 markdown文件,如下所示

### 认证说明
CONNECT报文:
```text
clientId: 设备ID
username: secureId+"&"+timestamp
password: md5(secureId+"&"+timestamp+"&"+secureKey)
```
说明: secureId以及secureKey在创建设备产品或设备实例时进行配置.
timestamp为当前时间戳(毫秒), 与服务器时间不能相差5分钟.
md5为32位, 不区分大小写.

2. 添加身份鉴权如代码: support.AddAuthenticator(MessageTransport.Http, new Demo5Authenticator()) ,自定义身份鉴权Demo5Authenticator 代码如下:

public class DefaultAuthenticator : IAuthenticator
{
public IObservable<AuthenticationResult> Authenticate(IAuthenticationRequest request, IDeviceOperator deviceOperation)
{
var result = Observable.Return<AuthenticationResult>(default);
if (request is DefaultAuthRequest)
{
var authRequest = request as DefaultAuthRequest;
var username = authRequest.UserName;
var password = authRequest.Password;
String[] arr = username.Split("&");
if (arr.Length <= 1)
{
return Observable.Return(AuthenticationResult.Failure(StatusCode.CUSTOM_ERROR, "用户名格式错误"));
}
var requestSecureId = arr[0];
long.TryParse(arr[1], out long time);
if (Math.Abs(Utility.CurrentTimeMillis() - time) > TimeSpan.FromMinutes(10).TotalMilliseconds)
{
return Observable.Return(AuthenticationResult.Failure(StatusCode.CUSTOM_ERROR, "时间不一致"));
}
var configs = deviceOperation.GetConfigs("secureId", "secureKey").Subscribe(p =>
{
try
{
var secureId = p.GetValue("secureId").Convert<string>();
var secureKey = p.GetValue("secureKey").Convert<string>();
var encryptStr = $"{username}&{secureKey}".GetMd5Hash();
if (requestSecureId.Equals(secureId) && encryptStr.Equals(password))
{
result= result.Publish(AuthenticationResult.Success(deviceOperation.GetDeviceId()));
}
else
{
result= result.Publish(AuthenticationResult.Failure(StatusCode.CUSTOM_ERROR, "验证失败,密钥错误"));
}
}
catch (Exception ex)
{
result = result.Publish(AuthenticationResult.Failure(StatusCode.CUSTOM_ERROR, "请求参数格式错误"));
}
});
}
else
result = Observable.Return<AuthenticationResult>(AuthenticationResult.Failure(StatusCode.CUSTOM_ERROR, "不支持请求参数类型"));
return result;
}
public IObservable<AuthenticationResult> Authenticate(IAuthenticationRequest request, IDeviceRegistry registry)
{
var result = Observable.Return<AuthenticationResult>(default);
var authRequest = request as DefaultAuthRequest;
registry
.GetDevice(authRequest.DeviceId)
.Subscribe( p =>Authenticate(request, p).Subscribe(authResult => result = result.Publish(authResult)));
return result;
}
}

3. 添加Http路由代码support.AddRoutes,那么如何配置呢,代码如下:
public static BasicMessageCodec ReportProperty =>
new BasicMessageCodec("/*/properties/report", typeof(ReadPropertyMessage), route => route.GroupName("属性上报")
.Description("上报物模型属性数据")
.Example("{\"properties\":{\"属性ID\":\"属性值\"}}"));
4.添加元数据配置代码 support.AddConfigMetadata(MessageTransport.Http, _httpConfig); _httpConfig代码如下
private readonly DefaultConfigMetadata _mqttConfig = new DefaultConfigMetadata(
"Mqtt认证配置"
, "secureId以及secureKey在创建设备产品或设备实例时进行配置.\r\n timestamp为当前时间戳(毫秒), 与服务器时间不能相差5分钟.\r\n md5为32位, 不区分大小写")
.Add("secureId", "secureId", "用户唯一标识编号", StringType.Instance)
.Add("secureKey", "secureKey", "密钥", StringType.Instance);
- 如何加载协议模块,协议模块包含了协议模块支持添加引用加载和上传热部署加载。
引用加载模块

上传热部署协议模块

四、设备网关
创建设备网关

五、产品管理
以下是添加产品。

设备接入

六、设备管理
添加设备

mqtt 认证配置

创建告警阈值

七、测试
利用工具进行连接MQTT

然后可以在平台看到设备日志,看下连接失败成功情况

凯亚物联网平台如何通过MQTT网络组件接入设备的更多相关文章
- 国外物联网平台(1):亚马逊AWS IoT
		国外物联网平台(1)——亚马逊AWS IoT 马智 平台定位 AWS IoT是一款托管的云平台,使互联设备可以轻松安全地与云应用程序及其他设备交互. AWS IoT可支持数十亿台设备和数万亿条消息,并 ... 
- 玩转OneNET物联网平台之MQTT服务④ —— 远程控制LED(设备自注册)+ Android App控制
		授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ... 
- 玩转OneNET物联网平台之MQTT服务③ —— 远程控制LED(设备自注册)
		授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ... 
- 玩转OneNET物联网平台之MQTT服务② —— 远程控制LED
		1.理论基础 参考博主线上博文: 玩转PubSubClient MQTT库 玩转OneNET物联网平台之简介 玩转OneNET物联网平台之MQTT服务① 2.远程控制LED 2.1 实验材料 ... 
- 玩转OneNET物联网平台之MQTT服务① —— OneNetMqtt全方位调试
		授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ... 
- 玩转OneNET物联网平台之MQTT服务⑤ —— OneNet智能灯+MVP框架
		授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ... 
- 玩转OneNET物联网平台之MQTT服务⑦ —— 远程控制LED(数量无限制)+ Android App控制 优化第一版
		授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ... 
- ESA2GJK1DH1K基础篇: 阿里云物联网平台: 测试MQTT连接阿里云物联网平台
		前言 这节看一下在阿里云上实现MQTT通信是个怎样的流程 看了很多网上的教程,感觉讲的迷迷糊糊.... 其实感觉他们是对MQTT不够透彻,所以写的文章就是个比着葫芦画瓢的感觉 在我面前这东西就是玩具. ... 
- 【小程序案例】支付宝小程序-MQTT模器,IoT设备通过WSS接入阿里云IoT物联网平台
		支付宝小程序-MQTT模拟器通过WSS接入阿里云IoT物联网平台 小程序效果: 1. 准备工作 1.1 注册阿里云账号 开通阿里云账号,并通过支付宝实名认证 https://www.aliyun.co ... 
- 图解连接阿里云(一)创建阿里云物联网平台产品和设备,使用MQTT.fx快速体验
		1. 打开 https://www.aliyun.com/ 注册账号 2.注册账号登录后点击控制台 3. 在下图1处输入物联网平台,会弹出2处所示物联网平台的入口,点击红色箭头所示处,进入物联网平 ... 
随机推荐
- 六. Redis当中的“发布” 和 “订阅” 的详细讲解说明(图文并茂)
			七. Redis 当中 Jedis 的详细刨析与使用 @ 目录 七. Redis 当中 Jedis 的详细刨析与使用 1. Jedis 概述 2. Java程序中使用Jedis 操作 Redis 数据 ... 
- 1分钟学会DeepSeek本地部署,小白也能搞定!
			DeepSeek 是国内顶尖 AI 团队「深度求索」开发的多模态大模型,具备数学推理.代码生成等深度能力,堪称"AI界的六边形战士". DeepSeek 身上的标签有很多,其中最具 ... 
- 男人八题-点分治-Acwing252.树
			Acwing252.树 题目分析 树中的路径分为三种 路径两端在同一个子树 路径两端在不同子树 路径有一端是重心 因此可以分情况处理, 对于第一种情况可以进行递归处理, 第二种情况需要使用容斥原理求得 ... 
- RabbitMQ(八)——消息确认
			RabbitMQ系列 RabbitMQ(一)--简介 RabbitMQ(二)--模式类型 RabbitMQ(三)--简单模式 RabbitMQ(四)--工作队列模式 RabbitMQ(五)--发布订阅 ... 
- 莫托曼机器人GP110B操作手柄故障维修全攻略
			莫托曼机器人GP110B操作手柄故障机器人维修全攻略 一.前言 莫托曼机器人GP110B操作手柄是机器人控制系统的重要组成部分,它允许操作人员对机 ... 
- 微信小程序单击事件与长按事件冲突的解决办法
			众所周知,在小程序中,长按事件一松手是会触发单击事件的,而在我们的实际需求中,往往是需要单击事件和长按事件并存的. 然而,小程序却又好像想到了这种情况似的,给了我们一个触摸开始,一个触摸结束 也就是, ... 
- mybatis - [13] 分页
			题记部分 001 || limit select * from mybatis.user limit 2,5; 2代表偏移量,从结果集的第3行开始. 5代表返回的记录数 UserMapper List ... 
- Docker - 在线音乐播放器 YesPlayMusic
			原文链接:https://mp.weixin.qq.com/s/D2778fnix6jAeZlCicWGdw(本文只作为跟练,不以盈利为目的) 1.下载镜像 [root@node ~]# docker ... 
- Trae AI 工具使用记录--0手写代码创建桌面代办事项软件
			使用的AI工具是最近字节跳动出品的Trae工具. 第一步 下载IDE,Trae(官网链接 https://www.trae.ai) 安装完成后注册.登录,可以直接使用github账号.第一个坑就是目前 ... 
- deepseek:微信公众号网页授权能否获知是否关注公众号
			在微信公众号开发中,网页授权(OAuth2.0)可以获取用户的基本信息(如 openid.昵称.头像等),但默认情况下,网页授权无法直接获取用户是否关注公众号.这是因为网页授权的设计初衷是为了获取用户 ... 
