The purpose of this topic is to provide an overview of existing LoRaWAN libraries that can be used for the development of nodes (a.k.a. end-devices).
We need your input - Please help make the list complete. Thanks!
If you know an existing LoRaWAN library that is not yet listed in this topic then PLEASE add a post with information about the library to this topic.
Some guidelines for this thread (topic):
When adding variations (see below) of an already existing library, please only add it to the list if the library was modified for a well documented reason (e.g. to make it run better on a certain microcontroller family like ESP32 or STM32) and that it might be of interest to a wider public.
But do not add any personal copies (e.g. forks you can find on github) that lack a clear description of changes (if any) and (even while public) are only meant for personal use.
For any LoRaWAN library please specify the following information:
At the start of the post please add a clear description of the library (more verbose than for the ‘Description’ property) and try to make clear what makes this library different from its parent, why it is different and/or why it is better. (But don’t make it a ‘search the differences’ exercise for the reader.)
|Name:||<official library name>|
|(see PlatformIO Libraries registry)|
|Version:||<library version>** (at the time of adding the post)|
|Frameworks:||<supported development frameworks>|
|(see PlatformIO Frameworks registry)|
|Platforms:||<supported microcontroller families>|
|(see PlatformIO Development Platforms registry)|
|Description:||<description> (called sentence in library.properties)|
|Type:||<Port, Variaton, New or dash(-) if unknown>|
|(Port is substantial, Variation contains only minimal changes)|
|BaseType:||<LMIC or LoRaMac-node>|
|Parent Name:||<parent’s official library name> (dash(-) if not appropriate or unknown)|
|Parent URL:||<parent’s repository URL> (dash(-) if not appropriate or unknown)|
Many of above library properties can be found in property files like library.properties or .library.json.
PlatformIO has already defined names for Platforms and Frameworks (many supported). It is practical to use the names already defined and maintained by PlatformIO.
Note: use only lower case and replace spaces by underscores, which is how PlatformIO uses it.
For an example see the next post.
There exist at least two major LoRaWAN library implementations that can be used for for end nodes:
- IBM’s original LMiC (formerly ‘LoRa MAC in C’) implementation.
- Semtech’s LoRaMac-node reference implementation.
I call LMiC and LoRaMac-node base types.
Both base types have been ported to different platforms (microcontroller families) e.g. AVR, SAM, STM32, nRF5x, ESP32 and different development frameworks e.g. Arduino, ARM Mbed etc.
The Arduino framework is popular within maker and hobbyist communities. IBM’s LMiC has been ported to the Arduino framework and is commonly referred to as Arduino LMIC. The first Arduino LMIC implementation was LMIC-Arduino which has long served as the reference implementation but it is no longer maintained. The new reference implementation is MCCI LoRaWAN LMIC library which is improved and actively maintained (see below).
The Arduino framework initially was available only for the AVR family of microcontrollers, but nowadays there are Arduino framework implementations (called Arduino Cores) for many microcontroller families like AVR, SAMD, STM32, ESP32, ESP8266 and nRF5x.
While the Arduino LMIC reference implementations can be used with multiple microcontroller families, there also exist modified versions that are specially adapted for a certain microcontroller. I call these variations (or decendants) of Arduino LMIC and call Arduino LMIC the parent of the decendant.
Many libraries have an official name that is different from the name of their (GitHub) repository. The official library name is important for development tools like PlatformIO which can automatically download libraries if their official name is specified in the platformio.ini project configuration file.