零. 概述

本文章主要讲下电话免提协议HFP(Hands-Free Profile)接听来电/挂断来电(HFP Accept/Reject incoming call)以及在挂断电话(Terminate a call)。就是一下HFP feature中的NO.4和NO.5以及NO.6。

其中Accept an incoming voice call包括:

1)Answer Incoming Call from the HF – In-Band Ringing(从HF端接听In-Band Ringing电话的流程)

2)Answer Incoming Call from the HF – No In-Band Ringing(从HF端接听No In-Band Ringing电话的流程)

3)Answer Incoming Call from the AG(从AG端接听电话的流程)

4)Change the In-Band Ring Tone Setting(改变In-Band Ring铃声设定)

其中Reject an incoming voice call包括:

1)Reject an Incoming Call from the HF(从HF端拒接来电)

2)Rejection/Interruption of an Incoming Call in the AG(从AG端拒接来电)

其中Terminate a call包括:

1)Terminate a Call Process from the HF

2)Terminate a Call Process from the AG

android 蓝牙电话挂断流程_蓝牙拒接来电

一. 声明

本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下:

android 蓝牙电话挂断流程_蓝牙拒接来电_02

第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些概念,产生背景,发展轨迹,市面蓝牙介绍,以及蓝牙开发板介绍。

第二篇: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)。

android 蓝牙电话挂断流程_蓝牙电话接听来电_03

-------------------------------------------------------------------------------------------------------------------------

蓝牙学习目录

--------------------------------------------------------------------------------------------------------------------------

二. Accept an incoming voice call(接听来电

android 蓝牙电话挂断流程_android 蓝牙电话挂断流程_04

Upon an incoming call, the AG shall send a sequence of unsolicited RING alerts to the HF. The RING alert shall be repeated for as long as the call acceptance is pending, or until the incoming call is interrupted for any reason.The HF shall produce a local alerting in reaction to the RING. If the AG's SDP record (or +BRSF message) indicates "In-band ring tone" is supported, the AG shall send in-band ring tones unless subsequently changed using procedures defined in Section 4.13.4. The AG may abort the incoming call when necessary. It shall then stop sending the RING alert to the HF

此部分会牵扯到一个in band ring的概念,支持in band ring的AG在incoming call的时候,会先建立audio connection(SCO),然后在RING AT command之后传过来声音,也就是手机铃声,直到被接听或者挂断,或者其他原因中断incoming call为止。而no in band ring实在call active的时候才会建立SCO,所以此时候HF要在incoming call的时候自己做一个铃声。

2.1 Answer Incoming Call from the HF – In-Band Ringing

流程如下:

android 蓝牙电话挂断流程_android 蓝牙电话挂断流程_05

2.2 Answer Incoming Call from the HF – No In-Band Ringing

android 蓝牙电话挂断流程_蓝牙电话接听来电_06

下面我们就来看下以上in band ring和no in band ring的差别:

支持In band ring的AG首先会建立SCO,然后每次发送RING command给HF后,都会发送 ring tone(铃声)给HF,而no in band ring AG只会间隔发送RING command给HF,等到接听后才会建立SCO

接着我们来看下设计到的AT command。

CIEV在上面已经介绍,此部分不再做介绍

android 蓝牙电话挂断流程_android 蓝牙电话挂断流程_07

CLIP会在Calling Line Identification (CLI)小节再做介绍

android 蓝牙电话挂断流程_蓝牙挂断电话_08

2.3 Answer Incoming Call from the AG

从AG端接听incoming call的流程比较简单,AG只是会通过+CIEV更新callsetup,call

android 蓝牙电话挂断流程_android 蓝牙电话挂断流程_09

2.4 Change the In-Band Ring Tone Setting

虽然在SDP或者BRSF中能解析到AG是否支持in band ring,但是在后来的过程,AG可能通过+BSIR来变更是否support in band ring。

android 蓝牙电话挂断流程_蓝牙拒接来电_10

Command如下:

android 蓝牙电话挂断流程_蓝牙挂断电话_11

三.Reject an incoming voice call(拒接来电)

android 蓝牙电话挂断流程_android 蓝牙电话挂断流程_12

3.1 Reject an Incoming Call from the HF

android 蓝牙电话挂断流程_蓝牙电话_13

3.2 Rejection/Interruption of an Incoming Call in the AG

android 蓝牙电话挂断流程_蓝牙拒接来电_14

通过HF拒接来电,只需要下AT+CHUP command就行了,然后AG会发送过来callsetup得而CIEV command过来,同on个过AG拒接,AG同样会发送callsetup的CIEV过来。

android 蓝牙电话挂断流程_蓝牙拒接来电_15

四. Terminate a call

android 蓝牙电话挂断流程_蓝牙挂断电话_16

4.1 Terminate a Call Process from the HF

android 蓝牙电话挂断流程_蓝牙挂断电话_17

AT command格式跟挂断incoming call一样,都是AT+CHUP,所以不再重复。

4.2 Terminate a Call Process from the AG

android 蓝牙电话挂断流程_蓝牙挂断电话_18

挂断电话跟拒接来电的很类似,差别在于AG发送过来的CIEV是call的value,不再重复说明