安卓系统蓝牙协议栈 bluedroid 使能流程分析

本文承接上篇文章《安卓中蓝牙系统服务层的使能流程分析》,接续分析协议栈层相关的使能流程,所以蓝牙协议栈bluedroid的使能始于JNI层enableNative()中调用协议栈接口enable()函数。

话不多说,还是按照老规矩我们先从整体上对协议栈的使能有个印象,参考如下时序图。

安卓原生的蓝牙协议栈bluedroid在分层上被分为btif、bta、stack、hci这四层,每层的作用各不相同,但实际程序运行是在不同的线程运行的,为了方便大家对使能流程有更为深刻的了解,所以上述的使能时序图是以线程为依据。接下来就按照上述时序分别作出说明。

蓝牙服务层JNI使能协议栈bluedroid,通过interface函数接口下发指令到达协议栈入口。

stack_manager_get_interface()->start_up_stack_async();将使能指令下发到协议栈管理模块,模块内部通过线程stack_manage继续处理。

依次使能btif_config、btsnoop、hci等模块

1、 btsnoop模块:

判断snoop开关是否打开,从而决定是否创建snoop文件来记录hci的交互信息。

snoop开关位置在开发者选项中,打开该关开,则persist.bluetooth.btsnoopenable全局变量会被置为true;反之开关关闭,该变量会被置为false。

snoop文件默认存储位置:/data/misc/bluetooth/logs/

由于打开snoop开关的步骤比较复杂,一般用户根本不会进到开发者选项中,连从哪儿打开开发者选项都是一个难题,所以蓝牙开发过程中可以修改源码或重置persist.bluetooth.btsnoopenable的值来达到创建snoop文件记录hci的交互信息的目的。现提供如下两种方法

方法A:

修改源码中获取 persist.bluetooth.btsnoopenable 值时设置的错误值

该全局变量是第一次在开发者选项中打开snoop开关时创建的,所以从来没操作过snoop开关,则该全局变量就没有定义。如果操作过开发者选项中的snoop开关,则获取上述全局变量就可以获取到对应的值,从而错误值不再起作用。

方法B:

通过指令:adb shell setprop persist.bluetooth.btsnoopenable true,开启蓝牙hci-snoop的开关。

persist.bluetooth.btsnoopenable 全局变量的存储路径因安卓版本而有些许差异:

Android 8的存储路径:/data/property/persist.bluetooth.btsnoopenable/

Android 9的存储路径:/data/property/persistent_properties/

2、 HCI模块:

创建hci_thread线程,专门处理hci相关的流程,并同时初始化蓝牙芯片。

通过HIDL技术获取芯片Controller模块对外提供的接口:

1. btHci = IBluetoothHci::getService();

2. android::sp callbacks = new BluetoothHciCallbacks();

3. btHci->initialize(callbacks);

HIDL:全称是HAL interface definition language(硬件抽象层接口定义语言),在此之前Android 有AIDL,架构在Android binder 之上,用来定义Android 基于Binder通信的Client 与Service之间的接口。HIDL也是类似的作用,只不过定义的是Android Framework与Android HAL实现之间的接口。

Android HAL的实现方式由于芯片厂商的不同而有差异,实现内容都是类似于安卓源码中hardware\interfaces\bluetooth\1.0\中的实现方式。厂商再在HAL的实现中与自家芯片进行交互。这样通过统一的HAL接口就可以实现软硬件分离,安卓系统就可以集成不同厂家的蓝牙芯片。

芯片模块初始化完成后会通过回调告知android层,这样蓝牙协议栈才会继续后面的使能流程。

随着HCI模块使能完成就进入BTU_StartUp( )函数中开始初始化BTU控制模块,包括BTU、BTM、L2CAP、SDP等协议栈关键模块

使能controller模块,实际上就是通过一组HCI命令从芯片层获取支持的功能参数

typedef struct {

BT_HDR* (*make_reset)(void);

BT_HDR* (*make_read_buffer_size)(void);

BT_HDR* (*make_host_buffer_size)(uint16_t acl_size, uint8_t sco_size, uint16_t acl_count, uint16_t sco_count);

BT_HDR* (*make_read_local_version_info)(void);

BT_HDR* (*make_read_bd_addr)(void);

BT_HDR* (*make_read_local_supported_commands)(void);

BT_HDR* (*make_read_local_extended_features)(uint8_t page_number);

BT_HDR* (*make_write_simple_pairing_mode)(uint8_t mode);

BT_HDR* (*make_write_secure_connections_host_support)(uint8_t mode);

BT_HDR* (*make_set_event_mask)(const bt_event_mask_t* event_mask);

BT_HDR* (*make_ble_write_host_support)(uint8_t supported_host, uint8_t simultaneous_host);

BT_HDR* (*make_ble_read_white_list_size)(void);

BT_HDR* (*make_ble_read_buffer_size)(void);

BT_HDR* (*make_ble_read_supported_states)(void);

BT_HDR* (*make_ble_read_local_supported_features)(void);

BT_HDR* (*make_ble_read_resolving_list_size)(void);

BT_HDR* (*make_ble_read_suggested_default_data_length)(void);

BT_HDR* (*make_ble_read_maximum_data_length)(void);

BT_HDR* (*make_ble_read_maximum_advertising_data_length)(void);

BT_HDR* (*make_ble_read_number_of_supported_advertising_sets)(void);

BT_HDR* (*make_ble_set_event_mask)(const bt_event_mask_t* event_mask);

BT_HDR* (*make_read_local_supported_codecs)(void);

}

HCI层的交互如下图:

Reset完成后协议栈会主动下发HCI命令读取本端的蓝牙名字,并将新的名字下发给芯片,同时通过JNI层的回调将本端的蓝牙名字和地址上报给服务层。如果存在配对的蓝牙设备,也会将该设备信息上报。

紧接着会初始化协议栈的socket模块,这部分主要是为建立OBEX连接和数据交互做准备的。

协议栈所有使能工作完成,通过HAL bt_hal_cbacks->adapter_state_changed_cb回调将蓝牙使能成功的消息上报到JNI层。至此蓝牙协议栈bluedroid的使能流程的全部过程就分析完毕。

本篇协议栈使能的分析就到这儿了,感兴趣的小伙伴欢迎私信留言一起讨论。

android蓝牙协议栈bluedroid分析,安卓系统蓝牙协议栈 bluedroid 的使能相关推荐

  1. 蓝牙配对码配置错误_安卓系统蓝牙配对流程分析

    安卓系统蓝牙配对流程分析 配对流程基本上始于首次连接一个蓝牙设备的过程中,本端的搜索流程结束获取到该设备的BluetoothDevice信息,就可以开启配对流程. 配对,顾名思义就是将两个设备通过相关 ...

  2. 安卓application_安卓系统蓝牙配对流程分析

    安卓系统蓝牙配对流程分析 配对流程基本上始于首次连接一个蓝牙设备的过程中,本端的搜索流程结束获取到该设备的BluetoothDevice信息,就可以开启配对流程. 配对,顾名思义就是将两个设备通过相关 ...

  3. 安卓系统蓝牙服务com.android.bluetooth的使能

    蓝牙系统服务层的使能流程分析 蓝牙服务层的使能基础是其初始化完成,也就是AdapterService通过onBind()将AdapterServiceBinder上报给bind该服务的调用者.我们现在 ...

  4. android智能小车 论文,基于安卓手机蓝牙控制的智能小车设计毕业设计(论文).doc...

    编 号: 审定成绩: 毕业设计(论文) 设计(论文)题目: 学院:学 生 姓 名 :专 业 :班 级 :学 号 :指 导 教 师 :答辩组 负责人 : 填表时间:年月 摘 要 随着物联网的兴起,And ...

  5. android智能音响,大屏+安卓系统 智能音响的究极形态?

    有人说,音乐是上天赐予人类的奇妙礼物.对于我而言,音乐几乎和空气一样重要--无音乐不成活!当你对一种事物痴迷时,自然就会变身"处女座",处处较真.作为一名音乐发烧友,这么多年烧在音 ...

  6. android代码获取deviceid,获取安卓系统的设备id用getDeviceId()函数

    来源:网络 | 2012-12-18 | (有12829人读过) 贴段具体例子代码,用来说明,安卓系统下,如何获取设备id的一段小例子供大家参考: 在计算机上,我们习惯用MAC地址来标志一台计算机.在 ...

  7. android 4.4官方下载,安卓系统电脑版-android x86 4.4 iso下载官方最新版【pc版】-西西软件下载...

    Android-X86是由Beyounn和Cwhuang主持设计的.提供了一套完整的可行源代码树,配套文档以及Live CD与Live USB.Android系统主要应用在智能手机以及平板电脑设备上. ...

  8. 麒麟 android os,国内不再需要安卓系统? 麒麟OS摆脱依赖

    原标题:国内不再需要安卓系统? 麒麟OS摆脱依赖 小米MIUI.华为EMUI,魅族Flyme OS等这些系统都是国内手机声明为自己的系统,然而,这些所谓的"系统"只是基于Andro ...

  9. android智能电视使用方法,安卓系统智能电视使用方法

    安卓系统智能电视使用方法 导语:现在电视机的种类有很多,智能电视时现在最普遍的一种,使用智能电视观看影视我们能够享受到更大的节目源.使用安卓系统智能电视,我们能够在电视上下载我们需要的软件,非常的简单 ...

  10. android 开机向导屏蔽home,安卓系统定制:关闭第一次启动的向导

    安卓系统:4.4 测试硬件:友善之臂m1 plus 定制需求:第一次运行不需要运行开机提示(Cling,向导) 修改文件packages/apps/Launcher2/src/com/android/ ...

最新文章

  1. MySQL 用 limit 为什么会影响性能?
  2. 渗透脚本快速生成工具Intersect
  3. Linux常用命令集锦
  4. Android笔记(七十) AlertDialog
  5. debian安vs_debian下使用vs code
  6. 乐山电子计算机职业学院,学校介绍
  7. centos7打开图形界面命令_centos7标准版(DVD)命令界面和图形界面相互切换
  8. 方舟手游服务器受人无限物资,方舟生存进化BUG无限刷物资方法 | 手游网游页游攻略大全...
  9. 六一儿童节,老师带了很多好吃的巧克力到幼儿园。每块巧克力j的重量为w[j],对于每个小朋友i,当他分到的巧克力大小达到h[i] (即w[j]=h[i]),他才会上去表演节目
  10. Thread类中的常用方法
  11. 什么是表压?什么是绝压?表压和绝压什么关系?
  12. 罗辑回归,Logistic Regression(or sigmoid function)
  13. Java通过JNI调用C的一个小demo
  14. 【Milvus的以图搜图】
  15. 去北美读PHD前给你泼的“冷水”,有志于去北美深造的人读一读
  16. 分享:一套开源的办公套件,适用于企业、团队的协同办公平台DzzOffice
  17. 云之讯融合通讯开放平台_提供融合语音,短信,VoIP,视频和IM等通讯API及SDK。...
  18. 大疆激光雷达livox avia 在ubuntu18.04+ROS中基本使用方法
  19. 在eclips中配置maven
  20. solidworks渲染材质库_solidworks渲染材质参数

热门文章

  1. java中socket编程实例_Java Socket编程实例
  2. vijos 1066 树状数组
  3. 千里达v1000时速_《美骑评测》第10期 千里达V1000山地车 评测
  4. python识别cad图纸_手把手教你广联达软件如何识别天正CAD图纸
  5. TraceView 的使用
  6. jquery表单美化组件实例
  7. 数字基带调制解调matlab仿真,我的基于MATLAB仿真的数字调制与解调设计
  8. 【速达软件】【速达5000】5系3.97批量删除采购开单从表重复项并合计到主表
  9. java程序员的项目经历如何写,大量教程
  10. 入门系列之在Ubuntu上使用Netdata设置实时性能监控