目前阿里云服务器中的CoAP只支持上报数据,不支持下发。适用于采集数据,上报云端,云端监控(不支持操作数据)。
知识点1【云平台搭建步骤】
1、建立产品
(1)创建产品
这里数据格式选择ICA标准数据格式,和MQTT一致。
(2)产品功能管理
标识符理解为变量名,数据类型即变量的数据类型。
(3)设备配置
配置完成后会获取三元组
会获得一个三元组 产品密钥(ProductKey),设备名(DeviceName),设备密码(DeviceSecret)
{
"ProductKey": "a1TdN6l15ZQ",
"DeviceName": "D001",
"DeviceSecret": "VbGDQWkXza4Xh84565iuqiKKFGNQRhDt"
}
2、设备认证
POST /auth
Host: ${YourEndpoint}
Port: 5682
Accept: application/json
Content-Format: application/json
payload: {"productKey":"a1TdN6l15ZQ","deviceName":"D001","clientId":"a1TdN6l15ZQ&D001","sign":"9f4e253095878f41fc87ce4ed959fe29", "seq":"1"}
payload:
productKey:ProductKey(建立产品获取的)
deviceName:DeviceName
clientId:ProductKey&DeviceName
sign:
相当于一个加密码,可以通过这个网址获取:在线加密解密 - chahuo.com
加密内容:clientIddeviceNameproductKeyseq *准确替换对应的内容
加密方式选择HmacMD5
Host:大家根据自己的productkey 根据自己的 阿里服务器 判断查询。
在前面需要加 ProductKey 的原因:因为需要根据你的ProductKey 去判断你所在的服务器,因此 ProductKey 是必须提供的。
注意:
/这里仅是分隔符,分多次发送,并且 / 不算作数据长度
知识点2【CoAP协议报文介绍】
1、报文介绍
CoAP报文两种方式:发送认证报文(只需要认证一次,但有时效),之后才可以上报数据(报文)。
-
Ver:2bit,版本号
固定是
1
-
T:2bit,CoAP协议定义了四种不同形式的报文,CON,NON,ACK,RST
CON(00):可确认消息,需要对端回复ACK或RST
NON(01):NON,非确认消息,不可靠发送,对端不需要回复
ACK(10):对CON 的确认
RST(11):RST,发送的报文错误或者无法识别,需要重新发送
-
TKL:4 bit,Token 长度
常取0
-
Code:8bit,功能响应码
分为两部分:
1、前 3 bit:类别
2、后5bit:具体码
Class0
Code 值 二进制 含义 0.01 000 00001 GET 0.02 000 00010 POST 0.03 000 00011 PUT 0.04 000 00100 DELETE Class2
Code 值 二进制 含义 2.01 010 00001 Created(已创建,通常对应 POST 成功并创建资源) 2.02 010 00010 Deleted(已删除,DELETE 成功) 2.03 010 00011 Valid(资源未修改,自上次 GET 后无更新) 2.04 010 00100 Changed(已变更,PUT 或 POST 成功更新资源) 2.05 010 00101 Content(内容,GET 成功返回负载) Class4
Code 值 二进制 含义 4.00 100 00000 Bad Request(坏请求) 4.01 100 00001 Unauthorized(未授权/签名错误) 4.02 100 00010 Bad Option(无效的 Option) 4.03 100 00011 Forbidden(被拒绝) 4.04 100 00100 Not Found(资源未找到) 4.05 100 00101 Method Not Allowed(方法不允许) 4.06 100 00110 Not Acceptable(无法接受的格式) 4.08 100 01000 Request Entity Incomplete(请求主体不完整) 4.12 100 01100 Precondition Failed(先决条件失败) 4.13 100 01101 Request Entity Too Large(请求实体过大) 4.15 100 01111 Unsupported Content-Format(不支持的内容格式) Class5
Code 值 二进制 含义 5.00 101 00000 Internal Server Error(内部服务器错误) 5.01 101 00001 Not Implemented(未实现) 5.02 101 00010 Bad Gateway(错误的网关) 5.03 101 00011 Service Unavailable(服务不可用) 5.04 101 00100 Gateway Timeout(网关超时) 5.05 101 00101 Proxying Not Supported(不支持代理) -
Message ID:标记错误信息(必须要有)
-
Token:保证响应和请求一一对应(可选)
-
Options:我们以案例讲解,这里我先列出张比较重要的表
options对应关系表
2、认证报文示例
POST /auth
Host: a1TdN6l15ZQ.coap.cn-shanghai.link.aliyuncs.com
Port: 5682
Accept: application/json
Content-Format: application/json
payload: {"productKey":"a1TdN6l15ZQ","deviceName":"D001","clientId":"a1TdN6l15ZQ&D001","sign":"9f4e253095878f41fc87ce4ed959fe29","seq":"1"}
我们把以上的内容转换为CoAP报文
转换结果
40 02 01 01
3D 21 61 31 6E 38 73 4F 6F 64 42 71 39 2E 63 6F 61 70 2E 63 6E 2D 73 68 61 6E 67 68 61 69 2E 6C 69 6E 6B 2E 61 6C 69 79 75 6E 63 73 2E 63 6F 6D
42 16 32
44 61 75 74 68
11 32
51 32
FF
7B 22 70 72 6F 64 75 63 74 4B 65 79 22 3A 22 61 31 6E 38 73 4F 6F 64 42 71 39 22 2C 22 64 65 76 69 63 65 4E 61 6D 65 22 3A 22 4E 42 30 30 31 22 2C 22 63 6C 69 65 6E 74 49 64 22 3A 22 61 31 6E 38 73 4F 6F 64 42 71 39 26 4E 42 30 30 31 22 2C 22 73 69 67 6E 22 3A 22 63 39 38 35 61 36 37 39 36 37 34 31 62 38 37 33 32 38 64 30 34 32 30 36 33 62 65 33 31 63 30 64 22 2C 22 73 65 71 22 3A 22 31 22 7D
结果发送
利用串口调试助手将我们转换后的报文发送到Host:Port
收到的内容
{"random":"8894acb651b09d67","seqOffset":2,"token":"hUJL2bcEHxkPvRwKR5Pq000100.3a2d"}
注意
收到的数据进行保存,上报数据 要用
{"random":"8894acb651b09d67","seqOffset":2,"token":"hUJL2bcEHxkPvRwKR5Pq000100.3a2d"}
3、上报数据 示例
POST /topic/sys/a1TdN6l15ZQ/D001/thing/event/property/post
Host: a1TdN6l15ZQ.coap.cn-shanghai.link.aliyuncs.com
Port: 5682
Accept: application/json
Content-Format: application/json
CustomOptions: 2088(标识token)
CustomOptions: 2089(AES加密项)
payload: {"method":"thing.event.property.post","id":"203302322","params":{"CurrentHumidity":32.32,"CurrentTemperature":22.22},"version":"1.0.0"}
-
POST:路径在设备→Topic列表→选择post的路径
-
CustomOptions
2088,2089都是Option中的 NO. 的值
NO. 2088是认证时返回的token
NO. 2089是一个AES加密项
转换结果
40 02 01 02
3D 21 61 31 6E 38 73 4F 6F 64 42 71 39 2E 63 6F 61 70 2E 63 6E 2D 73 68 61 6E 67 68 61 69 2E 6C 69 6E 6B 2E 61 6C 69 79 75 6E 63 73 2E 63 6F 6D
42 16 32
45 74 6F 70 69 63
03 73 79 73
0B 61 31 6E 38 73 4F 6F 64 42 71 39
05 4E 42 30 30 31
05 74 68 69 6E 67
05 65 76 65 6E 74
08 70 72 6F 70 65 72 74 79
04 70 6F 73 74
11 32
51 32
ED 07 0A 12 31 31 48 49 42 76 6A 4A 77 72 78 45 4A 45 56 79 58 4E 44 57 30 30 30 31 30 30 2E 65 66 61 37
1D 03 E34C90B278D7397311673166FBB80059
FF F30471013C8153579BCEEBF5A3F86773A7DF7A392D11D156C9A907115446CFBE67CAE3305C41E1732CEFBAB01509D326C9EA4ACCAB00F36C15E1740B01D01C36C5EAB6638E4D74E1348DA13BFC7D57451814D51F54B1126B614430E8C0A9DA7C57BAE72DCBF8D32398685C9EE0E60022FFF5B8530472F122E1D6ADECDED970C600D9C6D1E84D09AFDE6C79E1E985BC76
AES加密方法:
(1)构建明文:DeviceSecret**,**+第一步认证时返回的random字符串 (逗号不能省)
(2)对(1)构建的明文,进行 sha256加密
(3)sha256 加密后的结果时 32个字节,去掉前后八个字节,留中间16个字节作为密钥
(4)AES加密时的初始向量 35343379686A79393761653766796667(固定值)
(5)待加密的明文:第一步返回的seq值,每次计算 AES 加密的时候 +1 作为明文
(6)AES加密后的数据,一般是16个字节
要用数据
DeviceSecret**:VbGDQWkXza4Xh84565iuqiKKFGNQRhDt,**
{"random":"8894acb651b09d67","seqOffset":2,"token":"hUJL2bcEHxkPvRwKR5Pq000100.3a2d"}
初始向量
35343379686A79393761653766796667
AES工具应用说明
补充:
1、(5)的解释,看一下定义即可。我们的seqOffset是2,因此我们传的时候需要传3(0x33)。
2、我们使用AES工具进行加密,软件大家在网上自行查找即可。
3、传输payload
的时候,也需要进行AMS加密,初始向量 和 密钥使用我们上面给的
4、不要忘记 分隔符 FF
结束
代码重在练习!
代码重在练习!
代码重在练习!
今天的分享就到此结束了,希望对你有所帮助,如果你喜欢我的分享,请点赞收藏加关注,谢谢大家!!!
由于 报文分析过程 是个动态过程,很难以文字展示,我目前正在写,将在下篇博客中分享。