news 2026/1/20 19:17:36

基于 Yocto 的蓝牙 Peripheral 设备实战:初始化、连接与数据传输全流程解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于 Yocto 的蓝牙 Peripheral 设备实战:初始化、连接与数据传输全流程解析

📺B站视频讲解(Bilibili):https://www.bilibili.com/video/BV1k1C9BYEAB/

📘《Yocto项目实战教程》京东购买链接:Yocto项目实战教程


基于 Yocto 的蓝牙 Peripheral 设备实战:初始化、连接与数据传输全流程解析

本文以Rockchip 平台 + Yocto 系统为背景,结合你当前使用的蓝牙设备,从 Peripheral(从设备)视角,完整讲清楚:

  • 蓝牙 Peripheral 在系统中的角色定位
  • 如何在 Yocto 中配置蓝牙的初始信息
  • Peripheral 如何被 Central 发现并建立连接
  • 连接建立后如何进行数据传输
  • 实战中真正重要的协议与接口
  • 推荐的资料与调试方法

全文以工程实战为主线,不做无关扩展,目标是:你看完就能在自己的板子上跑起来,并知道每一步在干什么


一、从工程视角重新理解蓝牙角色模型

在任何蓝牙系统中,首先必须明确角色(Role),否则后续配置一定会混乱。

1. Central 与 Peripheral 的工程含义

角色常见设备工程职责
Central手机、PC、工控主机发起扫描、建立连接、读取/写入数据
Peripheral传感器、嵌入式板卡广播自身信息、等待连接、提供数据服务

👉你当前的 Rockchip + Yocto 设备,典型就是 Peripheral。

也就是说:

  • 你的设备不主动扫描别人

  • 而是:

    • 周期性广播(Advertising)
    • 等待 Central 连接
    • 提供可被访问的数据接口

这决定了我们后面所有配置的方向。


二、蓝牙 Peripheral 的整体软件架构(Yocto + Rockchip)

在 Yocto 系统中,一个典型的蓝牙 Peripheral 软件栈如下:

应用层(你的程序) └── 使用 D-Bus / socket / GATT 接口 BlueZ(bluetoothd) ├── GAP(设备发现 / 连接管理) ├── GATT Server(数据服务) └── 安全 / 配对策略 Linux Kernel └── HCI 驱动(UART / USB) 蓝牙控制器(BT 芯片)

核心结论

在 Yocto 中做蓝牙 Peripheral,99% 的工作都在 user space(BlueZ + 应用),不是内核驱动。


三、第一步:在 Yocto 中配置 Peripheral 的“初始信息”

所谓“初始信息”,从 Peripheral 角度,核心只有四类:

  1. 设备名(Central 扫描时看到的名字)
  2. 是否自动上电(power on)
  3. 是否可被发现(discoverable)
  4. 支持的蓝牙模式(BLE / BR-EDR)

3.1 BlueZ 的核心配置文件:main.conf

路径:

/etc/bluetooth/main.conf

这是Peripheral 行为的根配置文件

3.2 一个适合 Rockchip Peripheral 的实战配置示例

[General] Name = RK-Peripheral Class = 0x000100 DiscoverableTimeout = 0 PairableTimeout = 0 ControllerMode = dual AutoEnable = true [Policy] AutoEnable = true
配置项逐条解释(工程意义)
  • Name

    • Central 扫描时看到的设备名
    • 等同于“蓝牙对外身份”
  • DiscoverableTimeout = 0

    • 永久可发现
    • 对嵌入式 Peripheral 非常重要
  • ControllerMode = dual

    • 同时支持 BLE + 经典蓝牙
  • AutoEnable = true

    • bluetoothd 启动即打开控制器

👉这一份配置,已经定义了 Peripheral 的“开机形态”


四、第二步:确保 Peripheral 在系统启动后处于“可连接状态”

仅有main.conf在工程上往往不够稳妥,实际项目中,一定会再加一层 systemd 兜底

4.1 为什么要加 systemd 初始化服务?

因为在 Rockchip 平台上:

  • 蓝牙固件加载
  • UART 设备就绪
  • bluetoothd 启动顺序

存在时序不确定性。

4.2 一个工程常用的 Peripheral 初始化服务

[Unit] Description=Bluetooth Peripheral Init After=bluetooth.service [Service] Type=oneshot ExecStart=/usr/bin/bluetoothctl power on ExecStart=/usr/bin/bluetoothctl discoverable on ExecStart=/usr/bin/bluetoothctl pairable on RemainAfterExit=yes [Install] WantedBy=multi-user.target

这一步的效果是:

无论系统怎么启动,最终你的设备一定是一个“可发现、可连接的 Peripheral”。


五、第三步:Peripheral 是如何被 Central 发现的?(GAP)

5.1 广播(Advertising)在做什么?

当 Peripheral 没有连接时,会周期性发送广播包,内容包括:

  • 设备地址(MAC)
  • 设备名(Name)
  • 支持的服务 UUID(可选)

Central 做的事情很简单:

扫描 → 显示 → 用户选择 → 发起连接

5.2 用手机验证 Peripheral 是否正确工作

这是最基础、也是最重要的一步。

  • Android / iOS 打开蓝牙
  • 搜索设备
  • 是否能看到:
RK-Peripheral

如果这一步失败:

  • 问题一定在初始化 / 广播阶段
  • 不要继续往下查

六、第四步:Peripheral 与 Central 的连接建立过程

连接建立由Central 主动发起,Peripheral 只是被动响应。

6.1 连接阶段发生了什么?

  1. Central 发送 Connection Request
  2. Peripheral 接受连接
  3. 双方进入 Connected 状态
  4. 建立 L2CAP 信道

你在系统中能看到的典型现象:

bluetoothctl>devices>info XX:XX:XX:XX:XX:XX

状态从:

Connected: no

变为:

Connected: yes

七、真正的数据传输核心:GATT(重点)

如果你只记住一个协议,那一定是 GATT。

7.1 为什么 GATT 是 Peripheral 的核心?

因为:

  • Peripheral ≠ socket server
  • Peripheral 提供的是属性(Attribute)

Central 做的事情只有三种:

  • Read(读)
  • Write(写)
  • Notify / Indicate(订阅)

7.2 GATT 的层级结构(非常重要)

GATT Server(在 Peripheral 上) └── Service(服务) └── Characteristic(特征) ├── Value └── Properties(读/写/通知)

你要传输的数据,最终都体现在 Characteristic 的 value 上


八、实战:在 Yocto 设备上实现一个最小 GATT Server

下面给你一个工程可用、逻辑清晰的最小示例

8.1 使用 BlueZ 的 D-Bus GATT 接口(推荐方式)

BlueZ 官方推荐:

  • Peripheral →实现 GATT Server
  • 通过 D-Bus 向 bluetoothd 注册

8.2 示例:一个自定义数据 Service

1️⃣ 定义 Service UUID
12345678-1234-5678-1234-56789abcdef0
2️⃣ 定义 Characteristic
87654321-4321-6789-4321-fedcba987654

属性:

  • Read
  • Write
  • Notify

8.3 Python 示例(清晰、适合 Yocto)

classDataCharacteristic(Characteristic):def__init__(self,bus,index,service):super().__init__(bus,index,'87654321-4321-6789-4321-fedcba987654',['read','write','notify'],service)self.value=[0x00]defReadValue(self,options):returnself.valuedefWriteValue(self,value,options):self.value=valueprint("Received data:",value)defnotify_data(self,data):self.value=data self.PropertiesChanged(GATT_CHRC_IFACE,{'Value':self.value},[])

8.4 数据流向说明(非常关键)

  • Central 写数据 →WriteValue()
  • Peripheral 主动推送 →notify_data()
  • Central 订阅后即可实时接收

👉这就是蓝牙 Peripheral 数据传输的本质。


九、协议重点总结(只保留工程必要部分)

协议是否必须工程作用
GAP发现 / 连接管理
GATT数据模型与传输
ATTGATT 底层实现
SMP⚠️配对 / 加密(可选)
L2CAP底层信道

记住一句话:

Peripheral 工程开发,90% 的精力都在 GATT 设计上。


十、调试与验证(非常实用)

10.1 在 Peripheral 端

bluetoothctl show info

10.2 在 Central 端

  • nRF Connect(Android / iOS)
  • 查看 Service / Characteristic
  • 读 / 写 / 订阅数据

这是验证 GATT Server 是否正确的最佳工具


十一、推荐参考资料(不多,但够用)

  • BlueZ 官方文档(GATT):

    • https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc
  • Bluetooth Core Specification(只查 GATT / GAP):

    • Volume 3, Part G
  • BlueZ 示例代码:

    • test/example-gatt-server

十二、工程级总结

在 Yocto + Rockchip 平台上实现蓝牙 Peripheral,本质是:

  • 用 BlueZ 定义好设备的“对外形态”(Name / Discoverable)
  • 通过 systemd 保证启动稳定
  • 使用 GATT Server 向 Central 提供数据接口
  • 所有数据交互,最终都映射到 Characteristic 上

📺B站视频讲解(Bilibili):https://www.bilibili.com/video/BV1k1C9BYEAB/

📘《Yocto项目实战教程》京东购买链接:Yocto项目实战教程


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/20 18:39:40

Langchain-Chatchat如何优化首次加载等待时间?

Langchain-Chatchat 如何优化首次加载等待时间? 在部署本地知识库问答系统时,你是否曾遇到这样的尴尬场景:用户满怀期待地上传了几十份企业文档,点击“构建知识库”后,系统却卡在“正在初始化”界面长达十分钟&#xf…

作者头像 李华
网站建设 2026/1/17 11:40:55

智能体(Agent)全攻略:从0到1实现自主思考的AI代理,必收藏指南

文章全面解析AI智能体的定义、核心模块与技术实现路径,提供业务落地实战步骤。通过政务、金融、电商案例展示智能体如何提升效率与体验。探讨发展挑战与应对策略,以及多Agent协作、具身智能等未来趋势,强调智能体是增强人类能力,帮…

作者头像 李华
网站建设 2026/1/20 10:16:34

深度解析AI智能体工作流:从核心原理到实际应用的完整指南

文章深入解析了AI智能体工作流的核心原理与应用。详细介绍了智能体的三大组成(推理、工具、记忆),工作流的特征与模式(规划、工具使用、反思),以及在智能RAG、研究助手和编码等领域的实际应用。同时分析了智…

作者头像 李华
网站建设 2026/1/17 5:11:26

泰拉瑞亚想和外地朋友联机?这个方法超简单

文章目录 前言1. 下载Terraria私服2. 本地运行Terraria 私服3. 本地Terraria私服连接4. Windwos安装Cpolar 工具5. 配置Terraria远程联机地址6. Terraria私服远程联机7. 固定远程联机地址8. 固定的联机地址测试 前言 泰拉瑞亚本地私服的核心功能是让玩家在自己的电脑上搭建游戏…

作者头像 李华
网站建设 2026/1/19 18:02:25

开源AI记忆工具Cognee深度解析:技术优势、部署实践与实测验证

在AI Agents落地过程中,"失忆"问题始终是制约其能力提升的核心瓶颈——传统大模型交互的无状态属性导致历史上下文无法高效复用,传统RAG系统又受限于单一向量匹配,平均回答相关度仅5%,难以满足复杂场景需求。Cognee作为…

作者头像 李华
网站建设 2026/1/19 7:37:34

LangChain+HITL实战:构建安全可信的AI决策系统

文章探讨了AI系统决策权增加背景下,“Human In The Loop”(HITL)机制的重要性。完全"无人值守"的自动化在高风险场景下不可靠,而HITL通过引入人类判断,既能发挥机器效率优势,又能借助人类对复杂情…

作者头像 李华