activation-abp.ino
ABP se salta el paso de join: la dirección y las claves de sesión se escriben a mano en la MKR WAN 1310 y el servidor. Útil en redes privadas o para depurar rápido, pero sin rotación de claves ni resistencia a repeticiones; evítalo en redes públicas.
Hardware
Una Arduino MKR WAN 1310 (microcontrolador SAMD21, módem LoRa pilotado por un ESP32 integrado que también expone Wi-Fi, antena LoRa y antena Wi-Fi). MKR WAN 1310, servidor LoRaWAN donde el dispositivo se crea en modo ABP con las mismas claves.
Cableado
Sin cableado; genera claves aleatorias en el servidor, no dejes los ceros del ejemplo.
Funcionamiento
join(ABP,...) configura simplemente la pila MAC con la dirección y las claves estáticas; el primer sendBuffer sale de inmediato, sin ventana de join.
Ejecución
Instala Arduino SAMD Boards y la librería MKRWAN 2.x (MKRWAN1310), selecciona la placa y carga. La 1310 se controla con comandos AT a través de su ESP32 interno; para LoRa, prevé una segunda placa LoRa al otro lado.
Variantes
Compara la latencia de la primera trama OTAA vs ABP en tu cobertura; ese es el argumento del ABP en escenarios de emergencia.
activation-abp.ino
// Activation ABP pour la MKR WAN 1310 : pas de jointure OTAA.
// A reserver aux reseaux prives ou a la banque de test.
#include <MKRWiSOLAR.h>
const uint32_t DEV_ADDR = 0x26020102;
const uint8_t NWK_SKEY[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
const uint8_t APP_SKEY[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
LoRaWAN lora;
void setup() {
Serial.begin(9600);
while (!Serial);
lora.setDeviceAddress(DEV_ADDR);
lora.setNetworkSKey(NWK_SKEY);
lora.setAppSKey(APP_SKEY);
lora.setRegion(EU_863_870_R1);
// ABP : pas d'echange join, on emet directement
if (lora.join(ABP, MODEL_TYPE_A, 5000, 1) == 0) {
Serial.println(F("ABP refuse (config?)"));
while (true);
}
Serial.println(F("ABP actif, emission possible"));
uint8_t t[1] = { 42 };
lora.sendBuffer(t, 1, 1, 0);
Serial.println(F("trame de test emise"));
}
void loop() {
lora.run();
}