本文档为描述thingsboard-2.4.3 文档API,官方文档可参考swagger(https://demo.thingsboard.io/swagger-ui.htm)。
文件路径 | |
http://localhost:8080/api/auth/login | |
备注 | |
Thingsboard模拟登录接口,主要是为获取token即后续请求中的Heards中的X-Authorization属性,X-Authorization属性为“Bearer ”+token | |
请求方式:post | 样例 |
{ "password": "登录用户登录密码", "username": "登录用户登录账号" } | { "password": "123456", "username": "425804004@qq.com" } |
返回参数 | 样例 |
{ " token ": "请求中的X-Authorization",用户验证登录token, " refreshToken ": "暂时未知用处" } | { "token": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI0MjU4MDQwMDRAcXEuY29tIiwic2NvcGVzIjpbIlRFTkFOVF9BRE1JTiJdLCJ1c2VySWQiOiJhZGUyNGE1MC05Njc1LTExZWEtYmE0Yi0yMzFkYTZiNjMxN2MiLCJmaXJzdE5hbWUiOiLnjosiLCJsYXN0TmFtZSI6InNuIiwiZW5hYmxlZCI6dHJ1ZSwiaXNQdWJsaWMiOmZhbHNlLCJ0ZW5hbnRJZCI6Ijk2NzFjNTgwLTk2NzUtMTFlYS1iYTRiLTIzMWRhNmI2MzE3YyIsImN1c3RvbWVySWQiOiIxMzgxNDAwMC0xZGQyLTExYjItODA4MC04MDgwODA4MDgwODAiLCJpc3MiOiJ0aGluZ3Nib2FyZC5pbyIsImlhdCI6MTU4OTc2NTU5NCwiZXhwIjoxNTg5Nzc0NTk0fQ.uatvo-78HtGqZMQ1RM027S3atlIJPCkC7ucNoaqvIaYaj6JeKAw8ef8mP7lLBrU1liJtiJeMpMvF-k1abwx5iQ", "refreshToken": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI0MjU4MDQwMDRAcXEuY29tIiwic2NvcGVzIjpbIlJFRlJFU0hfVE9LRU4iXSwidXNlcklkIjoiYWRlMjRhNTAtOTY3NS0xMWVhLWJhNGItMjMxZGE2YjYzMTdjIiwiaXNQdWJsaWMiOmZhbHNlLCJpc3MiOiJ0aGluZ3Nib2FyZC5pbyIsImp0aSI6IjU3NjFmMWQ0LWRjNTYtNDBmZS05MzE1LWNiMzQ2MTVjODY0NCIsImlhdCI6MTU4OTc2NTU5NCwiZXhwIjoxNTkwMzcwMzk0fQ.B5XaBidSMFUNTu6kUWkAPXcLvMVhji2jA9HYlrG6DQ5-yGIEzp33xrg6WRcnFU2ST8ZVoS-sPPtuEfgtDG8j9g" }
|
文件路径 | |
http://localhost:8080/api/user?sendActivationMail=false | |
备注 | |
Thingsboard模拟用户注册,要以CUSTOMER或者TENANT登录 | |
请求方式:post | 样例 |
{ "activateToken": "激活识别码 user_credentials表中active_token", "password": "密码" } | { "additionalInfo": "", "authority": "CUSTOMER_USER", "createdTime": 0, "customerId": { "entityType":"CUSTOMER", "id": "6d42c150-9a3f-11ea-a1bf-855437c63131" }, "email": "wxy3@qq.com", "firstName": "wxy_firstName3", "lastName": "wxy_lastName3", "name": "wxy_lastname3", "tenantId": { "entityType":"TENANT", "id": "e2f1e640-9677-11ea-99bd-593d12885a1e" } } |
返回参数 | 样例 |
{ " token ": "请求中的X-Authorization",用户验证登录token, " refreshToken ": "暂时未知用处" } | { "token": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI0MjU4MDQwMDRAcXEuY29tIiwic2NvcGVzIjpbIlRFTkFOVF9BRE1JTiJdLCJ1c2VySWQiOiJhZGUyNGE1MC05Njc1LTExZWEtYmE0Yi0yMzFkYTZiNjMxN2MiLCJmaXJzdE5hbWUiOiLnjosiLCJsYXN0TmFtZSI6InNuIiwiZW5hYmxlZCI6dHJ1ZSwiaXNQdWJsaWMiOmZhbHNlLCJ0ZW5hbnRJZCI6Ijk2NzFjNTgwLTk2NzUtMTFlYS1iYTRiLTIzMWRhNmI2MzE3YyIsImN1c3RvbWVySWQiOiIxMzgxNDAwMC0xZGQyLTExYjItODA4MC04MDgwODA4MDgwODAiLCJpc3MiOiJ0aGluZ3Nib2FyZC5pbyIsImlhdCI6MTU4OTc2NTU5NCwiZXhwIjoxNTg5Nzc0NTk0fQ.uatvo-78HtGqZMQ1RM027S3atlIJPCkC7ucNoaqvIaYaj6JeKAw8ef8mP7lLBrU1liJtiJeMpMvF-k1abwx5iQ", "refreshToken": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI0MjU4MDQwMDRAcXEuY29tIiwic2NvcGVzIjpbIlJFRlJFU0hfVE9LRU4iXSwidXNlcklkIjoiYWRlMjRhNTAtOTY3NS0xMWVhLWJhNGItMjMxZGE2YjYzMTdjIiwiaXNQdWJsaWMiOmZhbHNlLCJpc3MiOiJ0aGluZ3Nib2FyZC5pbyIsImp0aSI6IjU3NjFmMWQ0LWRjNTYtNDBmZS05MzE1LWNiMzQ2MTVjODY0NCIsImlhdCI6MTU4OTc2NTU5NCwiZXhwIjoxNTkwMzcwMzk0fQ.B5XaBidSMFUNTu6kUWkAPXcLvMVhji2jA9HYlrG6DQ5-yGIEzp33xrg6WRcnFU2ST8ZVoS-sPPtuEfgtDG8j9g" }
|
文件路径 | |
http://localhost:8080/api/noauth/activate | |
备注 | |
Thingsboard模拟用户注册之后,通过接口激活并设置密码。X-Authorization验证,Content_type设置为application/json | |
请求方式:post | 样例 |
{ "activateToken": "激活识别码 user_credentials表中active_token", "password": "密码" } | { "activateToken":"CeE9msXOkngYeggwvMB7L9N6a9B4ws", "password": "123456" } |
返回参数 | 样例 |
{ " token ": "请求中的X-Authorization",用户验证登录token, " refreshToken ": "暂时未知用处" } | { "token": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI0MjU4MDQwMDRAcXEuY29tIiwic2NvcGVzIjpbIlRFTkFOVF9BRE1JTiJdLCJ1c2VySWQiOiJhZGUyNGE1MC05Njc1LTExZWEtYmE0Yi0yMzFkYTZiNjMxN2MiLCJmaXJzdE5hbWUiOiLnjosiLCJsYXN0TmFtZSI6InNuIiwiZW5hYmxlZCI6dHJ1ZSwiaXNQdWJsaWMiOmZhbHNlLCJ0ZW5hbnRJZCI6Ijk2NzFjNTgwLTk2NzUtMTFlYS1iYTRiLTIzMWRhNmI2MzE3YyIsImN1c3RvbWVySWQiOiIxMzgxNDAwMC0xZGQyLTExYjItODA4MC04MDgwODA4MDgwODAiLCJpc3MiOiJ0aGluZ3Nib2FyZC5pbyIsImlhdCI6MTU4OTc2NTU5NCwiZXhwIjoxNTg5Nzc0NTk0fQ.uatvo-78HtGqZMQ1RM027S3atlIJPCkC7ucNoaqvIaYaj6JeKAw8ef8mP7lLBrU1liJtiJeMpMvF-k1abwx5iQ", "refreshToken": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI0MjU4MDQwMDRAcXEuY29tIiwic2NvcGVzIjpbIlJFRlJFU0hfVE9LRU4iXSwidXNlcklkIjoiYWRlMjRhNTAtOTY3NS0xMWVhLWJhNGItMjMxZGE2YjYzMTdjIiwiaXNQdWJsaWMiOmZhbHNlLCJpc3MiOiJ0aGluZ3Nib2FyZC5pbyIsImp0aSI6IjU3NjFmMWQ0LWRjNTYtNDBmZS05MzE1LWNiMzQ2MTVjODY0NCIsImlhdCI6MTU4OTc2NTU5NCwiZXhwIjoxNTkwMzcwMzk0fQ.B5XaBidSMFUNTu6kUWkAPXcLvMVhji2jA9HYlrG6DQ5-yGIEzp33xrg6WRcnFU2ST8ZVoS-sPPtuEfgtDG8j9g" }
|
文件路径 | 备注 |
localhost:8080/api/device | 创建设备 |
请求方式:post | 样例 |
{ "name": "设备名臣", "type": "类型", "label": "备注"} | { "name": "wxy_demoTest3", "type": "wxyType", "label": "333"} |
返回参数 | 样例 |
{ "id": { "entityType": "DEVICE", "id": "8ccc9f50-9b2f-11ea-a9eb-7dce1a5f97e1" }, "createdTime": 1590043911621, "additionalInfo": null, "tenantId": { "entityType": "TENANT", "id": "e2f1e640-9677-11ea-99bd-593d12885a1e" }, "customerId": { "entityType": "CUSTOMER", "id": "13814000-1dd2-11b2-8080-808080808080" }, "name": "wxy_demoTest3", "type": "wxyType", "label": "333" }
| { "id": { "entityType": "DEVICE", "id": "8ccc9f50-9b2f-11ea-a9eb-7dce1a5f97e1" }, "createdTime": 1590043911621, "additionalInfo": null, "tenantId": { "entityType": "TENANT", "id": "e2f1e640-9677-11ea-99bd-593d12885a1e" }, "customerId": { "entityType": "CUSTOMER", "id": "13814000-1dd2-11b2-8080-808080808080" }, "name": "wxy_demoTest3", "type": "wxyType", "label": "333" }
|
文件路径 | 备注 |
http://localhost:8080/api/devices | 通过thingsboard中获取设备id来获取设备信息 |
请求方式:get | 样例 |
deviceIds:设备id |
|
返回参数 | 样例 |
[ { "id": { "entityType": "DEVICE", "id": "d1b4dd20-9676-11ea-ba4b-231da6b6317c" }, "createdTime": 1589524765682, "additionalInfo": null, "tenantId": { "entityType": "TENANT", "id": "9671c580-9675-11ea-ba4b-231da6b6317c" }, "customerId": { "entityType": "CUSTOMER", "id": "353aba50-9676-11ea-ba4b-231da6b6317c" }, "name": "Thermometer A-1", "type": "Thermometer", "label": null } ]
| [ { "id": { "entityType": "实体类型 设备", "id": "设备ID" }, "createdTime": 创建时间, "additionalInfo": 未知, "tenantId": { "entityType": "实体类型 租户TENANT", "id": "租户ID" }, "customerId": { "entityType": "实体类型 客户CUSTOMER ", "id": "客户ID" }, "name": "设备名", "type": "设备类型", "label": 备注 } ]
|
见1.1用户管理中response中的token。X-Authorization属性,X-Authorization属性为“Bearer ”+token
文件路径 | |
/api/plugins/telemetry/{entityType}/{entityId}/keys/timeseries | |
备注 | |
使用下面的GET 请求地址获取指定entity 类型和entity id 的所有属性key 列 表 | |
请求方式:GET | 样例 |
entityType:实体类型为DEVICE entityId:设备ID | localhost:8080/api/plugins/telemetry/DEVICE/164cdf40-98e9-11ea-a395-29ac603606d4/keys/timeseries |
返回参数 | 样例 |
[ "key", "key" ] | [ "temperature", "humidity" ]
|
文件路径 | |
/api/plugins/telemetry/{entityType}/{entityId}/values/timeseries{?keys,useStrictDataTypes} | |
备注 | |
使用下面的GET 请求地址获取指定entity 类型和entity id 的所有属性value 列表 | |
请求方式:GET | 样例 |
entityType:实体类型为DEVICE entityId:设备ID keys:key名称 useStrictDataTypes:是否严格数据格式true or false 暂时没发现影响 | localhost:8080/api/plugins/telemetry/DEVICE/164cdf40-98e9-11ea-a395-29ac603606d4/values/timeseries?keys=temperature,humidity&useStrictDataTypes =false |
返回参数 | 样例 |
{ "temperature": [ { "ts": Unix 时间戳, "value": "key数值" } ], "humidity": [ { "ts": Unix 时间戳, "value": "key数值" } ] } | { "temperature": [ { "ts": 1589793820187, "value": "41.4" } ], "humidity": [ { "ts": 1589793820187, "value": "12.6" } ] }
|
文件路径 | |
/api/plugins/telemetry/{entityType}/{entityId}/values/timeseries{?interval,limit,agg,useStrictDataTypes,keys,startTs,endTs} | |
备注 | |
使用下面的GET 请求地址获取指定entity 类型和entity id 的所有属性value 列表。时间戳以毫秒为单位,以秒为单位查询不出来数据。 | |
请求方式:GET | 样例 |
1. keys-以逗号分隔的要获取的遥测键列表。 2. startTs -Unix 时间戳,标识间隔的开始(以毫秒为单位)。 3. endTs -Unix 时间戳,标识间隔的结束时间(以毫秒为单位)。 4. interval-聚合间隔,以毫秒为单位。 5. agg-聚合函数。MIN,MAX,AVG,SUM,COUNT,NONE 之一。 6. limit-要返回的最大数据点数或要处理的间隔。 | localhost:8080/api/plugins/telemetry/DEVICE/164cdf40-98e9-11ea-a395-29ac603606d4/values/timeseries?interval=0&limit=100&agg=COUNT&useStrictDataTypes=false&keys=temperature,humidity&startTs=1588336991000&endTs=1589978591000 |
返回参数 | 样例 |
{ "temperature": [ { "ts": Unix 时间戳(毫秒), "value": "key数值" } ], "humidity": [ { "ts": Unix 时间戳, "value": "key数值" } ] } | { "temperature": [ { "ts": 1589856134531, "value": "11.2" },
] }
|
这里用户的token参考1.1模拟登录中的token 但是不需要加“Bearer ”!!!!
查看txt创建规则链
以5.1创建的根规则链来做绑定,进行node一些列节点的操作可以看5.1.也可以直接插入数据库,然后调用5.3刷新缓存。
xibianCode\thingsboard-2.4.3\application\src\main\resources\thingsboard.yml
包括数据库连接属性等(ps可以采用默认thingsboard数据库名称,postgres为账号密码)
server: # Server bind address address: "${HTTP_BIND_ADDRESS:0.0.0.0}" # Server bind port port: "${HTTP_BIND_PORT:8080}" # Server SSL configuration
简单设置服务器端口地址,如若后面更详细设置参考官网
Property | Environment Variable | Default Value | Description |
HTTP server parameters | |||
server.address | HTTP_BIND_ADDRESS | 0.0.0.0 | HTTP Server bind address |
server.port | HTTP_BIND_PORT | 8080 | HTTP Server bind port |
server.ssl.enabled | SSL_ENABLED | false | Enable/disable SSL support |
server.ssl.key-store | SSL_KEY_STORE |
6.2.1 实体关系
· 租户 - 您可以将租户视为一个独立的业务实体:使用或生产设备、资产的个人或组织;租户可能有多个租户管理员账户和数百万用户账户;
· 客户 - 客户也是一个独立的业务实体:购买或使用了租户的设备/资产;客户可以拥有多个用户账户以及数百万的设备/资产;
· 用户 - 用户可以查看仪表板,管理实体:
· 设备 - 可产生遥测数据和处理远程命令的基本物联网实体。例如传感器,执行器,开关;
· 资产 - 可能与其他设备和资产相关的物联网实体。例如工厂、场地、项目、车辆;
· 警报 - 标识与资产、设备或其他实体有关的问题的事件;
· 面板 - 将 IoT 设备数据可视化并可通过用户接口控制设备;
· 规则节点 - 处理传入消息、实体生命周期事件等的单元;
· 规则链 - 相关规则节点的逻辑单元;
每个实体都支持:
6.2.2 设备关系
· 客户端属性 – MQTT协议初次发送包含内容属性,MQTT topic为v1/devices/me/attributes;
· 服务端属性 – active为是否在线状态,一个设备token令牌只能接受一个连接,其他为其英文名称含义
· 遥测数据 – 为简单key-value属性,可以通过api或者webstocket获取并且在postmanSQL中存于ts_kv表中,主要用于数据显示,规则链报警条件等,为设备实时采集数据,其MQTT topic为v1/devices/me/attributes;
Thingsboard中在数据库中存储是将UUID去掉“-”并且以一定顺序来进行存储的,但是在API调用时使用的是UUID来进行访问。
com.neusoft.commonModel.util.UUIDConverterUtil 进行UUID和数据库中存在ID转换
com.neusoft.commonModel.util.UUIDSUtil 根据时间戳生成UUID
暂时未写
dispatcherServlet
RawAccessJwtToken
整体属性配置文件
DefaultAccessControlService
权限去除 69行 可能会引发后续问题,暂时待定。
ThingsboardSecurityConfiguration Handler等配置
RestClient 模拟请求
UsernamePasswordAuthenticationFilter 用户密码验证
DefaultSystemSecurityService 默认系统登录验证 wxy修改了加密方式变为MD5
DataValidator 去除掉了邮箱验证,但是不能通过前台界面登录
RuleChainController 新增了刷新规则链缓存方法 节点内容
refreshRootRule 刷新根节点规则链内容缓存。
refreshRule 刷新node缓存机制。
DefaultAccessControlService
checkPermission 去掉权限验证。
通过AuthController中changePassword()方法中的
userCredentials.setPassword(passwordEncoder.encode(newPassword));
发现其调用encode()方法中进行BCrypt加密
具体加密算法为BCrypt.class
Jbcrypt-0.3m.jar 加解密工具 jBCrypt
详解: java版Bcrypt ,加解密工具 (用于账号密码加密,被时间检证过了) ,对用户的口令进行Hash,并使用salt,以防止Rainbow 攻击(Hash算法可用MD5或SHA1等,对口令使用salt的意思是,user 在设定密码时,system 产生另外一个random string(salt)。在datbase 存的是与salt + passwd 产的md5sum 及salt。当要验证密码时就把user 输入的string 加上使用者的salt,产生md5sum 来比对。理论上用salt 可以大幅度让密码更难破解,相同的密码除非刚好salt 相同,最后存在database 上的内容是不一样的。使用慢一点的Hash算法来保存口令,如 bcrypt (被时间检证过了) 或是 scrypt (更强,但是也更新一些)。
String password = "testpassword";
String hashed = BCrypt.hashpw(password, BCrypt.gensalt());
System.out.println(hashed);
org.thingsboard.server.controller.AbstractControllerTest.class 一些登录操作 如何放置token
TbCheckMessageNode.java 暂时未知做什么的
appaction.main.java.org.thingsboard.server ThingsboardServerApplication.java(启动类)
install thingsboard服务开启相关配置、异常和调用
exception thingsboard响应错误及错误逻辑处理
controller thingsboard页面展示必要的 系统数据 接口
service 为controller提供支持
config 为同源策略、swagger、webSocket、消息及安全配置注册spring bean
Data 用于与不同db之间的中间数据结构。
Message 定义不同的消息类型。
Transport 定义一个公共的接口,供与客户端的transport层使用
dao抽象了对不同数据库的统一接口。dao的接口数据一般都data,根据不同的数据库在不同的接口中转换为对应的实体类与数据库交互.通过@ConditionalOnProperty(prefix = "database", value = "type", havingValue = "cassandra")动态注入不同的数据库
系统发布资源类
系统图片类
black-box-tests 黑盒测试
js-executor javascript执行器
数据交互协议
规则引擎相关代码
系统工具类
http Thingsboard的http传输协议启动类
coap Thingsboard的coap传输协议启动类
mqtt Thingsboard的mqtt传输协议启动类
使用到的前端技术: Angularjs、ES6、Reactjs、webpack
前端MVC、MVVM框架
设计到前端打包配置文件:server.js, webpack.*.js
如需在thingsboard添加新的接口
可参考:Usercontroller.java 类
application
1: Controller
2: dao
3: sql
[相关代码类controller说明 , 文档使用了swagger
1: 管理控制器(admin-controller):管理控制器显示
2: 报警控制器(alarm-controller):报警控制器显示
3: 资产控制器(asset-controller):资产控制器显示
4: 审核日志控制器(audit-log-controller):审核日志控制器显示
5: 身份验证控制器(auth-controller):身份验证控制器显示
6: 组件描述符控制器(component-descriptor-controller):组件描述符控制器显示
7: 客户控制器(customer-controller):客户控制器显示
8: 仪表板控制器(dashboard-controller):仪表板控制器显示
9: 设备API控制器(device-api-controller):设备API控制器显示
10: 设备控制器(device-controller):设备控制器显示
11: 实体关系控制器(entity-relation-controller):实体关系控制器显示
12: 实体视图控制器(entity-view-controller):实体视图控制器显示
13: 事件控制器(event-controller):事件控制器显示
14: RPC控制器(rpc-controller):RPC控制器显示
15: 规则链控制器(rule-chain-controller):规则链控制器显示
16: 遥测控制器(telemetry-controller):遥测控制器显示
17: 租户控制器(tenant-controller):租户控制器显示
18: 用户控制器(user-controller):用户控制器显示
19: 控件类型控制器(widget-type-controller):控件类型控制器显示
20: 控件束控制器(widgets-bundle-controller):控件束控制器显示
详情运行thingsbroads开发环境后:输入地址查阅http://localhost:8080/swagger-ui.html
https://thingsboard.io/docs/user-guide/rpc/
下发数据URL
http(s)://host:port/api/plugins/rpc/{callType}/{deviceId}
deviceId 设备的36位UID
callType 可以为oneway 或twoway
设备接收时需要订阅主题和监听消息
postman调用例