跳转至

离在线设计方法概述

1. 概述

本文描述了如何使用CI110系列芯片离在线软件开发包(SDK)开发离在线方案,旨在方便开发人员快速开发代码。

CI110系列芯片离在线软件开发包(SDK)可到 ☞启英泰伦语音AI平台 资料库中下载。


2. 离在线方案概述

2.1. 方案特点

我司结合离线语音和在线语音功能推出离在线产品方案,兼顾了离线识别的快速反应和在线云平台的内容和服务,给用户带来全新的体验。CI110系列芯片内置多个IO,开发者可根据需求在离在线产品方案基础上快速完成产品开发,取代现有传统单片机控制方案。

2.2. 方案框图

方案框图

图2-1 方案框图

3. 快速开发

3.1. SDK用户代码说明

SDK用户代码区域如下图3-1所示:

SDK用户代码区域

图3-1 SDK用户代码区域

下列文件所在目录:

  • CI110X_SDK\sample\internal\sample_media\src\
文件名 描述
sample_main.c 主函数所在文件:包含任务创建、平台初始化、系统启动代码
system_hook.c 事件钩子接口c文件:系统启动、唤醒、退出唤醒、语音识别事件钩子函数
system_hook.h 事件钩子接口h文件
system_msg_deal.c 系统消息处理任务.c文件
system_msg_deal.h 系统消息处理任务.h文件
user_config.h 用户配置宏定义.h文件
user_msg_deal.c 用户代码.c文件:串口协议、IIC协议、按键消息等用户处理
user_msg_deal.h 用户代码.h文件
ci_uart_protocol.c wifi数据交互串口协议.c文件
ci_uart_protocol.h wifi数据交互串口协议.h文件
LinkMsgProc.c wifi数据交互串口协议编/解码.c文件
LinkMsgProc.h wifi数据交互串口协议编/解码.h文件
voice_upload_manage.c 上传音频处理.c文件
voice_upload_manage.h 上传音频处理.h文件

3.2. 添加用户代码示例

  1. 针对唤醒词添加协议等处理代码,找到CI110X_SDK\sample\internal\sample_1102\src,
  • 先在user_msg_deal.h里添加处理接口声明,例如:
void wake_up_xxx_deal(void);
  • 然后在user_msg_deal.c里添加处理接口定义,例如:
void wake_up_xxx_deal(void)
{
    /*处理接口逻辑代码*/
}
  • 最后在system_hook.c里调用接口,例如:
__WEAK void sys_weakup_hook(void)
{
    #if MSG_COM_USE_UART_EN
    vmup_send_notify(VMUP_MSG_DATA_NOTIFY_WAKEUPENTER);
    #endif

    /*此处添加处理接口调用*/
    wake_up_xxx_deal();
}

注意

系统其他状态(系统启动、系统退出唤醒、语音识别),也可参照上述方式添加代码,但需在对应的事件钩子函数中调用。

  1. 根据命令词ID添加处理代码,找到CI110X_SDK\sample\internal\sample_media\src\user_msg_deal.c的deal_asr_msg_by_cmd_id函数。

命令词ID的对应命令词,由CI110X_SDK\sample\internal\sample_media\firmware\user_file\cmd_info[60000]{xxx}cmd_info.xls指定

uint32_t deal_asr_msg_by_cmd_id(sys_msg_asr_data_t *asr_msg cmd_handle_t cmd_handle uint16_t cmd_id)
{
    uint32_t ret = 1;
    int select_index = -1;
    switch(cmd_id)
    {
        case 2://“打开空调”
        {
            /*此处根据命令词ID添加处理代码*/
            break;
        }
        /*自行添加case处理命令词ID*/
        /*省略部分代码*/
        default:
            ret = 0;
            break;
    }
    /*省略部分代码*/
}
  1. 根据语义ID添加处理代码,找到CI110X_SDK\sample\internal\sample_1102\src\user_msg_deal.c的deal_asr_msg_by_semantic_id函数。

更多语义ID信息可以访问 ☞CI110系列芯片语义ID文档说明 页面

uint32_t deal_asr_msg_by_semantic_id(sys_msg_asr_data_t *asr_msg cmd_handle_t cmd_handle uint32_t semantic_id)
{
    uint32_t ret = 1;
    if (PRODUCT_GENERAL == get_product_id_from_semantic_id(semantic_id))
    {
        uint8_t vol;
        int select_index = -1;
        switch(get_function_id_from_semantic_id(semantic_id))
        {
        case VOLUME_UP:        //增大音量
            vol = vol_set(vol_get() + 1);
            select_index = (vol == VOLUME_MAX) ? 1:0;
            break;
        case XXX_XXX:
            /*此处根据语义ID添加处理代码*/
            break;
        /*自行添加case处理语义ID*/
        /*省略部分代码*/
        default:
            ret = 0;
            break;
        }
        /*省略部分代码*/
    }
    /*省略部分代码*/
}

3.3. OTA

3.3.1. 概述

此功能是通过HTTP URL下载数据,并未做设备管理和下载鉴权。并且升级过程中发生断电、断网、通信链路数据错误丢失等异常情况不影响重启后正常的使用。开发者在方便开发者快速移植,SDK中提供基本的OTA升级接口。

3.3.2. 总体框架

    +=================+
    | Server firmware |     服务器固件
    +=================+
            |    --->http下载
            V
    +=================+
    |    WIFI MCU     |     
    +=================+
            | ^
            | |  --->通信线路(目前支持UART/SDIO,适配层中留有接口可以灌入/产生通信数据)
            V |
    +=================+
    |    CI1103       |     语音模块
    +=================+

3.3.3. 文件结构

    cias_ota/
    ├── cias_http_ota_port.c //ota移植适配,包括通信通路、ota任务
    ├── cias_http_ota_port.h //ota移植适配,定义OTA URL、是否强制升级全部分区
    ├── cias_log.h           //ota log打印函数定义
    ├── cias_os_port.h       //ota移植系统适配(内存动态申请释放,延时函数)
    ├── crc
    │   ├── cias_crc.c       //crc8、crc16
    │   └── cias_crc.h       
    ├── http_download
    │   ├── cias_http_download.c //http下载。基于socket实现,适配LWIP、TCP/IP
    │   └── cias_http_download.h 
    ├── online_communica_protocol
    │   ├── cias_olcp.c         //通信协议
    │   ├── cias_olcp_export.h  //通信协议对外接口
    │   └── cias_olcp.h         //通信协议数据结构
    └── ota
        ├── cias_http_ota.c     //ota升级流程,与系统无关,移植时不需要更改
        └── cias_http_ota.h 

3.3.4. 配置OTA升级

  • 在cias_http_ota_port.h定义升级URL、是否强制升级所有分区
#define HTTP_OTA_URL0           "http://121.199.52.33:8080/CI1103_V1.bin" //升级URL
#define UPDATE_ALL_PARTITION    0 //升级全部分区(1:打开,0:关闭)

3.3.5. wifi端代码用户移植说明

移植wifi端代码对CI1103进行OTA升级,须移植实现cias_http_ota_port.c、cias_log.h、cias_os_port.h

  1. cias_http_ota_port.c文件移植
/**
 * @description: 创建OTA升级任务,当CI1103申请需要进行OTA升级的时候需调用此函数。
 * @param { void } 
 * @return {-1 :err
 *           0 :successful} 
 */
int cias_http_ota_port_task_create(void)
/**
 * @description: OTA升级任务,  由于CI1103申请进行OTA升级的时候,并不会判断当前网络是否连接。
 *                              所以移植时需实现其中get_wifi_connect_sta()函数当wifi连接上网络时返回1未连接返回0
 *                              升级完成后需删除此任务
 * @param { parameter: 任务参数 } 
 * @return { void } 
 */
void _http_ota_port_task(void *parameter)
/**
 * @description: OTA通信协议链路数据接收函数,当进行OTA时,接收到的原始数据传入此函数
 * @param { buff:   原始数据   
 *          len:    原始数据长度} 
 * @return {-1 :err
 *           0 :successful} 
 */
int http_ota_olcp_recv(unsigned char* buff, unsigned int len)
  1. cias_log.h文件移植
/**
 * 移植适配接口
*/
#define CIAS_LOG_LEVEL_DEFINE       eCIAS_LOG_DEBUG          //定义打印等级
#define CIAS_LOG_AGENT(fmt,...)     printf(fmt,##__VA_ARGS__)//适配打印函数
  1. cias_os_port.h文件移植
/**
 * 移植适配接口
*/
#define cias_malloc         pvPortMalloc                      //内存申请
#define cias_free(f)        if(f!=NULL){vPortFree(f);f=NULL;} //内存释放
#define cias_delay_ms       vTaskDelay      //延时毫秒

3.3.6. 升级流程

  • 1、CI1103请求进行OTA升级
  • 2、wifi端调用cias_http_ota_port_task_create()函数创建升级任务
  • 3、wifi端判断是否连接上网络
  • 4、wifi端调用cias_http_ota_main进行升级
  • 5、wifi端使CI1103进入OTA模式(申请flash控制权,升级过程中其他任务无法读写flash)
  • 6、wifi端检查设备是否进入OTA模式
  • 7、wifi端创建http下载连接
  • 8、比较URL文件和CI1103的分区表,得到需要更新的分区。
  • 9、更新需要更新的分区
  • 10、使CI1103系统重启,并且播放对应提示语(包括升级成功、已是最新版本)
  • 11、wifi端删除升级任务

4. 相关链接

CI1103芯片手册

腾讯云小微方案设计指南

腾讯云小微介绍