一. 概念
1. 概念
本规范定义了两个角色:通话控制服务器(Call Control Server) 角色和通话控制客户端(Call Control Client) 角色。
其中通话控制服务器(Call Control Server)在Spec中叫做TBS( Telephone Bearer Service )
其中通话控制客户端(Call Control Client)在Spec中叫做CCP(Call Control Profile)
通话控制服务器角色位于能够通过一个或多个电话承载(如手机或平板电脑)处理通话的设备上。
通话控制客户端角色位于能够向服务器发起请求以进行拨打、接听和管理通话的设备上,支持通话控制客户端的设备示例包括带麦克风的耳机和扬声器,或手表等可能无扬声器或麦克风但仍可管理电话呼叫的设备。
通话控制服务器应为GATT服务器。
通话控制客户端应为GATT客户端。
说直白点就是通话控制,此协议的前提就是类似于传统蓝牙的HFP,如果你熟悉HFP,那么此协议会觉得非常容易理解,在整个le audio的架构如下:

图展示了服务与配置文件角色之间的关系,其中配置文件角色以灰色方框表示,服务以黄色方框表示。在通话控制服务器(Call Control Server) 内部,可包含零个或多个电话承载服务(TBS) 实例,同时包含一个且唯一一个通用电话承载服务(GTBS) 实例,该实例是必需的。

通话控制客户端可以访问通话控制服务器上的TBS、GTBS或两者。对于无需访问和控制通话控制服务器上每个TBS全部功能的轻量级通话控制客户端实现,可使用GTBS作为通话控制活动的单一接入点。而对于需要更精细控制电话功能的更丰富通话控制客户端实现,如果通话控制服务器已暴露相应接口,则可以单独访问和控制每个TBS。
可以看下图的找到对应的GTBS以及TBS。


TBS实例化于能够拨打和/或接听电话的设备上。这些设备包括:手机;平板电脑;个人电脑(PC);笔记本电脑;可穿戴设备,如智能手表、智能音箱/显示屏;以及会议室设备(仅视频或仅音频)。
TBS 和 GTBS 均通过特性(characteristics)提供电话承载(telephone bearers)的状态和控制功能。一个设备可以拥有多个逻辑上独立的电话承载。一个 TBS 实例为设备内一个特定的电话承载提供状态和控制。当设备希望允许客户端直接访问和控制其内部独立电话承载实体的特性时,设备会实现 TBS 实例。
GTBS 提供一个单一的访问点,并将其内部电话承载的表示(representation)汇集到一个单一的电话承载中。该服务将设备作为一个单一单元,提供其电话状态和控制,并具有一套单一的特性集。在任何时刻,GTBS 的某个特性具体代表哪个电话承载,由具体实现自行决定。对于设备上存在的每个独立 TBS 的某个特性,如何映射到 GTBS 的同一特性,没有规定统一的方式。
例如,如果一个设备上有多个 TBS,且每个都有唯一的电话承载名称(例如 Name1 和 Name2),那么 GTBS 如何表示电话承载名称由具体实现决定。GTBS 适用于那些不需要访问或控制特定电话承载上所有可用信息的客户端。
例如,像手机或 PC 这样的设备可能拥有许多向最终用户提供电话服务的应用程序(例如蜂窝网络通话应用和 VoIP 应用)。设备可以将这些应用程序视为独特的电话承载。设备可以为每个电话承载应用程序实现一个独立的 TBS 实例,这使得客户端能够单独发现、观察和控制这些电话承载应用程序。此外,设备可以实现一个单一的 GTBS 实例,以提供一套单一的特性集来提供设备上电话服务的状态和控制,但具体实现方式由设备自行决定。
服务还公开了每个活跃电话呼叫的不同状态信息,以及客户端设备可根据其自身操作请求改变呼叫状态的方法。每个活跃呼叫都有一个呼叫状态特性和一个呼叫控制点特性,这些特性可以用图 2.1 所示的状态机来描述。TBS 和 GTBS 的呼叫状态定义是相同的。
GTBS 和每个独立的 TBS 都有自己的呼叫索引号空间。不要求 TBS 公开的呼叫索引与 GTBS 公开的呼叫索引相匹配(即使 TBS 和 GTBS 公开的是同一个呼叫)。
- 客户端发起的转换(由对呼叫控制点的写入操作引发)
- 基于服务器的转换(由服务器上的用户交互、服务器内部操作或电话通话远程方的操作引发)
状态转换见图示:

2. 服务属性
|--------------------------------------------------------|--------|--------------------------------------------------------|-------------|----------|
| 特性名称 | 要求 | 必需属性 | 可选属性 | 安全权限 |
| 承载提供商名称 (Bearer Provider Name) | M | 读取 (Read) 通知 (Notify) | 无 | 需要加密 |
| 承载统一主叫标识 (Bearer Uniform Caller Identifier, UCI) | M | 读取 (Read) | 无 | 需要加密 |
| 承载技术 (Bearer Technology) | M | 读取 (Read) 通知 (Notify) | 无 | 需要加密 |
| 承载支持的URI方案列表 (Bearer URI Schemes Supported List) | M | 读取 (Read) | 通知 (Notify) | 需要加密 |
| 承载信号强度 (Bearer Signal Strength) | O | 读取 (Read) 通知 (Notify) | 无 | 需要加密 |
| 承载信号强度报告间隔 (Bearer Signal Strength Reporting Interval) | C.1 | 读取 (Read) 写入 (Write) 无响应写入 (Write Without Response) | 无 | 需要加密 |
| 承载当前呼叫列表 (Bearer List Current Calls) | M | 读取 (Read) 通知 (Notify) | 无 | 需要加密 |
| 内容控制ID (Content Control ID, CCID) | M | 读取 (Read) | 无 | 需要加密 |
| 状态标志 (Status Flags) | M | 读取 (Read) 通知 (Notify) | 无 | 需要加密 |
| 来电目标承载URI (Incoming Call Target Bearer URI) | O | 读取 (Read) 通知 (Notify) | 无 | 需要加密 |
| 呼叫状态 (Call State) | M | 读取 (Read) 通知 (Notify) | 无 | 需要加密 |
| 呼叫控制点 (Call Control Point) | M | 写入 (Write) 无响应写入 (Write Without Response), 通知 (Notify) | 无 | 需要加密 |
| 呼叫控制点可选操作码 (Call Control Point Optional Opcodes) | M | 读取 (Read) | 无 | 需要加密 |
| 终止原因 (Termination Reason) | M | 通知 (Notify) | 无 | 需要加密 |
| 来电 (Incoming Call) | M | 读取 (Read) 通知 (Notify) | 无 | 需要加密 |
| 呼叫友好名称 (Call Friendly Name) | O | 读取 (Read) 通知 (Notify) | 无 | 需要加密 |
其中TBS跟GTBS的primary service的UUID如下:

另外表格中所有attribute的uuid如下:

后面我们会各个介绍各个属性
二. 具体的属性介绍
1. Bearer Provider Name
承载提供商名称 (Bearer Provider Name) 特性返回提供商(例如蜂窝网络服务提供商)的友好名称。该特性值应为 8 位 Unicode 转换格式(UTF-8)字符串。当提供商发生变更时,此特性的值可能会改变。例如,当手机处于漫游状态并在不同覆盖区域间切换提供商时,就可能发生这种情况。
当客户端读取承载提供商名称特性时,该特性返回其关联的值。通过对客户端特性配置描述符执行 GATT 写入特性描述符子程序,可将该特性配置为通知。
当承载提供商名称变更时(例如手机漫游时),该特性的值会被更新。如果客户端特性配置描述符的值已配置为通知,则当特性值发生变化时,服务器应向客户端发送通知
2. Bearer UCI
承载统一呼叫标识特性返回电话承载的标识符。
UCI表中的"client_id"字段用于填充承载UCI特性值,该值以UTF-8字符串表示。
服务器在实例化后不得更改此特性的值。
UCI的的在assigned number文档中,app以及厂商包括:


3. Bearer Technology
承载技术特性返回关于该电话承载所使用的技术类型信息。诸如3G、4G、长期演进(LTE)和Wi-Fi等术语均属于其取值示例
当客户端读取承载技术特性时,该特性返回其关联值。通过对客户端特性配置描述符执行GATT写入特性描述符子程序,可将该特性配置为通知。当配置为通知时,该特性可在客户端与服务器保持连接期间发送通知。
当技术类型发生变更时(例如覆盖范围从3G切换至4G再至LTE),该特性值将同步更新。若客户端特性配置描述符的值已配置为通知,则当特性值发生变化时,服务器应向客户端发送通知。
此特性应用于填充用户界面(UI)。客户端不应基于此特性的取值对行为或支持的功能做出任何预设推断。类型在assigned number文档中有定义,如下:


4. Bearer URI Schemes Supported List
承载支持的 URI 方案列表 特性返回此电话承载所支持的 URI 方案。
该特性值应为一个以逗号分隔的支持方案列表,并以 UTF-8 字符串形式表示。一个特性值示例为 UTF-8 字符串 "tel,sip,skype"。
支持的列表如下:https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml
当客户端读取承载支持的 URI 方案列表 特性时,该特性返回其关联的值,即一个以逗号分隔的支持方案列表。
5. Bearer Signal Strength
承载信号强度 特性长度为1个字节,返回电话承载的信号电平值,取值范围为0至100,或255。值101至254为预留待用。值0表示无服务,值100表示最大信号强度,值255表示信号强度不可用或对该特定承载无意义。值1至99的具体含义由具体实现决定。
当客户端读取承载信号强度 特性时,该特性返回其关联值。通过对客户端特性配置描述符执行GATT写入特性描述符子程序,可将该特性配置为通知。当配置为通知时,该特性可在客户端与服务器保持连接期间发送通知。
当信号强度发生变化时,该特性值会更新。若客户端特性配置描述符的值已配置为通知,则当特性值发生变化时,服务器应向客户端发送通知。报告间隔基于承载信号强度报告间隔 特性所描述的值进行设定
6. Bearer Signal Strength Reporting Interval
承载信号强度报告间隔 特性长度为1个字节,返回以秒为单位的报告间隔。报告间隔的有效值范围为0至255。若间隔设置为0,则信号强度一旦发生变化将立即上报。服务器应将默认值设为0,以避免向客户端发送不必要的信号强度通知。除非承载信号强度特性已配置为通知,否则不会进行任何报告。
当客户端读取承载信号强度报告间隔特性时,该特性返回其关联值。
当写入承载信号强度报告间隔特性时,服务器应在报告承载信号强度时使用新的报告间隔。
如果报告间隔为非零值,且信号强度自上次通知后已发生变化,则应将承载信号强度特性值通知给客户端。连续两次通知之间的最小时间间隔应至少为报告间隔值。发送承载信号强度通知的具体时间由实现自行决定,但通知频率不得高于所设置的间隔。
7. Bearer List Current Calls
承载当前呼叫列表特性返回一个当前呼叫的列表。如果当前没有呼叫,该列表为空,读取此特性时应返回0字节。当前呼叫列表基于TBS(电话承载服务)中的其他特性构建,并以特定格式提供,旨在提供当前呼叫信息的快照。
呼叫列表中的每个列表项应具有表3.2所示的结构。
其中,List_Item_Length字段表示该项的总长度(不包含该字段自身所占用的字节)。

Call_Index: 每个电话呼叫均由一个在特定服务内唯一的Call_Index(呼叫索引)值来标识。Call_Index字节是由服务器选择、用于标识一个活跃呼叫的编号。在本服务中,通过此Call_State(呼叫状态)特性所呈现的Call_Index值将用于识别各个呼叫。
**Call_State:**通话状态,值如下:
|-----------------|-------------------------------------|---------------------------------------|
| 状态值 (State) | 状态名称 (Name) | 描述 (Description) |
| 0x00 | 来电 (Incoming) | 远程方正在呼叫(呼入呼叫)。 |
| 0x01 | 拨号中 (Dialing) | 呼叫远程方的进程已在服务器上启动,但远程方尚未被提醒(呼出呼叫)。 |
| 0x02 | 提醒中 (Alerting) | 正在提醒远程方(呼出呼叫)。 |
| 0x03 | 通话中 (Active) | 呼叫处于活跃通话状态。 |
| 0x04 | 本地保持 (Locally Held) | 呼叫已连接但在本地被保持。"本地保持"意味着服务器或客户端均可影响此状态。 |
| 0x05 | 远程保持 (Remotely Held) | 呼叫已连接但在远程被保持。"远程保持"意味着此状态由通话的远程方控制。 |
| 0x06 | 本地及远程保持 (Locally and Remotely Held) | 呼叫已连接,但在本地和远程均被保持。 |
| 0x07--0xFF | - (RFU) | 预留待用 (Reserved for Future Use) |
**Call_Flag:**通话标志,值如下:
|-------------|--------------------------------------------------------------------------------------------------------------|
| 位 (Bit) | 描述 (Description) |
| 位 0 | 呼入/呼出 (Incoming/Outgoing) 0 = 呼叫为呼入电话 (incoming call) 1 = 呼叫为呼出电话 (outgoing call) |
| 位 1 | 服务器屏蔽信息 (Information withheld by server) 0 = 未屏蔽 (Not withheld) 1 = 已屏蔽 (Withheld) |
| 位 2 | 网络屏蔽信息 (Information withheld by network) 0 = 由网络提供 (Provided by network) 1 = 被网络屏蔽 (Withheld by network) |
| 位 3-7 | 预留待用 (RFU - Reserved for Future Use) |
**URI:**该URI由URI方案和主叫号码(或称为呼叫方标识,可以是电话号码或用户名)组成。例如,若URI方案为"skype",呼叫方标识(用户名)为"xyz",则生成的URI是"skype:xyz",并以UTF-8字符串格式表示。若URI方案为"tel",呼叫方标识为"+15025551212",则生成的URI是"tel:+15025551212",同样以UTF-8字符串格式表示。

8. Content Control ID
内容控制ID(CCID) 特性具有一个唯一标识某个服务实例的值,该服务负责控制或提供与音频相关功能的状态信息。音频相关功能的示例包括媒体播放器和电话承载。
CCID特性的值用于唯一标识设备上该特性的每个实例。
当客户端读取CCID特性时,该特性返回其关联值。
在服务的每个实例中,CCID特性的值应在多个连接间保持持久化,直到其句柄范围受到服务变更的影响。
在一个TBS实例中,应仅存在一个CCID特性实例

9. Status Flags
状态标志特性长度为2个字节,返回服务器设备当前所支持功能的运行状态。
当客户端读取状态标志特性时,该特性返回其关联值。通过对客户端特性配置描述符执行GATT写入特性描述符子程序,可将该特性配置为通知。当配置为通知时,此特性可以在客户端和服务器保持连接期间发送通知。
表3.3描述了服务器用于指示其各项功能启用或禁用状态的比特位定义。预留位应设置为0。如果启用了通知,则状态标志特性应在状态发生变化时发送通知。
|------------|---------------------------------------------------------------------------------------------------------------|
| 位 (Bit) | 描述 (Description) |
| 位 0 | 带内铃声 (Inband ringtone) 0 = 带内铃声已禁用 (inband ringtone disabled) 1 = 带内铃声已启用 (inband ringtone enabled) |
| 位 1 | 静音模式 (Silent mode) 0 = 服务器未处于静音模式 (Server is not in silent mode) 1 = 服务器处于静音模式 (Server is in silent mode) |
| 位 2-15 | 预留待用 (RFU - Reserved for Future Use) |

10. Incoming Call Target Bearer URI
呼入电话目标承载URI特性返回一个来电的目标URI,并在其前附有呼叫索引(Call Index)。URI示例为"tel:+15025551212",并以UTF-8字符串格式表示。该特性的格式定义如表

当客户端读取呼入电话目标承载URI 特性时,该特性返回其关联值。通过对客户端特性配置描述符执行GATT写入特性描述符子程序,可将该特性配置为通知。当配置为通知时,此特性应在客户端和服务器保持连接期间发送通知。如果特性值的长度超过(ATT_MTU-3),则通知中应包含前(ATT_MTU-3)个字节。
当有来电到达电话承载时,Incoming_Call_Target_Bearer_URI字段将被填入URI方案及呼叫目标的标识信息,并在已启用通知的情况下通知客户端。
11. Call State
呼叫状态 特性返回一个数组成员列表,每个成员占3个字节,抽象地表示了电话呼叫所处的不同状态。该特性的格式如表

每个电话呼叫通过一个在服务范围内唯一的 Call_Index(呼叫索引)值进行标识。Call_Index 字节由服务器选择,用于标识一个活跃呼叫。在该 Call_State(呼叫状态)特性中显示的 Call_Index 值将在整个服务中用于识别呼叫。
每个电话呼叫均处于所列状态之一。
**Call_State:**通话状态,值如下:
|-----------------|-------------------------------------|---------------------------------------|
| 状态值 (State) | 状态名称 (Name) | 描述 (Description) |
| 0x00 | 来电 (Incoming) | 远程方正在呼叫(呼入呼叫)。 |
| 0x01 | 拨号中 (Dialing) | 呼叫远程方的进程已在服务器上启动,但远程方尚未被提醒(呼出呼叫)。 |
| 0x02 | 提醒中 (Alerting) | 正在提醒远程方(呼出呼叫)。 |
| 0x03 | 通话中 (Active) | 呼叫处于活跃通话状态。 |
| 0x04 | 本地保持 (Locally Held) | 呼叫已连接但在本地被保持。"本地保持"意味着服务器或客户端均可影响此状态。 |
| 0x05 | 远程保持 (Remotely Held) | 呼叫已连接但在远程被保持。"远程保持"意味着此状态由通话的远程方控制。 |
| 0x06 | 本地及远程保持 (Locally and Remotely Held) | 呼叫已连接,但在本地和远程均被保持。 |
| 0x07--0xFF | - (RFU) | 预留待用 (Reserved for Future Use) |
**Call_Flag:**通话标志,值如下:
|-------------|--------------------------------------------------------------------------------------------------------------|
| 位 (Bit) | 描述 (Description) |
| 位 0 | 呼入/呼出 (Incoming/Outgoing) 0 = 呼叫为呼入电话 (incoming call) 1 = 呼叫为呼出电话 (outgoing call) |
| 位 1 | 服务器屏蔽信息 (Information withheld by server) 0 = 未屏蔽 (Not withheld) 1 = 已屏蔽 (Withheld) |
| 位 2 | 网络屏蔽信息 (Information withheld by network) 0 = 由网络提供 (Provided by network) 1 = 被网络屏蔽 (Withheld by network) |
| 位 3-7 | 预留待用 (RFU - Reserved for Future Use) |
当客户端读取 呼叫状态 特性时,该特性返回其关联的数值数组。
可通过在客户端特性配置描述符上使用 GATT 写入特性描述符子程序,将 呼叫状态 特性配置为通知。当配置为通知时,此特性可以在客户端和服务器保持连接期间发送通知。
当服务实例化时,Call_Index 应为 1 至 255 之间的数字。随着每个呼叫的建立,Call_Index 应递增 1。当 Call_Index 达到 255 时,应回滚至 1。Call_Index 0 为保留值。在呼叫的整个生命周期内,Call_Index 应保持唯一。
当服务器首次分配一个 Call_Index 并将其包含在呼叫状态列表中时,应在包含该 Call_Index 的任何其他特性之前,先发送 呼叫状态 特性的通知。
当呼叫状态发生变化时,服务器应使用新状态更新 呼叫状态 特性。如果呼叫为呼出电话,Call_Flags 字段的呼入/呼出位应设置为 1;如果为呼入电话,则应设置为 0。
当服务器分配 Call_Index 时,服务器可能向客户端屏蔽包含 URI 或友好名字段的特性中的 URI 和友好名字段。这通过设置 Call_Flags 中的"由服务器屏蔽"和/或"由网络屏蔽"位来指示。如果服务器的策略或配置要求,则应设置位 1。如果网络无法提供该信息,则应设置位 2。如果字段因任何原因被屏蔽,它们可能为 NULL、空或零长度,但服务器也可以添加诸如"已屏蔽"或"未知主叫"等字段。
12. Call Control Point
呼叫控制点特性的长度可变,具体取决于所使用的操作码。第一个字节是一个称为操作码的枚举值。操作码之后的参数字段内容因操作码而异,总体格式如下:

具体的命令格式如下:
|-------------------------------|------------|-------------------------------------|----------------------------------------------------------------------------|
| 操作码名称 | Opcode | 参数 | 说明/备注 |
| 接听 (Accept) | 0x00 | 呼叫索引 (Call_Index,1字节) | 应答由 Call_Index 标识的来电。 |
| 终止 (Terminate) | 0x01 | 呼叫索引 (Call_Index,1字节) | 结束由 Call_Index 标识的活跃通话、提醒中(呼出)、拨号中(呼出)、呼入、或被保持(本地或远程)的呼叫。 |
| 本地保持 (Local Hold) | 0x02 | 呼叫索引 (Call_Index,1字节) | 将 Call_Index 标识的活跃通话或来电置于本地保持状态。 |
| 本地恢复 (Local Retrieve) | 0x03 | 呼叫索引 (Call_Index,1字节) | 将 Call_Index 标识的本地保持呼叫恢复为活跃通话。 将本地及远程保持的呼叫转换为远程保持状态。 |
| 发起呼叫 (Originate) | 0x04 | 统一资源标识符 (URI,长度可变) | 向 URI 标识的远程方发起呼叫。 |
| 合并通话 (Join) | 0x05 | 呼叫索引列表 (List_of_Call_Indexes,字节数可变) | 将列表中非"远程保持"状态的呼叫置为活跃状态并进行合并。任何处于"远程保持"或"本地及远程保持"状态的呼叫将转为"远程保持"状态,并与其他呼叫合并。 |
| -- | 0x06--0xFF | 预留待用 (RFU) | -- |
接听 (Accept)
接听操作码仅在呼叫状态特性为"来电"时有效。
当"接听"作为控制点操作码被写入时,服务器应为给定的电话承载启动必要的接听流程,且呼叫状态将转变为"通话中"。
如果"接听"操作码被写入呼叫控制点,任何其他处于"通话中"状态的呼叫应被移至"本地保持"状态。如果有任何呼叫处于"远程保持"状态,则应将其移至"本地及远程保持"状态。若需实现多个呼叫同时处于通话状态,应使用"合并"操作码。
参数字段包含要接听的呼叫索引。
终止 (Terminate)
终止操作码在呼叫状态处于任何状态时均有效。
当"终止"作为控制点操作码被写入时,该呼叫将被终止,且与已终止呼叫关联的呼叫状态特性应从呼叫状态列表中移除。
当呼叫被终止时,服务器应在"终止原因"特性中填入该呼叫的索引和原因码。
参数字段包含要终止的呼叫索引。
本地保持 (Local Hold)
本地保持操作码仅在呼叫状态为"来电"、"通话中"或"远程保持"时有效。
如果呼叫状态是"来电"或"通话中",当"本地保持"作为控制点操作码被写入时,呼叫状态将转变为"本地保持"。
如果呼叫状态是"远程保持",当"本地保持"作为控制点操作码被写入时,呼叫状态将转变为"本地及远程保持"。
参数字段包含要在本地保持的呼叫索引。
本地恢复 (Local Retrieve)
本地恢复操作码仅在呼叫状态为"本地保持"或"本地及远程保持"时有效。
如果呼叫状态是"本地保持",当"本地恢复"作为控制点操作码被写入时,呼叫状态将转变为"通话中"。任何处于"通话中"状态的呼叫预计将转变为"本地保持"状态。
如果呼叫状态是"本地及远程保持",当"本地恢复"作为控制点操作码被写入时,呼叫状态将转变为"远程保持"。任何处于"通话中"状态的呼叫将转变为"本地保持"状态。任何处于"远程保持"状态的呼叫将转变为"本地及远程保持"状态。
"恢复"操作码不应用于合并通话。"合并"操作码用于合并通话。
参数字段包含要在本地恢复的呼叫索引。
发起呼叫 (Originate)
发起呼叫操作码在任何时候均有效。
当"发起呼叫"作为控制点操作码被写入时,呼叫状态将转变为"拨号中"(呼出)并分配一个新的呼叫索引。如果在接受"发起呼叫"操作码时存在任何活跃呼叫,这些呼叫应被移至"本地保持"状态。根据具体实现,当提醒开始时,呼叫状态将转变为"提醒中"。当远程端接听呼叫时,呼叫状态将转变为"通话中"。
参数字段包含呼出电话的URI。该URI由URI方案和主叫号码(可以是电话号码或用户名)组成。例如,如果URI方案是"skype",主叫号码(用户名)是"xyz",则生成的URI为"skype:xyz",格式为UTF-8字符串。如果URI方案是"tel",主叫号码是"+15025551212",则生成的URI为"tel:+15025551212",格式为UTF-8字符串。
合并通话 (Join)
此操作码仅当存在两个或更多呼叫且其状态均非"来电"时有效。
如果服务器支持通话合并功能,当"合并"作为控制点操作码被写入时,写入该特性所包含的呼叫预计将被合并,且每个呼叫的呼叫状态按如下方式处理:
- 如果呼叫状态为"通话中",则保持为"通话中"。
- 如果呼叫状态为"本地保持",则转变为"通话中"。
- 如果呼叫状态为"远程保持",则保持为"远程保持"。
- 如果呼叫状态为"本地及远程保持",则转变为"远程保持"。
- 如果呼叫状态为"提醒中"或"拨号中",则保持原状态。当远程方应答并转变为"通话中"状态后,如何合并该通话由服务器实现决定。
- 如果任何未被列入合并列表的呼叫状态为"通话中",则这些呼叫的状态将转变为"本地保持"。
如果网络不支持通话合并,或提供的列表中任何呼叫索引的呼叫状态为"来电",或列表中包含的呼叫少于两个,则应在发送给客户端的控制点通知中返回"操作不可行"结果码。任何呼叫都不应被合并,且由于写入"合并"操作码,合并命令列表中各呼叫的呼叫状态不应发生改变。
参数字段包含要合并的呼叫索引列表。
发送了Point肯定要有一个ack机制,那么ack就是用notification
呼叫控制点通知 的必需结构。每次写入呼叫控制点操作码后,服务器会向客户端发送呼叫控制点通知。如果请求的操作码流程成功完成,且该操作码不是"发起呼叫"或"合并通话" ,则呼叫控制点通知的结果码 应设置为SUCCESS ,且呼叫索引字段应设置为所提供的呼叫索引值。
如果请求的操作码流程未成功完成,则结果码应设置为表3.11中的某个值,且呼叫索引字段应设置为0。
对于发起呼叫 操作码,如果操作码流程成功完成,则呼叫控制点通知的结果码应设置为SUCCESS,且呼叫索引字段应设置为分配给该呼叫的呼叫索引值。
对于合并通话 操作码,如果操作码流程成功完成,则呼叫控制点通知的结果码应设置为SUCCESS ,且呼叫索引字段应设置为所提供的呼叫索引列表中的第一个呼叫索引值。
如果收到无效的操作码,则结果码应设置为OPCODE NOT SUPPORTED,且呼叫索引字段应设置为0。

|-----------------------|-------------------------------------|--------------------------------------|
| 结果码 (Result Code) | 定义 (Definition) | 描述 (Description) |
| 0x00 | 成功 (SUCCESS) | 操作码写入成功。 |
| 0x01 | 操作码不支持 (OPCODE NOT SUPPORTED) | 为"呼叫控制点"写入使用了无效的操作码。 |
| 0x02 | 操作不可行 (OPERATION NOT POSSIBLE) | 无法完成所请求的操作。 |
| 0x03 | 无效的呼叫索引 (INVALID CALL INDEX) | 为"呼叫控制点"写入所使用的呼叫索引无效。 |
| 0x04 | 状态不匹配 (STATE MISMATCH) | 当前呼叫索引的呼叫状态并非预期状态时,收到了写入"呼叫控制点"的操作码。 |
| 0x05 | 资源不足 (LACK OF RESOURCES) | 缺乏完成所请求操作的内部资源。 |
| 0x06 | 无效的呼出URI (INVALID OUTGOING URI) | 发送"发起呼叫"操作码时,呼出URI不正确或无效。 |
| 0x07--0xFF | -- | 预留待用 (RFU)。 |
13. Call Control Point Optional Opcodes
呼叫控制点可选操作码特性长度为2个字节,用于描述呼叫控制点的可选操作码。其比特位的定义如表3.12所示。如果服务器支持某个可选操作码,其对应的比特位应设置为1;否则,该位应设置为0。呼叫控制点可选操作码特性中的预留位应设置为0。
当读取呼叫控制点可选操作码特性时,该特性返回一个值,客户端据此可判断服务器支持哪些可选的呼叫控制点操作码。在一个连接期间,呼叫控制点可选操作码特性的比特位是静态不变的。
值如下:
|-------------|------------------------------------------------------------------------------------------------------|
| 位 (Bit) | 描述 (Description) |
| 位 0 | 本地保持/本地恢复 (Local Hold / Local Retrieve) 0 = 不支持"本地保持"与"本地恢复"呼叫控制点操作码 1 = 支持"本地保持"与"本地恢复"呼叫控制点操作码 |
| 位 1 | 合并通话 (Join) 0 = 不支持"合并通话"呼叫控制点操作码 1 = 支持"合并通话"呼叫控制点操作码 |
| 位 2-15 | 预留待用 (Reserved for Future Use) |

14. Termination Reason
终止原因 特性长度为2个字节,其中第一个字节是被终止呼叫的呼叫索引 ,第二个字节包含一个原因码,用于描述该呼叫从远程端或服务器端被终止的方式,格式如下:

有以下具体的Reason Code
|-----------------------|------------------|
| 原因码 (Reason Code) | 原因 (Reason) |
| 0x00 | 用于发起呼叫的URI格式不正确。 |
| 0x01 | 呼叫失败。 |
| 0x02 | 远程方结束了通话。 |
| 0x03 | 服务器结束了通话。 |
| 0x04 | 线路繁忙。 |
| 0x05 | 网络拥堵。 |
| 0x06 | 客户端终止了呼叫。 |
| 0x07 | 无服务。 |
| 0x08 | 无人接听。 |
| 0x09 | 未指明原因。 |
| 0x0A -- 0xFF | 预留待用。 |
15. Incoming Call
来电特性返回来电的呼叫索引(Call Index)和主叫方URI。来电的URI由URI方案和主叫号码(Caller ID)组成,并以UTF-8字符串格式表示

16. Call Friendly Name
呼叫友好名称特性返回来电或呼出电话的呼叫索引以及友好名称(由服务器决定)。友好名字段是一个UTF-8字符串。该特性的格式如下:
