离在线设计方法概述¶
1. 概述¶
本文描述了如何使用CI110系列芯片离在线软件开发包(SDK)开发离在线方案,旨在方便开发人员快速开发代码。
CI110系列芯片离在线软件开发包(SDK)可到 ☞启英泰伦语音AI平台 资料库中下载。
2. 离在线方案概述¶
2.1. 方案特点¶
我司结合离线语音和在线语音功能推出离在线产品方案,兼顾了离线识别的快速反应和在线云平台的内容和服务,给用户带来全新的体验。CI110系列芯片内置多个IO,开发者可根据需求在离在线产品方案基础上快速完成产品开发,取代现有传统单片机控制方案。
2.2. 方案框图¶
图2-1 方案框图
3. 快速开发¶
3.1. SDK用户代码说明¶
SDK用户代码区域如下图3-1所示:
图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. 添加用户代码示例¶
- 针对唤醒词添加协议等处理代码,找到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();
}
注意
系统其他状态(系统启动、系统退出唤醒、语音识别),也可参照上述方式添加代码,但需在对应的事件钩子函数中调用。
- 根据命令词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;
}
/*省略部分代码*/
}
- 根据语义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
- 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)
- cias_log.h文件移植
/**
* 移植适配接口
*/
#define CIAS_LOG_LEVEL_DEFINE eCIAS_LOG_DEBUG //定义打印等级
#define CIAS_LOG_AGENT(fmt,...) printf(fmt,##__VA_ARGS__)//适配打印函数
- 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端删除升级任务