跳转至

七牛云设备绑定和OTA*

1 简介*

该文档主要介绍了七牛云平台的以下功能:

  • 如何绑定设备到控制台
  • 如何将新版本固件放到云服务器后进行升级

2 智控台*

下面的介绍都需要自行注册账号,新建智能体,此部分自行点击链接注册即可。

3 绑定设备*

为了方便演示,lightning 仓库默认使用固定的 Mac 地址,会自行连接到提前注册好的智能体上,若需切换参考下面的说明。

3.1 SDK 代码修改*

打开文件 project/ln_model_public/app/common.h,设置宏定义 CONFIG_LICENSE_ENABLE1CONFIG_LICENSE_CHECK0,编译烧录。

/**
* @addtogroup config
* @{
*/
#define CONFIG_LICENSE_ENABLE (1)
#define CONFIG_LICENSE_ERASE (0)
#define CONFIG_LICENSE_CHECK (0) /*!< CONFIG_LICENSE_ENABLE 为 1 时有效,默认关闭,方便测试,量产注意打开 */
#define CONFIG_OTA_ENABLE (1)
/** @} */

3.2 绑定方式介绍*

3.2.1 设备预先导入方式*

  1. 连接 882 的日志串口,查看打印的 Mac 地址,例如下方 00:50:E0:49:1E:5B
    +--------------- net device info ------------+
    |netif hostname: ln_sta                      |
    |netif ip      = 192.168.137.68              |
    |netif mask    = 255.255.255.0               |
    |netif gateway = 192.168.137.1               |
    |netif mac     : [00:50:E0:49:1E:5B]         |
    +--------------------------------------------+
    
  2. 打开智控台添加设备,按图片红框操作,输入的 Mac 地址是日志中打印的。
  3. 重启设备,刷新浏览器控制台设备管理界面,看是否成功添加新设备。

3.2.2 设备验证码方式*

注意事项

  • 若设备已经绑定则无激活码下发,可在控制台解除绑定后测试此方式。
  • 验证码方式在当前代码中,实现方式为尝试 10 次连接,每次失败延时 8 秒重新尝试,请注意验证码填写到控制台的时间
  1. 连接 882 的日志串口,查看打印的 验证码 ,例如下方 776693
    Invalid or missing fields in 'websocket.ws_token' object
    *****************************
    *           776693        *
    *****************************
    [I/HTTP] [http_check_version | 265] http check_version done, exit...
    ota_activate_thread_entry 2 free heap: 72400
    Activating... 1/10
    
  2. 打开智控台,按图片红框操作,输入的验证码是日志中打印的。
  3. 刷新浏览器控制台设备管理界面,看是否成功添加新设备。

4 OTA 升级 822*

4.1 版本检查说明*

注意

对于升级的版本检查包含两部分,默认代码两部分均会检查,可以自行修改代码决定是否使用检查 2

4.1.1 检查 1:APP 版本定义*

  • 新升级的版本号需要大于旧版本
  • 位置 project/ln_model_public/app/board_info.h 修改 #define APP_VERSION "1.0.1"

4.1.2 检查 2:flashimage.bin 文件的版本号*

  • 需要保证新升级和旧版本不一致
  • project/ln_model_public/cfg/proj_config.h 定义
    /*
    * flash image settings
    */
    #define FLASH_IMAGE_VER_MAJOR 0
    #define FLASH_IMAGE_VER_MINOR 1
    
  • 若要去除此检查,可注释 project/ln_model_public/app/servers/qiniu/ota_activate.c 中部分代码,参考
    static bool ota_download_precheck(uint32_t app_offset, image_hdr_t *ota_hdr)
    {
      image_hdr_t *app_hdr = NULL;
      if (NULL == (app_hdr = OS_Malloc(sizeof(image_hdr_t)))) {
          LOG(LOG_LVL_ERROR, "[%s:%d] malloc failed.\r\n", __func__, __LINE__);
          return false;
      }
    
      if (OTA_ERR_NONE != image_header_fast_read(app_offset, app_hdr)) {
          LOG(LOG_LVL_ERROR, "failed to read app header.\r\n");
          goto ret_err;
      }
    
      if ((ota_hdr->image_type == IMAGE_TYPE_ORIGINAL) ||
          (ota_hdr->image_type == IMAGE_TYPE_ORIGINAL_XZ)) {
    #if !TEST_OTA_UPGRADE
          // check version
          // if (((ota_hdr->ver.ver_major << 8) + ota_hdr->ver.ver_minor) ==
          //     ((app_hdr->ver.ver_major << 8) + app_hdr->ver.ver_minor)) {
          //     LOG(LOG_LVL_ERROR, "[%s:%d] same version, do not upgrade!\r\n", __func__, __LINE__);
          //     goto ret_err;
          // }
    #endif
          // check file size
          if (((ota_hdr->img_size_orig + sizeof(image_hdr_t)) > APP_SPACE_SIZE) ||
              ((ota_hdr->img_size_orig_xz + sizeof(image_hdr_t)) > OTA_SPACE_SIZE)) {
              LOG(LOG_LVL_ERROR, "[%s:%d] size check failed.\r\n", __func__, __LINE__);
              goto ret_err;
          }
      } else {
          // image type not support!
          goto ret_err;
      }
    
      OS_Free(app_hdr);
      return true;
    
    ret_err:
      OS_Free(app_hdr);
      return false;
    }
    

4.2 升级步骤*

  1. 需要参考绑定设备步骤,绑定设备到智控台,并设置 CONFIG_LICENSE_ENABLECONFIG_OTA_ENABLE1
    • 编译烧录一份到设备。
    • 更新版本(前面说明的两个检查版本)后再编译一份来上传云端。
  2. 自行定义版本,将编译的新版本固件上传到云服务器。
    • 注意两部分的版本检查
    • 上传固件文件为编译输出的 build-ln_model_public-release/bin/flashimage-ota-xz-vx.x.bin
    • BIN 大小不能超过 680K,若超过寻求亮牛人员修改 project/ln_model_public/cfg/flash_partition_cfg.json 文件内容。
  3. 升级过程仅在每次上电时检查到有新的版本时触发, 故保证当前板子为旧版本固件的情况下重启板子即可
  4. 关键打印说明
    • 版本检查开始,当前版本 1.0.1:
      wifi get ip callback
      [APP] netconfig connected
      OTA activate init free heap: 78224
      ===========     qiniu app version 1.0.1     ===============================
      [qiniu] ota_activate_thread_entry 1 free heap: 74016
      [I/HTTP] [http_check_version | 240] http check_version start.!!!
      
    • 检查到新版本 1.2.3:
      ...省略一部分...
      ota_882h version: 1.2.3
      ota_882h url: https://xrobot-storage.qnaigc.com/firmwares/1965326919608012801/61236c694db64ee79c2af15c9416cddd.bin
      ...省略一部分...
      Fonud new verison 1.2.3, do upgrade ...
      
    • 下载过程:
      ...省略一部分...
      write at flash: 0x0016d000, len:1167
      write at flash: 0x0016e000, len:1167
      write at flash: 0x0016f000, len:1167
      [APP] Free Heap: 26616
      write at flash: 0x00170000, len:1167
      write at flash: 0x00171000, len:1167
      write at flash: 0x00172000, len:1167
      write at flash: 0x00173000, len:1167
      ...省略一部分...
      
    • 验证并重启:
      total received 670135 bytes. ota verify image ...
      Succeed to verify OTA image content. 
      
    • 重启出现新版本信息:
      wifi get ip callback
      [APP] netconfig connected
      OTA activate init free heap: 78224
      ===========     qiniu app version 1.2.3     ===============================
      

5 OTA 升级 8006*

!!! 注意: 本示例仅是从本地服务器下载,若需从云端下载可参考 882 的过程,进行开发

  1. 文件 project/ln_model_public/app/usr_app.c 通过 ota_activate_on_activated() 函数注册升级步骤
    static void _network_manager_on_net_connected(void)
    {
        LOG(LOG_LVL_INFO, "[APP] netconfig connected\r\n");
        smartbot_load_mode();
    #if defined(CONFIG_OTA_ENABLE) && CONFIG_OTA_ENABLE
        ota_activate_on_activated(_ota_activate_on_activated);
        ota_activate_init();
    #else
        _ota_activate_on_activated();
    #endif /* CONFIG_OTA_ENABLE */
    }
    
  2. 文件 project/ln_model_public/app/servers/qiniu/ota_activate.cif (_on_activated) _on_activated(); 这行函数进入升级
    static void ota_activate_thread_entry(void *arg)
    {
        (void)(arg);
    
        while (!netdev_got_ip()) OS_MsDelay(100);
        LOG(LOG_LVL_INFO, "===========     qiniu app version %s     ===============================\r\n", APP_VERSION);
    
        LOG(LOG_LVL_INFO, "[qiniu] ota_activate_thread_entry 1 free heap: %d\r\n", OS_GetFreeHeapSize());
    
        http_check_version(URL_OTA_ACTIVATE);
    
        if (CFG.ota_882h.url[0] && CFG.ota_882h.version[0] && is_new_version(CFG.ota_882h.version)) {
            LOG(LOG_LVL_INFO, "Fonud new verison %s, do upgrade ...\r\n", CFG.ota_882h.version);
            LOG(LOG_LVL_INFO, "upgrade result: %d\r\n", ota_upgrade(CFG.ota_882h.url));
        }
    
        LOG(LOG_LVL_INFO, "ota_activate_thread_entry 2 free heap: %d\r\n", OS_GetFreeHeapSize());
    
        if (CFG.activate.act_challenging) ota_activate(URL_OTA_ACTIVATE);
    
        LOG(LOG_LVL_INFO, "ota_activate_thread_entry 3 free heap: %d\r\n", OS_GetFreeHeapSize());
    
        if (_on_activated) _on_activated();
    
        OS_ThreadDelete(&ota_activate_thread);
    }
    
  3. 文件 project/ln_model_public/app/ota/ota_upgrade.c 实现升级逻辑,可自行阅读代码
  4. 可更换 #define URL_GX8006_VERSION_CHECK "http://192.168.111.190:8000/ota/version" IP 地址自行测试
  5. 测试默认服务器的 python 脚本位置:project/ln_model_public/app/test/ota_test_server.py,注意修改 IP,可运行此脚本,之后重启芯片测试。