Thingsboard
- Official site: thingsboard.io
- Ubuntu 安装:官方文档
V3.2 代码解析
架构
- 前端架构为 Angular
- UI: angular material
- 存储:ngrx
- 后端架构为 Java Spring, Spring Boot
目录结构
- 顶层目录
. ├── LICENSE ├── README.md ├── license-header-template.txt ├── pom.xml ├── img --仅一张readme的logo图片 ├── application --主程序,JAVA, Spring, Spring Boot └── target --编译最终结果目录,包含jar包与deb包 ├── common --通用的JAVA代码, 包括数据信息结构,消息队列处理等等 ├── dao --JAVA 数据库操作相关 ├── docker --docker 脚本 ├── k8s --Kubernetes 配置脚本相关 ├── msa --微服务相关,整合启动各种服务 ├── netty-mqtt --JAVA mqtt 实现 ├── packaging --打deb包相关 ├── rest-client --使用rest api 的JAVA客户端,供JAVA开发使用 ├── rule-engine --规则引擎, JAVA ├── tools ├── transport └── ui-ngx --web前端代码, angular架构
登录与认证过程
- ui-ngx前端页面加载后,angular初始化时,
ui-ngx\src\app\app.component.ts
, 查看setupAuth
代码 - 页面登录逻辑代码:
ui-ngx\src\app\modules\login\pages\login\login.component.ts
AuthService
调用/api/auth/login
接口- 如果登录成功,是以 jwt 方式存储认证信息。依赖库:
@auth0/angular-jwt
- 如果密码过期,转url
login/resetExpiredPassword
- 后端接口
/api/auth/login
实现:- Spring Boot,
application\src\main\java\org\thingsboard\server\config\ThingsboardSecurityConfiguration.java
org.springframework.security.web.authentication
- 前端从 jwt 带的
userId
来获取用户信息userService
(位于ui-ngx\src\app\core\http\user.service.ts
)- 调用 rest 接口
/api/user/{userId}
- 由用户信息的字段
authority
来决定用户类型- 前端定义在
ui-ngx\src\app\shared\models\authority.enum.ts
; - 后端定义在
common\data\src\main\java\org\thingsboard\server\common\data\security\Authority.java
路由
- 刚加载时,路由走向是在
AuthService.defaultUrl
里处理决定- 调用顺序 AppComponent.setupAuth → AuthService.gotoDefaultPlace → AuthService.defaultUrl
REST API
- swagger描述接口:
http://YOUR_HOST:PORT/swagger-ui.html
Tips
mvn clean install -DskipTests
- 站点初始化:参考
DefaultSystemDataLoaderService.loadDemoData
来进行站点初始化 - java 怎么进行前后端分离与打包?
spring-boot-starter-web
包含spring-boot-starter-tomcat
,tomcat
是个web代理服务spring-boot-starter-tomcat
默认映射的静态资源目录为/static
,/public
,/resources
,/META-INF/resources
- ui-ngx 工程生成目录为
ui-ngx/target/generated-resources/public
, 然后打包成 jar 包, 用jar xvf ui-ngx-3.2.0.jar
可以看到 jar 包里为 public 目录资源。 - 主工程 jar 包依赖 ui-ngx-3.2.0.jar, 运行时首页返回的便是ui-ngx生成的 public/index.html。
- gateway 网关类型设备直接推送子设备数据时,可直接按名自动创建子设备,如果子设备被删除,需要网关断开链接再重连(session 重置)才能重新自动创建子设备
- 默认情况下 Linux 的 1024 以下端口是只有 root 用户才有权限占用, thingsboard 用的 tomcat 默认是以 thingsboard 用户起的,所以用不了 80 端口。目前使用nginx转发来解决。
- ubuntu 手动替换 jar 包升级方式:
- 使用
application/target/thingsboard-3.2.x-boot.jar
替换目标服务器上的/usr/share/thingsboard/bin/thingsboard.jar
- 确保 替换后的
thingsboard.jar
有可执行权限 - 重启服务
sudo service thingsboard stop
,sudo service thingsboard start
.
改造
- 前端呈现 区域-楼宇-房间-设备点位-设备;
- 设备点位与设备是不一样的,设备点位可增加删除但不可更改,数据历史是一直连续的,而点位所关联的设备可被更换。
- 为了防止混淆,设备点位重名为房间点位应该更合适? 暂不改。
- 概念上,设备最好和具体的物理设备绑定,如果物理设备损坏更换,那么应创建新的设备,然后把该设备连接到点位上。
- 增加手机短信消息机制;
- 配色备选:
- 导出
- 前端导出 excel 所用到的库 https://github.com/SheetJS/sheetjs
性能
- 一百台设备,每个设备每 2 秒发送 4 种数据,大概需要 CPU 4核 2.4G, 内存 4G, 硬盘 1T/年, 服务器带宽 10Mb
问题
- 版本 3.2.1,规则引擎里,
Post Telemetry
类型消息的两个中间处理节点都会间歇性超过最大 CPU 执行时间 (LOCAL_JS_SANDBOX_MAX_CPU_TIME
默认是 8000 ms), 按官方文档,加上了规则引擎执行时间的日志记录,会发现日志里间歇出现 8000ms 或 7999 ms 的执行时间阻塞了整个规则引擎。有可能原因是这个:- If you are using
RETRY_ALL, RETRY_FAILED, RETRY_TIMED_OUT or RETRY_FAILED_AND_TIMED_OUT
strategy for some rule-engine queue, it is possible that some failed node could block the whole processing of the messages in this queue. - 目前解决方式是把引起阻塞问题的两个节点给删掉了,就正常了。具体为什么阻塞还得探究