public:it:thingsboard

Thingsboard

  • 顶层目录
    .
    ├── 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
    • 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

  • 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.
  • 一百台设备,每个设备每 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.
    • 目前解决方式是把引起阻塞问题的两个节点给删掉了,就正常了。具体为什么阻塞还得探究
  • public/it/thingsboard.txt
  • 最后更改: 2023/05/19 17:46
  • oakfire