Barrier 客户端协议
QEMU 的 input-barrier 设备实现键盘、视频、鼠标共享软件 Barrier 的客户端。
本文简述当前实现的协议。
消息格式
服务器与客户端的消息包含两部分:
载荷长度,网络字节序的 32 位整数
载荷
载荷以不含 NUL 的 4 字节命令字符串开始。双方首个命令 Barrier 是唯一不采用 4 字节编码的命令。其余载荷按命令类型解码。
协议说明
定义来自 barrier/src/lib/barrier/protocol_types.h。
barrierCmdHello "Barrier"
- 方向:
服务器到客户端
- 参数:
{ int16_t minor, int16_t major }- 说明:
向客户端问候。
minor= 服务器支持的协议主版本号major= 服务器支持的协议次版本号
barrierCmdHelloBack "Barrier"
- 方向:
客户端到服务器
- 参数:
{ int16_t minor, int16_t major, char *name}- 说明:
回应服务器问候。
minor= 客户端支持的协议主版本号major= 客户端支持的协议次版本号name= 客户端名称
barrierCmdDInfo "DINF"
- 方向:
客户端到服务器
- 参数:
{ int16_t x_origin, int16_t y_origin, int16_t width, int16_t height, int16_t x, int16_t y}- 说明:
客户端屏幕必须用此消息回复 barrierCmdQInfo,分辨率变化时也必须发送。 此时收到 barrierCmdCInfoAck 前,应忽略 barrierCmdDMouseMove, 避免鼠标移动到新屏幕范围之外。
barrierCmdCNoop "CNOP"
- 方向:
客户端到服务器
- 参数:
无。
- 说明:
无操作。
barrierCmdCClose "CBYE"
- 方向:
服务器到客户端
- 参数:
无。
- 说明:
关闭连接。
barrierCmdCEnter "CINN"
- 方向:
服务器到客户端
- 参数:
{ int16_t x, int16_t y, int32_t seq, int16_t modifier }- 说明:
进入屏幕。
x,y= 进入屏幕的绝对坐标seq= 序列号,用于排列屏幕间消息。副屏必须在部分消息中返回此编号modifier= 修饰键掩码,进入屏幕时激活的每个切换修饰键都设置相应位。 副屏应调整自身切换状态以匹配
barrierCmdCLeave "COUT"
- 方向:
服务器到客户端
- 参数:
无。
- 说明:
离开屏幕。副屏应发送它已获取、且自上次离开以来新获取或已改变的剪贴板数据。 已获取指曾发送 barrierCmdCClipboard,且未收到更大序列号的同类消息。
barrierCmdCClipboard "CCLP"
- 方向:
服务器到客户端
- 参数:
{ int8_t id, int32_t seq }- 说明:
获取剪贴板。屏幕上的其他应用取得剪贴板时,由该屏幕发送。
id= 剪贴板标识seq= 序列号。客户端使用最近 barrierCmdCEnter 传入的值,服务器始终发送 0。
barrierCmdCScreenSaver "CSEC"
- 方向:
服务器到客户端
- 参数:
{ int8_t started }- 说明:
屏幕保护状态变化。
started= 主屏屏保已启动(1)或关闭(0)
barrierCmdCResetOptions "CROP"
- 方向:
服务器到客户端
- 参数:
无。
- 说明:
重置选项,客户端应恢复所有默认值。
barrierCmdCInfoAck "CIAK"
- 方向:
服务器到客户端
- 参数:
无。
- 说明:
确认分辨率变化。服务器回复客户端的 barrierCmdDInfo。 每条 DInfo 都必须回复,无论此前是否发送过 barrierCmdQInfo。
barrierCmdCKeepAlive "CALV"
- 方向:
服务器到客户端
- 参数:
无。
- 说明:
连接保活。服务器定期发送以确认连接仍有效,客户端必须同样回复。 发送错误或合理时间内未收到回复时,服务器断开客户端。 客户端若不再定期收到此消息或任何消息,也应断开。间隔由选项定义。
barrierCmdDKeyDown "DKDN"
- 方向:
服务器到客户端
- 参数:
{ int16_t keyid, int16_t modifier [,int16_t button] }- 说明:
按键按下。
keyid= X11 键 IDmodified= 修饰键掩码button= X11 Xkb 键码,可选
barrierCmdDKeyRepeat "DKRP"
- 方向:
服务器到客户端
- 参数:
{ int16_t keyid, int16_t modifier, int16_t repeat [,int16_t button] }- 说明:
按键自动重复。
keyid= X11 键 IDmodified= 修饰键掩码repeat= 重复次数button= X11 Xkb 键码,可选
barrierCmdDKeyUp "DKUP"
- 方向:
服务器到客户端
- 参数:
{ int16_t keyid, int16_t modifier [,int16_t button] }- 说明:
按键释放。
keyid= X11 键 IDmodified= 修饰键掩码button= X11 Xkb 键码,可选
barrierCmdDMouseDown "DMDN"
- 方向:
服务器到客户端
- 参数:
{ int8_t button }- 说明:
鼠标按钮按下。
button= 按钮 ID
barrierCmdDMouseUp "DMUP"
- 方向:
服务器到客户端
- 参数:
{ int8_t button }- 说明:
鼠标按钮释放。
button= 按钮 ID
barrierCmdDMouseMove "DMMV"
- 方向:
服务器到客户端
- 参数:
{ int16_t x, int16_t y }- 说明:
鼠标绝对移动。
x,y= 屏幕绝对坐标
barrierCmdDMouseRelMove "DMRM"
- 方向:
服务器到客户端
- 参数:
{ int16_t x, int16_t y }- 说明:
鼠标相对移动。
x,y= 屏幕相对坐标
barrierCmdDMouseWheel "DMWM"
- 方向:
服务器到客户端
- 参数:
{ int16_t x , int16_t y }或{ int16_t y }- 说明:
鼠标滚动。向前(远离用户)或向右一格为 +120,向后(朝向用户)或向左为 -120。
x= x 增量y= y 增量
barrierCmdDClipboard "DCLP"
- 方向:
服务器到客户端
- 参数:
{ int8_t id, int32_t seq, int8_t mark, char *data }- 说明:
剪贴板数据。
id= 剪贴板 IDseq= 序列号。服务器发送时为 0;客户端使用最近 barrierCmdCEnter 的序列号。
barrierCmdDSetOptions "DSOP"
- 方向:
服务器到客户端
- 参数:
{ int32 t nb, { int32_t id, int32_t val }[] }- 说明:
设置选项,客户端应应用给定的选项/值。
nb={ id, val }条目数id= 选项 IDval= 选项新值
barrierCmdDFileTransfer "DFTR"
- 方向:
服务器到客户端
- 参数:
{ int8_t mark, char *content }- 说明:
传输文件数据。
mark= 0 表示后续内容为文件大小1 表示后续内容为分块数据
2 表示传输结束
barrierCmdDDragInfo "DDRG"
- 方向:
服务器到客户端
- 参数:
{ int16_t nb, char *content }- 说明:
拖动信息。
nb= 拖动对象数content= 对象目录
barrierCmdQInfo "QINF"
- 方向:
服务器到客户端
- 参数:
无。
- 说明:
查询屏幕信息。
客户端应回复 barrierCmdDInfo。
barrierCmdEIncompatible "EICV"
- 方向:
服务器到客户端
- 参数:
{ int16_t nb, major *minor }- 说明:
版本不兼容。
major= 主版本minor= 次版本
barrierCmdEBusy "EBSY"
- 方向:
服务器到客户端
- 参数:
无。
- 说明:
连接时提供的名称已被使用。
barrierCmdEUnknown "EUNK"
- 方向:
服务器到客户端
- 参数:
无。
- 说明:
未知客户端,连接时提供的名称不在主屏配置映射中。
barrierCmdEBad "EBAD"
- 方向:
服务器到客户端
- 参数:
无。
- 说明:
违反协议,服务器发送此消息后应断开。