遥测数据查看
租户管理员和客户用户能够浏览设备遥测数据。
数据存储
系统管理员能够配置睿珀物联网云平台以将时间序列数据存储在 SQL (PostgreSQL) 或 NoSQL (Cassandra 或 Tdengine) 数据库中。对于每秒少于 5000个数据点的小型环境,建议使用 SQL 存储。当您的解决方案具有高吞吐量或高可用性要求时,将数据存储在 Cassandra/Tdengine 中是有意义的。
数据保留
数据保留策略和配置取决于选择的存储。
Cassandra 支持每个插入行的生存时间(TTL)参数。这就是为什么您可以使用“TSKV_TTL”环境变量在系统级别配置默认 TTL 参数的原因。您可以覆盖“保存时间序列”规则节点中的默认值或使用消息的“TTL”元数据字段。这使您可以优化存储消耗。TTL 的最大允许值为 5 年。例如,您可以将“原始”数据存储 3 个月,将汇总数据存储 3 年。
PostgreSQL 和 Timescale 不支持每个插入行的生存时间 (TTL) 参数。这就是为什么您只能使用“SQL_TTL*”环境变量配置定期时间序列数据清理例程。
数据持久性
一旦消息成功存储到为特定设备配置文件配置的规则引擎队列中,向 物联网平台发送带有时间序列数据的消息的设备将收到确认。
作为租户管理员,您可以为队列配置处理策略。您可以将队列配置为重新处理或忽略消息处理的失败。这允许对时间序列数据和规则引擎处理的所有其他消息的持久性级别进行精细控制。
设备遥测数据API
物联网平台提供了上传Timeseries的key-value格式API。
key-value的灵活性可以与IoT设备无缝。
遥测上传API基于特定的网络协议。你可以在相应的参考页面中查看API和示例:
遥测服务
遥测服务负责将timeseries数据持久保存至数据库中;提供API进行对数据查询和订阅更新。
数据存储
ThingsBoard使用Cassandra NoSQL数据库或SQL数据库来存储所有数据。
向服务端发送数据的设备将在数据存储在DB中后立即收到有关数据传递的确认。
MQTT客户端允许临时本地存储未交付的数据。
因此即使物联网平台节点之一发生故障,该设备也不会丢失数据,并且能够将其推送到其他服务器。
服务端应用程序还能够发布针对不同实体和实体类型有价值的遥测。
虽然你可以直接查询数据库,但是物联网平台提供了一组RESTful和Websocket API,可简化调用过程并应用某些安全策略:
- Tenant管理员能够管理所拥有实体属性。
- Customer用户只能管理Tenant分配的实体属性。
数据查询API
遥测服务提供以下REST API来获取实体数据:
注意: 上图中的API可通过Swagger UI使用,如获取更多详细信息请查看REST API 。
Timeseries数据keys API
你可以使用下面的GET请求地址获取指定entity类型和entity id的所有属性key列表
http(s)://host:port/api/plugins/telemetry/{entityType}/{entityId}/keys/timeseries
get-telemetry-keys.sh
curl -v -X GET http://localhost:8080/api/plugins/telemetry/DEVICE/ac8e6020-ae99-11e6-b9bd-2b15845ada4e/keys/timeseries \
--header "Content-Type:application/json" \
--header "X-Authorization: $JWT_TOKEN"
结果
["gas","temperature"]
支持的实体类型为: TENANT, CUSTOMER, USER, DASHBOARD, ASSET, DEVICE, ALARM, ENTITY_VIEW
Timeseries数据values API
你可以使用下面的GET请求地址获取指定entity类型和entity id的所有属性value列表
http(s)://host:port/api/plugins/telemetry/{entityType}/{entityId}/values/timeseries?keys=key1,key2,key3
get-latest-telemetry-values.sh
curl -v -X GET http://localhost:8080/api/plugins/telemetry/DEVICE/ac8e6020-ae99-11e6-b9bd-2b15845ada4e/values/timeseries?keys=gas,temperature \
--header "Content-Type:application/json" \
--header "X-Authorization: $JWT_TOKEN"
结果
{
"gas": [
{
"ts": 1479735870786,
"value": "1"
}
],
"temperature": [
{
"ts": 1479735870786,
"value": "3"
}
]
}
支持的实体类型为: TENANT, CUSTOMER, USER, DASHBOARD, ASSET, DEVICE, ALARM, ENTITY_VIEW
你可以使用下面的GET请求地址获取指定entity类型和entity id的所有属性历史value列表
http(s)://host:port/api/plugins/telemetry/{entityType}/{entityId}/values/timeseries?keys=key1,key2,key3&startTs=1479735870785&endTs=1479735871858&interval=60000&limit=100&agg=AVG
支持参数如下所述:
- keys - 以逗号分隔的要获取的遥测key列表。
- startTs - Unix时间戳标识间隔的开始(以毫秒为单位)。
- endTs - -Unix时间戳标识间隔的结束时间(以毫秒为单位)。
- interval - 以毫秒为的聚合间隔单位。
- agg - 聚合函数。MIN,MAX,AVG,SUM,COUNT,NONE之一。
- limit - 要返回的最大数据点数或要处理的间隔。
物联网平台将使用startTs,endTs和interval来标识聚合分区或子查询,并对利用内置聚合功能的数据库执行异步查询。
get-telemetry-values.sh
curl -v -X GET "http://localhost:8080/api/plugins/telemetry/DEVICE/ac8e6020-ae99-11e6-b9bd-2b15845ada4e/values/timeseries?keys=gas,temperature&startTs=1479735870785&endTs=1479735871858&interval=60000&limit=100&agg=AVG" \
--header "Content-Type:application/json" \
--header "X-Authorization: $JWT_TOKEN"
支持的实体类型为: TENANT, CUSTOMER, USER, DASHBOARD, ASSET, DEVICE, ALARM, ENTITY_VIEW
Websocket API
物联网平台使用Websocket API复制了REST API功能,并提供了订阅设备数据更改的功能。
你可以使用以下URL打开与遥测服务的Websocket连接。
ws(s)://host:port/api/ws/plugins/telemetry?token=$JWT_TOKEN
打开后,你可以发送 订阅命令 并接收 订阅更新:
- cmdId - 命令唯一标识(在相应的Websocket连接中)
- entityType - 唯一实体类型标识. 支持实类型: TENANT, CUSTOMER, USER, DASHBOARD, ASSET, DEVICE, ALARM
- entityId - 唯一实体标识符
- keys - 逗号分隔的keys参数列表
- timeWindow - 订阅的时间间隔,以毫秒为单位. 数据将在以下时间间隔 [now()-timeWindow, now()]
- startTs - 获取历史数据查询的间隔的开始时间(以毫秒为单位).
- endTs - 获取历史数据查询的间隔的结束时间(以毫秒为单位).
实例
更改以下变量的值:
- token - 指向JWT令牌,你可以使用以下链接获得该令牌.
- entityId - 你的设备ID.
如果是现场演示服务器:
- 用demo-thingsboard.io替换host:port并选择安全连接-wss://
如果是本地安装:
- 用127.0.0.1:8080替换host:port并选择ws://
web-socket.html
<!DOCTYPE HTML>
<html>
<head>
<script type="text/javascript">
function WebSocketAPIExample() {
var token = "YOUR_JWT_TOKEN";
var entityId = "YOUR_DEVICE_ID";
var webSocket = new WebSocket("ws(s)://host:port/api/ws/plugins/telemetry?token=" + token);
if (entityId === "YOUR_DEVICE_ID") {
alert("Invalid device id!");
webSocket.close();
}
if (token === "YOUR_JWT_TOKEN") {
alert("Invalid JWT token!");
webSocket.close();
}
webSocket.onopen = function () {
var object = {
tsSubCmds: [
{
entityType: "DEVICE",
entityId: entityId,
scope: "LATEST_TELEMETRY",
cmdId: 10
}
],
historyCmds: [],
attrSubCmds: []
};
var data = JSON.stringify(object);
webSocket.send(data);
alert("Message is sent: " + data);
};
webSocket.onmessage = function (event) {
var received_msg = event.data;
alert("Message is received: " + received_msg);
};
webSocket.onclose = function (event) {
alert("Connection is closed!");
};
}
</script>
</head>
<body>
<div id="sse">
<a href="javascript:WebSocketAPIExample()">Run WebSocket</a>
</div>
</body>
</html>