# LoRaMac-node **Repository Path**: lora-net/LoRaMac-node ## Basic Information - **Project Name**: LoRaMac-node - **Description**: https://github.com/Lora-net/LoRaMac-node - **Primary Language**: C - **License**: BSD-3-Clause - **Default Branch**: master - **Homepage**: https://github.com/Lora-net/LoRaMac-node - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2019-10-25 - **Last Updated**: 2025-02-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # LoRaWAN end-device stack implementation and example projects >**Subsequent to the availability of a new and feature enhanced LoRaWAN stack within [LoRa Basics Modem](https://github.com/Lora-net/SWL2001), Semtech has decided to transition LoRaMac-Node to maintenance mode (critical bug fixes will still be supported).** > >**LoRa Basics Modem is the platform implementing new LoRaWAN features (i.e. Relay, CSMA) and will support future improvements introduced by the LoRa Alliance (e.g. LoRaWAN 1.2). While the formerly introduced LoRaMac-Node stack transitions to maintenance mode Semtech recommends customers to use [LoRa Basics Modem](https://github.com/Lora-net/SWL2001) for new designs.** ## Introduction The aim of this project is to show an example of an end-device LoRaWAN stack implementation. This project has 2 active branches in place. | Branch | L2 spec | RP spec | Tag/Milestone | Class | Comments | | ------------- |:-------------:|:---------:|:---------:|:---------:|:--------------| | | [1.0.4](https://resources.lora-alliance.org/technical-specifications/ts001-1-0-4-lorawan-l2-1-0-4-specification) / [1.1.0](https://resources.lora-alliance.org/technical-specifications/lorawan-specification-v1-1) + [FCntDwn ERRATA](https://resources.lora-alliance.org/technical-specifications/fopts-encryption-usage-of-fcntdwn-errata-on-the-lorawan-l2-1-1-specification) | [2-1.0.3](https://resources.lora-alliance.org/technical-specifications/rp2-1-0-3-lorawan-regional-parameters) | [v4.7.0](https://github.com/Lora-net/LoRaMac-node/releases/tag/v4.7.0) | A/B/C | LoRaWAN L2 1.0.4 - **_Released_** | | [master](https://github.com/Lora-net/LoRaMac-node/tree/master) | [1.0.4](https://resources.lora-alliance.org/technical-specifications/ts001-1-0-4-lorawan-l2-1-0-4-specification) / [1.1.0](https://resources.lora-alliance.org/technical-specifications/lorawan-specification-v1-1) + [FCntDwn ERRATA](https://resources.lora-alliance.org/technical-specifications/fopts-encryption-usage-of-fcntdwn-errata-on-the-lorawan-l2-1-1-specification) | [2-1.0.3](https://resources.lora-alliance.org/technical-specifications/rp2-1-0-3-lorawan-regional-parameters) | [v4.7.0](https://github.com/Lora-net/LoRaMac-node/milestone/10) | A/B/C | LoRaWAN L2 1.0.4 / 1.1.0 | | [v5.0.0-branch](https://github.com/Lora-net/LoRaMac-node/tree/v5.0.0-branch) | [1.0.4](https://resources.lora-alliance.org/technical-specifications/ts001-1-0-4-lorawan-l2-1-0-4-specification) / [1.1.0](https://resources.lora-alliance.org/technical-specifications/lorawan-specification-v1-1) + [FCntDwn ERRATA](https://resources.lora-alliance.org/technical-specifications/fopts-encryption-usage-of-fcntdwn-errata-on-the-lorawan-l2-1-1-specification) | [2-1.0.3](https://resources.lora-alliance.org/technical-specifications/rp2-1-0-3-lorawan-regional-parameters) | [M 5.0.0](https://github.com/Lora-net/LoRaMac-node/milestone/11) | A/B/C | LoRaWAN L2 1.0.4 / 1.1.0 - Adds support for LR-FHSS modulation | This project fully implements ClassA, ClassB and ClassC end-device classes and it also provides SX1272/73, SX1276/77/78/79, SX1261/2 and LR1110 radio drivers. For each currently supported platform example applications are provided. * **LoRaMac/fuota-test-01**: FUOTA test scenario 01 end-device example application. (Based on provided application common packages) * **LoRaMac/periodic-uplink-lpp**: ClassA/B/C end-device example application. Periodically uplinks a frame using the Cayenne LPP protocol. (Based on provided application common packages) * **ping-pong**: Point to point RF link example application. * **rx-sensi**: Example application useful to measure the radio sensitivity level using an RF generator. * **tx-cw**: Example application to show how to generate an RF Continuous Wave transmission. **Note**: *Each LoRaWAN application example (LoRaMac/\*) includes an implementation of the LoRa-Alliance; LoRaWAN certification protocol.* **Note**: *The LoRaWAN stack API documentation can be found at: http://stackforce.github.io/LoRaMac-doc/* ## Supported platforms This project currently provides support for the below platforms. This project can be ported to other platforms using different MCU than the ones currently supported. The [Porting Guide](https://stackforce.github.io/LoRaMac-doc/LoRaMac-doc-v4.7.0/_p_o_r_t_i_n_g__g_u_i_d_e.html) document provides guide lines on how to port the project to other platforms. * NAMote72 * [NAMote72 platform documentation](doc/NAMote72-platform.md) * NucleoLxxx - Discovery kit * [NucleoLxxx and Discovery kit platforms documentation](doc/NucleoLxxx-platform.md) * SKiM880B, SKiM980A, SKiM881AXL * [SKiM88xx platforms documentation](doc/SKiM88xx-platform.md) * SAMR34 * [SAMR34 platform documentation](doc/SAMR34-platform.md) ## Getting Started ### Prerequisites Please follow instructions provided by [Development environment](doc/development-environment.md) document. ### Cloning the repository Clone the repository from GitHub ```bash $ git clone https://github.com/lora-net/loramac-node.git loramac-node ``` LoRaMac-node project contains Git submodules that must be initialized ```bash $ cd loramac-node $ git submodule update --init ``` ### Secure-element commissioning This project currently supports 3 different secure-elements `soft-se`, `lr1110-se` and `atecc608a-tnglora-se` implementations. In order to personalize the MCU binary file with LoRaWAN EUIs or/and AES128 keys one must follow the instructions provided by [soft-se](####soft-se), [lr1110-se](####lr1110-se) and [atecc608a-tnglora-se](####atecc608a-tnglora-se) chapters #### soft-se *soft-se* is a pure software emulation of a secure-element. It means that everything is located on the host MCU memories. The `DevEUI`, `JoinEUI` and `AES128 keys` may be stored on a non-volatile memory through dedicated APIs. In order to update the end-device identity (`DevEUI`, `JoinEUI` and `AES128 keys`) one must update the `se-identity.h` file located under `./src/peripherals/soft-se/` directory. **Note:** In previous versions of this project this was done inside `Commissioning.h` files located under each provided example directory. #### lr1110-se *lr1110-se* abstraction implementation handles all the required exchanges with the LR1110 radio crypto-engine. All LR1110 radio chips are pre-provisioned out of factory in order to be used with [LoRa Cloud Device Join Service](https://www.loracloud.com/documentation/join_service). In case other Join Servers are to be used the `DevEUI`, `Pin`, `JoinEUI` and `AES128 keys` can be updated by following the instructions provided on chapter "13. LR1110 Provisioning" of the [LR1110 User Manual](https://semtech.my.salesforce.com/sfc/p/#E0000000JelG/a/2R000000Q2PM/KGm1YHDoHhtaicNYHCIAnh0CbG3yodEuWWJ2WrFRafM). When the compile option `SECURE_ELEMENT_PRE_PROVISIONED` is set to `ON` the *lr1110-se* will use the factory provisioned data (`DevEUI`, `JoinEUI` and `AES128 keys`). When the compile option `SECURE_ELEMENT_PRE_PROVISIONED` is set to `OFF` the *lr1110-se* has to be provisioned by following one of the methods described on chapter "13. LR1110 Provisioning" of the [LR1110 User Manual](https://semtech.my.salesforce.com/sfc/p/#E0000000JelG/a/2R000000Q2PM/KGm1YHDoHhtaicNYHCIAnh0CbG3yodEuWWJ2WrFRafM). The `DevEUI`, `Pin` and `JoinEUI` can be changed by editing the `se-identity.h` file located in `./src/peripherals/lr1110-se/` directory. #### atecc608a-tnglora-se The *atecc608a-tnglora-se* abstraction implementation handles all the required exchanges with the ATECC608A-TNGLORA and ATECC608B-TNGLORA secure-elements. This secure-element is always pre-provisioned and its contents can't be changed. ### Building Process #### Command line **periodic-uplink-lpp** example for NucleoL476 platform with LR1110MB1DIS MBED shield and using LR1110 pre-provisioned secure-element ```bash $ mkdir build $ cd build $ cmake -DCMAKE_BUILD_TYPE=Release \ -DTOOLCHAIN_PREFIX="" \ -DCMAKE_TOOLCHAIN_FILE="../cmake/toolchain-arm-none-eabi.cmake" \ -DAPPLICATION="LoRaMac" \ -DSUB_PROJECT="periodic-uplink-lpp" \ -DCLASSB_ENABLED="ON" \ -DACTIVE_REGION="LORAMAC_REGION_EU868" \ -DREGION_EU868="ON" \ -DREGION_US915="OFF" \ -DREGION_CN779="OFF" \ -DREGION_EU433="OFF" \ -DREGION_AU915="OFF" \ -DREGION_AS923="OFF" \ -DREGION_CN470="OFF" \ -DREGION_KR920="OFF" \ -DREGION_IN865="OFF" \ -DREGION_RU864="OFF" \ -DBOARD="NucleoL476" \ -DMBED_RADIO_SHIELD="LR1110MB1XXS" \ -DSECURE_ELEMENT="LR1110_SE" \ -DSECURE_ELEMENT_PRE_PROVISIONED="ON" \ -DUSE_RADIO_DEBUG="ON" .. $ make ``` **ping-pong** example using LoRa modulation for NucleoL476 platform with LR1110MB1DIS MBED shield ```bash $ mkdir build $ cd build $ cmake -DCMAKE_BUILD_TYPE=Release \ -DTOOLCHAIN_PREFIX="" \ -DCMAKE_TOOLCHAIN_FILE="../cmake/toolchain-arm-none-eabi.cmake" \ -DAPPLICATION="ping-pong" \ -DMODULATION:"LORA" \ -DREGION_EU868="ON" \ -DREGION_US915="OFF" \ -DREGION_CN779="OFF" \ -DREGION_EU433="OFF" \ -DREGION_AU915="OFF" \ -DREGION_AS923="OFF" \ -DREGION_CN470="OFF" \ -DREGION_KR920="OFF" \ -DREGION_IN865="OFF" \ -DREGION_RU864="OFF" \ -DBOARD="NucleoL476" \ -DMBED_RADIO_SHIELD="LR1110MB1XXS" \ -DUSE_RADIO_DEBUG="ON" .. $ make ``` #### VSCode **periodic-uplink-lpp** example for NucleoL476 platform with LR1110MB1DIS MBED shield and using LR1110 pre-provisioned secure-element * Please edit .vscode/settings.json file
Click to expand!

```json // Place your settings in this file to overwrite default and user settings. { "cmake.configureSettings": { // In case your GNU ARM-Toolchain is not installed under the default // path: // Windows : No default path. Specify the path where the // toolchain is installed. i.e: // "C:/PROGRA~2/GNUTOO~1/92019-~1". // Linux : /usr // OSX : /usr/local // It is required to uncomment and to fill the following line. "TOOLCHAIN_PREFIX":"/path/to/toolchain", // In case your OpenOCD is not installed under the default path: // Windows : C:/openocd/bin/openocd.exe // Linux : /usr/bin/openocd // OSX : /usr/local/bin/openocd // Please uncomment the following line and fill it accordingly. //"OPENOCD_BIN":"C:/openocd/bin/openocd.exe", // Specifies the path to the CMAKE toolchain file. "CMAKE_TOOLCHAIN_FILE":"cmake/toolchain-arm-none-eabi.cmake", // Determines the application. You can choose between: // LoRaMac (Default), ping-pong, rx-sensi, tx-cw. "APPLICATION":"LoRaMac", // Select LoRaMac sub project. You can choose between: // periodic-uplink-lpp, fuota-test-01. "SUB_PROJECT":"periodic-uplink-lpp", // Switch for Class B support of LoRaMac: "CLASSB_ENABLED":"ON", // Select the active region for which the stack will be initialized. // You can choose between: // LORAMAC_REGION_EU868, LORAMAC_REGION_US915, .. "ACTIVE_REGION":"LORAMAC_REGION_EU868", // Select the type of modulation, applicable to the ping-pong or // rx-sensi applications. You can choose between: // LORA or FSK "MODULATION":"LORA", // Target board, the following boards are supported: // NAMote72, NucleoL073 (Default), NucleoL152, NucleoL476, SAMR34, SKiM880B, SKiM980A, SKiM881AXL, B-L072Z-LRWAN1. "BOARD":"NucleoL476", // MBED Radio shield selection. (Applies only to Nucleo platforms) // The following shields are supported: // SX1272MB2DAS, SX1276MB1LAS, SX1276MB1MAS, SX1261MBXBAS(Default), SX1262MBXCAS, SX1262MBXDAS, LR1110MB1XXS. "MBED_RADIO_SHIELD":"LR1110MB1XXS", // Secure element type selection the following are supported // SOFT_SE(Default), LR1110_SE, ATECC608A_TNGLORA_SE "SECURE_ELEMENT":"LR1110_SE", // Secure element is pre-provisioned "SECURE_ELEMENT_PRE_PROVISIONED":"ON", // Region support activation, Select the ones you want to support. // By default only REGION_EU868 support is enabled. "REGION_EU868":"ON", "REGION_US915":"OFF", "REGION_CN779":"OFF", "REGION_EU433":"OFF", "REGION_AU915":"OFF", "REGION_AS923":"OFF", "REGION_CN470":"OFF", "REGION_KR920":"OFF", "REGION_IN865":"OFF", "REGION_RU864":"OFF", "USE_RADIO_DEBUG":"ON" } } ```

* Click on "CMake: Debug: Ready" and select build type Debug or Release. ![cmake configure](doc/images/vscode-cmake-configure.png) * Wait for configuration process to finish * Click on "Build" to build the project. ![cmake build](doc/images/vscode-cmake-build.png) * Wait for build process to finish * Binary files will be available under `./build/src/apps/LoRaMac/` * LoRaMac-periodic-uplink-lpp - elf format * LoRaMac-periodic-uplink-lpp.bin - binary format * LoRaMac-periodic-uplink-lpp.hex - hex format **ping-pong** example using LoRa modulation for NucleoL476 platform with LR1110MB1DIS MBED shield * Please edit .vscode/settings.json file
Click to expand!

```json // Place your settings in this file to overwrite default and user settings. { "cmake.configureSettings": { // In case your GNU ARM-Toolchain is not installed under the default // path: // Windows : No default path. Specify the path where the // toolchain is installed. i.e: // "C:/PROGRA~2/GNUTOO~1/92019-~1". // Linux : /usr // OSX : /usr/local // It is required to uncomment and to fill the following line. "TOOLCHAIN_PREFIX":"/path/to/toolchain", // In case your OpenOCD is not installed under the default path: // Windows : C:/openocd/bin/openocd.exe // Linux : /usr/bin/openocd // OSX : /usr/local/bin/openocd // Please uncomment the following line and fill it accordingly. //"OPENOCD_BIN":"C:/openocd/bin/openocd.exe", // Specifies the path to the CMAKE toolchain file. "CMAKE_TOOLCHAIN_FILE":"cmake/toolchain-arm-none-eabi.cmake", // Determines the application. You can choose between: // LoRaMac (Default), ping-pong, rx-sensi, tx-cw. "APPLICATION":"ping-pong", // Select LoRaMac sub project. You can choose between: // periodic-uplink-lpp, fuota-test-01. "SUB_PROJECT":"periodic-uplink-lpp", // Switch for Class B support of LoRaMac: "CLASSB_ENABLED":"ON", // Select the active region for which the stack will be initialized. // You can choose between: // LORAMAC_REGION_EU868, LORAMAC_REGION_US915, .. "ACTIVE_REGION":"LORAMAC_REGION_EU868", // Select the type of modulation, applicable to the ping-pong or // rx-sensi applications. You can choose between: // LORA or FSK "MODULATION":"LORA", // Target board, the following boards are supported: // NAMote72, NucleoL073 (Default), NucleoL152, NucleoL476, SAMR34, SKiM880B, SKiM980A, SKiM881AXL, B-L072Z-LRWAN1. "BOARD":"NucleoL476", // MBED Radio shield selection. (Applies only to Nucleo platforms) // The following shields are supported: // SX1272MB2DAS, SX1276MB1LAS, SX1276MB1MAS, SX1261MBXBAS(Default), SX1262MBXCAS, SX1262MBXDAS, LR1110MB1XXS. "MBED_RADIO_SHIELD":"SX1261MBXBAS", // Secure element type selection the following are supported // SOFT_SE(Default), LR1110_SE, ATECC608A_TNGLORA_SE "SECURE_ELEMENT":"SOFT_SE", // Secure element is pre-provisioned "SECURE_ELEMENT_PRE_PROVISIONED":"ON", // Region support activation, Select the ones you want to support. // By default only REGION_EU868 support is enabled. "REGION_EU868":"ON", "REGION_US915":"OFF", "REGION_CN779":"OFF", "REGION_EU433":"OFF", "REGION_AU915":"OFF", "REGION_AS923":"OFF", "REGION_CN470":"OFF", "REGION_KR920":"OFF", "REGION_IN865":"OFF", "REGION_RU864":"OFF", "USE_RADIO_DEBUG":"ON" } } ```

* Click on "CMake: Debug: Ready" and select build type Debug or Release. ![cmake configure](doc/images/vscode-cmake-configure.png) * Wait for configuration process to finish * Click on "Build" to build the project. ![cmake build](doc/images/vscode-cmake-build.png) * Wait for build process to finish * Binary files will be available under `./build/src/apps/ping-pong/` * ping-pong - elf format * ping-pong.bin - binary format * ping-pong.hex - hex format ### Serial console NVM management The `periodic-uplink-lpp` and `fuota-test-01` examples allow to reset the NVM storage through the serial interface. In order to reset the NVM contents one must hit `ESC` + `N` keyboard keys on a serial terminal. The serial terminal will show the following after `ESC` + `N` keyboard keys are hit. After reseting the end-device the clean NVM will be used. ```text ESC + N NVM factory reset succeed PLEASE RESET THE END-DEVICE ``` ## Acknowledgments * The mbed (https://mbed.org/) project was used at the beginning as source of inspiration. * This program uses the AES algorithm implementation (http://www.gladman.me.uk/) by Brian Gladman. * This program uses the CMAC algorithm implementation (http://www.cse.chalmers.se/research/group/dcs/masters/contikisec/) by Lander Casado, Philippas Tsigas. * [The Things Industries](https://www.thethingsindustries.com/) for providing Microchip/Atmel SAMR34 platform and ATECC608A-TNGLORA secure-element support. * Tencent Blade Team for security breach findings and solving propositions.