七牛云设备绑定和OTA*
1 简介*
该文档主要介绍了七牛云平台的以下功能:
- 如何绑定设备到控制台
- 如何将新版本固件放到云服务器后进行升级
2 智控台*
下面的介绍都需要自行注册账号,新建智能体,此部分自行点击链接注册即可。
3 绑定设备*
为了方便演示,lightning 仓库默认使用固定的 Mac 地址,会自行连接到提前注册好的智能体上,若需切换参考下面的说明。
3.1 SDK 代码修改*
打开文件 project/ln_model_public/app/common.h,设置宏定义 CONFIG_LICENSE_ENABLE 为 1, CONFIG_LICENSE_CHECK 为 0,编译烧录。
/**
* @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 设备预先导入方式*
- 连接
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] | +--------------------------------------------+ - 打开智控台添加设备,按图片红框操作,输入的
Mac地址是日志中打印的。
- 重启设备,刷新浏览器控制台设备管理界面,看是否成功添加新设备。
3.2.2 设备验证码方式*
注意事项
- 若设备已经绑定则无激活码下发,可在控制台解除绑定后测试此方式。
- 验证码方式在当前代码中,实现方式为尝试 10 次连接,每次失败延时 8 秒重新尝试,请注意验证码填写到控制台的时间
- 连接
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 - 打开智控台,按图片红框操作,输入的验证码是日志中打印的。
- 刷新浏览器控制台设备管理界面,看是否成功添加新设备。
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 升级步骤*
- 需要参考绑定设备步骤,绑定设备到智控台,并设置
CONFIG_LICENSE_ENABLE和CONFIG_OTA_ENABLE为1。- 编译烧录一份到设备。
- 更新版本(前面说明的两个检查版本)后再编译一份来上传云端。
- 自行定义版本,将编译的新版本固件上传到云服务器。
- 注意两部分的版本检查
- 上传固件文件为编译输出的
build-ln_model_public-release/bin/flashimage-ota-xz-vx.x.bin - BIN 大小不能超过 680K,若超过寻求亮牛人员修改
project/ln_model_public/cfg/flash_partition_cfg.json文件内容。
- 升级过程仅在每次上电时检查到有新的版本时触发, 故保证当前板子为旧版本固件的情况下重启板子即可
- 关键打印说明
- 版本检查开始,当前版本 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 ===============================
- 版本检查开始,当前版本 1.0.1:
5 OTA 升级 8006*
!!! 注意: 本示例仅是从本地服务器下载,若需从云端下载可参考 882 的过程,进行开发
- 文件
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 */ } - 文件
project/ln_model_public/app/servers/qiniu/ota_activate.c的if (_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); } - 文件
project/ln_model_public/app/ota/ota_upgrade.c实现升级逻辑,可自行阅读代码 - 可更换
#define URL_GX8006_VERSION_CHECK "http://192.168.111.190:8000/ota/version"IP 地址自行测试 - 测试默认服务器的 python 脚本位置:
project/ln_model_public/app/test/ota_test_server.py,注意修改 IP,可运行此脚本,之后重启芯片测试。