🗼 Kelly APRS iGate
Put MeshCore GPS trackers, and their telemetry, on aprs.fi. Every Kelly Page station can be an iGate.
What it does
A MeshCore node with GPS puts its position in its adverts, the short "here I am" packets it sends. When your Kelly's MeshCore node hears an advert from a node on your list, Kelly turns it into an APRS position and sends it to APRS-IS, and the node appears on aprs.fi under its owner's callsign. For devices you set it up for, Kelly also reads the node's telemetry (battery, solar, temperature, noise floor and so on) and sends it as APRS telemetry, which aprs.fi draws as graphs.
- Your list, your call. Only nodes on your own list are gated. You add them yourself, take the ones Kelly offers (nodes it hears with a callsign in their name), or let the club list add its known users. You can edit, turn off or remove any of them.
- By key, not name. A node on your list is known by its MeshCore public key, not its name (anyone can copy a name). Kelly also checks each advert's digital signature, so a forged one can't use a listed key.
- Receive-only. Positions and telemetry go from MeshCore to APRS-IS only. Nothing goes back onto the air. Messages, channel chat and anything encrypted are never sent anywhere.
- Internet only. Everything goes to APRS-IS through the Kelly bridge's internet connection (
kelly_bridge.pyon your PC or Pi), never over P25. The only thing the iGate fetches over P25 is the club list. - Polite. A tracker is gated at most every 2 minutes, or every 30 seconds if it is moving. The same position twice is dropped. All APRS-IS traffic is rate-limited, and each Kelly waits a random few seconds so several iGates hearing one advert don't all send at once. Kelly only asks a node for its position or telemetry when your node has a direct route to it, never by flooding the mesh.
Set up an iGate
- Start the Kelly bridge on a PC or Pi with internet. That's the iGate's way to APRS-IS.
- Connect your MeshCore node on the LoRa Mesh page (USB, Bluetooth or the bridge), and leave it connected. Kelly only hears what the node hears.
- Open APRS iGate, in the sidebar under Data services.
- Check the Callsign (Kelly fills it in from your station setup) and pick an SSID.
-10is the usual one for an iGate. The badge shows the full call, e.g.VK4AZ-10. - Put some nodes on 🗼 My list (see Your list).
- Try Dry run first. Turn on Gate the MeshCore nodes on my list to APRS-IS and watch the Log: it shows exactly what would be sent. When it looks right, turn Dry run off.
The status badge reads gating when everything is ready. Otherwise it names what's missing: a callsign, an empty list, or no Kelly bridge.
install-pi.html.Options
- Ask the trackers on my list for their position (off by default). A tracker's own adverts can be hours apart. With this on, Kelly asks each listed tracker it has a direct route to for its position, at most every 10 minutes (15 by default). Each request goes over the air, so use it sparingly. The tracker must allow location telemetry to you (see configuring a tracker).
- iGate status line: a short status text under your iGate call, every 30 minutes or more.
- APRS-IS server, filter and limits. The server defaults to
aunz.aprs2.net:14580(if it can't be reached, the bridge triesrotate.aprs2.netnext), and the limits default to one packet per 5 seconds, a burst of 3, and 2 minutes per station. Leave them alone unless you know why.
APRS-IS passcode
You don't enter one. The Kelly bridge works it out from your callsign, and it never leaves the bridge. If you need a different passcode, set KELLY_IGATE_PASS in the bridge's environment.
MeshPRS frames
MeshPRS is a new standard for APRS over MeshCore: stations send positions, messages, telemetry, objects and status as small frames on the #meshprs channel. Turn on Gate MeshPRS frames in the 📡 MeshPRS frames card, and press Add #meshprs to my node if the card says your node doesn't have the channel yet.
A frame reaches aprs.fi only when its callsign is on your list (or the club list) with the same node key, and that node's advert was heard in the last 24 hours. The card counts what was heard, queued, sent and dropped, and why.
Kelly can send MeshPRS frames too. Turn on Send my beacon as a MeshPRS position frame too, pick the SSID, symbol and a short comment, and each time Beacon my position sends your advert, Kelly also sends a position frame on #meshprs, flood or zero-hop to match. Your node needs the #meshprs channel, and other iGates need your node's key on their list (or the club list) to gate it.
Your list
🗼 My list is the only thing that lets a node through. It fills three ways, and the From column shows which:
- mine: pick a node from MeshCore contact (or paste its 64-character key), enter its owner's callsign, an SSID (
-12one-way tracker,-9car,-7handheld), a symbol and a comment, and press Add / update. - node name: when your node hears a node with a callsign in its name, e.g.
VK4RM-1 Solar RptorVK4AZ Tracker, it's offered under Heard nodes with a callsign in their name. Press Add (or Add all), or Dismiss it. Anyone can name a node anything, so only add the ones you recognise. - club list: the known users the club list admin publishes are added for you. While you leave one alone it follows the club list. Once you edit, disable or remove it, it's yours, and a removed one stays removed.
Use Edit, Disable and ✕ in the table. A disabled node stays on the list but isn't gated. A removed or dismissed node isn't offered or added again until you press Forget dismissed nodes.
Telemetry on aprs.fi
APRS telemetry gives each station 5 values (graphed on aprs.fi) and 8 on/off bits. Each device is set up separately, because what a node reports depends on its hardware and firmware. Press Telemetry on a row of your list:
- Pick a Device type to start from: MeshCore repeater (battery, noise floor, transmit airtime, RSSI, SNR), SenseCAP Solar Node, GPS tracker (battery), Weather / environment sensor (battery, temperature, humidity, pressure), or Custom.
- Press Read the node now. Kelly asks the node for its telemetry and, for a repeater, its status, and lists every reading under What the node reports, e.g.
ch 1 voltage 4.05 Vorst:noise -110 dBm. - Adjust the 5 values for this device. Each one has a Source (one of those readings), a Name and Unit as aprs.fi will show them, and a Min and Max. A value goes out as 0-255 across min-max, so choose a range that just covers what you expect, e.g. a single-cell battery 3.0-4.5 V. The Now column shows what would be sent. Under and 8 on/off bits you can add rules such as LowBat when the battery is below 3.5 V.
- Turn on Send telemetry to aprs.fi, pick how often (every 10 minutes or more), and press Save for this device. The preview shows the exact lines.
- Got several of the same device? Press Save as a device type… and pick that type for the others.
- Kelly polls the node only when your node has a direct route to it (it never floods the mesh). If it hasn't one yet, message the node once or wait for the route to be learned. Read the node now always works by hand.
- The node must allow telemetry to you. A repeater may want you logged in (LoRa Mesh page) before it answers a status request. Kelly says so in the log.
- The labels (
PARM,UNIT,EQNS,BITS) go with the first report and every 6 hours after that, or straight away when you change the setup. Look under Telemetry on the station's aprs.fi page.
Get your tracker on aprs.fi
- Name it with your callsign, e.g.
VK4AZ CarorVK4AZ-9. Every Kelly iGate that hears it then offers to add it. The 📍 Beacon my position card tells you whether your own node's name carries your callsign. - Or give the key (the card's Copy key) and the callsign, SSID and symbol you want to a Kelly owner near you, or to the club list admin so every Kelly gets it.
- Each gated station in the iGate's table has an aprs.fi ↗ link.
Buying and configuring a MeshCore GPS tracker
Any MeshCore companion node with a GPS will do. These all run MeshCore. Check the board is listed on the MeshCore web flasher before you buy, because supported boards change:
| Device | Good for | Notes |
|---|---|---|
| Seeed SenseCAP T1000-E | Pocket, keyring, pet | Credit-card size, GPS and battery built in, weatherproof. The easiest choice. |
| RAK WisBlock (RAK4631 core + RAK12500 GNSS module) | Car, bike, fixed | Modular and very low power. Needs a case, a battery and an antenna. |
| LilyGO T-Echo | Handheld | e-paper screen, GPS, nRF52 (long battery life). |
| Heltec Wireless Tracker / LilyGO T-Beam | Car (USB powered) | ESP32 with GPS. Uses more power, fine on a car's USB. |
- Buy the 915 MHz version. Australia uses 915-928 MHz (LIPD class licence). A 433 or 868 MHz unit won't work here.
- Flash the MeshCore companion firmware (not repeater) with the MeshCore web flasher, using Chrome or Edge over USB.
- Set the radio the way the SEQ mesh does (MBUG, wiki.mbug.com.au):
923.125 MHz,62.5 kHz,SF8,CR5, and 2-byte path hashes. Kelly's LoRa Mesh page warns if the hash size is wrong and can fix it. Check the wiki before changing anything, as the settings can change. - In the MeshCore app, turn the GPS on and allow your location in adverts. The names vary between app versions; look under the node's settings or its location settings. Without this, adverts carry no position and there is nothing to gate.
- For position polls and telemetry to work, allow telemetry (location and environment) to your iGate's node, or to your contacts / favourites, in the tracker's telemetry settings.
- Name the node with your callsign (e.g.
VK4AZ Car), so Kelly iGates offer to add it. - Adverts are what get gated, so how often the tracker adverts decides how often it moves on aprs.fi. Keep flood adverts rare. They fill the shared mesh, and MBUG asks for floods to be kept low.
Beacon your own position
No tracker? Your Kelly can send your position out through your own MeshCore node, so another Kelly iGate puts it on aprs.fi. Name your node with your callsign so those iGates offer to add it.
- Position: Kelly's position (GPS › Fixed position, or your radio's GPS) or the node's own GPS.
- Precision: rounds Kelly's position before the node advertises it: exact, about 100 m, about 1 km, or about 10 km. Choose about 1 km if you'd rather not show your house. The node's own GPS isn't rounded.
- Every: at least 15 minutes for a zero-hop advert (heard by nodes in range), at least 60 minutes with Flood (repeated across the mesh).
Kelly gives the node the position, and the node keeps advertising it until it's changed.
Club list admin
The club list is an optional list of known users that every Kelly adds to its owner's own list. It has a version number that only goes up and is signed by an admin key. Every Kelly checks the signature before using a list, and refuses one that doesn't check out or is older than the one it has. It travels over P25 (the iGate's only use of P25): Kelly checks once a day, and parked radios are told when there's a new one. It can also be imported from a file or fetched from an address. The P25X gateway stores and hands out the list, but it has no key and can't change it.
One-time: make and pin the admin key
- In APRS iGate › Club list › Admin, press Generate an admin key. The key stays in this browser only. Press Show my seed and keep that 64-character seed somewhere safe and private (a password manager). Anyone with the seed can sign club lists.
- The panel shows the public key, marked not pinned. Paste it into
ADMIN_KEYSinkelly-page/js/igate-wl.js, copy that file totools/p25x-fault-finding-page/igate-wl.js, deploy the gateway, and release Kelly. From then on every station accepts lists signed by that key. - To use the same key in another browser, press Import my seed there.
Adding, changing and removing stations
- Pick the node from MeshCore contact (if your node has heard it) or paste its 64-character key. Fill in callsign, SSID, symbol and comment, and press Add / update. Use Edit, Disable and ✕ in the table for existing ones.
- Press Sign + publish vN over P25 with your radio connected. The gateway checks the signature and the version, then pushes the list to parked Kelly radios, and the rest pick it up on their daily check. Or use Sign + save a file and upload the file on the dashboard (
POST /api/igate/whitelist), or give it to members to import.
A station you remove from the club list leaves each Kelly's list, unless that owner has edited it. Owners always have the last word on their own list.
Counters and problems
The counters at the top survive a restart. Reset counters clears them.
| Counter | Means | What to do |
|---|---|---|
| Heard (MeshCore) | Positions your node heard | None? Check the node is connected and the trackers' GPS and location-in-adverts are on. |
| Telemetry | Telemetry lines sent (reports and labels) | None? Check the device's telemetry is on, it has a direct route, and the log for "not allowed" or "log in". |
| Not on my list | A position from a key that isn't on your list | Normal: other people's nodes. Add the ones you want. |
| Invalid position | 0,0, out of range, no fix, heard over 10 minutes ago, an older advert replayed, or a bad signature | The log says which. A tracker indoors often has no fix. |
| Duplicate | The same station and position again within 30 s | Normal. |
| Rate-limited | Too soon for that station, or over the overall limit | Normal in a busy area. |
| Couldn't send | No Kelly bridge, or APRS-IS not verified | Check the APRS-IS box: Not verified = the bridge's passcode doesn't match the callsign; No bridge = start kelly_bridge.py. |