04 开源蓝牙协议BTStack框架分析

本篇博客根据韦东山的视频,整理所得。

本篇博客讲解BTStack的框架,首先来看一下硬件的结构:

04 开源蓝牙协议BTStack框架分析_第1张图片

 

 04 开源蓝牙协议BTStack框架分析_第2张图片

 

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

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

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

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

3. 需要处理获得的数据

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

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

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

要点是:硬件操作、循环、处理

04 开源蓝牙协议BTStack框架分析_第3张图片

 

 

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

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

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

04 开源蓝牙协议BTStack框架分析_第4张图片

04 开源蓝牙协议BTStack框架分析_第5张图片

 

 04 开源蓝牙协议BTStack框架分析_第6张图片

 

 

对于linux操作系统,它在btstack_run_loop_posix.c中是实现了一个循环,在循环内部它去等待读取硬件数据,得到数据后再进行处理。

04 开源蓝牙协议BTStack框架分析_第7张图片

 

 

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

04 开源蓝牙协议BTStack框架分析_第8张图片

 

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

04 开源蓝牙协议BTStack框架分析_第9张图片

 

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

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

总结:

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

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

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

2. APP对数据的处理

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

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

① 操作系统相关的代码

② 不同接口相关的代码

③ 蓝牙协议栈相关的代码

④ APP相关的代码

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

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

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

04 开源蓝牙协议BTStack框架分析_第10张图片

你可能感兴趣的:(蓝牙,TWS)