C语言蓝牙协议栈讲解,蓝牙协议栈记录—BTStack

本文介绍了C语言实现的蓝牙协议栈BTStack的详细内容,包括BTStack的架构特性,如单线程、事件驱动,以及内存管理和运行循环的工作原理。文中还详细讲解了如何使用BTStack,涉及协议和服务的接口、服务结构、内存配置、运行循环的实现以及BTStack的初始化和数据包处理。此外,还涵盖了RFCOMM流控制、设备发现、配对、L2CAP和RFCOMM服务的获取与提供等关键功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TSTack User Guid 翻译过来的

1.简介

2.BTStack 架构

BTStack在所实现的协议和服务之间采用很多状态机实现相互作用,特点:

<1>单线程.BTStack只有一个单独的循环。

<2>没有阻塞,采用event事件方式。

<3>No artficially limited buffers/pools-Incoming and out going data packets are not queued

<4>Statically bouneded memory--最大连接\通道\服务数都可以配置

73f3e48ab8837dae94de686adb541b07.png

上图单线程应用架构。

3.怎样使用BTStack

3.1 协议和服务

BTStack已经实现了HCI、L2CAP、L2CAP-LE、RFCOMM、SDP和ATT。如下图所示.BTStack为HCI,L2CAP,EFCOMM和SDP提供了各种API接口,可直接使用.

6916aaa21e08253c9218a95b8ff8095f.png

BTStack有个重要的结构,service.一个service代表表示一个处理输入连接的服务器端。目前BTStack实现了两个服务,RFCOMM和L2CAP service.LECAP服务处理连接到L2CAP通道的连接,并用协议服务复用器(PSM)注册。RFCOMM服务则处理连接到RFCOMM连接的输入,并用RFCOMM通道ID注册。对于输出则不需要特别的注册,在应用需要的时候会创建.

3.2 内存配置

service 结构体,活跃的连接和远端设备可分为两种不同的方式:

<1>静态的个体的内存池,最大元素在config配置文件中定义。调用btstack_memory_init函数初始化静态内存池。

<2>使用malloc/free 函数动态分配,要在config文件中定义HAVE_MALLOC.

如果同时定义了上述两种方法,则静态分配优先,反之,两者都没定义,则会报错.

函数btstack_memory_init完成内存的设置.

3.3 Run loop

BTStack运行runloop来处理输入数据、安排工作.runloop处理两个来自完全不同类型源的事件:数据源和定时器.数据源表示通讯接口比如UART和USB驱动。定时器用于实现各种蓝牙相关的超时.也可用于处理周期性的事件.

数据源和定时器分别通过结构体data_source_t和timer_source_t表示.每个结构体都包含一个链接列表节点和一个指向回调函数的指针。所有活跃的定时器和数据源都保存在链接列表中。不同的是列表中的数据源没有分类,而定时器是通过失效分类的从而高效处理.完整的run loop循环运行步骤:

<1>轮训运行所有已注册的数据源的回调函数。

<2>执行已就绪的定时器的回调函数.

<3>是否有中断处理请求,没有的话则进入sleep模式.

通过UART、USB或者定时器tick的输入数据会产生中断并叫醒处理器。为了避免在run loop刚好进入睡眠模式的时候发生数据源中断,中断驱动的数据源必须调用embeded_trigger函数.该函数设置一个内部标识在刚进入睡眠模式的临界点中进行判断.

定时器都是单发的:在定时器事件处理函数被执行之前是从定时器列表中移除的.如果定时器是周期的,就在回调函数中再重新注册同样的定时器源.注意,要使用定时器,必须在config文件中定义HAVE_TICK。在代码中,run loop通过调用run_loop_init函数实现:

run_loop_init(RUN_LOOP_EMBEDED);

3.4 BTStack 初始化

初始化BTStack,要先初始化内存和run loop,然后设置HCI和其他所需要的高层协议.

HCI初始化要调整BTStack以适应所采用的平台,并需要四个参数:

<1>Bluetooth hardware control: 蓝牙硬件控制API用一个定制的初始化脚本提供HCI层、制造商特殊的波特率改变命令,以及系统电量通知。也可用于控制蓝牙模块的电源模式。此外还提供一个错误处理函数hw_error,当蓝牙模块报告硬件错误的时候,会调用该函数.bt_control_t结构体封装了常用的功能,比如,bt_control_cc256x_in-stance函数返回一个指针到适合CC256X芯片的控制结构体.

b t_ c o n t r o l _t  * c o n t r o l = b t_ c o n t r o l_ c c 2 5 6 x_ i n s t a n c e ( ) ;

<2>HCI 传输层实现:嵌入式系统中,蓝牙模块可通过UART,或USB端口连接。BTStack实现了两种基于UART的协议:HCI UART 传输层(H4)和带有eHCILL H4(TI的一种轻量级低功耗的变体).这可以通过连接不同的合适的文件而实现,然后获取一个指向HCI传输层实现的指针,比如:

6fc5d799f28ca23efa3f5edd363bade6.png

<3>HCI传输层配置:

因为H

### 蓝牙协议栈详解 #### 协议栈概述 蓝牙技术联盟定义了一个复杂的分层结构来管理无线通信过程,这个层次化的体系被称为蓝牙协议栈。该协议栈不仅涵盖了物理层面的操作,还包括逻辑链路控制、安全管理和应用配置等多个方面[^1]。 #### 双模与单模区别 对于不同类型的设备而言,所采用的具体实现方式也有所不同。例如,像蓝牙音箱这样的产品通常会支持经典蓝牙以及低功耗蓝牙两种模式——即所谓的“双模”。这类设备能够处理较大规模的数据流,如高质量音乐文件的传输。相比之下,诸如小米手环或蓝牙温度计之类的简单传感器节点往往只需要维持较低的能量消耗水平,在设计上更倾向于只保留必要的功能模块,也就是常说的“低功耗蓝牙”,这实际上就是指单模蓝牙的一种形式[^2]。 #### 空中接口协议(Air Interface Protocol) 为了确保各个组件间可以有效地交换信息并协调工作状态的变化,必须有一套完善的规则集指导整个流程。在BLE环境中,这套规则被命名为Air Interface Protocol (AIP),其主要职责在于规定特定条件下各参与方应如何相互沟通交流,并且允许基于外部输入调整自身的运行状况以适应新的需求场景[^3]。 #### 主机控制接口(HCI)的作用 HCI作为一个桥梁连接着Host端软件应用程序和Controller硬件资源,使得两者间的协作变得更加灵活便捷。具体来说,通过HCI可以实现在不同的计算单元之间分配任务负载的目的,比如让主CPU专注于执行高级别的业务逻辑运算,而把底层网络通讯的任务交给专门定制过的协处理器完成。此外,由于HCI的存在,开发者还可以利用标准API简化开发难度,提高跨平台兼容性的可能性[^4]。 ```python # Python伪代码展示HCI基本操作 def send_data_to_controller(data_packet): hci.send_command(data_packet) def receive_data_from_controller(): response = hci.receive_event() return process_response(response) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值