android蓝牙协议栈bluedroid分析,安卓系统蓝牙协议栈 bluedroid 的使能
安卓系统蓝牙协议栈 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 的使能相关推荐
- 蓝牙配对码配置错误_安卓系统蓝牙配对流程分析
安卓系统蓝牙配对流程分析 配对流程基本上始于首次连接一个蓝牙设备的过程中,本端的搜索流程结束获取到该设备的BluetoothDevice信息,就可以开启配对流程. 配对,顾名思义就是将两个设备通过相关 ...
- 安卓application_安卓系统蓝牙配对流程分析
安卓系统蓝牙配对流程分析 配对流程基本上始于首次连接一个蓝牙设备的过程中,本端的搜索流程结束获取到该设备的BluetoothDevice信息,就可以开启配对流程. 配对,顾名思义就是将两个设备通过相关 ...
- 安卓系统蓝牙服务com.android.bluetooth的使能
蓝牙系统服务层的使能流程分析 蓝牙服务层的使能基础是其初始化完成,也就是AdapterService通过onBind()将AdapterServiceBinder上报给bind该服务的调用者.我们现在 ...
- android智能小车 论文,基于安卓手机蓝牙控制的智能小车设计毕业设计(论文).doc...
编 号: 审定成绩: 毕业设计(论文) 设计(论文)题目: 学院:学 生 姓 名 :专 业 :班 级 :学 号 :指 导 教 师 :答辩组 负责人 : 填表时间:年月 摘 要 随着物联网的兴起,And ...
- android智能音响,大屏+安卓系统 智能音响的究极形态?
有人说,音乐是上天赐予人类的奇妙礼物.对于我而言,音乐几乎和空气一样重要--无音乐不成活!当你对一种事物痴迷时,自然就会变身"处女座",处处较真.作为一名音乐发烧友,这么多年烧在音 ...
- android代码获取deviceid,获取安卓系统的设备id用getDeviceId()函数
来源:网络 | 2012-12-18 | (有12829人读过) 贴段具体例子代码,用来说明,安卓系统下,如何获取设备id的一段小例子供大家参考: 在计算机上,我们习惯用MAC地址来标志一台计算机.在 ...
- android 4.4官方下载,安卓系统电脑版-android x86 4.4 iso下载官方最新版【pc版】-西西软件下载...
Android-X86是由Beyounn和Cwhuang主持设计的.提供了一套完整的可行源代码树,配套文档以及Live CD与Live USB.Android系统主要应用在智能手机以及平板电脑设备上. ...
- 麒麟 android os,国内不再需要安卓系统? 麒麟OS摆脱依赖
原标题:国内不再需要安卓系统? 麒麟OS摆脱依赖 小米MIUI.华为EMUI,魅族Flyme OS等这些系统都是国内手机声明为自己的系统,然而,这些所谓的"系统"只是基于Andro ...
- android智能电视使用方法,安卓系统智能电视使用方法
安卓系统智能电视使用方法 导语:现在电视机的种类有很多,智能电视时现在最普遍的一种,使用智能电视观看影视我们能够享受到更大的节目源.使用安卓系统智能电视,我们能够在电视上下载我们需要的软件,非常的简单 ...
- android 开机向导屏蔽home,安卓系统定制:关闭第一次启动的向导
安卓系统:4.4 测试硬件:友善之臂m1 plus 定制需求:第一次运行不需要运行开机提示(Cling,向导) 修改文件packages/apps/Launcher2/src/com/android/ ...
最新文章
- MySQL 用 limit 为什么会影响性能?
- 渗透脚本快速生成工具Intersect
- Linux常用命令集锦
- Android笔记(七十) AlertDialog
- debian安vs_debian下使用vs code
- 乐山电子计算机职业学院,学校介绍
- centos7打开图形界面命令_centos7标准版(DVD)命令界面和图形界面相互切换
- 方舟手游服务器受人无限物资,方舟生存进化BUG无限刷物资方法 | 手游网游页游攻略大全...
- 六一儿童节,老师带了很多好吃的巧克力到幼儿园。每块巧克力j的重量为w[j],对于每个小朋友i,当他分到的巧克力大小达到h[i] (即w[j]=h[i]),他才会上去表演节目
- Thread类中的常用方法
- 什么是表压?什么是绝压?表压和绝压什么关系?
- 罗辑回归,Logistic Regression(or sigmoid function)
- Java通过JNI调用C的一个小demo
- 【Milvus的以图搜图】
- 去北美读PHD前给你泼的“冷水”,有志于去北美深造的人读一读
- 分享:一套开源的办公套件,适用于企业、团队的协同办公平台DzzOffice
- 云之讯融合通讯开放平台_提供融合语音,短信,VoIP,视频和IM等通讯API及SDK。...
- 大疆激光雷达livox avia 在ubuntu18.04+ROS中基本使用方法
- 在eclips中配置maven
- solidworks渲染材质库_solidworks渲染材质参数
热门文章
- java中socket编程实例_Java Socket编程实例
- vijos 1066 树状数组
- 千里达v1000时速_《美骑评测》第10期 千里达V1000山地车 评测
- python识别cad图纸_手把手教你广联达软件如何识别天正CAD图纸
- TraceView 的使用
- jquery表单美化组件实例
- 数字基带调制解调matlab仿真,我的基于MATLAB仿真的数字调制与解调设计
- 【速达软件】【速达5000】5系3.97批量删除采购开单从表重复项并合计到主表
- java程序员的项目经历如何写,大量教程
- 入门系列之在Ubuntu上使用Netdata设置实时性能监控