thingsboard 實(shí)體及數(shù)據(jù)存儲(chǔ)研究

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_idtenant_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_idtenant_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_idoriginator_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_typeentity_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_typeentity_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_grouprelation_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 字段指定糠睡,值有 SUCCESSFAILURE挽鞠,如果失敗,則失敗信息在 action_failure_details 字段中保存狈孔,如 PRC Error: Timeout信认。

資源

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市均抽,隨后出現(xiàn)的幾起案子嫁赏,更是在濱河造成了極大的恐慌,老刑警劉巖油挥,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件潦蝇,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡深寥,警方通過(guò)查閱死者的電腦和手機(jī)攘乒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)惋鹅,“玉大人则酝,你說(shuō)我怎么就攤上這事∪蚣” “怎么了沽讹?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵般卑,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我妥泉,道長(zhǎng)椭微,這世上最難降的妖魔是什么洞坑? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任盲链,我火速辦了婚禮,結(jié)果婚禮上迟杂,老公的妹妹穿的比我還像新娘刽沾。我一直安慰自己,他們只是感情好排拷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布侧漓。 她就那樣靜靜地躺著,像睡著了一般监氢。 火紅的嫁衣襯著肌膚如雪布蔗。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,155評(píng)論 1 299
  • 那天浪腐,我揣著相機(jī)與錄音纵揍,去河邊找鬼。 笑死议街,一個(gè)胖子當(dāng)著我的面吹牛泽谨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播特漩,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼吧雹,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了涂身?” 一聲冷哼從身側(cè)響起雄卷,我...
    開(kāi)封第一講書(shū)人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蛤售,沒(méi)想到半個(gè)月后丁鹉,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡悍抑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年鳄炉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片搜骡。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拂盯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出记靡,到底是詐尸還是另有隱情谈竿,我是刑警寧澤团驱,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站空凸,受9級(jí)特大地震影響嚎花,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜呀洲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一紊选、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧道逗,春花似錦兵罢、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至吏夯,卻和暖如春此蜈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背噪生。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工裆赵, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人杠园。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓顾瞪,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親抛蚁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子陈醒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容