# TB Source Tree :::info * **TB Architecture** ![image](https://hackmd.io/_uploads/ryklahYFkx.png) ::: [toc] ## 目錄結構 * version: **tb 3.9.0** ```bash star@may:~/workspace$ git clone --branch release-3.9 https://github.com/thingsboard/thingsboard.git star@may:~/workspace$ tree -L 1 thingsboard/ thingsboard/ ├── application ├── build_proto.sh ├── build.sh ├── common ├── dao ├── docker ├── img ├── LICENSE ├── license-header-template.txt ├── lombok.config ├── monitoring ├── msa ├── netty-mqtt ├── packaging ├── pom.xml ├── pull_request_template.md ├── README.md ├── rest-client ├── rule-engine ├── security.md ├── tools ├── transport └── ui-ngx ``` ### application :::info 核心應用目錄,包含了大部分的業務邏輯和功能模組, * src/main/java/org/thingsboard/server:包含 Java 原始碼,ThingsBoard 的核心邏輯。 * src/main/resources:包含資源文件, 如配置文件。 ::: ``` thingsboard/application/ ├── pom.xml └── src ├── main │   ├── conf │   │   ├── logback.xml │   │   └── thingsboard.conf │   ├── data │   │   ├── certs │   │   ├── json │   │   ├── lwm2m-registry │   │   ├── resources │   │   └── upgrade │   ├── java │   │   └── org │   └── resources │   ├── banner.txt │   ├── i18n │   ├── logback.xml │   ├── templates │   └── thingsboard.yml └── test ├── java │   └── org └── resources ├── application-test.properties ├── coap ├── logback-test.xml ├── lwm2m ├── mockito-extensions ├── provision └── update ``` ### common :::info 共用模組,包含一些通用的工具類別和配置。 * data:共用資料結構和工具類別。 ::: ``` thingsboard/common/ ├── actor │   ├── pom.xml │   └── src │   ├── main │   │   └── java │   └── test │   ├── java │   └── resources ├── cache │   ├── pom.xml │   └── src │   ├── main │   │   └── java │   └── test │   ├── java │   └── resources ├── cluster-api │   ├── pom.xml │   └── src │   └── main │   └── java ├── coap-server │   ├── pom.xml │   └── src │   ├── main │   │   └── java │   └── test │   └── java ├── dao-api │   ├── pom.xml │   └── src │   └── main │   └── java ├── data │   ├── pom.xml │   └── src │   ├── main │   │   └── java │   └── test │   ├── java │   └── resources ├── edge-api │   ├── pom.xml │   └── src │   └── main │   ├── java │   └── proto ├── message │   ├── pom.xml │   └── src │   ├── main │   │   ├── java │   │   └── proto │   └── test │   ├── java │   └── resources ├── pom.xml ├── proto │   ├── pom.xml │   └── src │   ├── main │   │   ├── java │   │   └── proto │   └── test │   ├── java │   └── resources ├── queue │   ├── pom.xml │   └── src │   ├── main │   │   └── java │   └── test │   ├── java │   └── resources ├── script │   ├── pom.xml │   ├── remote-js-client │   │   ├── pom.xml │   │   └── src │   │   └── main │   └── script-api │   ├── pom.xml │   └── src │   ├── main │   └── test ├── stats │   ├── pom.xml │   └── src │   └── main │   └── java ├── transport │   ├── coap │   │   ├── pom.xml │   │   └── src │   │   ├── main │   │   └── test │   ├── http │   │   ├── pom.xml │   │   └── src │   │   ├── main │   │   └── test │   ├── lwm2m │   │   ├── pom.xml │   │   └── src │   │   ├── main │   │   └── test │   ├── mqtt │   │   ├── pom.xml │   │   └── src │   │   ├── main │   │   └── test │   ├── pom.xml │   ├── snmp │   │   ├── pom.xml │   │   └── src │   │   ├── main │   │   └── test │   └── transport-api │   ├── pom.xml │   └── src │   ├── main │   └── test ├── util │   ├── pom.xml │   └── src │   ├── main │   │   └── java │   └── test │   ├── java │   └── resources └── version-control ├── pom.xml └── src └── main └── java ``` ### dao :::info dao 資料夾的全名是 ``Data Access Object``。 這是一種設計模式,用於抽象和封裝對數據源的訪問和操作。 * **用途** 數據訪問抽象:dao 資料夾中的類別和方法提供了對資料庫的抽象訪問。這意味著它們負責執行資料庫操作,如查詢、插入、更新和刪除資料,而不暴露資料庫的具體實現細節。 分離關注點:通過使用 DAO 模式,ThingsBoard 將業務邏輯與數據訪問邏輯分開,讓原始碼更具可維護性和可測試性,因為資料訪問邏輯集中在一個地方。 資料庫獨立性:DAO 模式允許 ThingsBoard 更容易地切換資料庫或資料存儲技術,因為資料訪問邏輯被封裝在 DAO 類中,而不是散佈在整個應用程式中。 簡化測試:由於 DAO 類別專注於數據訪問,可以通過模擬或偽裝 DAO 類別簡化單元測試,而無需依賴實際的資料庫。 * **結構** DAO 類:dao 資料夾中通常包含多個 DAO 類別,每個類別負責特定實體(如設備、用戶、資產等)的資料訪問操作。 方法:每個 DAO 類通常包含多個方法,這些方法對應於對數據庫的各種操作,如 save、find、update 和 delete。 這些 DAO 類別共同構成了 ThingsBoard 資料訪問層,確保資料操作的一致性和可靠性。 ::: ``` thingsboard/dao/ ├── pom.xml └── src ├── main │   ├── java │   │   └── org │   └── resources │   ├── cassandra │   ├── sql │   └── xss-policy.xml └── test ├── java │   └── org └── resources ├── application-test.properties ├── cassandra-test.properties ├── cassandra-test.yaml ├── logback-test.xml ├── nosql-test.properties ├── sql ├── sql-test.properties ├── TestJsonData.json ├── TestJsonDescriptor.json ├── timescale-test.properties └── xss-policy.xml ``` ### docker :::info Docker 相關的配置和 script,用於構建和部署 ThingsBoard 的 Docker 映像。 ::: ``` thingsboard/docker/ ├── cache-redis-cluster.env ├── cache-redis.env ├── cache-redis-sentinel.env ├── compose-utils.sh ├── docker-check-log-folders.sh ├── docker-compose.aws-sqs.yml ├── docker-compose.cassandra.volumes.yml ├── docker-compose.confluent.yml ├── docker-compose.hybrid.yml ├── docker-compose.kafka.yml ├── docker-compose.postgres.volumes.yml ├── docker-compose.postgres.yml ├── docker-compose.prometheus-grafana.yml ├── docker-compose.pubsub.yml ├── docker-compose.rabbitmq.yml ├── docker-compose.redis-cluster.volumes.yml ├── docker-compose.redis-cluster.yml ├── docker-compose.redis-sentinel.volumes.yml ├── docker-compose.redis-sentinel.yml ├── docker-compose.redis.volumes.yml ├── docker-compose.redis.yml ├── docker-compose.service-bus.yml ├── docker-compose.volumes.yml ├── docker-compose.yml ├── docker-create-log-folders.sh ├── docker-install-tb.sh ├── docker-remove-services.sh ├── docker-start-services.sh ├── docker-stop-services.sh ├── docker-update-service.sh ├── docker-upgrade-tb.sh ├── haproxy │   └── config │   ├── blocklist.txt │   ├── haproxy.cfg │   └── trustlist.txt ├── kafka.env ├── monitoring │   ├── grafana │   │   ├── config.monitoring │   │   └── provisioning │   │   ├── dashboards │   │   └── datasources │   └── prometheus │   └── prometheus.yml ├── queue-aws-sqs.env ├── queue-confluent.env ├── queue-kafka.env ├── queue-pubsub.env ├── queue-rabbitmq.env ├── queue-service-bus.env ├── README.md ├── tb-coap-transport.env ├── tb-http-transport.env ├── tb-js-executor.env ├── tb-lwm2m-transport.env ├── tb-mqtt-transport.env ├── tb-node │   └── conf │   ├── logback.xml │   └── thingsboard.conf ├── tb-node.env ├── tb-node.hybrid.env ├── tb-node.postgres.env ├── tb-snmp-transport.env ├── tb-transports │   ├── coap │   │   └── conf │   │   ├── logback.xml │   │   └── tb-coap-transport.conf │   ├── http │   │   └── conf │   │   ├── logback.xml │   │   └── tb-http-transport.conf │   ├── lwm2m │   │   └── conf │   │   ├── logback.xml │   │   └── tb-lwm2m-transport.conf │   ├── mqtt │   │   └── conf │   │   ├── logback.xml │   │   └── tb-mqtt-transport.conf │   └── snmp │   └── conf │   ├── logback.xml │   └── tb-snmp-transport.conf ├── tb-vc-executor │   └── conf │   ├── logback.xml │   └── tb-vc-executor.conf ├── tb-vc-executor.env └── tb-web-ui.env ``` ### img ``` thingsboard/img/ └── logo.png ``` ### monitoring :::info monitoring 資料夾通常負責監控 ThingsBoard 平台的運行狀態和性能。 此模組的主要目的是提供工具和功能,幫助管理員和開發者監控系統的健康狀態、性能指標和潛在問題。 ::: ``` thingsboard/monitoring/ ├── pom.xml └── src └── main ├── conf │   ├── logback.xml │   └── tb-monitoring.conf ├── java │   └── org └── resources ├── logback.xml ├── lwm2m ├── root_rule_chain.json └── tb-monitoring.yml ``` ### msa :::info 微服務架構 (MicroService Architecture) 模組,支援 ThingsBoard 的微服務化部署。 ::: ``` thingsboard/msa/ ├── black-box-tests │   ├── pom.xml │   ├── README.md │   └── src │   └── test │   ├── java │   └── resources ├── js-executor │   ├── api │   │   ├── httpServer.ts │   │   ├── jsExecutor.models.ts │   │   ├── jsExecutor.ts │   │   ├── jsInvokeMessageProcessor.ts │   │   └── utils.ts │   ├── config │   │   ├── custom-environment-variables.yml │   │   ├── default.yml │   │   ├── logger.ts │   │   └── tb-js-executor.conf │   ├── docker │   │   ├── Dockerfile │   │   └── start-js-executor.sh │   ├── install.js │   ├── package.json │   ├── pom.xml │   ├── queue │   │   ├── kafkaTemplate.ts │   │   └── queue.models.ts │   ├── server.ts │   ├── tsconfig.json │   └── yarn.lock ├── monitoring │   ├── docker │   │   ├── Dockerfile │   │   └── start-tb-monitoring.sh │   └── pom.xml ├── pom.xml ├── tb │   ├── docker │   │   ├── install-tb.sh │   │   ├── logback.xml │   │   ├── start-tb.sh │   │   ├── thingsboard.conf │   │   └── upgrade-tb.sh │   ├── docker-cassandra │   │   ├── Dockerfile │   │   ├── start-db.sh │   │   └── stop-db.sh │   ├── docker-postgres │   │   ├── Dockerfile │   │   ├── start-db.sh │   │   └── stop-db.sh │   ├── pom.xml │   └── README.md ├── tb-node │   ├── docker │   │   ├── Dockerfile │   │   └── start-tb-node.sh │   └── pom.xml ├── transport │   ├── coap │   │   ├── docker │   │   │   ├── Dockerfile │   │   │   └── start-tb-coap-transport.sh │   │   └── pom.xml │   ├── http │   │   ├── docker │   │   │   ├── Dockerfile │   │   │   └── start-tb-http-transport.sh │   │   └── pom.xml │   ├── lwm2m │   │   ├── docker │   │   │   ├── Dockerfile │   │   │   └── start-tb-lwm2m-transport.sh │   │   └── pom.xml │   ├── mqtt │   │   ├── docker │   │   │   ├── Dockerfile │   │   │   └── start-tb-mqtt-transport.sh │   │   └── pom.xml │   ├── pom.xml │   └── snmp │   ├── docker │   │   ├── Dockerfile │   │   └── start-tb-snmp-transport.sh │   └── pom.xml ├── vc-executor │   ├── pom.xml │   └── src │   └── main │   ├── conf │   ├── java │   └── resources ├── vc-executor-docker │   ├── docker │   │   ├── Dockerfile │   │   └── start-tb-vc-executor.sh │   └── pom.xml └── web-ui ├── config │   ├── custom-environment-variables.yml │   ├── default.yml │   ├── logger.ts │   └── tb-web-ui.conf ├── docker │   ├── Dockerfile │   └── start-web-ui.sh ├── install.js ├── package.json ├── pom.xml ├── server.ts ├── tsconfig.json └── yarn.lock ``` ### netty-mqtt :::info Netty 框架:netty-mqtt 資料夾的名稱表明 ThingsBoard 使用了 Netty 框架來實現 MQTT 功能。Netty 是一個非阻塞的、事件驅動的網絡應用框架,廣泛用於高性能的網絡應用開發。 模組化設計:使用 netty-mqtt 這樣的命名可能是為了更好地模組化 ThingsBoard 的代碼結構,使得 MQTT 相關的功能更加獨立和可擴展。 性能優化:Netty 框架以其高性能和低延遲著稱,使用 Netty 來實現 MQTT 功能可能是為了提高 ThingsBoard 的性能和可靠性。 如何理解和使用 原始碼結構:瀏覽 netty-mqtt 資料夾,了解其中的類別和方法,特別是那些處理 MQTT 消息的核心類別。 配置和使用:查看 ThingsBoard 的配置文件和官方文檔,了解如何配置和使用 MQTT 功能。 擴展和自定義:如果需要擴展或自定義 MQTT 功能,可以在 netty-mqtt 資料夾中進行修改或添加新的實現。 ::: ``` thingsboard/netty-mqtt/ ├── pom.xml └── src ├── main │   └── java │   └── org └── test ├── java │   └── org └── resources ├── junit-platform.properties └── logback-test.xml ``` ### packaging :::info packaging 資料夾通常負責處理 ThingsBoard 的打包和發布過程。 此資料夾包含了將 ThingsBoard 打包成可發行形式(如 Docker 映像、Debian 套件等)所需的 script 和配置文件。 ::: ``` thingsboard/packaging/ ├── java │   ├── assembly │   │   └── windows.xml │   ├── build.gradle │   ├── filters │   │   ├── unix.properties │   │   └── windows.properties │   └── scripts │   ├── control │   │   ├── deb │   │   ├── rpm │   │   └── template.service │   ├── install │   │   ├── install_dev_db.sh │   │   ├── install.sh │   │   ├── logback.xml │   │   ├── upgrade_dev_db.sh │   │   └── upgrade.sh │   └── windows │   ├── install.bat │   ├── install_dev_db.bat │   ├── service.xml │   ├── uninstall.bat │   └── upgrade.bat └── js ├── assembly │   └── windows.xml ├── build.gradle ├── filters │   ├── unix.properties │   └── windows.properties └── scripts ├── control │   ├── deb │   ├── rpm │   └── template.service ├── init │   └── template └── windows ├── install.bat ├── service.xml └── uninstall.bat ``` ### rest-client :::info rest-client 資料夾通常負責處理與外部 REST API 的互動。此模組允許 ThingsBoard 與其他服務或平台進行通信,從而實現資料的匯入、匯出或其他形式的整合。 ::: ``` thingsboard/rest-client/ ├── pom.xml └── src └── main ├── java │   └── org └── resources └── logback.xml ``` ### rule-engine :::info 規則引擎模組,用於處理和轉換資料流。 * rule-engine-api:規則引擎的 API 接口。 * rule-engine-components:規則引擎的元件。 ::: ``` thingsboard/rule-engine/ ├── pom.xml ├── rule-engine-api │   ├── pom.xml │   └── src │   ├── main │   │   └── java │   └── test │   ├── java │   └── resources └── rule-engine-components ├── pom.xml └── src ├── main │   ├── java │   └── resources └── test ├── java └── resources ``` ### tools :::info 工具模組,包含一些輔助工具和 script。 ::: ``` thingsboard/tools/ ├── pom.xml └── src └── main ├── java │   └── org ├── python │   ├── check_yml_file.py │   ├── mqtt-send-telemetry.py │   ├── one-way-ssl-mqtt-client.py │   ├── simple-mqtt-client.py │   └── two-way-ssl-mqtt-client.py └── shell ├── client.keygen.sh ├── keygen.properties ├── lwm2m └── server.keygen.sh ``` ### transport :::info transport 資料夾是負責處理不同傳輸協議的模組。 ::: ``` thingsboard/transport/ ├── coap │   ├── pom.xml │   └── src │   └── main │   ├── conf │   ├── java │   └── resources ├── http │   ├── pom.xml │   └── src │   └── main │   ├── conf │   ├── java │   └── resources ├── lwm2m │   ├── pom.xml │   └── src │   └── main │   ├── conf │   ├── java │   └── resources ├── mqtt │   ├── pom.xml │   └── src │   └── main │   ├── conf │   ├── java │   └── resources ├── pom.xml └── snmp ├── pom.xml └── src └── main ├── conf ├── java └── resources ``` ### ui-ngx :::info 用戶介面模組,包含了 ThingsBoard 的前端原始碼 (基於 Angular 的前端介面)。 src:包含前端的原始碼和資源文件。 ::: ``` thingsboard/ui-ngx/ ├── angular.json ├── esbuild │   └── tb-esbuild-plugins.ts ├── generate-icon-metadata.js ├── generate-types.js ├── LICENSE ├── package.json ├── patches │   ├── @angular+build+18.2.12.patch │   ├── @angular+core+18.2.13.patch │   ├── @angular+flex-layout+15.0.0-beta.42.patch │   ├── angular-gridster2+18.0.1.patch │   ├── canvas-gauges+2.1.7.patch │   ├── jquery.terminal+2.44.1.patch │   └── @mat-datetimepicker+core+14.0.0.patch ├── pom.xml ├── proxy.conf.js ├── src │   ├── app │   │   ├── app.component.html │   │   ├── app.component.scss │   │   ├── app.component.ts │   │   ├── app.module.ts │   │   ├── app-routing.module.ts │   │   ├── core │   │   │   ├── api │   │   │   ├── auth │   │   │   ├── core.module.ts │   │   │   ├── core.state.ts │   │   │   ├── css │   │   │   ├── guards │   │   │   ├── http │   │   │   ├── interceptors │   │   │   ├── local-storage │   │   │   ├── meta-reducers │   │   │   ├── notification │   │   │   ├── operator │   │   │   ├── public-api.ts │   │   │   ├── services │   │   │   ├── settings │   │   │   ├── translate │   │   │   ├── utils.ts │   │   │   └── ws │   │   ├── modules │   │   │   ├── common │   │   │   ├── dashboard │   │   │   ├── home │   │   │   └── login │   │   └── shared │   │   ├── adapter │   │   ├── animations │   │   ├── components │   │   ├── decorators │   │   ├── directives │   │   ├── import-export │   │   ├── legacy │   │   ├── models │   │   ├── pipe │   │   ├── public-api.ts │   │   ├── services │   │   └── shared.module.ts │   ├── assets │   │   ├── android-ios-stores-badges │   │   │   ├── android_store_en_black_badge.svg │   │   │   └── ios_store_en_black_badge.svg │   │   ├── copy-code-icon.svg │   │   ├── dashboard │   │   │   ├── api_usage.json │   │   │   ├── customer_user_home_page.json │   │   │   ├── sys_admin_home_page.json │   │   │   └── tenant_admin_home_page.json │   │   ├── docker.svg │   │   ├── fonts │   │   │   ├── material-icons.css │   │   │   ├── MaterialIcons-Regular.ttf │   │   │   └── MaterialIconsRound-Regular.otf │   │   ├── help │   │   │   ├── en_US │   │   │   └── images │   │   ├── home │   │   │   ├── greetings_bg.svg │   │   │   ├── no_data_bg.svg │   │   │   └── no_data_folder_bg.svg │   │   ├── jstree │   │   │   ├── tb32px.png │   │   │   └── tb40px.png │   │   ├── linux.svg │   │   ├── locale │   │   │   ├── locale.constant-ar_AE.json │   │   │   ├── locale.constant-ca_ES.json │   │   │   ├── locale.constant-cs_CZ.json │   │   │   ├── locale.constant-da_DK.json │   │   │   ├── locale.constant-de_DE.json │   │   │   ├── locale.constant-el_GR.json │   │   │   ├── locale.constant-en_US.json │   │   │   ├── locale.constant-es_ES.json │   │   │   ├── locale.constant-fa_IR.json │   │   │   ├── locale.constant-fr_FR.json │   │   │   ├── locale.constant-it_IT.json │   │   │   ├── locale.constant-ja_JP.json │   │   │   ├── locale.constant-ka_GE.json │   │   │   ├── locale.constant-ko_KR.json │   │   │   ├── locale.constant-lt_LT.json │   │   │   ├── locale.constant-lv_LV.json │   │   │   ├── locale.constant-nl_BE.json │   │   │   ├── locale.constant-pl_PL.json │   │   │   ├── locale.constant-pt_BR.json │   │   │   ├── locale.constant-ro_RO.json │   │   │   ├── locale.constant-sl_SI.json │   │   │   ├── locale.constant-tr_TR.json │   │   │   ├── locale.constant-uk_UA.json │   │   │   ├── locale.constant-zh_CN.json │   │   │   └── locale.constant-zh_TW.json │   │   ├── logo_title_white.svg │   │   ├── logo_white.svg │   │   ├── macos.svg │   │   ├── metadata │   │   │   ├── material-icons.json │   │   │   └── units.json │   │   ├── notification-bell.svg │   │   ├── shadow.png │   │   ├── split.js │   │   │   └── grips │   │   ├── widget │   │   │   ├── alarm-count │   │   │   ├── battery-level │   │   │   ├── button │   │   │   ├── doughnut │   │   │   ├── entity-count │   │   │   ├── liquid-level │   │   │   ├── power-button │   │   │   ├── progress-bar │   │   │   ├── segmented-button │   │   │   ├── signal-strength │   │   │   ├── simple-gauge │   │   │   ├── single-switch │   │   │   ├── slider │   │   │   ├── status-widget │   │   │   ├── value-card │   │   │   ├── value-chart-card │   │   │   └── wind-speed-direction │   │   ├── widget-preview-empty.svg │   │   └── windows.svg │   ├── environments │   │   ├── environment.prod.ts │   │   └── environment.ts │   ├── form.scss │   ├── index.html │   ├── main.ts │   ├── polyfills.ts │   ├── scss │   │   ├── animations.scss │   │   ├── constants.scss │   │   ├── fonts.scss │   │   └── mixins.scss │   ├── styles.scss │   ├── theme │   │   └── datepicker-theme.scss │   ├── theme-overwrites.scss │   ├── theme.scss │   ├── thingsboard.ico │   ├── tsconfig.app.json │   ├── typings │   │   ├── jquery.flot.typings.d.ts │   │   ├── jquery.jstree.typings.d.ts │   │   ├── jquery.typings.d.ts │   │   ├── leaflet-extend-tb.d.ts │   │   ├── leaflet-geoman-extend.d.ts │   │   ├── rawloader.typings.d.ts │   │   ├── split.js.typings.d.ts │   │   └── utils.d.ts │   └── zone-flags.ts ├── tailwind.config.js ├── tsconfig.json └── yarn.lock ``` # References