A multiplexing network server for Amateur Radio packet terminal node controllers (TNCs)
Switch branches/tags
Nothing to show
Fetching latest commit…
Cannot retrieve the latest commit at this time.



Download tnc-server

tnc-server is a multiplexing network server for KISS-enabled Amateur Radio packet terminal node controllers (TNCs). It provides a way to share a TNC amongst multiple read/write, read-only, and write-only clients. tnc-server attaches to a serial port and sends all received KISS messages to all connected network clients. The clients talk to tnc-server over TCP and can run locally (on the same machine that's attached to the TNC) or remotely (across the Internet).

The key difference between tnc-server and other remote serial software is that tnc-server understands AX.25 and is designed to allow many simultaneous client connections. Packets sent to tnc-server are written to the serial port in a first-in first-out manner and will not clobber each other. Likewise, incoming RF traffic through the TNC will be distributed to all connected clients

tnc-server is written in the Go Programming Language

Using tnc-server

You will need a computer with a serial port that's attached to a TNC that is able to speak the KISS protocol. tnc-server does not currently support the "TNC2" protocol.

Linux and Mac OS X

Download the appropriate tnc-server package for your architecture from the one of the links below.

./tnc-server [-port=/path/to/serialdevice] [-baud=BAUDRATE] [-listen=IPADDRESS:PORT]

-port - the serial device where the KISS TNC is attached.  Default: /dev/ttyUSB0

-baud - the baudrate to talk to the TNC  Default: 4800

-listen - the IPADDRES:PORT to listen for incoming client connections.  Default:  (all IPs on port 6700)


Download the appropriate tnc-server package for your architecture from the one of the links below. See below for virtual COM port emulation, if you plan on running a Windows-based APRS client.


Open a command-prompt in the directory where you have the tnc-server.exe binary and run it like this:

tnc-server.exe [-port=COMnn] [-baud=BAUDRATE] [-listen=IPADDRESS:PORT]

-port - the serial device where the KISS TNC is attached.  Default: COM1

-baud - the baudrate to talk to the TNC  Default: 4800

-listen - the IPADDRES:PORT to listen for incoming client connections.  Default:  (all IPs on port 6700)


Linux AMD/Intel 64-bit: http://island.nu/tnc-server/tnc-server-linux-amd64.tar.gz

Linux ARMv7 (BeagleBone/BeagleBoard): http://island.nu/tnc-server/tnc-server-linux-arm7.tar.gz

Linux ARMv6 (Raspberry Pi, etc.): http://island.nu/tnc-server/tnc-server-linux-arm6.tar.gz

Mac OS X: http://island.nu/tnc-server/tnc-server-darwin-amd64.tar.gz

Windows 32-bit: http://island.nu/tnc-server/tnc-server-win32.zip

Windows 64-bit: http://island.nu/tnc-server/tnc-server-win64.zip

If you need binaries for another OS/arch like OpenBSD, FreeBSD, etc., let me know and I can make some for you.

Using tnc-server with aprx

tnc-server works very nicely with aprx using aprx's KISS-over-TNC feature. To use it, simply include a stanza like this in your aprx.conf, substituting your own callsign and optional SSID, and the IP address of your tnc-server:

  tcp-device 6700 KISS
  callsign YOURCALL-SSID
  tx-ok true

If you're running aprx on the same machine as tnc-server, using as the IP address. Otherwise, use your machine's IP address here.

Using tnc-server with APRSISCE/32

tnc-server plays nicely with APRSISCE/32. Start APRSISCE/32, navigate to Configure -> Ports -> New Port... and choose Simply KISS. Choose TCP/IP as the port type and fill in the IP and port of your tnc-server instance.

Using with Xastir

To use tnc-server with Xastir, you will need to download and install remserial. You'll run remserial and give it the address of your tnc-server, as well as the local pseudo-tty (Linux version of virtual serial ports) that Xastir will attach to.


% sudo ./remserial -r -p 6700 -s "4800" -l /dev/remserial1 /dev/ptmx
% sudo chmod 666 /dev/remserial1

In this example, we're connecting to a TNC server at IP (port 6700) at 4800 baud and mapping that back to /dev/remserial1. Then we're running chmod to make that virtual serial port read/write accessible to non-root users (you).

Next, fire up Xastir and navigate to the Interface Control menu. Create a new interface (type: Serial KISS TNC) with /dev/remserial1 as the TNC Port. Set your port baud rate to 4800 and choose the iGating options that you want. Check "Allow Transmitting" if you want Xastir to transmit. Choose a reasonable APRS digipeater path for your area. Leave the KISS parameters in their default settings and click Ok. Go back to Interface Control, select your new interface and click the Start button. It should start hearing stations off the air at this point.

Using tnc-server to debug/develop APRS clients

It is possible to use tnc-server and the socat utility to create a virtual null-modem connection that allows you to debug or develop an APRS/AX.25 client without the need for multiple physical RS-232 ports and without a null-modem cable. For more details, see this blog post.

Windows Virtual COM port

You don't need to install a virtual COM port to run tnc-server on Windows. However, if you want to use Windows-based APRS software that expects a COMn port (like COM1, etc), you'll need to use com2tcp from the com0com project.

To get this working, download com0com here. Windows 7 users, download the signed version of com0com here.

Once you have this package installed, you'll run com2tcp like this:

    com2tcp \\.\CNCB0 6700

You'll want to substitute the IP address of your tnc-server. CNCB0 refers to COM2 in com0com parlance. For more info on what to put here, check out the README file for com0com and the README file for com2tcp.

TNCs known to work with tnc-server

Argent Data Tracker2

If you've tested tnc-server with another TNC, let me know and I will add it to this list.

Building your own binaries

If you want to modify tnc-server and build your own binaries, you'll need a working installation of the Go Programming Language. Once you have that...

% go get github.com/tarm/goserial
% go get github.com/tv42/topic
% go build


                    Version 2, December 2004

 Copyright (C) 2017 Chris Snell <chris@chrissnell.com>

 Everyone is permitted to copy and distribute verbatim or modified
 copies of this license document, and changing it is allowed as long
 as the name is changed.