OTAA (Over-The-Air Activation) 是 LoRaWAN 设备入网的推荐方式,提供了更高的安全性。
首先需要在 prj.conf 中启用 LoRaWAN 支持:
# LoRa 驱动配置
CONFIG_LORA=y
CONFIG_LORA_SX12XX=y
CONFIG_LORA_SX1276=y
# LoRaWAN 配置
CONFIG_LORAWAN=y
CONFIG_LORAWAN_SYSTEM_MAX_RX_ERROR=20
CONFIG_LORAWAN_APP_DEV_EUI="your_dev_eui"
CONFIG_LORAWAN_APP_JOIN_EUI="your_join_eui"
CONFIG_LORAWAN_APP_KEY="your_app_key"
CONFIG_LORAWAN_APP_PORT=1
#include <zephyr.h>
#include <lorawan/lorawan.h>
#define LORAWAN_DEV_EUI { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
#define LORAWAN_JOIN_EUI { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
#define LORAWAN_APP_KEY { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
void main(void)
{
struct lorawan_join_config join_cfg = {
.mode = LORAWAN_ACT_OTAA,
.dev_eui = LORAWAN_DEV_EUI,
.join_eui = LORAWAN_JOIN_EUI,
.app_key = LORAWAN_APP_KEY,
.nb_trials = 3
};
if (lorawan_start()) {
printk("LoRaWAN stack启动失败\n");
return;
}
if (lorawan_join(&join_cfg)) {
printk("OTAA入网失败\n");
return;
}
printk("OTAA入网成功\n");
}
LoRaWAN 使用 AES-128 加密算法对传输数据进行端到端加密。
void send_encrypted_data(void)
{
uint8_t data[] = {0x48, 0x65, 0x6C, 0x6C, 0x6F}; // "Hello"
int ret;
ret = lorawan_send(2, data, sizeof(data), LORAWAN_MSG_CONFIRMED);
if (ret < 0) {
printk("发送失败: %d\n", ret);
} else {
printk("数据已发送\n");
}
}
static void lorawan_rx_handler(uint8_t port, bool data_pending,
int16_t rssi, int8_t snr,
uint8_t len, const uint8_t *data)
{
printk("收到端口 %d 的数据:\n", port);
printk("RSSI: %ddB, SNR: %ddB\n", rssi, snr);
printk("数据长度: %d\n", len);
for (int i = 0; i < len; i++) {
printk("%02x ", data[i]);
}
printk("\n");
}
void main(void)
{
// ... OTAA 入网代码 ...
// 设置接收回调
lorawan_register_rx_callback(lorawan_rx_handler);
while (1) {
k_sleep(K_SECONDS(30));
send_encrypted_data();
}
}