TTNHABBridge
Project TTNHABBridge | |
---|---|
A software bridge between TTN and the HAB network | |
Status | In progress |
Contact | bertrik |
Last Update | 2017-08-14 |
Status
Investigating various pieces of software. I plan to implement this in Java, setting it up as a gradle project.
Next steps:
- get some example JSON from the TTN application MQTT stream
- implement the REST access towards habitat using Java jersey
Introduction
This idea is about using the-things-network as a receiver for amateur balloon telemetry.
Receiving telemetry from amateur balloons is currently typically done on the 434 MHz band using RTTY modulation, with dedicated receivers listening for RTTY-modulated ASCII strings. The operator of each receiver has to prepare his radio setup for receiving the telemetry, by tuning to the correct frequency at the correct time, setting up a dedicated software client that decodes the RTTY modulation and forwards the data to a central system over the internet. The central system accepts data from many such receivers, performs deduplication, keeps track of who received what and updates a nice graphical map of where each balloon is and where the receivers are.
A network like the-things-network can help a lot, it has a lot of gateways already (in the Netherlands at least..), already performs deduplication. It uses LoRa as a modulation scheme which is much more sensitive and much less susceptible to slight tuning errors than RTTY.
In short, the idea is:
- you attach a LoRaWAN transmitter to the balloon
- the LoRaWAN transmitter is pre-configured with a set of keys generated by the TTN
- the balloon broadcasts its telemetry every once in a while (say a few times per minute) and this is picked up by one or more TTN gateways
- the bridge software listens for packets received by the TTN and decodes the payload data into an id, latitude, longitude, altitude of the balloon
- for each packet, we know which gateways received it and where they are. So we can "fake" a client for each gateway and construct an ASCII sentence according to the HAB server conventions
- the HAB server still sees the same messages like it would if there were many traditional receivers, so doesn't need any modification!
This way, the entire things network can be used to receive balloon telemetry! There is no longer a need for radio operators to be present at their receiver at the exact time the balloon is launched, making manual adjustments, etc. The Netherlands is already covered by many TTN gateways, greatly increasing the chance the balloon telemetry will be picked up.
Software
Source code
Source code is available at: https://github.com/bertrik/ttnhabbridge
It's nowhere near ready yet. The README explains the tool chain setup.
Main process
The main process of the bridge is something like this:
- listen to the MQTT stream of the HAB application
- once we get data:
- decode the payload into latitude/longitude/altitude, and encode it into a habhub ASCII sentence with correct CRC, see https://ukhas.org.uk/communication:protocol
- for each gateway that received the data:
- look up the gateway name/lat/long/alt, through some TTN API (and cache it?)
- fake a HAB receiver and make it send the ASCII sentence to the habhub server
Tasks
Stuff to do:
- come up with a simple but flexible way to encode telemetry in a binary packet, to be transmitted over TTN. Perhaps borrow some ideas from how it's done with [1]
- figure out how to receive data from TTN, this is an MQTT stream -> pick an easy-to-use Java MQTT client library. Perhaps this one: https://github.com/fusesource/mqtt-client ?
- figure out the protocol between dl-fldigi and the HAB server -> look into https://github.com/ukhas/habitat-cpp-connector , reverse engineer it and create a Java version. It looks like a couchdb-specific database connection, sending JSON messages! -> it seems we can access this interface as if it were a REST service!
- implement this (in Java for example) and publish it on github!
Implementation
The bridge will be written in Java.
Libraries to use:
- all application settings are kept in a .properties file
- slf4j as the logging interface
- log4j as the logging implementation
- junit/mockito for unit testing
- jetty/jersey/jackson for the REST interface towards habitat
- zip/tar-file for easy installation using the gradle application plugin
- for the MQTT interface: not sure, either eclipse paho or fusesource
Helpful links
From a conversation on #highaltitude:
20:24 < adamgreig> there's a) a python library that's a lot easier to read 20:24 < adamgreig> but b) basically the gist is you just PUT to http://habitat.habhub.org/habitat/_design/payload_telemetry/_update/add_listener/<id> with some stuff 20:24 < adamgreig> http://habitat.readthedocs.io/en/latest/habitat/habitat/habitat/habitat.views.payload_telemetry.html#module-habitat.views.payload_telemetry 20:24 < adamgreig> so you have a new string, you take the sha256 hex digest of the base64 encoded raw data 20:25 < adamgreig> you PUT to that URL with that ID 20:25 < adamgreig> and you include that JSON struture with your callsign/details
C implementation of the interface between the client and the habitat server
I think the interface above can be approached as a REST service, for which is very easy to create a client (and test server) in Java, using a combination of Jetty/Jersey/Jackson libraries.
Settings
Settings likely needed by the bridge application:
- TTN gateway API settings
- URL of the TTN gateway API
- TTN MQTT API settings
- URL of the TTN MQTT API
- application id of the TTN 'hab' application
- application username
- application password
- habitat database settings
- URL of the habitat server
- ...