热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

tt协议号服务器,TTIot:TTIoT云端物联网Iot组件;面向JAVA;netty;mqtt;异步推送;以事件为驱动;为设备提供安全可靠的连接通信能力;...

TTIoT云端物联网组件;面向JAVA;以事件为驱动;为设备提供安全可靠的连接通信能力TTIoT简介TTIOT的Broker采用MQTT协议与设备进行交互,可以应用在数据采集、能源

80a857bcfe581ce1c7f28964991b7eea.png

TTIoT云端物联网组件;面向JAVA;以事件为驱动;为设备提供安全可靠的连接通信能力

5476d49226752fb3884a9756409c05cd.png

2.1版本重要更新

增加SSL加密功能,同时支持https\wss\tls协议

在配置文件添加

ssl:

enabled: true

certificateType: PKCS12

certificatePath: /Users/shijun/Desktop/TTIOT/ca/server/3938.pfx

certificatePassword: 5J7HDiJM

2.0版本重要更新

多协议转换引擎-一个端口支持三种协议HTTP/WEBSOCKET/TCP,上层协议使用的依然是MQTT,支持使用这三种不同协议的客户端相互通信(详见使用说明.10)

使用HTTP协议向设备投递消息,URI:/mqtt,请求体如下:

Headers:userName //设备帐号

tenantId //租户编号

password //设备密码

Body:

{

"mqttQos": 1, //消息质量

"payload": { //消息体

"rule": "chat",

"content": "hello"

},

"retain": false, //是否为retain消息

"topic": "/m" //推送的话题

}

支持消息路由引擎@Ruler-给消息定义规则(详见使用说明.12)

功能

认证授权(auth)

TTIoT的容器对发布的事件都会自动检查登陆状态,对未授权的设备进行自动拦截,只要在相关的类添加@Eventor(auth = true)即可

@Eventor(value = AppProtocalMqttConstant.PINGREQ,auth = true)

public class MqttPingEvent extends MqttApplicationEvent {

public MqttPingEvent(MqttMessage msg, ChannelHandlerContext context) {

super(msg, context);

}

}

多租户(saas)

TTIot的设备归属为租户,其devName与topic对每个租户唯一,clientId构成为:tenantId-devName-xxxx(保留字段);并且提供接口将设备进行录入,例如

dbHelper.saveTenant(tenant);

dbHelper.saveDev(device);

控制反转(IOC)

TTOT放弃第三方框架IOC框架,内部维护了一个轻量的容器,在项目启动时对所有的Listener扫描并且接管

消息的订阅与发布(Qos)

(1)支持Qos(Quality of Service)

TTIot提供mqtt三种消息质量模型即:

Qos0:最多一次的传输

Qos1:至少一次的传输

Qos2:只有一次的传输

该方案适应任何网络场景,特别是网络较差的场景

(2)通配符与消息降级

TTIot提供主题层级分隔符/,单层通配符+,多层通配符#,设备实现灵活订阅

心跳检测(Idle)

TTIot 提供两种测活机制

(1)服务端定义

TTiot:

heartbeatTimeout: 10

(2)客户端通过设置可变头里面的keepAliveTimeSeconds定义

保留消息与消息遗嘱

(1)Topic只有唯一的retain消息,Broker会保存每个Topic的最后一条retain消息;每个Client订阅Topic后会立即读取到retain消息,不必要等待发送。订阅Topic时可以使用通配符,就会收到匹配的每个Topic的retain消息;发布消息时把retain设置为true,即为保留信息。

(2)MQTT本身就是为信号不稳定的网络设计的,所以难免一些客户端会无故的和Broker断开连接;当客户端连接到Broker时,可以指定LWT,Broker会定期检测客户端是否有异常;当客户端异常掉线时,Broker就往连接时指定的topic里推送当时指定的LWT消息。

使用说明

配置文件

配置文件延续了yaml风格,默认命名为TTIotBootstrap.yml,在自己模块resources目录下添加TTIotBootstrap.yml文件即可

TTiot:

port: 8726 #端口

heartbeatTimeout: 10 #心跳间隔时间

netty:

bossGroupCount: -1 #-1代表线程数量取决于cpu

workerGroupCount: -1 #-1代表线程数量取决于cpu,此参数决定了netty的worker线程与TTIot内置的核心线程

redis: #redis相关

项目启动

8af404d7d011c769052f1b79c4be6e21.png

new ServerLauncher().launch();

自定义数据源

(1) 实现DbHelper接口

(2) 添加数据源插件,Broker提供默认的redis实现

new ServerLauncher().dbHelper(new RedisDbHelper(new RedisSourceProvider())).launch();

自定义统一异常处理器

(1) 继承ExceptionHandlerAdapter,或者实现 Thread.UncaughtExceptionHandler 接口

(2) 添加异常处理插件,Broker提供默认的ExceptionHandlerAdapter实现

new ServerLauncher().exceptionHandler(new ExceptionHandlerDemo()).launch();

依赖注入

由于Listener是由TTIot接管的,在Listener内部系统提供了两种级别的注入方式,选择需要注入的对象添加@Inject注解即可

(1)service 注入

@Listener(asynchronous = true)

public class LoginLogListener extends MqttApplicationListener {

@Inject

private SessionService sessionService;

}

(20 dao 注入

public class DeviceService{

@Inject

private DbHelper dbHelper;

}

自定义消息处理器

TTIot 提供@Listener 注解来处理具体的事件信息,在@Listener里面有两个参数

replace 为true时,替换该事件的默认处理器,为false时,对该事件新增一个处理器

asynchronous 为true时,申明该处理器为一个异步处理器,由TTIot内置的线程池进行接管,线程池大小由TTiot:netty:bossGroupCount 决定,为false时,由netty 的EventLoopGroup 接管;

处理器可以用来实现额外的功能,并且跟默认业务解耦,例如,异步的设备登陆日志

@Listener(asynchronous = true)

public class LoginLogListener extends MqttApplicationListener {

@Override

public void onApplicationEvent(MqttConnectEvent mqttConnectEvent) {

DbDemo.saveLogin(mqttConnectEvent.getTimestamp(), mqttConnectEvent.getDevName(), mqttConnectEvent.getTenantId());

}

}

无侵入设计

如果开发者想自定义事件的默认处理逻辑,无需修改源码,只需要加上如下注解上即可,TTot则会更换默认的处理逻辑,开发者也可以利用TTot的事件驱动,自定义事件

@Listener(replace = true)

事件发布

TTIot 提供多种默认的事件供开发者使用,给topic推送消息,例如

Context.me().publishEvent(new MqttPublishTopicEvent(String topic,MqttQoS mqttQoS,byte[] bytes,String tenantId,boolean isRetain);

例如,给device单独推送消息

Context.me().publishEvent(new MqttPublishDevEvent(String clientId, String topic, byte[] byteBuf, MqttQoS qoS,String tenantId);

docker-compose

首先,需要安装git与docker

git clone https://gitee.com/cloudSj/TTIot.git

cd 到项目根目录

mvn clean install

mvn clean install package -Dmaven.test.skip

docker-compose up -d

webSocket接入

TTIOT内置了webSocket协议转换器,开发者只需要关注业务逻辑,无需关注协议处理、转换层面的相关问题。

HTTP接入及设备控制

TTIOT目前只接受POST类型的请求,格式如下:

URI:/mqtt

Headers:userName //设备帐号

tenantId //租户编号

password //设备密码

Body:

{

"mqttQos": 1, //消息质量

"payload": { //消息体

"rule": "chat",

"content": "hello"

},

"retain": false, //是否为retain消息

"topic": "/m" //推送的话题

}

HTTP由于协议本身的特性只支持QOS类型为1或2

规则路由@Ruler

如果消息的内容符合

{

"rule": "chat",

"content": "hello"

}

消息格式,TTIOT将自动触发规则路由器,将消息自动投递到与rule值对应的处理器上如:

@Ruler(name = "chat")

public class ChatRuleHandler implements RuleHandler {

@Override

public void handler(MqttPayloadVo mqttPayloadVo) {

System.out.println(mqttPayloadVo);

}

}

因此,开发者可以自定义业务处理逻辑

TTIoT 开源计划

docker部署组件

HTTP组件以及控制设备HTTPAPI

物模型组件

网关\集群与分布式扩展组件

安卓端组件

规则引擎组件(后续将会持续更新)

SSL加密传输

另外:作者诚邀开发人员提交下位机例如PLC/单片机/安卓相关代码,如有计划者可以通过邮箱跟作者取得联系

联系作者

关注公众号:(不定期推送关于IoT的干货以及源码解析)

感谢:lombok、netty、hutool 提供的工具以及源码

参与贡献

Fork项目到自己的repo

clone到本地

修改代码(dev分支)

commit后push到自己的库(dev分支)

pull request

等待作者合并



推荐阅读
  • HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送www方式的数据。HTTP协议采用了请求响应模型。客服端向服务器发送一 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 在处理 XML 数据时,如果需要解析 `` 标签的内容,可以采用 Pull 解析方法。Pull 解析是一种高效的 XML 解析方式,适用于流式数据处理。具体实现中,可以通过 Java 的 `XmlPullParser` 或其他类似的库来逐步读取和解析 XML 文档中的 `` 元素。这样不仅能够提高解析效率,还能减少内存占用。本文将详细介绍如何使用 Pull 解析方法来提取 `` 标签的内容,并提供一个示例代码,帮助开发者快速解决问题。 ... [详细]
  • 本文详细解析了JSONP(JSON with Padding)的跨域机制及其工作原理。JSONP是一种通过动态创建``标签来实现跨域请求的技术,其核心在于利用了浏览器对``标签的宽松同源策略。文章不仅介绍了JSONP的产生背景,还深入探讨了其具体实现过程,包括如何构造请求、服务器端如何响应以及客户端如何处理返回的数据。此外,还分析了JSONP的优势和局限性,帮助读者全面理解这一技术在现代Web开发中的应用。 ... [详细]
  • PyQt5 QTextEdit:深入解析Python中多功能GUI库的应用与实现
    本文详细探讨了 PyQt5 中 QTextEdit 组件在 Python 多功能 GUI 库中的应用与实现。PyQt5 是 Qt 框架的 Python 绑定,提供了超过 620 个类和 6000 个函数及方法,广泛应用于跨平台应用程序开发。QTextEdit 作为其中的重要组件,支持丰富的文本编辑功能,如富文本格式、文本高亮和自定义样式等。PyQt5 的流行性不仅在于其强大的功能,还在于其易用性和灵活性,使其成为开发复杂用户界面的理想选择。 ... [详细]
  • 一.HTTP与TCP的关系HTTP属于应用层协议,主要解决如何包装数据;在传输层使用TCP协议,主要解决数据如何在网络中传输;在网络层使用IP协议,主要解决网络路由和寻址问题;HT ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 在Android平台中,播放音频的采样率通常固定为44.1kHz,而录音的采样率则固定为8kHz。为了确保音频设备的正常工作,底层驱动必须预先设定这些固定的采样率。当上层应用提供的采样率与这些预设值不匹配时,需要通过重采样(resample)技术来调整采样率,以保证音频数据的正确处理和传输。本文将详细探讨FFMpeg在音频处理中的基础理论及重采样技术的应用。 ... [详细]
  • 在CentOS 7上部署WebRTC网关Janus
    在CentOS 7上部署WebRTC网关Janus ... [详细]
  • 史上最全的Websocket入门教程
    websocket是什么?答:它是一种网络通信协议,是HTML5开始提供的一种在单个TCP连接上进行全双工通讯的协议。为什么需要websocket?疑问?我 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
author-avatar
cb
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有