系列(一):http://my.oschina.net/delphixp/blog/284989
系列(二):http://my.oschina.net/delphixp/blog/289909
(接二)
3、示例
3.1 捕捉话机拨号过程所有事件
可以说,这是 JTAPI 开发的最简单的开发例子。但是,也是很有价值的例子。因为 JTAPI 的开发,我们的逻辑代码都是在事件中实现,可以不了解事件,基本上什么事也干不成。同样,当我们的程序有问题的时候,通常这些问题都是事件理解不够,又或者状态不对造成。
步骤:
1)获取 Provider (这是总领所有话机和 Call 的对象,就象电信公司)
2)为 Provider 添加事件侦听器(ProviderObserver,用来处理 Provider 的事件)
3)等待 Provider 初始化完成(Provider 的初始化需要时间,Provider 未完成初始化什么事也做不成)
4)为话机添加所需要的事件侦听器
所有的 JTAPI 基本上都是这样的步骤,下面是开发的代码:
import javax.telephony.JtapiPeer;
import javax.telephony.JtapiPeerFactory;
import javax.telephony.Provider;
import javax.telephony.Terminal;
import javax.telephony.callcontrol.CallControlCallObserver;
import javax.telephony.events.CallEv;
import javax.telephony.events.ProvEv;
import javax.telephony.events.ProvInServiceEv;
import javax.telephony.events.TermEv;
import com.cisco.cti.util.Condition;
import com.cisco.jtapi.extensions.CiscoProviderObserver;
import com.cisco.jtapi.extensions.CiscoTerminalObserver;
/**
* 侦听话机事件 示例
*
* CiscoProviderObserver -- 这是 Cisco 对 ProviderObserver 的扩展
*
* CiscoTerminalObserver -- 这是 Cisco 对 TerminalObserver 的扩展
*
* @author xxx
* @since: v1.0
*/
public class TestCaptureEvent implements CiscoProviderObserver, CiscoTerminalObserver, CallControlCallObserver{
/**
* Provider
*/
private Provider provider = null;
/**
* 信号量,用来阻塞等待 Provider 的初始化,直到完成
*/
final private Condition providerCondition = new Condition();
/**
* main 方法
*
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception{
TestCaptureEvent test = new TestCaptureEvent();
//获得 本地化(厂家提供) JTAPI 工厂
JtapiPeer peer = JtapiPeerFactory.getJtapiPeer("com.cisco.jtapi.CiscoJtapiPeerImpl");
/**
* 创建 Provider
*
* 与语音系统的连接串,这里就是 CCM 的连接串,如 JDBC URL 一样。
* 由三部分组成:<CCM IP>;login=<application_user>;passwd=<application_user_pwd>
* 其中,如果有多台 CCM Server 组成的集群,ip 之间使用逗号分隔
*/
String connectionString = "192.168.11.233;login=AppTest;passwd=123456";
test.provider = peer.getProvider(connectionString);
/**
* 添加 Provider 侦听器
*/
test.provider.addObserver(test);
/**
* 等待 Provider 初始化完成
*/
test.providerCondition.waitTrue();
/**
* 获取 Application User 所拥有的管理话机对象
*/
Terminal[] terminals = test.provider.getTerminals();
for(Terminal terminal: terminals){
//添加 Call 事件侦听器
terminal.addCallObserver(test);
//添加 Terminal 事件侦听器
terminal.addObserver(test);
}
}
/* (non-Javadoc)
* @see javax.telephony.ProviderObserver#providerChangedEvent(javax.telephony.events.ProvEv[])
*/
@Override
public void providerChangedEvent(ProvEv[] eventList) {
for(ProvEv event: eventList){
System.out.println("Provider Event:" + event);
/**
* 接收到 ProvInServiceEv 事件,表示 Provider 已经初始化完成
*/
if (event instanceof ProvInServiceEv){
//通知主程序, Provider 已经完成初始化工作
providerCondition.set();
}
}
}
/* (non-Javadoc)
* @see javax.telephony.TerminalObserver#terminalChangedEvent(javax.telephony.events.TermEv[])
*/
@Override
public void terminalChangedEvent(TermEv[] eventList) {
//遍历所有事件。。事件是并发的,同一时间有可能接收到多个事件
for(TermEv event: eventList){
System.out.println("Terminal Event:" + event);
}
}
/* (non-Javadoc)
* @see javax.telephony.CallObserver#callChangedEvent(javax.telephony.events.CallEv[])
*/
@Override
public void callChangedEvent(CallEv[] eventList) {
//遍历所有 Call 事件
for(CallEv event: eventList){
System.out.println("Call Event:" + event);
}
}
}
这是最基础的 JTAPI 例子,也是所有 JTAPI 程序的基础及出发点(程序框架)。
(待续)