activation-abp.ino
L'ABP saute l'étape de jointure : l'adresse et les clés de session sont écrites à la main dans la MKR WAN 1310 et le serveur. Utile sur un réseau privé ou pour déboguer rapidement, mais sans rotation de clés ni résistance aux rejeux : à éviter sur les réseaux publics.
Matériel requis
Une Arduino MKR WAN 1310 (microcontrôleur SAMD21, modem LoRa piloté par un ESP32 embarqué qui expose aussi le Wi-Fi, antenne LoRa et antenne Wi-Fi). MKR WAN 1310, serveur LoRaWAN où l'device est créée en mode ABP avec les mêmes clés.
Câblage
Aucun câblage ; générez les clés aléatoirement côté serveur, ne laissez pas les zéros de l'exemple.
Fonctionnement
join(ABP,...) configure simplement la pile MAC avec l'adresse et les clés statiques ; le premier sendBuffer part immédiatement, sans fenêtre de jointure.
Exécution
Installez Arduino SAMD Boards et la bibliothèque MKRWAN 2.x (MKRWAN1310), sélectionnez la carte, téléversez. La 1310 se pilote par commandes AT via l'ESP32 interne ; pour LoRa, prévoyez une seconde carte LoRa en face.
Variantes
Comparez le délai de première trame OTAA vs ABP sur votre couverture, c'est l'argument de l'ABP en scénario d'urgence.
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();
}