蓝牙系列四:开源蓝牙协议BTStack框架分析

本文介绍了通过实践和源代码学习蓝牙协议栈的方法,强调了硬件操作、循环机制以及数据处理的重要性,包括发送和接收数据、各层次的处理函数以及在不同OS和接口下的代码组织。

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

在学习蓝牙的时候,最好还是要借助源代码来学习,并且进行实际的操作从而更加理解蓝牙协议栈的运行。依然根据韦东山老师的学习视频进行学习,整理记录如下。

首先,协议栈是跑在硬件上的,我们这里选择使用windows来操控硬件。来看一下硬件的结构:

蓝牙模块接在电脑上,或是接在开发板上。不论接在哪,我们都需要编写程序来控制这个蓝牙模块。

1. 我们需要发送数据给蓝牙模块

   需要发送命令给蓝牙模块,比如让它发出无线信号去扫描、识别、连接、读写附近的蓝牙设备

2. 需要从蓝牙模块获得数据

3. 需要处理获得的数据

上述3步骤可以简化为一个循环:

1).读取数据:可以读取用户输入的指示,也可以读取蓝牙模块的数据

2).处理数据:根据用户的指示发送数据给蓝牙模块,或处理从蓝牙模块读到的数据

要点是:硬件操作、循环、处理,如下图所示:

这个循环就是程序的核心,BTStack最重要的东西就在那个循环里面。

BTStack支持多种操作系统,比如说它支持widows,linux。它支持多种接口的蓝牙模块,比如说usb口、比如说串口。

无论怎样,在程序中应该有一个循环,在windows系统中,它利用的是btstack_run_loop_windows.c来实现了一个循环,在循环内部它去等待读取硬件数据,得到数据后再进行处理。

BTStack支持多OS,多接口硬件
1)操作硬件
2)循环
  a. 接收(涉及硬件操作。因为它支持多接口的硬件,显然在循环之前必须要打开硬件)
  b. 处理
在循环建立之前,有个main.c,main.c中有个main函数。这个main函数处于不同的文件里面(不同的硬件接口以及操作系统,main.c所处的文件都是不同的。可以从上面的几幅图可以看出来)。不同文件中的main.c中的main函数回去操作不同的硬件。然后再去创建一个循环。
操作硬件以及创建循环所涉及的源文件如下:

在循环中最重要的一步就是处理,处理才是关键,那么如何处理呢?

要发送数据时,通过HCI这一层把数据发送给蓝牙模块,接收数据时也是通过HCI这一层从蓝牙模块里面获取数据。接收到数据之后要进行处理,在HCI这一层可以进行处理。在L2CAP层可以处理自己感兴趣的数据。同样,上面的各个层都可以处理自己感兴趣的数据,因此都可以提供处理数据的函数。最上面的APP也可以提供处理函数。

在循环里面,从蓝牙模块里面获取数据,然后依次调用各个层次提供的处理函数,在这些处理函数里面它会分辨那些数据,如果对数据感兴趣就去处理,不感兴趣就不管。

总结:

最重要的就是对数据的处理,这分为2部分:

1. 蓝牙协议栈各层处数据的处理

 比如说向蓝牙模块发送什么命令,它返回什么数据,这是由蓝牙协议规定的。

2. APP对数据的处理

蓝牙协议栈各层、APP,提供自己的处理函数,在循环体里获得数据后,将依次调用这些处理函数。各个处理函数自行解析数据,如果感兴趣就处理,不感兴趣就直接返回。

在不同的操作系统、不同接口的蓝牙模块见上面的图,所涉及的源文件:

① 操作系统相关的代码

② 不同接口相关的代码

③ 蓝牙协议栈相关的代码

④ APP相关的代码

对于不同的操作系统、不同的硬件接口,main函数来自不同的文件:

1.main函数会调用操作系统相关的代码(下图中的①)、硬件接口相关的代码(下图中的②),进行初始化。

2.然后调用btstack_main函数:不同的APP提供自己的btstack_main函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值