离线语音 I2C 协议(Zigbee)

更新时间:2022-03-02 02:05:43下载pdf

本文介绍了 Zigbee 模组的离线语音 I2C 协议。适用于使用涂鸦离线语音模组进行 MCU 开发的开发者。

通信约定

  • 通信速率:100kbit/s

  • 总线地址:0x64

  • 通信数据线:SCL、SDA

  • 数据中断脚:INT_PIN(引脚上拉,当语音模组需要主动发送数据给IoT模组,产生100ms的低电平告知IoT模组有数据需要发送)

  • 数据传输量:单条数据不能超过 256bytes

    离线语音 I2C 协议(Zigbee)

    Zigbee模组作为主机(primary),语音模组作为从机(secondary),主机主动查询从机的状态,从机收到指令后回应最新的状态信息给主机。

帧格式

字段 长度(byte) 说明
帧头 2 固定为0x55aa
版本 1 升级扩展用
命令字 1 具体帧类型
数据长度 2 大端
数据 N
校验和 1 从帧头开始按字节求和得出的结果对256求余
  • 所有大于1个字节的数据均采用大端模式传输。
  • 一般情况下,采用同命令字一发一收同步机制,即一方发出命令,另一方应答。

场景一

IoT模组主动发送命令,语音模组收到命令后立刻回复(50ms内)。

离线语音 I2C 协议(Zigbee)

场景二

语音模组想主动上报消息到IoT模组,需要如下步骤。

  1. 语音模组需要把INT管脚拉低100ms,产生一个100ms的低电平脉冲。
  2. IoT模组收到中断信号后使用0x88命令去查询数据语音模组状态的改变。
  3. 语音模组回复状态改变的信息。
  4. IoT模组回复语音模组收到了状态改变的信息。
    离线语音 I2C 协议(Zigbee)

协议详述

I2C通信命令如下表:

命令字 功能 说明
0x00 心跳检测 IoT模组每5s间隔发心跳给离线语音模组
0x03 IoT模组Zigbee网络状态 IoT模组发送Zigbee网络状态给到语音模组
0x05 重置 Zigbee-切换配网模式 可以指定IoT模组重置进入哪种配网模式
0x06 DP状态上报 离线语音模组上报DP控制给IoT模组。IoT收到后下将命令转发到MCU控制对应DP执行
0x07 DP状态下发 IoT模组同步DP点信息给到语音模组
0x2B 离线语音模组查询网络 离线语音模组主动查询IoT模组网络状态
0x65 语音设置 设置离线语音模组参数
0x66 语音识别文本上发 语音模组提供 Unicode 格式的语音识别文本给IoT模组
0x67 文本验证结果下发 IoT模组将平台验证的语音文本的结果,以Unicode格式告知语音模组
0x68 语音上报 语音模组参数主动上报

语音状态查询

  • Zigbee模组上电后,以5s的间隔定期发送命令字(0x88)查询语音模组的状态,如果语音模组状态有改变就会回复最新的状态信息给到Zigbee模组,如果没有状态改变则回复心跳信息(0x00)。若在超时时间(90s)内,未收到语音模组的任何回应,则认为与语音模组通信异常模组自动内部软件重启复位。
  • 上述为了减少交互的数据量设置查询间隔为5sec,可能会导致Zigbee模组接收语音命令的时延,为了解决这个问题,采用中断的方式,增加一个数据触发IO,当语音模组有新的状态改变时会触发这个IO为低电平,此时Zigbee模组检测到低电平之后立刻发送0x88查询命令去查询语音状态的信息,语音模组会根据状态字类型上传对应改变的信息到Zigbee模组。

Zigbee模组发送:

字段 长度(byte) 说明
帧头 2 0x55aa
版本 1 0x00
命令字 1 0x88
数据长度 2 0x0000
数据 0
校验和 1 从帧头开始按字节求和得出的结果对256求余

例:0x55aa 00 88 0000 ff

语音模组会根据当前是否有状态改变来决定发送什么数据。譬如当前有用户语音要求重置配网,那么语音模组就会发送0x05命令字,如果是修改了音量大小,那么就会发送0x09命令字。如果当前语音模组状态没有改变,那么就发送0x00心跳命令字作为心跳给到Zigbee模组作为回复。

心跳检测

IoT模组上电后,以5s的间隔定期发送心跳,若在超时时间(90s)内,未收到语音模组的任何回应,则认为与语音模组通信异常模组自动内部软件重启复位。

语音模组返回:

字段 长度(byte) 说明
帧头 2 0x55aa
版本 1 0x03
命令字 1 0x00
数据长度 2 0x0001
数据 1 0x00:语音模组重启后第一次心跳返回值,仅发送一次,用于模组判断工作过程中MCU是否重启 0x01:除语音模组重启后第一次返回0外,其余均返回此值
校验和 1 从帧头开始按字节求和得出的结果对256求余

例:0x55aa 03 00 0001 00 03 (语音模组第一次返回)
0x55aa 03 00 0001 01 04 (除第一次外,正常返回)

回复语音模组接收到了心跳命令。

Zigbee模组发送:

字段 长度(byte) 说明
帧头 2 0x55aa
版本 1 0x00
命令字 1 0x00
数据长度 2 0x0000
数据 0
校验和 1 从帧头开始按字节求和得出的结果对256求余

例:0x55aa 00 00 0000 03

选择配置模式(Zigbee)

此帧提供MCU根据自身需求选择性选择重置Zigbee后的配置方式。

语音模组返回:

字段 长度(byte) 说明
帧头 2 0x55aa
版本 1 0x03
命令字 1 0x05
数据长度 2 0x0001
数据 1 0x00:复位 0x01:配网
校验和 1 从帧头开始按字节求和得出的结果对256求余

例:0x55aa 03 05 0001 01 09 语音模组让Zigbee进入配网模式

回复语音模组接收到了重置Zigbee-选择配置模式命令。

Zigbee模组发送:

字段 长度(byte) 说明
帧头 2 0x55aa
版本 1 0x00
命令字 1 0x05
数据长度 2 0x0000
数据 0
校验和 1 从帧头开始按字节求和得出的结果对256求余

例:0x55aa 00 05 0000 03

DP控制上报

datapoint命令/状态数据单元如下所示:

数据段 长度(byte) 说明
dpid 1 datapoint序号
type 1 对应开放平台上某datapoint具体的数据类型,通过如下“表示值”标识
类型 表示值 长度(字节) 说明
raw 0x00 N 对应于raw型datapoint(模组透传)
bool 0x01 1 value范围:0x00/0x01
value 0x02 4 对应int类型,大端表示
string 0x03 N 对应于具体字符串
enum 0x04 1 枚举类型,范围0-255
bitmap 0x05 1/2/4 长度大于1字节时,大端表示
len 2 长度对应value的字节数
value 1/2/4/N hex表示,大于1字节采用大端传输
  • datapoint命令/状态数据单元除”raw”类型外,其他类型均属于“obj”型datapoint
  • “DP命令上报”可含多个datapoint“命令数据单元”
  • “DP命令上报”为异步处理协议,对应于Zigbee模组的datapoint“状态更新下发”
  • “状态上报”可含多个datapoint“命令数据单元”
  • 语音模组根据用户输入的语音转化为相应的DP功能点传给Zigbee模组,譬如用户语音输入设置湿度30℃,湿度的对应的DP点是5,湿度是指的值为30(0x1e)。

语音模组发送:

字段 长度(byte) 说明
帧头 2 0x55aa
版本 1 0x03
命令字 1 0x06
数据长度 2 取决于“状态数据单元”类型以及个数
数据 N “dp状态数据单元”组
校验和 1 从帧头开始按字节求和得出的结果对256求余

例:湿度对应5号DP,使用valve型变量,湿度为30℃
0x55aa 03 06 0008 05 02 0004 0000001e 3a

回复语音模组接收到了DP点控制上报命令。

Zigbee模组发送:

字段 长度(byte) 说明
帧头 2 0x55aa
版本 1 0x00
命令字 1 0x06
数据长度 2 0x0000
数据 0
校验和 1 从帧头开始按字节求和得出的结果对256求余

例:0x55aa 00 06 0000 03

语音模组主动查询网络状态

语音模组通过命令字(0x2B)主动查询Zigbee模组的网络状态,Zigbee模组通过0x2B命令字告知语音模组网络状态。

MCU发送:

字段 长度(byte) 说明
帧头 2 0x55aa
版本 1 0x03
命令字 1 0x2B
数据长度 2 0x0000
数据 0
校验和 1 从帧头开始按字节求和得出的结果对256求余

例:0x55aa 03 2B 0000 05

Zigbee模组回复设备网络状态表。

设备联网状态 描述 状态值
状态1 未配网 0x00
状态2 配网中 0x03
状态3 在网(配网成功之后一直处于在网状态) 0x01

Zigbee模组返回:

字段 长度(byte) 说明
帧头 2 0x55aa
版本 1 0x00
命令字 1 0x2B
数据长度 2 0x0001
数据 1 Zigbee模组回复设备网络状态表。
校验和 1 从帧头开始按字节求和得出的结果对256求余

例:0x55aa 00 2B 0001 02 01,IoT模组以连接到 IoT 云端

IoT模组更新设备联网状态到语音模组

设备联网状态 描述 状态值
状态1 未配网 0x00
状态2 配网中 0x03
状态3 在网(配网成功之后一直处于在网状态) 0x01

说明:Zigbee模组初始状态为未配网,当语音模组向Zigbee模组发送配置指令后,发出配网中的状态通知,然后Zigbee模组开启配网,配网超时时间为3分钟,在3分钟内配网成功,则上报在网状态,超时则上报未配网。

模组发送:

字段 长度(byte) 说明
帧头 2 0x55aa
版本 1 0x00
命令字 1 0x03
数据长度 2 0x0001
数据 1 参见上表
校验和 1 从帧头开始按字节求和得出的结果对256求余

例:0x55aa 00 03 0001 00 03

语音模组返回:

字段 长度(byte) 说明
帧头 2 0x55aa
版本 1 0x03
命令字 1 0x03
数据长度 2 0x0000
数据 0
校验和 1 从帧头开始按字节求和得出的结果对256求余

例:0x55aa 03 03 0000 09,回复联网状态命令

语音文本上报

  • 文本采用字符的格式,例如:我回家了,文本信息即为“我回家了”,语音模组直接将这些数据传过来。
  • 语音文本信息通过0x66命令字发送给Zigbee模组,Zigbee模组收到后先直接回复0x66命令告知语音模组已经收到该指令。之后立即将文本信息通过501协议上传到平台验证文本的有效性,接收到平台的回复之后Zigbee模组通过0x67命令字告知语音模组文本信息验证的结果。

语音模组发送:

字段 长度(byte) 说明
帧头 2 0x55aa
版本 1 0x03
命令字 1 0x66
数据长度 2 0x0012
数据 2 语音文本ID,语音模组可通过ID对应唯一的场景命令,例如:“回家模式”对应的ID为00 01
2 国家码,用来标识下面字符是哪个国家的语言,例如中国“CN”,美国“US”
N 总数据长度不超过256bytes 例如: 中文:“回家场景” 英文:“good night mode”
校验和 1 从帧头开始按字节求和得出的结果对256求余

国家码标准,请参考 OEM App 账号所在数据分区参考 中的信息。

例:回家场景,ID为00 01

55 aa 03 66 00 10 00 01 43 4e e5 9b 9e e5 ae b6 e5 9c ba e6 99 af 44

Zigbee接受到语音模组的文本信息之后,上发到平台进行场景认证是否有效。

Zigbee模组返回:

字段 长度(byte) 说明
帧头 2 0x55aa
版本 1 0x03
命令字 1 0x66
数据长度 2 0x0000
数据 N
校验和 1 从帧头开始按字节求和得出的结果对256求余

例:55 aa 00 66 00 00 65

平台语音文本(场景)验证结果下发

Zigbee模组发送:

字段 长度(byte) 说明
帧头 2 0x55aa
版本 1 0x03
命令字 1 0x67
数据长度 2 0x0013
1 场景平台验证的结果: 01:验证成功 00:验证失败 02:网络异常
2 语音场景ID,对应唯一的场景,例如“回家场景”对应ID为00 01
数据 N 数据限制总数据长度不超过256bytes: 例如: 中文:“回家场景” 英文:“good night mode”
校验和 1 从帧头开始按字节求和得出的结果对256求余

例:返回以下“回家场景”验证结果,代表“回家场景”平台验证成功。

55 aa 00 67 00 0F 01 00 01 e5 9b 9e e5 ae b6 e5 9c ba e6 99 af 2f

语音模组返回:

字段 长度(byte) 说明
帧头 2 0x55aa
版本 1 0x00
命令字 1 0x67
数据长度 2 0x0000
数据 N
校验和 1 从帧头开始按字节求和得出的结果对256求余

例:55 aa 03 67 00 00 69

语音参数设置、查询与上报

  • 扩展语音模组的相关系统功能:增加“播放/暂停、蓝牙开/关、本地闹钟、语音控制组合”功能的状态通知和设置
  • “播放/暂停”功能:音乐、古诗、笑话等功能的播放与暂停功能;
  • “蓝牙开/关”功能:蓝牙音箱的蓝牙开关;
  • “本地闹钟”功能:语音和APP设置的闹钟数据同步通知;
  • “语音控制组合”功能:“上一首”“下一首”等语音控制指令的通知;
  • “mic开/关”功能:打开和关闭麦克风开关、mic状态改变主动上报
  • “音量设置”功能:设置语音模组音量、以及音量改变主动上报

Zigbee发送:

字段 长度(byte) 说明
帧头 2 0x55aa
版本 1 0x03
命令字 1 0x65
数据长度 2 xx
数据 N 取决于“状态数据单元”类型以及个数
校验和 1 从帧头开始按字节求和得出的结果对256求余

语音模组返回:

字段 长度(byte) 说明
帧头 2 0x55aa
版本 1 0x00
命令字 1 0x65
数据长度 2 xx
数据 N 取决于“状态数据单元”类型以及个数
校验和 1 从帧头开始按字节求和得出的结果对256求余

状态通知,语音模组主动上报参数状态:

语音模组发送:

字段 长度(byte) 说明
帧头 2 0x55aa
版本 1 0x00
命令字 1 0x68
数据长度 2 N
数据 1 取决于“状态数据单元”类型以及个数
校验和 1 从帧头开始按字节求和得出的结果对256求余

Zigbee模组返回:

字段 长度(byte) 说明
帧头 2 0x55aa
版本 1 0x03
命令字 1 0x68
数据长度 2 2
数据 1 操作结果: 0x00: 成功 0x01: 失败
校验和 1 从帧头开始按字节求和得出的结果对256求余

DP数据同步到语音模组

  • “状态上报”可含多个datapoint“命令数据单元”。
  • Zigbee模组更新mcu状态信息到语音模组,譬如mcu湿度为30℃,湿度的对应的DP点是5,湿度是指的值为30(0x1e)。
  • 当mcu有DP变化,且通知到Zigbee模组时,Zigbee模组会将该数据通知到语音模组。

Zigbee模组发送:

字段 长度(byte) 说明
帧头 2 0x55aa
版本 1 0x03
命令字 1 0x07
数据长度 2 取决于“状态数据单元”类型以及个数
数据 N “dp状态数据单元”组
校验和 1 从帧头开始按字节求和得出的结果对256求余

例:湿度对应5号DP,使用valve型变量,湿度为30℃

0x55aa 03 07 0008 05 02 0004 0000001e 3a

语音模组返回:

字段 长度(byte) 说明
帧头 2 0x55aa
版本 1 0x00
命令字 1 0x07
数据长度 2 0x0000
数据 0
校验和 1 从帧头开始按字节求和得出的结果对256求余

例:返回静音状态值

55 aa 00 07 00 00 61