What and Why?
Back in the 90s when I was at NYU, I got into using GNU/Linux systems. This was largely due to my digital signal theory professor who would carry his tower to class to demonstrate things on Matlab because there were no computers available that could do what he needed done. There was no concept of storing things in a cloud directory from home so that he could pull it up in class. So he physically carried a grey PC tower on the subway from wherever he was living to the Washington Square campus for class.
We got to talking about nerd stuff and he got me looking at this still new project called Debian (this was around 1996 or so. Debian was about 3 years old at the time). I set up another partition on the computer I had back in my dorm and installed it. I played around with a lot of stuff – mostly audio drivers – to the point where I got really, really good at configuring a kernel. There is a connection here. When I would run Xconfig (when that finally came out!) there was always an Amateur Radio option. I dug just enough to figure out that they were doing computer networking over the air. That was neat, but in 1989 I decided that girls and guitars were more important than getting my ticket and left that on the table for much, much later.
Fast forward to recent days when the talk on The Ham Radio Mastodon Community started about getting some packet activity going with the operators local to that group. A number of quick tutorials popped up. Some links. A couple of funny images. More toots and comments and when my good buddy Scott VE3QBZ started talking about running a BBS on HF, well, I started taking notes.
Constraints
I’ve thought about this bit a lot and I should probably make a separate post about it because I see people fresh into the hobby who get wrapped around the axel with some of things and all it does is get in the way of having fun. So I’m going to lay it out like this. Everything we do – hobbies included – has constraints. When it comes to ham radio I put them into two buckets: Physical and Personal. What’s that mean?
Physical Constraints include things like the gear I have, my location, the ionosphere, the sun, and my budget. Most of those things are what they are and won’t change. Sure, I can trade gear and maybe spend a little more, but I’m probably not going to and I’m certainly not going to change my QTH or the sun anytime soon. These constraints are the ones we learn to work around. In a sense, they’re fun. With these things as given, what can we do? It’s working a puzzle.
Then there are Personal Constraints. These are the barriers we put in our own way. One of mine (right now) is “I am not going to use Microsoft Windows in my shack.” I have a lot of really good reasons for that which I will not bore you with today. The point is that it’s a constraint I constructed. I could remove it, but I won’t. This will complicate my projects in some way, but I believe that it’s necessary. If I get frustrated with this constraint, it’s all on me. I can’t blame the sun for this one.
Side Note. The Physical Constraints are the ones I see new hams struggle with the most. What I want to say is, “If what you have is an attic dipole that isn’t as high off the ground as you want it, well, just keep pushing signals.” You can’t change it (right now) so work with it! It’s so sad to watch perfect get in the way of good.
Again, this is post worthy on its own, but that’s not why I’m here today.
Getting Started
My Personal Constraint above really means that because I already have cracked the code on doing my Winlink activity and WSJT-X on my IC-7300 hooked up to my Mac, I don’t really want to get out of that ecosystem to play with the packet stuff. That means that I’m going to solve this problem on my Mac Mini with my IC-7300.
I’ve been using MacPorts for a long time. That has really helped me out here. I will not go through the drudgery of explaining how I set up MacPorts as there are a bazillion sites out there that will walk you through it. I will say that you’ll need to install Xcode and the Xcode Command Line Utilities. Oh. And Quartz. You can figure that out with Xcode, but if you want to run some of the stuff that was built for X-windows back in the day, you’re gonna need it.
With those updated, you can move on to the software that is used to get on the air.
Direwolf
Direwolf is an AX.25 packet modem/terminal node controller (TNC) and encodes/decodes APRS. What’s that mean? It’s the part that listens and translates for you just like a regular modem. What’s a modem? Get off my lawn!
Direwolf is a strange beast, but it wasn’t awful to install using MacPorts. In fact, I just ran
sudo ports install direwolf
and got on with my day!
OK. That’s a lie. Running that showed me how out of date my Mac Ports install was. I had to run a massive update that took over an hour to complete. Lots and lots had changed. But that’s on me and it’s all part of the fun of running an ecosystem like this. The update to Mac Ports didn’t require me to do anything other than get a glass of water and wander around the house probably irritating the dog.
When Direwolf was finally all installed (without errors!) I started up rigctld and then fired up Direwolf to see what would happen.
Detour
Rigctld is part and parcel of so much ham radio software that I’m going to ignore it in this post. I talk a little bit about rigctld in my post on Portable Digital Operations Setup with wfview but even that doesn’t tell you how to get it going. That’s because it depends on the rig you have and how it’s connected. There are too many variables for me to do anything other than point you at the source documentation and say “I’m sure you’ll be fine!” And you will. Message me if you’re not and maybe I can help.
Direwolf Configuration
Like any good piece of open source software, Direwolf has a configuration file and plenty of command line options. I started off with the documentation done by N6CTA over on https://n6cta.com. There are some notes in there on how to get things moving for Linux users and especially those using a Raspberry Pi setup. What I learned was that the mojo really lives in the audio device settings and THAT was what tripped me up YET AGAIN.
So. The audio interface to the IC-7300 is via USB. On the Mac, this becomes “USB Audio Codec ” which is all well and good.
Wait. Did you catch it? Did you?! YES! There is a SPACE at the end of “USB Audio Codec “. Ya know what? A SPACE is a character. RESPECT THE COMPLETE STRING! Why is it this way? I don’t know and I no longer care. I caught it after messing around for about 30 minutes and now I am at peace.
This means that when I point to the audio device in the ADEVICE parameter, I need that space before the : where I specify the device number for input vs. output. Anyone who is not running a Mac will an IC-7300 will undoubtedly have a different configuration. But this is a starting point.
The only other update I made to the example from the aforementioned tutorial was the PTT device. I didn’t know what I was doing – as we will see shortly – and I didn’t take what N6CTA had on the site at face value. In short, dear reader, I made an assumption based on the way all of my other digital software seems to work and it bit me. I won’t tell you what I did so that it doesn’t poison future searches. Anywho…
Those are the only two items that I updated in the sample configuration. As I gain more experience, I’m sure I will tweak more. For now, this works.
Here is my direwolf.conf file:
#Audio
ADEVICE "USB Audio CODEC :2" "USB Audio CODEC :1"
ACHANNELS 1
FX25TX 1
#Modem
CHANNEL 0
MODEM 300
FRACK 15
RETRY 15
PACLEN 60
MAXFRAME 1
DWAIT 0
SLOTTIME 10
PERSIST 63
TXDELAY 50
TXTAIL 10
FULLDUP OFF
#PTT
PTT RIG 2 localhost:4532
#Control Port
AGWPORT 8000
KISSPORT 0
A Terminal – Paracon
With Direwolf running and showing that it had some audio coming in (and very gently but subtly telling me that the PTT was broken), I needed something that would allow me to send and receive packets. I looked at QtTermTCP and what it would take to get that running on the Mac because that was the package I saw referenced everywhere. Getting it compiled didn’t look like much fun. A little more poking around uncovered the neatest project I’d never heard of: Paracon. This is a packet radio terminal for anything that runs Python. It was written by Martin F N Cooper, KD6YAM. I grabbed it from the link above and ran it. It…just…worked?
I had to tell it my callsign and the IP address of the Direwolf instance for it to connect. In this case that’s good old localhost 127.0.0.1. It was up and running and…um…yeah. It just sat there.
Networks
I quickly ran to Mastodon to post that I had the software running (apparently?) and now just needed to know where to put the dial on my radio. Very quickly, I got back that 14.105 was a great place to start. Network105 is “Keeping Packet Radio Alive” per their groups.io presence. I’d vaguely recalled hearing the name, so I spun the dial and sat there.
Then someone mentioned that I needed to be on LSB instead of USB on 20-meters to catch things. That’s an important detail. I long ago stopped asking why the rules change in such a whimsical way in this very technical hobby. I’m pretty solidly convinced that “because Larry did it that one time” is the origin of most of these oddities.
I put my terminal in the background while I worked on some other stuff. After a little bit, I went back to it and…there was traffic! Decoded traffic! People checking messages! All sorts of madness that I don’t yet understand! This told me that Direwolf and Paracon were both working as intended! I won!
Well, except for transmitting. What on earth is one supposed to do to test that?
Connection Test
I jumped back over to Mastodon and again Scott VE3QBZ was there to help. He told me to grab a station that I could hear that had a -7 in the call. For example KC8JC-7 would be a node which acts like a gateway. If I found one with a -1 such as KC8JC-1 that would likely be a BBS. The idea was to attach myself to a node because if I could do that, I would be sure that I could send and receive. That’s the starting block for all digital modes.
I could indeed hear a node, so I told Paracon to connect to it by clicking Connect and entering the callsign.
Direwolf gave me some output and the rig did not key. This was exactly what I was waiting for. I had some quick back and forth with Mastodon and sure enough, my PTT was set up incorrectly. I’ve corrected it in the config above. I didn’t understand the expectations of the PTT configuration. I still don’t. There is always more to read. If I had only copied and pasted the entirety of N6CTA’s sample config, I would have been fine. Live and learn, right?
With that figured out, I tried again. This time the rig did key up and I DID connect! I misunderstood some of the things I was told earlier but eventually give the J command which gave a listing of stations heard. That was cool! I didn’t really know what to do next, so I gave it a B which is BYE and went back to the world to report success.
Success? Success!
So what did I do? I got two pieces of software installed and configured correctly. I connected to a node and got a listing of stations. I did this on my Mac with my IC-7300. I’m living my best life inside of my personal constraints. That’s pretty cool.
This will be the first post in a series as I get this moving. I’m going to find fun and weird things to do with packet radio. I’d love to see if someone has Hunt The Wumpus on a BBS somewhere. That’d be seriously retro to do over HF. Other, more serious things I would like to look at are keyboard to keyboard QSOs, sending mail messages, and perhaps running my own node. I’m not sure it will go that far, but knowing how to do that seems like something that would be my kind of thing.
Useful Links / References
(I will update this list if/when I find more useful stuff.)
https://n6cta.com
Gives good details on getting things started. It’s where I started.
https://github.com/mfncooper/paracon?tab=readme-ov-file
The Paracon github site.
https://www.qsl.net/zs2pe/Packet/bbs_commands.pdf
Basic BBS packet commands.
https://manpages.org/rigctl
The man page for rigctl.
https://groups.io/g/network105/topics
The groups.io list for Network105.
@kc8jc_0c64oy you're doing good work!
@W1CDN @kc8jc_0c64oy
Thanks!