阿里云IoT平台CoAP接入 2 基础版CoAP协议接入测试

关于阿里云IoT平台CoAP接入,可见笔记阿里云IoT平台CoAP接入

小能手另外分享了NB-IoT的应用开发心得,先从模组端对几个常见模块进行试用分析,接着对更上层具体的CoAP协议进行研究,并且演示如何对接主流的第三方物联网平台,可以见NB-IoT应用开发笔记


1 前言

上篇笔记完成了云端产品功能定义,并生成了相应的设备证书。

这篇笔记将会跟着教程走,使用 Ubuntu 对 SDK 编译验证,先完成基础版产品的上线。

官方教程默认使用MQTT进行接入,而关于 NB-IoT CoAP接入则在另一篇官方教程,具体见阿里云物联网套件 > 设备开发指南 > 设备多协议连接 > CoAP连接通信

2 总体流程

  • 设备端NB-IoT模块中集成阿里云 IoT SDK,厂商在IoT套件控制台申请设备证书(ProductKey/DeviceName/DeviceSecret)并烧录到设备中;
  • NB-IoT设备通过运营商的蜂窝网络进行入网,可能需要联系当地运营商,确保设备所属地区已经覆盖NB网络,并已具备NB-IoT入网能力;
  • 设备入网成功后,NB设备产生的流量数据及产生的费用数据,将由运营商的M2M平台管理,此部分平台能力由运营商提供;
  • 设备开发者可通过 CoAP/UDP 协议,将设备采集的实时数据上报到阿里云IoT套件,借助IoT套件实现海量亿级设备的安全连接和数据管理能力,并可通过规则引擎,与阿里云的各类大数据产品、云数据库和报表系统打通,快速实现从连接到智能的跨越;
  • IoT套件提供相关的数据开放接口和消息推送服务,可将数据转发到业务服务器中,实现设备资产与实际应用的快速集成。

3 SDK 准备

SDK下载:
https://help.aliyun.com/document_detail/42648.html

SDK github:
https://github.com/aliyun/iotkit-embedded

CoAP example: \sample\coap\coap-example.c

4 CoAP 设备认证

4.1 协议解析

此接口用于传输数据前获取token,只需要请求一次:
    POST /auth
    Host: ${productKey}.iot-as-coap.cn-shanghai.aliyuncs.com
    Port: 5684
    Accept: application/json or application/cbor
    Content-Format: application/json or application/cbor
    payload: {"productKey":"ZG1EvTEa7NN","deviceName":"NlwaSPXsCpTQuh8FxBGH","clientId":"mylight1000002","sign":"bccb3d2618afe74b3eab12b94042f87b"}

对应帧尝试手动组包一下。
Ver:01 T=0 TKL=0 // 0x40
Code=0.02 // 0x02
MID// 递增 0x00 0x01
Option No=12 len=1 value=50 // 0xC1 0x32
Marker // 0xFF

Payload比较麻烦,主要是关于sign字段的计算,手算是算不出来了,具体可以见SDK中的函数。

int iotx_calc_sign(const char *p_device_secret, const char *p_client_id,
                   const char *p_device_name, const char *p_product_key, char sign[IOTX_SIGN_LENGTH])
{
    char *p_msg = NULL;

    p_msg = (char *)coap_malloc(IOTX_SIGN_SOURCE_LEN);
    if (NULL == p_msg) {
        return IOTX_ERR_NO_MEM;
    }
    memset(sign,  0x00, IOTX_SIGN_LENGTH);
    memset(p_msg, 0x00, IOTX_SIGN_SOURCE_LEN);

    HAL_Snprintf(p_msg, IOTX_SIGN_SOURCE_LEN,
                 IOTX_SIGN_SRC_STR,
                 p_client_id,
                 p_device_name,
                 p_product_key);
    utils_hmac_md5(p_msg, strlen(p_msg), sign, p_device_secret, strlen(p_device_secret));

    coap_free(p_msg);
    COAP_DEBUG("The device name sign: %s", sign);
    return IOTX_SUCCESS;
}

4.2 SDK修改验证

\sample\coap\coap-example.c

只要修改设备三元组之后,即可编译测试。

[dbg] CoAPNetwork_read(146): << CoAP recv 4 bytes data
[dbg] CoAPMessage_handle(392): -----code   : 0x0---
[dbg] CoAPMessage_handle(393): -----type   : 0x2---
[dbg] CoAPMessage_handle(394): -----msgid  : 1---
[dbg] CoAPMessage_handle(395): -----opt    : 0---
[dbg] CoAPMessage_handle(405): Receive CoAP ACK Message,ID 1
[dbg] CoAPNetworkDTLS_read(43): << secure_datagram_read, read buffer len 1280, timeout 10000
<TRACE> [ssl/mbedtls/HAL_DTLS_mbedtls.c #326]   mbedtls_ssl_read len 149 bytes
[dbg] CoAPNetwork_read(146): << CoAP recv 149 bytes data
[dbg] CoAPMessage_handle(390): -----payload: {"token":"twowintercannottellyou"}---
[dbg] CoAPMessage_handle(392): -----code   : 0x45---
[dbg] CoAPMessage_handle(393): -----type   : 0x0---
[dbg] CoAPMessage_handle(394): -----msgid  : 6536---
[dbg] CoAPMessage_handle(395): -----opt    : 1---
[dbg] CoAPMessage_handle(409): Receive CoAP Response Message,ID 6536
[dbg] CoAPMessage_send(299): ----The message length 4-----
[dbg] CoAPMessage_send(309): The message doesn't need to be retransmitted
[dbg] CoAPRespMessage_handle(354): Find the node by token
[dbg] iotx_device_name_auth_callback(120): Receive response message:
[dbg] iotx_device_name_auth_callback(121): * Response Code : 0x45
[dbg] iotx_device_name_auth_callback(122): * Payload: {"token":"twowintercannottellyou"}
[inf] iotx_device_name_auth_callback(129): CoAP authenticate success!!!
[dbg] CoAPRespMessage_handle(366): Remove the message id 1 from list

4.3 控制台注意事项

运行之后发现,token收到了,但控制台上设备迟迟无法激活。困扰了很久,后来才知道阿里云CoAP控制台上的设备无法进行状态更新,一直显示“未激活”。

这一点阿里云的同事是可以改进下,认证后,平台就应该显示设备已激活。

5 CoAP topic 上报

5.1 协议解析

POST /topic/${topic}
    Host: ${productKey}.iot-as-coap.cn-shanghai.aliyuncs.com
    Port: 5683
    Accept: application/json or application/cbor
    Content-Format: application/json or application/cbor
    payload: ${your_data}
    CustomOptions: number:61(标识token)

5.2 SDK修改验证

在控制台里找到自己的topic,并修改上报函数:

int iotx_report_topic(char *topic_name, char *topic_head, char *product_key, char *device_name)
{
    int ret;
    /* reported topic name: "/${productKey}/${deviceName}/update" */
    ret = HAL_Snprintf(topic_name,
                       IOTX_URI_MAX_LEN,
                       "%s/%s/%s/update",
                       topic_head,
                       product_key,
                       device_name);
    return ret;
}

随意写入一个payload,编译运行测试。

则可以在控制台中看到有数据上行。

6 抓包确认

尝试用wireshark抓下包试试看。

由于走了DTLS加密,因此只能分析到UDP层,更细的帧格式无法查看。

其他不走DTLS加密的CoAP协议就可以用wireshark来了。

7 That’s all


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值