【Zephyr 系列 16】构建 BLE + LoRa 协同通信系统:网关转发与混合调度实战

🧠关键词:Zephyr、BLE、LoRa、混合通信、事件驱动、网关中继、低功耗调度
📌面向读者:希望将 BLE 和 LoRa 结合应用于资产追踪、环境监测、远程数据采集等场景的开发者
📊篇幅预计:5300+ 字


🧭 背景与需求

在许多 IoT 项目中,单一通信方式往往难以兼顾近场数据采集与远程数据上传。典型案例包括:

🏷️ 资产标签周期广播数据(BLE)

📶 远程网关将 BLE 数据上传至服务器(LoRa / NB-IoT)

🔋 对终端功耗有严格要求(仅广播 + 无连接)

目标:构建一个BLE + LoRa 混合通信网关系统


🧱 系统组成

角色 硬件 通信 功能
BLE 终端 IDB011V1 广播 定时广播传感器数据
BLE + LoRa 网关 nRF54L15 + LoRa 模块 扫描 / LoRa 接收 BLE 广播 → LoRa 上传
上位机/云平台 Linux PC 串口/MQTT 接收网关转发数据

📦 项目模块划分

ble_lora_gateway/
├── src/
│   ├── main.c
│   ├── ble_scan.c
│   ├── lora_tx.c
│   ├── data_buffer.c
│   ├── event_loop.c
│   └── config.c
└── prj.conf

🧠 架构总览图(模块 + 通信)


🧠 BLE 广播接收(ble_scan.c)

目标:

使用 Zephyr API 开启广播监听

解析 0xFF 厂商字段(传感器数据)

过滤 MAC/UUID 等字段

代码核心:

static void device_found(const bt_addr_le_t *addr, int8_t rssi,
                         uint8_t type, struct net_buf_simple *ad)
{
    if (parse_adv(ad, &sensor_pkt)) {
        data_buffer_push(sensor_pkt);
        event_loop_notify(EVT_BLE_DATA_READY);
    }
}

🧠 数据结构设计

typedef struct {
    uint8_t mac[6];
    int16_t temperature;
    uint8_t humidity;
    uint8_t battery;
    int8_t rssi;
    uint64_t timestamp;
} sensor_data_t;

🧠 LoRa 模块通信(lora_tx.c)

支持两种模式:

AT 指令式(通过串口控制 LoRa 模块)

SPI 半双工式(用于 Semtech 模块)

示例(串口模式):

void lora_send(const sensor_data_t *pkt)
{
    sprintf(cmd, "AT+SEND=%s,%d,%d,%d
", mac, temp, humi, rssi);
    uart_write(lora_uart, cmd, strlen(cmd));
}

🧠 事件驱动循环(event_loop.c)

使用 Zephyr k_msgqk_work 驱动整个数据流程:

while (1) {
    event_t evt = event_queue_get();
    switch (evt) {
        case EVT_BLE_DATA_READY:
            sensor_data_t pkt;
            data_buffer_pop(&pkt);
            lora_send(&pkt);
            break;
    }
}

🧪 串口调试示例输出

BLE Packet Received:
MAC: A4:C1:38:10:11:22
TEMP: 23.4°C, HUMI: 56%, RSSI: -71
→ LORA_SEND: OK

📚 功耗优化建议

模块 建议
BLE 扫描 设置周期性开启(如每分钟扫描10秒)
LoRa 模块 发送后立即关闭,使用 GPIO 控制电源
MCU 主控 使用 k_sleep / Tickless Kernel

prj.conf 关键配置:

CONFIG_PM=y
CONFIG_TICKLESS_KERNEL=y
CONFIG_UART_ASYNC_API=y

🧠 支持扩展:数据聚合与批量上报

设定 buffer 容量为 10:

收到 10 个 sensor_data → 批量格式化成 JSON 串 → LoRa 一次发送

或者 30 秒无数据也触发定时发送


📱 可视化与远程平台对接

平台 接入方式 可行性
TTN LoRaWAN 兼容模块 高(需适配协议)
MQTT Broker UART → Linux 高(配合 Python 脚本)
Serial Logger PC 串口 初期测试建议使用

🔐 安全与数据完整性建议

问题 对策
BLE 广播误码 添加 CRC 字段并在接收端校验
LoRa 信道干扰 添加重发逻辑,失败告警
加密需求 AES 加密 sensor_data 字段,再 Base64 编码

📚 下一篇预告

【Zephyr 系列 17】

多协议网关实战:BLE + LoRa + UART + MQTT 综合调度系统

消息队列协同调度

多接口状态监控

支持 AT 命令远程控制通信策略

内部通信总线设计(RingBuffer + JSON)

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容