tt协议号服务器,TTIot: TTIoT云端物联网Iot组件;面向JAVA;netty;mqtt;异步推送;以事件为驱动;为设备提供安全可靠的连接通信能力;...
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;异步推送;以事件为驱动;为设备提供安全可靠的连接通信能力;...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JVM垃圾收集器——G1
- 下一篇: c和java内存泄漏区别_内存溢出和内存