31#define MAC_LINK_CHECK_REQ 0x02
32#define MAC_LINK_ADR_REQ 0x03
33#define MAC_LINK_ADR_ANS 0x03
34#define MAC_DUTY_CYCLE_REQ 0x04
35#define MAC_DUTY_CYCLE_ANS 0x04
36#define MAC_RX_PARAM_SETUP_REQ 0x05
37#define MAC_RX_PARAM_SETUP_ANS 0x05
38#define MAC_DEV_STATUS_REQ 0x06
39#define MAC_DEV_STATUS_ANS 0x06
40#define MAC_NEW_CHANNEL_REQ 0x07
41#define MAC_NEW_CHANNEL_ANS 0x07
42#define MAC_RX_TIMING_SETUP_REQ 0x08
43#define MAC_RX_TIMING_SETUP_ANS 0x08
44#define MAC_TX_PARAM_SETUP_REQ 0x09
45#define MAC_TX_PARAM_SETUP_ANS 0x09
46#define MAC_DL_CHANNEL_REQ 0x0A
47#define MAC_DL_CHANNEL_ANS 0x0A
48#define MAC_REKEY_CONF 0x0B
49#define MAC_ADR_PARAM_SETUP_REQ 0x0C
50#define MAC_ADR_PARAM_SETUP_ANS 0x0C
51#define MAC_DEVICE_TIME_REQ 0x0D
52#define MAC_DEVICE_TIME_ANS 0x0D
53#define MAC_REJOIN_PARAM_REQ 0x0E
54#define MAC_REJOIN_PARAM_ANS 0x0E
55#define MAC_PING_SLOT_INFO_REQ 0x10
56#define MAC_PING_SLOT_INFO_ANS 0x10
57#define MAC_PING_SLOT_CHANNEL_REQ 0x11
58#define MAC_PING_SLOT_FREQ_ANS 0x11
59#define MAC_BEACON_TIMING_REQ 0x12
60#define MAC_BEACON_TIMING_ANS 0x12
61#define MAC_BEACON_FREQ_REQ 0x13
62#define MAC_BEACON_FREQ_ANS 0x13
63#define MAC_LINK_CHECK_ANS 0x02
156 explicit LoRaWAN(std::unique_ptr<SPIInterface> spi_interface);
169 bool init(
int deviceIndex = 0);
183 void setDevEUI(
const std::string& devEUI);
190 void setAppEUI(
const std::string& appEUI);
197 void setAppKey(
const std::string& appKey);
233 bool join(
JoinMode mode,
unsigned long timeout = 10000);
242 std::vector<uint8_t>
encryptPayload(
const std::vector<uint8_t>& payload, uint8_t port);
251 std::vector<uint8_t>
decryptPayload(
const std::vector<uint8_t>& payload, uint8_t port);
292 bool send(
const std::vector<uint8_t>& data, uint8_t port,
bool confirmed =
false,
bool force_duty_cycle =
false);
322 void onJoin(std::function<
void(
bool)> callback);
394 int bw = 125,
int cr = 5,
int power = 14,
int preamble = 8);
490 void applyADRSettings(uint8_t dataRate, uint8_t txPower,
const std::vector<uint8_t>& channelMask);
498 void processMACCommands(
const std::vector<uint8_t>& commands, std::vector<uint8_t>& response);
507 void processLinkADRReq(
const std::vector<uint8_t>& cmd,
size_t index, std::vector<uint8_t>& response);
Class that provides LoRaWAN protocol implementation.
Definition LoRaWAN.hpp:74
std::chrono::steady_clock::time_point lastConfirmAttempt
Definition LoRaWAN.hpp:625
bool processJoinAccept(const std::vector< uint8_t > &data)
Process a join accept message.
Definition LoRaWAN.cpp:3019
static constexpr unsigned long WINDOW_DURATION
Definition LoRaWAN.hpp:654
int getRSSI() const
Get the RSSI (Received Signal Strength Indicator).
Definition LoRaWAN.cpp:1840
bool one_channel_gateway
Definition LoRaWAN.hpp:643
void onJoin(std::function< void(bool)> callback)
Set a callback for join events.
Definition LoRaWAN.cpp:1741
bool needsAck
Definition LoRaWAN.hpp:628
bool joined
Definition LoRaWAN.hpp:615
std::function< void(const Message &)> ReceiveCallback
Callback type for received messages.
Definition LoRaWAN.hpp:137
std::unique_ptr< Impl > pimpl
Definition LoRaWAN.hpp:597
void onReceive(std::function< void(const Message &)> callback)
Set a callback for received messages.
Definition LoRaWAN.cpp:1737
int current_power
Definition LoRaWAN.hpp:604
void applyADRSettings(uint8_t dataRate, uint8_t txPower, const std::vector< uint8_t > &channelMask)
Apply ADR settings.
Definition LoRaWAN.cpp:1953
JoinMode
LoRaWAN join modes.
Definition LoRaWAN.hpp:99
@ ABP
Activation By Personalization - static session keys.
Definition LoRaWAN.hpp:101
@ OTAA
Over-The-Air Activation - dynamic session keys.
Definition LoRaWAN.hpp:100
bool isADREnabled() const
Check if ADR is enabled.
Definition LoRaWAN.cpp:1923
float channelAirTime[MAX_CHANNELS]
Definition LoRaWAN.hpp:637
void setAppSKey(const std::string &appSKey)
Set the Application Session Key.
Definition LoRaWAN.cpp:757
void sendADRStatistics()
Send ADR statistics.
Definition LoRaWAN.cpp:2498
void sleep()
Put the radio in sleep mode.
Definition LoRaWAN.cpp:1860
void resetSession()
Reset the LoRaWAN session.
Definition LoRaWAN.cpp:1927
static constexpr float CHANNEL_STEP[REGIONS]
Definition LoRaWAN.hpp:675
std::function< void(bool)> JoinCallback
Callback type for join events.
Definition LoRaWAN.hpp:142
uint8_t current_dr
Definition LoRaWAN.hpp:730
static constexpr int RX2_CR[REGIONS]
Definition LoRaWAN.hpp:712
int getSNR() const
Get the SNR (Signal-to-Noise Ratio).
Definition LoRaWAN.cpp:1844
static constexpr unsigned long RECEIVE_DELAY1
Definition LoRaWAN.hpp:652
float one_channel_freq
Definition LoRaWAN.hpp:644
int current_sync_word
Definition LoRaWAN.hpp:607
float getFrequency() const
Get the current frequency.
Definition LoRaWAN.cpp:1762
int confirmRetries
Definition LoRaWAN.hpp:624
static constexpr float RX2_BW[REGIONS]
Definition LoRaWAN.hpp:705
uint8_t rx1DrOffset
Definition LoRaWAN.hpp:611
int getRegion() const
Get the current LoRaWAN region.
Definition LoRaWAN.cpp:1758
static constexpr unsigned long RECEIVE_DELAY2
Definition LoRaWAN.hpp:653
int current_lna
Definition LoRaWAN.hpp:606
uint8_t getChannel() const
Get the current channel.
Definition LoRaWAN.cpp:1807
void enableADR(bool enable)
Enable or disable ADR (Adaptive Data Rate).
Definition LoRaWAN.cpp:1918
static constexpr uint8_t MAX_RETRIES
Definition LoRaWAN.hpp:659
JoinMode joinMode
Definition LoRaWAN.hpp:617
void handleReceivedMessage(const std::vector< uint8_t > &payload, Message &msg)
Handle a received message.
Definition LoRaWAN.cpp:2887
static constexpr int MAX_POWER[REGIONS]
Definition LoRaWAN.hpp:683
void setAppEUI(const std::string &appEUI)
Set the Application EUI.
Definition LoRaWAN.cpp:709
void openRX2Window()
Open RX2 window.
Definition LoRaWAN.cpp:2633
void setDevAddr(const std::string &devAddr)
Set the Device Address.
Definition LoRaWAN.cpp:749
float getFrequencyFromChannel(int channel) const
Get the frequency for a channel.
Definition LoRaWAN.cpp:1790
void resetConfirmationState()
Reset the confirmation state.
Definition LoRaWAN.cpp:2875
int current_channel
Definition LoRaWAN.hpp:605
uint32_t getFrameCounter() const
Get the frame counter.
Definition LoRaWAN.cpp:1848
float getDutyCycleUsage(int channel)
Get the duty cycle usage for a channel.
Definition LoRaWAN.cpp:1169
void setChannel(uint8_t channel)
Set the current channel.
Definition LoRaWAN.cpp:1797
static constexpr uint8_t ADR_ACK_LIMIT
Definition LoRaWAN.hpp:657
void setDeviceClass(DeviceClass deviceClass)
Set the device class (A, B, or C).
Definition LoRaWAN.cpp:668
int current_preamble
Definition LoRaWAN.hpp:603
int one_channel_preamble
Definition LoRaWAN.hpp:649
bool adrEnabled
Definition LoRaWAN.hpp:618
ConfirmationState confirmState
Definition LoRaWAN.hpp:623
void setFrameCounter(uint32_t counter)
Set the frame counter.
Definition LoRaWAN.cpp:1852
void update()
Update the LoRaWAN state.
Definition LoRaWAN.cpp:1555
static void setVerbose(bool verbose)
Set verbose mode.
Definition LoRaWAN.hpp:585
uint8_t current_nbRep
Definition LoRaWAN.hpp:608
RxWindowState
Represents the state of receive windows.
Definition LoRaWAN.hpp:116
@ RX_IDLE
Not in a receive window.
Definition LoRaWAN.hpp:117
@ RX_CONTINUOUS
Continuous reception (Class C)
Definition LoRaWAN.hpp:122
@ RX_WINDOW_1
In RX1 window.
Definition LoRaWAN.hpp:119
@ RX_WINDOW_2
In RX2 window.
Definition LoRaWAN.hpp:121
@ RX_WAIT_1
Waiting to open RX1 window.
Definition LoRaWAN.hpp:118
@ RX_WAIT_2
Waiting to open RX2 window.
Definition LoRaWAN.hpp:120
Region
LoRaWAN supported regions.
Definition LoRaWAN.hpp:79
@ REGION_EU433
European Union 433 MHz band.
Definition LoRaWAN.hpp:83
@ REGION_AU915
Australia 915-928 MHz band.
Definition LoRaWAN.hpp:82
@ REGION_EU868
European Union 863-870 MHz band.
Definition LoRaWAN.hpp:80
@ REGIONS
Number of regions.
Definition LoRaWAN.hpp:84
@ REGION_US915
United States 902-928 MHz band.
Definition LoRaWAN.hpp:81
ReceiveCallback receiveCallback
Definition LoRaWAN.hpp:663
bool join(JoinMode mode, unsigned long timeout=10000)
Join a LoRaWAN network.
Definition LoRaWAN.cpp:761
void resetDutyCycle()
Reset the duty cycle usage.
Definition LoRaWAN.cpp:1188
static constexpr float RX2_FREQ[REGIONS]
Definition LoRaWAN.hpp:691
bool send(const std::vector< uint8_t > &data, uint8_t port, bool confirmed=false, bool force_duty_cycle=false)
Send a message.
Definition LoRaWAN.cpp:1196
uint8_t ackPort
Definition LoRaWAN.hpp:627
int getChannelFromFrequency(float freq_mhz) const
Get the channel from a frequency.
Definition LoRaWAN.cpp:1776
std::vector< uint8_t > encryptPayload(const std::vector< uint8_t > &payload, uint8_t port)
Encrypt a payload.
Definition LoRaWAN.cpp:908
float getSingleChannelFrequency() const
Get the single channel frequency.
Definition LoRaWAN.cpp:1827
int current_cr
Definition LoRaWAN.hpp:602
bool validateKeys() const
Validate the session keys.
Definition LoRaWAN.cpp:1864
bool receive(Message &message, unsigned long timeout=1000)
Receive a message.
Definition LoRaWAN.cpp:1718
ConfirmationState
Represents the state of message confirmations.
Definition LoRaWAN.hpp:107
@ ACK_PENDING
Need to acknowledge a received message.
Definition LoRaWAN.hpp:110
@ NONE
No confirmation pending.
Definition LoRaWAN.hpp:108
@ WAITING_ACK
Waiting for acknowledgment of sent message.
Definition LoRaWAN.hpp:109
static constexpr int MAX_CHANNELS
Definition LoRaWAN.hpp:632
int one_channel_power
Definition LoRaWAN.hpp:648
void processLinkADRReq(const std::vector< uint8_t > &cmd, size_t index, std::vector< uint8_t > &response)
Process LinkADRReq MAC command.
Definition LoRaWAN.cpp:2190
void sendAck()
Send an acknowledgment.
Definition LoRaWAN.cpp:2845
void setRegion(int region)
Set the LoRaWAN region.
Definition LoRaWAN.cpp:1745
std::chrono::steady_clock::time_point lastChannelUse[MAX_CHANNELS]
Definition LoRaWAN.hpp:636
static constexpr int RX2_PREAMBLE[REGIONS]
Definition LoRaWAN.hpp:719
uint8_t rx2DataRate
Definition LoRaWAN.hpp:612
void setTxPower(int8_t power)
Set the transmission power.
Definition LoRaWAN.cpp:1831
void openRX1Window()
Open RX1 window.
Definition LoRaWAN.cpp:2566
DeviceClass
LoRaWAN device classes.
Definition LoRaWAN.hpp:90
@ CLASS_C
Class C device - continuous receive, bidirectional with lowest latency.
Definition LoRaWAN.hpp:93
@ CLASS_B
Class B device - synchronized beacons, bidirectional with scheduled receive slots.
Definition LoRaWAN.hpp:92
@ CLASS_A
Class A device - lowest power consumption, bidirectional.
Definition LoRaWAN.hpp:91
uint8_t adrAckCounter
Definition LoRaWAN.hpp:619
std::vector< uint8_t > decryptPayload(const std::vector< uint8_t > &payload, uint8_t port)
Decrypt a payload.
Definition LoRaWAN.cpp:997
static constexpr float BASE_FREQ[REGIONS]
Definition LoRaWAN.hpp:667
void updateDataRateFromSF()
Update the data rate from the spreading factor.
Definition LoRaWAN.cpp:3069
void setSingleChannel(bool enable, float freq_mhz=868.1, int sf=9, int bw=125, int cr=5, int power=14, int preamble=8)
Enable or disable single channel mode.
Definition LoRaWAN.cpp:1811
std::vector< uint8_t > pendingAck
Definition LoRaWAN.hpp:626
int lora_region
Definition LoRaWAN.hpp:640
static bool isVerbose
Definition LoRaWAN.hpp:727
std::vector< uint8_t > pendingMACResponses
Definition LoRaWAN.hpp:620
void updateRxWindows()
Update receive windows.
Definition LoRaWAN.cpp:2694
JoinCallback joinCallback
Definition LoRaWAN.hpp:664
void wake()
Wake the radio from sleep mode.
Definition LoRaWAN.cpp:1856
uint16_t lastFcntDown
Definition LoRaWAN.hpp:629
float current_bw
Definition LoRaWAN.hpp:601
static bool getVerbose()
Get verbose mode.
Definition LoRaWAN.hpp:592
DeviceClass currentClass
Definition LoRaWAN.hpp:616
static constexpr int RX2_SF[REGIONS]
Definition LoRaWAN.hpp:698
void processMACCommands(const std::vector< uint8_t > &commands, std::vector< uint8_t > &response)
Process MAC commands.
Definition LoRaWAN.cpp:2011
bool init(int deviceIndex=0)
Initialize the LoRaWAN stack and radio.
Definition LoRaWAN.cpp:636
int one_channel_bw
Definition LoRaWAN.hpp:646
void updateTxParamsForADR()
Update transmission parameters for ADR.
Definition LoRaWAN.cpp:2527
float channelFrequencies[MAX_CHANNELS]
Definition LoRaWAN.hpp:635
void setAppKey(const std::string &appKey)
Set the Application Key.
Definition LoRaWAN.cpp:729
void setDevEUI(const std::string &devEUI)
Set the Device EUI.
Definition LoRaWAN.cpp:689
bool getSingleChannel() const
Check if single channel mode is enabled.
Definition LoRaWAN.cpp:1822
void setupRxWindows()
Set up receive windows.
Definition LoRaWAN.cpp:2553
void requestLinkCheck()
Request a link check.
Definition LoRaWAN.cpp:3049
LoRaWAN()
Default constructor.
Definition LoRaWAN.cpp:592
void setFrequency(float freq_mhz)
Set the frequency.
Definition LoRaWAN.cpp:1766
void handleConfirmation()
Handle confirmations.
Definition LoRaWAN.cpp:2796
int one_channel_cr
Definition LoRaWAN.hpp:647
int one_channel_sf
Definition LoRaWAN.hpp:645
int current_sf
Definition LoRaWAN.hpp:600
float calculateTimeOnAir(size_t payload_size)
Calculate the time on air for a payload.
Definition LoRaWAN.cpp:1098
static constexpr uint8_t ADR_ACK_DELAY
Definition LoRaWAN.hpp:658
bool checkDutyCycle(float frequency, size_t payload_size)
Check if duty cycle allows transmission.
Definition LoRaWAN.cpp:1125
void setNwkSKey(const std::string &nwkSKey)
Set the Network Session Key.
Definition LoRaWAN.cpp:753
Structure representing a LoRaWAN message.
Definition LoRaWAN.hpp:128
std::vector< uint8_t > payload
Message payload.
Definition LoRaWAN.hpp:129
bool confirmed
Whether the message is confirmed.
Definition LoRaWAN.hpp:131
uint8_t port
Message port.
Definition LoRaWAN.hpp:130