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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员熊子峰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值