Giter Site home page Giter Site logo

lora-gateway's Introduction

Habitat LoRa Gateway

Part of the LoRa Balloon Tracking System. Receives balloon telemetry and uploads to Sondehub and/or MQTT.

ALL HABHUB SUPPORT HAS BEEN REMOVED since that server has been decommissioned

If you are updating from an old version, please see the MQTT section below to install a library that you will need to build the latest version.

Runs on a Raspberry Pi with 1 or 2 RFM98HW modules attached to the SPI port. Also works with other compatible HopeRF and Semtec LoRa devices.

Connections

If you're making your own board for the Pi, connect the LoRa module(s) like so:

LORA     PI
----     --
3.3V	3.3V Power
GND		Ground
MOSI	MOSI (pin 19)
MISO	MISO (pin 21)
NSS		CE0 (pin 24) (CE1 (pin 26) for 2nd module)
SCK		SLCK
DIO0	Wiring Pi 31 (Pin 28) (Wiring Pi 6 (pin 22) for 2nd module)
DIO5	Wiring Pi 26 (Pin 32) (Wiring Pi 5 (pin 18) for 2nd module). Set to -1 if not connected.

SPI

Enable SPI in raspi-config

Dependencies

sudo apt-get install git libcurl4-openssl-dev libncurses5-dev  libssl-dev

SSDV

Raspberry Pi OS no longer includes SSDV, so you must install SSDV from source as follows:

cd ~
git clone https://github.com/fsphil/ssdv.git
cd ssdv
make
sudo make install

WiringPi

Raspberry Pi OS no longer includes WiringPi, so you must install Wiring Pi from source as follows:

cd ~
git clone https://github.com/WiringPi/WiringPi.git
cd WiringPi
./build

MQTT

MQTT support was added recently, and needs the following library installed::

cd ~ 
mkdir MQTTClients
cd MQTTClients
git clone https://github.com/janderholm/paho.mqtt.c.git
cd paho.mqtt.c
make
sudo make install

Gateway

cd ~ 
git clone https://github.com/PiInTheSky/lora-gateway.git
cd lora-gateway
make
cp gateway-sample.txt gateway.txt

Configuration

The configuration is in the file gateway.txt. Example:

tracker=M0RPI
EnableSondehub=Y
EnableSSDV=Y
LogTelemetry=Y
LogPackets=Y
CallingTimeout=60
JPGFolder=ssdv
CallingTimeout=60
ServerPort=6004
Latitude=51.95023
Longitude=-2.5445 
Radio=LoRa RFM98W
Antenna=868MHz Yagi

frequency_0=434.347
mode_0=1
DIO0_0=31
DIO5_0=26
AFC_0=N

frequency_1=434.475
mode_1=5
DIO0_1=6
DIO5_1=5
AFC_1=Y

The global options are:

tracker=<callsign>.  This is whatever callsign you want to appear as on the tracking map and/or SSDV page.

EnableHabitat=<Y/N>.  Enables uploading of telemetry packets to Habitat.

EnableSondehub=<Y/N>.  Enables uploading of telemetry packets to the amateur Sondehub system.

EnableSSDV=<Y/N>.  Enables uploading of SSDV image packets to the SSDV server.

EnableHABLink=<Y/N>.  Enables uploading of telemetry packets to the hab.link server.

JPGFolder=<folder>.  Tells the gateway where to save local JPEG files built from incoming SSDV packets.

LogTelemetry=<Y/N>.  Enables logging of telemetry packets (ASCII only at present) to telemetry.txt.	

LogPackets=<Y/N>.  Enables logging of packet information (SNR, RSSI, length, type) to packets.txt.	

SMSFolder=<folder>.  Tells the gateway to check for incoming SMS messages or tweets that should be sent to the tracker via the uplink.

CallingTimeout=<seconds>.  Sets a timeout for returning to calling mode after a period with no received packets.

ServerPort=<port>.  Opens a server socket which can have 1 client connected.  Sends JSON telemetry and status information to that client.

HABPort=<port>.  Opens a server socket which can have 1 client connected.  Port is a raw data stream between gateway and HAB (e.g. for Telnet-like communications).  Note: The corresponding functionality at the tracker end has not been published.

DataPort=<port>.  Opens a server socket which can have 1 client connected.  Sends raw telemetry (i.e. $$payload,....) to that client.

HABTimeout=<ms>.  Timeout in case of no response from HAB to raw data uplink.

HABChannel=<channel>.  Specifies LoRa channel (0 or 1) used for telnet-style communications.

Latitude=<decimal position>
Longitude=<decimal position>.  These let you tell the gateway your position, for uploading to habitat, so your listener icon appears on the map in the correct position.
Radio=<radio make/model>.  Lets you specify your radio/board make/model or type. This appears on the map if your listener icon is clicked on.
Antenna=<antenna make/model>.  Lets you specify your antenna make/model or type.  This appears on the map if your listener icon is clicked on.

NetworkLED=<wiring pi pin>
InternetLED=<wiring pi pin>
ActivityLED_0=<wiring pi pin>
ActivityLED_1=<wiring pi pin>.  These are used for LED status indicators. Useful for packaged gateways that don't have a monitor attached.

and the channel-specific options are:

frequency_<n>=<freq in MHz>.  This sets the frequency for LoRa module <n> (0 for first, 1 for second).  e.g. frequency_0=434.450

PPM_<n>=<Parts per million offset of LoRa module.

AFC_<n>=<Y/N>.  Enables or disables automatic frequency control (retunes by the frequency error of last received packet).

mode_<n>=<mode>.  Sets the "mode" for the selected LoRa module.  This offers a simple way of setting the various
				LoRa parameters (SF etc.) in one go.  The modes are:
				
				0 = (normal for telemetry)	Explicit mode, Error coding 4:8, Bandwidth 20.8kHz, SF 11, Low data rate optimize on
				1 = (normal for SSDV) 		Implicit mode, Error coding 4:5, Bandwidth 20.8kHz,  SF 6, Low data rate optimize off
				2 = (normal for repeater)	Explicit mode, Error coding 4:8, Bandwidth 62.5kHz,  SF 8, Low data rate optimize off
				3 = (normal for fast SSDV)	Explicit mode, Error coding 4:6, Bandwidth 250kHz,   SF 7, Low data rate optimize off
				4 = Test mode not for normal use.
				5 = (normal for calling mode)	Explicit mode, Error coding 4:8, Bandwidth 41.7kHz, SF 11, Low data rate optimize off
				
SF_<n>=<Spreading Factor>  e.g. SF_0=7

Bandwidth_<n>=<Bandwidth>.  e.g. Bandwidth_0=41K7.  Options are 7K8, 10K4, 15K6, 20K8, 31K25, 41K7, 62K5, 125K, 250K, 500K

Implicit_<n>=<Y/N>.  e.g. Implicit_0=Y

Coding_<n>=<error_coding>.  e.g. Coding_0=5 (4:5)

lowopt_<n>=<Y/N>.  Enables or disables low data rate optimization.

power_<n>=<power>.  This is the power setting used for uplinks.  Refer to the LoRa manual for details on setting this.  ** Only set values that are legal in your location (for EU see IR2030) **

UplinkTime_0=<seconds>.  When to send any uplink messages, measured as seconds into each cycle.

UplinkCycle_0=<seconds>.  Cycle time for uplinks.  First cycle starts at 00:00:00.  So for uplink time=2 and cycle=30, any transmissions will start at 2 and 32 seconds after each minute.

Lines are commented out with "#" at the start.

If the frequency_n line is commented out, then that channel is disabled.

The program now performs some checks to determine if each selected LoRa module is present or not. If you see a message "RFM not found on Channel" then check the SPI settings/wiring for that channel. If you see "DIO5 pin is misconfigured on Channel" then check the DIO5 setting/wiring. There is no current check for DIO0; any problems with that pin will result in packets not being received.

Uplinks

The gateway can uplink messages to the tracker. Currently this is restricted to time-based uplink slots using "UplinkTime" and "UplinkCycle".

The code uses Linux system time, so the gateway should ideally be using a GPS receiver the GPSD daemon. NTP may prove sufficient however.

For uplinks to work, both UplinkTime and UplinkCycle have to be set for the appropriate channel.

There are currently two types of uplink supported:

-	Uplink of messages from the "SMSFolder" folder.  For this to work, "SMSFolder" has to be defined and present.  The gateway will then check for "*.sms" files in that folder.
-	Uplink of SSD packet re-send requests.  The gateway looks for an "uplink.txt" file in the gateway folder.  The file is created by an external Python script (supplied) which interrogates the SSDV server.

Calling Mode

It is possible for trackers to send out messages on a special "calling channel" as well as telemetry on their main frequency. The calling channel messages state the main frequency and LoRa modes.

This allows for gateways tp be normally left on the calling channel, so they then switch to each tracker as it comes within range.

There's nothing special about "calling mode" except that after a period (CallingTimeout seconds) of time without packets, the gateway returns to its default settings.

To enable calling mode, set the LoRa mode to 5, and the frequency to 433.650MHz.

MQTT

To send telemetry to an MQTT broker, edit the MQTT settings in gateway.txt

e.g.:

# MQTT Config
EnableMQTT=Y
MQTTHost=mqtt_host
MQTTPort=1883
MQTTUser=mqtt_user
MQTTPass=mqtt_password
MQTTClient=mqtt_client_name
MQTTTopic=topic_name

Display

The display has a title bar at the top, scrolling log at the bottom, and 2 channel panels in the middle. Each panel shows something like:

Channel 0 869.8500MHz
Explicit, 250k, SF7, EC4:6
Telemetry 74 bytes
51.95028, -2.54443, 00138
Habitat        SSDV 0000
0s since last packet
Telem Packets = 37
Image Packets = 0
Bad CRC = 0 Bad Type = 0
Packet SNR = 10, RSSI = -67
Freq. Error =   1.0kHz
Current RSSI =  -64

The "Habitat" text appears during uploads to habitat. Normally it will flash up then disappear quickly; if it stays on (not flickering) then the upload is slow.

The "SSDV 0000" text shows the current state of the SSDV upload buffers. There are 4 upload threads and each can handle up to 16 (0-9-A-F) packets in its queue. Normally, even with fast SSDV, uplinks should happen quickly enough for there to be no more than 1 or 2 active threads each with 1 packet being uploaded.

Interactive Features

The following key presses are available. Where appropriate unshifted keys affect Channel 0 and shifted keys affect Channel 1. Many thanks to David Brooke for coding this feature and the AFC.

q	quit

a	increase frequency by 100kHz
z	decrease frequency by 100kHz
s	increase frequency by 10kHz
x	decrease frequency by 10kHz
d	increase frequency by 1kHz
c	decrease frequency by 1kHz

f	toggle AFC

Change History

08/10/2023 - V1.10.6

Use callsign for MQTT client ID

08/10/2023 - V1.10.5

Fully handle all documented Sondehub responses - see https://github.com/projecthorus/sondehub-infra/wiki/API-(Beta)#notes-on-api-response-codes

14/9/2023 - V1.10.4

Clear InUse flag in SH upload so new telemetry is only uploaded once

2/9/2023 - V1.10.3

Limit to 5 retries on SH upload

24/8/2023 - V1.10.2

UKHAS Telemetry is CRC16 checked before being used/uploaded, in addition to the existing LoRa CRC check
Separation of new incoming telemetry and that already being uploaded to Sondehub
Added parsing check on UKHAS telemetry before uploading to Sondehub

13/8/2023 - V1.10.1

Sondehub upload: For errors, log return code, return text and uploaded JSON to errors.txt

1/2023 - V1.10.0

Removed all HABHUB Support

13/10/2022 - V1.9.6

Sondehub upload: Interpret battery voltage as V/mV automatiically
Sondehub upload: Send battery voltage in V

24/09/2022 - V1.9.5

Sondehub datetime field now contains payload timestamp plus current UTC date, corrected if necessary for UTC being the day after the telemetry was created (i.e. telemetry just before midnight UTC received just after midnight)

24/09/2222 - V1.9.4

Include UKHAS sentence as "raw" value sent to sondehub/amateur
Remove any "/" character from listener callsign sent to sondehub/amateur

21/09/2022 - V1.9.3

Scans telemetry for a fieldlist field.  This is metadata defining the sequence of fields in the telemetry string
If found, then this field is used to extract fields such as sats, pred_lat etc., and send them to Sondehub/amateur

10/09/2022 - V1.9.2

Fixed code that uploads to Sondehub so that a zero altitude doesn't result in a 400 response from the server
Any 400 responses are now logged to errors.txt along with the JSON that triggered them
A 400 response is no longer retried

05/09/2022 - V1.9.1

Only upload to Sondehub if telemetry has non-zero latitude or longitude

04/09/2022 - V1.9.0

Added support for uploading telemetry and listener details to the amateur Sondehub system.

16/02/2022 - V1.8.46

Added flexible MQTT topic - $GATEWAY$ gets replaced by gateway callsign; $PAYLOAD$ gets replaced by payload callsign

14/02/2022 - V1.8.45

Added MQTT support (coded by David Johnson G4DPZ)

02/02/2022 - V1.8.44

Fix to uplink of encrypted commands.

19/03/2021 - V1.8.43mbb

Added radio setting to gateway.txt

07/03/2021 - V1.8.43

Fixed erors in setting implicit/explicit bit on config register when sent from JSON client.  Thanks to Alan Hall for spotting this one.

23/02/2021 - V1.8.42

Can now disable use of DIO5 by setting DIO5_0=-1 or DIO5_1=-1

20/02/2021 - V1.8.41

telemetry.txt file includes LoRa channel 0 or 1

08/02/2021 - V1.8.40

Fixed bug where JSON server stopped when asked to set parameters for missing LoRa Module
If you are using the gateway with HAB Base or PADD and just 1 LoRa module you *need* this update.

25/11/2020 - V1.8.39

Send callsign, listener type (LoRa Gateway) and version to hab.link server
Don't include callsign with telemetry messages to hab.link server

06/05/2020 - V1.8.38

Send current frequency to client app, with current RSSI

06/05/2020 - V1.8.37

Reset AFC offset to zero after setting frequency from client app

10/02/2020 - V1.8.35

Fix to RSSI calculation when SNR < 0 (thanks to Alan Hall)

03/02/2020 - V1.8.34

Maximum payload ID (callsign) length in telemetry or calling mode is now 31 (was 15).

03/02/2020 - V1.8.33

Set length of received buffer with strlen() instead of using rx byte count, to avoid sending dross to clients (by Steve Randall)

19/01/2020 - V1.8.32

By proboscide99:

Parameters received in a calling mode packet are saved. If the channel is also used for UpLink, saved
parameters will be restored after transmission. This allows immediate reception with correct parameters
without having to wait for a new calling mode packet.

Fixed bug that forced 255 bytes in missing SSDV packet request (UpLink mode) even with 'explicit headers'

When 'implicit headers' are used for UpLink mode, buffer is NULL terminated to prevent the tracker
from processing garbage (danger)

Both channels may be used for UpLink mode using different timing in the uplink slot (leave 1-2 secs gap)
Timeout for seeking for missing SSDV file 'uplink.txt' reduced from 2sec to 300ms to allow small gap
between channels (see above)

Fixed bug measured frequency offset was retained when AFC timeout occurs (affects value set by keys)

Fixed bug that prevented listener from being uploaded to map (longitude comparison)

Channel number display added to many messages on log console

08/01/2020 - V1.8.31

Fixed bug measured frequency offset was retained when returning to calling mode
Fixed bug where uplink messages were not set to 255 bytes in implicit mode
Fixed bug where listeners with longitude between -180 and -90 were not uploaded to map

13/06/2019 - V1.8.30

Added ability to connect to hab.link server for responsive web dashboards.

13/06/2019 - V1.8.29

Fixed bug where only the first sentence in a multi-sentence packet was uploaded to Habitat
Fixed bug where the message uplink sent 255 bytes even if message was shorter
Fixed bug where after leaving help screen screen shows original frequency not AFC'd frequency
Fixed bug where AFC correction was lost after uplink
AFC correction is now upplied to uplink

09/05/2019 - V1.8.28

Store all payloads from combined packet for JSON transmission to client.

09/05/2019 - V1.8.27

Reduced RSSI server port output frequency from 10Hz to 1Hz

13/04/2019 - V1.8.26

Extended UDP status output with basic channel settings

11/03/2019 - V1.8.25

UDP broadcast output of gateway hostname, IP address and version number.

27/02/2019 - V1.8.24

Better colours
autostart.pdf added to show how to autostart the software and use screen to easily attach to it.
Thanks to Steve Hyde for these.

27/02/2019 - V1.8.23

Chat mode settings

12/09/2018 - V1.8.22

Added PPM setting and correction

09/05/2018 - V1.8.21

Remove superfluous trailing zeroes from the ASCII telemetry produced from HABPack

04/05/2018 - V1.8.20

Included HABPack decoding by Phil Crump M0DNY

16/04/2018 - V1.8.19

Disabled DIO5 check for now as it sometimes disabled use of a working device.

11/04/2018 - V1.8.18

JSON port now sends packet SNR, RSSI and frequency error
Implemented callbacks for when settings are changed
Reprogram LoRa module when frequency, bandwidth etc are changed via JSON port
Update display when frequency, bandwidth, AFC etc are changed via JSON port

10/04/2018 - V1.8.17

JSON port only sends telemetry as it is received, instead of repeatedly
JSON port now sends current RSSI
Append \r\n to sentences sent to data port
JSON port now accepts commands split over multiple packets (e.g. typed commands)
When saving to gateway.txt, permissions are set to RW/RW/RW, and owner/group are maintained
Added Sockets.md to document the available sockets. 

06/04/2018 - V1.8.16

Added raw output of $$... sentences to specified port (UDPPort=xx in gateway.txt)
Added OziMux format output (TELEMETRY,time,lat,lon,alt) to specified port (OziPort=xx)

26/03/2018 - V1.18.15

By Phil Crump:

	Detect if DIO5 isn't correctly mapped (default level != high), warn and disables the channel.

	Detect if the RFM isn't responding (reg 0x42 == 0x00), warn and disables the channel.

	Warn if both receivers are disabled or unconfigured.	

	Removed message queue test code - functionality was behind that of the main code path, and would have required updating for the other changes in this set.

	Added storage of at-time-of-receive-configuration in rx_metadata_t struct. This is copied into the queued telemetry_t structure when a Telemetry Packet is processed.

	Added upload of receiver frequency (with detected offset) to Habitat with payload telemetry ( Issue #15 ). Mostly ported from Pull Req #28 which has been tested by @dbrooke .

	Added logging of additional metadata parameters in packet.log (Issue #5 )

	Removed duplicate 'LogTelemetryPacket()' call in habitat thread. (Already called in ProcessTelemetryMessage)
	
By me:

	Added "Dataport" server socket for raw data (like port 7322 in dl-fldigi)
	Added "<" sentence type, for telemetry that is not to be uploaded to Habitat.

12/02/2018 - V1.8.14

By Phil Crump:

	Added separate thread for listener telemetry/information upload (Listener telemetry is uploaded every 30 minutes to maintain map marker)

	Corrected incremental tuning units 'MHz' -> 'kHz', and added lowercase letters in tuning lookup table
	
By me:

	Added config description to this file for telnet-like HAB communications link

01/10/2017 - V1.8.12

Added null uplink option

Test for incoming null uplink message

21/09/2017 - V1.8.11

Added mode 8 (fastest settings for 62k 10% section of IR2030), for SSDV repeater network

11/09/2017 - V1.8.10

Fixed issue introduced in V1.8.8 which broke processing of repeated telemetry packets (those beginning with a "%" to show repeated)

01/09/2017 - V1.8.9

Added mode 7 for Telnet uplink

Incorporated changes to support Telnet-style terminal to HAB

28/08/2017 - V1.8.8

Do not assume telemetry sentence has a LF at the end

Do not assume telemetry has 2 $ signs at beginning

18/04/2017 - V1.8.7

New help screen added to show the available commands.

Press H to access this feature

Fixed a padding bug on telemetry line !

??/??/2017 - V1.8.6

27/09/2016 - V1.8.5

New config setting - AFCMaxStep - limits AFC delta to this amount in kHz for each new packet
New config setting - AFCTimeout - Resets AFC changes if no packets received in this period (in seconds)
If gateway.txt missing, and gateway-sample.txt present, rename latter as former
Fixed SSDV upload status marker
Fix to frequency format when retuning after calling mode
Some log display messages now only appear if the feature they describe is in use

โ€‹ 15/09/2016 - V1.8.4

Fix to handle disabled channel

14/09/2016 - V1.8.3

Save boolean settings sent by client
Use of atexit() so ncurses is always closed properly on exit
Added an exit-with-message function
Fixed errors where threads were closed on exit even if they hadn't been created (i.e. their functions disabled in the config)
Consistent RSSI calculations that take HF/LF port into account

โ€‹ 14/09/2016 - V1.8.2

Configuration all in a generic array
Generic code to read/write config array/file
Send configuration values to JSON client
Accept commands and new config settings from client
Fixed SMS folder error
Fixed LDRO setting

03/09/2016 - V1.8

Add configuration of uplink frequency, mode and power
LoRa modes now in array so easier to add new ones
Added LoRa mode for uplink
Re-instated logging to telemetry.txt
Fixed pipe errors which happened if packets arrived during program exit
Merged in changes to JSON format
Sends data both LoRa channels in JSON
Config disables CE0 by default (most cards have CE1 only)
Fixed typos in gateway-sample.txt
Accept new SSDV types

25/08/2016 - V1.7

Robert Harrison (RJH) has made numerous changes. 

Highlights include :-

Changed makefile to include -Wall and fixed all warnings generated
Added pipes for Inter-Process Communication 
Moved none thread safe curl funtions from threads and into main()
Added reporting of curl errors to habitat and ssdv threads
Changed color to green but requires 256 color support in your terminal

For putty users please set your terminal as shown

Alt text

when you are connected to your pi

# echo $TERM            # should show something with 256 in

or

# tpu colors            # Should show 256

27/06/2016 - V1.6

Single SSDV upload thread using new API to upload multiple packets at once
Fixed 100% CPU (SSDV thread not sleeping)

โ€‹ 23/05/2016 - V1.5

Better status screen

13/05/2016

Bug fux to local conversion of large SSDV images
Added packet logging

04/04/2016

SSDV 8 buffers
JSON feed instead of old "transition" method

19/02/2016

Fixed listener_information JSON
Added antenna setting to gateway.txt

16/02/2016

JSON telemetry feed via a server port
JPEGFolder setting
Uplink of text messages	to tracker (e.g. accepted from Twitter by an external script)
Uplink of SSDV re-send requests.  These requests are built by an external Python script.
Separate thread for uploading latest telemetry to habitat
4 separate threads for uploading SSDV packets to the SSDV server
Slightly different display layout, with extra information

โ€‹ 07/10/2015

fsphil: Tidied up compiler warnings, makefile, file permissions

โ€‹

lora-gateway's People

Contributors

daveake avatar dbrooke avatar fsphil avatar kevwal avatar matburnham avatar philcrump avatar piinthesky avatar proboscide99 avatar rharrison avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

lora-gateway's Issues

Stop overwriting of SSDV files

In V1.8.19 and possibly earlier, if the SSDV image count wraps from 255 (the maximum SSDV utilises) back to 0, the LoRa Gateway ssdv folder over-writes older images with newer images with the same index count. Could code be added to avoid this, and retain all received images? Perhaps this could be achieved by creating subfolders for each cycle through the SSDV image count on a given day or by prefixing/suffixing the image file name with date and/or time. Obviously, other approaches exist to resolve this behaviour.

Thanks for all the effort maintaining this excellent application.

Steve Hyde - hyde00001

RSSI calculated value ?

Dave, I've noticed in the code several places where;
"readRegister(Channel, REG_PACKET_RSSI) - 157)"
but in another place its
"readRegister(Channel, REG_PACKET_RSSI) - 137)"
The latter corresponds with the manual section
"5.5.5. RSSI in LoRaTM Mode
The RSSI values reported by the LoRaTM modem differ from those expressed by the FSK/OOK modem. The following formula shows the method used to interpret the LoRaTM RSSI values.
R SSI[dB m ] = โ€“137 + RSSI"

Is it me or should they all be -137 as opposed to -157 ?
Geoff

Uplink Messages - send/receive using LoRa Expansion Boards?

Hello! Thank you for all the great work on such an interesting topic.

I recently purchased a couple of the Uputronics Raspberry Pi+ LoRa Expansion Boards (HAB-LORA-4N) to use as receivers in support of a local Amateur Radio Operator / School Teacher who has conducted several successfull HAB flights.

I did not realize that these boards were actually TRANSCEIVERS, not just receivers. What a nice surprise!

After configuring the proper settings to uplink SMS messages, I verified with an SDR that the devices were absolutely transmitting on the specified frequency.

While I see reference to receiving SMS messages in the PITS repository, is there any way other than purchasing a full tracker unit to receive & decode these uplink messages? I have two of the LoRa Expansion boards, but when one is configured as receive-only, all it displays when the other unit transmits an uplink message is: "Unknown packet type is 23h, RSSI -164"

Is it possible to communicate in any usable way between two of these LoRa Expansion Boards since they are in fact transceivers?

Thanks!

-Scott, K4KDR

Integrating lora-gateway as an option to adsb-receiver project

The adsb-receiver project is a set of scripts/rasperbian image to package up various ADS-B data decoders and feeders, which is now expanding to add support for other similar protocols such as the Open Glider Networks FLARM implementation.

So I just wanted to check if your happy for the HAB lora-gateway to be added as an option to install as part of the adsb-receiver project?

Just to confirm I'm not suggesting integrating or sharing data between these various applications, rather to maximise the value of receivers that may currently be deployed for a single application by making it easy to add other applications...

Especially as there may be less motivation for the user to spent time reading install guides for an application other than why they set up the receiver in the first place, but hopefully there is enough in common between enthusiasts of all forms of flying objects to make it worthwhile :)

Incorrect (un-modified) frequency shown when closing the help dialog.

Steps to reproduce:

  • Open lora-gateway (eg. on 434.450)
  • Press 'd'/'D' twice to tune upwards 2 KHz (eg. to 434.452)
  • Press 'h' to open help dialog
  • Press any key to close help dialog
  • Bug: Original frequency is displayed (eg. 434.450), not tuned frequency.
  • Press 'c'/'C' to tune downwards 1 KHz, this will be applied to the actual frequency, not the displayed frequency (eg. 434.451 is now shown)

Sondehub HTTP 202 error

Hi, after starting the gateway, the following error appears after some time
"Unexpected HTTP response 202 for URL 'https://api.v2.sondehub.org/amateur/telemetry'"

But error.txt file contains error 400
Example: 21:20:22: 400 response to: [{"software_name": "LoRa Gateway","software_version": "V1.10.0","uploader_callsign": "TrEsLora868","time_received": "2023-08-18T19:20:22Z","payload_callsign": "TrEs2Lora868","datetime":"2023-08-18T21:19:22Z","lat": 51.24919,"lon": 6.18008,"alt": 48,"frequency": 868.6625,"modulation": "LoRa Mode 1","snr": 7,"rssi": -55,"raw": "$$TrEs2Lora868,173,21:19:22,51.24919,6.18008,00048,12,40.6,0.0,0.000,0123456A9P*70F8","sats":12,"temp":40.6,"batt":0.0,"uploader_position": [ 51.366, 6.413, 0],"uploader_antenna": "868_Self_Construction"}]

The gateway has normal internet, because the photos are transferred correctly to my ftp-server
and ping api.v2.sondehub.org also works correctly.

I attach errors.txt telemetry.txt packets.txt and gateway.txt.
Also attach screenshot showing gateway with error 202 and ping to api.

errors.txt
packets.txt
telemetry.txt
gateway.txt
gateway-1
gateway-2
ping

Want to start a new flight in two weeks on 2023/09/01 :-)
Oliver

PPM correction.

Could you add a simple test to output a carrier on 434.leo so that the modules can be checked against a Ham Radio and a PPM offset could be put back into the Gateway ? That would help at the narrower bandwidths where the drift is much less than the initial offset.

How many end-nodes can be connected

I can not see from here: http://www.hoperf.com/rf/lora/RFM98W.htm which Semtech transceiver this module integrates. I guess it is a custom chip with Semtech IP core.

Anyway, as I understand, for LoRa GW we need:

  1. Concatenator - SX1301:
    http://www.semtech.com/wireless-rf/rf-t ... rs/sx1301/
  2. Transcaiver - SX1276:
    http://www.semtech.com/wireless-rf/rf-t ... rs/sx1276/
  3. I/Q modulator/demodulator - SX1257:
    http://www.semtech.com/wireless-rf/rf-t ... ers/sx1257

How come that this soultion does not need Concatenator and/or I/Q modulator?

How many clinets (end-nodes) can be connected to a GW like this?

Change Mode from keyboard ?

Dave would it be possible to add an extra Keystroke to allow changing modes on the fly ?
Thinking "m" & "M" to toggle thru the modes available for each channel.
On occasions when the Mode is not known, it would save a lot of editing and restarting too find the match!
Perhaps it would also be possible to create a table of Modes defined in the config file or at least the define's rather than being held in the actual code itself ?

LoRa gateway on OpenWRT ?

It will be nice to have this LoRa gateway port on OpenWRT where we have connect HamNET network on 2.3/5.8 Ghz with telemetry network (weather station etc) base on LoRa

Unexpected HTTP response 400 for URL 'https://api.v2.sondehub.org/amateur/telemetry'

Hello,

In v1.9.1 I get, after some time of correctly uploading to Sondehub Amateur, a HTTP response 400. This error keeps rolling over the screen.

So basically, the software is uploading just fine and then after some time I get this error and I need to restart as the error keeps on scrolling over the screen.

Not sure if it is me, the software or sondehub amateur.

See screenshot: https://drive.google.com/file/d/1OuMVPzjV9Tyjx-lXQRKAFpnRxq_NH2oU/view?usp=sharing

Thanks,

Roel.

Michrochip RN2483 Compatibility

Hi all,

I am working on LoRa RN 2483 -raspberry pi c 2011 gateway and I have to set server ip and ports. But on the instructions of semtech network server gateway settings, there are files such as sys_config or global_config but I do not have them on raspberry so I download packet forwarder to get that files. But on the cooking-hacks site where I have instructions for raspberry site, they do not have such instructions and no mention about packet forwarder nor lora gateway application. Do you have any suggestion? Can I use this code for michrochip RN 2483 also?

I have arduPi lib and LoRaWAN lib so far.And will try to connect OTAA join.

Thanks in advance...

DIO5_0=-1 with XL1278-SMT causes 100% CPU usage

I ended up with a batch of XL1278-SMT modules so figured I'd try and protoboard a LoRa gateway.

image

After a bit of faffing with pin numbers, it all seems to work initially, but then it seems to hang (no interactive keystrokes work except Ctrl-C; 100% CPU usage). My additional debug info shows it's correctly reading the SX1278 module version, etc. It seems to go wrong when it starts trying to receive.

image

image

 $ sudo gdb
GNU gdb (Raspbian 8.2.1-2) 8.2.1
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "arm-linux-gnueabihf".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word".
(gdb) attach 680
Attaching to process 680
[New LWP 685]
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/arm-linux-gnueabihf/libthread_db.so.1".
0x0002530c in startReceiving ()
(gdb) info threads
  Id   Target Id                             Frame
* 1    Thread 0x75f15520 (LWP 680) "gateway" 0x0002530c in startReceiving ()
  2    Thread 0x75f14230 (LWP 685) "gateway" __GI___poll (timeout=-1, nfds=1,
    fds=0x75f13c10) at ../sysdeps/unix/sysv/linux/poll.c:29
(gdb) bt
#0  0x0002530c in startReceiving ()
#1  0x0002780c in setupRFM98 ()
#2  0x00012320 in main ()
(gdb) thread 2
[Switching to thread 2 (Thread 0x75f14230 (LWP 685))]
#0  __GI___poll (timeout=-1, nfds=1, fds=0x75f13c10)
    at ../sysdeps/unix/sysv/linux/poll.c:29
29      ../sysdeps/unix/sysv/linux/poll.c: No such file or directory.
(gdb) bt
#0  __GI___poll (timeout=-1, nfds=1, fds=0x75f13c10)
    at ../sysdeps/unix/sysv/linux/poll.c:29
#1  __GI___poll (fds=0x75f13c10, nfds=1, timeout=-1)
    at ../sysdeps/unix/sysv/linux/poll.c:26
#2  0x76e62690 in waitForInterrupt () from /lib/libwiringPi.so
#3  0x76e62730 in interruptHandler () from /lib/libwiringPi.so
#4  0x76d40494 in start_thread (arg=0x75f14230) at pthread_create.c:486
#5  0x76cc3578 in ?? () at ../sysdeps/unix/sysv/linux/arm/clone.S:73
   from /lib/arm-linux-gnueabihf/libc.so.6
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
(gdb)

I'm not great gdb user, but I think it's stuck waiting for an interrupt. I can manually short DIO0 to ground to get it out of this state, but that doesn't really fix the problem.

Has anyone else tried to use a XL1278-SMT module rather than the RFM98 or DRF1278F, etc.? It's got an XS1278 on board, so it should 'just work'. DIO5 is an edge connector rather than through-hole so there's no chance of using that without a breakout.

image

It's quite possibly my wiring given I'm dead-bugging 0.05" pitch, but the fact I'm able to read at least the version register gives me hope.

gateway.txt:

tracker=[removed]
Latitude=[removed]
Longitude=[removed]
Antenna=A tiny bit of wire

##### Config Options #####
EnableHabitat=Y
EnableSSDV=Y
JPGFolder=ssdv
LogTelemetry=Y
LogPackets=Y
CallingTimeout=60
ServerPort=6004
#SMSFolder=./
EnableDev=N

#NetworkLED=22
#InternetLED=23
#ActivityLED_0=21
#ActivityLED_1=29

##### Config CE0 #####
frequency_0=433.650
mode_0=5
AFC_0=Y
#bandwidth_0=125K
#implicit_0=0
#coding_0=5
#sf_0=8
#lowopt_0=0
#power_0=255
DIO0_0=3
DIO5_0=-1

Unable to install dependencies and make

I'm trying to install PiInTheSky on an RPi-II, but I ran in 2 problems.

Trying to install de dependencies I get:
pi@Maarten-pi:~ $ sudo apt-get install git wiringpi libcurl4-openssl-dev libncurses5-dev ssdv
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package ssdv

Ignoring the earlier error I get with the make:
habitat.c:17:23: fatal error: curl/curl.h: No such file or directory
#include <curl/curl.h>

Thanks for all the works sofar, Maarten

Gateway Pi showing received data in gibberish

Hi all, I am sending data from a RFM98 (attached to an ESP32) to the other RFM98 attached to a Raspberry Pi 4b running LoRa gateway. The sending module is using arduino-lora.

The Pi is receiving the data but it's showing an incorrectly formatted string which looks like it's not been decoded correctly:

Screenshot 2023-03-29 at 15 20 14

Not sure what the issue could be. Here's my sending code for reference:

#include <SPI.h>
#include <LoRa.h>

int counter = 0;

void setup() {
  Serial.begin(9600);
  while (!Serial);
  LoRa.setPins(4, 2, 15);
  LoRa.setSignalBandwidth(125E3);
  LoRa.setCodingRate4(7);
  LoRa.setSpreadingFactor(7);
  LoRa.enableCrc();

  if (!LoRa.begin(434E6)) {
    Serial.println("Starting LoRa failed!");
    while (1);
  }
}

void loop() {
  Serial.print("Sending packet: ");
  Serial.println(counter);

  LoRa.beginPacket();
  LoRa.print("$$hadie,");
  LoRa.print(counter);
  LoRa.print(",10:42:10,53.786244,-2.290401,27799.3,1:10\n");
  LoRa.endPacket();

  counter++;

  delay(4000);
}

Lots of: "Unexpected HTTP response 400 for URL 'https://api.v2.sondehub.org/amateur/telemetry'" errors

Hi

I have just upgraded (by moving the old install out the way and doing a fresh install), copied over my gateway.txt, added the "EnableSondehub=Y" entry and I am getting lots of errors:

Unexpected HTTP response 400 for URL 'https://api.v2.sondehub.org/amateur/telemetry'
21:10:46 Ch0: $$KW01,277,20:10:44,52.32273,-0.70620,00093,0,0,5,21.7,3.898,0.66,0.00000,0.00000,0.0,0,-62,6,2,N*B44C
Unexpected HTTP response 400 for URL 'https://api.v2.sondehub.org/amateur/telemetry'
Unexpected HTTP response 400 for URL 'https://api.v2.sondehub.org/amateur/telemetry'
Unexpected HTTP response 400 for URL 'https://api.v2.sondehub.org/amateur/telemetry'
Unexpected HTTP response 400 for URL 'https://api.v2.sondehub.org/amateur/telemetry' 
21:10:47 Ch0: SSDV Packet, Callsign KW01, Image 38, Packet 46
Unexpected HTTP response 400 for URL 'https://api.v2.sondehub.org/amateur/telemetry'
Unexpected HTTP response 400 for URL 'https://api.v2.sondehub.org/amateur/telemetry'
Unexpected HTTP response 400 for URL 'https://api.v2.sondehub.org/amateur/telemetry'
Unexpected HTTP response 400 for URL 'https://api.v2.sondehub.org/amateur/telemetry'
Unexpected HTTP response 400 for URL 'https://api.v2.sondehub.org/amateur/telemetry'
Unexpected HTTP response 400 for URL 'https://api.v2.sondehub.org/amateur/telemetry'
Unexpected HTTP response 400 for URL 'https://api.v2.sondehub.org/amateur/telemetry'
21:10:49 Ch0: $$KW01,278,20:10:47,52.32273,-0.70621,00092,0,0,5,21.8,3.898,0.66,0.00000,0.00000,0.0,0,-62,6,2,N*7226
Unexpected HTTP response 400 for URL 'https://api.v2.sondehub.org/amateur/telemetry'
Unexpected HTTP response 400 for URL 'https://api.v2.sondehub.org/amateur/telemetry'
Unexpected HTTP response 400 for URL 'https://api.v2.sondehub.org/amateur/telemetry'
Unexpected HTTP response 400 for URL 'https://api.v2.sondehub.org/amateur/telemetry'
21:10:50 Ch0: SSDV Packet, Callsign KW01, Image 38, Packet 47
Unexpected HTTP response 400 for URL 'https://api.v2.sondehub.org/amateur/telemetry'
Unexpected HTTP response 400 for URL 'https://api.v2.sondehub.org/amateur/telemetry'
Unexpected HTTP response 400 for URL 'https://api.v2.sondehub.org/amateur/telemetry'
Unexpected HTTP response 400 for URL 'https://api.v2.sondehub.org/amateur/telemetry' 
Unexpected HTTP response 400 for URL 'https://api.v2.sondehub.org/amateur/telemetry'
Unexpected HTTP response 400 for URL 'https://api.v2.sondehub.org/amateur/telemetry'
21:10:52 Ch0: $$KW01,279,20:10:50,52.32275,-0.70622,00092,0,0,5,21.8,3.898,0.66,0.00000,0.00000,0.0,0,-62,6,2,N*9E92
Unexpected HTTP response 400 for URL 'https://api.v2.sondehub.org/amateur/telemetry'
Unexpected HTTP response 400 for URL 'https://api.v2.sondehub.org/amateur/telemetry'
Unexpected HTTP response 400 for URL 'https://api.v2.sondehub.org/amateur/telemetry'
Unexpected HTTP response 400 for URL 'https://api.v2.sondehub.org/amateur/telemetry'

My full gateway.txt is:

##### Your details #####
tracker=G7PMO_PiRx
Latitude=52.322
Longitude=-0.706
Radio=LoRa
Antenna=Colinear

##### Config Options #####
EnableHabitat=Y
EnableSondehub=Y
EnableSSDV=Y
JPGFolder=ssdv
LogTelemetry=Y
LogPackets=Y
CallingTimeout=120
ServerPort=6004
#SMSFolder=./
EnableDev=N

##### Config CE0 #####
#frequency_0=434.650
#frequency_0=434.712
frequency_0=434.718
mode_0=1
AFC_0=N
DIO0_0=3
DIO5_0=26

#bandwidth_0=125K
#implicit_0=0
#coding_0=5
#sf_0=8
#lowopt_0=0
# Power PA_MAX_UK = 0x88 = 136
# Power PA_MAX_BOOST = 0x8F = 143
power_0=136

UplinkTime_0=2
UplinkCycle_0=60
UplinkFrequency_0=434.737
UplinkMode_0=6
SSDVUplink_0=Y

## Callingmode is 433.650 mode 5

##### Config CE1 #####
#frequency_1=869.850
#frequency_1=433.650
frequency_1=434.708
mode_1=1
AFC_1=N
DIO0_1=6
DIO5_1=25

#bandwidth_1=125K
#implicit_1=0
#coding_1=5
#sf_1=8
#lowopt_1=0
#power_1=136

#UplinkTime_1=5
#UplinkCycle_1=60

Any help appretiated.

Thanks very much
Kevin

To include Listener frequency

To add the Listener frequency for each port in the "listener_telemetry" and/or"listener_information" fields. This would allow identification of the freq. in use by payloads that are not well documented / announced in advance via the IRC robot functions.

lora-gateway v1.10.3 uploads tons of packets for each received telemetry packet

As soon as one listener running v 1.10.3 receives a (valid) lora packet hundreds of uploads take place towards the api.v2.sondehub

Tried to bypass the error checking by disabling line 103 , 104 and 144. Does not make a change, as soon as gateway receives a lora packet the upload goes sky high.
errors.txt removed before starting and no errors.txt is created.

Tried to find if either sondehub messes up by enabling a network tool on the pi running lora-gateway, but as soon as one packet is received the number of bytes sent to the IP address which matches the api.v2.sondehub.org goes up a lot , I stopped the gateway when 6 similair connections happened which each where good for over 6000 bytes being sent to the API.

I have not the knowledge to find out why the upload continuous

One radio amateur had saved a local copy of 1.10.0 and switched to that version, which only uploads once after each packet.

Option to run without ncurses

As running nurses based code and in particular ensuring it starts at boot time, which typically requires the use of 'screen', it would be great if it was possible to have an option to start the gateway in a non-ncurses mode?

Perhaps albeit at the expense of the interactive options this would be useful to assist with integrating this into other projects... Is this something that could be considered?

Thanks

Interactive Features

So I have rewired my Lora HAT and it appears to be detected by the gateway binary; however the 'Interactive Features' mentioned in the README do not seem to be functional...

Is the expectation that, as per the docs, pressing the 'q' key should result in the gateway exiting?

LoRa Habitat and SSDV Gateway by M0RPI, M0RJX - V1.8.6

Channel 0 434.451.0 MHz
Implicit, 20.80, SF6, EC4:5

AFC

Tracker = 'hostname'
Channel 0 frequency set to 434.451MHz
LoRa Channel 0 DIO0=31 DIO5=26

UI displays when launched, and then program immediately closes.

As per the issue title, when I launch gateway I see the blue UI (but without any information displayed in the blue section, aside from 'AFC'). The program then closes within 1 second of the UI being visible.

I am running on a Raspberry Pi 3 with the latest 32-bit Bookworm OS. I'm using an Uputronics LoRa HAT with a 433Mhz RFM98 in CE1. gateway is version 1.10.6.

Config is shown below:

`##### Your details #####

tracker=Me
Latitude=53.8
Longitude1.56
Radio=Uptronics LoRa HAT
Antenna=Diamond X-50

Config Options

EnableSondehub=Y
EnableSSDV=Y
JPGFolder=ssdv
LogTelemetry=Y
LogPackets=Y
CallingTimeout=60
ServerPort=6004

NetworkLED=22
InternetLED=23
ActivityLED_0=21
ActivityLED_1=29

Config CE0

#frequency_0=434.250
#mode_0=1
#AFC_0=Y
#bandwidth_0=125K
#implicit_0=0
#coding_0=5
#sf_0=8
#lowopt_0=0
#power_0=255
#DIO0_0=31
#DIO5_0=26
#UplinkTime_0=2
#UplinkCycle_0=60

Config CE1

frequency_1=433.650
mode_1=5
AFC_1=Y
bandwidth_1=125K
implicit_1=0
coding_1=5
sf_1=8
lowopt_1=0
power_1=255
DIO0_1=6
DIO5_1=5
UplinkTime_1=5
UplinkCycle_1=60

#EnableMQTT=Y
#MQTTHost=mqtt_host
#MQTTPort=1883
#MQTTUser=mqtt_user
#MQTTPass=mqtt_password
#MQTTClient=mqtt_client_name
#MQTTTopic=topic_name

#DumpBuffer=Y
#DumpFile=./LORA_dump
`

Received HABpack Corruption when using 2x LoRa Modules fitted

eg.

"$$1900,49,10:05:13,50.183739,-5.802828,7,1,2e534",G8KNN
"$$1900,49,10:05:13,50.183739,-5.802828,27714,14,1.438
5349","GOONHILLY,0x17_pi,M0EYT-BH"
...
"$$1900,2928,10:02:21,50.17802,-5.763629,35689,14,1.4418364","M0NRD,GOONHILLY,0x17_pi,M0EYT-BH,M0RPI/5"
"$$1900,2928,10:02:21,50.17802,-5.763629,0,2,3
c999",G8KNN
...
"$$1900,2920,10:01:55,50.17629,-5.757079,35558,14,1.4199b01","M0NRD,GOONHILLY,M0RPI/5,M0EYT-BH,0x17_pi"
"$$1900,2920,10:01:55,50.17629,-5.757079,1,2,3
654e",G8KNN

Very likely due to the author not considering that some users have 2x LoRa Modules fitted.

Excessive CPU usage.

habitat.c and ssdv.c both need to sleep briefly when there are no packets to upload.

ambiguous variables

Can you confirm the permitted values for the following variables which have =0 in the gateway-example.txt

implicit_0=0
lowopt_0=0

But show Y/N answers in the README.md

Implicit_=<Y/N>. e.g. Implicit_0=Y
lowopt_=<Y/N>. Enables or disables low data rate optimization.

Thanks

getting a compilation error...

... with a 2015-05-05-raspbian-wheezy (sudo apt-get update sudo apt-get upgrade) install on a model a+ equipped with a pits lora expansion board:

pi@pi ~/lora-gateway $ make
gcc -Wall -g -O2 -o gateway.o -c gateway.c
gateway.c:19:20: fatal error: curses.h: No such file or directory
compilation terminated.
makefile:10: recipe for target 'gateway.o' failed
make: *** [gateway.o] Error 1

MaxAFCStep may be used uninitialised

I may be missing something, but If I don`t set MaxAFCstep in config, I am not going to be able to use calling mode to correct drifty payloads.

Get parity error of Hamming decoding

Did you know how to get parity error result when Hamming(6,4) or Hamming(5,4)? In your implementation, you don't implement to report parity error result to the user when Hamming(6,4) or Hamming(5,4). So in the commodity LoRa nodes, is there a way to get the parity error when Hamming(6,4) or Hamming(5,4)? I look forward to hearing from you. Thanks a lot.

New Feature: Additional metadata logging

Would it be possible to expand the logging info. possibly using an additional config. parameter say;
TelemetryMetadata=[Y/N]
The data to consist of modem config., recieve metadata and raw telemetry.
Channel, Frequency, Imp/Exp, Bandwidth, SF, EC, LDRO on/off, Recieve time, AFC, RSSI, SNR, "raw data"
e.g.
0,434.2950MHz,Explicit,20.8k,SF8,EC4:6,LDRO,201508031408,-0.3Khz,-100,20,"Telemetry"

This would then allow much easier understanding of the performance of a given link after the event.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.