| |

Dynamically Mapping Amateur Radio Packet Stations


After getting involved in packet radio a couple years ago, I quickly though to myself how useful it would be if there were a map of network nodes so that operators could have a visualization of the nodes they could connect to. One could determine how many hops it would take to reach their intended destination.

Recently, I set up a BPQ node and was able to connect to other node stations via the AX25 over IP, or AXIP, protocol. This gave me access to a wealth of information from other stations – most notably their node list and their MHeard list, which is a list of stations that can be heard via radio.

Because my node is accessible via telnet, I realized that I could write a Python script to log into it and retrieve my node and MHeard list. Easy enough. However, I then realized that I could take it a step further and log into my node, and then connect to another node to get their node and MHeard lists.

So, I got to work.

I decided to use a PostGIS (GIS extension for PostgreSQL) backend for the data storage. Working with PostGIS is a breeze and nicely integrates with the technology stack I used. On top of PostGIS, I utilized GeoServer, a Java server application that converts PostGIS data into Web Feature Services (WFS) and Web Map Service (WMS), ways of allowing retrieval of GIS data over the internet. The next step was the frontend. For creating the map, I used JavaScript with the OpenLayers API. This allowed me to feature several map layers, including:

  • Local operators (Those my radio can hear over the air)
  • Local Digipeaters (Stations that repeat signals, that I can hear over the air)
  • Nodes that I’m connected to via AXIP
  • Remote digipeaters ( Those that I detected from logging into remote nodes)
  • Remote operators (Those that I detected from logging into remote notes)
  • Network map

The network map shows the links between stations who share a common node. This is intended to show the extent of connectivity of an area.

My MHeard list is checked every 15 minutes, ensuring that stations aren’t missed. Packet is busy here in Aurora, so frequent checks are necessary. My node list is checked every three hours for new NET/ROM nodes which may have appeared. Lastly, remote MH lists are checked at random once every half hour.

Currently, the plan is to hide nodes, digipeaters, and operators which haven’t been heard in the past three months in order to keep the map relevant.

I’m happy with the finished product after having put a lot of work into it. I hope others find it useful. If you have any ideas or comments, please leave a comment, or send me an email at kd5lpb at arrl.org

Similar Posts


  1. Bravo! Automation is always nice and you came up with a great method. As author of the Nationwide Amateur Radio Packet Directory http://www.ww2bsa.org and being extremely intimate with active packet stations in the USA, I’ve noticed a lot of “holes” on your map and am wondering why those active stations aren’t showing up. Otherwise, nice job.

  2. Hi Dr. Lance,

    I saw your page a while back and noticed the same.

    I assume you’re collecting data by hand? My method connects to remote BPQ nodes and parses their MHeard lists, so there will be missing data where I don’t have a connection. I’ve also noticed that there are a number of nodes with empty MH lists (?), so I don’t get anything from them. I hope that, over time, the holes will be more filled in. Relying on other node’s lists isn’t ideal, but I couldn’t think of any other method.

    I do drop points (via a SQL view) if they haven’t been heard in three months in an attempt to keep it up to date.

    Thanks for the comment!

  3. Hi,
    I am looking to get back into Packet, last time I used it was back in the mid to late 90s. Live in Colorado Springs. Have you though of putting “ghost” on your map? Show previous nodes in a different color and how long it has been from the last time they were heard. Also, it might be cool to be able to click on a node and see a spider web of what nodes it can see. Your all’s websites are cool. Just expressing some ideas I have had.

    What equipment and software do you all recommend? I was recently looking at Digipi and NinoTNC.


    1. Hey Johnny!

      Those are some good ideas and I may implement some of them next time I play with the map.

      As for equipment, I’ve done pretty well with a Kenwood D710G, and a Raspberry Pi running BPQ32. I think the D710G is hard to find now, but any rig that works in KISS mode should do.

      I was down in the Springs a few weekends ago with my D74A and used that as a TNC. There’s a lot of APRS and packet going around there!

  4. Hi Robert, Checking in to see how your progress is coming along. I’m a user, not a programmer. C++ was the last language I attempted LOL so please be patient with me. The script you wrote polls the BPQ nodes for other nodes that are connected as well as the MHEARD list? Can you filter out what data you get?

    I’m wondering if there is a way to get stations such as mailboxes, DXClusters, etc. that might be on a frequency that doesn’t have a BPQ node.

    Also, have you checked XROUTER Network? That might expand your coverage.

    PS – Call me Chris

    1. Hey Chris,

      Thanks for reaching out! I haven’t updated the map’s code in some time (other than the Python backend), because I’ve gotten pretty busy with work. I love C++ and it’s the language I prefer to spend time in!
      I’m not sure if I could get those stations, unless they had some sort of uniform identifier that would make it easy to code. I do have some backend code that attempts to detect if the node is a BPQ node or not, but it’s not quite 100% yet so it’s not displayed on the map.

      I haven’t checked the XROUTER network, but I’ll have to check it out! Thanks for the tip.

  5. Hi Robert,

    I am wondering if you have given any thought to making the code for your packet radio map available to others? I would like to adapt it to listen to direwolf as well as the AX25 port on my server and see if maybe this project could be resurrected a bit.

    Thank you!
    -Chris Molnar

Leave a Reply