GVCP 协议描述了程序与设备之间遵守的通信规范,重点介绍了三种类型的通道,即控制通道、消息通道和流通道,并列举了各种事件命令。
概览
GVCP 是一种依赖于 UDP 传输层协议的应用层协议。它基本上允许应用程序在设备上配置设备(通常是照相机),并在设备上实例化流通道( GVSP 发射器或接收器,如果适用),以及设备在特定事件发生时通知应用程序。
GVCP 仅为一个应用程序(主应用程序)提供必要的支持,以控制设备(写入设备)。然而,如果主应用程序允许这样做,那么许多应用程序就可以监视一个设备(从一个设备中读取)。应用程序也可以请求对已经在主应用程序控制下的设备的控制,前提是设备支持并且主应用程序允许这样做。在 GVCP 下,应用程序是主程序,设备是从程序。命令请求总是由应用程序发起的。
命令和确认消息必须分别包含在一个数据包中。应用程序必须等待确认消息(当请求时)才能发送下一个命令消息。这就创建了一个非常基本的握手,以确保最小的流量控制。确认消息提供设备实际接收到命令的反馈,它还提供命令请求的任何响应数据。
该规范的当前版本使用 UDP IPv4作为传输层协议。由于 UDP 是不可靠的, GVCP 定义了机制来保证数据包传输的可靠性和确保最小的流量控制。
一、 基本概念
在 GVCP 协议报文中,最大传输单元 MTU 定义为 576byte ,包括 IP 头、 UDP 头、 GVCP 头以及数据负载部分。
GVCP 控制头和数据段部分大小必须是4字节的倍数。
GVCP 是基于 UDP 无连接服务的,因此,设计了消息重传机制。消息重试次数可以由用户设定,默认值为 3 。reg_d≠0 ,在控制通道关闭后,其值会被初始化。此外,还启用了端到端连接,通过设置心跳计数来侦听链路是否断开。同理,其值是可以自定义的。一般来说,应用程序端的心跳频率应略低于设备端的 13,这样可以在 UDP 包发送丢失时排除心跳因素的干扰。
GVCP 头包含了键值 0x42,用于设备与应用程序识别 GVCP 包。
设备的第一个 GVCP 端口号必须为 3956 。
二、通道
通道即虚拟连接。在本说明中包含 1 个控制通道,0-512 个流通道,0 或 1 个消息通道。
(1) 控制通道
控制通道被应用程序用于与设备进行通信。 GVCP 定义了两种类型的控制通道:
- 主控制通道:主控制通道由主应用程序创建。主应用程序是指允许写入设备寄存器的应用程序。只允许一个应用程序作为一个设备的主要应用程序。
- 辅助控制通道:任何辅助应用程序都会创建辅助控制通道。辅助应用程序只能从设备寄存器中读取(它们不能写入其中)。这可以用于监视或调试。一个设备可能支持许多辅助应用程序。一个设备不允许支持任何辅助应用程序。
在消息或流通道创建前,必须实例化一个控制通道。例如,有程序请求对一个寄存器进行写操作,以实现一个图像捕获,设备应该在寄存器被写入时返回一个响应,而不是捕获已完成时。
1、控制通道权限
GVCP 定义了四个级别的特权:
- 独家访问,通过写 CCP 寄存器授权访问。主程序能对设备进行读写,其他程序则不能,也不允许创建一个第二控制通道,除其发送的 DISCOVERY_CMD、FORCEIP_CMD 等少数命令,其他命令请求设备一概返回一个错误。
- 控制访问权限,与前者不同在于,其他程序可以读设备,也允许具有控制访问权的二级程序创建一个控制通道。
- 具备切换能力的控制访问,与控制访问不同在于,该模式主程序能对设备进行读写,允许具有正确凭据的其他程序控制设备。
- 监控访问,条件最弱一般用于调试帮助。只要无独占访问的程序连接设备就可以读该设备。
设备必须记录主程序相关的上下文信息,至少包括程序 IP 地址、源 UDP 端口和授予特权类型,以确定其是否可授权给其他程序(如果收到的命令消息合法)。
在程序端使用一个动态端口号(任意),设备端使用标准 GVCP 端口(除非通过 mDNS 通告了一个不同的端口)就可以创建控制通道,再通过 GVCP DISCOVERY 命令创建链接。在软件开发阶段,对设备使用非独占方式访问,有助于其他调试工具监控该设备。
2、控制通道寄存器
- 控制通道特权寄存器(Control Channel Privilege register ( CCP ))
- 控制切换键寄存器(Control Switchover Key register)
- 心跳超时寄存器(Heartbeat Timeout register)
- 待定超时寄存器(Pending Timeout register)
3、打开/关闭控制通道
程序通过对 CCP 寄存器写请求特权,并检查设备 ACK 消息返回的状态,根据状态码内容决定是否有打开通道的资格。允许主程序在不关闭控制通道时请求相同的特权类型,如可通过写 CCP 寄存器来直接切换到另一控制特权。通过对 CCP 寄存器写 0 来关闭通道,并释放主程序的特权。
4、控制通道心跳
使用心跳序列可以定期检测控制通道是否处于活动状态,心跳速率是可自定义的,默认每秒 1 次。设备在接收到主程序任一有效命令后,必须重置心跳计数,少数命令除外,如 ACTIONCMD 。心跳计数可通过读 CCP 寄存器来重置,且只能由主程序执行。若设备在超过用户设置的心跳超时时间(默认 3 秒)后,且没有禁用心跳性能寄存器仍没有收到一个控制消息,则必须断开控制通道。如果主程序不能读 CCP 寄存器或读取非预期数值时,即可判定链路断开,此时,必须实例化控制通道以建立与设备的新链接。
5、设备控制
主程序可以在打开通道后,发送任何受 GVCP 支持的命令,二级程序可发送 READREG 和 READMEM 命读取设备速率。 DISCOVERY、ACTION 和 PACKETRESEND 命令可以在任何时间由任一程序发送,且设备总是在收到后返回一个 ACK 消息。
6、使用待定应答
若设备执行命令时间比程序预期的要长,则下述机制有助于相互间通信:
- 执行一个请求所需的最大执行时间。
- 当请求执行时间将超过①中的值,使用使用 PENDING_ACK 消息通知程序使其可以等待额外必需的时间来完成该请求。
PENDING_ACK 的 ack_id 值与程序初始请求的 reg_id 值相同。若设备支持该消息,则必需在一个PENDING_ACK 和 ACK 命令发出之间响应 DISCOVERY_CMD,且不能用该消息响应一个DISCOVERY_CMD、FORCEIP_CMD 和 PACKETRESEND_CMD。
GIGE 协议摘录 —— GVCP 协议(二)(下):https://developer.aliyun.com/article/1598396