CoAP(Constrained Application Protocol)是一种专为受限环境(例如物联网设备)设计的轻量级通信协议。
协议支持#
物联网平台支持以CoAP协议接入,并通过连接模式以提供客户端接入认证功能来限制未授权的CoAP客户端接入系统。连接步骤#
一、客户端认证(获取token)#
使用平台指定规则对设备三元组进行组合与签名后,请求服务端进行认证,认证成功后,使用返回的token进行后续的CoAP通信,防止非法用户接入。对于认证,有三个重要参数需要作为变量参与到签名认证过程中,分别是设备的ProductId
, DeviceId
和DeviceSecret
,在进行接入前,请事先从物联网平台获取这几个参数。
请求路径(URI):mqtt/connection?clientId={clientId}&username={username}&password={password}
由于相关认证采用Query参数的方式传递,因此连接时使用的参数值与使用MQTT时有所不同,分别用**
,*
和$
代表使用MQTT时的|
,=
和&
。
coapClientId: clientId+"**securemode*3,signmethod*hmacsha1,timestamp*132323232**"
coapUsername: deviceId+"$"+productId
coapPassword: sign_hmac(deviceSecret,content)
变量名 | 说明 |
---|
clientId | 表示客户端ID,可自定义,长度不可超过64个字符。建议使用设备的MAC地址或SN码,方便您识别区分不同的客户端 |
securemode | 表示目前安全模式,可选值有2(TLS直连模式)和3(TCP直连模式) |
signmethod | 表示签名算法类型。支持hmacmd5,hmacsha1和hmacsha256,默认为hmacmd5 |
timestamp | 表示当前时间毫秒值,可以不传递 |
coapPassword | sign签名需把提交给服务器的参数按字典排序后,根据signmethod加签 |
content | 提交给服务器的参数(productId、deviceId、timestamp和clientId),按照参数名称 首字母字典排序, 然后将参数值依次拼接 |
此处productId和deviceId为必填参数,timestamp和clientId为可选参数。若传入timestamp或clientId,必须与coapClientId中的设置相同。
假设clientId = 12345,deviceId = device, productId = pk, timestamp = 789,signmethod=hmacsha1,deviceSecret=secret
,那么认证时使用的参数如下:coapClientId=12345**securemode*3,signmethod*hmacsha1,timestamp*789**
coapUsername=device$pk
coapPassword=hmacsha1("secret","clientId12345deviceIddeviceproductIdpktimestamp789").toHexString();
加密后的Password为二进制转16制字符串,示例结果为:dc8f8498a1a115b58f6a3afd526bc62a1665****
返回码(Return Code) | 消息体(Payload) | 说明 |
---|
2.01 | Token :用于后续请求使用的令牌字符串 | 连接创建成功,并在消息体中返回本次连接的 Token 字符串 |
4.00 | ErrorMessage :具体错误信息 | 错误的请求格式 |
4.01 | ErrorMessage :错误说明,例如Login Failed: not_authorized | 请求格式正确,但登录鉴权失败 |
二、消息发布#
使用CoAP客户端未指定主题发送消息,需携带客户端认证
步骤中获取到的Token
。请求路径(URI):ps/{topicName}?clientId={clientId}&token={token}
变量名 | 说明 |
---|
topicName | 消息发布的Topic ,仅支持系统Topic ,传入值为Topic去掉前置sys ,例如数据上报时,传入{productId}/{deviceId}/thing/properties/up |
clientId | 客户端认证时使用的clientId |
token | 客户端认证成功时获取到的token |
返回码(Return Code) | 消息体(Payload) | 说明 |
---|
2.04 | 空 | 发送成功 |
4.00 | ErrorMessage :具体错误信息 | 错误的请求格式 |
4.01 | ErrorMessage :具体错误信息 | 请求格式正确,但登录鉴权失败 |
三、消息订阅#
请求路径(URI):ps/{topicName}?clientId={clientId}&token={token}
变量名 | 说明 |
---|
topicName | 消息发布的Topic ,仅支持系统Topic ,传入值为Topic去掉前置sys ,例如订阅数据下发消息时,传入{productId}/{deviceId}/thing/properties/set |
clientId | 客户端认证时使用的clientId |
token | 客户端认证成功时获取到的token |
返回码(Return Code) | 消息体(Payload) | 说明 |
---|
2.05 | 空 | 订阅成功 |
4.00 | ErrorMessage :具体错误信息 | 错误的请求格式 |
4.01 | ErrorMessage :具体错误信息 | 请求格式正确,但登录鉴权失败 |
四、心跳#
在一段时间不与平台进行通信(默认为30秒)之后,服务端会删除该客户端的会话、订阅关系,并释放所有的资源 。若需要保持clientId
,token
,以及订阅的活跃,CoAP客户端与服务端需要维持心跳。请求路径(URI):mqtt/connection?clientId={clientId}&token={token}
变量名 | 说明 |
---|
topicName | 消息发布的Topic ,仅支持系统Topic ,传入值为Topic去掉前置sys ,例如订阅数据下发消息时,传入{productId}/{deviceId}/thing/properties/set |
clientId | 客户端认证时使用的clientId |
token | 客户端认证成功时获取到的token |
返回码(Return Code) | 消息体(Payload) | 说明 |
---|
2.01 | 空 | 更新成功 |
4.00 | ErrorMessage :具体错误信息 | 错误的请求格式 |
4.01 | ErrorMessage :具体错误信息 | 请求格式正确,但登录鉴权失败 |