ser2net is a long-standing Linux daemon that does the same basic job as Aether Serial Bridge: it gives each serial port its own TCP port. Both work with AetherSDR's network mode. This page says honestly where each one is the better tool.
- The device needs RFC 2217, meaning telnet COM-port control: the client changes the baud rate and drives DTR/RTS on the real port. RFC 2217 and remote DTR/RTS control are not goals of Aether Serial Bridge, and it doesn't do them. The main case is the SPE Expert amplifiers: AetherSDR drives DTR/RTS over RFC 2217 for remote power-on.
- The host can't run the bridge. That covers a 32-bit OS (such as 32-bit Raspberry Pi OS), glibc older than 2.35, a host without systemd or with cgroup v1, or an ordinary container. The bridge needs all of these (linux.md). ser2net is packaged by Debian, Ubuntu and Raspberry Pi OS.
- You already run ser2net and it works. There is no need to switch.
- You want ser2net's other features. It has many more connection options than this bridge; see its own documentation.
- The serial gear is cabled to a Windows PC. ser2net is a Linux daemon. The bridge runs as a Windows service with a configuration window, and it writes the Windows firewall rules for each port and its allowed clients.
- You want setup without a config file: a window (Windows, x64 Linux desktop), a terminal interface that works over SSH, or the port commands. Each edit is checked before it is saved.
- You want the bridge's safety rules:
- it is raw only, so a binary protocol (ACOM) can't be broken by a wrong telnet setting;
- DTR and RTS are fixed per port, off by default, and no client can toggle them;
- a change is applied as one guarded operation, and a failed apply leaves the bridge off rather than running half-applied settings (architecture.md).
- You want a status view:
--status, the window and the TUI show each port's state, the connected client, byte counts and the last error.
Both tools let a new connection take over a port from a stale one: ser2net with kickolduser: true, the
bridge always. Neither has a password. Whoever can reach a port controls the device, so bind both to a LAN
or VPN address and firewall them.
| Aether Serial Bridge | ser2net | |
|---|---|---|
| Raw TCP | yes, always | yes (accepter: tcp,...) |
| Telnet / RFC 2217 (remote baud, DTR, RTS) | no (not a goal) | yes (accepter: telnet(rfc2217),tcp,...) |
| Windows | yes: service, window, firewall rules | no |
| Linux | 64-bit (x64, arm64), glibc 2.35+, systemd with cgroup v2 | packaged by the major distributions |
| Configuration | window, terminal interface, command line | /etc/ser2net.yaml |
| Allowed-client list | Windows: enforced by the firewall rules it writes. Linux: recorded, not enforced. | use your firewall |
You can run both on one machine, as long as each serial port and each TCP port belongs to only one of them. A common setup is the bridge for the Elecraft and ACOM gear, and ser2net for an SPE.
The repository still carries a ready-made ser2net setup for Debian, Raspberry Pi OS and Ubuntu. It is separate from the bridge program.
ser2net/ser2net.yaml: an example ser2net 4.x configuration with one block per device. The Elecraft devices are active. ACOM (raw) and SPE (telnet + RFC 2217) are commented out.scripts/install.sh: installs ser2net withapt-getand copies the example configuration to/etc/ser2net.yaml. It backs up an existing file first. It also enables the ser2net service and lists your serial adapters.
git clone https://github.com/AetherSDR/AetherSerialBridge
cd aether-serial-bridge
sudo ./scripts/install.sh # installs ser2net, drops in the example config, lists your adapters
sudoedit /etc/ser2net.yaml # set the by-id paths, baud rates and bind address
sudo systemctl restart ser2net
ss -ltn # the configured TCP ports should be listeningFor each device you use in ser2net.yaml:
- Replace the
REPLACE-MEpath with the adapter's/dev/serial/by-id/...name (ls -l /dev/serial/by-id/). Don't use/dev/ttyUSB0: the numbers can swap after a reboot. - Check that the baud rate matches the device's own setting (devices.md).
- Bind to a LAN or VPN address: change
accepter: tcp,4001toaccepter: tcp,192.168.1.50,4001. Without an address, ser2net listens on every interface.
| Device | Example port | ser2net mode | Why |
|---|---|---|---|
| Elecraft KAT500 | 4001 | raw | ASCII protocol |
| Elecraft KPA500 | 4002 | raw | ASCII caret protocol |
| Elecraft KXPA100 | 4003 | raw | ASCII caret protocol |
| ACOM S-series | 4010 | raw (required) | Telnet mode doubles byte 0xFF, which ACOM's binary protocol uses as data |
| SPE Expert | 4011 | telnet + RFC 2217 (required) | AetherSDR drives DTR/RTS remotely for power-on |
kickolduser: true on every port gives the bridge's behaviour: a new connection replaces the old one, so
a client that crashed without closing its socket can't lock the port. The local option on the raw ports
tells ser2net to ignore the modem-control lines, so a missing DCD signal doesn't stop the data.
Test a raw port (a KAT500, asking for the firmware version):
printf 'RV;' | nc -w 2 192.168.1.50 4001 # expect a reply like RV02.16;ser2net logs to the journal: journalctl -u ser2net -f. For firewall examples (ufw, firewalld, nftables),
see linux.md.