A2DP连接在安卓系统中的实现

在上篇《蓝牙音乐之A2DP》中简要介绍完了A2DP音频流建立过程的协议分析,该过程主要通过协商双方的编码方式信息并设置一个最优的编码方式,最后通过AVDTP_OPEN建立A2DP连接。此连接最重要的是建立 信令通道数据通道 这两条L2CAP链路。这篇主要和大家分享下安卓系统中如何实现A2DP的连接。

安卓源码版本:Android-9(P版本)

A2DP连接涉及到应用层、蓝牙服务层、蓝牙协议栈及蓝牙芯片等各个模块。由于蓝牙芯片因各厂家的实现方式不一致(主要是没有代码实现资源),暂不分析,接下来主要介绍下其他模块在蓝牙音乐之A2DP连接过程中的作用。

应用层:控制连接的发起或结束、连接状态的监听。

A2DP协议的两端SRC和SNK都可以发起A2DP的连接,所以根据自己蓝牙设备的角色正确选择安卓提供的接口函数。

  • SRC 端通过BluetoothA2dp. connect()发起整个A2DP连接,注册如下系统广播监听连接状态的改变:
  • SNK 端通过BluetoothA2dpSink. connect(),注册如下广播监听A2DP的连接状态:

蓝牙服务层:A2DP连接状态机的切换,状态机切换时向系统中发送A2DP协议连接状态改变的广播。

蓝牙协议栈层:协议规定的主要工作都在这一层完成,是整个A2DP连接的关键,也是本篇文章的分析重点。

老读者想必都发现了这么件事,每次分析蓝牙相关协议在安卓中的实现基本上都是以Client(Sink)端为分析点,其实和Server(Source)端没啥大的区别。本次A2DP连接还是以SNK端的角色为分析点展开,SRC端的分析大同小异。

简要的A2DP连接时序图如下:

从以上时序图明显可以看出A2DP连接的大部分工作都是在协议栈中完成的,连接的过程环环相扣,缺一不可。A2DP连接在协议栈具体怎么跑起来我这里就不做过多分析,感兴趣的同学可以按照上面的时序图分析,基本上也就明白其中的逻辑了。但还是有几个关键点需要提出来方便大家的学习。

A2DP的连接在协议栈的行为实际上是AVDTP协议的连接,所以发起连接前需要进行SDP服务,搜索发现对端是否支持A2DP协议以及AVDTP的版本号。

AVDTP的连接包括信令通道和数据通道的建立,而信令通道主要包含如下四个步骤:

  1. AVDTP_DISCOVER
  2. AVDTP_GET_CAPABILITIES(依次获取Discovery发现的每种编码方式的能力,但是AVDTP的1.3版本新增一个功能:一次性获取所有编码方式的能力 AVDTP_GET_ALL_CAPABILITIES ,更加方便)
  3. AVDTP_SET_CONFIGURATION
  4. AVDTP_OPEN

数据通道就是简单建立一条L2CAP链路,以后蓝牙音乐的音频数据就在上面传输。

协议栈在 AVDTP_GET_CAPABILITIES 获取完所有对端支持的编码方式的能力后,选取双方都支持且最优的编码方式作为本次A2DP连接的编码方式。并且通过函数 btif_a2dp_sink_update_decoder() 更新SNK端的音频解码器的配置,根据配置创建 AudioTrack ,SNK端接收到的蓝牙音乐音频数据通过该AudioTrack发送到安卓音频系统中播放。

最后A2DP连接成功上报蓝牙服务层A2DP的连接状态切换到Connected后,协议栈会判断本端的蓝牙设备是否为Sink端,如果是Sink端的话,协议栈主动发起AVRCP的连接,因此安卓系统中的蓝牙API中没有AVRCP的连接,这块的知识点等以后分享再做具体分析。

本篇A2DP协议的连接在安卓系统中的实现就分享到这里,感兴趣的小伙伴欢迎私信留言一起讨论。

更多互联互通技术,欢迎关注微信公众号:Connectivity

A2DP连接在安卓系统中的实现相关推荐

  1. A2DP音频流在安卓系统中的实现

    A2DP音频流在安卓系统中的实现 通过前一篇文章<蓝牙音乐之A2DP音频流>的分享,大家都清楚了A2DP音频流的开启.暂停.数据传输等一系列协议规定,今天就带大家一探安卓系统中这部分是如何 ...

  2. 蓝牙音乐之AVRCP在安卓系统中的实现

    蓝牙音乐之AVRCP在安卓系统中的实现 从<蓝牙音乐之AVRCP>协议分析中可知,音视频远端控制协议被分成两部分:CT + TG,因此安卓源码也相应的分为 avrcp + avrcpcon ...

  3. x21能刷小米系统吗_小米系统是安卓系统中最强的吗?大家都错了,它是MIUI的进化版...

    小米系统是安卓系统中最强的吗?大家都错了,它是MIUI的进化版 现在国产手机做得越来越好了,在硬件方面国产手机比同级别的外国品牌要厚道太多了,所以在中国,外国品牌是没有任何生存空间的.在性价比方面他们 ...

  4. android 系统 os,安卓系统中公认的5款手机系统,氢OS、EMUI、Flyme你用过几款?

    原标题:安卓系统中公认的5款手机系统,氢OS.EMUI.Flyme你用过几款? 对于智能手机系统,我们都知道是分为安卓系统和苹果的iOS系统,但是在安卓个这个大板块下,还有着很多手机厂商自研的手机系统 ...

  5. 安卓编译android.mk,详解安卓系统中的Android.mk文件

    概述    Android.mk文件用来向编译系统描述如何编译你的源代码.更确切地说,该文件其实就是一个小型的Makefile.由于该文件会被NDK的编译工具解析多次,因此应该尽量减少源码中声明变量, ...

  6. 在安卓系统中集成YAHFA框架

    本次尝试在Android-9.0.0_r10中集成Hook框架 - 创建hook服务进行hook配置的管理 创建接口文件 /frameworks/base/core/java/android/app/ ...

  7. 怎样在64位安卓系统中使用32位SO库 2

    之前跟的项目, 那些号称64位 CPU的主控, 跑的软件全是 32位的: 我仍然很清楚的记得, 当年 CEO 在给大家讲解财报,描述技术蓝图的时候, 宣称 64bit 软件的运行效率其实远不如预期, ...

  8. linux命令查看tcp连接,查看linux系统中的TCP连接

    查看Linux的TCP连接 netstat -na    查看哪些IP连接本机 netstat -na Active Internet connections (servers and establi ...

  9. android 获取蓝牙设备id_安卓蓝牙系统中如何获取蓝牙音乐的音频跟踪会话ID

    原标题:安卓蓝牙系统中如何获取蓝牙音乐的音频跟踪会话ID 蓝牙音乐AudioTrack Session ID的获取 当今这个音视频无处不在的时代,音频跟踪会话ID(AudioTrack Session ...

最新文章

  1. 使用堆内内存HeapByteBuffer的注意事项
  2. Account Hierarchy in SAP CRM and C4C
  3. 成都优步uber司机第四组奖励政策
  4. 指纹识别软件安装包下载
  5. PHP学习记录(数学函数库)
  6. 程序员不是神,心态决定一切
  7. mysql获取ddl的语句,获取数据库或SHEME的DDL语句
  8. 选择编程语言前需要知道的事
  9. 福气太薄,刚积攒了点又被自己扔了
  10. AppScan 的安装+激活以及+漏扫dvwa,生成安全报告
  11. word vba 控制光标常用代码
  12. 软考软件设计师本人成功备考经验分享
  13. 信息系统集成监理费收取标准_信息系统工程监理资费标准.doc
  14. ps入门第8天_ps通道_颜色通道Alpha通道 案例:通道抠图
  15. am335xSD卡启动--文件系统制作
  16. Unix 环境高级编程(一):开发环境
  17. Sqlite数据库对时间进行比较SQL语句
  18. oracle把修改成及联,oracle日常操作命令手册(用户管理)-从零到无
  19. 关于合格设计师的30条冷知识
  20. 史上最全图详解Jvm—诊断工具和JVM监控

热门文章

  1. Flvplayer.swf 代码引用方法:
  2. 网康科技副总裁梁斌:感言RSA2010印象
  3. android输入法01:SoftKeyboard源码解析01
  4. python实用批量处理图片小项目
  5. centeros8 图形化界面设置
  6. 如何快速判断一个文件是否为病毒,如何检测自己的电脑是不是中毒了或者存在病毒软件?
  7. 学习使用web of science查找文献
  8. 电脑桌面图标间距突然变大怎么恢复
  9. mysql drop table 慢_MYSQL缓慢的droptable操作_MySQL
  10. PostgreSQL 在WAL文件中查找drop table、update、delete操作