# 描述

# 简介

本协议是模块与用户通过串口之间的通讯协议。 模块接口为 TTL 接口。

# 串口参数

波特率 数据位 奇偶校验 停止位 流控
115200 8 1

# 数据

本协议所有数据都为大端。

# 协议格式

# 消息格式

字节 含义说明
0 0xA5 同步头
1 0x01 用户ID
2 0xXX 消息类型
3~4 0xXXXX 消息数据长度
5~6 0xXXXX 消息ID
7~n 消息数据 消息数据
n+1 0xXX 内部校验码

# 通信规则

  • 双向通信,进行一问一答式通信;
  • 不分主从机,双方都可向对方发送请求信息;
  • 降噪模块通电启动后,会向上位机发送握手信号,确定与对方串口通信是否正常;在未接收到响应时,会每隔500ms发送一次握手请求信号;
  • 接收方接到请求后需在50ms内发送响应;

# 通信格式

通信格式定义了握手消息,设备消息,主控消息,确认消息。下面将分类详述:

分类 同步头 用户ID 消息类型 消息长度 消息ID 消息数据 校检码
字节 0 1 2 3~4 5~6 7 8 9 10 11
握手请求 0xA5 0x01 0x01 见下文解释 见下文解释 0xA5 0x00 0x00 0x00 见下文解释
字节 0 1 2 3~4 5~6 7~m m+1
设备消息 0xA5 0x01 0x04 同上 同上 消息体 同上
字节 0 1 2 3~4 5~6 7~m m+1
主控消息 0xA5 0x01 0x05 同上 同上 主控消息 同上
字节 0 1 2 3~4 5~6 7 8 9 10 11
确认消息 0xA5 0x01 0xff 同上 同上 0xA5 0x00 0x00 0x00 同上
  • 消息长度:

    数据格式中3~4字节为消息数据长度,消息长度编码为小端模式,即第3字节存储低字节,第4字节存储高字节。如握手请求消息中消息数据有4字节,则消息长度为4,编码到3~4字节就是0x04 0x00

  • 消息ID:

    数据格式中5~6字节为消息ID,与消息长度类似,也是小端模式编码。可以使用消息ID过滤因超时重发导致的重复消息。两字节长度的消息ID取值0-65535,所以在实际使用中需要循环使用,具体实现可以参考Android平台上的源码实现。

  • 校检码:

    数据格式中每种数据类型的最后一个字节都是校检码,用于检验串口传输的正确性。其计算方式为除校检码字节外所有字节求和取反并加1。公式如下:

    checkcode = ~sum(字节0+字节2+...+字节n) + 1
    
  • 编码格式:

    消息中字符串类型的数据编码格式为UTF-8。

# 消息类型

上位机与R818降噪模块的通信见下图:

通信消息类型包括握手消息、主控消息、设备消息和确认消息:

  • 握手消息

    握手消息是用来判断上位机与降噪模块间串口通信检测的。降噪模块与上位机完成硬件连接并通电后,降噪模块会不断构造握手消息发送到上位机,上位机按要求返回确认消息,降噪模块收到确认消息后确认串口通信正常,开始后续交互。

  • 主控消息

    主控消息是上位机发送给R818降噪模块的消息,格式为JSON。内容为上位机发送给降噪模块的控制指令,如更换唤醒词、设置固定波束等。

  • 设备消息

    设备消息是降噪模块主动上报给上位机的消息,格式为JSON,内容为降噪模块上报的事件信息,如唤醒事件,唤醒词内容等。

  • 确认消息

    确认消息是一个特殊的消息类型,它是对其他类型消息的确认,它的消息ID与其要确认的消息的ID相同。 如一个消息的消息ID为0x9527,那对应的确认消息的消息ID也应该是0x9527。

# 术语

# 唤醒

用户通过指定唤醒词的语音信号可以唤醒模块,也可设置模块开机自动唤醒。模块唤醒会上报唤醒信息,该信息包括唤醒角度、唤醒得分、所属波束、唤醒词等。模块唤醒前处于待机状态,无音频输出。模块唤醒后开始进入正常运行状态,输出音频。

# 波束

本文中的波束是指模块通过阵列麦克风的不同拾音差异,通过算法滤波输出的某个特定方向音频,该音频拾取指定角度范围内的声源,抑制其它角度声源的影响。

本模块有三种配套麦克风阵列。对应波束号与角度关系如下:

1、 环形六麦波束

2、 线性四麦波束

3、线性六麦波束

注: 波束指向方向仅为拾音方向, 并不会影响和改变唤醒时的角度等任何信息。

# 协议内容

# 主控消息

主控消息是上位机发送给R818降噪模块的消息,格式为JSON。 主控消息根据内部字段type的不同,控制R818降噪模块的不同功能。

  1. 唤醒词更换(浅定制)

    type为wakeup_keywords

    {
        "type": "wakeup_keywords",
        "content": {
            "keyword": "xiao3 fei1 xiao3 fei1",  // 唤醒词
        "threshold": "900",  // 阈值
        }
    }
    

    PS:如需深定制,则通过更新固件方式加载

  2. 手动唤醒

    type为 manual_wakeup

    {
        "type": "manual_wakeup",
        "content": {
            "beam": 1   //波束序号,见第三章波束说明
        }
    }
    

    PS:如需实现固定波束功能,则在每次设备唤醒后发送手动唤醒指令

  3. 麦克风阵列切换

    type为 switch_mic

    {
        "type": "switch_mic",
        "content": {
            "mic": "mic4"  // 麦克风阵列类型
        }
    }
    

    mic:麦克风阵列类型,mic4:线性4麦,mic6:线性6麦, mic6_circle:环形6麦

  4. 配置更改

    type为 setting, 该操作有风险,请熟知参数意义下执行

    {
        "type": "setting",
        "content": [{
            "group": "common", // ini文件中section
            "key": "debug", // ini文件中section下的key
            "value": "0", // key对应的value
        }]
    }
    
    

    具体有哪些可配,请参考 user_cfg.ini

  5. 获取版本信息

    type为 setting,

    {
        "type": "verison"
    }
    

# 设备消息

  1. 唤醒结果事件

    type为aiui_event,代表AIUI结果返回,总体结构示例:

    {
        "type": "aiui_event",
        "content": {
            "eventType":4,  // 事件类型 4 => 唤醒
            "arg1":0,       // 唤醒波束
            "arg2":0,       // 未启用
            "info":{},      // {"keyword":"xiao3 wei1 xiao3 wei1", .... } 唤醒信息
            "result":{}     //唤醒词
        }
    }
    

    eventType:事件类型,4-唤醒

    arg1:参数1,唤醒波束,具体取值参见3.2波束章节说明

    arg2:参数2,未启用,忽略

    info:唤醒结果,包括唤醒词和唤醒角度。如 {"keyword":"xiao3 wei1 xiao3 wei1", }