344 lines
14 KiB
C
344 lines
14 KiB
C
// 1-channel LoRa Gateway for ESP32 and ESP8266
|
|
// Copyright (c) Maarten Westenberg 2016-2020
|
|
|
|
// Easy LoRa
|
|
// #define VERSION "V.6.2.4.EU868; PlatformIO 200428n"
|
|
#define VERSION "V.6.2.4.EU433"
|
|
//
|
|
// Based on work done by Thomas Telkamp for Raspberry PI 1ch gateway and many others.
|
|
//
|
|
// are made available under the terms of the MIT License
|
|
// which accompanies this distribution, and is available at
|
|
// https://opensource.org/licenses/mit-license.php
|
|
//
|
|
// NO WARRANTY OF ANY KIND IS PROVIDED
|
|
//
|
|
// Author: Maarten Westenberg (mw12554@hotmail.com)
|
|
//
|
|
// This file contains a number of compile-time settings that can be set on (=1) or off (=0)
|
|
// The disadvantage of compile time is minor compared to the memory gain of not having
|
|
// too much code compiled and loaded on your ESP device.
|
|
//
|
|
// NOTE:
|
|
// If version is for ESP32 Heltec board, compile with ESP32 setting and board
|
|
// "ESP32 Dev Module" or "Heltec WiFi Lora 32"
|
|
//
|
|
// For ESP8266 Wemos: compile with "Wemos R1 D1" and choose
|
|
// the right _PIN_OUT below. Selecting Oled while that is not connected does not
|
|
// really matter (so you can leave that in).
|
|
//
|
|
// The source has been optimized for PlatformIO usage. That means some variables
|
|
// can be defined in the .platformio.ini file. Please look at the example file to see
|
|
// how to set these #defines
|
|
//
|
|
// ========================================================================================
|
|
|
|
|
|
// Define whether we should do a formatting of SPIFFS when starting the gateway
|
|
// This is usually a good idea if the webserver is interrupted halfway a writing
|
|
// operation. Also to be used when software is upgraded
|
|
// Normally, value 0 is a good default and should not be changed.
|
|
#if !defined _SPIFFS_FORMAT
|
|
# define _SPIFFS_FORMAT 0
|
|
#endif
|
|
|
|
|
|
// Allows configuration through WifiManager AP setup. Must be 0 or 1
|
|
#if !defined _WIFIMANAGER
|
|
# define _WIFIMANAGER 0
|
|
#endif
|
|
|
|
|
|
// Debug message will be put on Serial is this one is set.
|
|
// If set to 0, no printing to USB devices is done.
|
|
// Set to 1 it will print all user level messages (with correct debug set)
|
|
// If set to 2 it will also print interrupt messages (not recommended)
|
|
#if !defined _DUSB
|
|
# define _DUSB 1
|
|
#endif
|
|
|
|
|
|
// Define the monitor screen. When it is greater than 0 then logging is displayed in
|
|
// the special screen at the GUI.
|
|
// If _DUSB is also set to 1 then most messages will also be copied to USB devices.
|
|
#if !defined _MONITOR
|
|
#define _MONITOR 1
|
|
#endif
|
|
|
|
|
|
// Gather statistics on sensor and Wifi status
|
|
// 0= No statistics
|
|
// 1= Keep track of messages statistics, number determined by _MAXSTAT
|
|
// 2= Option 1 + Keep track of messages received PER each SF (default)
|
|
// 3= See Option 2, but with extra channel info (Not used when Hopping is not selected)
|
|
#define _STATISTICS 3
|
|
|
|
|
|
// Define the frequency band the gateway will listen on. Valid options are
|
|
// EU863_870 Europe
|
|
// US902_928 North America
|
|
// AU925_928 Australia
|
|
// CN470_510 China
|
|
// IN865_867 India
|
|
// CN779-787 (Not Used!)
|
|
// EU433 Europe
|
|
// AS923 (Not Used)
|
|
// You can find the definitions in "loraModem.h" and frequencies in
|
|
// See https://www.thethingsnetwork.org/docs/lorawan/frequency-plans.html
|
|
// #define EU863_870 1 // Easy LoRa
|
|
#define EU433 0 // Easy LoRa, Channel 0, 433.175 MHz/125 primary
|
|
|
|
// Define the CLASS mode of the gateway
|
|
// A: Baseline Class
|
|
// B: Beacon/Battery Class
|
|
// C: Continuous Listen Class
|
|
#define _CLASS "A"
|
|
|
|
|
|
// Define whether to use the old Semtech gateway API, which is still supported by TTN,
|
|
// but is more lightweight than the new TTN tcp based protocol.
|
|
// NOTE: Only one of the two should be defined! TTN Router project has stopped
|
|
//
|
|
#define _UDPROUTER 1
|
|
//#define _TTNROUTER 1
|
|
|
|
|
|
// The spreading factor is the most important parameter to set for a single channel
|
|
// gateway. It specifies the speed/datarate in which the gateway and node communicate.
|
|
// As the name says, in principle the single channel gateway listens to one channel/frequency
|
|
// and to one spreading factor only.
|
|
// This parameters contains the default value of SF, the actual version can be set with
|
|
// the webserver and it will be stored in SPIFF
|
|
// NOTE: The frequency is set in the loraModem.h file and is default 868.100000 MHz.
|
|
//#define _SPREADING SF9 // Easy LoRa
|
|
#define _SPREADING SF10 // Easy LoRa
|
|
|
|
// Channel Activity Detection
|
|
// This function will scan for valid LoRa headers and determine the Spreading
|
|
// factor accordingly. If set to 1 we will use this function which means the
|
|
// 1-channel gateway will become even more versatile. If set to 0 we will use the
|
|
// continuous listen mode.
|
|
// Using this function means that we HAVE to use more dio pins on the RFM95/sx1276
|
|
// device and also connect enable dio1 to detect this state.
|
|
// #define _CAD 1 // Easy LoRa
|
|
#define _CAD 0 // Easy LoRa
|
|
|
|
|
|
// CRCCHECK
|
|
// Defines whether we should check on the CRC of RXDONE messages (see stateMachine.ino)
|
|
// This should prevent us from getting a lot os stranges messgages of unknown nodes.
|
|
// Note: DIO3 must be connected for this to work (Heltec and later Wemos gateways).
|
|
// #define _CRCCHECK 1 // Easy LoRa
|
|
#define _CRCCHECK 0 // Easy LoRa
|
|
|
|
// Definitions for the admin webserver.
|
|
// _SERVER determines whether or not the admin webpage is included in the sketch.
|
|
// Normally, leave it in!
|
|
#define _SERVER 1 // Define local WebServer only if this define is set
|
|
#define _REFRESH 1 // Allow the webserver refresh or not?
|
|
#define _SERVERPORT 80 // Local webserver port (normally 80)
|
|
#define _MAXBUFSIZE 192 // Must be larger than 128, but small enough to work
|
|
|
|
|
|
// Definitions for over the air updates. At the moment we support OTA with IDE
|
|
// Make sure that tou have installed Python version 2.7 and have Bonjour in your network.
|
|
// Bonjour is included in iTunes (which is free) and OTA is recommended to install
|
|
// the firmware on your router witout having to be really close to the gateway and
|
|
// connect with USB.
|
|
#define _OTA 1
|
|
|
|
|
|
// We support a few pin-out configurations out-of-the-box: HALLARD, COMPRESULT and
|
|
// Heltec/TTGO ESP32.
|
|
// If you use one of these, just set the parameter to the right value.
|
|
// If your pin definitions are different, update the loraModem.h file to reflect the
|
|
// hardware settings.
|
|
// 1: HALLARD
|
|
// 2: COMRESULT pin out
|
|
// 3: ESP32, Wemos pin out (Not used)
|
|
// 4: ESP32, Heltec and TTGO pin out (should work for Heltec, 433 and Oled too).
|
|
// 5: Other, define your own in loraModem.h (does not include GPS Code)
|
|
#if !defined _PIN_OUT
|
|
# define _PIN_OUT 1
|
|
#endif
|
|
|
|
|
|
// Single channel gateways if they behave strict should only use one frequency
|
|
// channel and one, or in case _CAD all, spreading factors.
|
|
// The TTN backend replies on RX1 timeslot for spreading factors SF9-SF12.
|
|
// If the 1ch gateway is working in and for nodes that ONLY transmit and receive on the set
|
|
// and agreed frequency and spreading factor. make sure to set STRICT to 1.
|
|
// In this case, the frequency and spreading factor for downlink messages is adapted by this
|
|
// gateway
|
|
// NOTE: If your node has only one frequency enabled and one SF, you must set this to 1
|
|
// in order to receive downlink messages. This is the default mode.
|
|
// NOTE: In all other cases, value 0 works for most gateways with CAD enabled
|
|
#if !defined _STRICT_1CH
|
|
# define _STRICT_1CH 1
|
|
#endif //_STRICT_1CH
|
|
|
|
//
|
|
// Also, normally the server will respond with SF12 in the RX2 timeslot.
|
|
// For TTN, the RX2 timeslot is SF9, so we should use that one for TTN
|
|
#if !defined _RXDELAY1
|
|
# define _RXDELAY1 1000
|
|
#endif
|
|
|
|
#if !defined _RX2_SF
|
|
# define _RX2_SF 9
|
|
#endif
|
|
|
|
|
|
// This section defines whether we use the gateway as a repeater
|
|
// For his, we use another output channel as the channel (default==0) we are
|
|
// receiving the messages on.
|
|
#define _REPEATER 0 // Easy LoRa, To note on this item
|
|
|
|
|
|
// Will we use Mutex or not?
|
|
// +SPI is input for SPI, SPO is output for SPI
|
|
#define _MUTEX 0
|
|
|
|
|
|
// Define if Oled Display is connected to I2C bus. Note that defining an Oled display does not
|
|
// impact performance negatively, certainly if no Oled is connected. Wrong Oled will not show
|
|
// sensible results on the Oled display
|
|
// _OLED==0; No Oled display connected
|
|
// _OLED==1; 0.9" Oled Screen based on SSD1306
|
|
// _OLED==2; 1.3" Oled screens for Wemos, 128x64 SH1106
|
|
#if !defined _OLED
|
|
// #define _OLED 1 // Easy LoRa
|
|
#define _OLED 0 // Easy LoRa
|
|
#endif
|
|
|
|
|
|
// Define whether we want to manage the gateway over UDP (next to management
|
|
// thru webinterface).
|
|
// This will allow us to send messages over the UDP connection to manage the gateway
|
|
// and its parameters. Sometimes the gateway is not accesible from remote,
|
|
// in this case we would allow it to use the SERVER UDP connection to receive
|
|
// messages as well.
|
|
// NOTE: Be aware that these messages are NOT LoRa and NOT LoRa Gateway spec compliant.
|
|
// However that should not interfere with regular gateway operation but instead offer
|
|
// functions to set/reset certain parameters from remote.
|
|
#define _GATEWAYMGT 0 // Easy LoRa, To note on this item
|
|
|
|
|
|
// Do extensive logging to file
|
|
// Use the ESP8266 SPIFS filesystem to do extensive logging.
|
|
// We must take care that the filesystem never(!) is full, and for that purpose we
|
|
// rather have new records/line of statistics than very old.
|
|
// Of course we must store enough records to make the filesystem work
|
|
#if !defined _STAT_LOG
|
|
# define _STAT_LOG 0
|
|
#endif //_STAT_LOG
|
|
|
|
|
|
// Set the Server Settings (IMPORTANT)
|
|
#define _LOCUDPPORT 1700 // UDP port of gateway! Often 1700 or 1701 is used for upstream comms
|
|
|
|
// Timing
|
|
#define _PULL_INTERVAL 20 // PULL_DATA messages to server to get downstream in seconds
|
|
#define _STAT_INTERVAL 120 // Send a 'stat' message to server
|
|
#define _NTP_INTERVAL 3600 // How often do we want time NTP synchronization
|
|
#define _WWW_INTERVAL 60 // Number of seconds before we refresh the WWW page
|
|
#define _FILE_INTERVAL 30 // Number of timer (in secs) before writing to files
|
|
#define _MSG_INTERVAL 31 // Message timeout timer in seconds
|
|
#define _RST_INTERVAL 90 // Reset interval in seconds, total chip reset
|
|
|
|
// This defines whether or not we would use the gateway as
|
|
// as sort of backend decoding system for local sensors which decodes
|
|
// 1: _LOCALSERVER is used
|
|
// 0: Do not use _LOCALSERVER
|
|
#define _LOCALSERVER 1 // See server definitions for decodes
|
|
|
|
|
|
// Gateway Ident definitions. Where is the gateway located?
|
|
#define _DESCRIPTION "Easy LoRaWAN gateway" // Easy LoRa
|
|
#define _EMAIL "iotthinks@gmail.com" // Easy LoRa
|
|
#define _PLATFORM "ESP32" // Easy LoRa
|
|
#define _LAT 10.788075070872198 // Easy LoRa
|
|
#define _LON 106.70578479766847 // Easy LoRa
|
|
#define _ALT 14 // Easy LoRa
|
|
|
|
// ntp
|
|
// Please add daylight saving time to NTP_TIMEZONES when desired
|
|
#define NTP_TIMESERVER "nl.pool.ntp.org" // Country and region specific
|
|
#define NTP_TIMEZONES 7 // Easy LoRa, How far is our Timezone from UTC (excl daylight saving/summer time)
|
|
#define SECS_IN_HOUR 3600
|
|
#define NTP_INTR 0 // Do NTP processing with interrupts or in loop();
|
|
|
|
|
|
// lora sensor code definitions
|
|
// Defines whether the gateway will also report sensor/status value on MQTT
|
|
// (such as battery and GPS)
|
|
// after all, a gateway can be a node to the system as well. Some sensors like GPS can be
|
|
// sent to the backend as a parameter, some (like humidity for example) can only be sent
|
|
// as a regular sensor value.
|
|
// Set its LoRa address and key below in this file, See spec. para 4.3.2
|
|
// NOTE: The node is switched off by default. Switch it on in the GUI
|
|
#if !defined _GATEWAYNODE
|
|
# define _GATEWAYNODE 0
|
|
#endif //_GATEWAYNODE
|
|
|
|
|
|
// We can put the gateway in such a mode that it will (only) recognize
|
|
// nodes that are put in a list of trusted nodes
|
|
// Values:
|
|
// 0: Do not use names for trusted Nodes
|
|
// 1: Use the nodes as a translation table for hex codes to names (in TLN)
|
|
// 2: Same as 1, but is nodes NOT in the nodes list below they are NOT shown
|
|
// NOTE: We probably will make this list dynamic!
|
|
#define _TRUSTED_NODES 1
|
|
#define _TRUSTED_DECODE 1
|
|
|
|
|
|
|
|
// ========================================================================
|
|
// DO NOT CHANGE BELOW THIS LINE
|
|
// Probably do not change items below this line, only if lists or
|
|
// configurations on configNode.h are not large enough for example.
|
|
// ========================================================================
|
|
|
|
// Maximum number of Message History statistics records gathered. 20 is a good maximum
|
|
// (memory intensive). For ESP32 maybe 30 could be used as well
|
|
#define _MAXSTAT 20
|
|
|
|
|
|
// Define the maximum amount of itemas we monitor on the screen
|
|
#define _MAXMONITOR 20
|
|
|
|
|
|
// We will log a list of LoRa nodes that was forwarded using this gateway.
|
|
// For eacht node we record:
|
|
// - node Number, or known node name
|
|
// - Last seen 'seconds since 1/1/1970'
|
|
// - SF seen (8-bit integer with SF per bit)
|
|
// The initial version _NUMMAX stores max this many nodes, please make
|
|
// _MAXSEEN==0 when not used
|
|
#if !defined _MAXSEEN
|
|
# define _MAXSEEN 20
|
|
#endif
|
|
#define _SEENFILE "/gwayNum.txt"
|
|
|
|
|
|
// Name of he configfile in SPIFFs filesystem
|
|
// In this file we store the configuration and other relevant info that should
|
|
// survive a reboot of the gateway
|
|
#define CONFIGFILE "/gwayConfig.txt"
|
|
|
|
|
|
// Define the correct radio type that you are using
|
|
#define CFG_sx1276_radio
|
|
//#define CFG_sx1272_radio
|
|
|
|
|
|
// Serial Port speed
|
|
#define _BAUDRATE 115200 // Works for debug messages to serial momitor
|
|
|
|
|
|
// MQTT definitions, these settings should be standard for TTN
|
|
// and need no changing
|
|
#define _TTNSERVER "easylorawan.com" // EasyLoRa
|
|
#define _TTNPORT 1700 // Standard port for TTN
|