====== Thingsboard ======
* Official site: [[https://thingsboard.io/|thingsboard.io]]
* Ubuntu 安装:[[https://thingsboard.io/docs/user-guide/install/ubuntu/|官方文档]]
===== V3.2 代码解析 =====
==== 架构 ====
* [[https://thingsboard.io/docs/reference/|official doc]]
* 前端架构为 [[angular]]
* UI: [[https://material.angular.io/|angular material]]
* 存储:[[https://ngrx.io/docs|ngrx]]
* 后端架构为 [[java]] [[https://springdoc.cn/|Spring, Spring Boot]]
* [[postgresql]]
==== 目录结构 ====
* 顶层目录
.
├── 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''
* 由 [[https://angular.cn/guide/dependency-injection|angular DI]] 注入 ''authService'', 路径''ui-ngx\src\app\core\auth\auth.service.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 ===
* [[https://thingsboard.io/docs/reference/rest-api/|official doc]]
* 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''.
===== 改造 =====
* 前端呈现 区域-楼宇-房间-设备点位-设备;
* **设备点位**与**设备**是不一样的,设备点位可增加删除但不可更改,数据历史是一直连续的,而点位所关联的设备可被更换。
* 为了防止混淆,**设备点位**重名为**房间点位**应该更合适? 暂不改。
* 概念上,设备最好和具体的物理设备绑定,如果物理设备损坏更换,那么应创建新的设备,然后把该设备连接到点位上。
* 增加手机短信消息机制;
* 配色备选:
* https://colorhunt.co/palette/66990
* https://colorhunt.co/palette/15830
* https://colorhunt.co/palette/134927
* https://colorhunt.co/palette/89958
* 导出
* 前端导出 excel 所用到的库 https://github.com/SheetJS/sheetjs
* 样式调整相关:https://segmentfault.com/a/1190000022772664, [[https://blog.wj2015.com/2019/05/01/js-xlsx%E6%94%AF%E6%8C%81%E6%A0%B7%E5%BC%8F/| 这一篇也不错]], 相关库 [[https://github.com/exceljs/exceljs|exceljs]]
* csv: https://github.com/knrz/CSV.js
* 打印,大小:https://www.cnblogs.com/fps2tao/p/10842960.html
* 打印前处理:https://developer.mozilla.org/zh-CN/docs/Web/API/WindowEventHandlers/onbeforeprint
===== 性能 =====
* 一百台设备,每个设备每 2 秒发送 4 种数据,大概需要 CPU 4核 2.4G, 内存 4G, 硬盘 1T/年, 服务器带宽 10Mb
===== 问题 =====
* 版本 3.2.1,规则引擎里,''Post Telemetry'' 类型消息的两个中间处理节点都会间歇性超过最大 CPU 执行时间 (''LOCAL_JS_SANDBOX_MAX_CPU_TIME'' 默认是 8000 ms), 按[[https://thingsboard.io/docs/user-guide/troubleshooting/?scenario=growing-latency|官方文档]],加上了规则引擎执行时间的日志记录,会发现日志里间歇出现 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.
* 目前解决方式是把引起阻塞问题的两个节点给删掉了,就正常了。具体为什么阻塞还得探究