完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
ali-iotkit 软件包封装了 HTTP、MQTT、CoAP 和 OTA 等应用层协议,方便了用户设备接入云平台,这里摘取部分做简要介绍。
MQTT 连接 目前阿里云支持 MQTT 标准协议接入,兼容 3.1.1 和 3.1 版本协议,具体的协议请参考 MQTT 3.1.1 和 MQTT 3.1 协议文档。 特征
支持 TLSV1、 TLSV1.1 和 TLSV1.2 版本的协议建立安全连接。
默认情况下创建一个产品后,产品下的所有设备都拥有以下 Topic 类的权限:
使用 IOT_MQTT_Construct 接口与云端建立 MQTT 连接。 如果要实现设备长期在线,需要程序代码中去掉 IOT_MQTT_Unregister 和 IOT_MQTT_Destroy 部分,使用 while 保持长连接状态。 示例代码如下: while(1){ IOT_MQTT_Yield(pclient, 200); HAL_SleepMs(100);}订阅 Topic 主题 使用 IOT_MQTT_Subscribe 接口订阅某个 Topic。 代码如下: /* Subscribe the specific topic */rc = IOT_MQTT_Subscribe(pclient, TOPIC_DATA, IOTX_MQTT_QOS1, _demo_message_arrive, NULL);if (rc < 0) { IOT_MQTT_Destroy(&pclient); EXAMPLE_TRACE("IOT_MQTT_Subscribe() failed, rc = %d", rc); rc = -1; goto do_exit;}发布消息 使用 IOT_MQTT_Publish 接口发布信息到云端。 代码如下: /* Initialize topic information */memset(&topic_msg, 0x0, sizeof(iotx_mqtt_topic_info_t));strcpy(msg_pub, "message: hello! start!");topic_msg.qos = IOTX_MQTT_QOS1;topic_msg.retain = 0;topic_msg.dup = 0;topic_msg.payload = (void *)msg_pub;topic_msg.payload_len = strlen(msg_pub);rc = IOT_MQTT_Publish(pclient, TOPIC_DATA, &topic_msg);EXAMPLE_TRACE("rc = IOT_MQTT_Publish() = %d", rc);取消订阅 使用 IOT_MQTT_Unsubscribe 接口取消订阅云端消息 下行数据接收 使用 IOT_MQTT_Yield 数据接收函数接收来自云端的消息。 请在任何需要接收数据的地方调用这个 API。如果系统允许,请起一个单独的线程,执行该接口。 代码如下: /* handle the MQTT packet received from TCP or SSL connection */IOT_MQTT_Yield(pclient, 200);销毁 MQTT 连接 使用 IOT_MQTT_Destroy 接口销毁 MQTT 连接,释放内存。 代码如下: IOT_MQTT_Destroy(&pclient);检查连接状态 使用 IOT_MQTT_CheckStateNormal 接口查看当前的连接状态。 该接口用于查询MQTT的连接状态。但是,该接口并不能立刻检测到设备断网,只会在有数据发送或是 keepalive 时才能侦测到 disconnect。 MQTT 保持连接 设备端在 keepalive_interval_ms 时间间隔内,至少需要发送一次报文,包括 ping 请求。 如果服务端在 keepalive_interval_ms 时间内无法收到任何报文,物联网平台会断开连接,设备端需要进行重连。 在 IOT_MQTT_Construct 函数可以设置 keepalive_interval_ms 的取值,物联网平台通过该取值作为心跳间隔时间。keepalive_interval_ms 的取值范围是60000~300000。 示例代码: iotx_mqtt_param_t mqtt_params;memset(&mqtt_params, 0x0, sizeof(mqtt_params));mqtt_params.keepalive_interval_ms = 60000;mqtt_params.request_timeout_ms = 2000;/* Construct a MQTT client with specify parameter */pclient = IOT_MQTT_Construct(&mqtt_params);CoAP 连接
CoAP 约定
CoAP 协议适用在资源受限的低功耗设备上,尤其是 NB-IoT 的设备使用,基于 CoAP 协议将 NB-IoT 设备接入物联网平台的流程如下图所示: 建立连接 使用 IOT_CoAP_Init 和 IOT_CoAP_DeviceNameAuth 接口与云端建立 CoAP 认证连接。 示例代码: iotx_coap_context_t *p_ctx = NULL;p_ctx = IOT_CoAP_Init(&config);if (NULL != p_ctx) { IOT_CoAP_DeviceNameAuth(p_ctx); do { count ++; if (count == 11) { count = 1; } IOT_CoAP_Yield(p_ctx); } while (m_coap_client_running); IOT_CoAP_Deinit(&p_ctx);} else { HAL_Printf("IoTx CoAP init failed/r/n");}收发数据 SDK 使用接口 IOT_CoAP_SendMessage 发送数据,使用 IOT_CoAP_GetMessagePayload 和IOT_CoAP_GetMessageCode 接收数据。 示例代码: /* send data */static void iotx_post_data_to_server(void *param){ char path[IOTX_URI_MAX_LEN + 1] = {0}; iotx_message_t message; iotx_deviceinfo_t devinfo; message.p_payload = (unsigned char *)"{/"name/":/"hello world/"}"; message.payload_len = strlen("{/"name/":/"hello world/"}"); message.resp_callback = iotx_response_handler; message.msg_type = IOTX_MESSAGE_CON; message.content_type = IOTX_CONTENT_TYPE_JSON; iotx_coap_context_t *p_ctx = (iotx_coap_context_t *)param; iotx_set_devinfo(&devinfo); snprintf(path, IOTX_URI_MAX_LEN, "/topic/%s/%s/update/", (char *)devinfo.product_key, (char *)devinfo.device_name); IOT_CoAP_SendMessage(p_ctx, path, &message);}/* receive data */static void iotx_response_handler(void *arg, void *p_response){ int len = 0; unsigned char *p_payload = NULL; iotx_coap_resp_code_t resp_code; IOT_CoAP_GetMessageCode(p_response, &resp_code); IOT_CoAP_GetMessagePayload(p_response, &p_payload, &len); HAL_Printf("[APPL]: Message response code: 0x%x/r/n", resp_code); HAL_Printf("[APPL]: Len: %d, Payload: %s, /r/n", len, p_payload);}下行数据接收 使用 IOT_CoAP_Yield 接口接收来自云端的下行数据。 请在任何需要接收数据的地方调用这个API,如果系统允许,请起一个单独的线程,执行该接口。 销毁 CoAP 连接 使用 IOT_CoAP_Deinit 接口销毁 CoAP 连接并释放内存。 OTA 升级 固件升级 Topic
/ota/device/inform/productKey/deviceName
/ota/device/upgrade/productKey/deviceName
/ota/device/progress/productKey/deviceName
/ota/device/request/productKey/deviceName固件升级说明
初始化 OTA 模块的初始化依赖于 MQTT 连接,即先获得的 MQTT 客户端句柄 pclient。 h_ota = IOT_OTA_Init(PRODUCT_KEY, DEVICE_NAME, pclient);if (NULL == h_ota) { rc = -1; printf("initialize OTA failed/n");}上报版本号 在 OTA 模块初始化之后,调用 IOT_OTA_ReportVersion 接口上报当前固件的版本号,升级成功后重启运行新固件,并使用该接口上报新固件版本号,云端与 OTA 升级任务的版本号对比成功后,提示 OTA 升级成功。 示例代码如下: if (0 != IOT_OTA_ReportVersion(h_ota, "version2.0")) { rc = -1; printf("report OTA version failed/n");}下载固件 MQTT 通道获取到 OTA 固件下载的 URL 后,使用 HTTPS 下载固件,边下载边存储到 Flash OTA 分区。
// 判断是否有固件可下载if (IOT_OTA_IsFetching(h_ota)) { unsigned char buf_ota[OTA_BUF_LEN]; uint32_t len, size_downloaded, size_file; do { // 循环下载固件 len = IOT_OTA_FetchYield(h_ota, buf_ota, OTA_BUF_LEN, 1); if (len > 0) { // 写入到Flash等存储器中(边下载边存储) } } while (!IOT_OTA_IsFetchFinish(h_ota)); // 判断固件是否下载完毕}上报下载状态 使用 IOT_OTA_ReportProgress 接口上报固件下载进度。 if (percent - last_percent > 0) { IOT_OTA_ReportProgress(h_ota, percent, NULL);}IOT_MQTT_Yield(pclient, 100);判断下载固件是否完整 固件下载完成后,使用 IOT_OTA_Ioctl 接口校验固件的完整性。 int32_t firmware_valid;IOT_OTA_Ioctl(h_ota, IOT_OTAG_CHECK_FIRMWARE, &firmware_valid, 4);if (0 == firmware_valid) { printf("The firmware is invalid/n");} else { printf("The firmware is valid/n");}销毁 OTA 连接 使用 IOT_OTA_Deinit 销毁 OTA 连接并释放内存。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
786 浏览 0 评论
4210 浏览 0 评论
如何使用python调起UDE STK5.2进行下载自动化下载呢?
2520 浏览 0 评论
开启全新AI时代 智能嵌入式系统快速发展——“第六届国产嵌入式操作系统技术与产业发展论坛”圆满结束
2926 浏览 0 评论
获奖公布!2024 RT-Thread全球巡回线下培训火热来袭!报名提问有奖!
31442 浏览 11 评论
72903 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 07:11 , Processed in 0.587057 second(s), Total 72, Slave 55 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号