Skip to content

CoAP协议

入门

CoAP基础

CoAP是轻量级物联网协议用于受限的设备。 你可以在此处找到有关CoAP的更多信息,CoAP协议基于UDP但与HTTP类似它使用请求-响应模型。 CoAP观察者选项允许订阅资源并接收有关资源更改的通知。

蟹立方物联网平台服务器节点充当支持常规请求和观察请求的CoAP服务器。

客户端

你可以在网上找到针对不同编程语言的CoAP客户端库本文中的示例将基于CoAP cli作为使用工具,你可以使用我们的Hello World指南中的说明。

npm install coap-cli -g

注意:COAP CLI不支持查询参数如果需要使用查询参数则应使用COAP客户端要安装Coap-Client请执行:

  • Ubuntu 20.04: sudo apt install libcoap2-bin
  • Ubuntu 18.04: sudo apt install libcoap1-bin

CoAP身份验证和错误代码

我们将在本文中使用令牌凭证访问设备这些凭证稍后将称为$ACCESS_TOKEN应用程序需要在每个CoAP请求中包括$ACCESS_TOKEN作为路径参数。 可能的错误代码及其原因:

  • 4.00 请求无效 - 请求参数与正文错误无效请求
  • 4.01 未授权 - $ACCESS_TOKEN无效
  • 4.04 未找到 - 找不到资源 通过X.509证书替换身份验证。

Key-value格式

蟹立方物联网平台支持以JSON格式的key-value字符串值可以是string、bool、float、long或者二进制格式的序列化字符串;有关更多详细信息请参见协议自定义。

{
 "stringKey":"value1", 
 "booleanKey":true, 
 "doubleKey":42.0, 
 "longKey":73, 
 "jsonKey": {
    "someNumber": 42,
    "someArray": [1,2,3],
    "someNestedObject": {"key": "value"}
 }
}

但是也可以通过Protocol Buffers发送数据。 请参阅CoAP transport type在设备配置文件文章中的配置部分。

也可以使用自定义二进制格式或某些序列化框架有关更多详细信息请参见自定义协议。

遥测上传API

为了将遥测数据发布到蟹立方物联网平台服务器节点,请将POST请求发送到以下URL:

coap://host/api/v1/$ACCESS_TOKEN/telemetry

支持的最简单的数据格式是:

{"key1":"value1", "key2":"value2"}

[{"key1":"value1"}, {"key2":"value2"}]

请注意在这种情况下服务器端时间戳将分配给上传的数据!

如果您的设备能够获得客户端时间戳则可以使用以下格式:

{"ts":1451649600512, "values":{"key1":"value1", "key2":"value2"}}

在上面的示例中我们假设“1451649600512”是具有毫秒精度的Unix时间戳。 例如:值’1451649600512’对应于’2016年1月1日 星期五 12:00:00.512 GMT’

# Publish data as an object without timestamp (server-side timestamp will be used). Replace $蟹立方物联网平台_HOST_NAME and $ACCESS_TOKEN with corresponding values.
cat telemetry-data-as-object.json | coap post coap://$蟹立方物联网平台_HOST_NAME/api/v1/$ACCESS_TOKEN/telemetry
# For example, $蟹立方物联网平台_HOST_NAME reference live demo server, $ACCESS_TOKEN is ABC123:
cat telemetry-data-as-object.json | coap post coap://demo.蟹立方物联网平台.io/api/v1/ABC123/telemetry

# Publish data as an array of objects without timestamp (server-side timestamp will be used). Replace $蟹立方物联网平台_HOST_NAME and $ACCESS_TOKEN with corresponding values.
cat telemetry-data-as-array.json | coap post coap://$蟹立方物联网平台_HOST_NAME/api/v1/$ACCESS_TOKEN/telemetry
# For example, $蟹立方物联网平台_HOST_NAME reference live demo server, $ACCESS_TOKEN is ABC123:
cat telemetry-data-as-array.json | coap post coap://demo.蟹立方物联网平台.io/api/v1/ABC123/telemetry

# Publish data as an object with timestamp (telemetry timestamp will be used). Replace $蟹立方物联网平台_HOST_NAME and $ACCESS_TOKEN with corresponding values.
cat telemetry-data-with-ts.json | coap post coap://$蟹立方物联网平台_HOST_NAME/api/v1/$ACCESS_TOKEN/telemetry
# For example, $蟹立方物联网平台_HOST_NAME reference live demo server, $ACCESS_TOKEN is ABC123:
cat telemetry-data-with-ts.json | coap post coap://demo.蟹立方物联网平台.io/api/v1/ABC123/telemetry
{
  "stringKey": "value1",
  "booleanKey": true,
  "doubleKey": 42.0,
  "longKey": 73,
  "jsonKey": {
    "someNumber": 42,
    "someArray": [1,2,3],
    "someNestedObject": {"key": "value"}
  }
}
[{"key1":"value1"}, {"key2":true}]
{
  "ts": 1451649600512,
  "values": {
    "stringKey": "value1",
    "booleanKey": true,
    "doubleKey": 42.0,
    "longKey": 73,
    "jsonKey": {
      "someNumber": 42,
      "someArray": [1, 2, 3],
      "someNestedObject": {
        "key": "value"
      }
    }
  }
}

属性API

蟹立方物联网平台属性API能够使设备具备如下功能

  • 将客户端设备属性上载到服务器
  • 从服务器请求客户端和共享设备属性
  • 从服务器订阅 共享设备属性

将属性更新发布到服务器

为了将客户端设备属性发布到蟹立方物联网平台服务器节点,请将POST请求发送到以下URL:

coap://host/api/v1/$ACCESS_TOKEN/attributes
# Publish client-side attributes update. Replace $蟹立方物联网平台_HOST_NAME and $ACCESS_TOKEN with corresponding values.
cat new-attributes-values.json | coap post coap://$蟹立方物联网平台_HOST_NAME/api/v1/$ACCESS_TOKEN/attributes
# For example, $蟹立方物联网平台_HOST_NAME reference live demo server, $ACCESS_TOKEN is ABC123:
cat new-attributes-values.json | coap post coap://demo.蟹立方物联网平台.io/api/v1/ABC123/attributes
{
  "attribute1": "value1",
  "attribute2": true,
  "attribute3": 42.0,
  "attribute4": 73,
  "attribute5": {
    "someNumber": 42,
    "someArray": [1,2,3],
    "someNestedObject": {"key": "value"}
  }
}

请求属性

为了向蟹立方物联网平台服务器节点请求客户端或共享设备属性,请将GET请求发送到以下URL:

coap://host/api/v1/$ACCESS_TOKEN/attributes?clientKeys=attribute1,attribute2&sharedKeys=shared1,shared2

注意:此示例用Coap-Client而不是CoAp CLI显示因为CoAp CLI不支持查询参数请参阅Client库。

# Send CoAP attributes request. Replace $蟹立方物联网平台_HOST_NAME and $ACCESS_TOKEN with corresponding values.
coap-client -m get "coap://$蟹立方物联网平台_HOST_NAME/api/v1/$ACCESS_TOKEN/attributes?clientKeys=attribute1,attribute2&sharedKeys=shared1,shared2"
# For example, $蟹立方物联网平台_HOST_NAME reference live demo server, $ACCESS_TOKEN is ABC123:
coap-client -m get "coap://demo.蟹立方物联网平台.io/api/v1/ABC123/attributes?clientKeys=attribute1,attribute2&sharedKeys=shared1,shared2"
{"client":{"attribute1":"value1","attribute2":true}}

请注意客户端和共享设备属性键的交集是不好的做法!但是对于客户端、共享和服务器端属性具有相同的密钥。

订阅属性

为了订阅共享设备属性更改请将带有Observe选项的GET请求发送到以下URL:

coap://host/api/v1/$ACCESS_TOKEN/attributes

一旦服务器端组件之一(REST API或规则链)更改了共享属性客户端将收到以下更新:

# Subscribe to attribute updates. Replace $蟹立方物联网平台_HOST_NAME and $ACCESS_TOKEN with corresponding values.
coap get -o coap://$蟹立方物联网平台_HOST_NAME/api/v1/$ACCESS_TOKEN/attributes
# For example, $蟹立方物联网平台_HOST_NAME reference live demo server, $ACCESS_TOKEN is ABC123:
coap get -o coap://demo.蟹立方物联网平台.io/api/v1/ABC123/attributes
{"client":{"attribute1":"value1","attribute2":true}}

支持JSON

我们在遥测和属性 API 中添加了对 JSON 数据结构的支持,以简化设备配置工作。JSON 支持允许您从设备上传和推送到设备嵌套对象。您可以将一个配置 JSON 存储为共享属性,并将其推送到设备。您还可以在规则引擎中处理 JSON 数据并引发警报等。

因此,当 蟹立方物联网平台 存储数据时,这种改进最大限度地减少了 Database作的数量。例如,“temperature” 和 “humidity” 将作为单独的行存储在 SQL 或 NoSQL 数据库中,以便有效地聚合这些数据以进行可视化。由于不需要聚合 JSON 数据,我们可以将所有内容存储为一行,而不是为每个配置项单独存储一行。在我们的一些环境中,可以通过在一个 JSON 中聚合多个参数,将数据库作的数量减少 10 倍以上。

通过视频了解有关 JSON 值支持的更多信息。

RPC API

服务器端RPC

通过从服务器订阅RPC命令请将带有观察标志的GET请求发送到以下URL:

coap://host/api/v1/$ACCESS_TOKEN/rpc

订阅后客户端可以接收rpc请求。 RPC请求例如下所示:

{
  "id": "1",
  "method": "setGpio",
  "params": {
    "pin": "23",
    "value": 1
  }
}

说明

  • id - 请求ID,int
  • method - RPC方法名称, string
  • params - -RPC方法参数,自定义json对象 并可以使用POST请求回复以下网址:
coap://host/api/v1/$ACCESS_TOKEN/rpc/{$id}

其中$id是整数请求标识符。

参见下面示例:

  • 使用RPC debug terminal在仪表板调试

  • 从服务器订阅RPC命令并在第一个终端窗口中带有observe标志的发送请求

  • 将RPC请求”connect”发送到设备

  • 在第二个终端窗口中模拟将响应从设备发送到服务器

收到设备的响应:

alt textalt textalt textalt textalt text

# Subscribe to RPC requests. Replace $蟹立方物联网平台_HOST_NAME and $ACCESS_TOKEN with corresponding values.
# The s option stands for subscribe and the value has to be specified in seconds
# The B options stands for break (the operation will be break after desired timeout) and the value has to be specified in seconds
coap-client -m get coap://$蟹立方物联网平台_HOST_NAME/api/v1/$ACCESS_TOKEN/rpc -s 100 -B 100
# For example, $蟹立方物联网平台_HOST_NAME reference live demo server, $ACCESS_TOKEN is ABC123:
coap-client -m get coap://demo.蟹立方物联网平台.io/api/v1/ABC123/rpc -s 100 -B 100
# Publish response to RPC request. Replace $蟹立方物联网平台_HOST_NAME and $ACCESS_TOKEN with corresponding values.
coap-client -f rpc-response.json -m post coap://$蟹立方物联网平台_HOST_NAME/api/v1/$ACCESS_TOKEN/rpc/1
# For example, $蟹立方物联网平台_HOST_NAME reference live demo server, $ACCESS_TOKEN is ABC123:
coap-client -f rpc-response.json -m post coap://demo.蟹立方物联网平台.io/api/v1/ABC123/rpc/1
{"result":"ok"}

客户端RPC

为了将RPC命令发送到服务器,请将POST请求发送到以下URL:

coap://host/api/v1/$ACCESS_TOKEN/rpc

请求和响应主体都应该是有效的JSON文档。

参见下面示例:

  • 在规则链中添加两个节点”script”和”rpc call reply”

  • script中输入函数:

return {msg: {time:String(new Date())}, metadata: metadata, msgType: msgType};
  • 将请求发送到服务器

  • 收到服务器的响应

alt textalt textalt textalt text

# Post client-side rpc request. Replace $蟹立方物联网平台_HOST_NAME and $ACCESS_TOKEN with corresponding values.
cat rpc-client-request.json | coap post coap://$蟹立方物联网平台_HOST_NAME/api/v1/$ACCESS_TOKEN/rpc
# For example, $蟹立方物联网平台_HOST_NAME reference live demo server, $ACCESS_TOKEN is ABC123:
cat rpc-client-request.json | coap post coap://demo.蟹立方物联网平台.io/api/v1/ABC123/rpc
{"method": "getCurrentTime", "params":{}}
{"time":"2016 11 21 12:54:44.287"}

声明设备

请参阅相应的文章以获取有关声明设备功能的更多信息。

为了启动声明设备,请将POST请求发送到以下URL:

coap://host/api/v1/$ACCESS_TOKEN/claim

支持的数据格式为:

{"secretKey":"value", "durationMs":60000}

请注意上述字段是可选的如果未指定secretKey则使用空字符串作为默认值。 如果未指定durationms则使用系统参数device.claim.duration(在文件/etc/etting/themings/conf/conf/thexboard.yml中使用)。

设备预配置

请参阅相应的文章并获取有关[设备供应]Device provisioning功能的更多信息。

启动设备配置请将发布请求发送到以下URL:

coap://host/api/v1/provision

支持的数据格式为:

{
  "deviceName": "DEVICE_NAME",
  "provisionDeviceKey": "u7piawkboq8v32dmcmpp",
  "provisionDeviceSecret": "jpmwdn8ptlswmf4m29bw"
}

硬件API

COAP客户必须发布GET请求。

 coap get coap://host/api/v1/${access_token}/firmware?title=${title}&version=${version}

说明 host - 本地主机或平台地址 ${access_token} - 设备访问令牌 ${title} - 固件标题 ${version} - 固件的目标版本

自定义协议

通过更改相应的模块可以针对特定用例完全定制HTTP传输。

下一步

入门指南 - 快速学习蟹立方物联网平台相关功能。

安装指南 - 学习如何在各种操作系统上安装蟹立方物联网平台。

可 视 化 - 学习如何配置复杂的蟹立方物联网平台仪表板说明。

数据处理 - 学习如何使用蟹立方物联网平台规则引擎。

数据分析 - 学习如何使用规则引擎执行基本的分析任务。

硬件样品 - 学习如何将各种硬件平台连接到蟹立方物联网平台。

高级功能 - 学习高级蟹立方物联网平台功能。

开发指南 - 学习蟹立方物联网平台中的贡献和开发。