需求:
新发布的Alios Things 3.3.0有很多方便大家开发的例程,在例程上可以很快的开发完成功能。通过linksdk_demo例程,我们可以端节点数据上平台,IOT Studio下发设置端节点的物模型属性,ota_demo可以方便的完成ota版本管理的功能。
当一个产品要用到现场的时候,OTA功能是非常重要的维护手段,毕竟谁也不能保证自己的代码写好就没有问题了,因此linksdk_demo和ota_demo的合并,是常见的组合。
本文详细说明如何合并这两个例程。
目录
1.观察差异
1.1 下行代码差异
在MQTT消息处理上,linkSDK多创建了一个实例叫DATA-MODEL,用于处理接收到的下行报文,我们交给他处理即可,因为ota的下行报文处理,其实没有做什么事情,也就是说,不需要把这个demo_mqtt_default_recv_handler)合并到linksdk_demo里面,直接用DATA-MODEL处理下行属性报文即可。
OTA的消息处理代码
/* 配置MQTT默认消息接收回调函数 */
aiot_mqtt_setopt(mqtt_handle, AIOT_MQTTOPT_RECV_HANDLER, (void *)demo_mqtt_default_recv_handler);
LinkSDK的下行报文处理代码
/* 创建DATA-MODEL实例 */
dm_handle = aiot_dm_init();
if (dm_handle == NULL) {
printf("aiot_dm_init failed");
return -1;
}
/* 配置MQTT实例句柄 */
aiot_dm_setopt(dm_handle, AIOT_DMOPT_MQTT_HANDLE, mqtt_handle);
/* 配置消息接收处理回调函数 */
aiot_dm_setopt(dm_handle, AIOT_DMOPT_RECV_HANDLER, (void *)demo_dm_recv_handler);
1.2 事件处理代码差异
linksdk例程
/* MQTT事件回调函数, 当网络连接/重连/断开时被触发, 事件定义见core/aiot_mqtt_api.h */
void demo_mqtt_event_handler(void *handle, const aiot_mqtt_event_t *event, void *userdata)
{
switch (event->type) {
/* SDK因为用户调用了aiot_mqtt_connect()接口, 与mqtt服务器建立连接已成功 */
case AIOT_MQTTEVT_CONNECT: {
printf("AIOT_MQTTEVT_CONNECT\n");
/* TODO: 处理SDK建连成功, 不可以在这里调用耗时较长的阻塞函数*/
}
break;
ota例程多了一个mqtt_connected_cb(handle);
/* MQTT事件回调函数, 当网络连接/重连/断开时被触发, 事件定义见core/aiot_mqtt_api.h */
void demo_mqtt_event_handler(void *handle, const aiot_mqtt_event_t *event, void *userdata)
{
switch (event->type) {
/* SDK因为用户调用了aiot_mqtt_connect()接口, 与mqtt服务器建立连接已成功 */
case AIOT_MQTTEVT_CONNECT: {
printf("AIOT_MQTTEVT_CONNECT\n");
/* TODO: 处理SDK建连成功, 不可以在这里调用耗时较长的阻塞函数- */
mqtt_connected_cb(handle);
}
break;
2.合并代码
OTA例程里有三个子函数,把它们拷贝到linksdk_demo里;
void ota_module_upgrade_start(void *ctx)
static int ota_upgrade_cb(ota_service_t *pctx, char *ver, char *module_name)
static void mqtt_connected_cb(void *handle)
在OTA处理MQTT连接事件时,多了一行的代码
mqtt_connected_cb(handle);
我们添加到linksdk同样的位置上,里面有涉及ota的一些事情,这样我们的linksdk_demo就具备了处理ota的功能:
case AIOT_MQTTEVT_CONNECT: {
printf("AIOT_MQTTEVT_CONNECT\n");
/* TODO: 处理SDK建连成功, 不可以在这里调用耗时较长的阻塞函数 */
mqtt_connected_cb(handle);
}
3.添加宏定义和引用
其它的就是一些宏定义之类的。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <aos/cli.h>
#include "netmgr.h"
#include "ulog/ulog.h"
#include "ota_agent.h"
#include "core_mqtt.h"
#include "netmgr_wifi.h"
#include "aiot_mqtt_api.h"
#include "aiot_state_api.h"
#include "aiot_sysdep_api.h"
#include <uservice/eventid.h>
#include <uservice/uservice.h>
#define MY_APP_VER "app-1.0.0"
#define USER_MODULE_VER "m-1.0.0"
#define USER_MODULE_VER2 "m-2.0.0"
#define USER_MODE_NAME "module1"
#define SUBDEV_FILE_PATH "/data/module1.bin"
static char mqtt_started = 0;
static ota_store_module_info_t g_module_info[3];
static ota_service_t ctx = {0};
记得把ota的公钥贴到ota_hal_digest.c里。
4.妥妥的升级成功
升级的流程就按照这个文档进行即可:https://blog.csdn.net/HaaSTech/article/details/116380520
这样就完成合并了,测试了一下,可以linksdk_demo可以正常ota升级了。