ttn-esp32 4.2.1
The Things Network device library for ESP-IDF (ESP32)
|
Classes | |
struct | ttn_rf_settings_t |
RF settings for TX or RX. More... | |
Macros | |
#define | TTN_NOT_CONNECTED 0xff |
Constant for indicating that a pin is not connected. | |
Typedefs | |
typedef uint8_t | ttn_port_t |
Integer data type for specifiying the port of an uplink or downlink message. | |
typedef void(* | ttn_message_cb) (const uint8_t *payload, size_t length, ttn_port_t port) |
Callback for recieved messages. | |
Functions | |
void | ttn_init (void) |
Initializes The Things Network device instance. | |
void | ttn_configure_pins (spi_host_device_t spi_host, uint8_t nss, uint8_t rxtx, uint8_t rst, uint8_t dio0, uint8_t dio1) |
Configures the pins used to communicate with the LoRaWAN radio chip. | |
void | ttn_set_subband (int band) |
Sets the frequency sub-band to be used. | |
bool | ttn_provision (const char *dev_eui, const char *app_eui, const char *app_key) |
Sets the keys needed to activate the device via OTAA, without activating it. | |
bool | ttn_provision_transiently (const char *dev_eui, const char *app_eui, const char *app_key) |
Sets the keys needed to activate the device via OTAA, without activating it. | |
bool | ttn_provision_with_mac (const char *app_eui, const char *app_key) |
Sets the information needed to activate the device via OTAA, using the MAC to generate the DevEUI and without activating it. | |
void | ttn_start_provisioning_task (void) |
Starts task listening on configured UART for AT commands. | |
void | ttn_wait_for_provisioning (void) |
Waits until the DevEUI, AppEUI/JoinEUI and AppKey have been provisioned by the provisioning task. | |
bool | ttn_join (void) |
Activates the device via OTAA using previously provisioned keys. | |
bool | ttn_join_with_keys (const char *dev_eui, const char *app_eui, const char *app_key) |
Activates the device via OTAA using the provided keys. | |
bool | ttn_resume_after_deep_sleep (void) |
Resumes TTN communication after deep sleep. | |
bool | ttn_resume_after_power_off (int off_duration) |
Resumes TTN communication after power off. | |
void | ttn_prepare_for_deep_sleep (void) |
Stops all activies and prepares for deep sleep. | |
void | ttn_prepare_for_power_off (void) |
Stops all activies and prepares for power off. | |
void | ttn_wait_for_idle (void) |
Waits until the TTN device is idle. | |
TickType_t | ttn_busy_duration (void) |
Returns the minimum duration the TTN device will be busy. | |
void | ttn_shutdown (void) |
Stops all activies. | |
ttn_response_code_t | ttn_transmit_message (const uint8_t *payload, size_t length, ttn_port_t port, bool confirm) |
Transmits a message. | |
void | ttn_on_message (ttn_message_cb callback) |
Sets the function to be called when a message is received. | |
bool | ttn_is_provisioned (void) |
Checks if DevEUI, AppEUI/JoinEUI and AppKey have been stored in non-volatile storage or have been provided by a call to ttn_join_with_keys() or to ttn_provision_transiently(). | |
void | ttn_set_rssi_cal (int8_t rssi_cal) |
Sets the RSSI calibration value for LBT (Listen Before Talk). | |
bool | ttn_adr_enabled (void) |
void | ttn_set_adr_enabled (bool enabled) |
Enables or disabled Adaptive Data Rate (ADR). | |
void | ttn_set_data_rate (ttn_data_rate_t data_rate) |
Sets the transmission data rate (i.e. the data rate for uplink messages). | |
void | ttn_set_max_tx_pow (int tx_pow) |
Sets the maximum power for transmission. | |
ttn_rx_tx_window_t | ttn_rx_tx_window (void) |
Gets current RX/TX window. | |
ttn_rf_settings_t | ttn_get_rf_settings (ttn_rx_tx_window_t window) |
Gets the RF settings for the specified window. | |
ttn_rf_settings_t | ttn_tx_settings (void) |
Gets the RF settings of the last (or ongoing) transmission. | |
ttn_rf_settings_t | ttn_rx1_settings (void) |
Gets the RF settings of the last (or ongoing) reception of RX window 1. | |
ttn_rf_settings_t | ttn_rx2_settings (void) |
Gets the RF settings of the last (or ongoing) reception of RX window 2. | |
int | ttn_rssi () |
Gets the received signal strength indicator (RSSI). | |
typedef void(* ttn_message_cb) (const uint8_t *payload, size_t length, ttn_port_t port) |
Callback for recieved messages.
payload | pointer to the received bytes |
length | number of received bytes |
port | port the message was received on |
enum ttn_bandwidth_t |
enum ttn_data_rate_t |
Data Rate.
Note that the spreading factor, bandwidth, bit rate and maximum message size associated with each data rate depends on the region.
enum ttn_response_code_t |
enum ttn_rx_tx_window_t |
Spreading Factor.
bool ttn_adr_enabled | ( | void | ) |
Returns whether Adaptive Data Rate (ADR) is enabled.
true
if enabled, false
if disabled TickType_t ttn_busy_duration | ( | void | ) |
Returns the minimum duration the TTN device will be busy.
This function can be called to check whether the TTN device is still involved in communication or ready to go to deep sleep or to be powered off.
If it returns 0, the TTN communication is idle and the device can go to deep sleep or can be powered off.
If it returns a value different from 0, the value indicates the duration the device will be certainly busy. After that time, this function must be called again. It might still return a value different from 0.
void ttn_configure_pins | ( | spi_host_device_t | spi_host, |
uint8_t | nss, | ||
uint8_t | rxtx, | ||
uint8_t | rst, | ||
uint8_t | dio0, | ||
uint8_t | dio1 ) |
Configures the pins used to communicate with the LoRaWAN radio chip.
Before calling this member function, the SPI bus needs to be configured using spi_bus_initialize()
. Additionally, gpio_install_isr_service()
must have been called to initialize the GPIO ISR handler service.
Call this function after ttn_init() and before all other TTN functions.
spi_host | The SPI bus/peripherial to use (SPI1_HOST , SPI2_HOST , SPI3_HOST , FSPI_HOST , HSPI_HOST , or VSPI_HOST ). |
nss | The GPIO pin number connected to the radio chip's NSS pin (serving as the SPI chip select) |
rxtx | The GPIO pin number connected to the radio chip's RXTX pin (TTN_NOT_CONNECTED if not connected) |
rst | The GPIO pin number connected to the radio chip's RST pin (TTN_NOT_CONNECTED if not connected) |
dio0 | The GPIO pin number connected to the radio chip's DIO0 pin |
dio1 | The GPIO pin number connected to the radio chip's DIO1 pin |
ttn_rf_settings_t ttn_get_rf_settings | ( | ttn_rx_tx_window_t | window | ) |
Gets the RF settings for the specified window.
window | RX/TX window (valid values are TTN_WINDOW_TX, TTN_WINDOW_RX1 and TTN_WINDOW_RX2 |
void ttn_init | ( | void | ) |
Initializes The Things Network device instance.
Call this function once at the start of the program and before all other TTN functions.
bool ttn_is_provisioned | ( | void | ) |
Checks if DevEUI, AppEUI/JoinEUI and AppKey have been stored in non-volatile storage or have been provided by a call to ttn_join_with_keys() or to ttn_provision_transiently().
true
if they are stored, complete and of the correct size, false
otherwise bool ttn_join | ( | void | ) |
Activates the device via OTAA using previously provisioned keys.
The DevEUI, AppEUI/JoinEUI and AppKey must have already been provisioned by a call to ttn_provision() or ttn_provision_with_mac(). Before this function is called, nvs_flash_init()
must have been called once.
The RF module is initialized and the TTN background task is started.
The function blocks until the activation has completed or failed.
true
if the activation was succesful, false
if the activation failed bool ttn_join_with_keys | ( | const char * | dev_eui, |
const char * | app_eui, | ||
const char * | app_key ) |
Activates the device via OTAA using the provided keys.
For the activation, the provided DevEUI, AppEUI/JoinEUI and AppKey are used. They are NOT saved in non-volatile memory.
The RF module is initialized and the TTN background task is started.
The function blocks until the activation has completed or failed.
dev_eui | DevEUI (16 character string with hexadecimal data) |
app_eui | AppEUI/JoinEUI of the device (16 character string with hexadecimal data) |
app_key | AppKey of the device (32 character string with hexadecimal data) |
true
if the activation was succesful, false
if the activation failed void ttn_on_message | ( | ttn_message_cb | callback | ) |
Sets the function to be called when a message is received.
When a message is received, the specified function is called. The message, its length and the port number are provided as parameters. The values are only valid during the duration of the callback. So they must be immediately processed or copied.
Messages are received as a result of ttn_transmit_message(). The callback is called in the task that called this function and it occurs before this function returns control to the caller.
callback | the callback function |
void ttn_prepare_for_deep_sleep | ( | void | ) |
Stops all activies and prepares for deep sleep.
This function is called before entering deep sleep. It saves the current communication state in RTC memory and shuts down the RF module and the TTN background task.
It neither clears the provisioned keys nor the configured pins but they will be lost if the device goes into deep sleep.
Before calling this function, use ttn_busy_duration() to check that the TTN device is idle and ready to go to deep sleep.
To restart communication, ttn_resume_after_deep_sleep() must be called.
void ttn_prepare_for_power_off | ( | void | ) |
Stops all activies and prepares for power off.
This function is called before powering off the device. It saves the current communication state in NVS (non-volatile storage) and shuts down the RF module and the TTN background task.
It neither clears the provisioned keys nor the configured pins but they will be lost if the device is powered off.
Before calling this function, use ttn_busy_duration() to check that the TTN device is idle and ready to be powered off.
To restart communication, ttn_resume_after_power_off(int) must be called.
Before this function is called, nvs_flash_init()
must have been called once.
bool ttn_provision | ( | const char * | dev_eui, |
const char * | app_eui, | ||
const char * | app_key ) |
Sets the keys needed to activate the device via OTAA, without activating it.
The provided DevEUI, AppEUI/JoinEUI and AppKey are saved in non-volatile memory. Before this function is called, nvs_flash_init()
must have been called once.
In order to reduce flash wear, this function detects if the keys have not changed and will not write them again.
Call ttn_join() to activate the device.
dev_eui | DevEUI (16 character string with hexadecimal data) |
app_eui | AppEUI/JoinEUI of the device (16 character string with hexadecimal data) |
app_key | AppKey of the device (32 character string with hexadecimal data) |
true
if the provisioning was successful, false
if the provisioning failed bool ttn_provision_transiently | ( | const char * | dev_eui, |
const char * | app_eui, | ||
const char * | app_key ) |
Sets the keys needed to activate the device via OTAA, without activating it.
The provided DevEUI, AppEUI/JoinEUI and AppKey are only stored in RAM and will be lost when the device is powered off or put in deep sleep.
Call ttn_join() to activate the device.
dev_eui | DevEUI (16 character string with hexadecimal data) |
app_eui | AppEUI/JoinEUI of the device (16 character string with hexadecimal data) |
app_key | AppKey of the device (32 character string with hexadecimal data) |
true
if the provisioning was successful, false
if the provisioning failed bool ttn_provision_with_mac | ( | const char * | app_eui, |
const char * | app_key ) |
Sets the information needed to activate the device via OTAA, using the MAC to generate the DevEUI and without activating it.
The generated DevEUI and the provided AppEUI/JoinEUI and AppKey are saved in non-volatile memory. Before this function is called, nvs_flash_init
must have been called once.
In order to reduce flash wear, this function detects if the keys have not changed and will not write them again.
The DevEUI is generated by retrieving the ESP32's WiFi MAC address and expanding it into a DevEUI by adding FFFE in the middle. So the MAC address A0:B1:C2:01:02:03 becomes the EUI A0B1C2FFFE010203. This hexadecimal data can be entered into the DevEUI field in the TTN console.
Generating the DevEUI from the MAC address allows to flash the same AppEUI/JoinEUI and AppKey to a batch of devices. However, using the same AppKey for multiple devices is insecure. Only use this approach if it is okay for that the LoRa communication of your application can easily be intercepted and that forged data can be injected.
Call ttn_join() to activate.
app_eui | AppEUI/JoinEUI of the device (16 character string with hexadecimal data) |
app_key | AppKey of the device (32 character string with hexadecimal data) |
true
if the provisioning was successful, false
if the provisioning failed bool ttn_resume_after_deep_sleep | ( | void | ) |
Resumes TTN communication after deep sleep.
The communcation state is restored from data previously saved in RTC memory. The RF module and the TTN background task are started.
This function is called instead of ttn_join_with_keys() or ttn_join() to continue with the established communication and to avoid a further join procedure.
true
if the device was able to resume, false
otherwise. bool ttn_resume_after_power_off | ( | int | off_duration | ) |
Resumes TTN communication after power off.
The communcation state is restored from data previously saved in NVS (non-volatile storage). The RF module and the TTN background task are started.
This function is called instead of ttn_join_with_keys() or ttn_join() to continue with the established communication and to avoid a further join procedure.
In order to advance the clock, the estimated duration the device was powered off has to be specified. As the exact duration is probably not known, an estimation of the shortest duration between power-off and next power-on can be used instead.
If the device has access to the real time, set the system time (using settimeofday()
) before calling this function (and before ttn_join()) and pass 0 for off_duration
.
Before this function is called, nvs_flash_init()
must have been called once.
off_duration | duration the device was powered off (in minutes) |
true
if the device was able to resume, false
otherwise. int ttn_rssi | ( | ) |
Gets the received signal strength indicator (RSSI).
RSSI is the measured signal strength of the last recevied message (incl. join responses).
ttn_rf_settings_t ttn_rx1_settings | ( | void | ) |
Gets the RF settings of the last (or ongoing) reception of RX window 1.
ttn_rf_settings_t ttn_rx2_settings | ( | void | ) |
Gets the RF settings of the last (or ongoing) reception of RX window 2.
ttn_rx_tx_window_t ttn_rx_tx_window | ( | void | ) |
Gets current RX/TX window.
void ttn_set_adr_enabled | ( | bool | enabled | ) |
Enables or disabled Adaptive Data Rate (ADR).
ADR is enabled by default. It optimizes data rate, airtime and energy consumption for devices with stable RF conditions. It should be turned off for mobile devices.
enabled | true to enable, false to disable |
void ttn_set_data_rate | ( | ttn_data_rate_t | data_rate | ) |
Sets the transmission data rate (i.e. the data rate for uplink messages).
If ADR is enabled, it's is used as the initial data rate and later adjusted depending on the RF conditions. If ADR is disabled, it is used for all uplink messages.
data_rate | data rate (use constants of enum ttn_data_rate_t) |
void ttn_set_max_tx_pow | ( | int | tx_pow | ) |
Sets the maximum power for transmission.
The power is specified in dBm and sets the power emitted by the radio. If the antenna has a gain, it must be substracted from the specified value to achieve the correct transmission power.
tx_pow | power, in dBm |
void ttn_set_rssi_cal | ( | int8_t | rssi_cal | ) |
Sets the RSSI calibration value for LBT (Listen Before Talk).
This value is added to RSSI measured prior to decision. It must include the guardband. Ignored in US, EU, IN and other countries where LBT is not required. Defaults to 10 dB.
rssi_cal | RSSI calibration value, in dB |
void ttn_set_subband | ( | int | band | ) |
Sets the frequency sub-band to be used.
For regions with sub-bands (USA, Australia), sets the sub-band to be used for uplink communication. For other regions, this function has no effect.
The sub-band must be set before joining or sending the first message.
If not set, it defaults to sub-band 2 as defined by TTN.
band | band (0 for all bands, or value between 1 and 8) |
void ttn_shutdown | ( | void | ) |
Stops all activies.
This function shuts down the RF module and the TTN background task. It neither clears the provisioned keys nor the configured pins. The currentat device state (and activation) are lost.
To restart communication, ttn_join_with_keys() and ttn_join() must be called.
void ttn_start_provisioning_task | ( | void | ) |
Starts task listening on configured UART for AT commands.
Run make menuconfig
to configure it.
ttn_response_code_t ttn_transmit_message | ( | const uint8_t * | payload, |
size_t | length, | ||
ttn_port_t | port, | ||
bool | confirm ) |
Transmits a message.
The function blocks until the message could be transmitted and a message has been received in the subsequent receive window (or the window expires). Additionally, the function will first wait until the duty cycle allows a transmission (enforcing the duty cycle limits).
payload | bytes to be transmitted |
length | number of bytes to be transmitted |
port | port (use 1 as default) |
confirm | flag indicating if a confirmation should be requested (use false as default) |
ttn_rf_settings_t ttn_tx_settings | ( | void | ) |
Gets the RF settings of the last (or ongoing) transmission.
void ttn_wait_for_idle | ( | void | ) |
Waits until the TTN device is idle.
If the TTN device is idle, the ESP32 can go into deep sleep mode or be powered off without disrupting an on-going communication.
void ttn_wait_for_provisioning | ( | void | ) |
Waits until the DevEUI, AppEUI/JoinEUI and AppKey have been provisioned by the provisioning task.
If the device has already been provisioned (stored data in NVS, call of provision() or call of ttn_join_with_keys(), this function immediately returns.