快速上手阿里云CoAP物联网:从产品创建到认证上报全流程详解

目前阿里云服务器中的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.01000 00001GET
    0.02000 00010POST
    0.03000 00011PUT
    0.04000 00100DELETE

    Class2

    Code 值二进制含义
    2.01010 00001Created(已创建,通常对应 POST 成功并创建资源)
    2.02010 00010Deleted(已删除,DELETE 成功)
    2.03010 00011Valid(资源未修改,自上次 GET 后无更新)
    2.04010 00100Changed(已变更,PUT 或 POST 成功更新资源)
    2.05010 00101Content(内容,GET 成功返回负载)

    Class4

    Code 值二进制含义
    4.00100 00000Bad Request(坏请求)
    4.01100 00001Unauthorized(未授权/签名错误)
    4.02100 00010Bad Option(无效的 Option)
    4.03100 00011Forbidden(被拒绝)
    4.04100 00100Not Found(资源未找到)
    4.05100 00101Method Not Allowed(方法不允许)
    4.06100 00110Not Acceptable(无法接受的格式)
    4.08100 01000Request Entity Incomplete(请求主体不完整)
    4.12100 01100Precondition Failed(先决条件失败)
    4.13100 01101Request Entity Too Large(请求实体过大)
    4.15100 01111Unsupported Content-Format(不支持的内容格式)

    Class5

    Code 值二进制含义
    5.00101 00000Internal Server Error(内部服务器错误)
    5.01101 00001Not Implemented(未实现)
    5.02101 00010Bad Gateway(错误的网关)
    5.03101 00011Service Unavailable(服务不可用)
    5.04101 00100Gateway Timeout(网关超时)
    5.05101 00101Proxying 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

结束

代码重在练习!

代码重在练习!

代码重在练习!

今天的分享就到此结束了,希望对你有所帮助,如果你喜欢我的分享,请点赞收藏加关注,谢谢大家!!!

由于 报文分析过程 是个动态过程,很难以文字展示,我目前正在写,将在下篇博客中分享。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值