1. 概述
本文主要研究 thingsboard 各種實(shí)體在關(guān)系型數(shù)據(jù)庫(kù) postgres 中的存儲(chǔ)涵妥。
2. 安裝與配置使用 Postgresql 數(shù)據(jù)庫(kù)
從源碼編譯安裝參考 : https://thingsboard.io/docs/user-guide/contribution/how-to-contribute/
編譯運(yùn)行后侠碧,需創(chuàng)建 thingsboard 數(shù)據(jù)庫(kù):
psql -U postgres -d postgres -h 127.0.0.1 -W
CREATE DATABASE thingsboard;
\q
Postgresql 的基本使用澄者,見(jiàn) http://www.atjiang.com/postgresql-beginner-11-tasks/
Thingsboard v2.4 中儒士,默認(rèn)使用的數(shù)據(jù)庫(kù)用戶名和密碼都是 postgres, 見(jiàn) /application/src/main/resources/thingsboard.yml
:
datasource:
driverClassName: "${SPRING_DRIVER_CLASS_NAME:org.postgresql.Driver}"
url: "${SPRING_DATASOURCE_URL:jdbc:postgresql://localhost:5432/thingsboard}"
username: "${SPRING_DATASOURCE_USERNAME:postgres}"
password: "${SPRING_DATASOURCE_PASSWORD:postgres}"
創(chuàng)建 schema 并導(dǎo)入測(cè)試數(shù)據(jù):
cd ~/workspace/thingsboard/application/target/bin/install
chmod +x install_dev_db.sh
./install_dev_db.sh
登錄測(cè)試
http://127.0.0.1:8080/
用戶名 tenant@thingsboard.org
密碼 tenant
實(shí)體
Tenants 租戶
是一個(gè)獨(dú)立的商業(yè)實(shí)體:比如個(gè)人或組織钦奋,可以擁有若產(chǎn)生多個(gè)設(shè)備或資產(chǎn)蓄喇。一個(gè)租戶可有多個(gè)租戶管理員用戶及多個(gè)客戶花鹅。
可將它理解為代理商氧腰,中間商,如中國(guó)移動(dòng)是一個(gè) tenant, 承包了某地區(qū)的所有項(xiàng)目翠胰,信息保存在 tenant
表中容贝。
Customers 客戶
也是一個(gè)獨(dú)立的商業(yè)實(shí)體:如何個(gè)人或組織,客戶從租戶那購(gòu)買(mǎi)設(shè)備和資產(chǎn)之景。一個(gè)客戶中可有多個(gè)用戶斤富。
可將它理解為甲方客戶,如某單位或企業(yè)锻狗,從租戶中國(guó)移動(dòng)那購(gòu)買(mǎi)服務(wù)满力。
信息保存在 customer
表中, 通過(guò) tenant_id
關(guān)聯(lián)相應(yīng)的 tenant。
Users 用戶
用戶登錄系統(tǒng)轻纪,查看信息并管理實(shí)體的賬號(hào)油额。系統(tǒng)中創(chuàng)建的用戶,保存于 tb_user
中刻帚。
通過(guò) customer_id
和 tenant_id
關(guān)聯(lián)相應(yīng)的租戶和客戶潦嘶,用戶權(quán)限由 authority
字段指定,值見(jiàn):
// thingsboard/common/data/src/main/java/org/thingsboard/server/common/data/security/Authority.java
public enum Authority {
SYS_ADMIN(0),
TENANT_ADMIN(1),
CUSTOMER_USER(2),
REFRESH_TOKEN(10);
}
customer_id 和 tenant_id 有一個(gè)默認(rèn)的值 1b21dd2138140008080808080808080崇众,該值應(yīng)該為系統(tǒng)中的一個(gè)默認(rèn) Tenant 和 Customer 值掂僵。
例如系統(tǒng)管理員賬戶 "sysadmin@thingsboard.org" 對(duì)應(yīng)的 customer_id 和 tenant_id 即為該值。
Devices 設(shè)備
設(shè)備可上傳遙測(cè)數(shù)據(jù)或執(zhí)行 RPC 命令顷歌。
保存于 device
表中锰蓬,通過(guò) customer_id
和 tenant_id
關(guān)聯(lián)相應(yīng)的租戶和客戶。設(shè)備類型由 type
字符串字段指定眯漩,默認(rèn)為 default
, 可自由創(chuàng)建新值芹扭。
新建的設(shè)備,其默認(rèn) customer_id 為 1b21dd2138140008080808080808080赦抖,該值應(yīng)該為系統(tǒng)中的一個(gè)默認(rèn) Customer 值舱卡。
通過(guò)設(shè)備管理界面可以分配給指定客戶。
設(shè)備的訪問(wèn)憑證信息保存在表 device_credentials
中摹芙,類型由 credentials_type
字段指定灼狰,類型值見(jiàn):
// thingsboard/common/data/src/main/java/org/thingsboard/server/common/data/security/DeviceCredentialsType.java
public enum DeviceCredentialsType {
ACCESS_TOKEN,
X509_CERTIFICATE
}
Assets 資產(chǎn)
一種用于關(guān)聯(lián)其它設(shè)備和資產(chǎn)的抽象實(shí)體,如區(qū)域浮禾、建筑物交胚、單位等,是一個(gè)容器概念盈电。 保存于表 asset
中蝴簇。
Alarms 警報(bào)
與各種實(shí)體關(guān)聯(lián)的警報(bào)事件。
保存于表 alarm
匆帚,由 originator_id
和 originator_type
關(guān)聯(lián)實(shí)體熬词,狀態(tài)由 status
字段指定,值見(jiàn):
// thingsboard/common/data/src/main/java/org/thingsboard/server/common/data/alarm/AlarmSearchStatus.java
public enum AlarmSearchStatus {
ANY, ACTIVE, CLEARED, ACK, UNACK
}
Dashboards
可視化面板吸重,可可視化數(shù)據(jù)互拾,并操控設(shè)備。
保存于表 dashboard
中嚎幸,Dashboard 由 tenant 所有颜矿,通過(guò) tenant_id
字段關(guān)聯(lián)。并可以分配給多人 customer, 分配信息保存在 assigned_customers
字段中嫉晶,如:
[
{
"customerId":{
"entityType":"CUSTOMER",
"id":"5c3c4ff0-8763-11ea-b734-6151c7bf4d3f"
},
"title":"Customer B",
"public":false
},
{
"customerId":{
"entityType":"CUSTOMER",
"id":"5c360e60-8763-11ea-b734-6151c7bf4d3f"
},
"title":"Customer A",
"public":false
}
]
Rule Node 規(guī)則結(jié)點(diǎn)
處理結(jié)點(diǎn)骑疆,對(duì)上報(bào)的信息及實(shí)體事件進(jìn)行處理。
保存在表 rule_node
中替废,通過(guò) rule_chain_id
關(guān)聯(lián)到某個(gè)規(guī)則鏈箍铭。
系統(tǒng)已創(chuàng)建了多種結(jié)點(diǎn)類型,當(dāng)前結(jié)點(diǎn)類型在 type
字段中指定椎镣,值例如(有很多):
- "org.thingsboard.rule.engine.telemetry.TbMsgTimeseriesNode"
- "org.thingsboard.rule.engine.telemetry.TbMsgAttributesNode"
- "org.thingsboard.rule.engine.filter.TbMsgTypeSwitchNode"
- "org.thingsboard.rule.engine.action.TbLogNode"
- "org.thingsboard.rule.engine.rpc.TbSendRPCRequestNode"
見(jiàn) thingsboard/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/telemetry/TbMsgTimeseriesNode.java, thingsboard/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbLogNode.java 等文件中的定義诈火。
配置信息保存在字段 configuration
中,是 JSON 字串状答,如 {"timeoutInSeconds":60}
冷守。
additional_info
字段中保存當(dāng)前結(jié)點(diǎn)在規(guī)則鏈配置界面中的坐標(biāo),是 JSON 字串剪况,如 {"layoutX":824,"layoutY":138}
教沾。
Rule Chain 規(guī)則鏈
關(guān)聯(lián)的多個(gè)規(guī)則結(jié)點(diǎn)的一個(gè)邏輯單元。
保存于表 rule_chain
中译断,首個(gè)結(jié)點(diǎn)通過(guò) first_rule_node_id
指定授翻,通過(guò) root boolean
指定是否為根鏈,通過(guò) tenant_id
關(guān)聯(lián) Tenant孙咪。描述信息等以 JSON 字串形式保存在 additional_info
字段中堪唐。
所有實(shí)體支持屬性、遙測(cè)數(shù)據(jù)和關(guān)聯(lián): Attributes, Telemetry date, Relations.
Attributes 屬性
屬性值是鍵值對(duì)翎蹈, 保存于表 attribute_kv
中淮菠。實(shí)體由 entity_type
和 entity_id
字段關(guān)聯(lián),屬性類型由 attribute_type
指定荤堪,值見(jiàn):
// thingsboard/common/data/src/main/java/org/thingsboard/server/common/data/DataConstants.java
public class DataConstants {
public static final String CLIENT_SCOPE = "CLIENT_SCOPE";
public static final String SERVER_SCOPE = "SERVER_SCOPE";
public static final String SHARED_SCOPE = "SHARED_SCOPE";
public static final String[] allScopes() {
return new String[]{CLIENT_SCOPE, SHARED_SCOPE, SERVER_SCOPE};
}
kv 值中的 key 在 attribute_key
中保存合陵,value 在 bool_v
, str_v
, long_v
, dbl_v
字段其中一個(gè)中保存枢赔,分別表示為 bool, string, long, double 值。
Telemetry data 遙測(cè)數(shù)據(jù)
時(shí)序數(shù)據(jù)拥知。
歷史值在 ts_kv
表中保存踏拜, 最新數(shù)據(jù)在 ts_kv_latest
表中保存。
實(shí)體由 entity_type
和 entity_id
字段關(guān)聯(lián)低剔,key 在 key
字段速梗,時(shí)間在 ts
字段,值在 bool_v
, str_v
, long_v
, dbl_v
襟齿。
Relations 關(guān)聯(lián)
實(shí)體間的有向連接關(guān)系信息姻锁。
保存于表 relation
中,關(guān)聯(lián)是兩個(gè)實(shí)體間的一種關(guān)系猜欺,由 from_id
, from_type
字段指定 from 端的實(shí)體位隶,實(shí)體類型值見(jiàn):
// thingsboard/common/data/src/main/java/org/thingsboard/server/common/data/EntityType.java
public enum EntityType {
TENANT, CUSTOMER, USER, DASHBOARD, ASSET, DEVICE, ALARM, RULE_CHAIN, RULE_NODE, ENTITY_VIEW, WIDGETS_BUNDLE, WIDGET_TYPE
}
由 to_id
, to_type
字段指定 to 端的實(shí)體。
關(guān)聯(lián)關(guān)系由 relation_type_group
和 relation_type
字段指定替梨。
Audit Logs 審計(jì)日志
審計(jì)/操作記錄信息保存在表 audit_log
中钓试,操作者通過(guò) tenant_id
, customer_id
, user_id
, user_name
字段指定,操作對(duì)象通過(guò) entity_id
, entity_type
, entity_name
字段指定副瀑, 操作類型由 action_type
字段指定弓熏,值見(jiàn):
// thingsboard/common/data/src/main/java/org/thingsboard/server/common/data/audit/ActionType.java
public enum ActionType {
ADDED(false), // log entity
DELETED(false), // log string id
UPDATED(false), // log entity
ATTRIBUTES_UPDATED(false), // log attributes/values
ATTRIBUTES_DELETED(false), // log attributes
TIMESERIES_DELETED(false), // log timeseries
RPC_CALL(false), // log method and params
CREDENTIALS_UPDATED(false), // log new credentials
ASSIGNED_TO_CUSTOMER(false), // log customer name
UNASSIGNED_FROM_CUSTOMER(false), // log customer name
ACTIVATED(false), // log string id
SUSPENDED(false), // log string id
CREDENTIALS_READ(true), // log device id
ATTRIBUTES_READ(true), // log attributes
RELATION_ADD_OR_UPDATE(false),
RELATION_DELETED(false),
RELATIONS_DELETED(false),
ALARM_ACK(false),
ALARM_CLEAR(false),
LOGIN(false),
LOGOUT(false),
LOCKOUT(false);
private final boolean isRead;
ActionType(boolean isRead) {
this.isRead = isRead;
}
}
操作數(shù)據(jù)以 JSON 字串形式保存在 action_data
中。
操作狀態(tài)在 action_status
字段指定糠睡,值有 SUCCESS
和 FAILURE
挽鞠,如果失敗,則失敗信息在 action_failure_details
字段中保存狈孔,如 PRC Error: Timeout
信认。