概述
关于阿里云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: samplecoapcoap-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修改验证
samplecoapcoap-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
最后
以上就是羞涩丝袜为你收集整理的阿里云IoT平台CoAP接入 2 基础版CoAP协议接入测试的全部内容,希望文章能够帮你解决阿里云IoT平台CoAP接入 2 基础版CoAP协议接入测试所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复