
🧠关键词: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_msgq 或 k_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
















暂无评论内容