A very easy to understand LoRaWAN-node code.

Dependencies:   LoRaWAN-lib SX1272Lib X_NUCLEO_IKS01A1 mbed

Important parameters:

• In comissioning.h: DevEUI, AppEUI, AppKEY, DevADR, NwksKEY, AppsKEY, OTAA and public network. Frequency and channel block to use, confirmed or unconfirmed messages, app port, app data size and OTAA and Tx duty cycles.

• In LoRaMac.h: Maximum payload and MAC commands length, receive delays, max FCNT, adr ack limit, timeout and delay, max ack retries, rssi threshold and sync words.

• In LoRaMac.cpp: Maximum payload, MAC commands and FRMpayload length.

• In LoRaMac-board.h: Tx power, data rates and band settings.

NOTE: Please refer to LoRaWAN regional parameters (page 12 for US band) to know which parameters you can modify.

Committer:
dgabino
Date:
Tue Apr 03 17:09:34 2018 +0000
Revision:
0:60ff878b27b8
A simpler way to customize your LoRaWAN payload

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dgabino 0:60ff878b27b8 1 /*
dgabino 0:60ff878b27b8 2 / _____) _ | |
dgabino 0:60ff878b27b8 3 ( (____ _____ ____ _| |_ _____ ____| |__
dgabino 0:60ff878b27b8 4 \____ \| ___ | (_ _) ___ |/ ___) _ \
dgabino 0:60ff878b27b8 5 _____) ) ____| | | || |_| ____( (___| | | |
dgabino 0:60ff878b27b8 6 (______/|_____)_|_|_| \__)_____)\____)_| |_|
dgabino 0:60ff878b27b8 7 (C)2015 Semtech
dgabino 0:60ff878b27b8 8
dgabino 0:60ff878b27b8 9 Description: VT100 serial display management
dgabino 0:60ff878b27b8 10
dgabino 0:60ff878b27b8 11 License: Revised BSD License, see LICENSE.TXT file include in the project
dgabino 0:60ff878b27b8 12
dgabino 0:60ff878b27b8 13 Maintainer: Miguel Luis and Gregory Cristian
dgabino 0:60ff878b27b8 14 */
dgabino 0:60ff878b27b8 15
dgabino 0:60ff878b27b8 16 #include "SerialDisplay.h"
dgabino 0:60ff878b27b8 17
dgabino 0:60ff878b27b8 18 VT100 vt( USBTX, USBRX );
dgabino 0:60ff878b27b8 19
dgabino 0:60ff878b27b8 20 void SerialDisplayJoinUpdate( void )
dgabino 0:60ff878b27b8 21 {
dgabino 0:60ff878b27b8 22 printf( "###### ===== JOINING ==== ######\r\n" );
dgabino 0:60ff878b27b8 23
dgabino 0:60ff878b27b8 24 DisplayNetworkParam( );
dgabino 0:60ff878b27b8 25
dgabino 0:60ff878b27b8 26 printf( "\r\n" );
dgabino 0:60ff878b27b8 27 }
dgabino 0:60ff878b27b8 28
dgabino 0:60ff878b27b8 29 void SerialDisplayTxUpdate(void)
dgabino 0:60ff878b27b8 30 {
dgabino 0:60ff878b27b8 31 printf( "###### ===== UPLINK FRAME %d ==== ######\r\n", LoRaMacUplinkStatus.UplinkCounter );
dgabino 0:60ff878b27b8 32
dgabino 0:60ff878b27b8 33 DisplayNetworkParam( );
dgabino 0:60ff878b27b8 34
dgabino 0:60ff878b27b8 35 printf( "TX PORT: %d\r\n", LoRaMacUplinkStatus.Port );
dgabino 0:60ff878b27b8 36
dgabino 0:60ff878b27b8 37 if( LoRaMacUplinkStatus.BufferSize != 0 )
dgabino 0:60ff878b27b8 38 {
dgabino 0:60ff878b27b8 39 printf( "TX DATA: " );
dgabino 0:60ff878b27b8 40 if( LoRaMacUplinkStatus.Type == MCPS_CONFIRMED )
dgabino 0:60ff878b27b8 41 {
dgabino 0:60ff878b27b8 42 printf( "CONFIRMED\r\n" );
dgabino 0:60ff878b27b8 43 }
dgabino 0:60ff878b27b8 44 else
dgabino 0:60ff878b27b8 45 {
dgabino 0:60ff878b27b8 46 printf( "UNCONFIRMED\r\n" );
dgabino 0:60ff878b27b8 47 }
dgabino 0:60ff878b27b8 48 SerialDisplayHex( LoRaMacUplinkStatus.Buffer, LoRaMacUplinkStatus.BufferSize );
dgabino 0:60ff878b27b8 49 }
dgabino 0:60ff878b27b8 50
dgabino 0:60ff878b27b8 51 printf( "DATA RATE: DR%d\r\n", LoRaMacUplinkStatus.Datarate );
dgabino 0:60ff878b27b8 52
dgabino 0:60ff878b27b8 53 printf( "TX POWER: %d dBm\r\n", 30 - ( LoRaMacUplinkStatus.TxPower << 1 ) );
dgabino 0:60ff878b27b8 54
dgabino 0:60ff878b27b8 55 printf( "BATTERY: %2.2fV\r\n", BoardGetBatteryLevel( ) );
dgabino 0:60ff878b27b8 56
dgabino 0:60ff878b27b8 57 printf( "\r\n");
dgabino 0:60ff878b27b8 58 }
dgabino 0:60ff878b27b8 59
dgabino 0:60ff878b27b8 60 void SerialDisplayRxUpdate( void )
dgabino 0:60ff878b27b8 61 {
dgabino 0:60ff878b27b8 62 printf( "###### ===== DOWNLINK FRAME %d ==== ######\r\n", LoRaMacDownlinkStatus.DownlinkCounter );
dgabino 0:60ff878b27b8 63
dgabino 0:60ff878b27b8 64 printf( "RX WINDOW: %d\r\n", LoRaMacDownlinkStatus.RxSlot + 1 );
dgabino 0:60ff878b27b8 65
dgabino 0:60ff878b27b8 66 printf( "RX PORT: %d\r\n", LoRaMacDownlinkStatus.Port );
dgabino 0:60ff878b27b8 67
dgabino 0:60ff878b27b8 68 if( LoRaMacDownlinkStatus.BufferSize != 0 )
dgabino 0:60ff878b27b8 69 {
dgabino 0:60ff878b27b8 70 printf( "RX DATA: \r\n" );
dgabino 0:60ff878b27b8 71 SerialDisplayHex( LoRaMacDownlinkStatus.Buffer, LoRaMacDownlinkStatus.BufferSize );
dgabino 0:60ff878b27b8 72 }
dgabino 0:60ff878b27b8 73
dgabino 0:60ff878b27b8 74 printf( "RX RSSI: %d\r\n", LoRaMacDownlinkStatus.Rssi );
dgabino 0:60ff878b27b8 75
dgabino 0:60ff878b27b8 76 printf( "RX SNR: %d\r\n", LoRaMacDownlinkStatus.Snr );
dgabino 0:60ff878b27b8 77
dgabino 0:60ff878b27b8 78 printf( "\r\n" );
dgabino 0:60ff878b27b8 79 }
dgabino 0:60ff878b27b8 80
dgabino 0:60ff878b27b8 81 void SerialDisplayHex( uint8_t *pData, uint8_t len )
dgabino 0:60ff878b27b8 82 {
dgabino 0:60ff878b27b8 83 int i;
dgabino 0:60ff878b27b8 84 bool newline = 0;
dgabino 0:60ff878b27b8 85
dgabino 0:60ff878b27b8 86 for( i = 0; i < len; i++ )
dgabino 0:60ff878b27b8 87 {
dgabino 0:60ff878b27b8 88 if( newline != 0 )
dgabino 0:60ff878b27b8 89 {
dgabino 0:60ff878b27b8 90 printf( "\r\n" );
dgabino 0:60ff878b27b8 91 newline = 0;
dgabino 0:60ff878b27b8 92 }
dgabino 0:60ff878b27b8 93
dgabino 0:60ff878b27b8 94 printf( "%02X", pData[i] );
dgabino 0:60ff878b27b8 95
dgabino 0:60ff878b27b8 96 if( ( ( i + 1 ) % 16 ) == 0 )
dgabino 0:60ff878b27b8 97 {
dgabino 0:60ff878b27b8 98 newline = 1;
dgabino 0:60ff878b27b8 99 }
dgabino 0:60ff878b27b8 100 }
dgabino 0:60ff878b27b8 101 printf( "\r\n" );
dgabino 0:60ff878b27b8 102 }
dgabino 0:60ff878b27b8 103
dgabino 0:60ff878b27b8 104
dgabino 0:60ff878b27b8 105
dgabino 0:60ff878b27b8 106 void DisplayNetworkParam( void )
dgabino 0:60ff878b27b8 107 {
dgabino 0:60ff878b27b8 108 #if( OVER_THE_AIR_ACTIVATION != 0 )
dgabino 0:60ff878b27b8 109
dgabino 0:60ff878b27b8 110 printf( "DEVEUI: " );
dgabino 0:60ff878b27b8 111 SerialDisplayHex( DevEui, 8 );
dgabino 0:60ff878b27b8 112
dgabino 0:60ff878b27b8 113 printf( "APPEUI: " );
dgabino 0:60ff878b27b8 114 SerialDisplayHex( AppEui, 8 );
dgabino 0:60ff878b27b8 115
dgabino 0:60ff878b27b8 116 printf( "APPKEY: " );
dgabino 0:60ff878b27b8 117 SerialDisplayHex( AppKey, 16 );
dgabino 0:60ff878b27b8 118
dgabino 0:60ff878b27b8 119 #else
dgabino 0:60ff878b27b8 120
dgabino 0:60ff878b27b8 121 printf( "DEVADDR: " );
dgabino 0:60ff878b27b8 122
dgabino 0:60ff878b27b8 123 uint8_t *pData = ( uint8_t* )&DevAddr;
dgabino 0:60ff878b27b8 124 for( int32_t i = 3; i >= 0; i-- )
dgabino 0:60ff878b27b8 125 {
dgabino 0:60ff878b27b8 126 printf( "%02X", pData[i] );
dgabino 0:60ff878b27b8 127 }
dgabino 0:60ff878b27b8 128 printf( "\r\n" );
dgabino 0:60ff878b27b8 129
dgabino 0:60ff878b27b8 130 printf( "NWKSKEY: " );
dgabino 0:60ff878b27b8 131 SerialDisplayHex( NwkSKey, 16 );
dgabino 0:60ff878b27b8 132
dgabino 0:60ff878b27b8 133 printf( "APPSKEY: " );
dgabino 0:60ff878b27b8 134 SerialDisplayHex( AppSKey, 16 );
dgabino 0:60ff878b27b8 135
dgabino 0:60ff878b27b8 136 #endif
dgabino 0:60ff878b27b8 137 }