WBRL 方案猫眼协议

更新时间:2024-02-06 06:42:17下载pdf

本文描述 猫眼与 WBRL 模组 之间音视频传输的通信协议及交互流程,有助于猫眼方案商或开发者更好地理解涂鸦设计的猫眼对接方案与协议,提高对接效率与质量。

硬件说明

硬件连接

WBRL 模组模组与猫眼硬件连接如下图所示:

WBRL 方案猫眼协议

引脚介绍

类型 引脚 引脚说明
SPI 引脚 PA28 片选脚
PA30 时钟脚,主机驱动,从机用其进行数据发送与接收
PA25 主机发送数据,从机接收数据
PA26 主机接收数据,从机发送数据
特殊引脚 PA12 唤醒脚,平时为低电平。如果需要唤醒猫眼的时候,会拉高电平并持续 250ms,然后拉低电平。猫眼检测到该引脚变化并持续 250ms 为高电平的时候,需要唤醒。
说明:猫眼唤醒不能只检测到一个上升沿就唤醒,因为如果 WBRL 模组重启,io_wakeup 会抖动,这样会误唤醒猫眼。
PB21 数据请求脚。平时为低电平,WBRL 模组准备好接收数据时,会拉一下高电平然后再拉低,主机检测到该引脚上升沿变化时才能发送数据。
PB20 时钟请求脚。平时为低电平,WBRL 模组有数据要发送时,会拉一下高电平然后再拉低,主机检测到该引脚上升沿变化时需要产生时钟,WBRL 模组会在该时钟上发送数据。

SPI 参数

时钟频率 时钟模式 数据传输 cs 片选信号 数据宽度 主从设置
最高频率可支持 25M(建议使用 8M) MODE0:模式 0
[CPOL=0,CPHA=0]
MSB 低电平有效 8 位 猫眼为主机,模组为从机

其它说明

为了方便后续功能迭代升级,猫眼板在前期硬件规划上,例如 IO 资源丰富的话可预留 1-2 个 IO。

交互流程

交互流程图

WBRL 模组猫眼拉高 io_wakeup,250ms,最多尝试 3 次拉高 io_data等待 0x63 指令,超时 100ms发送 0x63 指令拉高 io_clock等待 SPI 时钟,超时 100ms输出 SPI 时钟回复 0x63 指令opt[唤醒流程]拉高 io_data等待 0x61 指令,超时 100ms发送 0x61 指令opt[发送音视频流程]拉高 io_clock等待 SPI 时钟,超时 100ms输出 SPI 时钟发送 0x6F 指令拉高 io_data等待 0x6F 应答回复 0x6F休眠休眠opt[结束流程]WBRL 模组猫眼

数据长度

WBRL 模组与猫眼之间采用定长数据通信,长度大小为 3872 个字节。如果通讯过程中数据包长度小于 3872 字节,则在数据包有效数据后补 0。

唤醒

  1. WBRL 模组唤醒猫眼时,会拉高 PA12 并持续 500ms,然后拉低电平。猫眼检测到该引脚变化并持续 500ms 为高电平的时候,需要唤醒。WBRL 模组唤醒操作最多持续 3 次。

  2. 由于 WBRL 模组作为从机,猫眼作为主机,所以猫眼并不知道 WBRL 模组是否准备好读写数据。为了防止时序错乱,在数据交互过程中,需要等到 PB21 或 PB20 的电平变化才能发送数据或者时钟。

    WBRL 模组并不知道猫眼是否被唤醒,所以需要猫眼被唤醒之后,第一条指令发送 0x63,告诉 WBRL 模组猫眼已经被唤醒。

  3. 猫眼唤醒时发送完 0x63 指令之后,如果超时未收到 WBRL 模组发送的 clock 引脚变化,则 WBRL 模组每拉一次 PB21,猫眼发送一次 0x63,以确保 WBRL 模组收到 0x63 指令。

图片/视频/音频上传

  1. WBRL 模组收到 0x63 指令后会回复(拉高 PB20)猫眼需要传图或传视频,且会回复当前 WBRL 模组的状态是处于未就绪还是已经就绪状态。
  2. 猫眼根据 0x63 的回复包,进行对应操作:
    • 未就绪:猫眼继续发送 0x63 指令,查询 WBRL 模组的就绪状态,直到收到 WBRL 模组的状态为已就绪。
    • 已就绪:WBRL 模组建流成功。
    • 操作失败:停止传输和查询,猫眼主动进入休眠。
  3. 猫眼收到 WBRL 模组的状态为已就绪之后,下一次 PB21 被拉高之后,猫眼发送 0x61 指令,将图片或者视频数据发送给 WBRL 模组。在这期间,WBRL 模组每拉一次 PB21,猫眼发送一包数据,但是不能主动发送数据。
  4. 传图/传视频流程结束之后,WBRL 模组会拉高 PB20,发送 0x6F 指令,通知猫眼流程结束。猫眼收到之后,无需回复 WBRL 模组,直接进入休眠状态。

音频下发

  1. 音频下发是由 App 下发音频至设备,由设备播放,实现双向对讲的功能。
  2. WBRL 模组在建流成功后,有音频下发时会拉高 PB20,发送 0x68 指令给猫眼。在此期间,WBRL 模组每拉一次 PB20,猫眼输出一次时钟。

二维码配网

  1. 猫眼唤醒之后发送第一条 0x63 指令。
  2. WBRL 模组回复猫眼需要二维码信息来配网,等待 IO 引脚的变化。
  3. 猫眼收到 PB21 引脚电平拉高之后,通过 0x6A 指令发送二维码信息,无需等待 WBRL 模组回复。
  4. WBRL 模组收到二维码信息之后,拉高 PB20 引脚,发送 0x6F 指令,通知猫眼流程结束。猫眼收到之后,无需回复 WBRL 模组,直接进入休眠状态。

交互协议

查询产品信息 0x01(可选)

猫眼发送:

字段 长度(byte) 说明
帧头 2 0x55aa
版本 1 0x00
命令字 1 0x01
数据长度 2 N
数据 N 产品信息字段说明,{“p”:”vHXEcqntLpkAlOsy”}
校验和 1 从帧头开始按字节求和得出的结果对 256 求余

模组回复:

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

获取 PID

锁板WBRL 模组猫眼上电上电拉高 PA12(唤醒脚)拉高 PB21(数据脚)发送 0x63 指令拉高 PB20(时钟脚)输出 SPI 时钟回复 0x63 指令(状态:02 类型:04)拉高 PB21(数据脚)0x01 指令0x01 指令 ACKopt[获取 PID]开启配网拉高 PB21(数据脚)发送 0x63 指令拉高 PB20(时钟脚)输出 SPI 时钟回复 0x63 指令(状态:02 类型:03)拉高 PB21(数据脚)0x6A 指令拉高 PB20(时钟脚)输出 SPI 时钟0x6A 指令 ACK联网连云opt[二维码配网]回复联网状态锁板WBRL 模组猫眼

开启发送 0x63

猫眼只支持图片和视频

猫眼发送:

字段 长度(byte) 说明
帧头 2 0x55aa
版本 1 0x00
命令字 1 0x63
数据长度 2 0x0006
获取时间类型 1
  • 0x00:本地时间
  • 0x01:格林时间
视频分辨率(图片默认填 0) 1
  • 0x00:320 × 240
  • 0x01:640 × 480
  • 0x02:1280 × 720
  • 0x03:1920 × 1080
  • 0x04:2304 × 1296
视频类型(图片默认填 0) 1
  • 0x00:MPEG4(暂不支持)
  • 0x01:H263(暂不支持)
  • 0x02:H264
  • 0x03:MJPEG
  • 0x04:H265
视频帧率(图片默认填 0) 1 根据猫眼实际帧率填写,目前支持 10~20 帧/秒分辨率
视频码率(图片默认填 0) 2 仅支持以下参数:
  • 64:64K
  • 128:128K
  • 256:256K
  • 512:512K
  • 768:768K
  • 1024:1M
  • 1536:1.5M
  • 2048:2M
校验和 1 从帧头开始按字节求和得出的结果对 256 求余

猫眼支持图片视频音频

猫眼发送:

字段 长度(byte) 说明
帧头 2 0x55aa
版本 1 0x00
命令字 1 0x63
数据长度 2 0x0010
获取时间类型 1
  • 0x00:本地时间
  • 0x01:格林时间
视频分辨率 (图片默认填 0) 1
  • 0x00:320 × 240
  • 0x01:640 × 480
  • 0x02:1280 × 720
  • 0x03:1920 × 1080
  • 0x04:2304 × 1296
视频类型 (图片默认填 0) 1
  • 0x00:MPEG4(暂不支持)
  • 0x01:H263(暂不支持)
  • 0x02:H264
  • 0x03:MJPEG
  • 0x04:H265
视频帧率 (图片默认填 0) 1 根据猫眼实际帧率填写,目前支持 10~20 帧/秒分辨率
视频码率 (图片默认填 0) 2 仅支持以下参数:
  • 64:64K
  • 128:128K
  • 256:256K
  • 512:512K
  • 768:768K
  • 1024:1M
  • 1536:1.5M
  • 2048:2M
音频类型 1
  • 0x65(101):PCM(暂不支持)
  • 0x6A(106):G711A
音频帧率 1 根据猫眼实际帧率填写,目前 10~20 帧
音频采样率 4
  • 8000:8K
  • 11000:11K
  • 12000:12K
  • 16000:16K
  • 22000:22K
  • 24000:24K
  • 32000:32K
  • 44000:44K
  • 48000:48K
音频位深度 1
  • 0x08:8 bits
  • 0x10:16 bits
音频通道 1 默认填 0(暂未使用到)
旋转角度 1
  • 0x00:默认填 0
  • 0x01:0°
  • 0x02:90°
  • 0x03:180°
  • 0x04:270°
天气定时时长 1
  • bit7:0:关闭天气定时,1:使能
  • bit0-3:定时时长,单位为小时
  • bit4-6:保留
校验和 1 从帧头开始按字节求和得出的结果对 256 求余

WBRL 模组回复

字段 长度(byte) 说明
帧头 2 0x55aa
版本 1 0x00
命令字 1 0x63
数据长度 2 0x000e
当前状态 1
  • 0x00:未就绪
  • 0x01:联网中
  • 0x02:就绪(接收该状态后才可通过 0x61 发送数据)
  • 0x03:数据上传中
  • 0x04:操作失败(停止传输和查询)
  • 0x05:数据过大
  • 0x06:厂测模式
事件类型 1
  • 0x01:抓拍图片
  • 0x02:开启实时视频
  • 0x03:二维码信息获取通知
  • 0x04:PID 信息获取通知
  • 0x07:获取天气
分包大小 4 图像数据发送单包最大字节数,超过则进行分包处理
时间数据 8 数据长度为 8 字节:
  • Data[0] 为是否获取时间成功标志,取值为 0 表示失败,为 1 表示成功
  • Data[1] 为年份,0x00 表示 2000 年
  • Data[2] 为月份,从 1 开始到 12 结束
  • Data[3] 为日期,从 1 开始到 31 结束
  • Data[4] 为时钟,从 0 开始到 23 结束
  • Data[5] 为分钟,从 0 开始到 59 结束
  • Data[6] 为秒钟,从 0 开始到 59 结束
  • Data[7] 从 1 开始到 7 结束,1 代表星期一(若获取时间为格林时间,则星期无效)
校验和 1 从帧头开始按字节求和得出的结果对 256 求余

音视频数据上传 0x61

猫眼发送:

字段 长度(byte) 说明
帧头 2 0x55aa
版本 1 0x00
命令字 1 0x61
数据长度 2 N+5
图片序号 2 默认为 0,多张图片传输时,每次触发传输后从 0 开始递增,传输结束后清零
分片标志 1
  • 0:不分包
  • 1:分包开始
  • 2:分包内容
  • 3:分包结束
分片序号 1 0 开始,依次递增
帧格式 1
  • 0x00:P/B 帧
  • 0x01:I 帧/mjpeg
  • 0x03:音频帧
数据 N 数据
校验和 1 从帧头开始按字节求和得出的结果对 256 求余

音频数据下发 0x68

模组发送:

字段 长度(byte) 说明
帧头 2 0x55aa
版本 1 0x00
命令字 1 0x68
数据长度 2 N + 9
音频类型 1
  • 0x00:G711.A
  • 0x01:PCM(暂不支持)
预留字段 8 必须填 0
数据 N 音频数据
校验和 1 从帧头开始按字节求和得出的结果对 256 求余

结束命令 0x6F

当整个音视频流程结束时,模组会通过 0x6F 指令通知猫眼可以进入休眠状态,以便节省功耗。

模组发送:

字段 长度(byte) 说明
帧头 2 0x55aa
版本 1 0x00
命令字 1 0x6F
数据长度 2 0x0001
状态 1 0x00:推流结束,猫眼进行休眠
校验和 1 从帧头开始按字节求和得出的结果对 256 求余

猫眼回复:

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

二维码配网协议 0x6A

猫眼发送:

字段 长度(byte) 说明
帧头 2 0x55aa
版本 1 0x00
命令字 1 0x6A
数据长度 2 N
数据 N {"p":"12345678","s":"ydc","t":"AZJ5zpswTfpr_0"}
校验和 1 从帧头开始按字节求和得出的结果对 256 求余

模块回复:

字段 长度(byte) 说明
帧头 2 0x55aa
版本 1 0x00
命令字 1 0x6A
数据长度 2 0x0001
数据 1
  • 0x00:信息获取成功
  • 0x01:信息获取失败
  • 0x02:连上路由器
校验和 1 从帧头开始按字节求和得出的结果对 256 求余

厂测指令 0x6E

模组发送:

字段 长度(byte) 说明
帧头 2 0x55aa
版本 1 0x00
命令字 1 0x6E
数据长度 2 4 + N
子命令 1 0x00 预留
wifi 扫描结果 1
  • 0x00:扫描成功
  • 0x01:扫描失败
rssi 1 扫描到的路由器信号强度百分比,0-100
固件版本号长度 1 描述固件版本号所占用字节数
固件版本号 N 子符串,不固定长度,例如 1.0.0
校验和 1 从帧头开始按字节求和得出的结果对 256 求余

猫眼回复:

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

厂测流程图

  1. 猫眼厂测是由锁板发送串口指令 0xF0 触发。
  2. 模组收到 0xF0 后,进行模组相关厂测,唤醒猫眼,并通过 SPI 发送 0x63 指令回复猫眼需要进入厂测。
  3. 猫眼接收到 0x63 进入厂测指令后,自行进行猫眼相关厂测。
  4. 模组完成模组相关厂测内容,通过 SPI 指令 0x6e 通知猫眼厂测结果,由猫眼进行相关显示。例如,模组程序版本和 Wi-Fi 信号强度等。模组完成厂测后,自行进入深度休眠,以便观察整机功耗。
锁板WBRL 模组猫眼0xF0 指令模组唤醒拉高 PA12(唤醒脚)猫眼唤醒发送 0x63 指令回复 0x63 指令(状态:06)猫眼自行厂测0x6E 指令(模组厂测结果)0x6E 指令 ACK0xF0 厂测结果深度休眠锁板WBRL 模组猫眼

获取天气服务 0x85

  1. 猫眼通过 0x85 指令查询对应天气。
  2. 模组收到后,先回复查询参数是否正确,具体的天气内容通过 0x86 指令回复猫眼。

猫眼发送:

字段 长度(byte) 说明
帧头 2 0x55aa
版本 1 0x00
命令字 1 0x85
数据长度 2 0x0005
获取天气类型 4 按位,见 附录二
预报天数 1 预报天数 7 天内(1 ≤ n ≤ 7)
校验和 1 从帧头开始按字节求和得出的结果对 256 求余

模组回复:

字段 长度(byte) 说明
帧头 2 0x55aa
版本 1 0x00
命令字 1 0x85
数据长度 2 0x0001
数据 1
  • 0x00:查询参数正确
  • 0x01:查询参数错误
校验和 1 从帧头开始按字节求和得出的结果对 256 求余

发送天气 0x86

模组发送:

字段 长度(byte) 说明
帧头 2 0x55aa
版本 1 0x00
命令字 1 0x86
数据长度 2 N(KDTLD+KDTLD+…)
数据 N 采用 KDTLD 类型回复。
校验和 1 从帧头开始按字节求和得出的结果对 256 求余

字段说明

  • K:参数名称,4 字节,见 附录一
  • D:天数,1 字节,表示第几天
  • T:参数类型,1 字节
  • L:参数长度,2 字节,1 个 KDTLD 的长度
  • D:具体数据

视频模式切换 0x88

该指令用于 App 与猫眼之间切换摄像头,切图见 附录五

模组发送:

字段 长度(byte) 说明
帧头 2 0x55aa
版本 1 0x00
命令字 1 0x88
数据长度 2 N
数据 N data[0]:0x00-0xFF
  • 0x00:默认主框
  • 0x01-0xFE:表示画框编号
  • 0xFF:表示面板查询
校验和 1 从帧头开始按字节求和得出的结果对 256 求余

猫眼回复:

字段 长度(byte) 说明
帧头 2 0x55aa
版本 1 0x00
命令字 1 0x88
数据长度 2 N
数据 N
  • data[0]:状态
    • 0x00:成功
    • 0x01:失败
  • data[1~N-1]:全量数据
    • 带文案,成功或失败时:数据 1、数据 2、……、数据 n 数据格式定义,详见下方
    • 不带文案,固定 2 字节:0xFFFF
校验和 1 从帧头开始按字节求和得出的结果对 256 求余

字段说明

在做画面切换时,单击对应的子框,可理解为将其与当前主框画面对调,所以 RN 面板和小程序下发的数据为子框编号。

如果无需支持文案显示,设备回复时仅有状态字段 + 2 字节默认 FFFF 即可。否则需带上对应通道的位置类型信息。

全量数据 格式支持 N 个通道组合,格式定义如下:

主框信息
(1+1 字节)
子框 1 信息
(1+1 字节)
子框-n 信息
(1+1 字节)
ID + 位置类型 ID + 位置类型 ID + 位置类型

位置类型代号 定义如下:

  • 0x01:主
  • 0x02:辅
  • 0x03:前
  • 0x04:后
  • 0x05:上
  • 0x06:下
  • 0x07:左
  • 0x08:右

附录

附录一:天气参数对照表

参数名称 编码 类型 是否支持预报
温度(temperature) 1 << 0 整数
最高温(high temperature) 1 << 1 整数
最低温(low temperature) 1 << 2 整数
湿度(humidity) 1 << 3 整数
天气情况(weather condition) 1 << 4 字符串,见 附录三
气压(pressure) 1 << 5 整数
温度实感(sensible temperature) 1 << 6 整数
紫外线指数(uvi) 1 << 7 整数
日出时间(sunrise) 1 << 8 字符串,数据格式为 2017-04-24 05:24
日落时间(sunset) 1 << 9 字符串,数据格式为 2017-04-24 18:32
风速(wind speed) 1 << 12 字符串(格式:0.9)
风向(wind direction) 1 << 13 字符串,见 附录四
风级(wind speed scale/level) 1 << 14 整数
空气质量指数(aqi) 1 << 15 整数
PM10(可吸入颗粒物)(pm10) 1 << 16 整数
PM2.5(细颗粒物)(pm2.5) 1 << 17 整数
臭氧浓度(o3) 1 << 18 整数
二氧化氮浓度(no2) 1 << 19 整数
一氧化碳浓度(co) 1 << 20 整数
二氧化硫浓度(so2) 1 << 21 整数

附录二:天气参数类型表

WKT_TEMP        = (1 << 0),     /**< temperature. */
WKT_THIHG       = (1 << 1),     /**< high temperature. */
WKT_TLOW        = (1 << 2),     /**< low temperature. */
WKT_HUMIDITY    = (1 << 3),     /**< humidity. */
WKT_CONDITIONNUM   = (1 << 4),     /**< weather condition. */
WKT_PRESSURE    = (1 << 5),     /**< pressure. */
WKT_REALFEEL    = (1 << 6),     /**< sensible temperature. */
WKT_UVI         = (1 << 7),     /**< uvi. */
WKT_SUNRISE     = (1 << 8),     /**< sunrise. */
WKT_SUNSET      = (1 << 9),     /**< sunset. */
WKT_UNIX        = (1 << 10),    /**< unix time, used with sunrise and sunset. */
WKT_LOCAL       = (1 << 11),    /**< local time, used with sunrise and sunset. */
WKT_WINDSPEED   = (1 << 12),    /**< wind speed. */
WKT_WINDDIR     = (1 << 13),    /**< wind direction. */
WKT_WINDLEVEL   = (1 << 14),    /**< wind speed scale/level. */
WKT_AQI         = (1 << 15),    /**< aqi. */
WKT_PM10        = (1 << 16),    /**< pm10. */
WKT_PM25        = (1 << 17),    /**< pm2.5. */
WKT_O3          = (1 << 18),    /**< o3. */
WKT_NO2         = (1 << 19),    /**< no2. */
WKT_CO          = (1 << 20),    /**< co. */
WKT_SO2         = (1 << 21),    /**< so2. */

附录三:天气状况

编码表示(ASCII 码) w.conditionNum 十六进制 天气状况
120 31 32 30
101 31 30 31 大雨
102 31 30 32 雷暴
103 31 30 33 沙尘暴
104 31 30 34 小雪
105 31 30 35
106 31 30 36 冻雾
107 31 30 37 暴雨
108 31 30 38 局部阵雨
109 31 30 39 浮尘
110 31 31 30 雷电
111 31 31 31 小阵雨
112 31 31 32
113 31 31 33 雨夹雪
114 31 31 34 尘卷风
115 31 31 35 冰粒
116 31 31 36 强沙尘暴
117 31 31 37 扬沙
118 31 31 38 小到中雨
119 31 31 39 大部晴朗
121 31 32 31
122 31 32 32 阵雨
123 31 32 33 强阵雨
124 31 32 34 大雪
125 31 32 35 特大暴雨
126 31 32 36 暴雪
127 31 32 37 冰雹
128 31 32 38 小到中雪
129 31 32 39 少云
130 31 33 30 小阵雪
131 31 33 31 中雪
132 31 33 32
133 31 33 33 冰针
134 31 33 34 大暴雨
136 31 33 36 雷阵雨伴有冰雹
137 31 33 37 冻雨
138 31 33 38 阵雪
139 31 33 39 小雨
140 31 34 30
141 31 34 31 中雨
142 31 34 32 多云
143 31 34 33 雷阵雨
144 31 34 34 中到大雨
145 31 34 35 大到暴雨
146 31 34 36 晴朗

附录四:风向简码编码表

风向简码(字符串) 十六进制 描述
N 4e
NNE 4e 4e 45 东北偏北
NE 4e 45 东北
ENE 45 4e 45 东北偏东
E 45
ESE 45 53 45 东南偏东
SE 53 45 东南
SSE 53 53 45 东南偏南
S 53
SSW 53 53 57 西南偏南
SW 53 57 西南
WSW 57 53 57 西南偏西
W 57 西
WNW 57 4e 57 西北偏西
NW 4e 57 西北
NNW 4e 4e 57 西北偏北

附录五:多摄切换图示

子框位置定义

后续涂鸦会提供对应配置(云能力),用于不同客户自定义显示位置。

显示框内不带文案

WBRL 方案猫眼协议

显示框内带文案显示

如对应框除镜头画面外,额外 叠加对应镜头安装位置信息,如下图小绿框所示。

WBRL 方案猫眼协议

按上图带文案显示的切换顺序,对应的全量数据如下表所示:

切换 主框-0 子框-1 子框-2 子框-3 对应全量数据(Hex 编码)
默认 0003 0104 0205 0306
第一次切换 0004 0103 0205 0306
第二次切换 0006 0103 0205 0304