(接前面 JTAPI 入门(一))
○ Call 事件侦听接口,实现此接口。我们可以侦听到 Call 所发出的所有事件。在实际开发中,必须要实现此接口,或者其子接口。因为,这是介入进行处理操作的基础。
ConnAlertingEv : 这是振铃事件
ConnDisconnectedEv : 这是挂机事件
ConnFailedEv : 这是拨号失败的事件,使用这个事件,可以在拨号失败之后处理后事。。
○ Call Control Extension 扩展接口: CallControlCallObserver --- 在实际开发当中,我们会实现这个接口,而不是 CallObserver 。因为可以得到更完整的事件。
CallCtlConnAlertingEv: 振铃事件。。要注意,CallObserver 虽然也有 ConnAlertingEv ,但是这个事件能够得到更多的状态和数据信息,自然也就更好。
CallCtlConnDisconnectedEv: 这是挂机事件。。。不过,如果不需要更多信息,用 ConnDisconnectedEv 可以少输入几个字母。。^-^
CallCtlConnDialingEv: 就是按键输入事件,可以使用方法 getDigits() 来获取输入的按键。这是一次性的获取,有时不是很靠谱,所以在用时,最好先试一下好不好使。
在 Cisco JTAPI 中,提供另外的一些事件来处理按键,在后面有说
CallCtlConnEstalishedEv: 拿起话筒事件。。。这个事件,在一些处理中非常有用。不过,由于拨号双方都会拿起话筒,所以会有两个这样的事件,在用时要分清楚。
CallCtlConnOfferedEv: 在使用 Cisco CTI Port 和 CTI RoutePoint 这样的逻辑话机时,就要在这个事件进行 accept 操作。
.... 更多
○ 表示一个终端设备,包括逻辑终端和物理终端。如物理话机,SoftPhone,手机。。甚至对讲机等
○ 主要方法包括:
addObserver() : 添加 Terminal 层面的事件侦听器
addCallObserver() : 添加 Call 事件侦听器 (见 CallObserver)
getAddresses() : 获取此话机的所有 Address (即号码对象),一台可用话机,通常会有一或多个号码
getName():话机的唯一名称,在 Cisco 中。物理话机通常是一个 MAC 地址,而在逻辑话机,会是一个由字母数字组成的名称。
getProvider() : 获取 Provider
○ Cisco 实现类: CiscoTerminal --- 同样将提供更多丰富的功能
getIPV4Address() : 获得 Terminal 的 IP 地址。。。这个地址也可以通过 AXL API 获取
pickup():呼叫代答
sendData() : 推送信息到 Phone 中显示,可以用来推送一些即时提示信息
○ Cisco 的虚拟逻辑话机: CtiPort -- 可以作为一台物理话机使用
◆ 是 CCM 内部的一台虚拟话机
◆ 每个 CtiPort 只能起一个 Call
◆ 通常用来播放语音提示。例如,控制一个 CtiPort 拨打某个指定号码,然后播放一段已经录制好的语音。
◆ CtiPort 对应的类: CiscoMediaTerminal
register() : 注册使用 CtiPort --- 要指定语音编码协议等
setRTPParams() : 设置 RTP 语音流的参数(如端口等)
○ Cisco 虚拟逻辑总机: Cti RoutePoint --- 可以作为一台总机使用,同时接入多个呼叫请求
◆ 是 CCM 内部的虚拟话机
◆ 能够并发接入多路呼叫。。。CCM 8.x 以上,每个 CTI RoutePoint 可以并发接入多达 4 千个呼叫 (服务器物理性能允许的情况下)
◆ 可以实现语音呼叫处理逻辑。。。例如,简单的 Call Center 的语音流程。。实际上 Cisco Call Center Server 就是使用 CTI RoutePoint 来实现语音流程
◆ Cti RoutePoint 对应的类: CiscoRouteTerminal
register() : 注册使用 CtiPort --- 要指定语音编码协议等
setRTPParams() : 设置 RTP 语音流的参数(如端口等)
◆ 在方法提供上,似乎没什么特别之外,其他差异是在事件处理上。当使用 accept 接入时,呼叫将进入一个内部队列,排队等待处理。所以 RoutePoint 能够处理多个呼叫。
○ Terminal 层面的事件侦听接口。。能够接收到 Terminal 层面的事件,例如语音流方面。不过,由于 Terminal 与底层实现的相关性较强,所以标准并没有太多内容
○ Cisco 实现类: CiscoTermEv --- Cisco 提供了比较多的底层事件支持,并且如果要使用 CTIPort 或 CTI RoutePoint 的话,就必须用到这些事件。
CiscoMediaOpenLogicalChannelEv : 为 CTIPort 或 CTI RoutePoint 设置语音参数,例如 RTP URL ( IP + 端口号)
CiscoRTPInputStartedEv : 开始接收对方的语音输入(语音流),在本事件中,可以得到 RTP URL,这样我们可以将语音流定向到其他目地的,例如文件。
CiscoRTPInputStoppedEv: 停止语音输入事件,可能是挂机,又或者转接,会议之类的操作,停止了语音输入。
CiscoRTPOutputStartedEv: 开始向对方输出语音流
CiscoRTPOutputStoppedEv: 停止向对方输出语音流。
在使用上述事件时,要留意: CiscoRTPInputStartedEv 与 CiscoRTPOutputStartedEv 的触发,并没有顺序。也就是,不要假设顺序。
○ Connection 是连接 Call 与 Address 的连接对象。
disconnect() : 断开连接,相当于挂机
getCall(): 获得所关联的 Call
getAddress(): 获得所关联的 Address
○ Call Control Extension 扩展: CallControlConnection --- 提供更多的方法
accept() : 接入来电。对于一些特殊的 Terminal 有特定的用途。例如 Cisco CTIPort & CTI RoutePoint ,就必须明确使用本方法来接入来电。当然,新版本
的 Cisco CCM (如 8.x 之后),可以在 CCM 配置层面,进行 auto accept 操作。不过,编程的灵活性就没了。
reject(): 拒绝接入来电。
redirect() : 重定向到另一个地址。。。例如,判断是某些特定的号码,然后转向到另一些号码(类似号码自动分派)
○ Cisco 的扩展: CiscoConnection
CiscoConnection 是对 CallControlConnection 进行扩展。最重要的功能,就是提供更丰富 redirect() 方法功能,例如配合 CCM 中 CSS 进行更加细致的分隔和重定向
也就是说,可以制定更加丰富和复杂的呼叫路由。
○ TerminalConnection 是连接 Connection 与 Terminal 的连接对象。意味着 TerminalConnection 不能单独存在,必须依附于 Connection
answer() : 接听来电。特别是对于 Cisco CTIPort & CTI RoutePoint 这样的逻辑话机,必须使用本方法来接听来电。
getTerminal(): 获取关联的 Terminal
getConnection() : 获取关联的 Connection
○ Call Control Extension 扩展: CallControlTerminalConnection
hold(): 暂时 “hold”住通话
○ Cisco 的扩展/实现: CiscoTerminalConnection --- 提供一些较底层或特有的方法,例如: startRecording() 。。启动 Cisco CCM 的 BIB 方式录音功能。
2.4 开发过程常用事件
由于我们要靠事件来介入整个呼叫流程,所以了解和研究事件,就成为开发学习的主要任务。如果不清楚有那些事件,在某个阶段会触发那些事件,那就意味着你什么也做不了。下面列出开发常用事件,以供参考:
如果是 Cisco CTi Port & CTI RoutePoint 的编程,用到的事件还会多。例如: CallCtlConnOfferedEv 事件,我们的 CTI Port & CTI RoutePoint 必须在这个事件中进行一个 accept() 动作,用来接受拨打入来的电话,否则对方就无法拨入而听到忙音。
(待续...)