【问题标题】:Cisco JTAPI to CUCMCisco JTAPI 到 CUCM
【发布时间】:2013-01-08 13:47:42
【问题描述】:

我的任务是编写一个应用程序,让用户可以拨打 Cisco Unified Callmanager 8.6。 UCM 不会提供联系人列表。它将在其他地方提供。

我发现 Cisco 提供的文档和示例都缺乏且不受欢迎。我还发现缺乏来自第三方的工作示例。

我希望其他人在我之前做过类似的事情。

应用程序从数据库中获取要呼叫的号码,然后让用户单击他或她想要呼叫的联系人。然后应将目的地的号码发送到电话。基本上,应用程序不必拨打号码,而是将目的地发送到电话或 UCM,然后用户在此时接管。

查看 Cisco 的 makecall.java,并使用它,使用此 API 实际拨打电话似乎很简单。

我已经开始使用http://blog.nominet.org.uk/tech/2008/01/25/experiments-with-jtapi-part-1-making-a-call/ 中的示例,但我认为这段代码不足以拨打电话。但是我可能错了。

谁能在这里指出我正确的方向,因为我相信我的规范很简单,应该很容易实现。如果需要更多信息,我很乐意提供。

【问题讨论】:

    标签: java telephony cisco jtapi cisco-jtapi


    【解决方案1】:

    这是几个月前的事了,但它仍然可能对您有所帮助。我能够创建一个测试场景:

    protected CiscoJtapiPeer peer;
    protected CiscoProvider provider;
    // ...
    
    peer = (CiscoJtapiPeer) JtapiPeerFactory.getJtapiPeer(null);
    provider = (CiscoProvider) peer.getProvider(cucmURL);
    
    /* cucmURL has the format:
        "192.168.0.20;login=myuser;passwd=mypasswd"
    whereas the username is an Application User in Cisco Unified Communications
    Manager. On my system, it has the following permissions. I don't know whether all
    of them are required:
    
    Standard AXL Users
    Standard Audit Users
    Standard CCM End Users
    Standard CCM Phone Administration
    Standard CCM Phone and Users Administration
    Standard CCM Read Only
    Standard CCM Super Users
    Standard CTI Allow Call Monitoring
    Standard CTI Allow Call Park Monitoring
    Standard CTI Allow Control of All Devices
    Standard CTI Allow Control of Phone supporting Connected Xfer and...
    Standard CTI Enabled
    Standard CTI Secure Connection
    Standard RealtimeAndTraceCollection
    Standard TabSyncUser
    
    You then add an observer to the provider in order to know when the provider 
    object is read for further interaction. You'll receive a "ProvInServiceEv" Event in the event list.
    */
    
    provider.addObserver(providerObserver);
    /* Wait until the event has come up */
    // Create a sample call:
    CiscoTerminal term = provider.createTerminal("your_sep_id_here");
    Call call = provider.createCall();
    call.connect(term, term.getAddresses()[0], "your_phone_number_to_call");
    

    term 用作开始调用的“源”。 term.getAddresses()[0] 只是获取与“源”电话关联的第一个电话号码。然后调用"your_phone_number_to_call"。

    另一个信息:反过来就不行了:你不能先调用provider.getAddress("phonenumber"),因为在任何终端连接到它之前,提供者类没有加载电话号码。

    这是在 CUCM 8.6.2 和 Java 7 上测试的。

    【讨论】:

      【解决方案2】:

      我在我的项目中使用了这段代码,工作正常:

                  final Condition inService = new Condition();
                  provider.addObserver(new ProviderObserver() {
                      public void providerChangedEvent(ProvEv[] eventList) {
                          if (eventList == null) {
                              return;
                          }
                          for (int i = 0; i < eventList.length; ++i) {
                              if (eventList[i] instanceof ProvInServiceEv) {
                                  inService.set();
                              }
                          }
                      }
                  });
                  inService.waitTrue();
                  Address srcAddr = provider.getAddress(src);
                  co = new CallObserver() {
                      public void callChangedEvent(CallEv[] eventList) {    
                      }
                  };
                  srcAddr.addCallObserver(co);
                  call = provider.createCall();
                  call.connect(srcAddr.getTerminals()[0], srcAddr, dst);
      

      • src - 您拨打的电话
      • dest - 您呼叫的电话

      【讨论】:

      • 我在处理这个问题时(几乎)以相同的代码结束。这是解决问题的正确方法,适用于其他任何苦苦挣扎的人。
      猜你喜欢
      • 1970-01-01
      • 2013-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多