Cisco JTAPI电话注册/取消注册状态

问题描述 投票:-1回答:1

我使用以下代码检查手机状态(如果手机已启动或关闭)。电话关机时发出警报。但是,当8800系列手机关机时,这并未显示。有没有其他方法来检查电话注册/取消注册状态?

@Override public void terminalChangedEvent(TermEv[] eventList) {
        if ( eventList != null ) {
            for (TermEv eventList1 : eventList) {
                 if (eventList1 instanceof CiscoTermInServiceEv){
                    if(terminalInService.test()==true){
                        LogSQL.removeLog(terminal.getName());
                     }
                    System.out.println(terminal.getName());
                    terminalInService.set();
                    return;
                } else if (eventList1 instanceof CiscoTermOutOfServiceEv && 
                    terminalInService.test()==true) {
                    offline();
                }
            }
         }
       }

第二个问题,我无法找到有关“com.cisco.cti.util.Condition”类的方法或文档。 Condition.set()和Condition.test()方法有什么作用?

cisco cisco-jtapi
1个回答
0
投票

看起来你有正确的总体思路 - 假设你有正确的设备 - >用户关联和用户权限(标准CTI启用,标准CTI允许控制支持连接的Xfer和conf的电话的标准CTI允许控制),JTAPI应该适用于88xx模型88XX)。

这是我在CUCM 11.5上工作的版本:

package com.mycompany.app;

import com.cisco.jtapi.extensions.*;
import java.util.*;
import javax.telephony.*;
import javax.telephony.events.*;
import javax.telephony.callcontrol.*;
import javax.telephony.callcontrol.events.*;
import com.cisco.cti.util.Condition;

public class DataTerm implements ProviderObserver, TerminalObserver {

    public static final int OUT_OF_SERVICE = 0;
    public static final int IN_SERVICE = 1;
    private Address destAddress;
    private CiscoTerminal observedTerminal;
    private boolean addressInService;
    private boolean terminalInService;
    protected int state = OUT_OF_SERVICE;
    Condition conditionInService = new Condition();
    Provider provider;

    public DataTerm(String[] args) {
        try {
            System.out.println("Initializing Jtapi");
            String providerName = "ds-ucm115-1.cisco.com";
            String login = "dstaudt";
            String passwd = "password";
            String dest = "2999";
            JtapiPeer peer = JtapiPeerFactory.getJtapiPeer(null);
            String providerString = providerName + ";login=" + login + ";passwd=" + passwd;
            System.out.println("Opening " + providerString + "...\n");
            provider = peer.getProvider(providerString);
            provider.addObserver(this);
            conditionInService.waitTrue();
            this.destAddress = provider.getAddress(dest);
            this.observedTerminal = (CiscoTerminal) destAddress.getTerminals()[0];
            try {
                if (destAddress != null) {
                    System.out.println("Adding Terminal Observer to Terminal" + observedTerminal.getName());
                    observedTerminal.addObserver(this);
                }
            } catch (Exception e) {
            }
        } catch (Exception e) {
            System.out.println("Caught exception " + e);
        }
    }

    public void terminalChangedEvent(TermEv[] events) {
        for (int i = 0; i < events.length; i++) {
            Terminal terminal = events[i].getTerminal();
            switch (events[i].getID()) {
            case CiscoTermInServiceEv.ID:
                System.out.println("Received " + events[i] + "for " + terminal.getName());
                terminalInService = true;
                break;
            case CiscoTermOutOfServiceEv.ID:
                System.out.println("Received " + events[i] + "for " + terminal.getName());
                terminalInService = false;
                if (state != OUT_OF_SERVICE) { // you only want to notify when you had notified earlier that you are IN_SERVICE
                    state = OUT_OF_SERVICE;
                }
                break;
            }
        }
    }

    public void providerChangedEvent(ProvEv[] eventList) {
        if (eventList != null) {
            for (int i = 0; i < eventList.length; i++) {
                if (eventList[i] instanceof ProvInServiceEv) {
                    conditionInService.set();
                }
            }
        }
    }

}

“com.cisco.cti.util.Condition”似乎基于这种模式:

公共接口条件

条件因素将Object监视器方法(wait,notify和notifyAll)分解为不同的对象,以通过将它们与使用任意Lock实现相结合来实现每个对象具有多个等待集的效果。如果Lock替换了synchronized方法和语句的使用,则Condition将替换Object监视方法的使用。

条件(也称为条件队列或条件变量)为一个线程提供暂停执行(“等待”)的手段,直到另一个线程通知某个状态条件现在可能为真。由于对此共享状态信息的访问发生在不同的线程中,因此必须对其进行保护,因此某种形式的锁定与该条件相关联。等待条件提供的关键属性是它以原子方式释放关联的锁并挂起当前线程,就像Object.wait一样。

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Condition.html

© www.soinside.com 2019 - 2024. All rights reserved.