GVCP数据包

paw5zx Lv4

简述

设备通过监听GVCP端口(3956)等待GVCP数据包。当客户端(如:PC设备)向设备(如:相机)发送一个GVCP命令数据包时,设备会回复一个确认数据包。每个命令/确认对(command/acknowledge pair)都使用一个16 bit的值来标识(就相当于ID),这样可以检查确认数据包是否与之前发送的命令对应。0是这个标识符的错误值。如果在给定的超时时间后没有收到确认,将再次发送命令数据包,直到达到最大重试次数。

ArvGvcp API提供了一系列处理GVCP包的函数。

GVCP数据包的内容由一个64 bit的头部组成,头部后面可能跟着一个数据字节数组(也可能没有,具体取决于GVCP数据包的类型)。多字节值采用大端编码。

表格1.GVCP packet
0 15 16 31 32 47 48 63
ArvGvcpPacketType ArvGvcpCommand Data size Packet id
Optional data
...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//version: 0.8.31
//file: arvgvcpprivate.h
typedef struct {
guint8 packet_type;
guint8 packet_flags;
guint16 command; //a ArvGvcpCommand identifier
guint16 size; //data size
guint16 id; //packet identifier
} ArvGvcpHeader;

typedef enum {
ARV_GVCP_PACKET_TYPE_ACK = 0x00, //acknowledge packet
ARV_GVCP_PACKET_TYPE_CMD = 0x42, //command packet
ARV_GVCP_PACKET_TYPE_ERROR = 0x80, //error packet
ARV_GVCP_PACKET_TYPE_UNKNOWN_ERROR = 0x8f //unknown error
} ArvGvcpPacketType;

typedef enum {
ARV_GVCP_COMMAND_DISCOVERY_CMD = 0x0002, //discovery command
ARV_GVCP_COMMAND_DISCOVERY_ACK = 0x0003, //discovery acknowledge
ARV_GVCP_COMMAND_BYE_CMD = 0x0004, //goodbye command, for connection termination
ARV_GVCP_COMMAND_BYE_ACK = 0x0005, //goodbye acknowledge
ARV_GVCP_COMMAND_PACKET_RESEND_CMD = 0x0040, //packet resend request
ARV_GVCP_COMMAND_PACKET_RESEND_ACK = 0x0041, //packet resend acknowledge (not used ?)
ARV_GVCP_COMMAND_READ_REGISTER_CMD = 0x0080, //read register command
ARV_GVCP_COMMAND_READ_REGISTER_ACK = 0x0081, //read register acknowledge
ARV_GVCP_COMMAND_WRITE_REGISTER_CMD = 0x0082, //write register command
ARV_GVCP_COMMAND_WRITE_REGISTER_ACK = 0x0083, //write register acknowledge
ARV_GVCP_COMMAND_READ_MEMORY_CMD = 0x0084, //read memory command
ARV_GVCP_COMMAND_READ_MEMORY_ACK = 0x0085, //read memory acknowledge
ARV_GVCP_COMMAND_WRITE_MEMORY_CMD = 0x0086, //write memory command
ARV_GVCP_COMMAND_WRITE_MEMORY_ACK = 0x0087, //write memory acknowledge
ARV_GVCP_COMMAND_PENDING_ACK = 0x0089 //pending command acknowledge
} ArvGvcpCommand;

发现设备

设备发现机制是通过客户端向GVCP端口广播一个发现GVCP数据包来实现的。每个可用的设备都会对这个发现数据包响应一个确认数据包,其中包含了设备的描述(设备名称、型号名称、制造商名称、MAC地址等)。

设备发现命令的数据包中,data size为0(这里估计是作者写错了,data size是248也就是0xf8),packet id为0xffff。

表格2.设备发现确认数据包
Address 0 15 16 31
0x0000 0x0003
0x00f8 0xffff
0x0000 Version major Version minor
0x0004 Endianness Character set
0x0008 MAC address high
0x000c MAC address low
0x0010 Supported IP configuration
0x0014 Current IP configuration
0x0018
0x001c
0x0020
0x0024 Current IP address
0x0028
0x002c
0x0030
0x0034 Current subnet mask
0x0038
0x003c
0x0040
0x0044 Current gateway
0x0048 Manufacturer name
0x004c
0x0050
0x0054
0x0058
0x005c
0x0060
0x0064
0x0068 Model name
0x006c
0x0070
0x0074
0x0078
0x007c
0x0080
0x0084
0x0088 Device version
0x008c
0x0090
0x0094
0x0098
0x009c
0x00a0
0x00a4
0x00a8 Manufacturer informations
0x00ac
0x00b0
0x00b4
0x00b8
0x00bc
0x00c0
0x00c4
0x00c8
0x00cc
0x00d0
0x00d4
0x00d8 User defined name
0x00dc
0x00e0
0x00e4
0x00e8
0x00ec
0x00f0
0x00f4
1
2
3
4
5
6
//version: 0.8.31
//file: arvgvcpprivate.h
typedef struct {
ArvGvcpHeader header; //packet header
unsigned char data[]; //variable size byte array
} ArvGvcpPacket;

读写寄存器

这些数据包用于读写32位寄存器,通过32位地址访问。对于读命令,向客户端发送一个地址列表,客户端返回一个32位值的列表。对于写命令,向客户端发送一个地址/值对(address/value pair)的列表,客户端返回一个32位值的列表。

地址和数据在数据包中以大端值的形式编码。

读写内存

写内存数据包的数据区包含一个32位地址,后跟要写入的数据。客户端返回一个带有目标地址的确认包。
对于读内存命令,发送一个地址/大小对(address/size pair)到设备,设备返回给定内存区域的内容

参考文章

1.《GVCP packets》

  • 标题: GVCP数据包
  • 作者: paw5zx
  • 创建于 : 2024-11-01 11:58:27
  • 更新于 : 2024-11-02 14:08:33
  • 链接: https://paw5zx.github.io/aravis-GVCP-packets/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论