- 入门
- 键值格式
- 遥测上传 API
- 将数据发布为没有时间戳的对象 (服务端时间戳将被私用). 将 $RELAPERIOT_HOST_NAME 和 $ACCESS_TOKEN 替换为相应的值。
- 例如,$RELAPERIOT_HOST_NAME 参考实际服务器,$ACCESS_TOKEN 为 ABC123:
- 使用文件中的数据将数据发布为不带时间戳的对象(将使用服务器端时间戳)。 将 $RELAPERIOT_HOST_NAME 和 $ACCESS_TOKEN 替换为相应的值。
- 例如,$RELAPERIOT_HOST_NAME 参考现场演示服务器,$ACCESS_TOKEN 为 ABC123:
- 使用文件中的数据将数据发布为不带时间戳的对象数组(将使用服务器端时间戳)。 将 $RELAPERIOT_HOST_NAME 和 $ACCESS_TOKEN 替换为相应的值。
- 例如,$RELAPERIOT_HOST_NAME 参考现场演示服务器,$ACCESS_TOKEN 为 ABC123:
- 使用文件中的数据将数据发布为带有时间戳的对象(将使用遥测时间戳)。 将 $RELAPERIOT_HOST_NAME 和 $ACCESS_TOKEN 替换为相应的值。
- 例如,$RELAPERIOT_HOST_NAME 参考现场演示服务器,$ACCESS_TOKEN 为 ABC123:
- JSON 值支持
- RPC API
- 认领设备
- 设备配置
入门
HTTP 基础知识
HTTP是一种通用网络协议,可用于 IoT 应用程序。您可以在此处找到有关 HTTP 的更多信息。HTTP 协议基于 TCP 并使用请求-响应模型。
ThingsBoard 服务器节点充当支持 HTTP 和 HTTPS 协议的 HTTP 服务器。
客户端库设置
您可以在 Web 上找到适用于不同编程语言的 HTTP 客户端库。本文中的示例将基于curl。
HTTP 身份验证和错误代码
我们将在本文中使用访问令牌设备凭据,稍后将它们称为$ACCESS_TOKEN。应用程序需要在每个 HTTP 请求中包含$ACCESS_TOKEN作为路径参数。可能的错误代码及其原因:
- 400 Bad Request - 无效的 URL、请求参数或正文。
- 401 未经授权- 无效的 $ACCESS_TOKEN。
- 404 Not Found - 找不到资源。
键值格式
默认情况下,ThingsBoard 支持 JSON 中的键值内容。键始终是字符串,而值可以是字符串、布尔值、双精度、长整型或 JSON。例如:{
"stringKey":"value1",
"booleanKey":true,
"doubleKey":42.0,
"longKey":73,
"jsonKey": {
"someNumber": 42,
"someArray": [1,2,3],
"someNestedObject": {"key": "value"}
}
}
遥测上传 API
为了将遥测数据发布到 ThingsBoard 服务器节点,请将 POST 请求发送到以下 URL:
http(s)://host:port/api/v1/$ACCESS_TOKEN/telemetry |
---|
支持的最简单的数据格式是:
{"key1":"value1", "key2":"value2"}
要么
[{"key1":"value1"}, {"key2":"value2"}]
请注意,在这种情况下,服务器端时间戳将分配给上传的数据!
如果您的设备能够获取客户端时间戳,您可以使用以下格式:
{"ts":1451649600512, "values":{"key1":"value1", "key2":"value2"}}
在上面的示例中,我们假设“1451649600512”是一个毫秒精度的unix 时间戳。例如,值“1451649600512”对应于“Fri, 01 Jan 2016 12:00:00.512 GMT”
遥测数据作为object.json
{
"stringKey": "value1",
"booleanKey": true,
"doubleKey": 42.0,
"longKey": 73,
"jsonKey": {
"someNumber": 42,
"someArray": [1,2,3],
"someNestedObject": {"key": "value"}
}
}
遥测数据作为array.json
[{"key1":"value1"}, {"key2":true}]
遥测数据与 ts.json
{ "ts": 1451649600512, "values": { "stringKey": "value1", "booleanKey": true, "doubleKey": 42.0, "longKey": 73, "jsonKey": { "someNumber": 42, "someArray": [1, 2, 3], "someNestedObject": { "key": "value" } } } }
案例 ```shell
将数据发布为没有时间戳的对象 (服务端时间戳将被私用). 将 $RELAPERIOT_HOST_NAME 和 $ACCESS_TOKEN 替换为相应的值。
curl -v -X POST —data “{“temperature”:42,”humidity”:73}” http://$RELAPERIOT_HOST_NAME/api/v1/$ACCESS_TOKEN/telemetry —header “Content-Type:application/json”
例如,$RELAPERIOT_HOST_NAME 参考实际服务器,$ACCESS_TOKEN 为 ABC123:
curl -v -X POST —data “{“temperature”:42,”humidity”:73}” http://iot.relaper.com//api/v1/ABC123/telemetry —header “Content-Type:application/json”
使用文件中的数据将数据发布为不带时间戳的对象(将使用服务器端时间戳)。 将 $RELAPERIOT_HOST_NAME 和 $ACCESS_TOKEN 替换为相应的值。
curl -v -X POST -d @telemetry-data-as-object.json http://$RELAPERIOT_HOST_NAME/api/v1/$ACCESS_TOKEN/telemetry —header “Content-Type:application/json”
例如,$RELAPERIOT_HOST_NAME 参考现场演示服务器,$ACCESS_TOKEN 为 ABC123:
curl -v -X POST -d @telemetry-data-as-object.json http://iot.relaper.com/api/v1/ABC123/telemetry —header “Content-Type:application/json”
使用文件中的数据将数据发布为不带时间戳的对象数组(将使用服务器端时间戳)。 将 $RELAPERIOT_HOST_NAME 和 $ACCESS_TOKEN 替换为相应的值。
curl -v -X POST -d @telemetry-data-as-array.json http://$RELAPERIOT_HOST_NAME/api/v1/$ACCESS_TOKEN/telemetry —header “Content-Type:application/json”
例如,$RELAPERIOT_HOST_NAME 参考现场演示服务器,$ACCESS_TOKEN 为 ABC123:
curl -v -X POST -d @telemetry-data-as-array.json http://iot.relaper.com/api/v1/ABC123/telemetry —header “Content-Type:application/json”
使用文件中的数据将数据发布为带有时间戳的对象(将使用遥测时间戳)。 将 $RELAPERIOT_HOST_NAME 和 $ACCESS_TOKEN 替换为相应的值。
curl -v -X POST -d @telemetry-data-with-ts.json http://$RELAPERIOT_HOST_NAME/api/v1/$ACCESS_TOKEN/telemetry —header “Content-Type:application/json”
例如,$RELAPERIOT_HOST_NAME 参考现场演示服务器,$ACCESS_TOKEN 为 ABC123:
curl -v -X POST -d @telemetry-data-with-ts.json http://iot.relaper.com/api/v1/ABC123/telemetry —header “Content-Type:application/json” ```
属性 API
物联网平台属性API能够使设备具备如下功能:
- 将客户端设备属性上传到服务端
- 从服务端请求客户端和共享属性
- 从服务端订阅共享属性
- 通过服务端发布客户端属性
将属性更新发布到服务器
为了将客户端设备属性发布到 ThingsBoard 服务器节点,请将 POST 请求发送到以下 URL:
http(s)://host:port/api/v1/$ACCESS_TOKEN/attributes | http(s)://host:port/api/v1/$ACCESS_TOKEN/attributes |
---|---|
- 例子
- 新属性值.json
|
复制到剪贴板
| | | —- | —- | | 1 2 3 4 5 6 7 8 9 | # Publish client-side attributes update. Replace $THINGSBOARD_HOST_NAME and $ACCESS_TOKEN with corresponding values. curl -v -X POST —data “{“attribute1”: “value1”, “attribute2”:true, “attribute3”: 43.0}” http://$THINGSBOARD_HOST_NAME/api/v1/$ACCESS_TOKEN/attributes —header “Content-Type:application/json” # For example, $THINGSBOARD_HOST_NAME reference live demo server, $ACCESS_TOKEN is ABC123: curl -v -X POST —data “{“attribute1”: “value1”, “attribute2”:true, “attribute3”: 43.0}” https://demo.thingsboard.io/api/v1/ABC123/attributes —header “Content-Type:application/json” # Publish client-side attributes update from file. Replace $THINGSBOARD_HOST_NAME and $ACCESS_TOKEN with corresponding values. curl -v -X POST -d @new-attributes-values.json http://$THINGSBOARD_HOST_NAME/api/v1/$ACCESS_TOKEN/attributes —header “Content-Type:application/json” # For example, $THINGSBOARD_HOST_NAME reference live demo server, $ACCESS_TOKEN is ABC123: curl -v -X POST -d @new-attributes-values.json https://demo.thingsboard.io/api/v1/ABC123/attributes —header “Content-Type:application/json” |
从服务器请求属性值
为了向 ThingsBoard 服务器节点请求客户端或共享设备属性,请将 GET 请求发送到以下 URL:
http(s)://host:port/api/v1/$ACCESS_TOKEN/attributes?clientKeys=attribute1,attribute2&sharedKeys=shared1,shared2 | http(s)://host:port/api/v1/$ACCESS_TOKEN/attributes?clientKeys=attribute1,attribute2&sharedKeys=shared1,shared2 |
---|---|
- 例子
- 结果
|
复制到剪贴板
| | | —- | —- | | 1 2 3 4 | # Send HTTP attributes request. Replace $THINGSBOARD_HOST_NAME and $ACCESS_TOKEN with corresponding values. curl -v -X GET “http://$THINGSBOARD_HOST_NAME/api/v1/$ACCESS_TOKEN/attributes?clientKeys=attribute1,attribute2&sharedKeys=shared1,shared2“ # For example, $THINGSBOARD_HOST_NAME reference live demo server, $ACCESS_TOKEN is ABC123: curl -v -X GET “https://demo.thingsboard.io/api/v1/ABC123/attributes?clientKeys=attribute1,attribute2&sharedKeys=shared1,shared2“ |
请注意,客户端和共享设备属性键的交集是一种不好的做法!但是,仍然可以为客户端、共享甚至服务器端属性使用相同的密钥。
从服务器订阅属性更新
要订阅共享设备属性更改,请将带有可选“超时”请求参数的 GET 请求发送到以下 URL:
http(s)://host:port/api/v1/$ACCESS_TOKEN/attributes/updates | http(s)://host:port/api/v1/$ACCESS_TOKEN/attributes/updates |
---|---|
一旦共享属性将被服务器端组件(REST API 或规则链)之一更改,客户端将收到以下更新:
- 例子
- 结果
|
复制到剪贴板
| | | —- | —- | | 1 2 3 4 | # Send subscribe attributes request with 20 seconds timeout. Replace $THINGSBOARD_HOST_NAME and $ACCESS_TOKEN with corresponding values. curl -v -X GET http://$THINGSBOARD_HOST_NAME/api/v1/$ACCESS_TOKEN/attributes/updates?timeout=20000 # For example, $THINGSBOARD_HOST_NAME reference live demo server, $ACCESS_TOKEN is ABC123: curl -v -X GET https://demo.thingsboard.io/api/v1/ABC123/attributes/updates?timeout=20000 |
JSON 值支持
我们向遥测和属性 API 添加了对 JSON 数据结构的支持,以简化设备配置工作。JSON 支持使您既可以从设备上传,也可以推送到设备嵌套对象。您可以将一个配置 JSON 存储为共享属性并将其推送到设备。您还可以在规则引擎中处理 JSON 数据并发出警报等。
因此,这一改进最大限度地减少了 ThingsBoard 存储数据时的数据库操作次数。例如,“温度”和“湿度”将作为单独的行存储在 SQL 或 NoSQL 数据库中,以便有效地聚合这些数据以进行可视化。由于不需要聚合 JSON 数据,我们可以将所有内容存储为一行,而不是为每个配置项单独一行。在我们的一些环境中,通过在一个 JSON 中聚合多个参数,可以将数据库操作的数量减少 10 倍以上。
通过视频了解有关 JSON 值支持的更多信息。
RPC API
服务器端 RPC
为了从服务器订阅 RPC 命令,将带有可选“timeout”请求参数的 GET 请求发送到以下 URL:
http(s)://host:port/api/v1/$ACCESS_TOKEN/rpc | http(s)://host:port/api/v1/$ACCESS_TOKEN/rpc |
---|---|
订阅后,如果没有对特定设备的请求,客户端可能会收到 rpc 请求或超时消息。RPC 请求正文的示例如下所示:
1 2 3 4 5 6 7 8 | { “id”: “1”, “method”: “setGpio”, “params”: { “pin”: “23”, “value”: 1 } } | 1 2 3 4 5 6 7 8 | { “id”: “1”, “method”: “setGpio”, “params”: { “pin”: “23”, “value”: 1 } } |
---|---|---|---|
在哪里
- id - 请求 id,整数请求标识符
- 方法- RPC 方法名称,字符串
- params - RPC 方法参数,自定义 json 对象
并且可以使用对以下 URL 的 POST 请求回复他们:
http://host:port/api/v1/$ACCESS_TOKEN/rpc/{$id} | http://host:port/api/v1/$ACCESS_TOKEN/rpc/{$id} |
---|---|
其中$id是一个整数请求标识符。
让我们看一个例子:
- 使用RPC 调试终端仪表板;
- 从服务器订阅 RPC 命令。为此,在第一个终端窗口中发送带有观察标志的 GET 请求;
- 向设备发送 RPC 请求“连接”;
- 在第二个终端窗口中模拟从设备向服务器发送响应;
- 您应该会收到来自设备的响应:{“result”:“ok”}
- 示例订阅
- 示例回复
- 回复正文
|
复制到剪贴板
| | | —- | —- | | 1 2 3 4 | # Send rpc request with 20 seconds timeout. Replace $THINGSBOARD_HOST_NAME and $ACCESS_TOKEN with corresponding values. curl -v -X GET http://$THINGSBOARD_HOST_NAME/api/v1/$ACCESS_TOKEN/rpc?timeout=20000 # For example, $THINGSBOARD_HOST_NAME reference live demo server, $ACCESS_TOKEN is ABC123: curl -v -X GET https://demo.thingsboard.io/api/v1/ABC123/rpc?timeout=20000 |
客户端 RPC
为了向服务器发送 RPC 命令,请将 POST 请求发送到以下 URL:
http://host:port/api/v1/$ACCESS_TOKEN/rpc | http://host:port/api/v1/$ACCESS_TOKEN/rpc |
---|---|
请求和响应正文都应该是有效的 JSON 文档。文档的内容特定于将处理您的请求的规则节点。
让我们看一个例子:
- 将两个节点添加到规则链中:“脚本”和“rpc 调用回复”;
- 在脚本节点中输入函数: | return {msg: {time:String(new Date())}, metadata: metadata, msgType: msgType}; | return {msg: {time:String(new Date())}, metadata: metadata, msgType: msgType}; | | —- | —- |
复制到剪贴板
- 向服务器发送请求;
- 您应该收到来自服务器的响应。
- 示例请求
- 请求正文
- 响应体 | | | —- | | # Post client-side rpc request. Replace $THINGSBOARD_HOST_NAME and $ACCESS_TOKEN with corresponding values. curl -X POST -d @rpc-client-request.json http://$THINGSBOARD_HOST_NAME/api/v1/$ACCESS_TOKEN/rpc —header “Content-Type:application/json” # For example, $THINGSBOARD_HOST_NAME reference live demo server, $ACCESS_TOKEN is ABC123: curl -X POST -d @rpc-client-request.json https://demo.thingsboard.io/api/v1/ABC123/rpc —header “Content-Type:application/json” |
认领设备
请参阅相应文章以获取有关声明设备功能的更多信息。
为了启动认领设备,向以下 URL 发送 POST 请求:
http(s)://host:port/api/v1/$ACCESS_TOKEN/claim | http(s)://host:port/api/v1/$ACCESS_TOKEN/claim |
---|---|
支持的数据格式为:
{“secretKey”:”value”, “durationMs”:60000} | {“secretKey”:”value”, “durationMs”:60000} |
---|---|
请注意,上述字段是可选的。如果未指定secretKey,则使用空字符串作为默认值。如果没有指定durationMs ,则使用系统参数device.claim.duration(在文件/etc/thingsboard/conf/thingsboard.yml 中)。
设备配置
请参阅相应文章以获取有关设备配置功能的更多信息。
要启动设备配置,请将 POST 请求发送到以下 URL:
http(s)://host:port/api/v1/provision | http(s)://host:port/api/v1/provision |
---|---|
支持的数据格式为:
1 2 3 4 5 | { “deviceName”: “DEVICE_NAME”, “provisionDeviceKey”: “u7piawkboq8v32dmcmpp”, “provisionDeviceSecret”: “jpmwdn8ptlswmf4m29bw” } | 1 2 3 4 5 | { “deviceName”: “DEVICE_NAME”, “provisionDeviceKey”: “u7piawkboq8v32dmcmpp”, “provisionDeviceSecret”: “jpmwdn8ptlswmf4m29bw” } |
---|---|---|---|