一、 GVCP基本原理
GVCP是一种基于UDP传输层协议的应用层协议。该协议允许应用程序配置设备(目前主要应用在相机,实现对相机的配置),并可在设备上实例化数据流通道(如GVSP发射器或接收器),当特定事件发生时,设备通知应用程序。在GVCP下,应用程序是主设备,设备是从设备,命令请求总是由应用程序发起。
由于GVCP是一种基于UDP传输协议的应用层协议,该协议数据传输是不可靠的,因此定义了一些简单的应答机制来保证包传输的可靠性和最小的流量控制。命令和确认消息必须分别包含在一个单独的包中。在发送下一个命令消息之前,应用程序必须等待确认应答消息(当被请求时)。
GigE Vision Control Protocol (GVCP)的作用:
1) 允许在GigE Vision设备和设备之间交换命令和确认消息
2) GigE Vision应用程序提供了一种方法让应用程序实例化来自设备的数据流通道。
3) 定义GigE Vision设备向GigE发送异步事件消息的机制 (使用事件生成器)。
4) 提供唯一访问方案,使得只有一个应用程序可以控制设备。
5) 最小化GigE Vision设备的IP堆栈复杂度。
二、 设备发现与连接
为枚举设备,客户端会发送DISCOVERY_CMD指令,若设备与应用程序处于同一子网,则设备单播其DISCOVERY_ACK消息即可,无需进行广播DISCOVERY_ACK消息,但设备与应用程序不在同一子网时,且应用程序将DISCOVERY_CMD的flag字段设为第3位,此时便必须进行广播DISCOVERY_ACK消息,设备以获得未占用的IP地址。
图1. 海康机器人MVS客户端IP设置选项卡
工业相机在获取IP地址时一般都会有DHCP和LLA两种方法自动获取空闲的ip地址方法(如上图1标号1);同时,为了满足一些情况的使用,应用程序也可通过FORCEIP指令为设备强制指定IP地址(如上图1标号2),GVCP提供了此种为设备指定静态IP地址的机制,在同一子网下设置IP地址选项1~255均可,但本公司默认规定设置200以后数值。那么设置的IP地址是否合适,通过ARP来进行询问 ,示当询问该地址被某个硬件所占用,通过硬件地址判断是否为该设备地址,不是的话,返回到应用程序错误。在设备处于连接状态时,ARP仍会定时询问地址,以检查设备是否断开。通过Wireshark抓包获得ARP响应数据包如下图所示:
图2. Wireshark抓取的ARP数据包
三、 用Wireshark抓GVCP包实际应用
Wireshark抓GVCP包可用于问题定位分析。例:近期MV-CA020-10GM出现导出属性无法导入的问题,“SDK报错0x80000004错误的参数”。通过复现问题在此过程中Wireshark进一步抓包如获取的数据如下图3所示:
图3. Wireshark抓取实验过程数据
可以发现,在导入操作开始后,设备在执行一系列的写入参数操作,由GVCP的传输原理可知,为保证UDP协议下的准确传输,设置了简单的应答操作,此处为写入指令(WRITEREG_CMD)和写入应答指令(WRITEREG_ACK);发现在4963行进行写入操作后,4966行写入应答Failed,提示(Invalid Parameter)。展开写操作数据包如下图4所示。
图4. 写入指令(WRITEREG_CMD)数据包
其中第一行为总体发送的数据块,第二行目标地址,源地址,抓包类型信息,第三行是IPv4协议信息分析,第四行UDP包信息,第五行就是GVCP协议信息内容,此处分析案例问题主要看GVCP包信息,GVCP包头信息介绍如下图5所示:
图5. GVCP指令消息报头
最后操作的寄存器地址Custom Register Address为:0x00030d04,写入的参数值为:0x00000008。因此“SDK报错0x80000004错误的参数”的初步定位在写入该寄存器参数时,出现了错误。后续只需在程序中定位该地址对应的功能含义,并排查其写入的程序流程即可解决问题。
感谢分享。
有个问题,如何找到Custom Register Address为:0x00030d04代表的参数?写入的值0x00000008是多少?