Android蓝牙系统框架和代码结构

概述
    蓝牙协议栈被命名为:BlueDroid。它包含了两层:BTE(完成蓝牙核心功能)和BTA(与
    Android蓝牙服务层进行通信)。
    
    上层应用
        |
        |
        |
    系统框架(Application Framework)通过Binder IPC 机制调用蓝牙进行的各个服务(Service)封装的接口
        |
        |通过Binder IPC 通信
        |
    蓝牙服务层
        |
        |    JNI  
        |
    Bluedroid 蓝牙协议栈

    关于蓝牙framework代码放在此目录下
    frameworks/base/core/java/android/bluetooth/

和JNI相关的代码在
    package/apps/Bluetooth/jni目录下,上一节的connectA2dpNative方法就是这个
    目录的代码。JNI层代码调用到HAL代码并且从HAL接收到回调。
Bluetooth 的HAL层代码在:
    hardware/libhardware/include/hardware/bluetooth.h
BT stack
    协议栈在/system/bt下,实现了HAL层和扩展配置等。包括BTA和BTE两大组件,
    BTA实现了蓝牙设备管理、状态管理及一些应用规范。而BTE则通过HCI与厂商
    蓝牙芯片交互以实现了蓝牙协议栈的通用功能和相关协议。另外,BTE还包括一个
    统一内核接口(GKI),蓝牙芯片厂商可借助GKI快速轻松得移植蓝牙协议栈到
    其他操作系统或手机平台上。    
    
    一、Android蓝牙系统框架和代码结构    
    1、Application Framework
        这一层是核心应用使用api的框架,为应用提供各种api,包括各种组件来支持开发,
        这些封装好的函数,就叫做API(Application Programming Interface),即应用程序编程接口
        该层代码主要是利用android.bluetooth APIS和蓝牙进程
        (Bluetooth Process)进行交互,也就是通过Binder IPC机制调用了蓝
        牙进程的各个服务(Service)封装的接口。
        代码位于frameworks/base/core/java/android/bluetooth下。
    
    2、Bluetooth Process  (service)
        该层代码主要是在Bluetooth Process里实现各种Bluetooth
        Service和各种配置文件(Profile),Service通过JNI调用到硬件抽象
        (HAL)层。代码最后编译形成—个Android Application包
        (Bluetooth.apk)。代码位于packagelapps/Bluetooth下。
    
    3、Bluetooth JNI
        该层代码位于packages/apps/bluetooth/jni下,定义了蓝牙适配层
        和协议层对应的JNI服务,直接调用HAL层并给HAL层提供相应的回调。
        JNI是Java Native Interface的缩写,通过使用 Java本地接口书写程序,
        可以确保代码在不同的平台上方便移植。JNI(Java Native Interface,Java本地接口),
        用于打通Java层与Native(C/C++)层。这不是Android系统所独有的,而是Java所有。
        众所周知,Java语言是跨平台的语言,而这跨平台的背后都是依靠Java虚拟机,
        虚拟机采用C/C++编写,适配各个系统,通过JNI为上层Java提供各种服务,保证跨平台性。
        
    4、Bluetooth HAL
        该层代码定义了android.bluetooth APIs和Bluetooth Process调用
        的标准接口,通过调用这些接口使得硬件(Hardware)运行正常。
        代码位于hardware/libhardware/include/hardware下。
            bluetooth.h:包含蓝牙硬件操作、设备管理和设备操作抽象接口。
            bt_av.h:包含advanced audio profile的抽象接口。
            bt_hf.h:包含handsfree profile的抽象接口。
            bt_hh.h:包含hid host profile的抽象接口。
            bt_hl.h:包含health profile的抽象接口。
            bt_pan.h:包含pan profile的抽象接口。
            bt_sock.h:包含socket操作的抽象接口。
        在HAL层并没有实现定义的蓝牙协议与属性,默认实现在
        Bluedroid中,位于external Bluetooth/bluedroid下,用户可以根据自
        己的需求增加属性。
        
    5、Bluetooth Interface Layer (BTIF),即蓝牙接口层。它是Android
        bluetooth Service层和BTA层的Profile接口层,相当于桥接的作
        此外它还提供协议栈和内核(Kernel)之间的交互的桥接。
        1、system/bt/btif/src/bluetooth.c  //这个文件提供了Bluetooth Process 需要的接口,比如:
            获取适配器属性,获取远程设备属性,设置远程设备属性,获取远程设备记录,开始发现设备,
            取消扫描,获取连接状态等等。
        2、上面这些接口实现都在 system/bt/btif/src/btif_dm.c文件中(实现设备管理相关功能)。
        3、src/btif_av.c:Bluedroid上AV(Audio/video)的实现。
        4、src/btif_core.c:HAL层和BTE核心协议栈的核心接口函数。
    
    6、Bluedroid Stack
        该层代码实现了HAL层中的定义,可以通过扩展和改变配置来自
        定义。代码位于system/BT/下。Bluedroid分为以下4
        个主要部分。
            Bluetooth Embedded System (BTE)= BTA + Stack 它实现
        BT的核心功能,通过HCI与蓝牙芯片交互实现蓝牙协议栈的通用
        功能和相关协议。BTE还包括一个统—内核接口(GKI),蓝
        芯片厂商可通过GKl快速、轻松地移植蓝牙协议栈到其他操作
        统或手机平台上。
            bte_main.c:涉及BTE核心栈的初始化和卸载。
            Bte_init.c:BTE_lnitStack:初始化BTE控制块,如RFCOMM、DUN、SPP、HSP2和HFP等。
            核心stack必须在创建BTU task(任务)前调用。    

        
            Bluetooth Application Layer(BTA),即蓝牙应用层。它用于和
        android Bluetooth Service (Android蓝牙服务)层交互,实现蓝牙
        设备管理、状态管理以及一些应用规范。
    BTU : Bluetooth Upper Layer 蓝牙上层
    整个bluedroid可以分为两大模块:BTIF,BTE
    BTIF:提供bluedroid对外的接口
    BTE:bluedroid的内部处理,又细分为BTA,BTU,BTM和HCI
    BTA:bluedroid中各profile的逻辑实现和处理,实现应用层的一些接口,但都由Btif层进行管理和调用。
    BTU:承接BTA与HCI
    BTM:蓝牙配对与链路管理
    HCI:读取或写入数据到蓝牙hw
        main
        bte_main.cc:该功能涉及BTE核心栈的初始化和卸载。
        bte_main_in_hw_init:负责芯片硬件的初始化
        bte_main_boot_entry:调用 GKI_init,
        bte_init.cc

        BTE_InitStack:初始化 BTE 控制块,如 RFCOMM、DUN、SPP、HSP2 和 HFP 等。
            核心 stack 必须在创建 BTU task(任务)前调用。

        bta
        bta 用于和 Bluetooth process 层交互,实现蓝牙设备管理、状态管理以及一些 Profile 的 Bluedroid 实现。
        BTA 的主要组件如下所示。实现应用层的一些接口,但都由Btif层进行管理和调用

        AG 实现 BTA 音频网关(audio gateway)
        AR 负责 Audio/Video 注册
        AV 实现 BTA advanced audio/video
        DM 实现 BTA 设备管理
        GATT 实现通用属性配置文件(Generic Attribute Profile),此模块是 Bluetooth 4.0 新增加的核心协议。
        HL 实现 HDP (Health Device Profile)协议,此协议主要用于与健康设备的蓝牙连接,比如心率监护仪、血压测量仪、体温计等。
        PAN 实现 PAN (蓝牙个人局域网)协议,使得设备可以连接以下设备:个人局域网用户(PANU)设备、组式临时网络(GN)设备或网络访问点(NAP)设备。
        HH 实现 HID (Human Interface Device)协议,典型的应用包括蓝牙遥控器、蓝牙鼠标、蓝牙键盘、蓝牙游戏手柄等。
        PBAP 实现 PBAP (Phone Book Access Profile)协议,用于从电话薄交换服务器上获取电话薄内容。
        SYS 主要实现 BTA 系统管理。
        
        btif (与android的Bluetooth apk的jni层通信的接口,真正的为app提供interface的接口);
        Bluetooth Interface:提供所有 Bluetooth Process 需要的 API。
        src/bluetooth.cc HAL 层定义数组和函数体的实现。
        src/btif_av.cc Bluedroid 上 AV 的实现,主要结构和功能函数如下。
        src/btif_core.cc 该功能包含 HAL 层和 BTE 核心协议栈的核心接口函数。
        src/btif_dm.cc 该功能实现设备管理(Device Manage)相关的功能。
        src/btif_gatt.cc 实现 gatt 相关的接口。
        src/btif_hf.cc 该功能实现 handsfree 协议的接口。
        src/btif_hh.cc 该功能实现 HID Host 的蓝牙接口。
        src/btif_hl.cc 该功能实现健康设备(Health Device)的蓝牙接口。
        src/btif_media_task.cc btif 中的多媒体模块处理,AV(Audio Video)、HS(Headset)、HF(Handsfree)中的 audio 和 video 任务的处理。
        src/btif_pan.cc 该功能实现 PAN 的蓝牙接口。
        src/btif_rc.cc AVRCP 的实现,完成蓝牙耳机对音乐播放的控制。
        src/btif_rc.cc 关于 btif 中状态机的处理。
        src/btif_sock.cc Socket 相关接口。通过 btsock_listen 和 btsock_connect 来处理 SCO、L2CAP 和 RFCOMM 的监听与连接的建立。
        HCI
        HCI library 的实现,主要内容包括 HCI 接口的打开和收/发控制、Vendor 的 so 的打开和回调函数的注册、LPM(Low Power Mode) 的实现、btsnoop 的抓取等。

        src/bt_hci_bdroid.c 该功能主要处理 Bluedroid 中 Host/Controller 接口(HCI)的实现。
        src/vendor.c 该功能定义了 vendor 的调用函数,加载 libbt-vendor.so 库(由 vendor 提供的 libbt 文件夹里面的代码生成),初始化 vendor_interface,注册 vendor 需要的回调函数。
        src/hci_h4.c 该功能包含 HCI 传送/接收处理。
        src/hci_mct.c 该功能处理多链路的 HCI 发送和接收。
        src/lpm.c 低功耗模式(Low Power Mode,LPM)用于完成低功耗模式相关的处理。
        不同的 Android 版本 hci 实现可能不同,可以在 system/bt/hci/src/ 下查看相关文件。

        stack
        stack 主要用于完成各协议在 Bluedroid 中的实现,协议包含 a2dp、avctp、avdtp、avrcp、bnep、gap、gatt、hid、l2cap、pan、rfcomm、sdp、
            macp(Multi-Channel Adaptation Protocol,多通道适配协议)、smp(用于生成对等协议的加密密钥和身份密钥),还包含几个其他模块。

        btm 主要涉及 Bluetooth Manger。
        btu 该功能主要用于核心协议层之间的事件处理与转换。    

        7、    HCI层,位于蓝牙系统的L2CAP层和LMP层之间的一层封装,为上
        层协议提供了进入LM的统一接口和进入基带的统—方式,同
        也是蓝牙芯片向协议栈报告事件的通道。HCI层其实不包含在协
        议栈里,提供so库供协议栈加载和使用。
        host control interface,实现hci的协议,并连接stack层与底层通信的实现;
        
        udrv:代码作用是跟a2dp端进行socket通信,处理命令和a2dp数据pcm流,media task调用这里的接口,
            实际就是跟audio_a2dp_hw 的audio hal通信;
        
5、HCI接口层简介
        1、linux操作系统集成相应的芯片的驱动,将芯片驱动的细节进行封装,提供设备操作接口给协议栈使用。具体设备驱动接口的打开和关闭
            实现在蓝牙芯片对应的libbt-vendor中,由HCI层调用。 HCI层作为协议栈和芯片之间的桥梁,HCI层作为协议栈和芯片之间的桥梁,
            提供收/发线程工作队列,实现对命令和数据的收发操作。蓝牙芯片的Firmware的加载依赖于HCI层提供的接口,由此接口实现整个加载过程。
        
        2、Bt_hc_if() 函数
            是Bluedroid进行HCl初始化、通过HCI层控制蓝牙芯片上下电、加载Firmware、 低功耗模式控制、发送命令和数据给蓝牙芯片
            和日志使能的接口。它位于bt_ hci_ bdroid.c (编译在libbt-hci.a中) 中,
        3、hc_callbacks函数集合的注册
            bte_hci_enable()在协议栈初始化过程中得到调用,开始HCI层的
            初始化和Firmware的加载过程,并决定是否启用btsnoop记录HCI上行
            和下行的二进制数据
        4、命令和数据的发送接口位于bt_ target.h中, 解读如下。
            /BR/EDR ACI数据发送接口
            #define HCL ACL DATA TO_ _LOWER(P)\
            bte_ main_ hci_ send(BT HDR *)(P).BT_ EVT TO_ LM HCI ACL);
            //LE Acl数据发送接口
            #defineHCl BLE ACL_ DATA_ TO_ LOWER() bte_ main. hci_ send(BT_ HDR *)(P),\
            (UINT16)(BT_ EVT TO_ LM_ HCI ACLLOCAL BLE_ CONTROLLER I)
            //SCO数据发送接口
            #define HCI _SCO_ DATA _TO_ _LOWER(p)\
            bte_ main_ hci_ send(BT_ HDR *)(P),BT. EVT_ TO_ LM_ HCI SCO),
            11 HCI Cmd命令发送接口
            #define HCI _CMD _TO_ LOWER(p)\
            bte_ main_hci_ send(BT HDR *)(P),BT. EVT_ TO. _LM_ HCI CMD);
            /连路层管理命令发送接口
            #defneHCl LM DIAG TO_ LOWER(p)\
            bte_ main_ hci_ send((BT_ HDR *)XP), BT EVT _TO_ _LM_ DIAG);
            /容许Controller进入低功耗的接口
            #define HCL LP_ ALLOW_ BT DEVICE SLEEP0 bte_ main_pm. allow bt _device. slep0
            所有的发送接口都是调用了bt_hc_ _if的transmit _buf()函数,以

        5、命令处理结果和数据的接收接口
            HCI发现Kernel层有数据上报时,判断类型、长度、分段等信息。调用HCI层的线程工作队列,并执行hci_ h4_ receive_ msg()函数进行数
            据接收处理。hci_h4_receive_msg()函数将数据组包后调用data_ind()函数将数据通过消息发送给BTU TASK进行处理。
        6、在加载Firmware时,会调用preload()函数打开总线接口获取句柄
            然后创建接收线程。参考userial.c文件中的userial__open()函数
        7、此接收线程的意义在于快速读取驱动接口的数据,将数据处理、缓存并交给别的线程去处理,使得驱动接口的数据buffer不至于因接
            收线程要处理数据导致线程繁忙而来不及接收驱动接口的数据从而导致数据溢出。
        8、Bluedroid负责整体事务,是核心; HCI是传输层,是Bluedroid、libbt-vendor和Controller之间的桥梁,负责数据的发送和接收; 
            libbt-vendor主要用于加载Firmware,也包括一些其他的功能,如Reset、Audio状态控制、总线接口的控制、LPM的控制等。
            协议栈通过HCI发送和接收数据(包括命令执行结果)的过程和Firmware加载过程类似,只不过发送动作来源于协议栈,调用了
            HCI接口提供的transmit_ buf()函数。 HCI从Kernel总线驱动层接收到的数据经组包后再发往BTU TASK进行进一步处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值