Skip to content

Commit 98f0016

Browse files
committed
Bluetooth: Add document to illustrate the analye procedures of a2dp.
bug: v/53750 Signed-off-by: jialu <[email protected]>
1 parent 176775d commit 98f0016

6 files changed

+142
-2
lines changed

zh-cn/device_dev_guide/connection/bluetooth/how_to_analyze_bluetooth_issues.md

+142-2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,14 @@
2121
- [方法:观察A2DP SRC是否开始播放音乐](#方法观察a2dp-src是否开始播放音乐)
2222
- [方法:观察A2DP SRC是否停止音频流传输](#方法观察a2dp-src是否停止音频流传输)
2323
- [方法:观察AVDTP signaling连接是否断开](#方法观察avdtp-signaling连接是否断开)
24+
- [方法:观察air log中的音频包序列号是否连续](#方法观察air-log中的音频包序列号是否连续)
25+
- [方法:观察air log中1秒内发送的音频数据样本点数量](#方法观察air-log中1秒内发送的音频数据样本点数量)
26+
- [方法:观察air log中音频数据是否存在重传](#方法观察air-log中音频数据是否存在重传)
27+
- [典型问题](#典型问题-1)
28+
- [问题: 连接两对耳机时,出现断连和无声的问题](#问题-连接两对耳机时出现断连和无声的问题)
29+
- [问题: 连接耳机播放音乐,耳机无声](#问题-连接耳机播放音乐耳机无声)
30+
- [问题: 连接耳机播放音频文件,音频文件开头缺失](#问题-连接耳机播放音频文件音频文件开头缺失)
31+
- [问题: 语音播报,结尾处有pop音](#问题-语音播报结尾处有pop音)
2432
- [音乐播放控制问题](#音乐播放控制问题)
2533
- [分析方法](#分析方法-2)
2634
- [方法:观察是否建立了AVRCP连接](#方法观察是否建立了avrcp连接)
@@ -34,7 +42,7 @@
3442
- [方法:观察是否打开了AVRCP配置](#方法观察是否打开了avrcp配置)
3543
- [方法:观察音量变化是否由蓝牙引起](#方法观察音量变化是否由蓝牙引起)
3644
- [方法:观察音量变化由AVRCP或是HFP控制](#方法观察音量变化由avrcp或是hfp控制)
37-
- [典型问题](#典型问题-1)
45+
- [典型问题](#典型问题-2)
3846
- [问题: 不能控制播放、暂停](#问题-不能控制播放暂停)
3947
- [问题:意外的播放、暂停](#问题意外的播放暂停)
4048
- [问题: 不能受音乐源设备(手机)控制调节音量](#问题-不能受音乐源设备手机控制调节音量)
@@ -46,7 +54,7 @@
4654
- [方法:观察是否建立了SCO连接](#方法观察是否建立了sco连接)
4755
- [方法:观察是否向Media设置了SCO音频参数](#方法观察是否向media设置了sco音频参数)
4856
- [方法:观察AG端是否收到了HF端的Answer请求](#方法观察ag端是否收到了hf端的answer请求)
49-
- [典型问题](#典型问题-2)
57+
- [典型问题](#典型问题-3)
5058
- [问题:AG端接通电话,HF端通话无声](#问题ag端接通电话hf端通话无声)
5159
- [问题:HF端接通电话,HF端无声](#问题hf端接通电话hf端无声)
5260
- [数据传输问题](#数据传输问题)
@@ -279,6 +287,7 @@ AVDTP是蓝牙音频传输控制协议,协议中定义了Stream End Point Disc
279287
[a2dp_control]: a2dp_ctrl_cb, path:[a2dp_source_ctrl], event:TRANSPORT_OPEN_EVT
280288
[a2dp_control]: a2dp_data_cb, path:[a2dp_source_data], event:TRANSPORT_OPEN_EVT
281289
```
290+
282291
* A2DP SNK的transport成功打开
283292
```
284293
[a2dp_control]: a2dp_ctrl_cb, path:[a2dp_sink_ctrl], event:TRANSPORT_OPEN_EVT
@@ -354,6 +363,7 @@ log中显示使用本地的1号SEP和对方设备的1号SEP进行音频传输。
354363
[a2dp_stm]: ProcessEvent, State=Idle, Peer=[11:22:33:44:55:66], Event=CONNECTED_EVT
355364
[a2dp_stm]: Enter State=Opened, Peer=[11:22:33:44:55:66]
356365
```
366+
357367
* 本地设备主动连接对端设备
358368
```
359369
[a2dp_stm]: ProcessEvent, State=Opening, Peer=[11:22:33:44:55:66], Event=CONNECTED_EVT
@@ -410,7 +420,9 @@ log中显示使用本地的1号SEP和对方设备的1号SEP进行音频传输。
410420
#### 1 通过syslog观察A2DP SRC是否停止音频流传输
411421

412422
当Vela设备为A2DP SRC时,蓝牙服务有两个途径终止传输音频数据。
423+
413424
* 当收到Media发送的STOP命令时。
425+
414426
* 当连续2秒不能从Media获取音频数据时。
415427

416428
蓝牙服务收到Media发送的STOP命令时,典型log如下:
@@ -466,6 +478,134 @@ snoop log中AVDTP signaling连接断开的原因有两种:本地设备主动
466478

467479
<img src="img/how_to_analyze_bluetooth_issues/a2dp/snoop_avdtp_stream_release.png" alt="snoop:AVDTP media release" width="50%">
468480

481+
<a id="方法:观察air log中的音频包序列号是否连续"></a>
482+
483+
### 方法:观察air log中的音频包序列号是否连续
484+
485+
AVDTP Media Packet的包头中有一个字段,名字叫做Sequence Number。
486+
487+
每一次Stream Start过程开始后,Sequence Number都从0开始,每发送一个AVDTP Media Packet,Sequence Number加1。
488+
489+
典型log如下:
490+
491+
<img src="img/how_to_analyze_bluetooth_issues/a2dp/sniffer_avdtp_media_packet_sequence_number.png" alt="sniffer:AVDTP media packet sequence number" width="50%">
492+
493+
<a id="方法:观察air log中1秒内发送的音频数据样本点数量"></a>
494+
495+
### 方法:观察air log中1秒内发送的音频数据样本点数量
496+
497+
AVDTP Media Packet的包头中有一个字段,名字叫做Time Stamp,该字段是音频包的采样时刻。
498+
499+
在air log中,截取1秒内的音频包,开始和结束音频包之间的Time Stamp差是该时间段内传输的音频数据样本点数量。
500+
501+
通常,1秒内音频数据的样本点应当等于或近似等于采样率,典型log如下:
502+
503+
<img src="img/how_to_analyze_bluetooth_issues/a2dp/sniffer_avdtp_media_packet_number_normal.png" alt="sniffer:normal AVDTP media packet sequence number" width="50%">
504+
505+
上述log中,实际传输的样本点数量为:5949440 - 5904896 = 44546,与预期接近。
506+
507+
1秒内音频数据的样本点数量远大于采样率时,air log中会看到密集的包,典型log如下:
508+
509+
<img src="img/how_to_analyze_bluetooth_issues/a2dp/sniffer_avdtp_media_packet_number_abnormal.png" alt="sniffer:abnormal AVDTP media packet sequence number" width="50%">
510+
511+
上述log中,实际传输的样本点数量为:7395456 - 7270656 = 124800,远超预期。
512+
513+
<a id="方法:观察air log中音频数据是否存在重传"></a>
514+
515+
### 方法:观察air log中音频数据是否存在重传
516+
517+
air log中基带包有两个参数可以用来判断包是否存在重传,分别是SEQN和ARQC。正常情况下,SEQN的值在0和1之间交替变化,对端设备回复的ARQN是ACK。若出现重传,基带包中的SEQN值维持不变。
518+
519+
空口出现重传的原因有两种:
520+
521+
* 设备发送的包没收到对端的回复
522+
523+
* 设备发送的包收到了对端的回复,但回复的ARQN是NAK
524+
525+
设备发送的包没收到对端的回复,典型log如下:
526+
527+
<img src="img/how_to_analyze_bluetooth_issues/a2dp/sniffer_no_response.png" alt="sniffer:packet with no response" width="50%">
528+
529+
上述log中,设备发了3次2-DH5包,前两次的包没收到对端设备的回复,SEQN值维持不变,第三次的包收到了对端设备的回复,且回复的ARQN是ACK,SEQN发生了变化,重传结束。
530+
531+
设备发送的包收到了对端的回复,但回复的ARQN是NAK,典型log如下:
532+
533+
<img src="img/how_to_analyze_bluetooth_issues/a2dp/sniffer_NAK_response.png" alt="sniffer:packet with NAK response" width="50%">
534+
535+
上述log中,设备发了2次2-DH5包,第一次发送的包收到了对端设备的回复,但ARQN为NAK,SEQN值维持不变,第二次的包收到了对端设备的回复,且回复的ARQN是ACK,由于对端回复的包也是重传的包,SEQN维持不变,重传结束。
536+
537+
## 典型问题
538+
539+
### 问题: 连接两对耳机时,出现断连和无声的问题
540+
541+
Vela A2DP SRC当前不支持多设备连接,典型例子是:一个手表连接连接一对耳机。当手表需要连接另一对耳机时,需要先断开前一对耳机。针对多设备切换导致的无声问题,可以按以下顺序排查:
542+
543+
* [观察是否断开了第一耳机](#方法观察avdtp-signaling连接是否断开)
544+
545+
* 若应用未能发送第一耳机断开请求,建议在App侧观察未能发送的原因。
546+
547+
* 若应用发送了第一耳机断开请求,但未能断开,建议对比典型log,观察断开流程中是否出现异常。
548+
549+
* 若应用在连接第二耳机前,正确断开了第一耳机,建议[观察是否连接了第二耳机](#方法观察是否建立了avdtp-media连接)
550+
551+
* [观察是否连接了第二耳机](#方法观察是否建立了avdtp-media连接)
552+
553+
* 若应用未能发送第二耳机连接请求,建议在App侧观察未能发送的原因。
554+
555+
* 若应用发送了第二耳机连接请求,但未能建立AVDTP signaling连接,建议对比典型log,观察建立signaling连接中是否出现异常。
556+
557+
* 若两个设备之间的AVDTP signaling连接建立成功,但未能建立AVDTP media连接,建议对比典型log,观察建立media连接中是否出现异常。
558+
559+
* 若两个设备之间的AVDTP media连接建立成功,建议观察[观察Media是否成功设置了codec](#方法观察media是否成功设置了codec)
560+
561+
* [观察Media是否成功设置了codec](#方法观察media是否成功设置了codec)
562+
563+
* 若Vela Media未能成功设置codec,建议在Vela Media模块观察未能设置codec的原因。
564+
565+
* 若Vela Media成功设置codec,建议观察[观察是否开始播放音乐](#方法观察a2dp-src是否开始播放音乐)
566+
567+
* [观察是否开始播放音乐](#方法观察a2dp-src是否开始播放音乐)
568+
569+
* 若Vela Media未能发送音乐开始的命令,建议在Vela Media模块观察未能发送的原因。
570+
571+
* 若Vela Media发送了音乐开始的命令,但耳机端无声,建议对比典型log,观察播放音乐流程中是否出现异常。
572+
573+
### 问题: 连接耳机播放音乐,耳机无声
574+
575+
* [观察是否建立了AVDTP signaling连接](#方法观察是否建立了avdtp-signaling连接)
576+
577+
* 若AVDTP signaling连接未建立,建议对比典型log,观察建立signaling连接中是否出现异常。
578+
579+
* 若两个设备之间的AVDTP signaling连接建立成功,但未能建立AVDTP media连接,建议[观察是否建立了AVDTP media连接](#方法观察是否建立了avdtp-media连接)
580+
581+
* [观察是否建立了AVDTP media连接](#方法观察是否建立了avdtp-media连接)
582+
583+
* 若两个设备之间的AVDTP media连接未建立,建议对比典型log,观察建立media连接中是否出现异常。
584+
585+
* 若两个设备之间的AVDTP media连接建立成功,建议观察[观察Media是否成功设置了codec](#方法观察media是否成功设置了codec)
586+
587+
* [观察Media是否成功设置了codec](#方法观察media是否成功设置了codec)
588+
589+
* 若Vela Media未能成功设置codec,建议在Vela Media模块观察未能设置codec的原因。
590+
591+
* 若Vela Media成功设置codec,建议观察[观察是否开始播放音乐](#方法观察a2dp-src是否开始播放音乐)
592+
593+
* [观察是否开始播放音乐](#方法观察a2dp-src是否开始播放音乐)
594+
595+
* 若Vela Media未能发送音乐开始的命令,建议在Vela Media模块观察未能发送的原因。
596+
597+
* 若Vela Media发送了音乐开始的命令,但耳机端无声,建议对比典型log,观察播放音乐流程中是否出现异常。
598+
599+
### 问题: 连接耳机播放音频文件,音频文件开头缺失
600+
601+
* [观察sequence number是否连续](#方法观察air-log中的音频包序列号是否连续)
602+
603+
* 若air log中出问题的音频流中存在音频包序列号不连续,建议Vela蓝牙测观察音频流中音频包的序列号不连续的原因。
604+
605+
* 若音频包序列号连续,建议Vela Media测观察发送的音频包是否完整。
606+
607+
### 问题: 语音播报,结尾处有pop音
608+
469609
# 音乐播放控制问题
470610

471611
本章介绍Audio/Vedio Remote Control Profile(AVRCP)相关问题常用的分析、定位方法。

0 commit comments

Comments
 (0)