Cisco JTAPI в CUCM

Мне поручили написать приложение, позволяющее пользователям звонить в Cisco Unified Callmanager 8.6. Список контактов не будет предоставлен UCM. Он будет предоставлен в другом месте.

Я считаю, что документация и примеры, предоставленные Cisco, недостаточны и нежелательны. Я также считаю недостатком рабочих примеров от третьих лиц.

Я надеюсь, что кто-то еще сделал что-то подобное до меня.

Приложение получает номера для звонка из базы данных, а затем позволяет пользователю щелкнуть контакт, которому он или она хочет позвонить. Затем на телефон должен быть отправлен номер пункта назначения. По сути, вместо того, чтобы набирать номер, приложение отправляет пункт назначения на телефон или UCM, и в этот момент управление берет на себя пользователь.

Глядя на makecall.java от Cisco и используя его, кажется, что на самом деле просто выполнить вызов с помощью этого API.

Я начал с примера, найденного по адресу http://blog.nominet.org.uk/tech/2008/01/25/experiments-with-jtapi-part-1-making-a-call./, но я считаю, что этого фрагмента кода недостаточно для совершения звонка. Впрочем, я могу ошибаться.

Может ли кто-нибудь указать мне правильное направление здесь, поскольку я считаю, что мои спецификации просты и должны быть просты в реализации. Если потребуется дополнительная информация, я буду рад ее предоставить.


person scav    schedule 08.01.2013    source источник


Ответы (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 - телефон, на который вы звоните
person Anar Orujov    schedule 11.08.2014
comment
Я закончил на том же коде (почти), когда работал над этим. Это правильное решение проблемы, для тех, кто еще борется. - person scav; 25.11.2014

Это было несколько месяцев назад, но это все еще может вам немного помочь. Мне удалось создать тестовый сценарий:

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.

person Atmocreations    schedule 10.05.2013