首页 > 代码库 > SPICE协议------主通道交互定义

SPICE协议------主通道交互定义

1  主通道协议定义

1.1服务器—》客户端

enum {
    SPICE_MSG_MAIN_MIGRATE_BEGIN = 101,
    SPICE_MSG_MAIN_MIGRATE_CANCEL,
    SPICE_MSG_MAIN_INIT,
    SPICE_MSG_MAIN_CHANNELS_LIST,
    SPICE_MSG_MAIN_MOUSE_MODE,
    SPICE_MSG_MAIN_MULTI_MEDIA_TIME,
    SPICE_MSG_MAIN_AGENT_CONNECTED,
    SPICE_MSG_MAIN_AGENT_DISCONNECTED,
    SPICE_MSG_MAIN_AGENT_DATA,
    SPICE_MSG_MAIN_AGENT_TOKEN,
    SPICE_MSG_MAIN_MIGRATE_SWITCH_HOST,
    SPICE_MSG_MAIN_MIGRATE_END,
    SPICE_MSG_MAIN_NAME,
    SPICE_MSG_MAIN_UUID,
    SPICE_MSG_MAIN_AGENT_CONNECTED_TOKENS,
    SPICE_MSG_MAIN_MIGRATE_BEGIN_SEAMLESS,
    SPICE_MSG_MAIN_MIGRATE_DST_SEAMLESS_ACK,
    SPICE_MSG_MAIN_MIGRATE_DST_SEAMLESS_NACK,
    SPICE_MSG_END_MAIN
};


1.2客户端—》服务器

enum {
    SPICE_MSGC_MAIN_CLIENT_INFO = 101,
    SPICE_MSGC_MAIN_MIGRATE_CONNECTED,
    SPICE_MSGC_MAIN_MIGRATE_CONNECT_ERROR,
    SPICE_MSGC_MAIN_ATTACH_CHANNELS,
    SPICE_MSGC_MAIN_MOUSE_MODE_REQUEST,
    SPICE_MSGC_MAIN_AGENT_START,
    SPICE_MSGC_MAIN_AGENT_DATA,
    SPICE_MSGC_MAIN_AGENT_TOKEN,
    SPICE_MSGC_MAIN_MIGRATE_END,
    SPICE_MSGC_MAIN_MIGRATE_DST_DO_SEAMLESS,
    SPICE_MSGC_MAIN_MIGRATE_CONNECTED_SEAMLESS,
    SPICE_MSGC_END_MAIN
};


1.3迁移控制

1.4鼠标模式

SPICE协议支持两个鼠标模式:客户端模式及服务器模式。客户端模式下,实际鼠标是客户端鼠标,客户端端发送鼠标位置的显示和服务器发送鼠标形状信息。服务器模式下,客户端发送鼠标的相对移动位置和服务器发送的位置和形状的命令。SPICE主通道被用来发送鼠标模式的控制。

1.4.1  SpiceMouseMode模式

typedef enumSpiceMouseMode {
    SPICE_MOUSE_MODE_SERVER = (1 << 0),//服务器模式
    SPICE_MOUSE_MODE_CLIENT = (1 << 1),//客户端模式
    SPICE_MOUSE_MODE_MASK = 0x3
}SpiceMouseMode;


1.4.2  SpiceMsgMainMouseMode结构体描述

SPICE服务器在鼠标模式更改时发送此消息

typedef structSpiceMsgMainMouseMode {

    uint32_t supported_modes; //当前支持的鼠标模式

    uint32_t current_mode; //当前鼠标模式

}SpiceMsgMainMouseMode;

1.4.3  SpiceMsgcMainMouseModeRequest结构体描述

SPICE客户端发送此消息用来指定鼠标模式。服务器是否接受这个模式是不确定的。只有当收到服务器的回复,客户端才知道实际鼠标模式。

typedef structSpiceMsgcMainMouseModeRequest {
    uint32_t mode;
}SpiceMsgcMainMouseModeRequest;


1.5Main channel init message

SPICE服务器必须发送SPICE_MSG_MAIN_INIT作为第一个消息。在其他任何时候发送都是不被允许的。客户端会回复SPICE_MSGC_MAIN_ATTACH_CHANNELS。获得服务器所支持的通道列表

typedef structSpiceMsgMainInit {
    uint32_t session_id; //SPICE服务端生成的会话ID,后续通道的链接将发送此ID。
    uint32_t display_channels_hint;//可选的预期数量的显示通道。0是无效数值
    uint32_t supported_mouse_modes;//支持的鼠标模式
    uint32_t current_mouse_mode;//当前鼠标模式
    uint32_t agent_connected; //当前SPICE agent的状态。0:断开,1:连接
    uint32_t agent_tokens; //发送给SPICE agent的有效许可证,规定了发送信息的数量
    uint32_t multi_media_time;//当前多媒体时间。用于同步视频帧
    uint32_t ram_hint; //可先的提示帮助确定LZ压缩的大小
} SpiceMsgMainInit;


1.6服务器回应支持通道

为了能够动态的连接服务器通道,SPCIE协议包含了SPICE_MSG_MAIN_CHANNELS_LIST消息。这个消息通知客户端服务器的可用通道。

typedef structSpiceMsgChannels {
    uint32_t num_of_channels;
    SpiceChannelId channels[0];
}SpiceMsgChannels;


1.7多媒体时间同步消息

SPICE协议定义了设置多媒体音视频同步的消息。两种方法支持多媒体的支持,第一种方法是根据播放通道上的时间戳,第二种方法使用在主通道SPICE_MSG_MAIN_MULTI_MEDIA_TIME的消息。后一种方法用在不存在音频通道情况下

typedef structSpiceMsgMainMultiMediaTime {
    uint32_t time;
}SpiceMsgMainMultiMediaTime;


1.8Spice agent

SPICE协议定义一组双向通道的消息在SPICE客户端和远程主机上端AGENT的双向通信。SPICE协议只是提供了一种交流的渠道,实际数据传输协议内容是不逃命的。这个通道可以用于各种目的如剪贴板共享、身份验证和显示配置。

1、SPICE客户端接收远程代理通知连接消息

SPICE_MSG_MAIN_INIT或SPICE_MSG_MAIN_AGENT_CONNECTED。

2、远程代理断开消息

SPICE_MSG_MAIN_AGENT_DISCONNECTED。

双向使用令牌机制是为了防止代理消息阻塞主通道。每一方都不允许发送多于对方分配令牌数量的消息,客户端在接收到SPICE_MSG_MAIN_INIT消息的时候获得对方的令牌。后续可以使用SPICE_MSG_MAIN_AGENT_TOKEN获得对方的令牌。服务器得到客户端的令牌初始数量是在SPICE_MSGC_MAIN_AGENT_START消息中,后续SPICE_MSGC_MAIN_AGENT_TOKEN。后续数据的交互使用SPICE_MSG_MAIN_AGENT_DATA和SPICE_MSGC_MAIN_AGENT_DATA。

SPICE协议------主通道交互定义