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

TTIoT简介

TTIOT的Broker采用MQTT协议与设备进行交互,可以应用在数据采集、能源监控、智能生活、智能工业、农业水利等场景;

向下提供连接海量设备服务,支撑设备数据采集上云,支持M2M;无侵入集成第三方服务端,提供事件API,实现远程控制设备;此外,TTIOT将会持续开源物联网套件,如多协议引擎、设备管理、规则引擎、数据分析等插件为各类IoT场景和行业开发者赋能。

Broker组件,TTIot把TCP/IP协议族上的协议都转换成了事件池,开发者只需要面向事件编程即可。

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相关

项目启动

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

等待作者合并

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

  1. uniCloud开发公众号:六、解析不同情况下用户扫码后微信推送的事件并完成登录

    算是个系列内容吧,最终要实现的是将uniCloud作为后端完成"扫码关注公众号后完成网站登录" 将要涉及的内容可能包括: 0.准备工作(本节) 1.接受并解析xml消息 2.请求a ...

  2. tt协议号服务器,TTcam协议的账号的写法

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 这几天,由于很多烧友刷了新的TTCAM协议的DM500系统,但很多烧友都觉得写入账号麻烦,其实它的写入跟OSCAM的写法差不多,我们可以通过系统的var下 ...

  3. 微信push服务器,GitHub - brucx/mp-push-nestjs: 微信公众号消息推送服务,类似“server酱”,提供Docker镜像部署...

    MP-PUSH 一个频道可以被多个微信订阅,一个微信也可以订阅多个频道.当有消息到达频道时,会向所有订阅的微信推送通知. 开发此项目的目的是实现一个自己的"Server酱",方便自 ...

  4. netty多台服务器 推送消息,基于Netty的消息推送服务器集群设计与实现

    徐龙光 何顶新 摘 要:消息推送是当前移动应用中十分必要的一项技术,服务者需要使用消息推送以保持用户活跃度,提高应用存留率.为了满足消息推送的需求和增强推送系统的性能,采用Netty网络编程框架并搭建 ...

  5. 饥荒显示服务器未响应是什么意思,微软或将在本周内推送Win10 10586.71累积更新(图)...

    原标题:"微软或将在本周内推送Win10 10586.71累积更新"相关电脑问题教程分享. - 来源:路由器之家.不久前,微软更新服务器上出现了Win10 Mobile 10586 ...

  6. mqtt消息推送中间件服务器软件评价

    在使用的过程中,发现各个mqtt服务软件的一点特征. (1)rsmb,Really Small Message Broker ,目前常用的版本是1.2.0,是一款不错的推送软件,在linux下,最大连 ...

  7. htc服务器更新系统,没放弃!HTC向3年前老机型推送最新系统更新

    原标题:没放弃!HTC向3年前老机型推送最新系统更新 3月14日消息,有网友在谷歌支持论坛上发文表示,HTC U11 Life目前已经接收到了最新安卓10操作系统的升级提示.虽然近些年来HTC的手机业 ...

  8. java如果将信息推送到公众号_Java 推送微信公众号消息

    1 新建消息请求类 WeChatTemplateRequest @Data public class WeChatTemplateRequest { private String touser; pr ...

  9. java实现mqtt服务端_基于Swoole使用MQTT协议连接阿里云物联网平台设备实现消息订阅

    阿里云物联网平台为设备提供安全可靠的连接通信能力,支撑设备数据采集上云,我们这里认为阿里云物联网平台是 MQTT 服务端,那么我们自己的设备作为客户端,应该如何实现消息订阅? 阿里云没有提供 PHP ...

最新文章

  1. 卷积神经网络(CNN)的原理
  2. 健身三大供能系统详解
  3. Studio右键选项中没有Git?
  4. jupyter 接受参数
  5. linux同步硬件和系统时钟,liunx系统下时钟不同步会出现问题 怎么同步Linux 的系统时钟和硬件时钟?...
  6. liunxu mysql_Liunx下安装MySql
  7. stm32 GPIO
  8. linux lnmp安装
  9. 如何封装一个自己的win7系统并安装到电脑做成双系统
  10. (WSI分类)WSI分类文献小综述
  11. git FETCH_HEAD 版本回滚 ORIG_HEAD
  12. 从原理上搞懂编码——究竟什么是编码?什么是解码?什么是字节流?
  13. (57)Linux驱动开发之三Linux字符设备驱动
  14. 【SAP消息号KD503】
  15. 2018年10月29日英语学习
  16. 蚂蚁金服区块链创新大赛
  17. 使用并行计算改进基于独立 Metropolis-Hastings 的估计
  18. 开源工程ffdshow
  19. python环境jieba分词的安装
  20. 简约时钟特效 html+css+js

热门文章

  1. c#hello world_C#| 打印消息/文本(用于打印Hello world的程序)
  2. 一道题决定去留:为什么synchronized无法禁止指令重排,却能保证有序性?
  3. Android开发教程:手机震动控制浅析
  4. PJ2018T4 对称二叉树 树形结构
  5. cc2530定时器和捕获比较_ALIENTEK 阿波罗 STM32F767 开发板资料连载十四章 输入捕获实验...
  6. python numpy库是第三方库吗_浅谈python的第三方库——numpy(终)
  7. jdbc mysql user_tab_comments_MySQL学习(五)——使用JDBC完成用户表CRUD的操作
  8. python怎么做软件界面_python – 如何自定义桌面应用程序的标题栏和窗口
  9. python 公开课_python公开课视频(11~20)
  10. 投篮c语言程序设计,教师招聘笔试体育之篮球必做20题(一)