【开发者案例】不但能联物联网平台还能OTA, 记录在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升级了。

猜你喜欢

转载自blog.csdn.net/HaaSTech/article/details/119960753