APRS – Making it work

Konrad is going to work on a separate Apps Manual, and should add it. Ken

1 Like

I will definitely will be working on the Apps Manual. APRS is definitely a section that I’m going to cover.

–Konrad, WA4OSH

While “one-way” transmissions are not really allowed… I have proved you can send an aprs message to callsign OUTNET and if picked up and sent into the aprsis system it will be captured and re-transmitted.

But I should follow the rules and at least send it to ourselves as a “valid callisign”

Sending to OUTNET is probably the “extreme” of third party traffic

Jim,
First of all, APRS is a one-way transmission. It falls under telemetry in FCC part 97.

This is well known and it’s part of the standard. Look in section 4 Destination Addresses.
OUTNET padded with three blanks is a valid destination in APRS. There are actually quite a few like those.

This station is actually using OUTNET as a source call sign:

And, the APRS system accepted the message. It shows the source is in Corvallis, OR.

But Outernet should not be accepting malformed packets. Everything in red is malformed:

https://aprs.fi/?c=raw&call=KE7WWT*&limit=50&view=normal

References:
FCC Part 97 Regulations
APRS Standard

–Konrad, WA4OSH

Using the existing API, which returns the 50 or so most recent APRS messages, without any idea when they were sent, we can get the 5000 character-long “result”, split it into individual messages (looking for the \n), and then stuff everything into a workable JSON structure using a parser. Then the applications can look at the elements in the data structure and do various things like notify the user that an APRS message came it, flash lights, forward the packet to some other network (Twitter or Email could be examples), etc.

Here’s what the Node-RED flow will look like for an APRS twitter bot.

There’s still a couple of issues.

  1. We need time stamps to know when the messages were received. Do you want to act on old messages or act more than once? A stitch in time saves nine.
  2. We need to find a parser that will accommodate both uncompressed and Mic-E formats and is known to be pretty error free.
  3. The current API can only return a fixed number of records.

It sure would be nice if a real API was provided that returned a useful JSON structure instead of this pathetic mess of a giant character string without time stamps.

–Konrad, WA4OSH

Here is an APRS parser written in JavaScript that might just do the trick:
npm-aprs-parser

I will see what it will take to wrap it inside of a Node-RED node.

–Konrad, WA4OSH

Could this be ported to a arduino feather or esp32

or the email alert thing I use
https://www.pixeltwenty.com/espalert.html

I don’t see outernet changing the standalone-robust sklyark OS, but a second cheap board w/wifi could do a lot.turning on lights, sms or email.

Node-RED needs an operating system to live on, and it needs a little more horsepower.

Arduino has no operating system; it’s not that much of a processor
Although ARM-Cortex (STM-32) can run simple real-time operating systems, it’s still not running the bare minimum.

Don’t you want one of these? Raspberry-Pi Zero (very low-cost).
Node RED on Raspberry Pi zero

–Konrad, WA4OSH

I guess the rpi-zero (the latest with the wifi built in) would be a choice. I had bad luck with add on usb boards that “friction” fit the pins on the zero. I think they have sorta improved that.

My latest board is the STM32L476RG with the “drag and drop” update capabilities.
You just connect the usb and it is seen as a drive. Then drag / drop the compiled bin code and on next restart it is updated. how simple could that be.

Granted you have compile the mbed code or have someone else do it… :slight_smile:

Node-RED is even quicker. You open up a web-browser to 127.0.0.1 (the loop around address), develop and test.

The Pi Zero has a 40-pin HAT connector so you can develop a HAT board or connect directly to the pins.

–Konrad, WA4OSH

Yep. That was me pushing that OUTNET as a callsign to test… That, along with 98% of the other traffic shouldn’t been in that downlink feed…

-liam

1 Like

@Abhishek @ac8dg @kenbarbi @Syed

During this last week, I worked with some Node-RED experts to get us a parser for APRS. It takes a raw text file and parses it into a JSON structure. Using simple constructs, the elements can be examined and used for all sorts of APRS projects on Outernet – receiving APRS messages and acting on them.

The APRS node in blue can be used to read APRS messages, location and weather out of the APRS-IS database, given a call sign.

The new parser node will allow us to parse APRS text data into a JSON file. From that, we should be able to receive APRS messages, location, weather, telemetry data, etc.

But I have an important feature request: TIME STAMP PLEASE I need to know if the text I’m looking at is new or an old record. Could you please add a field to the DIRECT/getTunerStatus that returns the data file name that it was extracted out of? We can extract a timestamp out of that file name and know if we have a new or old message.

JSON naturally ignores new fields. If there is an existing JSON parser that is reading the JSON object created by DIRECT/getTunerStatus, and there’s a new field, it gets ignored. This means that with JSON there does not need to be a strict contract between the source and destination of the object. (unlike XML).

–Konrad, WA4OSH

1 Like

Once we get the time stamp … Here’s what you can do:

Screenshot at 2018-05-19 05-11-05

@Syed, Node-RED runs on top of JavaScript and NodeJS. It can easily run on DreamCatcher.

I have led the horse to water. Please see what I’m trying to show you all.

–Konrad, WA4OSH

Here’s the code for my APRS sandbox:

Blockquote
[{“id”:“c21694ba.9a7888”,“type”:“APRS”,“z”:“98414dd8.afa96”,“name”:“APRS message check”,“creds”:“d1af04cd.002658”,“what”:“msg”,“call”:“KE7WWT*”,“x”:360,“y”:160,“wires”:[[“4ae5a5db.e3cdbc”]]},{“id”:“bebdd22a.86ccd”,“type”:“inject”,“z”:“98414dd8.afa96”,“name”:“”,“topic”:“”,“payload”:“”,“payloadType”:“date”,“repeat”:“”,“crontab”:“”,“once”:false,“onceDelay”:0.1,“x”:140,“y”:160,“wires”:[[“c21694ba.9a7888”]]},{“id”:“4ae5a5db.e3cdbc”,“type”:“debug”,“z”:“98414dd8.afa96”,“name”:“”,“active”:true,“tosidebar”:true,“console”:false,“tostatus”:false,“complete”:“false”,“x”:590,“y”:160,“wires”:},{“id”:“ddac4988.621be8”,“type”:“inject”,“z”:“98414dd8.afa96”,“name”:“”,“topic”:“”,“payload”:“”,“payloadType”:“date”,“repeat”:“”,“crontab”:“”,“once”:false,“onceDelay”:0.1,“x”:140,“y”:240,“wires”:[[“dd65e98c.2ffbb8”]]},{“id”:“dd65e98c.2ffbb8”,“type”:“APRS”,“z”:“98414dd8.afa96”,“name”:“APRS location “,“creds”:“d1af04cd.002658”,“what”:“loc”,“call”:“WA4OSH-1”,“x”:340,“y”:240,“wires”:[[“bc8d3951.b0cbe8”]]},{“id”:“bc8d3951.b0cbe8”,“type”:“debug”,“z”:“98414dd8.afa96”,“name”:””,“active”:true,“tosidebar”:true,“console”:false,“tostatus”:false,“complete”:“false”,“x”:590,“y”:240,“wires”:},{“id”:“d9a97a1d.9dfb38”,“type”:“APRS”,“z”:“98414dd8.afa96”,“name”:“APRS Weather”,“creds”:“d1af04cd.002658”,“what”:“wx”,“call”:“DW7537”,“x”:340,“y”:320,“wires”:[[“e82eefc5.590a3”]]},{“id”:“7c1efa96.66d354”,“type”:“inject”,“z”:“98414dd8.afa96”,“name”:“”,“topic”:“”,“payload”:“”,“payloadType”:“date”,“repeat”:“”,“crontab”:“”,“once”:false,“onceDelay”:0.1,“x”:140,“y”:320,“wires”:[[“d9a97a1d.9dfb38”]]},{“id”:“e82eefc5.590a3”,“type”:“debug”,“z”:“98414dd8.afa96”,“name”:“”,“active”:true,“tosidebar”:true,“console”:false,“tostatus”:false,“complete”:“false”,“x”:590,“y”:320,“wires”:},{“id”:“1d193799.a02188”,“type”:“debug”,“z”:“98414dd8.afa96”,“name”:“”,“active”:true,“tosidebar”:true,“console”:true,“tostatus”:false,“complete”:“true”,“x”:610,“y”:400,“wires”:},{“id”:“22ea6f1c.c1fe8”,“type”:“inject”,“z”:“98414dd8.afa96”,“name”:“inject raw APRS text”,“topic”:“”,“payload”:“"SQ7PFS-10>APRS,TCPIP*,qAC,T2SYDNEY:@085502h4903.50N/07201.75W-PHG5132Hello world/A=001234"”,“payloadType”:“str”,“repeat”:“”,“crontab”:“”,“once”:false,“onceDelay”:0.1,“x”:170,“y”:400,“wires”:[[“9148eaf2.e68858”]]},{“id”:“9148eaf2.e68858”,“type”:“aprs-parser”,“z”:“98414dd8.afa96”,“name”:“”,“x”:390,“y”:400,“wires”:[[“1d193799.a02188”]]},{“id”:“d1af04cd.002658”,“type”:“aprsfi-config”,“z”:“”,“apiKEY”:“52260.UVwuTMuBrFG1nw”}]

Anyone who has installed node red can import this. Oh … and by the way, we could send Node-RED programs via Outernet.

–Konrad, WA4OSH

Second vote for the timestamp. The data is useless without it. Regardless if the creator of APRS, God, or someone else, has said told you it has to be a specific format.

-l

1 Like

@Syed I was beginning to think everyone’s eyes were glazed-over, not getting it.

Yesterday I get a call from my son (who is also a ham) who had the starter fail on his truck. He was 21 miles past the last house in the middle of this wilderness. He’s been camping along the north fork of the Snoqualmie river since the last five years. Suppose were to send his APRS location messages and adding OUTNET in the message part.

If I had a tool that looked into the database. How would I know that the data coming back from my query into the database was not from two weeks ago?

Oh did I mention that on the way there, there were TV crews and cop cars all over the place?

Cougar attack near North Bend

Well, fortunately, the one that died wasn’t my son. Chase was 14 miles further into the forest than where the Cougar was.

I can’t rely on APRS data on OUTNET because it has no time stamp. I see no purpose in the APRS as it stands currently. It’s worthless.

–Konrad, WA4OSH

I guess how I can move forward from here is completely scrap the API that’s been provided, and dig into the file system directly and create a usable JSON data structure, that will then contain the correct data - the file names and the all of the messages found in the file names. The file name will be parsed to produce create the time stamp entries in the JSON data and the contents of the files will be used to create a text of the APRS message. The aprs-parser can be used to parse the APRS text message into another JSON data structure, which can then feed into the decision-making part of the flow to do whatever is needed.

–Konrad, WA4OSH