当前位置:首页 > 嵌入式 > 嵌入式分享
[导读]在IoT可穿戴与传感器节点中,低功耗蓝牙(Bluetooth Low Energy, BLE) 是首选无线协议。Zephyr RTOS原生集成BlueZ-hosted BT stack(Host + Controller可选),支持Peripheral/Central/Observer等角色,且对Nordic nRF52、ST WB系列有直接驱动支持。本文将按真实Bring-up顺序,记录从环境搭建到GATT服务的完整开发流程。



在IoT可穿戴与传感器节点中,低功耗蓝牙(Bluetooth Low Energy, BLE) 是首选无线协议。Zephyr RTOS原生集成BlueZ-hosted BT stack(Host + Controller可选),支持Peripheral/Central/Observer等角色,且对Nordic nRF52、ST WB系列有直接驱动支持。本文将按真实Bring-up顺序,记录从环境搭建到GATT服务的完整开发流程。


一、环境与板卡准备


• Host机:Ubuntu 22.04 + west (Zephyr meta-tool)


• Target:nRF52840 DK(PCA10056)或 nRF5340 DK


- Zephyr版本:v3.5 LTS(示例命令兼容新版)

• 工具链:arm-none-eabi-gcc,west已安装并zephyr-sdk-0.16.x设好环境变量


初始化工作空间(若未做):

west init ~/zephyrproject

cd ~/zephyrproject

west update

west zephyr-export



确认板子被识别:

west boards | grep nrf52840dk



二、创建BLE Peripheral示例工程


Zephyr自带samples/bluetooth/peripheral_hr(心率计)与peripheral(自定义GATT),我们以最简Peripheral为例。


1. 拷贝示例并配置


cp -r zephyr/samples/bluetooth/peripheral my_ble_periph

cd my_ble_periph



prj.conf 最小BLE Peripheral配置:

# 启用BLE协议栈

CONFIG_BT=y

CONFIG_BT_PERIPHERAL=y

CONFIG_BT_DEVICE_NAME="Zephyr_BLE"

CONFIG_BT_DEVICE_APPEARANCE=833   # Generic Heart Rate Sensor


# 使能GATT服务(示例自带Heart Rate Service)

CONFIG_BT_GATT_SERVICE=y

CONFIG_BT_GATT_DIS=y              # Device Information Service


# 日志

CONFIG_BT_DEBUG_LOG=y

CONFIG_LOG=y

CONFIG_LOG_DEFAULT_LEVEL=3


# 低功耗(可选)

CONFIG_PM=y

CONFIG_BT_CTLR_SLEEP_BETWEEN_PREAMBLES=y



2. 设备树 overlay(如需自定义广播间隔)


/ {

   chosen {

       zephyr,bt-enable = &bt_ctlr;

   };

};



三、编译与烧录


# 编译(nRF52840 DK)

west build -b nrf52840dk_nrf52840 -p auto


# 烧录(J-Link / CMSIS-DAP)

west flash


# 查看RTT/串口日志

west espressif monitor   # 或 minicom @ 115200



上电后串口应打印:


[00:00:00.010,000] bt_hci_core: Bluetooth initialized

[00:00:00.012,000] peripheral: Advertising started



手机端用nRF Connect可扫描到 Zephyr_BLE 并发现 Heart Rate Service (0x180D)。


四、添加自定义GATT Service(核心实战)


真实产品通常需要自定义特征值,下面演示添加一个只读设备状态特征。


1. 定义UUID(可随机生成)


/* my_service.h */

#define MY_SVC_UUID        BT_UUID_DECLARE_128( \

   0x12,0x34,0x56,0x78,0x90,0xAB,0xCD,0xEF, \

   0xFE,0xDC,0xBA,0x09,0x87,0x65,0x43,0x21)


#define MY_CHAR_STATUS_UUID BT_UUID_DECLARE_16(0xFF01)



2. 实现GATT Service回调


#include <zephyr/bluetooth/bluetooth.h>

#include <zephyr/bluetooth/gatt.h>

#include <zephyr/bluetooth/uuid.h>

#include "my_service.h"


static uint8_t dev_status = 0x55;  // 示例:电池+工作状态


static ssize_t read_status(struct bt_conn *conn,

                          const struct bt_gatt_attr *attr,

                          void *buf, uint16_t len, uint16_t offset)

{

   return bt_gatt_attr_read(conn, attr, buf, len, offset,

                             &dev_status, sizeof(dev_status));

}


/* GATT Attribute Table */

BT_GATT_SERVICE_DEFINE(my_svc,

   BT_GATT_PRIMARY_SERVICE(MY_SVC_UUID),

   BT_GATT_CHARACTERISTIC(MY_CHAR_STATUS_UUID,

       BT_GATT_CHRC_READ,

       BT_GATT_PERM_READ,

       read_status, NULL, NULL)

);


/* 在main中启用 */

void ble_adv_start(void)

{

   struct bt_le_adv_param *param = BT_LE_ADV_CONN;

   bt_le_adv_start(param, ad, ARRAY_SIZE(ad),

                   sd, ARRAY_SIZE(sd));

}



在main.c初始化顺序:

void main(void)

{

   int err = bt_enable(NULL);

   if (err) printk("Bluetooth init failed (%d)\n", err);


   /* 可选:注册GAP回调 */

   bt_conn_cb_register(&conn_callbacks);

   ble_adv_start();

}



重新编译烧录后,nRF Connect可看到自定义Service并读取0x55。


五、低功耗相关配置与验证


BLE Peripheral在广播间隙与连接空闲可进低功耗:

# prj.conf 追加

CONFIG_PM=y

CONFIG_BT_CTLR_LOW_LATENCY_DISABLE=y   # 允许controller休眠

CONFIG_SYS_POWER_MANAGEMENT=y

CONFIG_TICKLESS_KERNEL=y



用电流表测nRF52840:

• 广播态(ADV_IND 20ms间隔):≈ 20 µA 平均(含栈处理)


• 连接空闲(7.5ms Conn Interval):≈ 5–8 µA


- 深度休眠(未广播,挂起):≈ 0.8 µA


注意:若打开了CONFIG_BT_DEBUG_LOG,日志UART会阻止深睡,实测电流显著升高——发布版务必关调试日志。


六、常见坑排查


现象 原因 解决


编译报 undefined reference to bt_enable 未开 CONFIG_BT=y 或链接zephyr.elf时缺lib 确认prj.conf包含 CONFIG_BT=y


手机搜不到设备 广播数据(ad/sd)未含Flags字段 示例中已含 BT_DATA_FLAGS(BT_LE_AD_GENERAL_DISC)


写特征值返回 BT_ATT_ERR_ATTRIBUTE_NOT_FOUND UUID不匹配或Characteristic未注册 检查 BT_GATT_SERVICE_DEFINE 宏是否被执行(需全局对象)


功耗异常高 LOG_UART活跃 / 未开Tickless 关闭CONFIG_BT_DEBUG_LOG,确认CONFIG_TICKLESS_KERNEL=y


七、结语


Zephyr RTOS提供了一套从Controller到GATT Service的完整BLE协议栈。通过west构建、最小prj.conf启用BT、用BT_GATT_SERVICE_DEFINE挂自定义服务,配合低功耗Kconfig选项,即可在nRF等平台快速实现符合规范的BLE Peripheral。对Central / Observer 角色,流程相似,只需切换CONFIG_BT_CENTRAL=y并调用bt_le_scan_start()。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读

Nordic 超低功耗 SoC 提供双核性能和可靠低功耗蓝牙连接,帮助Polar Loop 无屏健身手环充分发挥潜力

关键字: SoC 低功耗蓝牙 健身手环

随着移动入户技术的快速发展,用户对智能门锁的安全性、互操作性与无感体验提出了更高要求。Durin作为聚焦下一代家居入户体验的创新企业,摒弃传统共享密码模式,提供无需手动输入、强身份识别且高隐私保护的入户管理方案,致力于让...

关键字: NFC 低功耗蓝牙 UWB

扩展nRF54L 系列以涵盖更广泛的应用,包括对成本敏感的低功耗蓝牙产品。

关键字: 低功耗蓝牙 SoC 存储器

简而言之,设备配网就是把终端设备安全地添加到网络的过程。因此,配网需要设备与网关通信,交换密钥,以确保网络的完整性。在给Matter设备配网时,大多数设备要求用户先在手机或平板等移动设备上输入设备的二维码或密码,然后,手...

关键字: NFC 低功耗蓝牙 二维码

聚焦新国标移动电源与各类终端便捷通信的核心需求,专业接口芯片厂商沁恒微电子基于二十年连接领域经验积累,推出了充电宝USB、低功耗蓝牙通信等多类型解决方案,支持iOS、Android、HarmonyOS手机平板和Windo...

关键字: 沁恒 新国标 电源 USB 低功耗蓝牙 通信

提升设备响应速度、增强安全性,并改善通信与测试能力

关键字: 低功耗蓝牙 USB 智能家居

本文深入介绍了低功耗蓝牙(BLE)协议栈架构,并探讨了如何运用现有的BLE应用,充分发挥低功耗无线通信的潜力。为了能够高效可靠地开展设计、解决问题和优化应用,这些知识必不可少。

关键字: 低功耗蓝牙 协议栈 无线通信

智能家电是互联设备市场中增长最快的细分领域之一,产品范围广泛,从白色家电、咖啡机到联网牙刷应有尽有。为这些设备集成联网功能,所带来的远不止远程控制能力。通过集成边缘人工智能(AI),用户能够享受到个性化、具备情境感知的体...

关键字: Wi-Fi 6 低功耗蓝牙 Matter

低功耗蓝牙(BLE)5.3作为无线通信领域的核心技术突破,通过多设备连接优化与动态信道跳频策略,显著提升了复杂环境下的无线传输稳定性。其技术革新不仅解决了传统蓝牙在多设备协同与干扰抑制中的痛点,更在智能家居、工业物联网、...

关键字: 低功耗蓝牙 多设备连接 信道跳频

毋须依赖实时操作系统(RTOS)的全新低功耗蓝牙开发软件解决方案面世,旨在帮助开发者从传统nRF5 SDK和nRF52系列轻松迁移至新一代nRF54L系列

关键字: 低功耗蓝牙 SoC SDK
关闭