Socket interface

pigpio provides a socket interface to many of its functions.
The socket interface is available whenever pigpio is running, either because it has been started as a daemon, or it has been linked in to a running user program.
The socket interface can be disabled by the program which initialises the library. pigpiod offers the -k option to disable the socket interface. User programs should call gpioCfgInterfaces if they wish to disable the socket interface.
pigpio listens for connections on port 8888 by default. This default may be overridden when pigpio starts by the gpioCfgSocketPort function call. The pigpio daemon uses this function to provide an option to change the port number.
The pigs utility is an example of using the socket interface from C.

### Request

pigpio expects messages of type cmdCmd_t immediately followed with an extension for a few commands.
The caller should fill in cmd, p1, p2, p3/res, and any extension as needed. p3 will always be zero unless the command requires an extension in which case p3 will be the length in bytes of the extension.
The cmdCmd_t is echoed back with the result, if any, in p3/res, and an extension immediately afterwards for a few commands.

COMMAND | cmd | p1 | p2 | p3 | Extension
MODES | 0 | gpio | mode | 0 | -
MODEG | 1 | gpio | 0 | 0 | -
PUD | 2 | gpio | pud | 0 | -
READ | 3 | gpio | 0 | 0 | -
WRITE | 4 | gpio | level | 0 | -
PWM | 5 | gpio | dutycycle | 0 | -
PRS | 6 | gpio | range | 0 | -
PFS | 7 | gpio | frequency | 0 | -
SERVO | 8 | gpio | pulsewidth | 0 | -
WDOG | 9 | gpio | timeout | 0 | -
BR1 | 10 | 0 | 0 | 0 | -
BR2 | 11 | 0 | 0 | 0 | -
BC1 | 12 | bits | 0 | 0 | -
BC2 | 13 | bits | 0 | 0 | -
BS1 | 14 | bits | 0 | 0 | -
BS2 | 15 | bits | 0 | 0 | -
TICK | 16 | 0 | 0 | 0 | -
HWVER | 17 | 0 | 0 | 0 | -
NO | 18 | 0 | 0 | 0 | -
NB | 19 | handle | bits | 0 | -
NP | 20 | handle | 0 | 0 | -
NC | 21 | handle | 0 | 0 | -
PRG | 22 | gpio | 0 | 0 | -
PFG | 23 | gpio | 0 | 0 | -
PRRG | 24 | gpio | 0 | 0 | -
HELP | 25 | N/A | N/A | N/A | N/A
PIGPV | 26 | 0 | 0 | 0 | -
WVCLR | 27 | 0 | 0 | 0 | -
WVAG | 28 | 0 | 0 | 12*X | gpioPulse_t pulse[X]
WVAS | 29 | gpio | baud | 12+X | uint32_t databits uint32_t stophalfbits uint32_t offset uint8_t data[X]
N/A | 30 | 0 | 0 | 0 | -
N/A | 31 | 0 | 0 | 0 | -
WVBSY | 32 | 0 | 0 | 0 | -
WVHLT | 33 | 0 | 0 | 0 | -
WVSM | 34 | subcmd | 0 | 0 | -
WVSP | 35 | subcmd | 0 | 0 | -
WVSC | 36 | subcmd | 0 | 0 | -
TRIG | 37 | gpio | pulselen | 4 | uint32_t level
PROC | 38 | 0 | 0 | X | uint8_t text[X]
PROCD | 39 | script_id | 0 | 0 | -
PROCR | 40 | script_id | 0 | 4*X | uint32_t pars[X]
PROCS | 41 | script_id | 0 | 0 | -
SLRO | 42 | gpio | baud | 4 | uint32_t databits
SLR | 43 | gpio | count | 0 | -
SLRC | 44 | gpio | 0 | 0 | -
PROCP | 45 | script_id | 0 | 0 | -
MICS | 46 | micros | 0 | 0 | -
MILS | 47 | millis | 0 | 0 | -
PARSE | 48 | N/A | N/A | N/A | N/A
WVCRE | 49 | 0 | 0 | 0 | -
WVDEL | 50 | wave_id | 0 | 0 | -
WVTX | 51 | wave_id | 0 | 0 | -
WVTXR | 52 | wave_id | 0 | 0 | -
WVNEW | 53 | 0 | 0 | 0 | -
I2CO | 54 | bus | device | 4 | uint32_t flags
I2CC | 55 | handle | 0 | 0 | -
I2CRD | 56 | handle | count | 0 | -
I2CWD | 57 | handle | 0 | X | uint8_t data[X]
I2CWQ | 58 | handle | bit | 0 | -
I2CRS | 59 | handle | 0 | 0 | -
I2CWS | 60 | handle | byte | 0 | -
I2CRB | 61 | handle | register | 0 | -
I2CWB | 62 | handle | register | 4 | uint32_t byte
I2CRW | 63 | handle | register | 0 | -
I2CWW | 64 | handle | register | 4 | uint32_t word
I2CRK | 65 | handle | register | 0 | -
I2CWK | 66 | handle | register | X | uint8_t bvs[X]
I2CRI | 67 | handle | register | 4 | uint32_t num
I2CWI | 68 | handle | register | X | uint8_t bvs[X]
I2CPC | 69 | handle | register | 4 | uint32_t word
I2CPK | 70 | handle | register | X | uint8_t data[X]
SPIO | 71 | channel | baud | 4 | uint32_t flags
SPIC | 72 | handle | 0 | 0 | -
SPIR | 73 | handle | count | 0 | -
SPIW | 74 | handle | 0 | X | uint8_t data[X]
SPIX | 75 | handle | 0 | X | uint8_t data[X]
SERO | 76 | baud | flags | X | uint8_t device[X]
SERC | 77 | handle | 0 | 0 | -
SERRB | 78 | handle | 0 | 0 | -
SERWB | 79 | handle | byte | 0 | -
SERR | 80 | handle | count | 0 | -
SERW | 81 | handle | 0 | X | uint8_t data[X]
SERDA | 82 | handle | 0 | 0 | -
GDC | 83 | gpio | 0 | 0 | -
GPW | 84 | gpio | 0 | 0 | -
HC | 85 | gpio | frequency | 0 | -
HP | 86 | gpio | frequency | 4 | uint32_t dutycycle
CF1 | 87 | arg1 | arg2 | X | uint8_t argx[X]
CF2 | 88 | arg1 | retMax | X | uint8_t argx[X]
BI2CC | 89 | sda | 0 | 0 | -
BI2CO | 90 | sda | scl | 4 | uint32_t baud
BI2CZ | 91 | sda | 0 | X | uint8_t data[X]
I2CZ | 92 | handle | 0 | X | uint8_t data[X]
WVCHA | 93 | 0 | 0 | X | uint8_t data[X]
SLRI | 94 | gpio | invert | 0 | -
CGI | 95 | 0 | 0 | 0 | -
CSI | 96 | config | 0 | 0 | -
FG | 97 | gpio | steady | 0 | -
FN | 98 | gpio | steady | 4 | uint32_t active
NOIB | 99 | 0 | 0 | 0 | -
WVTXM | 100 | wave_id | mode | 0 | -
WVTAT | 101 | 0 | 0 | 0 | -
PADS | 102 | pad | strength | 0 | -
PADG | 103 | pad | 0 | 0 | -
FO | 104 | mode | 0 | X | uint8_t file[X]
FC | 105 | handle | 0 | 0 | -
FR | 106 | handle | count | 0 | -
FW | 107 | handle | 0 | X | uint8_t data[X]
FS | 108 | handle | offset | 4 | uint32_t from
FL | 109 | count | 0 | X | uint8_t pattern[X]
SHELL | 110 | len(name) | 0 | len(name)+ 1+ len(string) | uint8_t name[len(name)] uint8_t null (0) uint8_t string[len(string)]
BSPIC | 111 | CS | 0 | 0 | -
BSPIO | 112 | CS | 0 | 20 | uint32_t MISO uint32_t MOSI uint32_t SCLK uint32_t baud uint32_t spi_flags
BSPIX | 113 | CS | 0 | X | uint8_t data[X]
BSCX | 114 | control | 0 | X | uint8_t data[X]
EVM | 115 | handle | bits | 0 | -
EVT | 116 | event | 0 | 0 | -
PROCU | 117 | script_id | 0 | 4*X | uint32_t pars[X]

### Response

The response has cmd/p1/p2 as in the request. p3/res holds the return value. If the command returns additional values they will be in the immediately following extension.

Normally res should be treated as a 32 bit signed value and will be greater than or equal to zero. Upon failure res will be less than 0 and contains an error code.

There are a few commands where the returned value should be treated as a 32 bit unsigned value. These commands can not fail. They are indicated with a * after the command name.

Commands with an extension have the size of the extension in bytes returned in res (or <0 on error as above).

COMMAND | cmd | p1 | p2 | res | Extension
MODES | 0 | - | - | 0 | -
MODEG | 1 | - | - | mode | -
PUD | 2 | - | - | 0 | -
READ | 3 | - | - | level | -
WRITE | 4 | - | - | 0 | -
PWM | 5 | - | - | 0 | -
PRS | 6 | - | - | 0 | -
PFS | 7 | - | - | 0 | -
SERVO | 8 | - | - | 0 | -
WDOG | 9 | - | - | 0 | -
BR1 * | 10 | - | - | bits | -
BR2 * | 11 | - | - | bits | -
BC1 | 12 | - | - | 0 | -
BC2 | 13 | - | - | 0 | -
BS1 | 14 | - | - | 0 | -
BS2 | 15 | - | - | 0 | -
TICK * | 16 | - | - | tick | -
HWVER * | 17 | - | - | version | -
NO | 18 | - | - | handle | -
NB | 19 | - | - | 0 | -
NP | 20 | - | - | 0 | -
NC | 21 | - | - | 0 | -
PRG | 22 | - | - | range | -
PFG | 23 | - | - | frequency | -
PRRG | 24 | - | - | real range | -
HELP | 25 | - | - | N/A | N/A
PIGPV * | 26 | - | - | version | -
WVCLR | 27 | - | - | 0 | -
WVAG | 28 | - | - | wave pulses | -
WVAS | 29 | - | - | wave pulses | -
N/A | 30 | - | - | - | -
N/A | 31 | - | - | - | -
WVBSY | 32 | - | - | busy (1) or not busy (0) | -
WVHLT | 33 | - | - | 0 | -
WVSM | 34 | - | - | wave micros wave micros - high wave micros - max | -
WVSP | 35 | - | - | wave pulses wave pulses - high wave pulses - max | -
WVSC | 36 | - | - | wave DMA CBs wave DMA CBs - high wave DMA CBs - max | -
TRIG | 37 | - | - | 0 | -
PROC | 38 | - | - | script id | -
PROCD | 39 | - | - | 0 | -
PROCR | 40 | - | - | script status | -
PROCS | 41 | - | - | 0 | -
SLRO | 42 | - | - | 0 | -
SLR | 43 | - | - | X | uint8_t data[X]
SLRC | 44 | - | - | 0 | -
PROCP | 45 | - | - | 44 | uint32_t script_status uint32_t pars[10]
MICS | 46 | - | - | 0 | -
MILS | 47 | - | - | 0 | -
PARSE | 48 | - | - | N/A | -
WVCRE | 49 | - | - | wave id | -
WVDEL | 50 | - | - | 0 | -
WVTX | 51 | - | - | wave DMA CBs | -
WVTXR | 52 | - | - | wave DMA CBs | -
WVNEW | 53 | - | - | 0 | -
I2CO | 54 | - | - | handle | -
I2CC | 55 | - | - | 0 | -
I2CRD | 56 | - | - | X | uint8_t data[X]
I2CWD | 57 | - | - | 0 | -
I2CWQ | 58 | - | - | 0 | -
I2CRS | 59 | - | - | byte value | -
I2CWS | 60 | - | - | 0 | -
I2CRB | 61 | - | - | byte value | -
I2CWB | 62 | - | - | 0 | -
I2CRW | 63 | - | - | word value | -
I2CWW | 64 | - | - | 0 | -
I2CRK | 65 | - | - | 0 | -
I2CWK | 66 | - | - | 0 | -
I2CRI | 67 | - | - | X | uint8_t data[X]
I2CWI | 68 | - | - | 0 | -
I2CPC | 69 | - | - | word value | -
I2CPK | 70 | - | - | X | uint8_t data[X]
SPIO | 71 | - | - | handle | -
SPIC | 72 | - | - | 0 | -
SPIR | 73 | - | - | X | uint8_t data[X]
SPIW | 74 | - | - | 0 | -
SPIX | 75 | - | - | X | uint8_t data[X]
SERO | 76 | - | - | handle | -
SERC | 77 | - | - | 0 | -
SERRB | 78 | - | - | byte value | -
SERWB | 79 | - | - | 0 | -
SERR | 80 | - | - | X | uint8_t data[X]
SERW | 81 | - | - | 0 | -
SERDA | 82 | - | - | data ready count | -
GDC | 83 | - | - | dutycycle | -
GPW | 84 | - | - | pulsewidth | -
HC | 85 | - | - | 0 | -
HP | 86 | - | - | 0 | -
CF1 | 87 | - | - | value | -
CF2 | 88 | - | - | X | uint8_t retBuf[X]
BI2CC | 89 | - | - | 0 | -
BI2CO | 90 | - | - | handle | -
BI2CZ | 91 | - | - | X | uint8_t data[X]
I2CZ | 92 | - | - | X | uint8_t data[X]
WVCHA | 93 | - | - | 0 | -
SLRI | 94 | - | - | 0 | -
CGI | 95 | - | - | config | -
CSI | 96 | - | - | 0 | -
FG | 97 | - | - | 0 | -
FN | 98 | - | - | 0 | -
NOIB | 99 | - | - | 0 | -
WVTXM | 100 | - | - | wave DMA CBs | -
WVTAT | 101 | - | - | wave id | -
PADS | 102 | - | - | 0 | -
PADG | 103 | - | - | strength | -
FO | 104 | - | - | handle | -
FC | 105 | - | - | 0 | -
FR | 106 | - | - | X | uint8_t data[X]
FW | 107 | - | - | 0 | -
FS | 108 | - | - | position | -
FL | 109 | - | - | X | uint8_t filenames[X]
SHELL | 110 | - | - | exit status | -
BSPIC | 111 | - | - | 0 | -
BSPIO | 112 | - | - | 0 | -
BSPIX | 113 | - | - | X | uint8_t data[X]
BSCX | 114 | - | - | X+4 | uint32_t status uint8_t data[X]
EVM | 115 | - | - | 0 | -
EVT | 116 | - | - | 0 | -
PROCU | 117 | - | - | 0 | -

`
`

### cmdCmd_t

`typedef struct
{
uint32_t cmd;
uint32_t p1;
uint32_t p2;
union
{
uint32_t p3;
uint32_t ext_len;
uint32_t res;
};
} cmdCmd_t;
`