Android Bluetooth架构

Android Bluetooth架构

Android系统蓝牙的整体架构

Applications:Android蓝牙应用程序,就是使用蓝牙的API的程序;
Framework:提供给应用使用的API,我们平时使用的BluetoothAdapter,BluetoothDevice,BluetoothSocket等;
Bluetooth Service:即Bluetooth APP(Bluetooth.apk)这个应该也是属于java framework范畴,不过由于它比较特殊,所以独立出来,提供所有的上层服务以及与Bluedroid底层进行交互。其中btAdapter主要提供蓝牙的基本操作,比如enable, disable, discovery, pair, unpair, createRfcomm等,其他的就都是Profile的各自的Service了;
Bluedroid:蓝牙协议栈,提供所有蓝牙的实际操作,开关蓝牙,蓝牙的管理,搜索管理,链路管理,各种profile的实现,包括HCI,ACL,SCO,L2CAP,各种profile等;

整个系统的架构很简单,因为大多的事情都是在Bluedroid层里面做的,上层只管去Call和Callback就是了,这部分我们在后面分析代码做详细分析。

Bluetooth Framework层介绍

Bluetooth framework层的作用只要是连接bluetooth service,为其它应用提供使用蓝牙的接口,起连接上下层的作用,没有太多的逻辑,下面只给出概要框图,不做过多描述。
在这里插入图片描述
From: https://blog.csdn.net/zjli321/article/details/52402968

BlueDroid架构介绍

在这里插入图片描述
From: https://blog.csdn.net/zjli321/article/details/52402968

BlueDroid主要分为3个部分:BTIF, BTA, Stack
BTIF:作为bluedroid与上层java framework的通道,提供bluedroid对外的接口,提供所有Bluetooth.apk需要的API
BTA:提供各种profile的实现和处理
Stack:协议实现与连接管理
BTE:提供具体芯片相关的fops
BTU:承接BTA与HCI
BTM:蓝牙配对与链路管理
HCI:读取或写入数据到蓝牙hw

下文未标注部分均来自: https://segmentfault.com/a/1190000002982295

Java Application/JNI

Bluetooth app运行于Java层,并通过JNI和协议栈的接口(stack’s Interface Layer,BTIF)进行如下交互:
JNI层的作用是将Java调用转化为C函数的调用,同时为应用和协议栈提供了调用/回调的交互能力。

BTIF (Bluetooth Profile Interface)

作为bluedroid与上层java framework的通道,提供了操作接口.
Bluetooth Profile Interface在Bluetooth Application task (BTA)和JNI层之间充当了胶水层的角色,对上层(JNI)提供了所有profile功能性的接口。这一层上有一个Bluetooth Interface Instance,所有Profile的操作函数都注册在其中(GAP, AV, DM, PAN, HF,HH, HL, Storage, Sockets)。Client应用通过操作这个Instance来操作Profile。

BTA

BTA用于和Bluetooth Application层交互,实现蓝牙设备管理、状态管理以及一些Profile的操作和状态机。
BTA是Bluetooth Application的缩写,从上层下来的请求都要经过这个BTA层,通过发送消息的方式将请求丢到BTA层中处理。
所有BTA消息送到BTU_TASK中,由bta_sys_event来处理;如果是Gatt相关的消息,由bta_gatt_hdl_event处理。

Profile状态机包含以下几个主要组成部分:
BTA_profilexx_act.c:包含对应Profile的“Action”函数,一般来说由Profile状态机调用。
BTA_profilexx_api.c: 对应Profile的API的具体实现。通常它们是提供给用户使用,完成usecase的函数和回调
BTA_profilexx_ci.c:对应Profile的“call-in”函数的实现(供Profile以外的模块调用)
BTA_profilexx_co.c: 对应Profile的“call-out”函数的实现(调用Profile以外的模块)
BTA_profilexx_main.c: 对应Profile的状态机和处理协议栈上传消息的handler的具体实现。主要负责维护Profile状态的变化及其引起的“Action”

BTE

BTE提供具体芯片相关的fops。通过HCI与厂商蓝牙芯片交互以实现了蓝牙协议栈的通用功能和相关协议。BTE还包括一个统一内核接口(GKI)。

HCI and HAL Layers

HCI层由libbt-hci共享库组成,负责通讯层(transport layer,如UART H4或者SMD channel)和协议栈之间的交互。HCI层抽象了BTE的ops,将BTE的ops抽象成bluedroid的接口。
HAL层libbt-vendor共享库组成,是各厂商的解决方案的特定实现。HAL层实现了各厂商对OPCODE的处理逻辑,这些OPCODE声明在HCI层的bt_vendor_lib.h中。

Core Stack

核心协议栈(Core Stack)会被编译成一个linux动态库,其中包含的模块如下图所示。每一个模块都由api函数和函数回调接口组成。
在这里插入图片描述

TASK管理

Bluedroid中,协议栈,蓝牙规范和蓝牙应用都运行在一个用户进程"com.android.bluetooth"之中。
蓝牙代码在以下四种task代表的上下文(context)中运行:

  • BTIF_TASK
  • BTU_TASK
  • A2DP_MEDIA_TASK
  • GKI_TIMER_TASK
    task之间通过消息(message)来交换信息。
    调用JNI层的API函数会通过消息转发机制,在BTIF_TASK中执行。
    JNI,HAL回调在BTIF_TASK中执行。
    有需要时,BTIF_TASK中的调用可切换到BTU_TASK中执行。
    蓝牙规范(Profiles)和协议的实现代码在BTU_TASK中执行。
    蓝牙传输驱动程序中有一条rx线程(bt_hc_worker_thread)负责从UART/SMD中读取数据。

GKI模块

内核统一接口。该层是一个适配层,适配了OS相关的进程、内存相关的管理,还可以用于线程间传递消息 。主要通过变量gki_cb实现对进程的统一管理。GKI模块在Bluedroid中主要用于线程间通信。

蓝牙总体流程图

从流程图我们可以看出来 蓝牙应用通过binder和系统蓝牙Service进行通讯 ,然后通过Jin与蓝牙HAL层进行通讯.
From: https://blog.csdn.net/ChaoLi_Chen/article/details/108285847
在这里插入图片描述

Bluetooth各模块总图

From: https://blog.csdn.net/javon_hzw/article/details/48731281
在这里插入图片描述

bluedroid的通用架构框图

From: https://blog.csdn.net/xiaojsj111/article/details/12647923
在这里插入图片描述

名词解释

HAL :HardwareAbstraction Layer
Btif :Bluetooth interface
Bta :Bluetooth application
Btu :Bluetooth uper layer
Bte :Bluetooth embedded layer
Btm :Bluetooth device manager
CO : callout\CI: call in
HF : Handsfree Profile
HH :HID Host Profile
HL :Health Device Profile
AV :audio\vidio
Ag :audiogateway
Ar :audio/videoregi stration
Gattc :GATT client
Gatts :GATT server
BLE :Bluetooth Low Energy

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值