Skip to main content

A Meshtastic-APRS Gateway

Project description

aprstastic

PyPI - Version PyPI - Python Version


[!WARNING] Legal operation of this software requires an amateur radio license and a valid call sign.

New!

:fire: 2-minute YouTube demo

:fire: Basic position beacons now supported (lat, lon, timestamp)

:fire: Over-the-air discovery and registration now supported. See image below.

:fire: Design doc and future plans: DESIGN.md

Introduction

Here is a proof of concept of a Meshtastic to APRS gateway for Meshtastic users with amateur radio licenses. It runs on stock Meshtastic (915MHz, not HAM band or mode), but uses a pre-registered association between Meshtastic device MAC addresses and amateur radio callsign+SSID to keep things properly attributed and compliant with FCC regulations. To this end, operation requires at least two meshtastic devices: one to serve as the gateway, and the others are the clients. The following image demonstrates how operators can register with the gateway:

Example aprstastic registration flow. Start by sending 'aprs?' to any public channel. Wait for a direct message. Reply with !register CALLSIGN-SSID.

In this scenario, once registered, private message to the gateway will be forwarded to APRS with the "from" call sign KK7CMT-8. Likewise, APRS messages addressed to KK7CMT-8 will be routed to operators Meshtastic device via a Meshtastic direct message.

These interactions are demonstrated in the following YouTube video https://www.youtube.com/watch?v=qUvpZUwl-cY

Each gateway mimics an iGate, and can support multiple Meshtastic users, as long as their call signs and devices are pre-registered.

Addressing APRS messages

How does the gateway know the addressee ("to" address) of APRS packets when all Meshtastic messages are addressed to the gateway device?

To address this, we adopt the "CALLSIGN: " convention. Messages should start with the addressee's call sign, followed by a colon. If this is omitted, then the call sign of the addressee is taken to be that of the previous message (i.e., to respond to the previously received message).

As an example, from Meshtastic you could interact with the Winlink gateway (WLNK-1) as follows:

WLNK-1: ?

The reply from Winlink would be:

NOCALL-1: SP, SMS, L, R#, K#, Y#, F#, P, G, A, I, PR, B (? + cmd for more)

You could then simply enter:

L

and it would assume a reply to WLNK-1, producing the following response:

NOCALL-1: 10/11/2024 23:52:30 No messages.

Compliance

aprstastic only allows messages to transit if they are found in the client device-to-callsign mapping, and are thus attributable to a licensed operator. Random messages published on channels like LongFast, or from other devices do not qualify. All messages are unencrypted before they leave Meshtastic, so all APRS traffic is clear text.

Future Plans

The clear weakness of this gateway is the need to register devices in order for the call sign mapping to work. If every node administrator needs to manage this list, then the system will not scale (and maybe this is fine to control traffic). However, one compelling possibility is to create a central registry where, call signs can be registered to nodes, and the gateways could then subscribe to this list. This would allow a degree of roaming without much need for coordination.

Additional future plans include support for Meshtastic position beacons, and weather reports (both of which have analogs in APRS).

For more details see DESIGN.md

Installation

pip install aprstastic

Configuration

Copy sample_config.yml to config.yml and edit appropriately. Here is a sample:

gateway:
  call_sign: N0CALL # Radio call sign of the gateway itself (analogy, iGate's call sign)
  aprsis_passcode: 12345 # APRS-IS passcode. Search Google for how to get this
  meshtastic_interface: # Only serial devices are supported right now
    type: serial
    device: /dev/ttyACM1 # Name of the serial device if more than one

licensed_operators: # Mapping of Meshtastic device IDs to call signs
  "!12345678": NOCALL-1
  "!87654321": NOCALL-2
  "!12121212": NOCALL-3

Running

Execute the following command at the console.

python -m aprstastic

License

aprstastic is distributed under the terms of the MIT license.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

aprstastic-0.0.1a4.tar.gz (9.5 kB view details)

Uploaded Source

Built Distribution

aprstastic-0.0.1a4-py3-none-any.whl (9.8 kB view details)

Uploaded Python 3

File details

Details for the file aprstastic-0.0.1a4.tar.gz.

File metadata

  • Download URL: aprstastic-0.0.1a4.tar.gz
  • Upload date:
  • Size: 9.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-httpx/0.26.0

File hashes

Hashes for aprstastic-0.0.1a4.tar.gz
Algorithm Hash digest
SHA256 66533de23f1e0fb7c8ba1b73ca13134359e9d9c4e1c4a5a8e86a405a5e65d94f
MD5 33552c9dd5a4db1c0b4ff10e758bb52b
BLAKE2b-256 f623d9d9b4f3929e1e5902c6f8649810d229cc689160c38b962b8956173c06b7

See more details on using hashes here.

File details

Details for the file aprstastic-0.0.1a4-py3-none-any.whl.

File metadata

File hashes

Hashes for aprstastic-0.0.1a4-py3-none-any.whl
Algorithm Hash digest
SHA256 f6f04b9ef6437c0017fdf27bc0da4cddbf697ce58f1d280bfdcb1a2273cea8eb
MD5 bf9bbbefec0ba80120a1d9a602941e8f
BLAKE2b-256 54f016c1284379d21419432801fca3faa4be59269f9d397e3f4f7d428a7ed3a4

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page