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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值