end node on synchronous star LoRa network.

Dependencies:   SX127x sx12xx_hal TSL2561

radio chip selection

Radio chip driver is not included, allowing choice of radio device.
If you're using SX1272 or SX1276, then import sx127x driver into your program.
if you're using SX1261 or SX1262, then import sx126x driver into your program.
if you're using SX1280, then import sx1280 driver into your program.
If you're using NAmote72 or Murata discovery, then you must import only sx127x driver.

This project for use with LoRaWAN_singlechannel_gateway project.

Alternately gateway running on raspberry pi can be used as gateway.

LoRaWAN on single radio channel

Network description is at gateway project page. Synchronous star network.

Hardware Support

This project supports SX1276 and SX1272, sx126x kit, sx126x shield, and sx128x 2.4GHz. The ST board B-L072Z-LRWAN1 is also supported (TypeABZ module). When B-L072Z-LRWAN1 target is selected, TARGET_DISCO_L072CZ_LRWAN1 is defined by tools, allowing correct radio driver configuration for this platform. Alternately, any mbed board that can use LoRa radio shield board should work, but NUCLEO boards are tested.

End-node Unique ID

DevEUI is created from CPU serial number. AppEUI and AppKey are declared as software constants.

End-node Configuration

Data rate definition LORAMAC_DEFAULT_DATARATE configured in LoRaMac-definitions.h. See gateway project page for configuration of gateway.
LoRaWAN addressing is configured in Comissioning.h; only OTA mode is functional.
Header file board/lora_config.h, selects application layer options (i.e. sensors) to be compiled in.

Serial Interface

Serial port operates at 115200bps.
Application layer single_us915_main.cpp User button triggers uplink (i.e. blue button on nucleo board), or jumper enables continuously sends repeated uplink packets. The MAC layer holds each uplink request until the allocated timeslot.

commandargumentsdescription
?-print available commands
. (period)-print status (DevEUI, DevAddr, etc)
ullength integerset payload length of test uplink packets

sensor demo

Selected grove sensors may be plugged into SX1272 shield.
To enable, edit lora_config.h to define SENSORS.

Sensor connections on SX1272MB2xAS:

D8 D9: buttonRX TX: (unused)A3 A4: Rotary Angle Sensor
D6 D7: RGB LEDSCL SDA: digital light sensorA1 A2: Rotary Angle Sensor

Digital input pin, state reported via uplink: PC8
Digital output pin, controlled via downlink: PC6
PWM out: PB_10

Jumper enables auto-repeated transmit: PC10 and PC12 on NUCLEO board, located on end of morpho headers nearby JP4.

Committer:
dudmuck
Date:
Thu May 18 15:11:53 2017 -0700
Revision:
0:8f0d0ae0a077
initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dudmuck 0:8f0d0ae0a077 1 /*
dudmuck 0:8f0d0ae0a077 2 ---------------------------------------------------------------------------
dudmuck 0:8f0d0ae0a077 3 Copyright (c) 1998-2008, Brian Gladman, Worcester, UK. All rights reserved.
dudmuck 0:8f0d0ae0a077 4
dudmuck 0:8f0d0ae0a077 5 LICENSE TERMS
dudmuck 0:8f0d0ae0a077 6
dudmuck 0:8f0d0ae0a077 7 The redistribution and use of this software (with or without changes)
dudmuck 0:8f0d0ae0a077 8 is allowed without the payment of fees or royalties provided that:
dudmuck 0:8f0d0ae0a077 9
dudmuck 0:8f0d0ae0a077 10 1. source code distributions include the above copyright notice, this
dudmuck 0:8f0d0ae0a077 11 list of conditions and the following disclaimer;
dudmuck 0:8f0d0ae0a077 12
dudmuck 0:8f0d0ae0a077 13 2. binary distributions include the above copyright notice, this list
dudmuck 0:8f0d0ae0a077 14 of conditions and the following disclaimer in their documentation;
dudmuck 0:8f0d0ae0a077 15
dudmuck 0:8f0d0ae0a077 16 3. the name of the copyright holder is not used to endorse products
dudmuck 0:8f0d0ae0a077 17 built using this software without specific written permission.
dudmuck 0:8f0d0ae0a077 18
dudmuck 0:8f0d0ae0a077 19 DISCLAIMER
dudmuck 0:8f0d0ae0a077 20
dudmuck 0:8f0d0ae0a077 21 This software is provided 'as is' with no explicit or implied warranties
dudmuck 0:8f0d0ae0a077 22 in respect of its properties, including, but not limited to, correctness
dudmuck 0:8f0d0ae0a077 23 and/or fitness for purpose.
dudmuck 0:8f0d0ae0a077 24 ---------------------------------------------------------------------------
dudmuck 0:8f0d0ae0a077 25 Issue 09/09/2006
dudmuck 0:8f0d0ae0a077 26
dudmuck 0:8f0d0ae0a077 27 This is an AES implementation that uses only 8-bit byte operations on the
dudmuck 0:8f0d0ae0a077 28 cipher state.
dudmuck 0:8f0d0ae0a077 29 */
dudmuck 0:8f0d0ae0a077 30
dudmuck 0:8f0d0ae0a077 31 #ifndef AES_H
dudmuck 0:8f0d0ae0a077 32 #define AES_H
dudmuck 0:8f0d0ae0a077 33
dudmuck 0:8f0d0ae0a077 34 #if 1
dudmuck 0:8f0d0ae0a077 35 # define AES_ENC_PREKEYED /* AES encryption with a precomputed key schedule */
dudmuck 0:8f0d0ae0a077 36 #endif
dudmuck 0:8f0d0ae0a077 37 #if 0
dudmuck 0:8f0d0ae0a077 38 # define AES_DEC_PREKEYED /* AES decryption with a precomputed key schedule */
dudmuck 0:8f0d0ae0a077 39 #endif
dudmuck 0:8f0d0ae0a077 40 #if 0
dudmuck 0:8f0d0ae0a077 41 # define AES_ENC_128_OTFK /* AES encryption with 'on the fly' 128 bit keying */
dudmuck 0:8f0d0ae0a077 42 #endif
dudmuck 0:8f0d0ae0a077 43 #if 0
dudmuck 0:8f0d0ae0a077 44 # define AES_DEC_128_OTFK /* AES decryption with 'on the fly' 128 bit keying */
dudmuck 0:8f0d0ae0a077 45 #endif
dudmuck 0:8f0d0ae0a077 46 #if 0
dudmuck 0:8f0d0ae0a077 47 # define AES_ENC_256_OTFK /* AES encryption with 'on the fly' 256 bit keying */
dudmuck 0:8f0d0ae0a077 48 #endif
dudmuck 0:8f0d0ae0a077 49 #if 0
dudmuck 0:8f0d0ae0a077 50 # define AES_DEC_256_OTFK /* AES decryption with 'on the fly' 256 bit keying */
dudmuck 0:8f0d0ae0a077 51 #endif
dudmuck 0:8f0d0ae0a077 52
dudmuck 0:8f0d0ae0a077 53 #define N_ROW 4
dudmuck 0:8f0d0ae0a077 54 #define N_COL 4
dudmuck 0:8f0d0ae0a077 55 #define N_BLOCK (N_ROW * N_COL)
dudmuck 0:8f0d0ae0a077 56 #define N_MAX_ROUNDS 14
dudmuck 0:8f0d0ae0a077 57
dudmuck 0:8f0d0ae0a077 58 typedef uint8_t return_type;
dudmuck 0:8f0d0ae0a077 59
dudmuck 0:8f0d0ae0a077 60 /* Warning: The key length for 256 bit keys overflows a byte
dudmuck 0:8f0d0ae0a077 61 (see comment below)
dudmuck 0:8f0d0ae0a077 62 */
dudmuck 0:8f0d0ae0a077 63
dudmuck 0:8f0d0ae0a077 64 typedef uint8_t length_type;
dudmuck 0:8f0d0ae0a077 65
dudmuck 0:8f0d0ae0a077 66 typedef struct
dudmuck 0:8f0d0ae0a077 67 { uint8_t ksch[(N_MAX_ROUNDS + 1) * N_BLOCK];
dudmuck 0:8f0d0ae0a077 68 uint8_t rnd;
dudmuck 0:8f0d0ae0a077 69 } aes_context;
dudmuck 0:8f0d0ae0a077 70
dudmuck 0:8f0d0ae0a077 71 /* The following calls are for a precomputed key schedule
dudmuck 0:8f0d0ae0a077 72
dudmuck 0:8f0d0ae0a077 73 NOTE: If the length_type used for the key length is an
dudmuck 0:8f0d0ae0a077 74 unsigned 8-bit character, a key length of 256 bits must
dudmuck 0:8f0d0ae0a077 75 be entered as a length in bytes (valid inputs are hence
dudmuck 0:8f0d0ae0a077 76 128, 192, 16, 24 and 32).
dudmuck 0:8f0d0ae0a077 77 */
dudmuck 0:8f0d0ae0a077 78
dudmuck 0:8f0d0ae0a077 79 #if defined( AES_ENC_PREKEYED ) || defined( AES_DEC_PREKEYED )
dudmuck 0:8f0d0ae0a077 80
dudmuck 0:8f0d0ae0a077 81 return_type aes_set_key( const uint8_t key[],
dudmuck 0:8f0d0ae0a077 82 length_type keylen,
dudmuck 0:8f0d0ae0a077 83 aes_context ctx[1] );
dudmuck 0:8f0d0ae0a077 84 #endif
dudmuck 0:8f0d0ae0a077 85
dudmuck 0:8f0d0ae0a077 86 #if defined( AES_ENC_PREKEYED )
dudmuck 0:8f0d0ae0a077 87
dudmuck 0:8f0d0ae0a077 88 return_type aes_encrypt( const uint8_t in[N_BLOCK],
dudmuck 0:8f0d0ae0a077 89 uint8_t out[N_BLOCK],
dudmuck 0:8f0d0ae0a077 90 const aes_context ctx[1] );
dudmuck 0:8f0d0ae0a077 91
dudmuck 0:8f0d0ae0a077 92 return_type aes_cbc_encrypt( const uint8_t *in,
dudmuck 0:8f0d0ae0a077 93 uint8_t *out,
dudmuck 0:8f0d0ae0a077 94 int32_t n_block,
dudmuck 0:8f0d0ae0a077 95 uint8_t iv[N_BLOCK],
dudmuck 0:8f0d0ae0a077 96 const aes_context ctx[1] );
dudmuck 0:8f0d0ae0a077 97 #endif
dudmuck 0:8f0d0ae0a077 98
dudmuck 0:8f0d0ae0a077 99 #if defined( AES_DEC_PREKEYED )
dudmuck 0:8f0d0ae0a077 100
dudmuck 0:8f0d0ae0a077 101 return_type aes_decrypt( const uint8_t in[N_BLOCK],
dudmuck 0:8f0d0ae0a077 102 uint8_t out[N_BLOCK],
dudmuck 0:8f0d0ae0a077 103 const aes_context ctx[1] );
dudmuck 0:8f0d0ae0a077 104
dudmuck 0:8f0d0ae0a077 105 return_type aes_cbc_decrypt( const uint8_t *in,
dudmuck 0:8f0d0ae0a077 106 uint8_t *out,
dudmuck 0:8f0d0ae0a077 107 int32_t n_block,
dudmuck 0:8f0d0ae0a077 108 uint8_t iv[N_BLOCK],
dudmuck 0:8f0d0ae0a077 109 const aes_context ctx[1] );
dudmuck 0:8f0d0ae0a077 110 #endif
dudmuck 0:8f0d0ae0a077 111
dudmuck 0:8f0d0ae0a077 112 /* The following calls are for 'on the fly' keying. In this case the
dudmuck 0:8f0d0ae0a077 113 encryption and decryption keys are different.
dudmuck 0:8f0d0ae0a077 114
dudmuck 0:8f0d0ae0a077 115 The encryption subroutines take a key in an array of bytes in
dudmuck 0:8f0d0ae0a077 116 key[L] where L is 16, 24 or 32 bytes for key lengths of 128,
dudmuck 0:8f0d0ae0a077 117 192, and 256 bits respectively. They then encrypts the input
dudmuck 0:8f0d0ae0a077 118 data, in[] with this key and put the reult in the output array
dudmuck 0:8f0d0ae0a077 119 out[]. In addition, the second key array, o_key[L], is used
dudmuck 0:8f0d0ae0a077 120 to output the key that is needed by the decryption subroutine
dudmuck 0:8f0d0ae0a077 121 to reverse the encryption operation. The two key arrays can
dudmuck 0:8f0d0ae0a077 122 be the same array but in this case the original key will be
dudmuck 0:8f0d0ae0a077 123 overwritten.
dudmuck 0:8f0d0ae0a077 124
dudmuck 0:8f0d0ae0a077 125 In the same way, the decryption subroutines output keys that
dudmuck 0:8f0d0ae0a077 126 can be used to reverse their effect when used for encryption.
dudmuck 0:8f0d0ae0a077 127
dudmuck 0:8f0d0ae0a077 128 Only 128 and 256 bit keys are supported in these 'on the fly'
dudmuck 0:8f0d0ae0a077 129 modes.
dudmuck 0:8f0d0ae0a077 130 */
dudmuck 0:8f0d0ae0a077 131
dudmuck 0:8f0d0ae0a077 132 #if defined( AES_ENC_128_OTFK )
dudmuck 0:8f0d0ae0a077 133 void aes_encrypt_128( const uint8_t in[N_BLOCK],
dudmuck 0:8f0d0ae0a077 134 uint8_t out[N_BLOCK],
dudmuck 0:8f0d0ae0a077 135 const uint8_t key[N_BLOCK],
dudmuck 0:8f0d0ae0a077 136 uint8_t o_key[N_BLOCK] );
dudmuck 0:8f0d0ae0a077 137 #endif
dudmuck 0:8f0d0ae0a077 138
dudmuck 0:8f0d0ae0a077 139 #if defined( AES_DEC_128_OTFK )
dudmuck 0:8f0d0ae0a077 140 void aes_decrypt_128( const uint8_t in[N_BLOCK],
dudmuck 0:8f0d0ae0a077 141 uint8_t out[N_BLOCK],
dudmuck 0:8f0d0ae0a077 142 const uint8_t key[N_BLOCK],
dudmuck 0:8f0d0ae0a077 143 uint8_t o_key[N_BLOCK] );
dudmuck 0:8f0d0ae0a077 144 #endif
dudmuck 0:8f0d0ae0a077 145
dudmuck 0:8f0d0ae0a077 146 #if defined( AES_ENC_256_OTFK )
dudmuck 0:8f0d0ae0a077 147 void aes_encrypt_256( const uint8_t in[N_BLOCK],
dudmuck 0:8f0d0ae0a077 148 uint8_t out[N_BLOCK],
dudmuck 0:8f0d0ae0a077 149 const uint8_t key[2 * N_BLOCK],
dudmuck 0:8f0d0ae0a077 150 uint8_t o_key[2 * N_BLOCK] );
dudmuck 0:8f0d0ae0a077 151 #endif
dudmuck 0:8f0d0ae0a077 152
dudmuck 0:8f0d0ae0a077 153 #if defined( AES_DEC_256_OTFK )
dudmuck 0:8f0d0ae0a077 154 void aes_decrypt_256( const uint8_t in[N_BLOCK],
dudmuck 0:8f0d0ae0a077 155 uint8_t out[N_BLOCK],
dudmuck 0:8f0d0ae0a077 156 const uint8_t key[2 * N_BLOCK],
dudmuck 0:8f0d0ae0a077 157 uint8_t o_key[2 * N_BLOCK] );
dudmuck 0:8f0d0ae0a077 158 #endif
dudmuck 0:8f0d0ae0a077 159
dudmuck 0:8f0d0ae0a077 160 #endif