Showing posts with label digipeater. Show all posts
Showing posts with label digipeater. Show all posts

Saturday, February 1, 2020

How APRS paths work

The APRS packet path is used to control the distribution and retransmission of a packet in the APRS network.

Every now and then someone asks how paths actually work. Having spent quite some time staring at packets that have been digipeated, and decoding them at my little aprs.fi web site, I suspect I might have begun to understand it, so here goes. I'll explain it the long way and begin with a packet without a path, continue with the traditional AX.25 digipeating path, and then go to the APRS world.

No path


Let's assume my call is N0CALL, and I have a generic APRS device which uses the generic APRS tocall (destination callsign) of APRS. The packet, without any digipeaters or path, in the usual text format, as used on the APRS-IS, would look like:

N0CALL>APRS:!1234.56ND01037.50E&

Some of my APRS gear on top of my old bass gear, from left:
Mobilinkd TNC3 for iPhone (prototype unit), Kenwood
TH-D72 (digipeats), an unassembled TNC-X (can digipeat with
a daughtercard added), Argent Data Systems Tracker2 OT2m
(digipeats), Coastal Chipworks TNC-pi on top of a Raspberry
Pi (digipeats with aprx), Byonics TinTrak4 (digipeats),
Kenwood TH-D74 (can digipeat). Moomin for size reference
only. Hartke Kickback 15" 120W. If your APRS hardware
is not shown here yet, my address is on qrz.com. :)
There are two separating characters: the '>' separates the source and destination callsigns, and the ':' separates the packet header from the actual data being transmitted (the APRS formatted position, in this case). A packet like this would not be repeated through any digipeaters, but it could still be directly heard, picked up by an iGate and passed to the APRS-IS on the Internet. Sometimes you might want to do this and configure your transmitter with an empty path.

Classic AX.25 digipeating


The digipeater path may then optionally appear after the destination callsign. Here's a packet that I might transmit, which requests digipeating via two specific digipeaters, in a particular, specified order:

N0CALL>APRS,OH7RDA,OH7RDB:!1234.56ND01037.50E&

Here, the digipeater path is OH7RDA,OH7RDB - the packet should be digipeated by OH7RDA and then OH7RDB. This is how classic AX.25 packet radio digipeating works. APRS is transmitted using AX.25 packet radio packets, so they will follow the old AX.25 rules too. You can certainly do this and most APRS digipeaters will digipeat your packet if you just put the callsign in the path.

When OH7RDA retransmits the packet, it will flip the "has been repeated" bit on for that callsign. It really is a single bit called the "H bit". The packet, in text format, will look like this – note the '*' which indicates the "has been repeated by this digipeater" bit:

N0CALL>APRS,OH7RDA*,OH7RDB:!1234.56ND01037.50E&

Each digipeater will look for the first digipeater callsign in the path which has not been used yet (i.e. the "has been repeated" bit is not on - there's no "*" in there), and then figure out based on that if it should be retransmitted. So, after OH7RDA has retransmitted the packet, and OH7RDB has heard the above packet with OH7RDA*,OH7RDB in it, it will go "oh that's my callsign, I'll retransmit". The resulting packet transmitted by OH7RDB will have OH7RDA*,OH7RDB* as the path! Note that OH7RDB will not retransmit the original packet before OH7RDA has done his part.

To add confusion, and to save a few bytes, usually only the last "*" is usually printed, although the "has been repeated" bit is set on all previous digipeater calls. OH7RDA,OH7RDB,OH7RDC* actually means OH7RDA*,OH7RDB*,OH7RDC* !

Aliases of digipeaters, classic AX.25 packet approach


Digipeaters can be also configured to respond to alias callsigns in addition to their own call. For example, OH7RDA could be configured to repeat a packet which requests digipeating by ALIAS. It may then do one of two things: It can either substitute ALIAS with it's own callsign, or prepend it's own callsign before ALIAS. This varies by digipeater software and its configuration.

N0CALL>APRS,ALIAS:data

When retransmitted by OH7RDA, will become one of:

N0CALL>APRS,OH7RDA*:data
N0CALL>APRS,OH7RDA,ALIAS*:data

The benefit of the second format (digi call prepended) is that, upon receiving such a packet, we know that the originator used ALIAS as the path.

In the classic/old APRS digipeating world, people used aliases like WIDE to ask for any digipeaters to digipeat. Currently, this method is used to digipeat through satellites and the ISS - just use a simple alias of ARISS as the path and it will be digipeated through the RS0ISS digipeater on the ISS or any of the other APRS-supporting satellites on 145.825 MHz! Yes, this means the PATH setting should be just "ARISS". Do not put any of the WIDE or RS0ISS stuff in there, it won't help.

WIDEn-N paths on APRS


This is where it gets interesting and more specific to APRS, as these paths only work on APRS digipeaters. A WIDEn-N path has two integers, n and N. WIDE3-1 would have n of 3, and N of 1. The first integer theoretically means "I'd like to have this packet to be digipeated by this many digipeater hops" (3 in the example of WIDE3-1). The second integer means "there's this many hops left before digipeating stops". When it becomes 0, it won't be digipeated any more, and the "has been repeated" bit will be set (a "*" will appear).

A packet with a path of WIDE3-3, after first retransmission will become WIDE3-2, and then WIDE3-1, and after the third retransmission it'll be WIDE3*. The SSID of 0 is not printed – it's really WIDE3-0 under the hood of the packet but the -0 will not be shown.

The digipeaters supporting this kind of alias usually also prepend their callsigns (all the good ones do, the bad ones don't). And the packet will be often picked up by many digipeaters! So you may see something like this, when both OH7RDA and OH7RDB hear N0CALL, and OH7RDC hears OH7RDB:

N0CALL>APRS,WIDE2-2:data
N0CALL>APRS,OH7RDA*,WIDE2-1:data
N0CALL>APRS,OH7RDB*,WIDE2-1:data
N0CALL>APRS,OH7RDB,OH7RDC,WIDE2*:data

You can also send a packet which originally has a path of WIDE2-1, and it'll be digipeated by digipeaters which are configured to respond to the WIDE2 alias - but only once, since the "remaining hops" number is 1 to begin with. If three digipeaters can hear you, this would result in:

N0CALL>APRS,WIDE2-1:data
N0CALL>APRS,OH7RDA,WIDE2*:data
N0CALL>APRS,OH7RDB,WIDE2*:data
N0CALL>APRS,OH7RDC,WIDE2*:data

A packet of WIDE2-2 is often retransmitted by much more than than 2 digipeaters, since it will be digipeated twice to each direction. Each high-level digipeater in a tower will be often heard by a few digipeaters which are actually quite far away. This is how a WIDE3-3 path might be distributed through a whole country, and a bit to the neighbouring countries as well (rough example but not far from the truth):


This is why we don't usually use paths with more than 2 hops on APRS, and practically never more than 3 (except in some specific cases in rural areas with quiet channels having little traffic). A packet like this can light up the whole APRS network in almost the whole country (or a few states, for you in the larger nations). If a lot of people did this, the channel would become too congested and APRS would stop working as everyone would be transmitting on top of each other. It has happened and we've learned it the hard way.

Fill-in digipeaters


In some areas people set up low-level "fill-in" digipeaters at their homes. They are only configured to respond to the WIDE1 alias, but not WIDE2. Digipeaters higher up at towers and such, serving a wide area, are configured to respond to both WIDE1 and WIDE2 aliases.

The idea is that the fill-in WIDE1 digipeater may well hear packets from nearby transmitters, which might be missed by the higher-up digipeater – due to distance, or because it hears a lot of stations and gets a lot of collisions, or because there are "urban canyon" obstructions. The wide-area-coverage WIDE2 digipeater will be heard by everyone, and there's no need for the fill-in WIDE1 digipeaters to retransmit packets which have already been transmitted by it!

This is accomplished by transmitting a packet with a WIDE1-1,WIDE2-1 path. This is the usual recommended default APRS path, as you might have noticed. It would be first digipeated by any digipeater (fill-in or wide-area), and then by a wide-area WIDE2 digipeater. But only for a total range of 2 hops! This is how it might look, if you could receive the original packet and all the digipeated packets - N1FILL is the fill-in home digipeater, OH7RDA and OH7RDB are higher-up digipeaters which can hear N1FILL but not N0CALL:

N0CALL>APRS,WIDE1-1,WIDE2-1:data
N0CALL>APRS,N1FILL,WIDE1*,WIDE2-1:data
N0CALL>APRS,N1FILL,WIDE1,OH7RDA,WIDE2*:data
N0CALL>APRS,N1FILL,WIDE1,OH7RDB,WIDE2*:data

In reality, many of these fill-in digipeaters are old and dumb TNCs, and can not do callsign prepending. Instead, they just do callsign substitution and replace WIDE1-1 with their own callsign, like this:

N0CALL>APRS,WIDE1-1,WIDE2-1:data
N0CALL>APRS,N1FILL*,WIDE2-1:data

Alternatively, if N1FILL would not receive this packet, but just the higher-up digipeaters directly, then it might go a bit further. OH7RDA heard N0CALL, and subsequently OH6RDA and OH8RDA hear OH7RDA:

N0CALL>APRS,WIDE1-1,WIDE2-1:data
N0CALL>APRS,OH7RDA,WIDE1*,WIDE2-1:data
N0CALL>APRS,OH7RDB,WIDE1,OH6RDA,WIDE2*:data
N0CALL>APRS,OH7RDB,WIDE1,OH8RDA,WIDE2*:data

To send a packet for one hop of digipeating you can choose to use either WIDE1-1 or WIDE2-1. With WIDE1-1 you may have it digipeated through fill-ins and wide-area digis, a WIDE2-1 should only trigger the wide-area ones.

There are also some buggy digipeaters out there which do not add their callsign at all - they just retransmit, and decrement the hop counter of a path element (WIDE2-2 to WIDE2-1 and so on). These are particularly annoying when trying to figure out what happened to a packet.

What about the ,qAR,IGATECALL stuff happening on the APRS-IS?


The APRS-IS servers on the Internet, or alternatively, the iGate itself, append something called the q construct to the packet. After the q construct you'll find the callsign of the iGate which received the packet from a radio and passed it to the Internet:

N0CALL>APRS,WIDE1-1,WIDE2-1,qAR,IGATECALL:data

The q construct does not appear on the radio side - it is only used for tagging additional information to it on the Internet.

Limits and policies


Digipeaters often have policies or filters configured, to prevent digipeating of outright silly paths like WIDE6-6, or paths with a big combined hop length ("WIDE1-1,WIDE2-2,WIDE3-3,WIDE3-3" for a total of 9 hops), or paths where the second integer is larger than the first one (WIDE1-7). Paths like this are considered abusive and cause excess congestion to the APRS network.

Having said that, I think it's alright to have some fun sometimes!

One fun trick is to send a packet, manually, by hand, towards the west, have it travel around the country and then come back to you from the east. You can accomplish this by drawing a map of live digipeaters (aprs.fi can do this for you), and then putting in the callsigns of the digipeaters in the path (up to 8 digis may work): DIGI1,DIGI2,DIGI3,DIGI4,DIGI5. Even though they are many elements in the path, it won't consume much more radio channel time than what a WIDE1-1,WIDE2-2 packet would. Just don't do this with the regularly-beaconing APRS tracker in your car, it'd be silly.

Wednesday, September 17, 2008

OH7RDA digipeater installation

Last weekend we went and installed the OH7RDA APRS digipeater on top of a hospital in Siilinjärvi together with the local hams from my old hometown, Kuopio. The Tarina hospital is located on a hilltop 16 km north of Kuopio, with a pretty good open view in all directions. We used to have a packet radio node at the very same location with 1200 bit/s access on 144 MHz and two 9600 bit/s links on 434 MHz, but the site had been abandoned for quite a while, due to lack of interest by everyone involved.

The old 2-meter radio, a modified Finnish mobile VHF radio with an embedded TNC2 clone (OH-TNC v2), was still in working condition, the power supply turned out to be just fine once one lead which should be attached to the rectifier was reconnected, so we just needed to install a vertical antenna, a new cable, and set up the APRS digipeater software.

(On the left: OH7TB attaching an N connector to the cable)

I obtained a 3*5/8λ vertical (dual-band, 8*5/8λ for 70cm), the guys in Kuopio had the coax and fixed the power supply. I set up an UIDIGI EPROM for the TNC, and replaced the backup batteries (sealed lead-acid) inside the radio-tnc combination.

I couldn't configure the UIDIGI to properly do WIDEn-N digipeating with callsign prepending (only when digipeating the packet for the first time), so I found a surplus miniature PC to run Linux and digi_ned. Now that the digipeater is already installed, it turns out UIDIGI could, perhaps, be configured to do the Right Thing, OH2NJR has been making some progress on that.

Anyway, I put a 2G CompactFlash card in the PC to make it more reliable - spinning hard disks at sites like this tend to break way too often. I installed Debian Linux on it, removed mostly all extra packages to make the installation small and quick to update, and then made sure it doesn't write on the flash card on a regular basis, since that tends to wear out the flash memory over time. That required 4 things:
  1. Moving all temporary directories from disk to memory (/etc/fstab: "tmpfs /tmp tmpfs defaults,noatime 0 0", repeat for /var/tmp and /var/lock too)
  2. Mounting all flash partitions with the noatime option (defaults,noatime in fstab). As an alternative, they could be mounted read-only, but that requires additional tricks.
  3. Disabling stuff from crontab: see /etc/cron.(hourly|daily|weekly|monthly)/, /etc/cron.d/ - it's no use doing much else than log rotation on a box like this. Updating manual and locate databases is a waste of flash write cycles on an unattended mountaintop PC.
  4. Moving all log files to /var/tmp and making sure they are rotated quickly enough so that the partition will not fill up. I edited /etc/syslog.conf to make all system logs to go to a single /var/tmp/messages, and disabled all logging on the digipeater software.
Then I installed and configured digi_ned so that it will digipeat RELAY, WIDE, WIDEn-N and TRACEn-N packets, but only up to WIDE3/TRACE3 - it'll ignore WIDE4-7 packets. No logging after the initial testing.

I also added a small script, run hourly from crontab, which restarts digi_ned if it would happen to die for reason or another. I haven't been running it anywhere before, so I don't know how stable it is, and on an embedded box with 128 megs of non-ECC memory, anything can happen in a few years.

A couple of hardware pieces needed to be purchased for the PC:
  • A CompactFlash - IDE adapter: about 3 USD from DealExtreme - including shipping. Make sure you get the right type for your IDE cable (male/female, correct size - laptop IDE 44 or desktop-style IDE 40 cable)
  • An USB serial dongle to connect to the TNC: less than 5 USD from DealExtreme. The Prolific driver in Linux has been written using reverse engineering techniques, and it doesn't support all of the low speeds below 9600 bit/s, but that doesn't matter here.
  • The CompactFlash card. DealExtreme sells these too, but they aren't much cheaper there. There are "industrial" versions of the cards which should handle more write cycles, but if you can eliminate all of the periodic write cycles (watch your iostat) which happen after the reboot, it doesn't really matter.
Here, OH7FDN and OH7RJ are attaching guy ropes to the 5-meter-long Diamond vertical. Let's hope it lasts for a few years, and replace it with a proper commercial antenna when it breaks.

Some of the DealExtreme stuff doesn't have much quality packed in, but the price is fine. You can't get any better CF adapters anywhere, they're just going to cost more, and they'll still be from the same Chinese factory. Beware, that shop is very addictive. The stuff is just too cheap. I'm suspecting child labor and way-too-low wages for those who do the packing and mailing.

OH7VM and OH7RJ with the installed antenna.

Photos by yours truely. There's some more if you're interested.

The digipeater seems to be working fine. There's not much activity on the north side of Kuopio (yet), but you can take a look at the APRS position packets heard by OH7RDA. It seems to work just fine for a mobile in Nilsiä.

I'm also building a PIC-based logic card for the OH7RAA repeater (145.600 MHz, -1.6 MHz, in Kuopio). The board can already send a CW id, but I haven't yet wired the 1750 Hz and DTMF decoder chips. Yes, the voice on the mobile phone video is mine.