8. 用户界面考虑事项 (User Interface Considerations)
分配给一个呼叫的外观号码 (appearance number) 是一个重要概念. 它使呼叫能够由具有不同用户界面的多个设备处理, 同时仍让用户看到一致的模型. 谨慎处理外观号码对于满足用户预期至关重要. 同样, 向用户正确呈现呼叫/外观状态也很重要.
8.1. 外观号码呈现 (Appearance Number Rendering)
由于不同 UA 具有不同的用户界面能力, 某些 UA 存在其他 UA 没有的限制是常见情况. 显然不可能在所有 UA 之间实现完全互操作, 但通过谨慎设计, 可以在每个 UA 的能力边界内实现互操作.
以下指南说明在三类典型用户界面实现中应如何处理外观号码.
8.1.1. 单外观 UA (Single Appearance UAs)
这些设备受限于只能显示单个外观的状态指示. UA 仍然 SHOULD 发送带有外观号码 "1" 标注的消息. 对于编号不是 "1" 的外观的任何呼叫指示, SHOULD 使用 480 (Temporarily Unavailable) 或 486 (Busy Here) 响应拒绝. 注意, 这意味着单外观 UA 不能应答其自己发往共享 AOR 的呼叫, 因为该呼叫会使用第二个外观号码.
8.1.2. 双外观 UA (Dual Appearance UAs)
这些设备本质上是实现了呼叫等待 (call waiting) 的单外观电话. 它们具有非常简单的用户界面, 允许在两个外观之间切换 (toggle 或 flash hook), 并且可能使用可听音提示另一个外观的状态. 这些 UA 只会使用外观号码 "1" 和 "2".
8.1.3. 使用固定外观号码的共享外观 UA (Shared Appearance UAs with Fixed Appearance Number)
这种 UA 是典型的 "business-class" 硬电话. 通常会静态配置若干外观并标注在按钮上, 呼叫可以使用这些已配置外观进行管理. 超出此范围的任何呼叫都应被拒绝, 而不应映射到空闲按钮. 这类设备的用户经常为外呼占用特定外观号码, UA 需要占用该外观号码并等待外观代理 (Appearance Agent) 确认, 然后才继续进行呼叫.
8.1.4. 使用可变外观号码的共享外观 UA (Shared Appearance UAs with Variable Appearance Numbers)
这种 UA 通常是软电话, 或者具有丰富图形用户界面的硬电话. 在这些情况下, 甚至外观索引 (appearance index) 的概念也可能显得没有必要. 不过, 为了让这些电话能够与其他类型电话成功互通, 它们仍然使用外观索引来控制进行中呼叫的显示顺序很重要. 除了要求顺序保持一致之外, 本文不对呈现方式给出具体指导. 这些设备通常可以在不等待外观代理确认外观号码的情况下发起呼叫.
8.1.5. 用户界面问题示例 (Example User Interface Issues)
以下示例可以直观看出每种用户界面风格会面对的问题:
-
一个呼叫到达共享外观组, 并被分配外观号码 "1". 所有 UA 都应能够向用户呈现此呼叫的到达.
-
另一个呼叫到达共享外观组, 并被分配外观号码 "2". 单外观 UA 不应向用户呈现此呼叫. 其他 UA 应能够毫无问题地将此呼叫与第一个呼叫区分呈现.
-
第一个呼叫清除, 释放外观号码 "1". 单外观 UA 现在应指示没有呼叫, 因为它无法管理第一个外观之外的呼叫. 两个共享外观 UA 都应清楚显示外观号码 "1" 现在空闲, 但外观号码 "2" 上仍有一个呼叫.
-
第三个呼叫到达, 并被分配外观号码 "1". 所有 UA 都应能够向用户呈现这个新呼叫的到达. 多外观 UA 应继续指示第二个呼叫仍然存在, 并且还应确保呈现顺序与外观号码相关, 而不是与呼叫到达顺序相关.
8.2. 呼叫状态呈现 (Call State Rendering)
实现共享外观特性的 UA 通常具有能够提供组内其他外观状态的用户界面. 在处理来自外观代理的对话状态 NOTIFY 时, 可以呈现这些信息. 即使最简单的用户界面通常也有三种状态: idle, active 和 hold. 当外观代理报告某个外观号码未与任何对话关联时, 该外观处于 idle 状态, 通常以指示灯熄灭表示. active 状态通常以指示灯点亮表示, 表示外观代理报告某个外观号码与至少一个对话关联. hold 状态通常以指示灯闪烁表示, 表示从共享外观组中该 UA 的视角看, 呼叫状态为保持. 这可以通过本地目标 URI 上是否存在 "+sip.rendering=no" 特性标签 [RFC3840] 来确定. 注意, 远端目标 URI 的保持状态与此显示无关. 对于已加入的对话, 只有当所有本地目标 URI 都带有 "+sip.rendering=no" 特性标签时, 状态才呈现为 hold.