LMIC for MOTE_L152RC

Dependents:   lmic_transmit

LoRa WAN in C for NA-mote 72

Currently version 1.5


LoRaWAN network configuration for end-device

The following three pieces of information uniquely identifies end-device to network to allow over-the-air activation. These are stored in the end-device prior to join procedure.

AppEUI

Uniquely identifies application provider of end-device.

Least-significant byte first, 8 bytes. Use LMIC_reverse_memcpy() for AppEUI to keep same byte order as that on lora server.

example C code

static const u1_t APPEUI[8]  = { 0x01, 0x00, 0x01, 0x00, 0x00, 0x0C, 0x25, 0x00 };

This is copied into LMIC by os_getArtEui() callback function in application.

DevEUI

End-device ID, unique to each end-node.

Least-significant byte first, 8 bytes. Use LMIC_reverse_memcpy() for DevEUI to keep same byte order as that on lora server.

example C code

static const u1_t DEVEUI[8]  = { 0x00, 0x00, 0x00, 0x00, 0x01, 0x0C, 0x25, 0x00 }; 

This is copied into LMIC by os_getDevEui() callback function in application.

AppKey (aka DevKey)

128-bit (16byte) AES key.

example C code

static const u1_t DEVKEY[16] = { 0xe4, 0x72, 0x71, 0xc5, 0xf5, 0x30, 0xa9, 0x9f, 0xcf, 0xc4, 0x0e, 0xab, 0xea, 0xd7, 0x19, 0x42 };

This is copied into LMIC by os_getDevKey() callback function in application.

Using over-the air activation, the end-device (LMIC) performs a join procedure every time it starts for first time, or has lost session context information. When join procedure has successfully completed, the end-device will have a network session key (NwkSKey) and an application session key (AppSKey), which are used for encryption and message integrity check.


configuration with http://us01-iot.semtech.com/

  • log in to server
  • click on Applications
  • find your application and click it
  • go to configure motes
  • to create a mote, you may enter a new DevEUI
    • you may copy-paste the 16byte application key from an already existing mote, if you desire.

Information

DevEUI is entered in reverse order into C-code from that shown on server (unique device ID).

AppEUI is entered in reverse order into C-code from that shown on server.

AppEUI is equivalent to "Application"

transmit power limits

FCC Part 15 rules permit one watt of transmit power when more than 50 channels are used. When received by a 64-channel gateway, the maximum power may be used.

However, if end-device is sending to a 8-channel gateway (single SX1301), the maximum transmit power permitted is +20dBm.

To configure LMIC for use with 8-channel gateway, CHNL_HYBRID should be defined in in config.h, and should be undefined for use with 64-channel gateway.

CHNL_HYBRID125KHz500KHz
defined valuechannelschannel
00 to 764
18 to 1565
216 to 2366
324 to 3167
432 to 3968
540 to 4769
648 to 5570
756 to 6371
undef0 to 6364 to 71
Committer:
dudmuck
Date:
Tue Jun 02 19:04:29 2015 +0000
Revision:
0:f2716e543d97
Child:
9:83ae7f34e88c
lmic-v1.5 for MOTE_L152RC

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dudmuck 0:f2716e543d97 1 /*******************************************************************************
dudmuck 0:f2716e543d97 2 * Copyright (c) 2014-2015 IBM Corporation.
dudmuck 0:f2716e543d97 3 * All rights reserved. This program and the accompanying materials
dudmuck 0:f2716e543d97 4 * are made available under the terms of the Eclipse Public License v1.0
dudmuck 0:f2716e543d97 5 * which accompanies this distribution, and is available at
dudmuck 0:f2716e543d97 6 * http://www.eclipse.org/legal/epl-v10.html
dudmuck 0:f2716e543d97 7 *
dudmuck 0:f2716e543d97 8 * Contributors:
dudmuck 0:f2716e543d97 9 * IBM Zurich Research Lab - initial API, implementation and documentation
dudmuck 0:f2716e543d97 10 *******************************************************************************/
dudmuck 0:f2716e543d97 11
dudmuck 0:f2716e543d97 12 //! \file
dudmuck 0:f2716e543d97 13 #ifndef _oslmic_h_
dudmuck 0:f2716e543d97 14 #define _oslmic_h_
dudmuck 0:f2716e543d97 15
dudmuck 0:f2716e543d97 16 // Dependencies required for the LoRa MAC in C to run.
dudmuck 0:f2716e543d97 17 // These settings can be adapted to the underlying system.
dudmuck 0:f2716e543d97 18 // You should not, however, change the lmic.[hc]
dudmuck 0:f2716e543d97 19
dudmuck 0:f2716e543d97 20
dudmuck 0:f2716e543d97 21
dudmuck 0:f2716e543d97 22 //================================================================================
dudmuck 0:f2716e543d97 23 //================================================================================
dudmuck 0:f2716e543d97 24 // Target platform as C library
dudmuck 0:f2716e543d97 25 typedef unsigned char bit_t;
dudmuck 0:f2716e543d97 26 typedef unsigned char u1_t;
dudmuck 0:f2716e543d97 27 typedef signed char s1_t;
dudmuck 0:f2716e543d97 28 typedef unsigned short u2_t;
dudmuck 0:f2716e543d97 29 typedef short s2_t;
dudmuck 0:f2716e543d97 30 typedef unsigned int u4_t;
dudmuck 0:f2716e543d97 31 typedef int s4_t;
dudmuck 0:f2716e543d97 32 typedef unsigned long long u8_t;
dudmuck 0:f2716e543d97 33 typedef long long s8_t;
dudmuck 0:f2716e543d97 34 typedef unsigned int uint;
dudmuck 0:f2716e543d97 35 typedef const char* str_t;
dudmuck 0:f2716e543d97 36
dudmuck 0:f2716e543d97 37 #include <string.h>
dudmuck 0:f2716e543d97 38 #include "hal.h"
dudmuck 0:f2716e543d97 39 #define EV(a,b,c) /**/
dudmuck 0:f2716e543d97 40 #define DO_DEVDB(field1,field2) /**/
dudmuck 0:f2716e543d97 41 #if !defined(CFG_noassert)
dudmuck 0:f2716e543d97 42 #define ASSERT(cond) if(!(cond)) hal_failed()
dudmuck 0:f2716e543d97 43 #else
dudmuck 0:f2716e543d97 44 #define ASSERT(cond) /**/
dudmuck 0:f2716e543d97 45 #endif
dudmuck 0:f2716e543d97 46
dudmuck 0:f2716e543d97 47 #define os_clearMem(a,b) memset(a,0,b)
dudmuck 0:f2716e543d97 48 #define os_copyMem(a,b,c) memcpy(a,b,c)
dudmuck 0:f2716e543d97 49
dudmuck 0:f2716e543d97 50 typedef struct osjob_t osjob_t;
dudmuck 0:f2716e543d97 51 typedef struct band_t band_t;
dudmuck 0:f2716e543d97 52 typedef struct chnldef_t chnldef_t;
dudmuck 0:f2716e543d97 53 typedef struct rxsched_t rxsched_t;
dudmuck 0:f2716e543d97 54 typedef struct bcninfo_t bcninfo_t;
dudmuck 0:f2716e543d97 55 typedef const u1_t* xref2cu1_t;
dudmuck 0:f2716e543d97 56 typedef u1_t* xref2u1_t;
dudmuck 0:f2716e543d97 57 #define TYPEDEF_xref2rps_t typedef rps_t* xref2rps_t
dudmuck 0:f2716e543d97 58 #define TYPEDEF_xref2rxsched_t typedef rxsched_t* xref2rxsched_t
dudmuck 0:f2716e543d97 59 #define TYPEDEF_xref2chnldef_t typedef chnldef_t* xref2chnldef_t
dudmuck 0:f2716e543d97 60 #define TYPEDEF_xref2band_t typedef band_t* xref2band_t
dudmuck 0:f2716e543d97 61 #define TYPEDEF_xref2osjob_t typedef osjob_t* xref2osjob_t
dudmuck 0:f2716e543d97 62
dudmuck 0:f2716e543d97 63 #define SIZEOFEXPR(x) sizeof(x)
dudmuck 0:f2716e543d97 64
dudmuck 0:f2716e543d97 65 #define ON_LMIC_EVENT(ev) onEvent(ev)
dudmuck 0:f2716e543d97 66 #define DECL_ON_LMIC_EVENT void onEvent(ev_t e)
dudmuck 0:f2716e543d97 67
dudmuck 0:f2716e543d97 68 extern u4_t AESAUX[];
dudmuck 0:f2716e543d97 69 extern u4_t AESKEY[];
dudmuck 0:f2716e543d97 70 #define AESkey ((u1_t*)AESKEY)
dudmuck 0:f2716e543d97 71 #define AESaux ((u1_t*)AESAUX)
dudmuck 0:f2716e543d97 72 #define FUNC_ADDR(func) (&(func))
dudmuck 0:f2716e543d97 73
dudmuck 0:f2716e543d97 74 u1_t radio_rand1 (void);
dudmuck 0:f2716e543d97 75 #define os_getRndU1() radio_rand1()
dudmuck 0:f2716e543d97 76
dudmuck 0:f2716e543d97 77 #define DEFINE_LMIC struct lmic_t LMIC
dudmuck 0:f2716e543d97 78 #define DECLARE_LMIC extern struct lmic_t LMIC
dudmuck 0:f2716e543d97 79
dudmuck 0:f2716e543d97 80 void radio_init (void);
dudmuck 0:f2716e543d97 81 void radio_irq_handler (u1_t dio);
dudmuck 0:f2716e543d97 82 void os_init (void);
dudmuck 0:f2716e543d97 83 void os_runloop (void);
dudmuck 0:f2716e543d97 84
dudmuck 0:f2716e543d97 85 //================================================================================
dudmuck 0:f2716e543d97 86
dudmuck 0:f2716e543d97 87
dudmuck 0:f2716e543d97 88 #ifndef RX_RAMPUP
dudmuck 0:f2716e543d97 89 #define RX_RAMPUP (us2osticks(2000))
dudmuck 0:f2716e543d97 90 #endif
dudmuck 0:f2716e543d97 91 #ifndef TX_RAMPUP
dudmuck 0:f2716e543d97 92 #define TX_RAMPUP (us2osticks(2000))
dudmuck 0:f2716e543d97 93 #endif
dudmuck 0:f2716e543d97 94
dudmuck 0:f2716e543d97 95 /* OSTICKS_PER_SEC is platform specific. Moved to hal.h */
dudmuck 0:f2716e543d97 96
dudmuck 0:f2716e543d97 97 typedef s4_t ostime_t;
dudmuck 0:f2716e543d97 98
dudmuck 0:f2716e543d97 99 #if !HAS_ostick_conv
dudmuck 0:f2716e543d97 100 #define us2osticks(us) ((ostime_t)( ((s8_t)(us) * OSTICKS_PER_SEC) / 1000000))
dudmuck 0:f2716e543d97 101 #define ms2osticks(ms) ((ostime_t)( ((s8_t)(ms) * OSTICKS_PER_SEC) / 1000))
dudmuck 0:f2716e543d97 102 #define sec2osticks(sec) ((ostime_t)( (s8_t)(sec) * OSTICKS_PER_SEC))
dudmuck 0:f2716e543d97 103 #define osticks2ms(os) ((s4_t)(((os)*(s8_t)1000 ) / OSTICKS_PER_SEC))
dudmuck 0:f2716e543d97 104 #define osticks2us(os) ((s4_t)(((os)*(s8_t)1000000 ) / OSTICKS_PER_SEC))
dudmuck 0:f2716e543d97 105 // Special versions
dudmuck 0:f2716e543d97 106 #define us2osticksCeil(us) ((ostime_t)( ((s8_t)(us) * OSTICKS_PER_SEC + 999999) / 1000000))
dudmuck 0:f2716e543d97 107 #define us2osticksRound(us) ((ostime_t)( ((s8_t)(us) * OSTICKS_PER_SEC + 500000) / 1000000))
dudmuck 0:f2716e543d97 108 #define ms2osticksCeil(ms) ((ostime_t)( ((s8_t)(ms) * OSTICKS_PER_SEC + 999) / 1000))
dudmuck 0:f2716e543d97 109 #define ms2osticksRound(ms) ((ostime_t)( ((s8_t)(ms) * OSTICKS_PER_SEC + 500) / 1000))
dudmuck 0:f2716e543d97 110 #endif
dudmuck 0:f2716e543d97 111
dudmuck 0:f2716e543d97 112
dudmuck 0:f2716e543d97 113 struct osjob_t; // fwd decl.
dudmuck 0:f2716e543d97 114 typedef void (*osjobcb_t) (struct osjob_t*);
dudmuck 0:f2716e543d97 115 struct osjob_t {
dudmuck 0:f2716e543d97 116 struct osjob_t* next;
dudmuck 0:f2716e543d97 117 ostime_t deadline;
dudmuck 0:f2716e543d97 118 osjobcb_t func;
dudmuck 0:f2716e543d97 119 };
dudmuck 0:f2716e543d97 120 TYPEDEF_xref2osjob_t;
dudmuck 0:f2716e543d97 121
dudmuck 0:f2716e543d97 122
dudmuck 0:f2716e543d97 123 #ifndef HAS_os_calls
dudmuck 0:f2716e543d97 124
dudmuck 0:f2716e543d97 125 #ifndef os_getDevKey
dudmuck 0:f2716e543d97 126 void os_getDevKey (xref2u1_t buf);
dudmuck 0:f2716e543d97 127 #endif
dudmuck 0:f2716e543d97 128 #ifndef os_getArtEui
dudmuck 0:f2716e543d97 129 void os_getArtEui (xref2u1_t buf);
dudmuck 0:f2716e543d97 130 #endif
dudmuck 0:f2716e543d97 131 #ifndef os_getDevEui
dudmuck 0:f2716e543d97 132 void os_getDevEui (xref2u1_t buf);
dudmuck 0:f2716e543d97 133 #endif
dudmuck 0:f2716e543d97 134 #ifndef os_setCallback
dudmuck 0:f2716e543d97 135 void os_setCallback (xref2osjob_t job, osjobcb_t cb);
dudmuck 0:f2716e543d97 136 #endif
dudmuck 0:f2716e543d97 137 #ifndef os_setTimedCallback
dudmuck 0:f2716e543d97 138 void os_setTimedCallback (xref2osjob_t job, ostime_t time, osjobcb_t cb);
dudmuck 0:f2716e543d97 139 #endif
dudmuck 0:f2716e543d97 140 #ifndef os_clearCallback
dudmuck 0:f2716e543d97 141 void os_clearCallback (xref2osjob_t job);
dudmuck 0:f2716e543d97 142 #endif
dudmuck 0:f2716e543d97 143 #ifndef os_getTime
dudmuck 0:f2716e543d97 144 ostime_t os_getTime (void);
dudmuck 0:f2716e543d97 145 #endif
dudmuck 0:f2716e543d97 146 #ifndef os_getTimeSecs
dudmuck 0:f2716e543d97 147 uint os_getTimeSecs (void);
dudmuck 0:f2716e543d97 148 #endif
dudmuck 0:f2716e543d97 149 #ifndef os_radio
dudmuck 0:f2716e543d97 150 void os_radio (u1_t mode);
dudmuck 0:f2716e543d97 151 #endif
dudmuck 0:f2716e543d97 152 #ifndef os_getBattLevel
dudmuck 0:f2716e543d97 153 u1_t os_getBattLevel (void);
dudmuck 0:f2716e543d97 154 #endif
dudmuck 0:f2716e543d97 155
dudmuck 0:f2716e543d97 156 #ifndef os_rlsbf4
dudmuck 0:f2716e543d97 157 //! Read 32-bit quantity from given pointer in little endian byte order.
dudmuck 0:f2716e543d97 158 u4_t os_rlsbf4 (xref2cu1_t buf);
dudmuck 0:f2716e543d97 159 #endif
dudmuck 0:f2716e543d97 160 #ifndef os_wlsbf4
dudmuck 0:f2716e543d97 161 //! Write 32-bit quntity into buffer in little endian byte order.
dudmuck 0:f2716e543d97 162 void os_wlsbf4 (xref2u1_t buf, u4_t value);
dudmuck 0:f2716e543d97 163 #endif
dudmuck 0:f2716e543d97 164 #ifndef os_rmsbf4
dudmuck 0:f2716e543d97 165 //! Read 32-bit quantity from given pointer in big endian byte order.
dudmuck 0:f2716e543d97 166 u4_t os_rmsbf4 (xref2cu1_t buf);
dudmuck 0:f2716e543d97 167 #endif
dudmuck 0:f2716e543d97 168 #ifndef os_wmsbf4
dudmuck 0:f2716e543d97 169 //! Write 32-bit quntity into buffer in big endian byte order.
dudmuck 0:f2716e543d97 170 void os_wmsbf4 (xref2u1_t buf, u4_t value);
dudmuck 0:f2716e543d97 171 #endif
dudmuck 0:f2716e543d97 172 #ifndef os_rlsbf2
dudmuck 0:f2716e543d97 173 //! Read 16-bit quantity from given pointer in little endian byte order.
dudmuck 0:f2716e543d97 174 u2_t os_rlsbf2 (xref2cu1_t buf);
dudmuck 0:f2716e543d97 175 #endif
dudmuck 0:f2716e543d97 176 #ifndef os_wlsbf2
dudmuck 0:f2716e543d97 177 //! Write 16-bit quntity into buffer in little endian byte order.
dudmuck 0:f2716e543d97 178 void os_wlsbf2 (xref2u1_t buf, u2_t value);
dudmuck 0:f2716e543d97 179 #endif
dudmuck 0:f2716e543d97 180
dudmuck 0:f2716e543d97 181 //! Get random number (default impl for u2_t).
dudmuck 0:f2716e543d97 182 #ifndef os_getRndU2
dudmuck 0:f2716e543d97 183 #define os_getRndU2() ((u2_t)((os_getRndU1()<<8)|os_getRndU1()))
dudmuck 0:f2716e543d97 184 #endif
dudmuck 0:f2716e543d97 185 #ifndef os_crc16
dudmuck 0:f2716e543d97 186 u2_t os_crc16 (xref2u1_t d, uint len);
dudmuck 0:f2716e543d97 187 #endif
dudmuck 0:f2716e543d97 188
dudmuck 0:f2716e543d97 189 #endif // !HAS_os_calls
dudmuck 0:f2716e543d97 190
dudmuck 0:f2716e543d97 191 // ======================================================================
dudmuck 0:f2716e543d97 192 // AES support
dudmuck 0:f2716e543d97 193 // !!Keep in sync with lorabase.hpp!!
dudmuck 0:f2716e543d97 194
dudmuck 0:f2716e543d97 195 #ifndef AES_ENC // if AES_ENC is defined as macro all other values must be too
dudmuck 0:f2716e543d97 196 #define AES_ENC 0x00
dudmuck 0:f2716e543d97 197 #define AES_DEC 0x01
dudmuck 0:f2716e543d97 198 #define AES_MIC 0x02
dudmuck 0:f2716e543d97 199 #define AES_CTR 0x04
dudmuck 0:f2716e543d97 200 #define AES_MICNOAUX 0x08
dudmuck 0:f2716e543d97 201 #endif
dudmuck 0:f2716e543d97 202 #ifndef AESkey // if AESkey is defined as macro all other values must be too
dudmuck 0:f2716e543d97 203 extern xref2u1_t AESkey;
dudmuck 0:f2716e543d97 204 extern xref2u1_t AESaux;
dudmuck 0:f2716e543d97 205 #endif
dudmuck 0:f2716e543d97 206 #ifndef os_aes
dudmuck 0:f2716e543d97 207 u4_t os_aes (u1_t mode, xref2u1_t buf, u2_t len);
dudmuck 0:f2716e543d97 208 #endif
dudmuck 0:f2716e543d97 209
dudmuck 0:f2716e543d97 210
dudmuck 0:f2716e543d97 211
dudmuck 0:f2716e543d97 212 #endif // _oslmic_h_