Bridge Linux evdev events from one system to another, minimizing latency.
The bridge consists of two components, remote-uinput-server and remote-uinput-client. The client sends evdev events coming from the device to the server, which makes the evdev device available to local applications.
Input events are exchanged between the client and server as tiny UDP packets. The device descriptors aren't sent over the network. These can be generated by the client, and need to be manually provided to the server as a JSON configuration file.
On the client side, generate configuration for the devices to be shared, and copy it to the server:
$ target/release/remote-uinput-client list-devices
⋮
045e:0008 /dev/input/event0: usb-xhci-hcd.1-2.2/input0: Microsoft Microsoft SideWinder Precision Pro (USB)
⋮
# you can either use
# --device-by-usbid 045e:0008
# --device-by-path /dev/input/event0
# --device-by-phys usb-xhci-hcd.1-2.2/input0
# --device-by-name "Microsoft Microsoft SideWinder Precision Pro (USB)"
$ remote-uinput-client --generate-config --device-by-usbid 045e:0008 > remote-uinput-config.json
$ scp remote-uinput-config.json server:If the device you want to share doesn't appear in list-devices output, make sure that the user you're running it has access to it. You can also check with the utility evtest.
Start server side. The default, when no --bind is specified, is to bind on port 9002 on any interface. The server generally needs to be run as root to be allowed to create uevent devices:
$ RUST_LOG="info" remote-uinput-server -c remote-uinput-config.jsonStart client side (replace 192.168.1.2 with the server address):
$ RUST_LOG="info" remote-uinput-client --destination 192.168.1.2:9002 --device-by-usbid 045e:0008The server receives events from the network, and makes the evdev device(s) available to local applications.
$ target/release/remote-uinput-server --help
Usage: remote-uinput-server [OPTIONS] --config <CONFIG>
Options:
-c, --config <CONFIG> Path to JSON config file
-b, --bind <BIND> Bind address [default: 0.0.0.0:9002]
-h, --help Print help
-V, --version Print version
Specifying a configuration file is mandatory. Normally, this is generated on the client side (see Example section above). The configuration is a simple JSON list of device descriptors,
remote-uinput-config.json
[
{
"name": "Microsoft Microsoft SideWinder Precision Pro (USB)",
"vendor": 1118,
"product": 8,
"version": 256,
"capabilities": {
"4": [
4
],
"3": [
0,
1,
5,
6,
16,
17
],
"1": [
288,
289,
290,
291,
292,
293,
294,
295,
296
]
},
"abs_info": {
"1": {
"value": 0,
"minimum": -512,
"maximum": 511,
"fuzz": 3,
"flat": 63,
"resolution": 0
},
"5": {
"value": 1,
"minimum": -32,
"maximum": 31,
"fuzz": 0,
"flat": 3,
"resolution": 78
},
"17": {
"value": 0,
"minimum": -1,
"maximum": 1,
"fuzz": 0,
"flat": 0,
"resolution": 0
},
"16": {
"value": 0,
"minimum": -1,
"maximum": 1,
"fuzz": 0,
"flat": 0,
"resolution": 0
},
"0": {
"value": 30,
"minimum": -512,
"maximum": 511,
"fuzz": 3,
"flat": 63,
"resolution": 0
},
"6": {
"value": 7,
"minimum": -64,
"maximum": 63,
"fuzz": 0,
"flat": 7,
"resolution": 0
}
},
"properties": []
}
]The client sends evdev events coming from selected device(s) over the network to the specified destination.
$ target/release/remote-uinput-client --help
Usage: remote-uinput-client [OPTIONS] [COMMAND]
Commands:
list-devices List available input devices
help Print this message or the help of the given subcommand(s)
Options:
-d, --destination <DESTINATION> Destination IP:port (e.g., 127.0.0.1:9002)
-p, --device-by-path <DEVICE_BY_PATH> Forward device with the given device path (can specify multiple)
-n, --device-by-name <DEVICE_BY_NAME> Forward device with the given name (can specify multiple)
--device-by-phys <DEVICE_BY_PHYS> Forward device with the given physical path (can specify multiple)
--device-by-usbid <DEVICE_BY_USBID> Forward device with the given USB ID e.g. 1234:5678 (can specify multiple)
-e, --exclusive Grab the device for exclusive input
-g, --generate-config Generate server configuration for selected devices
-h, --help Print help
-V, --version Print version
When there are multiple devices that match a selection like --device-by-name, they will all be shared. If this is unwanted use a more specific selection like --device-by-path or --device-by-phys.
It is intentionally possible to specify missing devices. These will be skipped, but will reserve an internal index slot. This makes it possible to specify devices at the server side that are not currently connected to the client.