Alios Things 3.3在linksdk中增加OTA功能

Posted 千夫长-莫学良

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Alios Things 3.3在linksdk中增加OTA功能相关的知识,希望对你有一定的参考价值。

需求:

        新发布的Alios Things 3.3.0有很多方便大家开发的例程,在例程上可以很快的开发完成功能。通过linksdk_demo例程,我们可以端节点数据上平台,IOT Studio下发设置端节点的物模型属性,ota_demo可以方便的完成ota版本管理的功能。

        当一个产品要用到现场的时候,OTA功能是非常重要的维护手段,毕竟谁也不能保证自己的代码写好就没有问题了,因此linksdk_demo和ota_demo的合并,是常见的组合。

        本文详细说明如何合并这两个例程。

目录

1.观察差异

1.1 下行代码差异

1.2 事件处理代码差异

2.合并代码

3.添加宏定义和引用

4.妥妥的升级成功


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升级了。

以上是关于Alios Things 3.3在linksdk中增加OTA功能的主要内容,如果未能解决你的问题,请参考以下文章

如何基于AliOS Things 3.3编译Python固件

一文轻松入门HaaS100诊断调试系统_AliOS Things 3.3

HaaS100以太网连接阿里云物联网平台_AliOS Things 3.3

为你的AliOS Things应用增加自定义cli命令

AliOS-Things ESP8266 编译下载

如何用SystemView分析AliOS Things