APRS Client on a MCU

I wanted to develop an APRS client on an MCU (ESP-32) instead of a SBC (Raspberry Pi).

This client would use a modem/radio combination (Mobilinkd TNC3/Baofeng UV-5R) to get on the air (144.390 MHz). The client connects to the TNC3 over a Bluetooth Low Energy (BLE) link and is secure against Man-In-The-Middle attacks,

Looking around, I settled on hardware similar to that Amazon’s AWS IoT EduKit workshop uses  https://edukit.workshop.aws/en/ but using APRS instead of the internet—of course.

I choose the (relatively) inexpensive M5Stack Core2 unit (https://m5stack.com/products/m5stack-core2-esp32-iot-development-kit). 
Or I might ultimately build my own using an ESP32 development board.

The video demonstrates the first step in using APRS–position beaconing and registering with a station having an APRS-IS (internet) connection. After the first beacon, you must transmit a beacon every 30 minutes to stay current in the system.

Step 1 for APRS, beacon your position and register with APRS-IS.
Step 2 to follow…

Video Notes:
Next time use a script
It’s APRS-IS not -SI
Be cool. Don’t sound so excited when it works!

9 thoughts on “APRS Client on a MCU

  1. An Interesting project — I am looking to do the same for the TNC2, have a micro self contained APRS in the M5stack. Can you share your code ? Also would like to create a WSPR beacon on the same platform (with additional hardware). I’m interested in possible collaboration.


    • TNC2 and 3 are very different. TNC2 uses BT Classic (Serial UART style) TNC3 uses BT Low Energy (services and characteristics). Also TNC3 uses security. Not much reuse. And the code is not ready to release. I will put out a new video when I release.


  2. Hey Bob — I finally got my M5stack talking to my mobilink TNC2 via BR bluetooth. On one screen I put up the mobilinik input volume and carrier detect — I got tired of going from one the Mobilink config app to the APRSdroid app, now they will be in the same m5stack. I had a lot to build up on the m5 (BR, display, multitasking). Now I want to add the APRS beaconing feature as you have done, maybe next a weather beacon, was thinking of an APRS igate later too. There aren’t many APRS units in my area, so I’m limited on my testing ….maybe I’ll find them closer to town. Any hints about your APRS code? thanks.


      • ok. Can I ask a question then. The TNC decodes the message and sends it to a client (like APRS Droid) in KISS format (C0 xxxxxxx C0). I’m pretty sure that an APRS is specifically encoded (Base 91) so that all characters are printable. Is the APRS message inside the KISS wrapper directly or do we have a X.25 wrapper inside the KISS message, and the APRS message inside the X.25. My aim right now is to receive a message and display it on the M5 LCD like you see on the APRSDroid screen. Thanks.


      • Here is the only trick. When they added addressing of variable length, they had no way to signal the end of addresses. So they shift the addresses one bit and signal the end with a 1 in the LSB or something like that. Maybe a 1 in the MSB. That isn’t documented in ax.25 because APRS rides apart of ax.25. That was the only trick. Just read the spec ax.25 and the KISS spec for the rest. I have no more time.


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s