蓝牙音视频远程控制协议(AVRCP) command跟response介绍
零.声明
本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下:

第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些概念,产生背景,发展轨迹,市面蓝牙介绍,以及蓝牙开发板介绍。
第二篇:Transport层介绍,主要介绍蓝牙协议栈跟蓝牙芯片之前的硬件传输协议,比如基于UART的H4,H5,BCSP,基于USB的H2等
第三篇:传统蓝牙controller介绍,主要介绍传统蓝牙芯片的介绍,包括射频层(RF),基带层(baseband),链路管理层(LMP)等
第四篇:传统蓝牙host介绍,主要介绍传统蓝牙的协议栈,比如HCI,L2CAP,SDP,RFCOMM,HFP,SPP,HID,AVDTP,AVCTP,A2DP,AVRCP,OBEX,PBAP,MAP等等一系列的协议吧。
第五篇:低功耗蓝牙controller介绍,主要介绍低功耗蓝牙芯片,包括物理层(PHY),链路层(LL)
第六篇:低功耗蓝牙host介绍,低功耗蓝牙协议栈的介绍,包括HCI,L2CAP,ATT,GATT,SM等
第七篇:蓝牙芯片介绍,主要介绍一些蓝牙芯片的初始化流程,基于HCI vendor command的扩展
第八篇:附录,主要介绍以上常用名词的介绍以及一些特殊流程的介绍等。
另外,开发板如下所示,对于想学习蓝牙协议栈的最好人手一套。以便更好的学习蓝牙协议栈,相信我,学完这一套视频你将拥有修改任何协议栈的能力(比如Linux下的bluez,Android下的bluedroid)。
-------------------------------------------------------------------------------------------------------------------------
蓝牙视频教程(跟韦东山老师合作):
https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w4004-22329603896.20.5aeb41f98e267j&id=693788592796
蓝牙交流扣扣群:765961169
Github代码:GitHub - sj15712795029/bluetooth_stack: 这是一个开源的双模蓝牙协议栈(bluetooth.stack)(btstack),可以运行在STM32,Linux.,包含HCI,L2CAP,SDP,RFCOMM,HFP,SPP,A2DP,AVRCP,AVDTP,AVCTP,OBEX,PBAP等协议,后续会继续维护,以达到商用的目的
入手开发板:https://shop220811498.taobao.com/category-1542116976.htm?spm=a1z10.5-c-s.w4010-22329603913.7.39ca7dbe2EA0K3&search=y&catName=%C0%B6%D1%C0%BF%AA%B7%A2%B0%E5#bd
蓝牙学习目录:一篇文章足够你学习蓝牙技术,提供史上最全的蓝牙技术(传统蓝牙/低功耗蓝牙)文章总结,文档下载总结(2020/12/11更新)_Wireless_Link的博客-CSDN博客_蓝牙eir
--------------------------------------------------------------------------------------------------------------------------
一. AVRCP command跟response
AVRCP特定的command有以下几种:







这么多PDU,我们不会一一介绍,只介绍几个典型的,其他的自己举一反三。
1. Capabilities
这个下面一共有一个实现
![]()
这个是AVRCP controller发给target的,来获取对端设备的能力,包括公司名称以及支持的event.整个数据格式如下:

获取公司ID response的格式为:

获取支持event的response格式为:

其中Capability EventID有:

我们介绍到notify的时候会详细介绍以上几个
我们结合前面的讲的vendor dependent格式来举例看下整个封包格式:



实际应用中我们一般只会用到Get Capabiliby for event,来获取对端支持的event,方便注册notify,可以看到上图支持播放状态改变,歌曲改变,播放器设置改变。当然在一般的代码中也会先获取支持的company然后再获取支持的event列表!
2. Notifications


2.1 GetPlayStatus
这个命令是controller像target发送获取播放状态的命令,返回值包括歌曲总长度,歌曲当前进度,以及播放状态,一共占用9byte(4byte歌曲长度,4byte当前进度,1byte播放状态)

我们来看下一个btsnoop


2.2 RegisterNotification
这个就是CT像TG注册消息,然后TG有对应的更新会通知,具体消息就是我们之前get capability with event的消息(需要注意的是:每次注册只能一次生效,收到change后要重新注册)我们在来贴下

我们来看下command、response的举例

我们来看一个流程图

下面我们就EVENT ID一个个来说下
EVENT_PLAYBACK_STATUS_CHANGED:播放状态改变,有以下值

EVENT_TRACK_CHANGED:歌曲名称改变
EVENT_TRACK_REACHED_END:歌曲到结尾
EVENT_TRACK_REACHED_START:歌曲开始
EVENT_ PLAYBACK_POS_CHANGED:歌曲播放进度变化

占4byte数据,是ms级别
EVENT_BATT_STATUS_CHANGED:电量状态改变,有以下值

EVENT_SYSTEM_STATUS_CHANGED:系统状态改变,有以下值

VENT_ PLAYER_APPLICATION_SETTING_CHANGED:播放器设置改变

其中AttributeID跟value对应如下:



3. Metadata Attributes for Current Media Item
![]()
这个主要是获取歌曲信息的(包括名称/专辑名/歌手名/歌曲索引/歌曲总个数等等)

AttributeID列表如下:

根据个数填上ID来获取不同的属性子项
注意两点:
- 如果格式填0,那么获取所有的属性
- 部分手机+部分播放器,比如iphone11+QQ音乐,Title会动态更新歌词
4. Volume handling
绝对音量用1个byte来表示,最高位(bit7)保留使用,所以范围是0x0~0x7f,0x0代表0%,0x7f代表100%,所以一个可读达标0.784%,其实这里我觉得设计的有点奇怪,为啥不用一个可读是1%,这样还方便统计!当然也是个人看法啦!好了,我们来看看其中的技术细节吧!
4.1 SetAbsoluteVolume

这个是用来设置绝对音量的命令,通过Pass throught命令来发送,正常搭配A2DP sink角色的AVRCP应该做controller角色,也就是可以通知上一首/下一首/播放/暂停等功能,但是这里比较特殊,需要A2DP sink搭配的AVRCP角色是TG端,所以一般要支持这个feature,需要AVRCP要做双角色,也就是AVRCP CT/TG!另外这个命令是AVRCP CT发送给TG的,所以如果是手机连接耳机,那么是手机作为CT角色发送给耳机的TG角色,这点尤其要注意,如图所示:

4.2 Notify Volume Change
注册notification时间的消息由AVRCP的controller角色发起,AVRCP的TG角色有音量变化,会通知到CT角色,当然这里也是作为双角色来做,我们还是拿手机连接耳机这个例子来说明,也就是手机还是作为AVRCP的CT角色,耳机作为AVRCP的TG角色。如果所示:

相关文章:
蓝牙音视频远程控制协议(AVRCP) command跟response介绍
零.声明 本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下: 第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些概念,产生背景,发展轨迹,市面蓝牙介绍,以及蓝牙开发板介绍。 第二篇:Trans…...
MySQL的InnoDB存储引擎中的Buffer Pool机制
目录 Buffer Pool 简介 定义 为什么需要Buffer Pool 图解重点知识 Buffer Pool 的组成 数据页(Data Pages) 索引页(Index Pages) 插入缓冲页(Insert Buffer Pages) undo页(Undo Pages&a…...
5. MongoDB 文档插入、更新、删除、查询
1. 插入文档 文档的数据结构和JSON基本一样。所有存储在集合中的数据都是BSON格式。 BSON是一种类似JSON的二进制形式的存储格式,是Binary JSON的简称。常用的插入文档方法包括: db.collection.insertOne():插入单个文档db.collection.inse…...
⌈ 传知代码 ⌋ DETR[端到端目标检测]
💛前情提要💛 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间,对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…...
Oracle之触发器
简介 触发器在数据库里以独立的对象存储,他与存储过程不同的是,存储过程通过其他程序来启动运行或直接启动运行而触发器是由一个事件来启动运行,即触发器是当某个事件发生时自动式运行。并企,触发器不能接收参数。所以运行触发器…...
从零搭建微前端架构:解耦大型项目的终极方案
随着前端应用的复杂度不断提升,单体前端应用(Monolithic Frontend)的维护和扩展难度也日益增加。微前端(Micro-Frontend)作为一种新兴架构理念,旨在将大型前端项目拆分为多个独立、可独立部署的微应用,从而提升项目的可维护性和灵活性。这篇文章将带你从零开始搭建一个微…...
24/8/17算法笔记 MPC算法
MPC算法,在行动前推演一下 MPC(Model Predictive Control,模型预测控制)是一种先进的控制策略,它利用未来预测模型来优化当前的控制动作。MPC的核心思想是,在每一个控制步骤中,都基于当前系统状…...
GROUP_CONCAT 用法详解(Mysql)
GROUP_CONCAT GROUP_CONCAT 是 MySQL 中的一个聚合函数,用于将分组后的多行数据连接成一个单一的字符串。 通常用于将某个列的多个值合并到一个字符串中,以便更方便地显示或处理数据。 GROUP_CONCAT([DISTINCT] column_name[ORDER BY column_name [ASC…...
Golang httputil 包深度解析:HTTP请求与响应的操控艺术
标题:Golang httputil 包深度解析:HTTP请求与响应的操控艺术 引言 在Go语言的丰富标准库中,net/http/httputil包是一个强大的工具集,它提供了操作HTTP请求和响应的高级功能。从创建自定义的HTTP代理到调试HTTP流量,h…...
SQLALchemy 分页
SQLALchemy 分页 1. 使用SQLAlchemy的`slice`和`offset`/`limit`SQLAlchemy 1.4及更新版本SQLAlchemy 1.3及更早版本使用第三方库注意事项在Web开发中,分页是处理大量数据时一个非常重要的功能。SQLAlchemy是一个流行的Python SQL工具包和对象关系映射(ORM)库,它允许开发者…...
快速上手体验MyPerf4J监控springboot应用(docker版快速开始-本地版)
使用MyPerf4J监控springboot应用 快速启动influxdb时序数据库日志收集器telegrafgrafana可视化界面安装最终效果 项目地址 项目简介: 一个针对高并发、低延迟应用设计的高性能 Java 性能监控和统计工具。 价值 快速定位性能瓶颈快速定位故障原因 快速启动 监控本地应用 idea配…...
C语言 之 strlen、strcpy、strcat、strcmp字符串函数的使用和模拟实现
文章目录 strlen的使用和模拟实现函数的原型strlen模拟实现:方法1方法2方法3 strcpy的使用和模拟实现函数的原型strcpy的模拟实现: strcat的使用和模拟实现函数的原型strcat的模拟实现: strcmp的使用和模拟实现函数的原型strcmp的模拟实现 本…...
CAPL使用结构体的方式组装一条DoIP车辆识别请求报文(payload type 0x0002)
DoIP车辆识别请求(payload type 0x0002)报文的格式为: /******************************************************** +--------+--------+--------+--------+ |version | inVer | type | +--------+--------+--------+--------+ | length …...
数据接入教学
数据接入教学 1、开通外部网络策略2、检查本地防火墙策略3、测试网络连通性4、工具抓包命令5、本地测试发送与监听 1、开通外部网络策略 保证外部网络联通、保证内部防火墙开通策略(可以关闭进行测试) 2、检查本地防火墙策略 关闭进行测试 停止firewa…...
炒作将引发人工智能寒冬
我们似乎经常看到人工智能的进步被吹捧为机器真正变得智能的一大飞跃。我将在这里挑选其中的一个例子,并确切解释为什么这种态度会为人工智能的未来埋下隐患。 这很酷,这是一个非常困难且非常具体的问题,这个团队花了3 年时间才解决。他们一定…...
clamp靶机复现
靶机设置 设置靶机为NAT模式 靶机IP发现 nmap 192.168.112.0/24 靶机IP为192.168.112.143 目录扫描 dirsearch 192.168.112.143 访问浏览器 提示让我们扫描更多的目录 换个更大的字典,扫出来一个 /nt4stopc/ 目录 目录拼接 拼接 /nt4stopc/ 发现页面中有很多…...
mfc100u.dll丢失问题分析,详细讲解mfc100u.dll丢失解决方法
面对mfc100u.dll文件丢失带来的挑战时,许多用户都可能感到有些无助,尤其是当这一问题影响到他们日常使用的软件时。但实际上,存在几种有效方法可以帮助您快速恢复该关键的系统文件。为了方便不同水平的用户,本文将详细解析各种处理…...
【C++】什么是内存管理?
如果有不懂的地方,可以看我以往文章哦! 个人主页:CSDN_小八哥向前冲 所属专栏:C入门 目录 C/C内存分布 C内存管理方式 new/delete操作内置类型 new/delete操作自定义类型 operator new与operator delete函数 new和delete实现…...
产业经济大脑建设方案(五)
为了提升产业经济的智能化水平,我们提出建设一个综合产业经济大脑系统,该系统通过整合大数据分析、人工智能和云计算技术,构建全方位的数据采集、处理和决策支持平台。该平台能够实时监测产业链各环节的数据,运用智能算法进行深度…...
如何在 Odoo 16 中覆盖创建、写入和取消链接方法
Odoo 是一款强大的开源业务应用程序套件,可为各种业务运营提供广泛的功能。其主要功能之一是能够自定义和扩展其功能以满足特定的业务需求。在本博客中,我们将探讨如何覆盖Odoo 16中的创建、写入和取消链接方法,从而使您无需修改核心代码…...
TI SimpleLink平台实战:MSP432+CC3120构建统一嵌入式开发方案
1. 项目概述:为什么我们需要一个统一的嵌入式开发平台?如果你和我一样,在嵌入式行业摸爬滚打了几年,一定会对下面这个场景深有感触:老板今天说要做个带Wi-Fi的智能插座,你吭哧吭哧用ESP32调通了;…...
SAP顾问实战:给MB51报表加供应商名称和原因代码,完整隐式增强教程
SAP顾问实战:MB51报表增强之供应商与原因代码集成指南 在SAP项目实施过程中,业务用户对标准报表的抱怨几乎成为每个顾问的日常。"为什么不能在一个报表里看到所有信息?"——MB51物料凭证清单作为物料移动的核心查询工具,…...
FPGA远程更新不止QUICKBOOT:深入MultiBoot机制,从Golden镜像设计到安全回滚的全链路解析
FPGA远程更新的安全架构设计:从MultiBoot机制到容错恢复的全链路实践 在工业自动化、通信基带和航空航天等关键领域,FPGA的远程更新能力直接关系到系统的可靠性与维护成本。传统QuickBoot方案虽然能实现基础的程序加载,但在面对复杂现场环境时…...
从原理到实践:深入解析调频连续波雷达的核心技术与应用
1. 调频连续波雷达的基本原理 我第一次接触调频连续波(FMCW)雷达是在2015年做智能停车项目时。当时为了检测车位占用情况,试过超声波、红外等多种传感器,最后发现毫米波雷达才是最佳选择。FMCW雷达与传统脉冲雷达最大的区别在于它持续发射频率变化的电磁…...
3分钟掌握Pixelle-Video:零基础AI视频制作终极指南
3分钟掌握Pixelle-Video:零基础AI视频制作终极指南 【免费下载链接】Pixelle-Video 🚀 AI 全自动短视频引擎 | AI Fully Automated Short Video Engine 项目地址: https://gitcode.com/GitHub_Trending/pi/Pixelle-Video 还在为视频制作烦恼吗&am…...
【数字对调】信息学奥赛一本通C语言解法(题号2070)
自留or欢迎大佬纠错【题目描述】输入一个三位数,要求把这个数的百位数与个位数对调,输出对调后的数。【输入】三位数。【输出】如题述结果。【输入样例】123【输出样例】321#include<stdio.h> int main(){int a;scanf("%d",&a);int …...
避开CASA模型NPP估算的那些坑:我的IDL代码调试与参数优化心得
避开CASA模型NPP估算的那些坑:我的IDL代码调试与参数优化心得 第一次用CASA模型估算NPP时,我对着屏幕上的异常结果发呆了半小时——明明按照教程一步步操作,为什么输出的NPP值会出现大面积负值?后来才发现,温度胁迫因子…...
电脑安装双系统
电脑安装双系统 本次是在Windows 10的环境下安装Ubuntu的系统。 1、可能需要的准备工作 首先打开cmd输入msinfo32的命令查看电脑的BIOS的模式是不是UEFI,如下所示: 本次安装系统基于以上的BIOS模式下。此外如果遇到安装之后不能跳转到ubuntu系统的问题ÿ…...
从VBS到VBE:一次搞懂Windows脚本编码器的前世今生与实战避坑
从VBS到VBE:Windows脚本编码器的技术考古与安全实践 在Windows系统管理的工具箱里,VBScript(VBS)曾经是自动化任务的瑞士军刀。尽管如今PowerShell和现代编程语言已成为主流,但理解VBScript及其编码器(VBE&…...
G-Helper:华硕笔记本用户的终极轻量级硬件控制方案
G-Helper:华硕笔记本用户的终极轻量级硬件控制方案 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook, Exper…...
