/*! * \file LoRaMac.h * * \brief LoRa MAC layer implementation * * \copyright Revised BSD License, see section \ref LICENSE. * * \code * ______ _ * / _____) _ | | * ( (____ _____ ____ _| |_ _____ ____| |__ * \____ \| ___ | (_ _) ___ |/ ___) _ \ * _____) ) ____| | | || |_| ____( (___| | | | * (______/|_____)_|_|_| \__)_____)\____)_| |_| * (C)2013-2017 Semtech * * ___ _____ _ ___ _ _____ ___ ___ ___ ___ * / __|_ _/_\ / __| |/ / __/ _ \| _ \/ __| __| * \__ \ | |/ _ \ (__| ' <| _| (_) | / (__| _| * |___/ |_/_/ \_\___|_|\_\_| \___/|_|_\\___|___| * embedded.connectivity.solutions=============== * * \endcode * * \author Miguel Luis ( Semtech ) * * \author Gregory Cristian ( Semtech ) * * \author Daniel Jaeckle ( STACKFORCE ) * * \author Johannes Bruder ( STACKFORCE ) * * \defgroup LORAMAC LoRa MAC layer implementation * This module specifies the API implementation of the LoRaMAC layer. * This is a placeholder for a detailed description of the LoRaMac * layer and the supported features. * \{ * * \example classA/B-L072Z-LRWAN1/main.c * LoRaWAN class A application example for the B-L072Z-LRWAN1. * * \example classB/B-L072Z-LRWAN1/main.c * LoRaWAN class B application example for the B-L072Z-LRWAN1. * * \example classC/B-L072Z-LRWAN1/main.c * LoRaWAN class C application example for the B-L072Z-LRWAN1. * * \example classA/NAMote72/main.c * LoRaWAN class A application example for the NAMote72. * * \example classB/NAMote72/main.c * LoRaWAN class B application example for the NAMote72. * * \example classC/NAMote72/main.c * LoRaWAN class C application example for the NAMote72. * * \example classA/NucleoL073/main.c * LoRaWAN class A application example for the NucleoL073. * * \example classB/NucleoL073/main.c * LoRaWAN class B application example for the NucleoL073. * * \example classC/NucleoL073/main.c * LoRaWAN class C application example for the NucleoL073. * * \example classA/NucleoL152/main.c * LoRaWAN class A application example for the NucleoL152. * * \example classB/NucleoL152/main.c * LoRaWAN class B application example for the NucleoL152. * * \example classC/NucleoL152/main.c * LoRaWAN class C application example for the NucleoL152. * * \example classA/NucleoL476/main.c * LoRaWAN class A application example for the NucleoL476. * * \example classB/NucleoL476/main.c * LoRaWAN class B application example for the NucleoL476. * * \example classC/NucleoL476/main.c * LoRaWAN class C application example for the NucleoL476. * * \example classA/SAMR34/main.c * LoRaWAN class A application example for the SAMR34. * * \example classB/SAMR34/main.c * LoRaWAN class B application example for the SAMR34. * * \example classC/SAMR34/main.c * LoRaWAN class C application example for the SAMR34. * * \example classA/SKiM880B/main.c * LoRaWAN class A application example for the SKiM880B. * * \example classB/SKiM880B/main.c * LoRaWAN class B application example for the SKiM880B. * * \example classC/SKiM880B/main.c * LoRaWAN class C application example for the SKiM880B. * * \example classA/SKiM881AXL/main.c * LoRaWAN class A application example for the SKiM881AXL. * * \example classB/SKiM881AXL/main.c * LoRaWAN class B application example for the SKiM881AXL. * * \example classC/SKiM881AXL/main.c * LoRaWAN class C application example for the SKiM881AXL. * * \example classA/SKiM980A/main.c * LoRaWAN class A application example for the SKiM980A. * * \example classB/SKiM980A/main.c * LoRaWAN class B application example for the SKiM980A. * * \example classC/SKiM980A/main.c * LoRaWAN class C application example for the SKiM980A. * */ /** ****************************************************************************** * * Portions COPYRIGHT 2020 STMicroelectronics * * @file LoRaMac.h * @author MCD Application Team * @brief Header for LoRa MAC Layer ****************************************************************************** */ #ifndef __LORAMAC_H__ #define __LORAMAC_H__ #ifdef __cplusplus extern "C" { #endif #include <stdint.h> #include <stdbool.h> #include "utilities.h" #include "timer.h" #include "systime.h" #include "radio.h" #include "LoRaMacTypes.h" #include "lorawan_conf.h" /*! * Maximum number of times the MAC layer tries to get an acknowledge. */ #define MAX_ACK_RETRIES 8 /*! * Frame direction definition for up-link communications */ #define UP_LINK 0 /*! * Frame direction definition for down-link communications */ #define DOWN_LINK 1 /*! * LoRaMac MLME-Confirm queue length */ #define LORA_MAC_MLME_CONFIRM_QUEUE_LEN 5 /*! * Start value for multicast keys enumeration */ #define LORAMAC_CRYPTO_MULTICAST_KEYS 127 /*! * End-Device activation type */ typedef enum eActivationType { /*! * None */ ACTIVATION_TYPE_NONE = 0, /*! * Activation By Personalization (ACTIVATION_TYPE_ABP) */ ACTIVATION_TYPE_ABP = 1, /*! * Over-The-Air Activation (ACTIVATION_TYPE_OTAA) */ ACTIVATION_TYPE_OTAA = 2, }ActivationType_t; /*! * LoRaMAC channels parameters definition */ typedef union uDrRange { /*! * Byte-access to the bits */ int8_t Value; /*! * Structure to store the minimum and the maximum datarate */ struct sFields { /*! * Minimum data rate * * LoRaWAN Regional Parameters V1.0.2rB * * The allowed ranges are region specific. Please refer to \ref DR_0 to \ref DR_15 for details. */ int8_t Min : 4; /*! * Maximum data rate * * LoRaWAN Regional Parameters V1.0.2rB * * The allowed ranges are region specific. Please refer to \ref DR_0 to \ref DR_15 for details. */ int8_t Max : 4; }Fields; }DrRange_t; /*! * LoRaMAC channel definition */ typedef struct sChannelParams { /*! * Frequency in Hz */ uint32_t Frequency; /*! * Alternative frequency for RX window 1 */ uint32_t Rx1Frequency; /*! * Data rate definition */ DrRange_t DrRange; /*! * Band index */ uint8_t Band; }ChannelParams_t; /*! * LoRaMAC receive window channel parameters */ typedef struct sRxChannelParams { /*! * Frequency in Hz */ uint32_t Frequency; /*! * Data rate * * LoRaWAN Regional Parameters V1.0.2rB * * The allowed ranges are region specific. Please refer to \ref DR_0 to \ref DR_15 for details. */ uint8_t Datarate; }RxChannelParams_t; /*! * LoRaMAC receive window enumeration */ typedef enum eLoRaMacRxSlot { /*! * LoRaMAC receive window 1 */ RX_SLOT_WIN_1, /*! * LoRaMAC receive window 2 */ RX_SLOT_WIN_2, /*! * LoRaMAC receive window 2 for class c - continuous listening */ RX_SLOT_WIN_CLASS_C, /*! * LoRaMAC class c multicast downlink */ RX_SLOT_WIN_CLASS_C_MULTICAST, /*! * LoRaMAC class b ping slot window */ RX_SLOT_WIN_CLASS_B_PING_SLOT, /*! * LoRaMAC class b multicast slot window */ RX_SLOT_WIN_CLASS_B_MULTICAST_SLOT, /*! * LoRaMAC no active receive window */ RX_SLOT_NONE, }LoRaMacRxSlot_t; /*! * LoRaMAC structure to hold internal context pointers and its lengths */ typedef struct sLoRaMacCtxs { /*! * \brief Pointer to Mac context */ void* MacNvmCtx; /*! * \brief Size of Mac context */ size_t MacNvmCtxSize; /*! * \brief Pointer to region context */ void* RegionNvmCtx; /*! * \brief Size of region context */ size_t RegionNvmCtxSize; /*! * \brief Pointer to crypto module context */ void* CryptoNvmCtx; /*! * \brief Size of crypto module context */ size_t CryptoNvmCtxSize; /*! * \brief Pointer to secure element driver context */ void* SecureElementNvmCtx; /*! * \brief Size of secure element driver context */ size_t SecureElementNvmCtxSize; /*! * \brief Pointer to MAC commands module context */ void* CommandsNvmCtx; /*! * \brief Size of MAC commands module context */ size_t CommandsNvmCtxSize; /*! * \brief Pointer to Class B module context */ void* ClassBNvmCtx; /*! * \brief Size of MAC Class B module context */ size_t ClassBNvmCtxSize; /*! * \brief Pointer to MLME Confirm queue module context */ void* ConfirmQueueNvmCtx; /*! * \brief Size of MLME Confirm queue module context */ size_t ConfirmQueueNvmCtxSize; }LoRaMacCtxs_t; /*! * Global MAC layer parameters */ typedef struct sLoRaMacParams { /*! * Channels TX power */ int8_t ChannelsTxPower; /*! * Channels data rate */ int8_t ChannelsDatarate; /*! * System overall timing error in milliseconds. * [-SystemMaxRxError : +SystemMaxRxError] * Default: +/-10 ms */ uint32_t SystemMaxRxError; /*! * Minimum required number of symbols to detect an Rx frame * Default: 6 symbols */ uint8_t MinRxSymbols; /*! * LoRaMac maximum time a reception window stays open */ uint32_t MaxRxWindow; /*! * Receive delay 1 */ uint32_t ReceiveDelay1; /*! * Receive delay 2 */ uint32_t ReceiveDelay2; /*! * Join accept delay 1 */ uint32_t JoinAcceptDelay1; /*! * Join accept delay 1 */ uint32_t JoinAcceptDelay2; /*! * Number of uplink messages repetitions [1:15] (unconfirmed messages only) */ uint8_t ChannelsNbTrans; /*! * Datarate offset between uplink and downlink on first window */ uint8_t Rx1DrOffset; /*! * LoRaMAC 2nd reception window settings */ RxChannelParams_t Rx2Channel; /*! * LoRaMAC continuous reception window settings */ RxChannelParams_t RxCChannel; /*! * Uplink dwell time configuration. 0: No limit, 1: 400ms */ uint8_t UplinkDwellTime; /*! * Downlink dwell time configuration. 0: No limit, 1: 400ms */ uint8_t DownlinkDwellTime; /*! * Maximum possible EIRP */ float MaxEirp; /*! * Antenna gain of the node */ float AntennaGain; /*! * Indicates if the node supports repeaters */ bool RepeaterSupport; }LoRaMacParams_t; /*! * LoRaMAC data structure for a PingSlotInfoReq \ref MLME_PING_SLOT_INFO * * LoRaWAN Specification */ typedef union uPingSlotInfo { /*! * Parameter for byte access */ uint8_t Value; /*! * Structure containing the parameters for the PingSlotInfoReq */ struct sInfoFields { /*! * Periodicity = 0: ping slot every second * Periodicity = 7: ping slot every 128 seconds */ uint8_t Periodicity : 3; /*! * RFU */ uint8_t RFU : 5; }Fields; }PingSlotInfo_t; /*! * LoRaMAC data structure for the \ref MLME_BEACON MLME-Indication * * LoRaWAN Specification */ typedef struct sBeaconInfo { /*! * Timestamp in seconds since 00:00:00, Sunday 6th of January 1980 * (start of the GPS epoch) modulo 2^32 */ SysTime_t Time; /*! * Frequency */ uint32_t Frequency; /*! * Datarate */ uint8_t Datarate; /*! * RSSI */ int16_t Rssi; /*! * SNR */ int8_t Snr; /*! * Data structure for the gateway specific part. The * content of the values may differ for each gateway */ struct sGwSpecific { /*! * Info descriptor - can differ for each gateway */ uint8_t InfoDesc; /*! * Info - can differ for each gateway */ uint8_t Info[6]; }GwSpecific; }BeaconInfo_t; /*! * Enumeration containing the status of the operation of a MAC service */ typedef enum eLoRaMacEventInfoStatus { /*! * Service performed successfully */ LORAMAC_EVENT_INFO_STATUS_OK = 0, /*! * An error occurred during the execution of the service */ LORAMAC_EVENT_INFO_STATUS_ERROR, /*! * A Tx timeout occurred */ LORAMAC_EVENT_INFO_STATUS_TX_TIMEOUT, /*! * An Rx timeout occurred on receive window 1 */ LORAMAC_EVENT_INFO_STATUS_RX1_TIMEOUT, /*! * An Rx timeout occurred on receive window 2 */ LORAMAC_EVENT_INFO_STATUS_RX2_TIMEOUT, /*! * An Rx error occurred on receive window 1 */ LORAMAC_EVENT_INFO_STATUS_RX1_ERROR, /*! * An Rx error occurred on receive window 2 */ LORAMAC_EVENT_INFO_STATUS_RX2_ERROR, /*! * An error occurred in the join procedure */ LORAMAC_EVENT_INFO_STATUS_JOIN_FAIL, /*! * A frame with an invalid downlink counter was received. The * downlink counter of the frame was equal to the local copy * of the downlink counter of the node. */ LORAMAC_EVENT_INFO_STATUS_DOWNLINK_REPEATED, /*! * The MAC could not retransmit a frame since the MAC decreased the datarate. The * payload size is not applicable for the datarate. */ LORAMAC_EVENT_INFO_STATUS_TX_DR_PAYLOAD_SIZE_ERROR, /*! * The node has lost MAX_FCNT_GAP or more frames. */ LORAMAC_EVENT_INFO_STATUS_DOWNLINK_TOO_MANY_FRAMES_LOSS, /*! * An address error occurred */ LORAMAC_EVENT_INFO_STATUS_ADDRESS_FAIL, /*! * Message integrity check failure */ LORAMAC_EVENT_INFO_STATUS_MIC_FAIL, /*! * Not used */ LORAMAC_EVENT_INFO_STATUS_MULTICAST_FAIL, /*! * The node has received a beacon. Acquisition is no longer pending */ LORAMAC_EVENT_INFO_STATUS_BEACON_LOCKED, /*! * The node has not received a beacon for at least CLASSB_MAX_BEACON_LESS_PERIOD */ LORAMAC_EVENT_INFO_STATUS_BEACON_LOST, /*! * The node has not received a beacon after the CLASSB_BEACON_INTERVAL */ LORAMAC_EVENT_INFO_STATUS_BEACON_NOT_FOUND, }LoRaMacEventInfoStatus_t; /*! * LoRaMac tx/rx operation state */ typedef union eLoRaMacFlags_t { /*! * Byte-access to the bits */ uint8_t Value; /*! * Structure containing single access to bits */ struct sMacFlagBits { /*! * MCPS-Req pending */ uint8_t McpsReq : 1; /*! * MCPS-Ind pending */ uint8_t McpsInd : 1; /*! * MLME-Req pending */ uint8_t MlmeReq : 1; /*! * MLME-Ind pending */ uint8_t MlmeInd : 1; /*! * MLME-Ind to schedule an uplink pending */ uint8_t MlmeSchedUplinkInd : 1; /*! * MAC cycle done */ uint8_t MacDone : 1; }Bits; }LoRaMacFlags_t; /*! * * \brief LoRaMAC data services * * \details The following table list the primitives which are supported by the * specific MAC data service: * * Name | Request | Indication | Response | Confirm * --------------------- | :-----: | :--------: | :------: | :-----: * \ref MCPS_UNCONFIRMED | YES | YES | NO | YES * \ref MCPS_CONFIRMED | YES | YES | NO | YES * \ref MCPS_MULTICAST | NO | YES | NO | NO * \ref MCPS_PROPRIETARY | YES | YES | NO | YES * * The following table provides links to the function implementations of the * related MCPS primitives: * * Primitive | Function * ---------------- | :---------------------: * MCPS-Request | \ref LoRaMacMlmeRequest * MCPS-Confirm | MacMcpsConfirm in \ref LoRaMacPrimitives_t * MCPS-Indication | MacMcpsIndication in \ref LoRaMacPrimitives_t */ typedef enum eMcps { /*! * Unconfirmed LoRaMAC frame */ MCPS_UNCONFIRMED, /*! * Confirmed LoRaMAC frame */ MCPS_CONFIRMED, /*! * Multicast LoRaMAC frame */ MCPS_MULTICAST, /*! * Proprietary frame */ MCPS_PROPRIETARY, }Mcps_t; /*! * Structure which defines return parameters for requests. */ typedef struct sRequestReturnParam { /*! * This value reports the time in milliseconds which * an application must wait before its possible to send * the next uplink. */ TimerTime_t DutyCycleWaitTime; }RequestReturnParam_t; /*! * LoRaMAC MCPS-Request for an unconfirmed frame */ typedef struct sMcpsReqUnconfirmed { /*! * Frame port field. Must be set if the payload is not empty. Use the * application specific frame port values: [1...223] * * LoRaWAN Specification V1.0.2, chapter 4.3.2 */ uint8_t fPort; /*! * Pointer to the buffer of the frame payload */ void* fBuffer; /*! * Size of the frame payload */ uint16_t fBufferSize; /*! * Uplink datarate, if ADR is off */ int8_t Datarate; }McpsReqUnconfirmed_t; /*! * LoRaMAC MCPS-Request for a confirmed frame */ typedef struct sMcpsReqConfirmed { /*! * Frame port field. Must be set if the payload is not empty. Use the * application specific frame port values: [1...223] * * LoRaWAN Specification V1.0.2, chapter 4.3.2 */ uint8_t fPort; /*! * Pointer to the buffer of the frame payload */ void* fBuffer; /*! * Size of the frame payload */ uint16_t fBufferSize; /*! * Uplink datarate, if ADR is off */ int8_t Datarate; /*! * Number of trials to transmit the frame, if the LoRaMAC layer did not * receive an acknowledgment. The MAC performs a datarate adaptation, * according to the LoRaWAN Specification V1.0.2, chapter 18.4, according * to the following table: * * Transmission nb | Data Rate * ----------------|----------- * 1 (first) | DR * 2 | DR * 3 | max(DR-1,0) * 4 | max(DR-1,0) * 5 | max(DR-2,0) * 6 | max(DR-2,0) * 7 | max(DR-3,0) * 8 | max(DR-3,0) * * Note, that if NbTrials is set to 1 or 2, the MAC will not decrease * the datarate, in case the LoRaMAC layer did not receive an acknowledgment */ uint8_t NbTrials; }McpsReqConfirmed_t; /*! * LoRaMAC MCPS-Request for a proprietary frame */ typedef struct sMcpsReqProprietary { /*! * Pointer to the buffer of the frame payload */ void* fBuffer; /*! * Size of the frame payload */ uint16_t fBufferSize; /*! * Uplink datarate, if ADR is off */ int8_t Datarate; }McpsReqProprietary_t; /*! * LoRaMAC MCPS-Request structure */ typedef struct sMcpsReq { /*! * MCPS-Request type */ Mcps_t Type; /*! * MCPS-Request parameters */ union uMcpsParam { /*! * MCPS-Request parameters for an unconfirmed frame */ McpsReqUnconfirmed_t Unconfirmed; /*! * MCPS-Request parameters for a confirmed frame */ McpsReqConfirmed_t Confirmed; /*! * MCPS-Request parameters for a proprietary frame */ McpsReqProprietary_t Proprietary; }Req; /*! * MCPS-Request return parameters */ RequestReturnParam_t ReqReturn; }McpsReq_t; /*! * LoRaMAC MCPS-Confirm */ typedef struct sMcpsConfirm { /*! * Holds the previously performed MCPS-Request */ Mcps_t McpsRequest; /*! * Status of the operation */ LoRaMacEventInfoStatus_t Status; /*! * Uplink datarate */ uint8_t Datarate; /*! * Transmission power */ int8_t TxPower; /*! * Set if an acknowledgement was received */ bool AckReceived; /*! * Provides the number of retransmissions */ uint8_t NbRetries; /*! * The transmission time on air of the frame */ TimerTime_t TxTimeOnAir; /*! * The uplink counter value related to the frame */ uint32_t UpLinkCounter; /*! * The uplink channel related to the frame */ uint32_t Channel; }McpsConfirm_t; /*! * LoRaMAC MCPS-Indication primitive */ typedef struct sMcpsIndication { /*! * MCPS-Indication type */ Mcps_t McpsIndication; /*! * Status of the operation */ LoRaMacEventInfoStatus_t Status; /*! * Multicast */ uint8_t Multicast; /*! * Application port */ uint8_t Port; /*! * Downlink datarate */ uint8_t RxDatarate; /*! * Frame pending status */ uint8_t FramePending; /*! * Pointer to the received data stream */ uint8_t* Buffer; /*! * Size of the received data stream */ uint8_t BufferSize; /*! * Indicates, if data is available */ bool RxData; /*! * Rssi of the received packet */ int16_t Rssi; /*! * Snr of the received packet */ int8_t Snr; /*! * Receive window */ LoRaMacRxSlot_t RxSlot; /*! * Set if an acknowledgement was received */ bool AckReceived; /*! * The downlink counter value for the received frame */ uint32_t DownLinkCounter; /*! * The device address of the frame */ uint32_t DevAddress; /*! * Set if a DeviceTimeAns MAC command was received. */ bool DeviceTimeAnsReceived; }McpsIndication_t; /*! * \brief LoRaMAC management services * * \details The following table list the primitives which are supported by the * specific MAC management service: * * Name | Request | Indication | Response | Confirm * ---------------------------- | :-----: | :--------: | :------: | :-----: * \ref MLME_JOIN | YES | NO | NO | YES * \ref MLME_LINK_CHECK | YES | NO | NO | YES * \ref MLME_TXCW | YES | NO | NO | YES * \ref MLME_SCHEDULE_UPLINK | NO | YES | NO | NO * \ref MLME_DERIVE_MC_KE_KEY | YES | NO | NO | YES * \ref MLME_DERIVE_MC_KEY_PAIR | YES | NO | NO | YES * * The following table provides links to the function implementations of the * related MLME primitives. * * Primitive | Function * ---------------- | :---------------------: * MLME-Request | \ref LoRaMacMlmeRequest * MLME-Confirm | MacMlmeConfirm in \ref LoRaMacPrimitives_t * MLME-Indication | MacMlmeIndication in \ref LoRaMacPrimitives_t */ typedef enum eMlme { /*! * An unknown MLME service */ MLME_UNKNOWN, /*! * Initiates the Over-the-Air activation * * LoRaWAN Specification V1.0.2, chapter 6.2 */ MLME_JOIN, /*! * Initiates sending a ReJoin-request type 0 * * LoRaWAN Specification V1.1.0, chapter 6.2.4.1 */ MLME_REJOIN_0, /*! * Initiates sending a ReJoin-request type 1 * * LoRaWAN Specification V1.1.0, chapter 6.2.4.2 */ MLME_REJOIN_1, /*! * LinkCheckReq - Connectivity validation * * LoRaWAN Specification V1.0.2, chapter 5, table 4 */ MLME_LINK_CHECK, /*! * Sets Tx continuous wave mode * * LoRaWAN end-device certification */ MLME_TXCW, /*! * Sets Tx continuous wave mode (new LoRa-Alliance CC definition) * * LoRaWAN end-device certification */ MLME_TXCW_1, /*! * Indicates that the application shall perform an uplink as * soon as possible. */ MLME_SCHEDULE_UPLINK, /*! * Derives the McKEKey from the AppKey or NwkKey. */ MLME_DERIVE_MC_KE_KEY, /*! * Derives a Multicast group key pair ( McAppSKey, McNwkSKey ) from McKey */ MLME_DERIVE_MC_KEY_PAIR, /*! * Initiates a DeviceTimeReq * * LoRaWAN end-device certification */ MLME_DEVICE_TIME, /*! * The MAC uses this MLME primitive to indicate a beacon reception * status. * * LoRaWAN end-device certification */ MLME_BEACON, /*! * Initiate a beacon acquisition. The MAC will search for a beacon. * It will search for XX_BEACON_INTERVAL milliseconds. * * LoRaWAN end-device certification */ MLME_BEACON_ACQUISITION, /*! * Initiates a PingSlotInfoReq * * LoRaWAN end-device certification */ MLME_PING_SLOT_INFO, /*! * Initiates a BeaconTimingReq * * LoRaWAN end-device certification */ MLME_BEACON_TIMING, /*! * Primitive which indicates that the beacon has been lost * * \remark The upper layer is required to switch the device class to ClassA * * LoRaWAN end-device certification */ MLME_BEACON_LOST, }Mlme_t; /*! * LoRaMAC MLME-Request for the join service */ typedef struct sMlmeReqJoin { /*! * Datarate used for join request. */ uint8_t Datarate; }MlmeReqJoin_t; /*! * LoRaMAC MLME-Request for Tx continuous wave mode */ typedef struct sMlmeReqTxCw { /*! * Time in seconds while the radio is kept in continuous wave mode */ uint16_t Timeout; /*! * RF frequency to set (Only used with new way) */ uint32_t Frequency; /*! * RF output power to set (Only used with new way) */ uint8_t Power; }MlmeReqTxCw_t; /*! * LoRaMAC MLME-Request for the ping slot info service */ typedef struct sMlmeReqPingSlotInfo { PingSlotInfo_t PingSlot; }MlmeReqPingSlotInfo_t; /*! * LoRaMAC MLME-Request to derive the McKEKey from the AppKey or NwkKey */ typedef struct sMlmeReqDeriveMcKEKey { /*! * Key identifier of the root key to use to perform the derivation ( NwkKey or AppKey ) */ KeyIdentifier_t KeyID; /*! * Nonce value ( nonce <= 15) */ uint16_t Nonce; /*! * DevEUI Value */ uint8_t* DevEUI; }MlmeReqDeriveMcKEKey_t; /*! * LoRaMAC MLME-Request to derive a Multicast group key pair ( McAppSKey, McNwkSKey ) from McKey */ typedef struct sMlmeReqDeriveMcSessionKeyPair { /*! * Address identifier to select the multicast group */ AddressIdentifier_t GroupID; }MlmeReqDeriveMcSessionKeyPair_t; /*! * LoRaMAC MLME-Request structure */ typedef struct sMlmeReq { /*! * MLME-Request type */ Mlme_t Type; /*! * MLME-Request parameters */ union uMlmeParam { /*! * MLME-Request parameters for a join request */ MlmeReqJoin_t Join; /*! * MLME-Request parameters for Tx continuous mode request */ MlmeReqTxCw_t TxCw; /*! * MLME-Request parameters for a ping slot info request */ MlmeReqPingSlotInfo_t PingSlotInfo; /*! * MLME-Request to derive the McKEKey from the AppKey or NwkKey */ MlmeReqDeriveMcKEKey_t DeriveMcKEKey; /*! * MLME-Request to derive a Multicast group key pair ( McAppSKey, McNwkSKey ) from McKey */ MlmeReqDeriveMcSessionKeyPair_t DeriveMcSessionKeyPair; }Req; /*! * MLME-Request return parameters */ RequestReturnParam_t ReqReturn; }MlmeReq_t; /*! * LoRaMAC MLME-Confirm primitive */ typedef struct sMlmeConfirm { /*! * Holds the previously performed MLME-Request */ Mlme_t MlmeRequest; /*! * Status of the operation */ LoRaMacEventInfoStatus_t Status; /*! * The transmission time on air of the frame */ TimerTime_t TxTimeOnAir; /*! * Demodulation margin. Contains the link margin [dB] of the last * successfully received LinkCheckReq */ uint8_t DemodMargin; /*! * Number of gateways which received the last LinkCheckReq */ uint8_t NbGateways; /*! * Provides the number of retransmissions */ uint8_t NbRetries; /*! * The delay which we have received through the * BeaconTimingAns */ TimerTime_t BeaconTimingDelay; /*! * The channel of the next beacon */ uint8_t BeaconTimingChannel; }MlmeConfirm_t; /*! * LoRaMAC MLME-Indication primitive */ typedef struct sMlmeIndication { /*! * MLME-Indication type */ Mlme_t MlmeIndication; /*! * Status of the operation */ LoRaMacEventInfoStatus_t Status; /*! * Beacon information. Only valid for \ref MLME_BEACON, * status \ref LORAMAC_EVENT_INFO_STATUS_BEACON_LOCKED */ BeaconInfo_t BeaconInfo; }MlmeIndication_t; /*! * LoRa Mac Information Base (MIB) * * The following table lists the MIB parameters and the related attributes: * * Attribute | Get | Set * ----------------------------------------------| :-: | :-: * \ref MIB_DEVICE_CLASS | YES | YES * \ref MIB_NETWORK_ACTIVATION | YES | YES * \ref MIB_DEV_EUI | YES | YES * \ref MIB_JOIN_EUI | YES | YES * \ref MIB_ADR | YES | YES * \ref MIB_NET_ID | YES | YES * \ref MIB_DEV_ADDR | YES | YES * \ref MIB_APP_KEY | NO | YES * \ref MIB_NWK_KEY | NO | YES * \ref MIB_J_S_INT_KEY | NO | YES * \ref MIB_J_S_ENC_KEY | NO | YES * \ref MIB_F_NWK_S_INT_KEY | NO | YES * \ref MIB_S_NWK_S_INT_KEY | NO | YES * \ref MIB_NWK_S_ENC_KEY | NO | YES * \ref MIB_APP_S_KEY | NO | YES * \ref MIB_MC_KE_KEY | NO | YES * \ref MIB_MC_KEY_0 | NO | YES * \ref MIB_MC_APP_S_KEY_0 | NO | YES * \ref MIB_MC_NWK_S_KEY_0 | NO | YES * \ref MIB_MC_KEY_1 | NO | YES * \ref MIB_MC_APP_S_KEY_1 | NO | YES * \ref MIB_MC_NWK_S_KEY_1 | NO | YES * \ref MIB_MC_KEY_2 | NO | YES * \ref MIB_MC_APP_S_KEY_2 | NO | YES * \ref MIB_MC_NWK_S_KEY_2 | NO | YES * \ref MIB_MC_KEY_3 | NO | YES * \ref MIB_MC_APP_S_KEY_3 | NO | YES * \ref MIB_MC_NWK_S_KEY_3 | NO | YES * \ref MIB_PUBLIC_NETWORK | YES | YES * \ref MIB_REPEATER_SUPPORT | YES | YES * \ref MIB_CHANNELS | YES | NO * \ref MIB_RX2_CHANNEL | YES | YES * \ref MIB_RX2_DFAULT_CHANNEL | YES | YES * \ref MIB_RXC_CHANNEL | YES | YES * \ref MIB_RXC_DFAULT_CHANNEL | YES | YES * \ref MIB_CHANNELS_MASK | YES | YES * \ref MIB_CHANNELS_DEFAULT_MASK | YES | YES * \ref MIB_CHANNELS_NB_TRANS | YES | YES * \ref MIB_MAX_RX_WINDOW_DURATION | YES | YES * \ref MIB_RECEIVE_DELAY_1 | YES | YES * \ref MIB_RECEIVE_DELAY_2 | YES | YES * \ref MIB_JOIN_ACCEPT_DELAY_1 | YES | YES * \ref MIB_JOIN_ACCEPT_DELAY_2 | YES | YES * \ref MIB_CHANNELS_DATARATE | YES | YES * \ref MIB_CHANNELS_DEFAULT_DATARATE | YES | YES * \ref MIB_CHANNELS_TX_POWER | YES | YES * \ref MIB_CHANNELS_DEFAULT_TX_POWER | YES | YES * \ref MIB_SYSTEM_MAX_RX_ERROR | YES | YES * \ref MIB_MIN_RX_SYMBOLS | YES | YES * \ref MIB_BEACON_INTERVAL | YES | YES * \ref MIB_BEACON_RESERVED | YES | YES * \ref MIB_BEACON_GUARD | YES | YES * \ref MIB_BEACON_WINDOW | YES | YES * \ref MIB_BEACON_WINDOW_SLOTS | YES | YES * \ref MIB_PING_SLOT_WINDOW | YES | YES * \ref MIB_BEACON_SYMBOL_TO_DEFAULT | YES | YES * \ref MIB_BEACON_SYMBOL_TO_EXPANSION_MAX | YES | YES * \ref MIB_PING_SLOT_SYMBOL_TO_EXPANSION_MAX | YES | YES * \ref MIB_BEACON_SYMBOL_TO_EXPANSION_FACTOR | YES | YES * \ref MIB_PING_SLOT_SYMBOL_TO_EXPANSION_FACTOR | YES | YES * \ref MIB_MAX_BEACON_LESS_PERIOD | YES | YES * \ref MIB_ANTENNA_GAIN | YES | YES * \ref MIB_DEFAULT_ANTENNA_GAIN | YES | YES * \ref MIB_NVM_CTXS | YES | YES * \ref MIB_ABP_LORAWAN_VERSION | NO | YES * \ref MIB_LORAWAN_VERSION | YES | NO * * The following table provides links to the function implementations of the * related MIB primitives: * * Primitive | Function * ---------------- | :---------------------: * MIB-Set | \ref LoRaMacMibSetRequestConfirm * MIB-Get | \ref LoRaMacMibGetRequestConfirm */ typedef enum eMib { /*! * LoRaWAN device class * * LoRaWAN Specification V1.0.2 */ MIB_DEVICE_CLASS, /*! * LoRaWAN Network End-Device Activation * * LoRaWAN Specification V1.0.2 */ MIB_NETWORK_ACTIVATION, /*! * LoRaWAN device EUI * * LoRaWAN Specification V1.0.2 */ MIB_DEV_EUI, /*! * LoRaWAN join EUI * * LoRaWAN Specification V1.0.2 */ MIB_JOIN_EUI, /*! * Adaptive data rate * * LoRaWAN Specification V1.0.2, chapter 4.3.1.1 * * [true: ADR enabled, false: ADR disabled] */ MIB_ADR, /*! * Network identifier * * LoRaWAN Specification V1.0.2, chapter 6.1.1 */ MIB_NET_ID, /*! * End-device address * * LoRaWAN Specification V1.0.2, chapter 6.1.1 */ MIB_DEV_ADDR, /*! * Application root key * * LoRaWAN Specification V1.1.0, chapter 6.1.1.3 */ MIB_APP_KEY, /*! * Network root key * * LoRaWAN Specification V1.1.0, chapter 6.1.1.3 */ MIB_NWK_KEY, #if ( USE_LRWAN_1_1_X_CRYPTO == 1 ) /*! * Join session integrity key * * LoRaWAN Specification V1.1.0, chapter 6.1.1.4 */ MIB_J_S_INT_KEY, /*! * Join session encryption key * * LoRaWAN Specification V1.1.0, chapter 6.1.1.4 */ MIB_J_S_ENC_KEY, /*! * Forwarding Network session integrity key * * LoRaWAN Specification V1.1.0, chapter 6.1.2.2 */ MIB_F_NWK_S_INT_KEY, /*! * Serving Network session integrity key * * LoRaWAN Specification V1.1.0, chapter 6.1.2.3 */ MIB_S_NWK_S_INT_KEY, /*! * Network session encryption key * * LoRaWAN Specification V1.1.0, chapter 6.1.2.4 */ MIB_NWK_S_ENC_KEY, #else /* USE_LRWAN_1_1_X_CRYPTO == 0 */ /*! * Network session key */ MIB_NWK_S_KEY, #endif /* USE_LRWAN_1_1_X_CRYPTO */ /*! * Application session key * * LoRaWAN Specification V1.1.0, chapter 6.1.1.3 */ MIB_APP_S_KEY, /*! * Multicast key encryption key * * LoRaWAN - Secure element specification v1 */ MIB_MC_KE_KEY, /*! * Multicast root key index 0 * * LoRaWAN - Secure element specification v1 */ MIB_MC_KEY_0, /*! * Multicast Application session key index 0 * * LoRaWAN - Secure element specification v1 */ MIB_MC_APP_S_KEY_0, /*! * Multicast Network session key index 0 * * LoRaWAN - Secure element specification v1 */ MIB_MC_NWK_S_KEY_0, #if ( LORAMAC_MAX_MC_CTX > 1 ) /*! * Multicast root key index 1 * * LoRaWAN - Secure element specification v1 */ MIB_MC_KEY_1, /*! * Multicast Application session key index 1 * * LoRaWAN - Secure element specification v1 */ MIB_MC_APP_S_KEY_1, /*! * Multicast Network session key index 1 * * LoRaWAN - Secure element specification v1 */ MIB_MC_NWK_S_KEY_1, /*! * Multicast root key index 2 * * LoRaWAN - Secure element specification v1 */ MIB_MC_KEY_2, /*! * Multicast Application session key index 2 * * LoRaWAN - Secure element specification v1 */ MIB_MC_APP_S_KEY_2, /*! * Multicast Network session key index 2 * * LoRaWAN - Secure element specification v1 */ MIB_MC_NWK_S_KEY_2, /*! * Multicast root key index 3 * * LoRaWAN - Secure element specification v1 */ MIB_MC_KEY_3, /*! * Multicast Application session key index 3 * * LoRaWAN - Secure element specification v1 */ MIB_MC_APP_S_KEY_3, /*! * Multicast Network session key index 3 * * LoRaWAN - Secure element specification v1 */ MIB_MC_NWK_S_KEY_3, #endif /* LORAMAC_MAX_MC_CTX > 1 */ /*! * Set the network type to public or private * * LoRaWAN Regional Parameters V1.0.2rB * * [true: public network, false: private network] */ MIB_PUBLIC_NETWORK, /*! * Support the operation with repeaters * * LoRaWAN Regional Parameters V1.0.2rB * * [true: repeater support enabled, false: repeater support disabled] */ MIB_REPEATER_SUPPORT, /*! * Communication channels. A get request will return a * pointer which references the first entry of the channel list. The * list is of size LORA_MAX_NB_CHANNELS * * LoRaWAN Regional Parameters V1.0.2rB */ MIB_CHANNELS, /*! * Set receive window 2 channel * * LoRaWAN Specification V1.0.2, chapter 3.3.1 */ MIB_RX2_CHANNEL, /*! * Set receive window 2 channel * * LoRaWAN Specification V1.0.2, chapter 3.3.2 */ MIB_RX2_DEFAULT_CHANNEL, /*! * Set receive window C channel * * LoRaWAN Specification V1.0.2, chapter 3.3.1 */ MIB_RXC_CHANNEL, /*! * Set receive window C channel * * LoRaWAN Specification V1.0.2, chapter 3.3.2 */ MIB_RXC_DEFAULT_CHANNEL, /*! * LoRaWAN channels mask * * LoRaWAN Regional Parameters V1.0.2rB */ MIB_CHANNELS_MASK, /*! * LoRaWAN default channels mask * * LoRaWAN Regional Parameters V1.0.2rB */ MIB_CHANNELS_DEFAULT_MASK, /*! * Set the number of repetitions on a channel * * LoRaWAN Specification V1.0.2, chapter 5.2 */ MIB_CHANNELS_NB_TRANS, /*! * Maximum receive window duration in [ms] * * LoRaWAN Specification V1.0.2, chapter 3.3.3 */ MIB_MAX_RX_WINDOW_DURATION, /*! * Receive delay 1 in [ms] * * LoRaWAN Regional Parameters V1.0.2rB */ MIB_RECEIVE_DELAY_1, /*! * Receive delay 2 in [ms] * * LoRaWAN Regional Parameters V1.0.2rB */ MIB_RECEIVE_DELAY_2, /*! * Join accept delay 1 in [ms] * * LoRaWAN Regional Parameters V1.0.2rB */ MIB_JOIN_ACCEPT_DELAY_1, /*! * Join accept delay 2 in [ms] * * LoRaWAN Regional Parameters V1.0.2rB */ MIB_JOIN_ACCEPT_DELAY_2, /*! * Default Data rate of a channel * * LoRaWAN Regional Parameters V1.0.2rB * * The allowed ranges are region specific. Please refer to \ref DR_0 to \ref DR_15 for details. */ MIB_CHANNELS_DEFAULT_DATARATE, /*! * Data rate of a channel * * LoRaWAN Regional Parameters V1.0.2rB * * The allowed ranges are region specific. Please refer to \ref DR_0 to \ref DR_15 for details. */ MIB_CHANNELS_DATARATE, /*! * Transmission power of a channel * * LoRaWAN Regional Parameters V1.0.2rB * * The allowed ranges are region specific. Please refer to \ref TX_POWER_0 to \ref TX_POWER_15 for details. */ MIB_CHANNELS_TX_POWER, /*! * Transmission power of a channel * * LoRaWAN Regional Parameters V1.0.2rB * * The allowed ranges are region specific. Please refer to \ref TX_POWER_0 to \ref TX_POWER_15 for details. */ MIB_CHANNELS_DEFAULT_TX_POWER, /*! * System overall timing error in milliseconds. * [-SystemMaxRxError : +SystemMaxRxError] * Default: +/-10 ms */ MIB_SYSTEM_MAX_RX_ERROR, /*! * Minimum required number of symbols to detect an Rx frame * Default: 6 symbols */ MIB_MIN_RX_SYMBOLS, /*! * Antenna gain of the node. Default value is region specific. * The antenna gain is used to calculate the TX power of the node. * The formula is: * radioTxPower = ( int8_t )floor( maxEirp - antennaGain ) * * \remark The antenna gain value is referenced to the isotropic antenna. * The value is in dBi. * MIB_ANTENNA_GAIN[dBi] = measuredAntennaGain[dBd] + 2.15 */ MIB_ANTENNA_GAIN, /*! * Default antenna gain of the node. Default value is region specific. * The antenna gain is used to calculate the TX power of the node. * The formula is: * radioTxPower = ( int8_t )floor( maxEirp - antennaGain ) * * \remark The antenna gain value is referenced to the isotropic antenna. * The value is in dBi. * MIB_DEFAULT_ANTENNA_GAIN[dBi] = measuredAntennaGain[dBd] + 2.15 */ MIB_DEFAULT_ANTENNA_GAIN, /*! * Structure holding pointers to internal contexts and its size */ MIB_NVM_CTXS, /*! * LoRaWAN MAC layer operating version when activated by ABP. */ MIB_ABP_LORAWAN_VERSION, /*! * LoRaWAN MAC and regional parameter version. */ MIB_LORAWAN_VERSION, /*! * Beacon interval in ms */ MIB_BEACON_INTERVAL, /*! * Beacon reserved time in ms */ MIB_BEACON_RESERVED, /*! * Beacon guard time in ms */ MIB_BEACON_GUARD, /*! * Beacon window time in ms */ MIB_BEACON_WINDOW, /*! * Beacon window time in number of slots */ MIB_BEACON_WINDOW_SLOTS, /*! * Ping slot length time in ms */ MIB_PING_SLOT_WINDOW, /*! * Default symbol timeout for beacons and ping slot windows */ MIB_BEACON_SYMBOL_TO_DEFAULT, /*! * Maximum symbol timeout for beacons */ MIB_BEACON_SYMBOL_TO_EXPANSION_MAX, /*! * Maximum symbol timeout for ping slots */ MIB_PING_SLOT_SYMBOL_TO_EXPANSION_MAX, /*! * Symbol expansion value for beacon windows in case of beacon * loss in symbols */ MIB_BEACON_SYMBOL_TO_EXPANSION_FACTOR, /*! * Symbol expansion value for ping slot windows in case of beacon * loss in symbols */ MIB_PING_SLOT_SYMBOL_TO_EXPANSION_FACTOR, /*! * Maximum allowed beacon less time in ms */ MIB_MAX_BEACON_LESS_PERIOD, /*! * Ping slot data rate * * LoRaWAN Regional Parameters V1.0.2rB * * The allowed ranges are region specific. Please refer to \ref DR_0 to \ref DR_15 for details. */ MIB_PING_SLOT_DATARATE, }Mib_t; /*! * LoRaMAC MIB parameters */ typedef union uMibParam { /*! * LoRaWAN device class * * Related MIB type: \ref MIB_DEVICE_CLASS */ DeviceClass_t Class; /*! * LoRaWAN Network End-Device Activation ( ACTIVATION_TYPE_NONE, ACTIVATION_TYPE_ABP or OTTA ) * * Related MIB type: \ref MIB_NETWORK_ACTIVATION */ ActivationType_t NetworkActivation; /*! * LoRaWAN device EUI * * Related MIB type: \ref MIB_DEV_EUI */ uint8_t* DevEui; /*! * LoRaWAN Join server EUI * * Related MIB type: \ref MIB_JOIN_EUI */ uint8_t* JoinEui; /*! * Activation state of ADR * * Related MIB type: \ref MIB_ADR */ bool AdrEnable; /*! * Network identifier * * Related MIB type: \ref MIB_NET_ID */ uint32_t NetID; /*! * End-device address * * Related MIB type: \ref MIB_DEV_ADDR */ uint32_t DevAddr; /*! * Application root key * * Related MIB type: \ref MIB_APP_KEY */ uint8_t* AppKey; /*! * Network root key * * Related MIB type: \ref MIB_NWK_KEY */ uint8_t* NwkKey; #if ( USE_LRWAN_1_1_X_CRYPTO == 1 ) /*! * Join session integrity key * * Related MIB type: \ref MIB_J_S_INT_KEY */ uint8_t* JSIntKey; /*! * Join session encryption key * * Related MIB type: \ref MIB_J_S_ENC_KEY */ uint8_t* JSEncKey; /*! * Forwarding Network session integrity key * * Related MIB type: \ref MIB_F_NWK_S_INT_KEY */ uint8_t* FNwkSIntKey; /*! * Serving Network session integrity key * * Related MIB type: \ref MIB_S_NWK_S_INT_KEY */ uint8_t* SNwkSIntKey; /*! * Network session encryption key * * Related MIB type: \ref MIB_NWK_S_ENC_KEY */ uint8_t* NwkSEncKey; #else /* USE_LRWAN_1_1_X_CRYPTO == 0 */ /*! * Network session key * * Related MIB type: \ref MIB_NWK_S_KEY */ uint8_t* NwkSKey; #endif /* USE_LRWAN_1_1_X_CRYPTO */ /*! * Application session key * * Related MIB type: \ref MIB_APP_S_KEY */ uint8_t* AppSKey; /*! * Multicast key encryption key * * Related MIB type: \ref MIB_MC_KE_KEY */ uint8_t* McKEKey; /*! * Multicast root key index 0 * * Related MIB type: \ref MIB_MC_KEY_0 */ uint8_t* McKey0; /*! * Multicast Application session key index 0 * * Related MIB type: \ref MIB_MC_APP_S_KEY_0 */ uint8_t* McAppSKey0; /*! * Multicast Network session key index 0 * * Related MIB type: \ref MIB_MC_NWK_S_KEY_0 */ uint8_t* McNwkSKey0; /*! * Multicast root key index 0 * * Related MIB type: \ref MIB_MC_KEY_0 */ uint8_t* McKey1; /*! * Multicast Application session key index 1 * * Related MIB type: \ref MIB_MC_APP_S_KEY_1 */ uint8_t* McAppSKey1; /*! * Multicast Network session key index 1 * * Related MIB type: \ref MIB_MC_NWK_S_KEY_1 */ uint8_t* McNwkSKey1; /*! * Multicast root key index 2 * * Related MIB type: \ref MIB_MC_KEY_2 */ uint8_t* McKey2; /*! * Multicast Application session key index 2 * * Related MIB type: \ref MIB_MC_APP_S_KEY_2 */ uint8_t* McAppSKey2; /*! * Multicast Network session key index 2 * * Related MIB type: \ref MIB_MC_NWK_S_KEY_2 */ uint8_t* McNwkSKey2; /*! * Multicast root key index 2 * * Related MIB type: \ref MIB_MC_KEY_2 */ uint8_t* McKey3; /*! * Multicast Application session key index 2 * * Related MIB type: \ref MIB_MC_APP_S_KEY_2 */ uint8_t* McAppSKey3; /*! * Multicast Network session key index 2 * * Related MIB type: \ref MIB_MC_NWK_S_KEY_2 */ uint8_t* McNwkSKey3; /*! * Enable or disable a public network * * Related MIB type: \ref MIB_PUBLIC_NETWORK */ bool EnablePublicNetwork; /*! * Enable or disable repeater support * * Related MIB type: \ref MIB_REPEATER_SUPPORT */ bool EnableRepeaterSupport; /*! * LoRaWAN Channel * * Related MIB type: \ref MIB_CHANNELS */ ChannelParams_t* ChannelList; /*! * Channel for the receive window 2 * * Related MIB type: \ref MIB_RX2_CHANNEL */ RxChannelParams_t Rx2Channel; /*! * Channel for the receive window 2 * * Related MIB type: \ref MIB_RX2_DEFAULT_CHANNEL */ RxChannelParams_t Rx2DefaultChannel; /*! * Channel for the receive window C * * Related MIB type: \ref MIB_RXC_CHANNEL */ RxChannelParams_t RxCChannel; /*! * Channel for the receive window C * * Related MIB type: \ref MIB_RXC_DEFAULT_CHANNEL */ RxChannelParams_t RxCDefaultChannel; /*! * Channel mask * * Related MIB type: \ref MIB_CHANNELS_MASK */ uint16_t* ChannelsMask; /*! * Default channel mask * * Related MIB type: \ref MIB_CHANNELS_DEFAULT_MASK */ uint16_t* ChannelsDefaultMask; /*! * Number of frame repetitions * * Related MIB type: \ref MIB_CHANNELS_NB_TRANS */ uint8_t ChannelsNbTrans; /*! * Maximum receive window duration * * Related MIB type: \ref MIB_MAX_RX_WINDOW_DURATION */ uint32_t MaxRxWindow; /*! * Receive delay 1 * * Related MIB type: \ref MIB_RECEIVE_DELAY_1 */ uint32_t ReceiveDelay1; /*! * Receive delay 2 * * Related MIB type: \ref MIB_RECEIVE_DELAY_2 */ uint32_t ReceiveDelay2; /*! * Join accept delay 1 * * Related MIB type: \ref MIB_JOIN_ACCEPT_DELAY_1 */ uint32_t JoinAcceptDelay1; /*! * Join accept delay 2 * * Related MIB type: \ref MIB_JOIN_ACCEPT_DELAY_2 */ uint32_t JoinAcceptDelay2; /*! * Channels data rate * * Related MIB type: \ref MIB_CHANNELS_DEFAULT_DATARATE */ int8_t ChannelsDefaultDatarate; /*! * Channels data rate * * Related MIB type: \ref MIB_CHANNELS_DATARATE */ int8_t ChannelsDatarate; /*! * Channels TX power * * Related MIB type: \ref MIB_CHANNELS_DEFAULT_TX_POWER */ int8_t ChannelsDefaultTxPower; /*! * Channels TX power * * Related MIB type: \ref MIB_CHANNELS_TX_POWER */ int8_t ChannelsTxPower; /*! * Multicast channels * * Related MIB type: \ref MIB_MULTICAST_CHANNEL */ McChannelParams_t MulticastChannel; /*! * System overall timing error in milliseconds. * * Related MIB type: \ref MIB_SYSTEM_MAX_RX_ERROR */ uint32_t SystemMaxRxError; /*! * Minimum required number of symbols to detect an Rx frame * * Related MIB type: \ref MIB_MIN_RX_SYMBOLS */ uint8_t MinRxSymbols; /*! * Antenna gain * * Related MIB type: \ref MIB_ANTENNA_GAIN */ float AntennaGain; /*! * Default antenna gain * * Related MIB type: \ref MIB_DEFAULT_ANTENNA_GAIN */ float DefaultAntennaGain; /*! * Structure holding pointers to internal non-volatile contexts and its lengths. * * Related MIB type: \ref MIB_NVM_CTXS */ LoRaMacCtxs_t* Contexts; /* * LoRaWAN MAC layer operating version when activated by ABP. * * Related MIB type: \ref MIB_ABP_LORAWAN_VERSION */ Version_t AbpLrWanVersion; /* * LoRaWAN MAC regional parameter version. * * Related MIB type: \ref MIB_LORAWAN_VERSION */ struct sLrWanVersion { Version_t LoRaWan; Version_t LoRaWanRegion; }LrWanVersion; /*! * Beacon interval in ms * * Related MIB type: \ref MIB_BEACON_INTERVAL */ uint32_t BeaconInterval; /*! * Beacon reserved time in ms * * Related MIB type: \ref MIB_BEACON_RESERVED */ uint32_t BeaconReserved; /*! * Beacon guard time in ms * * Related MIB type: \ref MIB_BEACON_GUARD */ uint32_t BeaconGuard; /*! * Beacon window time in ms * * Related MIB type: \ref MIB_BEACON_WINDOW */ uint32_t BeaconWindow; /*! * Beacon window time in number of slots * * Related MIB type: \ref MIB_BEACON_WINDOW_SLOTS */ uint32_t BeaconWindowSlots; /*! * Ping slot length time in ms * * Related MIB type: \ref MIB_PING_SLOT_WINDOW */ uint32_t PingSlotWindow; /*! * Default symbol timeout for beacons and ping slot windows * * Related MIB type: \ref MIB_BEACON_SYMBOL_TO_DEFAULT */ uint32_t BeaconSymbolToDefault; /*! * Maximum symbol timeout for beacons * * Related MIB type: \ref MIB_BEACON_SYMBOL_TO_EXPANSION_MAX */ uint32_t BeaconSymbolToExpansionMax; /*! * Maximum symbol timeout for ping slots * * Related MIB type: \ref MIB_PING_SLOT_SYMBOL_TO_EXPANSION_MAX */ uint32_t PingSlotSymbolToExpansionMax; /*! * Symbol expansion value for beacon windows in case of beacon * loss in symbols * * Related MIB type: \ref MIB_BEACON_SYMBOL_TO_EXPANSION_FACTOR */ uint32_t BeaconSymbolToExpansionFactor; /*! * Symbol expansion value for ping slot windows in case of beacon * loss in symbols * * Related MIB type: \ref MIB_PING_SLOT_SYMBOL_TO_EXPANSION_FACTOR */ uint32_t PingSlotSymbolToExpansionFactor; /*! * Maximum allowed beacon less time in ms * * Related MIB type: \ref MIB_MAX_BEACON_LESS_PERIOD */ uint32_t MaxBeaconLessPeriod; /*! * Ping slots data rate * * Related MIB type: \ref MIB_PING_SLOT_DATARATE */ int8_t PingSlotDatarate; }MibParam_t; /*! * LoRaMAC MIB-RequestConfirm structure */ typedef struct eMibRequestConfirm { /*! * MIB-Request type */ Mib_t Type; /*! * MLME-RequestConfirm parameters */ MibParam_t Param; }MibRequestConfirm_t; /*! * LoRaMAC tx information */ typedef struct sLoRaMacTxInfo { /*! * Size of the application data payload which can be transmitted. */ uint8_t MaxPossibleApplicationDataSize; /*! * The current maximum possible payload size without MAC commands * which is dependent on the current datarate. */ uint8_t CurrentPossiblePayloadSize; }LoRaMacTxInfo_t; /*! * LoRaMAC Status */ typedef enum eLoRaMacStatus { /*! * Service started successfully */ LORAMAC_STATUS_OK, /*! * Service not started - LoRaMAC is busy */ LORAMAC_STATUS_BUSY, /*! * Service unknown */ LORAMAC_STATUS_SERVICE_UNKNOWN, /*! * Service not started - invalid parameter */ LORAMAC_STATUS_PARAMETER_INVALID, /*! * Service not started - invalid frequency */ LORAMAC_STATUS_FREQUENCY_INVALID, /*! * Service not started - invalid datarate */ LORAMAC_STATUS_DATARATE_INVALID, /*! * Service not started - invalid frequency and datarate */ LORAMAC_STATUS_FREQ_AND_DR_INVALID, /*! * Service not started - the device is not in a LoRaWAN */ LORAMAC_STATUS_NO_NETWORK_JOINED, /*! * Service not started - payload length error */ LORAMAC_STATUS_LENGTH_ERROR, /*! * Service not started - the specified region is not supported * or not activated with preprocessor definitions. */ LORAMAC_STATUS_REGION_NOT_SUPPORTED, /*! * The application data was not transmitted * because prioritized pending MAC commands had to be sent. */ LORAMAC_STATUS_SKIPPED_APP_DATA, /*! * An MCPS or MLME request can return this status. In this case, * the MAC cannot send the frame, as the duty cycle limits all * available bands. When a request returns this value, the * variable "DutyCycleWaitTime" in "ReqReturn" of the input * parameters contains the remaining time to wait. If the * value is constant and does not change, the expected time * on air for this frame is exceeding the maximum permitted * time according to the duty cycle time period, defined * in Region.h, DUTY_CYCLE_TIME_PERIOD. By default this time * is 1 hour, and a band with 1% duty cycle is then allowed * to use an air time of 36 seconds. */ LORAMAC_STATUS_DUTYCYCLE_RESTRICTED, /*! * No active channel is available to send a request */ LORAMAC_STATUS_NO_CHANNEL_FOUND, /*! * Even if one or more channels are available according to the channel plan, * no free channel was found during the LBT procedure */ LORAMAC_STATUS_NO_FREE_CHANNEL_FOUND, /*! * Next request cannot be sent because the RX window is required by the beacon */ LORAMAC_STATUS_BUSY_BEACON_RESERVED_TIME, /*! * Next request cannot be sent because the RX window is required by the ping slot */ LORAMAC_STATUS_BUSY_PING_SLOT_WINDOW_TIME, /*! * Next beacon will be received during the next uplink */ LORAMAC_STATUS_BUSY_UPLINK_COLLISION, /*! * An error in the cryptographic module is occurred */ LORAMAC_STATUS_CRYPTO_ERROR, /*! * An error in the frame counter handler module is occurred */ LORAMAC_STATUS_FCNT_HANDLER_ERROR, /*! * An error in the MAC command module is occurred */ LORAMAC_STATUS_MAC_COMMAD_ERROR, /*! * An error in the Class B module is occurred */ LORAMAC_STATUS_CLASS_B_ERROR, /*! * An error in the Confirm Queue module is occurred */ LORAMAC_STATUS_CONFIRM_QUEUE_ERROR, /*! * The multicast group doesn't exist */ LORAMAC_STATUS_MC_GROUP_UNDEFINED, /*! * Undefined error occurred */ LORAMAC_STATUS_ERROR }LoRaMacStatus_t; /*! * LoRaMAC region enumeration */ typedef enum eLoRaMacRegion_t { /*! * AS band on 923MHz */ LORAMAC_REGION_AS923 = 0, /*! * Australian band on 915MHz */ LORAMAC_REGION_AU915, /*! * Chinese band on 470MHz */ LORAMAC_REGION_CN470, /*! * Chinese band on 779MHz */ LORAMAC_REGION_CN779, /*! * European band on 433MHz */ LORAMAC_REGION_EU433, /*! * European band on 868MHz */ LORAMAC_REGION_EU868, /*! * South korean band on 920MHz */ LORAMAC_REGION_KR920, /*! * India band on 865MHz */ LORAMAC_REGION_IN865, /*! * North american band on 915MHz */ LORAMAC_REGION_US915, /*! * Russia band on 864MHz */ LORAMAC_REGION_RU864, }LoRaMacRegion_t; /*! * Enumeration of modules which have a context */ typedef enum LoRaMacNvmCtxModule_e { /*! * Context for the MAC */ LORAMAC_NVMCTXMODULE_MAC, /*! * Context for the regions */ LORAMAC_NVMCTXMODULE_REGION, /*! * Context for the crypto module */ LORAMAC_NVMCTXMODULE_CRYPTO, /*! * Context for the secure element */ LORAMAC_NVMCTXMODULE_SECURE_ELEMENT, /*! * Context for the command queue */ LORAMAC_NVMCTXMODULE_COMMANDS, /*! * Context for class b */ LORAMAC_NVMCTXMODULE_CLASS_B, /*! * Context for the confirm queue */ LORAMAC_NVMCTXMODULE_CONFIRM_QUEUE, }LoRaMacNvmCtxModule_t; /*! * LoRaMAC events structure * Used to notify upper layers of MAC events */ typedef struct sLoRaMacPrimitives { /*! * \brief MCPS-Confirm primitive * * \param [OUT] MCPS-Confirm parameters */ void ( *MacMcpsConfirm )( McpsConfirm_t* McpsConfirm ); /*! * \brief MCPS-Indication primitive * * \param [OUT] MCPS-Indication parameters */ void ( *MacMcpsIndication )( McpsIndication_t* McpsIndication ); /*! * \brief MLME-Confirm primitive * * \param [OUT] MLME-Confirm parameters */ void ( *MacMlmeConfirm )( MlmeConfirm_t* MlmeConfirm ); /*! * \brief MLME-Indication primitive * * \param [OUT] MLME-Indication parameters */ void ( *MacMlmeIndication )( MlmeIndication_t* MlmeIndication ); }LoRaMacPrimitives_t; /*! * LoRaMAC callback structure */ typedef struct sLoRaMacCallback { /*! * \brief Measures the battery level * * \retval Battery level [0: node is connected to an external * power source, 1..254: battery level, where 1 is the minimum * and 254 is the maximum value, 255: the node was not able * to measure the battery level] */ uint8_t ( *GetBatteryLevel )( void ); /*! * \brief Measures the temperature level * * \retval Temperature level */ uint16_t ( *GetTemperatureLevel )( void ); /*! * \brief Will be called when an attribute has changed in one of the context. * * \param Context that changed */ void ( *NvmContextChange )( LoRaMacNvmCtxModule_t module ); /*! *\brief Will be called each time a Radio IRQ is handled by the MAC * layer. * *\warning Runs in a IRQ context. Should only change variables state. */ void ( *MacProcessNotify )( void ); }LoRaMacCallback_t; /*! * LoRaMAC Max EIRP (dBm) table */ static const uint8_t LoRaMacMaxEirpTable[] = { 8, 10, 12, 13, 14, 16, 18, 20, 21, 24, 26, 27, 29, 30, 33, 36 }; /*! * \brief LoRaMAC layer initialization * * \details In addition to the initialization of the LoRaMAC layer, this * function initializes the callback primitives of the MCPS and * MLME services. Every data field of \ref LoRaMacPrimitives_t must be * set to a valid callback function. * * \param [IN] primitives - Pointer to a structure defining the LoRaMAC * event functions. Refer to \ref LoRaMacPrimitives_t. * * \param [IN] callbacks - Pointer to a structure defining the LoRaMAC * callback functions. Refer to \ref LoRaMacCallback_t. * * \param [IN] region - The region to start. * * \retval LoRaMacStatus_t Status of the operation. Possible returns are: * returns are: * \ref LORAMAC_STATUS_OK, * \ref LORAMAC_STATUS_PARAMETER_INVALID, * \ref LORAMAC_STATUS_REGION_NOT_SUPPORTED. */ LoRaMacStatus_t LoRaMacInitialization( LoRaMacPrimitives_t* primitives, LoRaMacCallback_t* callbacks, LoRaMacRegion_t region ); /*! * \brief Starts LoRaMAC layer * * \retval LoRaMacStatus_t Status of the operation. Possible returns are: * returns are: * \ref LORAMAC_STATUS_OK, */ LoRaMacStatus_t LoRaMacStart( void ); /*! * \brief Stops LoRaMAC layer * * \retval LoRaMacStatus_t Status of the operation. Possible returns are: * returns are: * \ref LORAMAC_STATUS_OK, */ LoRaMacStatus_t LoRaMacStop( void ); /*! * \brief Returns a value indicating if the MAC layer is busy or not. * * \retval isBusy Mac layer is busy. */ bool LoRaMacIsBusy( void ); /*! * Processes the LoRaMac events. * * \remark This function must be called in the main loop. */ void LoRaMacProcess( void ); /*! * \brief Queries the LoRaMAC if it is possible to send the next frame with * a given application data payload size. The LoRaMAC takes scheduled * MAC commands into account and reports, when the frame can be send or not. * * \param [IN] size - Size of application data payload to be send next * * \param [OUT] txInfo - The structure \ref LoRaMacTxInfo_t contains * information about the actual maximum payload possible * ( according to the configured datarate or the next * datarate according to ADR ), and the maximum frame * size, taking the scheduled MAC commands into account. * * \retval LoRaMacStatus_t Status of the operation. When the parameters are * not valid, the function returns \ref LORAMAC_STATUS_PARAMETER_INVALID. * In case of a length error caused by the application data payload in combination * with the MAC commands, the function returns \ref LORAMAC_STATUS_LENGTH_ERROR. * In this case its recommended to send a frame without application data to flush * the MAC commands. Otherwise the LoRaMAC will prioritize the MAC commands and * if needed it will skip the application data. Please note that if MAC commands do * not fit at all into the payload size on the related datarate, the LoRaMAC will * automatically clip the MAC commands. * In case the query is valid, and the LoRaMAC is able to send the frame, * the function returns \ref LORAMAC_STATUS_OK. */ LoRaMacStatus_t LoRaMacQueryTxPossible( uint8_t size, LoRaMacTxInfo_t* txInfo ); /*! * \brief LoRaMAC channel add service * * \details Adds a new channel to the channel list and activates the id in * the channel mask. Please note that this functionality is not available * on all regions. Information about allowed ranges are available at the LoRaWAN Regional Parameters V1.0.2rB * * \param [IN] id - Id of the channel. * * \param [IN] params - Channel parameters to set. * * \retval LoRaMacStatus_t Status of the operation. Possible returns are: * \ref LORAMAC_STATUS_OK, * \ref LORAMAC_STATUS_BUSY, * \ref LORAMAC_STATUS_PARAMETER_INVALID. */ LoRaMacStatus_t LoRaMacChannelAdd( uint8_t id, ChannelParams_t params ); /*! * \brief LoRaMAC channel remove service * * \details Deactivates the id in the channel mask. * * \param [IN] id - Id of the channel. * * \retval LoRaMacStatus_t Status of the operation. Possible returns are: * \ref LORAMAC_STATUS_OK, * \ref LORAMAC_STATUS_BUSY, * \ref LORAMAC_STATUS_PARAMETER_INVALID. */ LoRaMacStatus_t LoRaMacChannelRemove( uint8_t id ); /*! * \brief LoRaMAC multicast channel setup service * * \details Sets up a multicast channel. * * \param [IN] channel - Multicast channel to set. * * \retval LoRaMacStatus_t Status of the operation. Possible returns are: * \ref LORAMAC_STATUS_OK, * \ref LORAMAC_STATUS_BUSY, * \ref LORAMAC_STATUS_PARAMETER_INVALID, * \ref LORAMAC_STATUS_MC_GROUP_UNDEFINED. */ LoRaMacStatus_t LoRaMacMcChannelSetup( McChannelParams_t *channel ); /*! * \brief LoRaMAC multicast channel removal service * * \details Removes/Disables a multicast channel. * * \param [IN] groupID - Multicast channel ID to be removed/disabled * * \retval LoRaMacStatus_t Status of the operation. Possible returns are: * \ref LORAMAC_STATUS_OK, * \ref LORAMAC_STATUS_BUSY, * \ref LORAMAC_STATUS_MC_GROUP_UNDEFINED. */ LoRaMacStatus_t LoRaMacMcChannelDelete( AddressIdentifier_t groupID ); /*! * \brief LoRaMAC multicast channel get groupId from MC address. * * \param [IN] mcAddress - Multicast address to be checked * * \retval groupID Multicast channel ID associated to the address. * Returns 0xFF if the address isn't found. */ uint8_t LoRaMacMcChannelGetGroupId( uint32_t mcAddress ); /*! * \brief LoRaMAC multicast channel Rx parameters setup service * * \details Sets up a multicast channel reception parameters. * * \param [IN] groupID - Multicast channel ID * \param [IN] rxParams - Reception parameters * \param [OUT] status - Status mask [UNDEF_ID | FREQ_ERR | DR_ERR | GROUP_ID] * * \retval LoRaMacStatus_t Status of the operation. Possible returns are: * \ref LORAMAC_STATUS_OK, * \ref LORAMAC_STATUS_BUSY, * \ref LORAMAC_STATUS_PARAMETER_INVALID, * \ref LORAMAC_STATUS_MC_GROUP_UNDEFINED. */ LoRaMacStatus_t LoRaMacMcChannelSetupRxParams( AddressIdentifier_t groupID, McRxParams_t *rxParams, uint8_t *status ); /*! * \brief LoRaMAC MIB-Get * * \details The mac information base service to get attributes of the LoRaMac * layer. * * The following code-snippet shows how to use the API to get the * parameter AdrEnable, defined by the enumeration type * \ref MIB_ADR. * \code * MibRequestConfirm_t mibReq; * mibReq.Type = MIB_ADR; * * if( LoRaMacMibGetRequestConfirm( &mibReq ) == LORAMAC_STATUS_OK ) * { * // LoRaMAC updated the parameter mibParam.AdrEnable * } * \endcode * * \param [IN] mibRequest - MIB-GET-Request to perform. Refer to \ref MibRequestConfirm_t. * * \retval LoRaMacStatus_t Status of the operation. Possible returns are: * \ref LORAMAC_STATUS_OK, * \ref LORAMAC_STATUS_SERVICE_UNKNOWN, * \ref LORAMAC_STATUS_PARAMETER_INVALID. */ LoRaMacStatus_t LoRaMacMibGetRequestConfirm( MibRequestConfirm_t* mibGet ); /*! * \brief LoRaMAC MIB-Set * * \details The mac information base service to set attributes of the LoRaMac * layer. * * The following code-snippet shows how to use the API to set the * parameter AdrEnable, defined by the enumeration type * \ref MIB_ADR. * * \code * MibRequestConfirm_t mibReq; * mibReq.Type = MIB_ADR; * mibReq.Param.AdrEnable = true; * * if( LoRaMacMibGetRequestConfirm( &mibReq ) == LORAMAC_STATUS_OK ) * { * // LoRaMAC updated the parameter * } * \endcode * * \param [IN] mibRequest - MIB-SET-Request to perform. Refer to \ref MibRequestConfirm_t. * * \retval LoRaMacStatus_t Status of the operation. Possible returns are: * \ref LORAMAC_STATUS_OK, * \ref LORAMAC_STATUS_BUSY, * \ref LORAMAC_STATUS_SERVICE_UNKNOWN, * \ref LORAMAC_STATUS_PARAMETER_INVALID. */ LoRaMacStatus_t LoRaMacMibSetRequestConfirm( MibRequestConfirm_t* mibSet ); /*! * \brief LoRaMAC MLME-Request * * \details The Mac layer management entity handles management services. The * following code-snippet shows how to use the API to perform a * network join request. Please note that for a join request, the * DevEUI and the JoinEUI must be set previously via the MIB. Please * also refer to the sample implementations. * * \code * * MlmeReq_t mlmeReq; * mlmeReq.Type = MLME_JOIN; * mlmeReq.Req.Join.Datarate = LORAWAN_DEFAULT_DATARATE; * * if( LoRaMacMlmeRequest( &mlmeReq ) == LORAMAC_STATUS_OK ) * { * // Service started successfully. Waiting for the Mlme-Confirm event * } * \endcode * * \param [IN] mlmeRequest - MLME-Request to perform. Refer to \ref MlmeReq_t. * * \retval LoRaMacStatus_t Status of the operation. Possible returns are: * \ref LORAMAC_STATUS_OK, * \ref LORAMAC_STATUS_BUSY, * \ref LORAMAC_STATUS_SERVICE_UNKNOWN, * \ref LORAMAC_STATUS_PARAMETER_INVALID, * \ref LORAMAC_STATUS_NO_NETWORK_JOINED, * \ref LORAMAC_STATUS_LENGTH_ERROR, */ LoRaMacStatus_t LoRaMacMlmeRequest( MlmeReq_t* mlmeRequest ); /*! * \brief LoRaMAC MCPS-Request * * \details The Mac Common Part Sublayer handles data services. The following * code-snippet shows how to use the API to send an unconfirmed * LoRaMAC frame. * * \code * uint8_t myBuffer[] = { 1, 2, 3 }; * * McpsReq_t mcpsReq; * mcpsReq.Type = MCPS_UNCONFIRMED; * mcpsReq.Req.Unconfirmed.fPort = 1; * mcpsReq.Req.Unconfirmed.fBuffer = myBuffer; * mcpsReq.Req.Unconfirmed.fBufferSize = sizeof( myBuffer ); * * if( LoRaMacMcpsRequest( &mcpsReq ) == LORAMAC_STATUS_OK ) * { * // Service started successfully. Waiting for the MCPS-Confirm event * } * \endcode * * \param [IN] mcpsRequest - MCPS-Request to perform. Refer to \ref McpsReq_t. * * \retval LoRaMacStatus_t Status of the operation. Possible returns are: * \ref LORAMAC_STATUS_OK, * \ref LORAMAC_STATUS_BUSY, * \ref LORAMAC_STATUS_SERVICE_UNKNOWN, * \ref LORAMAC_STATUS_PARAMETER_INVALID, * \ref LORAMAC_STATUS_NO_NETWORK_JOINED, * \ref LORAMAC_STATUS_LENGTH_ERROR, */ LoRaMacStatus_t LoRaMacMcpsRequest( McpsReq_t* mcpsRequest, bool allowDelayedTx ); /*! * \brief LoRaMAC deinitialization * * \details This function stops the timers, re-initializes MAC & regional parameters to default * and sets radio into sleep state. * * \retval LoRaMacStatus_t Status of the operation. Possible returns are: * \ref LORAMAC_STATUS_OK, * \ref LORAMAC_STATUS_BUSY */ LoRaMacStatus_t LoRaMacDeInitialization( void ); /*! \} defgroup LORAMAC */ #ifdef __cplusplus } #endif #endif // __LORAMAC_H__