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

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

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

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

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

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

3. 需要处理获得的数据

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

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

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

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

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

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

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

对于linux操作系统,它在btstack_run_loop_posix.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函数。

第06节-开源蓝牙协议BTStack框架分析的更多相关文章

  1. 第07节-开源蓝牙协议BTStack框架代码阅读(下)

    上篇博客中已经对BTStack框架进行了较为详细的说明,本篇博客将进一步总结一下(由韦大仙笔记所得). 可以从5个方面来理解BTStack的框架: 1.硬件操作:hci_transport_t BTS ...

  2. 第07节-开源蓝牙协议BTStack框架代码阅读(上)

    首先来看一下,对于硬件操作,它是如何来进行处理的.在上篇文章中曾说过,在main函数里面它会调用硬件相关的代码,调用操作系统相关的代码.在BTStack中,可以搜索一下main.c,将会发现有很多ma ...

  3. 第08节-开源蓝牙协议栈BTStack数据处理

    本篇博客根据韦东山的视频整理所得. 在上篇博客,通过阅读BTStack的源码,大体了解了其框架,对于任何一个BTStack的应用程序都有一个main函数,这个main函数是统一的.这个main函数做了 ...

  4. 蓝牙协议分析(5)_BLE广播通信相关的技术分析

    1. 前言 大家都知道,相比传统蓝牙,蓝牙低功耗(BLE)最大的突破就是加大了对广播通信(Advertising)的支持和利用.关于广播通信,通过“玩转BLE(1)_Eddystone beacon” ...

  5. 介绍开源的.net通信框架NetworkComms框架之二 传递类

    原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架  作者是英国人  以前是收费的 目前作者已经开源  开源地 ...

  6. 【转】Dubbo是Alibaba开源的分布式服务框架

    Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合).从服务模型的角度来看,Dubbo采用的是一种非常简单的模 ...

  7. 蓝牙(BLE)应用框架接口设计和应用开发——以TI CC2541为例

    本文从功能需求的角度分析一般蓝牙BLE单芯片的应用框架(SDK Framework)的接口设计过程,并以TI CC2541为例说明BLE的应用开发方法. 一.应用框架(Framework) 我们熟知的 ...

  8. Dubbo阿里Alibaba开源的分布式服务框架

    [获奖公布]"我的2016"主题征文活动    程序猿全指南,让[移动开发]更简单!      [观点]移动原生App开发和HTML 5开发,你更看好哪个?   博客的神秘功能 D ...

  9. 蓝牙协议 基于TI cc2540 模块的理解(转)

    源:蓝牙协议 基于TI cc2540 模块的理解 Bluetooth 4.0开发 Platform:TI IC:cc2540 Environment:windows 7 tools:IAR 8.20. ...

随机推荐

  1. 热情组——项目冲刺 Day2

    项目相关 作业相关 具体描述 班级 班级链接 作业要求 链接地址 团队名称 热情组 作业目标 实现软件的生成,以及在福大的传播 Github链接 链接地址 SCRUM部分: 成员昵称 昨日目标 开始时 ...

  2. Django中render_to_response和render的区别(转载)

    转载地址:https://www.douban.com/note/278152737/ 自django1.3开始:render()方法是render_to_response的一个崭新的快捷方式,前者会 ...

  3. mtd-utils编译安装过程

    git clone git://git.infradead.org/mtd-utils.git cd mtd-utils apt install -y libssl-dev libzlb libzst ...

  4. [Powershell]发布基于.NET Framework的WebAPI和Job控制台程序项目

    获取要发布的定时计划任务. 禁用和停止定时计划任务. 批量强制结束Job进程. 打印定时计划任务状态. 备份项目文件夹. 发布项目文件夹. 删除部署包. 启用定时计划任务. <# .NOTES ...

  5. HTTP之网关的分类

    网关的分类 ========================摘自<HTTP权威指南>============================= 1.  HTTP/*:服务器端Web网关 请 ...

  6. SQL ------------- 最大与最小函数

    sql max()  函数  求最大值,可以查询汉字,字母,日期,数字 注意:字母和汉字按照 a-z 依次查找,第一个最大的就是需要的                    比如:有两个字母或汉字都是 ...

  7. CMake方式编译

    [1]CMake基础 CMake是一种跨平台编译工具 CMake主要是编写CMakeLists.txt文件 通过CMake命令将CMakeLists.txt文件转化为make所需的Makefile文件 ...

  8. Neo4j 第八篇:投射和过滤

    投射子句用于定义如何返回数据集,并可以对返回的表达式设置别名,而过滤子句用于对查询的结果集按照条件进行过滤 一,Return子句 使用return子句返回节点,关系和关系. 1,返回节点 MATCH ...

  9. EWS:邮箱的一个开放的接口服务

    https://3gstudent.github.io/3gstudent.github.io/Exchange-Web-Service(EWS)%E5%BC%80%E5%8F%91%E6%8C%87 ...

  10. 写一个TimeUI显示的函数,上代码

    public void FreshDateTime() { string strWeek = string.Empty; #region 格式化星期 switch (DateTime.Now.DayO ...