Devices are waiting for GVCP packets listening to the GVCP port (3956). When the client sends a command GVCP packet to the device, the device sends back an acknowledge packets in return. Each command/acknowledge pair is identified by a 16 bit value, which allows to check if an acknowledge packet corresponds to the previsoulsy sent command. 0 is an error value for this identifier. If an acknowledge is not received after a given timeout period, another command packet is sent, until a maximum number of retries is reached.
The ArvGvcp API offers a set of function for handling of GVCP packets.
The content of a GVCP packet is composed by a 64 bit headers, followed or not by a data byte array, depending on the GVCP packet type. Multibyte values are in big endian encoding.
Table 1. GVCP packet
0 | 15 | 16 | 31 | 32 | 47 | 48 | 63 |
---|---|---|---|---|---|---|---|
ArvGvcpPacketType | ArvGvcpCommand | Data size | Packet id | ||||
Optional data | |||||||
... |
A device discovery mechanism is implemented using a discovery GVCP packet, broadcasted by the client to the GVCP port. Each available device responds to this discovery packet with an acknowledge packet, containing a description of the device (device name, model name, manufacturer name, MAC Address...).
In the discovery command packet, data size is set to 0 and packet id is equal to 0xffff.
Table 2. Discovery acknowledge packet
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 | ||||
0x00c0 | ||||
0x00c4 | ||||
0x00cc | ||||
0x00d0 | ||||
0x00d4 | ||||
0x00d8 | User defined name | |||
0x00dc | ||||
0x00e0 | ||||
0x00e4 | ||||
0x00e8 | ||||
0x00ec | ||||
0x00f0 | ||||
0x00f4 |
These packets are used for the read and write of 32 bit registers, accessed using 32 bit adresses. For the read command, a list of addresses is sent ot the client, which returns a list of 32 bit values. For the write command, a list of address/value pairs is sent to the client, which returns a list of 32 bit values.
Address and data are encoded in the packet as big endian values.