Cisco JTAPI Developer Guide for Cisco CallManager 3.3(3)
Overview
Downloads: This chapterpdf (PDF - 505.0KB) The complete bookPDF (PDF - 6.9MB) | Feedback

Overview

Table Of Contents

Overview

Cisco JTAPI

CiscoObjectContainer

JtapiPeer and Provider

Initialization

Shutdown

Provider.getTerminals()

Provider.getAddresses()

Changes to the User Control List in the Directory

Addresses and Terminals

Address and Terminal Relationship

Unobserved Addresses and Terminals

Connection

TerminalConnection

CiscoConnectionID

CiscoCallID

Threaded CallBacks

CiscoSynchronousObserver Interface

Querying Dynamic Objects

callChangeEvent()

CiscoConsultCall

CiscoTransferStartEv

Alarm Services

Application Control of JTAPI Parameters

Jtapi.ini Parameters

Dynamic Trace Enabling Using Jtprefs

Supported Device Types

Call Forward Setting

Call Park

Park Retrieval

Park Reminder

Park DN Monitor

CiscoJtapiExceptions

Cisco JTAPI Install Internationalization

Clear Calls Interface

Device Recovery

Device Recovery for phones

CTI RoutePoints

CTI Ports

Directory Change Notification

Enable or Disable Ringer

Transfer and Conference Extensions

Transfer

CiscoTransferStartEv

CiscoTransferEndEv

Transfer Scenarios

Conference

Cisco Extensions

Conference Scenarios

Conference Events

Transfer and Conference Enhancement

Consult Without Media

Media Termination Extensions

Cisco CallManager Media Endpoint Model

Payload and Parameter Negotiation

Initialization

Payload Selection

Receive Channel Allocation

Starting Transmission and Reception

Stopping Transmission and Reception

CiscoMediaTerminal

Provisioning

Registration

Adding Observers

Accepting Calls

Receiving and Responding to Media Flow Events

Inbound Call Media Flow Event Diagram

Cisco IP Telephony Solutions RTP Implementation

Redirect

Routing

Cisco Route Session Implementation

Select Route Timer

Forwarding Timer

RouteSession Extension

Caller Options Summary

Fault Tolerance When Using Route Points

Redundancy

Cluster Abstraction

Cisco CallManager Server Failure

Redundancy in CTIManagers

Invoking CTIManager Redundancy

CTIManager Failure

Heartbeats

Display Name Interface

SetMessageWaiting Interface

Quite Clear

GetCallInfo Interface on Address

DeleteCall Interface

GetGlobalCallID

GetCallID in RTP Events

XSI Object Pass Through

CiscoTerminal Method

Authentication and Mechanism

VG248 and ATA 186 Analog Phone Gateways


Overview


This chapter introduces the major concepts with which you need to be familiar before creating JTAPI applications for Cisco IP Telephony Solutions. The chapter covers the following concepts:

Cisco JTAPI

CiscoObjectContainer

JtapiPeer and Provider

Addresses and Terminals

Threaded CallBacks

Alarm Services

Application Control of JTAPI Parameters

Supported Device Types

Call Forward Setting

Call Park

CiscoJtapiExceptions

Device Recovery

Directory Change Notification

Transfer and Conference Extensions

Media Termination Extensions

Redirect

Routing

Redundancy

Cisco JTAPI

An abstract telephony model, Java Telephony application Programming Interface (JTAPI), can uniformly represent the characteristics of a wide variety of telecommunication systems. Because JTAPI is defined without direct reference to any particular telephony hardware or software, JTAPI offers a well suited method for the task of controlling or observing nearly any telephone system. For instance, a computer program that makes telephone calls by using an implementation of JTAPI for modems might work without modification by using the Cisco JTAPI implementation.

As powerful as an abstraction may be in theory, in practice, programmers often need to know the details of how the JTAPI model represents the underlying components of a particular telephony system. A modem represents a very simple telephony device with limited features. In contrast, the Cisco IP Telephony Solutions product family offers its users a comprehensive list of features and configuration capabilities. Programmers can best leverage the rich features of Cisco IP Telephony Solutions systems by understanding how it fits into the Cisco JTAPI model.

The following sections outline the deviations, if any, from the JTAPI v 1.2 specification or the specifics of the Cisco JTAPI implementation. Cisco JTAPI also provides extensions to the JTAPI v 1.2 specification. These extensions offer additional functionality to the Cisco implementation that is not defined in the specification. The com.cisco.jtapi.extensions package includes the classes and interfaces for the extensions, and Chapter 2, "Cisco JTAPI Extensions," explains them in detail.

CiscoObjectContainer

The CiscoObjectContainer interface allows applications to associate an application defined object to objects that implement this interface. In Cisco JTAPI, the following interfaces extend the CiscoObjectContainer interface:

CiscoJTAPIPeer

CiscoProvider

CiscoCall

CiscoAddress

CiscoTerminal

CiscoConnection

CiscoTerminalConnection

CiscoConnectionID

CiscoCallID

JtapiPeer and Provider

The Provider object, which is created through the implementation of the JtapiPeer object, acts as the main point of contact between applications and JTAPI implementations. The Provider object serves as a repository that contains the entire collection of call model objects, Addresses, Terminals, and Calls, controllable at any time by an application.

The JTPREFS applications administer JtapiPeer.getServices(), which returns server names.

The Provider entails two basic processes: initialization and shutdown.

Ensure that the following information is passed in the JtapiPeer.getProvider() method for applications to obtain a CiscoProvider:

Hostname or IP address for the Cisco CallManager server

Login of user administered in the directory

Password of user specified

(Optional) Application information— This parameter may be a string of any length

Applications should include enough descriptive information, so if the appinfo were logged in an alarm, administrators would know which application caused the alarm. Applications should not include hostname or IP address where they reside, nor the time at which they were spawned. Also, ensure that no "=" or ";" characters are included in the appinfo string because they delimit the getProvider () string. When the appinfo is not specified, you can use a generic and quasi-unique name (JTAPI[XXXX]@hostname, where XXXX represents a random four digit number) instead.

The parameters get passed in key value pairs concatenated in a string as follows:

JtapiPeer.getProvider( "CTIManagerHostname;login=user;passwd=userpassword;appinfo=Cisco Softphone" )

Initialization

The JtapiPeer.getProvider() method returns a Provider object as soon as the TCP link, the initial handshake with the Cisco CallManager, and device list enumeration are complete. The provider now exists in the OUT_OF_SERVICE state. Cisco JTAPI applications must wait for the provider to go to the IN_SERVICE state before the controlled device list is valid. A ProvInServiceEv event gets delivered to an object that is implementing the ProviderObserver interface. Upon an orderly Cisco CallManager shutdown.


Note Implementing only the CiscoProviderObserver does not do enough; the observer must also get added to the provider with provider.addObserver(..). Applications must wait for a notification that the Provider is in service.


Shutdown

When an application calls provider.shutdown(), JTAPI loses communications permanently with the Cisco CallManager, and a ProvShutdownEv event gets delivered to the application. The application can assume that the Provider will not come up again and the application must handle a complete shutdown.

Provider.getTerminals()

This method returns an array of terminals that are created for the devices that are administered in the user control list in the directory. Refer to the Cisco CallManager Administration Guide to administer the user control list.

Provider.getAddresses()

This method returns an array of addresses that are created from the lines that are assigned to the devices that are administered in the user control list in the directory.

Changes to the User Control List in the Directory

If a device is added to the user control list after the JTAPI application starts, a CiscoTermCreatedEv, and the respective CiscoAddrCreatedEv, gets generated and sent to observers that are implementing the CiscoProviderObserver. In addition, applications can monitor the current registration state of the controlled devices, and dynamically track the availability of these devices. The events for an in-service Address or Terminal get delivered to observers that are implementing the CiscoAddressObserver and the CiscoTerminalObserver.


Note Implementing only the observers does not do enough; the observers must also get added by address.addObserver(..) and, similarly, for the terminal by the terminal.addObserver(..) method.



Note Before invoking the call.connect() method, add a CallObserver to the address or terminal that is originating the call. Otherwise, the method returns an exception.


Addresses and Terminals

The Cisco IP Telephony Solutions architecture includes three fundamental types of endpoints: telephone sets, virtual devices (media termination points and route points), and gateways. Of these endpoints, only telephones and media termination points get exposed through the Cisco JTAPI implementation.

Cisco CallManager allows users to configure telephones to have one or more lines, dialable numbers, which multiple telephones may share simultaneously, or lines can be configured for exclusive use by only one telephone at a time. Each line on a telephone can terminate two calls simultaneously, one of which must be on hold. This operation acts in a similar way to the operation of the "call waiting" feature on home telephones. Figure 1-1 "Telephone Diagram" shows two configurations, Peter and Mary share one telephone line, 5001, while Paul has his own telephone line, 5002.

Figure 1-1 Telephone Diagram

Address and Terminal Relationship

A unique name identifies all types of Cisco CallManager endpoints. Telephone terminal hardware Media Access Control (MAC) address (such as, "SEP0010EB1014") identifies it, whereas the system administrator may assign any name to a media termination point, so long as its name is distinct. For each endpoint that a Provider controls, the Cisco JTAPI implementation uses its administered name to construct a corresponding Terminal object. Terminal objects in turn have one or more Address objects, each of which corresponds to a line on the endpoint. Figure 1-2 "Address and Terminal Relationship" shows a graphical representation of the relationship between Addresses and Terminals.

Figure 1-2 Address and Terminal Relationship

If two or more endpoints share a line (directory number), the corresponding Address object will be related to more than one Terminal object.


Note Cisco JTAPI does not support shared lines.


Unobserved Addresses and Terminals

Cisco JTAPI learns about calls only when a CallObserver attaches to the terminals/addresses of the Provider. This means that methods such as Provider.getCalls() or Address.getConnections() will return null, even when calls exist at the address, unless a CallObserver attaches to the address. The system also requires adding a CallObserver to the Address or Terminal that is originating a call via the Call.connect(..) method.

Connection

Connections retain their references to calls and addresses forever. So, a connection reference that is obtained from a call event can always be used to obtain the connection call (getCall()) and address (getAddress()).

TerminalConnection

TerminalConnections always retain their references to terminals and connections. So, a terminal connection reference that is obtained from a call event can always be used to obtain the terminal connection terminal (getTerminal()) and connection (getConnection()).

CiscoConnectionID

The CiscoConnectionID object represents a unique object that is associated with each connection in Cisco JTAPI. Applications may use the object itself or the integer representation of the object.

CiscoCallID

The Cisco CallID object represents a unique object that is associated with each connection in Cisco JTAPI. Applications may use the object itself or the integer representation of the object.

Threaded CallBacks

The Cisco JTAPI implementation design allows applications to invoke blocking JTAPI methods such as Call.connect() and TerminalConnection.answer() from within their observer callbacks. This means that applications do not get subjected to the restrictions imposed by the JTAPI 1.2 specification, which cautions applications against using JTAPI methods from within observer callbacks.

CiscoSynchronousObserver Interface

Applications can selectively disable the queuing logic of the Cisco JTAPI implementation by implementing the CiscoSynchronousObserver interface on their observer objects.

This asynchronous behavior does not adversely affect many applications. Applications that would benefit from a coherent call model during observer callbacks, however, can selectively disable the queuing logic of the Cisco JTAPI implementation. By implementing the CiscoSynchronousObserver interface on its observer objects, an application declares deliver synchronous events to its observers. Events that are delivered to synchronous observers will match the states of the call model objects that are queried from within the observer callback.


Note Objects that implement the CiscoSynchronousObserver interface must invoke blocking JTAPI methods from within their event callbacks. The consequences of doing so are unpredictable and may include deadlocking the JTAPI implementation. However, they may safely use the accessor methods of any JTAPI object, for instance Call.getConnections() or Connection.getState().


Querying Dynamic Objects

Beware of querying dynamic objects such as call objects. By the time you get an event, the object (such as, call) may be in a different state than the state that is indicated. For example, by the time you get a CiscoTransferStartEV, the transferred call may have removed all its internal connections.

callChangeEvent()

When the callChangedEvent() method is called, the validity remains guaranteed for any references that are contained in the event. For example, if the event contains a getConnection() method, the application can call this method and get a valid connection reference. Likewise, a getCallingAddress() method guarantees to return a valid Address object.

CiscoConsultCall

For the CiscoConsultCall interface, a reference to a consulting terminal connection gets retained forever. For example, when processing a CiscoConsultCallActive event, getConsultingTerminalConnection() guarantees to return a valid terminal connection reference. Further, the terminal connection guarantees to provide access to the consulting connection and thus the consulting call.

CiscoTransferStartEv

For the CiscoTransferStartEv, the references to the transferred call, transfer controller and final call in the event will be valid when callChangedEvent() is called. However, getConnections() may or may not return the connections on these calls.

Alarm Services

Part of the general serviceability framework for Cisco IP telephony applications includes support for sending alarms to a service. The com.cisco.services.alarm package defines the alarm components.

An alarm interface and framework support the sending of alarm notifications in XML over TCP to an Alarm Service that is available on the network in a Cisco JTAPI application. The alarm package includes the following features:

· XML definition of alarms, resolved by a catalog in the alarm service

· A bounded rollover queue to buffer alarms at the sender

· Alarm sending on a separate thread to avoid blocking at the sending application

· A TCP-based reconnection scheme to the alarm service

The overall framework of the Cisco JTAPI alarm system is similar to the existing JTAPI tracing package. Applications must instantiate an AlarmManager for a particular facility code from which alarm objects can be created. Part of the implementation includes DefaultAlarm and DefaultAlarmWriter implementation classes.

Application Control of JTAPI Parameters

The jtapi.ini file includes the various parameters that are required for configuring Cisco JTAPI. Cisco JTAPI looks for the presence of this file in the current Java classpath.

Cisco JTAPI also supports application setting of all the parameters Cisco JTAPI requires. This system allows a single point of application administration, independent of jtapi.ini. The jtapi.ini file provides a starting point for default values but client applications can modify different values without having to specifically modify the jtapi.ini file.

Applications obtain a CiscoJtapiProperties object from the CiscoJtapiPeer and make changes to the parameters by using the accessor and mutator methods. These properties, which apply peer-wide to all the providers that are derived from a CiscoJtapiPeer, must be set prior to the first getProvider () call on that peer.

Different instances of client applications, however, can impose different settings for these parameters. The com.cisco.jtapi.extensions package defines the CiscoJtapiProperties interface.

Jtapi.ini Parameters

Cisco JTAPI gets configured by using parameters in the jtapi.ini. These parameters get modified by using the Jtprefs application, which the Cisco JTAPI installer installs.

The following parameters apply to Cisco JTAPI:

#Cisco Jtapi version 1.4(1.7) Release .ini parameters

#Wed Oct 30 10:53:04 PST 2002

PROTOCOL_DEBUGGING=1

UseSameDirectory=1

JTAPIIMPL_DEBUGGING=1

UseSystemDotOut=0

QueueStatsEnabled=0

PeriodicWakeupInterval=50

RouteSelectTimeout=5000

UseTraceFile=1

ProviderOpenRequestTimeout=200

CtiManagers=cm-server1;cm-server2

Directory=SEAVIEWTraces

DEBUG=1

DesiredServerHeartbeatInterval=30

AlarmServicePort=1444

CTI_DEBUGGING=1

SyslogCollector=

JTAPI_DEBUGGING=1

PeriodicWakeupEnabled=0

NumTraceFiles=10

AlarmServiceHostname=

MISC_DEBUGGING=1

TracePath=.

UseAlarmService=0

CTIIMPL_DEBUGGING=1

WARNING=1

Traces=WARNING;INFORMATIONAL;DEBUG

INFORMATIONAL=1

UseSyslog=0

JtapiPostConditionTimeout=15

JTAPINotificationPort=789

FileNameBase=seaview

CtiRequestTimeout=30

TraceFileSize=1048576

Debugging=JTAPI_DEBUGGING;JTAPIIMPL_DEBUGGING;CTI_DEBUGGING;CTIIMPL_DEBUGGING;PROTOCOL_DEBUGGING;MISC_DEBUGGING

FileNameExtension=log

QueueSizeThreshold=25

ProviderRetryInterval=30

SyslogCollectorUDPPort=514

Dynamic Trace Enabling Using Jtprefs

You will generally want to turn off high-level debugging traces. Typically, tracing at full debug levels imposes a load on the system that is not desirable during normal system operation. For troubleshooting purposes, an administrator can turn tracing on or off dynamically.

Cisco JTAPI supports the dynamic enabling of traces from the Jtprefs administrative application. The application communicates with JTAPI by using a TCP socket and sends a signal to enable or disable the traces. For more details on dynamic tracing, refer to the Cisco CallManager Administration Guide. Ensure that the trace file generation is turned on before using dynamic tracing. If no trace files are being generated, dynamic tracing does not enable file generation. Dynamic tracing only enables or disables traces on an existing log file stream. By default, JTAPI enables file writing with all tracing levels off.

Supported Device Types

Cisco JTAPI supports the following device types:

30 SP+ (This device has spurious offhook problems—not recommended.)

12 SP+ (This device has spurious offhook problems—not recommended.)

12 SP (This device has spurious offhook problems—not recommended.)

7902

7905

7910

7912

7935

7960

7940

CTI Route Points

CTI Ports

VG248 Analog Devices

ATA 186 Analog Devices

Call Forward Setting

Cisco JTAPI supports setting the Call Forward feature according to the JTAPI Specification. Cisco JTAPI implementation does not support all the forwarding characteristics but supports only the FORWARD_ALL attribute for the Address. Applications can invoke setForwarding, getForwarding, and cancelForwarding methods on a CallControlAddress object, but the CallControlForwarding instruction can only be of type FORWARD_ALL.

Call Park

Cisco JTAPI supports user interactions with Call Park and reports the appropriate events to the applications. When a call is parked from an IP phone, the connection that belongs to the parking address moves into Disconnected state, and the associated TerminalConnection moves into Dropped state. A new connection in queued state for the park number gets created.

If an application is monitoring only the address that parked the call, then all existing connections get Disconnected, TerminalConnections get Dropped, and the call moves to Invalid state.

Park Retrieval

When a call is parked from an IP phone, the park number displays on the phone. Any terminal can unpark the call by dialing the park number. When a call is unparked, a new call gets created with connections to unparked address. The CallControlConnection for the park number in the original call, which is in the Queued state, moves to the Disconnected state.

Park Reminder

When a parked call is not retrieved for a specified time, a reminder call returns to the address that parked the call, and Park Number connection moves to the Disconnected state. The call reconnects and moves to the Established state. A terminal connection in Talking state gets created for the address that parked the call.

Park DN Monitor

CTI applications that are using Cisco JTAPI client can start monitoring the call park DNs by using the EnumerateParkDn interface. This action returns all the park DN lines in the system. Open all lines to receive parking activity. Applications receive Existing Call, New Call, and CallStateChanged events on the lines.

To stop monitoring the park DNs, applications can close all the opened park DN lines.

Public interface ICCNProvider

{

		public boolean canMonitorParkDNs();
		public java.util.Enumeration EnumerateParkDns () throws 
CCNException;
		public OpenParkDns( ICCNLineEvents) throws CCNException
		public CloseParkDns() throws CCNException
}

CiscoJtapiExceptions

Cisco JTAPI notifies application of CTI-generated error codes. These codes return when an exception or error occurs in the CTIManager. The CTI returned error code propagates to the application separately. The application can extract the error code by invoking getErrorCode() method on the exception object, can get CTI error code name by invoking getErrorName() method, and can get error description by invoking method getErrorDescription(). The methods getErrorName(int errorCode) and getErrorDescription (int errorCode) deprecate and will be removed in future releases. Cisco recommends that application users do not use these methods.

Cisco JTAPI Install Internationalization

Cisco JTAPI supports multiple languages for the JTAPI installation and user preference UI. When JTAPI launches, you receive options for choosing languages for the installation. After choosing a language, further installation instructions display in the chosen language. The first option always specifies English. If certain phrases are missing in the locale language, the instructions default to English. Refer to the Cisco JTAPI Installation Guide for more installation information.

Clear Calls Interface

Cisco JTAPI applications can clear phantom calls without dropping active calls. The CiscoAddress provides a clearCallConnections message to allow applications to clear the calls when no active calls exist on the Cisco CallManager.

Device Recovery

Cisco JTAPI supports automatic device recovery.

Device Recovery for phones

For devices such as the Cisco IP Phone 7960, the re-homing feature represents part of the device firmware. On a primary Cisco CallManager failure, the phone attempts to connect to the backup Cisco CallManager when it is no longer on a call. This transition gets communicated to applications in the form of out-of-service and in-service events that are described in theCTIManager Failure section.

For virtual devices with no firmware such as CTI Ports and CTI RoutePoints, the the CTIManager or Cisco JTAPI performs the failover.

CTI RoutePoints

On a Cisco CallManager server failure, the CTIManager recovers the device from the Cisco CallManager server group as defined in the device pool administration for the CTI RoutePoint. When the primary Cisco CallManager server recovers, the CTIManager attempts to recover the device on its primary Cisco CallManager. This re-homing happens when no more calls exist on the device, (similar to physical devices). On a CTIManager failure, Cisco JTAPI recovers the device on the backup CTIManager. The application receives notification the availability of a device with the CiscoAddrOutOfServiceEv and CiscoAddrInServiceEv events.

CTI Ports

CTI Ports that are registered by an application include a mechanism similar to phone devices. When the Cisco CallManager that is handling signaling for a CTIPort fails, the CTIManager recovers its services according to the device pool administration for this device. On a CTIManager failure, Cisco JTAPI reregisters the CTI Port after it connects to the backup CTIManager. The CiscoAddrOutOfServiceEv and CiscoTermOutOfServiceEv events and the corresponding in service events get sent after recovery of the CTI Port.

The application controls media streaming for these devices, and streaming continues even when the port is out of service. The application has responsibility to ensure that new calls do not get presented to the device until it is ready to accept them.

Directory Change Notification

Applications require notification asynchronously of device additions or deletions from the user control list and device deletions from the Cisco CallManager database. Applications also receive notification about line changes to a device. This notification is sent to Cisco JTAPI, propagates to applications with CiscoAddrCreatedEv, CiscoAddrRemovedEv, CiscoTermCreatedEv, and CiscoTermRemovedEv on the AddressObserver and TerminalObservers, respectively.


Note Ensure that the device is registered for CTIPorts and CTIRoutePoints to receive the line change notification.


Enable or Disable Ringer

The CiscoAddress extension allows applications to set the status of the ringer for all lines on a device. No events generate when the ringer setting gets changed from the administration pages or anywhere else.

Transfer and Conference Extensions

You may find that transfer and Conference events are difficult to understand in JTAPI. This happens because the participants are moved from one call to the other, JTAPI represents this action by deleting the parties from one call and adding them to the other call. It may confuse you for an application to receive an indication that a party dropped from the call when, in reality, it is in the process of being moved. The Cisco JTAPI implementation defines some extra events that make it easier for applications to deal with these functions.

Transfer

The transfer feature moves the participants of one call, the transferred call, to another call, the final call. Moving participants in a call results in their associated Connections transitioning to the DISCONNECTED state in the transferred call and new Connections for these participants being created in the final call. Similarly, any associated TerminalConnections transition into the DROPPED state in the transferred call and get created in the final call. Cisco extensions have by definition to mark the start and the end of the events that relate to transfer.

You can correlate the newly created connection objects with the old connection objects by use of the CiscoConnection.getConnectionID() method to obtain the CiscoConnectionID for the old and new connections. Matching connections have identical CiscoConnectionID objects when compared by using the CiscoConnectionID.equals() method.

CiscoTransferStartEv

This event indicates that the transfer operation started, and the events that follow relate to this operation. Specifically, Connections and TerminalConnections get both removed and added as a result of the transfer.

Applications may obtain the two calls that are involved in transfer-transferred call and final call and the transfer controller information from this event. If the JTAPI application is not observing the transfer controller, the transfer controller information does not get made available in this event.

CiscoTransferEndEv

This event indicates that the transfer operation has ended. After this event is received, the application can assume that all involved parties have transferred, and all Connections and TerminalConnections have moved to the final call.

Transfer Scenarios

In the following scenarios, A, B, and C represent three parties that are involved in the transfer.

Blind Transfer, Where B is the Transfer Controller

In blind transfer, a call that was answered already gets redirected without issuing separate consult and transfer commands.

A calls B on call Call1.

B answers and blind transfers the call to C.

In this scenario, a consult call (Call2) gets placed internally between B and C. To do this type of transfer, use the following JTAPI method:

Call1.transfer (C)

Table 1-1 lists the core events that observers for A and B receive between the CiscoTransferStartEv and the CiscoTransferEndEv:

Table 1-1 Core Events for Observers for A and B 

Meta Event Cause
Call
Event
Fields

META_UNKNOWN

Call1

CiscoTransferStartEv

transferredCall=Call2 finalCall=Call1 transferController=
TermConnB

META_UNKNOWN

Call2

CallObservationEndedE v

 

META_UNKNOWN

Call1

CiscoTransferEndEv

transferredCall=Call2 FinalCall=Call1 TransferController=
TermConnB

META_CALL_TRANSFERRING

Call1

TermConnDroppedEv B CallCtlTermConnDroppedEv B ConnDisconnectedEv B CallCtlConnDisconnectedEv B

 

META_CALL_TRANSFERRING

Call1

ConnCreatedEv C ConnAlertingEv C CallCtlConnAlertingEv C TermConnCreatedEv C TermConnRingingEv C CallCtlTermConnRingingEvImpl C

 

META_CALL_TRANSFERRING

Call2

TermConnDroppedEv B CallCtlTermConnDroppedEv B ConnDisconnectedEv B CallCtlConnDisconnectedEv B

 

META_CALL_TRANSFERRING

Call2

TermConnDroppedEv C CallCtlTermConnDroppedEv C ConnDisconnectedEv C CallCtlConnDisconnectedEv CCallInvalidEv

 

Consult Transfer, Where B is the Transfer Controller

In a consult transfer, applications can redirect calls to a different address and the transferrer can "consult" with the transfer destination before redirecting.

A calls B on call Call1.

B answers and consults to C on call Call2.

B transfers call Call2 to call Call1.

To do this type of transfer, use the following JTAPI methods:

Call2.setTransferEnable(true) (This optional method means transfer is enabled in the call object by default.)

Call2.consult(TermConnB, C)

Call1.transfer(Call2)


Note During consult transfer, Call1.transfer(Call2) will transfer the call but not Call2.transfer(Call1).


Table 1-2 lists the core events that observers of A and B receive between the CiscoTransferStartEv and the CiscoTransferEndEv:

Table 1-2 Core Events for Observers of A and B 

Meta Event Cause
Call
Event
Fields

META_UNKNOWN

Call1

CiscoTransferStartEv

transferredCall=Call2 finalCall=Call1 transferController=
TermConnB

META_CALL_TRANSFERRING

Call1

TermConnDroppedEv B CallCtlTermConnDroppedEv B ConnDisconnectedEv B CallCtlConnDisconnectedEv B

 

META_CALL_TRANSFERRING

Call1

ConnCreatedEv C ConnConnectedEv C CallCtlConnEstablishedEv C TermConnCreatedEv C TermConnActiveEv C CallCtlTermConnTalkingEv C

 

META_CALL_TRANSFERRING

Call2

TermConnDroppedEv B CallCtlTermConnDroppedEv B ConnDisconnectedEv B CallCtlConnDisconnectedEv B

 

META_CALL_TRANSFERRING

Call2

TermConnDroppedEv C CallCtlTermConnDroppedEv C ConnDisconnectedEv C CallCtlConnDisconnectedEv C CallInvalidEv C

 

META_UNKNOWN

Call2

CallObservationEndedEv

 

META_UNKNOWN

Call1

CiscoTransferEndEv

transferredCall=Call2 FinalCall=Call1 TransferController=
TermConnB


Arbitrary Transfer, Where A is the Transfer Controller

In an arbitrary transfer, one call can get transferred to another call, irrespective of how either call was created. Unlike consult transfer, no need exists to first create one of the calls by using the consult method.

A calls B on call Call1.

A puts Call1 on hold.

A calls C on call Call2.

A transfers Call1 to Call2.

To do this type of transfer, use the following JTAPI methods:

Call2.transfer(Call1) to transfer call Call1 to final call Call2, or

Call1.transfer(Call2) to transfer call Call2 to final call Call1

Assuming Call1.transfer(Call2) was called, Table 1-3 lists the core events that observers on A and C receive between CiscoTransferStartEv and CiscoTransferEndEv:

Table 1-3 Core Events for Observers of A and C 

Meta Event Cause
Call
Event
Fields

META_UNKNOWN

Call1

CiscoTransferStartEv

transferredCall=Call2 finalCall=Call1 transferController=
TermConnB

META_CALL_TRANSFERRING

Call1

TermConnDroppedEv B CallCtlTermConnDroppedEv B ConnDisconnectedEv B CallCtlConnDisconnectedEv B

 

META_CALL_TRANSFERRING

Call1

ConnCreatedEv C ConnConnectedEv C CallCtlConnEstablishedEv C TermConnCreatedEv C TermConnActiveEv C CallCtlTermConnTalkingEv C

 

META_CALL_TRANSFERRING

Call2

TermConnDroppedEv B CallCtlTermConnDroppedEv B ConnDisconnectedEv B CallCtlConnDisconnectedEv B

 

META_CALL_TRANSFERRING

Call2

TermConnDroppedEv C CallCtlTermConnDroppedEv C ConnDisconnectedEv C CallCtlConnDisconnectedEv C CallInvalidEv C

 

Conference

When conferencing two calls together, JTAPI specifies that all the parties from one call be moved to the other call. The call whose parties are moved away and that subsequently becomes invalid gets identified as the "merged" or "consult" call. The call to which the merged parties move gets identified as the "final" call hereafter. When parties move from the merged call to the final call, the application receives events that indicate that all parties dropped from the merged call and events that indicate that the parties reappeared on the final call.

To correlate the newly created connection objects with the old connection objects, use the CiscoConection.getConnectionID() method to obtain CiscoConnectionID objects for all old connections and all new connections. Matching connections will have identical CiscoConnectionID objects when compared by using the CiscoConnectionID.equals() method.

Conference support exists for

javax.telephony.callcontrol.CallControlCall.conference(Call)

javax.telephony.callcontrol.CallControlCall.getConferenceController()

javax.telephony.callcontrol.CallControlCall.getConferenceEnable()

javax.telephony.callcontrol.CallControlCall.setConferenceController(TerminalConnection)

javax.telephony.callcontrol.CallControlCall.setConferenceEnable(boolean)

Cisco Extensions

Cisco JTAPI implementation provides two extra events that signal the Start and End of Conference: CiscoConferenceStartEv and CiscoConferenceEndEv. These events get sent when Conference initiates and when it completes. They give handles to the final call, the merged conference (consult) call, and the two controlling TerminalConnections (in HELD and TALKING state).

CiscoConferenceStartEv

This event gets sent when call1.conference(call2) is invoked or if the Conference button is pressed for the second time on an IP phone. The ConferenceStartEv signifies the start of the merging process. A sequence of merging events that are reflected by the Conference process in Cisco CallManager follows.

CiscoConferenceEndEv

This event gets sent at the end of the merge process after a ConferenceStartEv is sent. It signifies the completion of the merge of the Consult (or Merged) call into the Final Conference Call. The Merged call specifies in INVALID state and an ObservationEndedEv gets sent for the call observer.

CiscoCall.setConferenceEnable()

The Cisco JTAPI implementation uses the CiscoCall.setConferenceEnable() and the CiscoCall.setTransferEnable() methods to control whether the consult call will be initiated via the conference or the transfer feature. If none of the features is enabled explicitly, transfer gets used by default.

Conference Scenarios

The following scenarios describe the two typical types of Conference that can be invoked.

Consult Conference with B as the Conference Controller

The following sequence of steps typically describes this scenario:

A calls B (Call 1).

B answers.

B Consults C (Call 2).

setConferenceEnable()

call2.consult(tc, C)

C answers.

B Completes Conference.

Call1.conference(Call2)


Note You must invoke the conference() method on the original call to complete a conference after a consultation. Invoking conference in the consult call object throws an exception.


Arbitrary Conference with B as the Conference Controller

The following sequence of steps typically describe this scenario:

A calls B (Call 1).

B answers.

B places the call on hold.

B calls C (Call 2).

C answers.

B Completes Conference.

Call1.conference(Call2) or

Call2.conference(Call1)

Conference Events

Table 1-4 provides the sequence of Core, Call control, and Cisco Extension events when Call1.Conference(Call2) is called:

Table 1-4 Sequence of Events 

Meta Event Cause
Call
Event
Fields

META_UNKNOWN

Call1

CiscoConferenceStartEv

consultCall = Call2
finalCall = Call1
conferenceController=TermConnB

META_CALL_MERGING

Call1

CallCtlTermConnTalkingEv B

 

META_CALL_MERGING

Call1

ConnCreatedEv C ConnConnectedEv C CallCtlConnEstablishedEv C TermConnCreatedEv C TermConnActiveEv C CallCtlTermConnTalkingEv C

 

META_CALL_MERGING

Call2

TermConnDroppedEv B CallCtlTermConnDroppedEv B ConnDisconnectedEv B CallCtlConnDisconnectedEv B

 

META_CALL_MERGING

Call2

TermConnDroppedEv C CallCtlTermConnDroppedEv C ConnDisconnectedEv C CallCtlConnDisconnectedEv C CallInvalidEv

consultCall=Call2
finalCall=Call1
conferenceController=TermConnB

META_UNKNOWN

Call2

CallObservationEndedEv

 

META_UNKNOWN

Call1

CiscoConferenceEndEv

 

Transfer and Conference Enhancement

All parties who are involved in the call transfer get sent CiscoTransferStartEv and CiscoTransferEndEv. All parties involved in the call conference get sent CiscoConferenceStartEv and CiscoConferenceEndEv. A call transfer still generates two events—the dropping of a connection to the first call and the creation of a connection to the second call. Cisco CallManager Release 3.1 changed this order of events. Connections first get created in the final call and then get dropped in the consult call.


Note In Cisco CallManager Release 3.0, not all parties who are involved in the transfer of calls received these events



Note Applications should not rely on the order of events between CiscoTransferStartEv and CiscoTransferEndEv or between CiscoConferenceStartEv and CiscoConferenceEndEv for transferring and conferencing when porting applications from Cisco CallManager Release 3.0 to 3.1.


Consult Without Media

Applications can inform Cisco CallManager that a consultation call for a transfer is being placed without establishing the media path. The system does not require establishing the media path for the intermediate call, if the consultation call is being placed to determine whether an agent is available before the actual transfer. The consultWithoutMedia method as defined in the CiscoConsultCall interface creates a consultation call without establishing the media path.


Note The consultation call may only be transferred. It cannot be conferenced.


Media Termination Extensions

The media termination feature allows applications to transmit and capture the bearer of a call, for example, audio or video. This action sometimes gets referred to as "rendering and recording" or "sourcing and sinking" media. It remains distinct from call control because media termination concerns the data that flows between endpoints in a call, not the details of setting up or tearing down calls. For example, an automatic call distributor (ACD) uses call control to route calls among available agents but does not terminate media. An interactive voice response (IVR) application, on the other hand, uses call control to answer and disconnect calls and uses media termination to play sound files to callers.

Although no telephony applications are solely interested in media termination, this feature always gets used in combination with call control. JTAPI 1.2 primarily represents a call control specification and offers very limited support for applications that require media termination. Because the Cisco IP Telephony Solutions platform supports media termination to a much greater degree than JTAPI standard, the Cisco JTAPI implementation extends JTAPI to add full support for this feature.

In Cisco JTAPI, software-based media termination occurs by using Computer Telephony Integration (CTI) ports. They include one or more lines (dialable numbers) that can be used to originate or receive calls. They however need a controlling application to provide the source and sink of the media. An application registers its interest in the media termination port with the Cisco CallManager. The Cisco CallManager then delivers all the events that relate this virtual device to the application. In Cisco JTAPI, CTI Ports get referred to as CiscoMediaTerminals. Figure 1-3 shows the CTI port configuration. For details about administering and configuring a CTI port, refer to the Cisco CallManager Administration web pages.

Figure 1-3 CTI Port Diagram

To implement a softphone application (where the PC acts as the telephone set, for example), the Cisco JTAPI application would manage a CTI port.

Cisco CallManager Media Endpoint Model

Endpoints represent the entities within the Cisco IP Telephony Solutions platform that terminate media, such as IP telephones and gateways. A call from one endpoint to another results in media flowing between the two endpoints. All endpoints in the Cisco IP Telephony Solutions platform transmit voice data by using real-time protocol (RTP). The Cisco IP Telephony Solutions telephones and gateways, for example, include built-in RTP stacks. Applications may also act as endpoints in a Cisco IP Telephony Solutions system; that is, they may terminate media. Because all Cisco IP Telephony Solutions endpoints use RTP, applications also must be able to transmit and receive RTP packets.

Payload and Parameter Negotiation

In addition to bearer data, payload, each RTP packet contains a header that helps endpoints to determine how to reassemble and decode a sequence of such packets into a media stream. RTP does not provide, however, a means for endpoints to negotiate which payload type to use for a particular stream. For example, audio data that is encoded by using the G.711 standard. Furthermore, RTP does not offer a means of negotiating unique payload type parameters such as the sampling rate of the encoded data or the number of samples that are to be transferred in each RTP packet. Instead, RTP usually gets used in conjunction with another protocol such as H.323, which specifies its own method for endpoints to negotiate these parameters. All such negotiation occurs prior to transmitting RTP packets between endpoints.

Cisco CallManager, not the endpoints, has responsibility for selecting the payload and encoding parameters for RTP streams. The following five steps that are involved in a typical bidirectional audio telephone call apply:

Initialization

Payload Selection

Receive Channel Allocation

Starting Transmission and Reception

Stopping Transmission and Reception

Initialization

Upon startup, each endpoint informs Cisco CallManager of its media capabilities, that is, G.711, G.723, G.729a, and so on. Startup for an IP phone for example, occurs when the phone is first turned on, or after it recontacts Cisco CallManager after losing its former connection. The endpoint cannot express a preference for one payload type versus another, but it can specify certain parameters for each payload type, such as, packet size.

The capability list that the endpoint registers remains exclusive and immutable. If the endpoint specifies that it can support both G.711 and G.723, it implicitly declares that it cannot support G.729a. Moreover, the endpoint must disconnect from Cisco CallManager and reinitialize to change the list of capabilities that it supports.

JTAPI applications perform this step by registering a CiscoMediaTerminal with Cisco CallManager. The CiscoMediaTerminal.register() method allows applications to supply an array of media capability objects for registration with Cisco CallManager. This step informs Cisco CallManager that the application will act as the endpoint for all calls to or from a particular directory number, as determined by the device configuration in the Cisco CallManager configuration.

Payload Selection

When a bidirectional media stream is about to be created between two endpoints, for instance, when a call is answered at an endpoint, Cisco CallManager selects an appropriate payload type (codec) for the media stream. Cisco CallManager compares the media capabilities of both endpoints that are involved in the call and selects the appropriate common payload type and payload parameters to use. The basis for payload selection includes endpoint capabilities and location, although other criteria may get added to this selection logic in the future. Endpoints do not get dynamically involved in selecting payload types on a call-by-call basis.

Receive Channel Allocation

If Cisco CallManager can find a common payload type for the RTP stream between the two endpoints, it requests that each endpoint create a logical "receive channel;" that is, a unique IP address and port at which the endpoint will receive RTP data for the call. Each endpoint returns an IP address and port to Cisco CallManager in response to this request.

Currently, only IP phones and gateways perform this step. Cisco CallManager requires JTAPI applications to specify a fixed IP address and port during initialization. Therefore, JTAPI applications cannot terminate more than one media stream simultaneously for the same endpoint. Applications that want to terminate multiple media streams must register multiple endpoints simultaneously.

If the endpoint does not respond to the open receive channel request quickly enough, Cisco CallManager disconnects the call. Because JTAPI applications always supply an IP address when registering CiscoMediaTerminals, calls to application-controlled endpoints do not get disconnected for this reason. However, if Cisco CallManager cannot find a common payload type between the two endpoints that are involved in the call, Cisco CallManager disconnects the call.

Starting Transmission and Reception

After Cisco CallManager receives channel information for both parties, it informs each endpoint of the codec parameters that it selected for the RTP stream and the destination address for the other endpoint. This information gets conveyed in two messages to each endpoint: a start transmission message and a start reception message.

JTAPI applications receive the CiscoRTPOutputStartedEv and CiscoRTPInputStartedEv events that contain all the codec parameters that are necessary for sending and receiving RTP data.

Stopping Transmission and Reception

When the RTP stream must be interrupted because of a feature such as hold or disconnect, Cisco CallManager requests that each endpoint stop its transmission and reception of RTP data. Just as when the media flow is started, the stop transmission and stop reception messages get sent separately.

JTAPI applications receive the CiscoRTPOutputStoppedEv and CiscoRTPInputStoppedEv.

CiscoMediaTerminal

In JTAPI, the terminal object represents the logical endpoint for a call and is presumed to be able to receive and transmit data (digital encoded voice samples, for example). Thus, terminals in JTAPI represent Cisco IP Phones. Even though gateways terminate media, terminals do not represent them. The CiscoMediaTerminals in particular represent a special kind of endpoint for which applications take responsibility for media termination.

The following four steps associate with using CiscoMediaTerminals:

Provisioning

Registration

Adding Observers

Accepting Calls

Provisioning

CiscoMediaTerminals, which are analogous to physical terminals, must be provisioned accordingly in Cisco CallManager, even though they do not represent actual hardware IP phones or gateways. Just as IP phones must be added to Cisco CallManager database by using the Device Wizard, CiscoMediaTerminals get added the same way, so Cisco CallManager can associate the application endpoint with a directory number and other call control properties such as call forwarding. No device type called "CiscoMediaTerminal" exists in the DeviceWizard. Instead, Cisco CallManager has one or more device types that support application registration—each of these types get exposed as a CiscoMediaTerminal through JTAPI. Currently, only the device type "CTI port" represents a CiscoMediaTerminal in JTAPI.

The following procedure lists the steps for provisioning a CTI port for use as an application-controlled endpoint.

Procedure


Step 1 Within the Cisco CallManager configuration web pages, add a "CTI port" device from the Device-Phone web page by using the Device Wizard. The CTI port device name specifies the name of the corresponding CiscoMediaTerminal in JTAPI.

Step 2 Add the new CTI port device, by using the User-Global Directory web page, to the list of devices that the application controls by using the User web page.


For more information, refer to the Cisco CallManager Administration Guide.

Registration

After a media termination device is properly provisioned in Cisco CallManager, the application may obtain a reference to the corresponding CiscoMediaTerminal object by using either the Provider.getTerminal() method or CiscoProvider.getMediaTerminal() method. The the two methods differ in that the CiscoProvider.getMediaTerminal() method only returns CiscoMediaTerminals, whereas Provider.getTerminal() will return any terminal object that is associated with the provider, including those representing physical IP phones.

Use the CiscoMediaTerminal.register() method to notify Cisco CallManager of their intent to terminate RTP streams of certain payload types. The CiscoMediaTermina.register() method takes an IP address, a port number, and an array of CiscoMediaCapability objects that indicate the types of codecs that are supported by the application as well as codec-specific parameters.

The IP address and port indicate the address where the application desires to receive media streams. The following sample code demonstrates how to register a CiscoMediaTerminal and bind it to a local address, port number 1234:

CiscoMediaTerminal registerTerminal ( Provider provider, String 
terminalName ) {
   final int PORT_NUMBER = 1234;
   try {
      CiscoMediaTerminal terminal = provider.getTerminal ( 
terminalName );
      CiscoMediaCapability [] caps = new CiscoMediaCapability [1];
      caps[0] = CiscoMediaCapability.G711_64K_30_MILLISECONDS;
      terminal.register ( InetAddress.getLocalHost (), PORT_NUMBER, 
caps );
   }
   catch ( Exception e ) {
       return null;
   }
}

For this sample code to work, the specified provider must be IN_SERVICE. Further, note that this code uses the constant CiscoMediaCapability.G711_64K_30_MILLISECONDS. This actually represents a static reference to a CiscoG711MediaCapability object that specifies a 30-millisecond maximum RTP packet size. The CiscoMediaCapability class predefines this and other common media formats.

To specify a media payload that is not listed in the CiscoMediaCapability class, two options exist. If the desired payload type is a simple variation of one of the existing subclasses of CiscoMediaCapability, you only need to construct a new instance of the subclass. For instance, if an application is willing to support G.711 payloads with a 60-millisecond maximum RTP packet size, it can construct the CiscoG711MediaCapability object directly, specifying 60 milliseconds in the constructor.

On the other hand, if no existing subclass of CiscoMediaCapability that matches the desired payload type exists, construct an instance of the CiscoMediaCapability class directly. The maximum packet size, for example, 30-milliseconds, represents the only other parameter that may be specified when constructing a CiscoMediaCapability. The following code illustrates registering a custom payload capability:

CiscoMediaTerminal registerTerminal ( Provider provider, String 
terminalName ) {
   final int PORT_NUMBER = 1234;
   try {
      CiscoMediaTerminal terminal = provider.getTerminal ( 
terminalName );
      CiscoMediaCapability [] caps = new CiscoMediaCapability [1];
      caps[0] = new CiscoMediaCapability (
         RTPPayload.G728,
         30    // maximum packet size, in milliseconds
         );
      terminal.register ( InetAddress.getLocalHost (), PORT_NUMBER, 
caps );
   }
   catch ( Exception e ) {
       return null;
   }
}

The payload type parameter that is used for constructing the CiscoMediaCapability object corresponds to the payload field in the RTP header. The RTPPayload interface defines a number of well-known payload types for this purpose.

Adding Observers

To receive events that indicate where and when to transmit and receive RTP data, place a CiscoTerminalObserver on the CiscoMediaTerminal. The CiscoTerminalObserver extends the standard JTAPI TerminalObserver interface without defining any new methods; it provides a marker interface that signals the application interest in receiving RTP events.


Note Because this is a TerminalObserver, not a CallObserver, it must be added by using the Terminal.addObserver() method, not the Terminal.addCallObserver() method.


Additionally, add a CallControlCallObserver to the Address object that is associated with the CiscoMediaTerminal. This guarantees that the application will get notified when calls are offered to the CiscoMediaTerminal. Unlike regular IP phones, which automatically accept any offered call, CiscoMediaTerminals accept, disconnect (reject), or redirect any call that is offered to it. Because the CallCtlConnOfferedEv is only presented to CallControlCallObservers that are placed on Address objects, not Terminal objects, the application places its CallControlCallObserver in the correct place.


Note Be sure to implement the CallControlCallObserver interface, not just the CallObserver interface; the CallCtlConnOfferedEv will not get delivered to observers that implement only the core CallObserver interface.


Accepting Calls

When an inbound call arrives at the CiscoMediaTerminal's address, it must be accepted by using the CallControlConnection.accept() method before a terminal connection gets created. This process does not apply for outbound calls —the connection will occur in the CallControlConnection.ESTABLISHED state as soon as the call progresses beyond digit recognition. After the connection is accepted, answer the ringing terminal connection to start media flow. Assuming that Cisco CallManager can match the capabilities that were registered with the capabilities of the calling endpoint, Cisco CallManager sends the Media Flow events, so the application can begin transmitting and receiving RTP data.

Receiving and Responding to Media Flow Events

Whenever a media stream must be created between two endpoints, Cisco CallManager issues start transmission and start reception events to both endpoints. In JTAPI, the CiscoRTPOutputStartedEv and CiscoRTPInputStartedEv events represent the start transmission and start reception events. The CiscoRTPOutputStartedEv.getRTPOutputProperties() method returns a CiscoRTPOutputProperties object, from which the application can determine the destination address of its peer endpoint in the call, as well as the other RTP properties for the stream such as payload type and packet size. Similarly, the CiscoRTPInputStartedEv.getRTPInputProperties() method returns a CiscoRTPInputProperties object that informs the application of the RTP characteristics for the inbound stream.

At any time while media is flowing, the current CiscoRTPOutputProperties and CiscoRTPInputProperties also remain available from the CiscoMediaTerminal.getRTPOutputProperties() and CiscoMediaTerminal.getRTPInputProperties() methods as well. These methods throw an exception if the CiscoMediaTerminal is not currently supposed to transmit or receive media.

When Cisco CallManager wants the application to stop sending or receiving media as the result of a call disconnecting or being put on hold, for example, it sends the CiscoRTPOutputStoppedEv and CiscoRTPInputStoppedEv events. These events mean that the current RTP media stream that exists between the two endpoints should be torn down.

Inbound Call Media Flow Event Diagram

Table 1-5 illustrates the dialogue between Cisco CallManager and a JTAPI application when a call is presented to an application-controlled endpoint. The events in the left column represent JTAPI events that are sent to the CallObserver of the application, and the requests in the left column represent methods that the application invokes.

Table 1-5 Inbound Media Flow Event 

JTAPI Event
Direction
Application Request

CallActiveEv

ConnCreatedEv

ConnProceedingEv

CallCtlConnOfferingEv

--->

 
 

<---

CallControlConnection.accept ()

CallCtlConnAlertingEv

TermConnCreatedEv

TermConnRingingEv

--->

 
 

<---

TerminalConnection.answer ()

ConnConnectedEv

CallCtlConnEstablishedEv

TermConnTalkingEv

CiscoRTPOutputStartedEv

CiscoRTPInputStartedEv

   
 

<---

CallControlConnection.disconnect ()

CiscoRTPOutputStoppedEv

CiscoRTPInputStoppedEv

TermConnDroppedEv

CallCtlConnDisconnectedEv

--->

 


Note Table 1-5 shows JTAPI events for the local connection, that is, for the application endpoint. The actual JTAPI metaevent stream will contain events that describe the state of the calling party.


Cisco IP Telephony Solutions RTP Implementation

The Cisco IP Telephony Solutions architecture puts a premium on performance, and thus Cisco IP Telephony Solutions phones and gateways do not implement some of the features of RTP and its often-associated real-time control protocol (RTCP). To ensure its compatibility, applications must consider the following points:

Because RTCP is not supported. Cisco IP Telephony Solutions endpoints will not send RTCP messages, and they will ignore any such messages that are sent to them.

Cisco IP Telephony Solutions endpoints do not currently make use of the synchronization source (SSRC) field in the RTP header but may in the future. Applications must not multiplex RTP streams by using the SSRC field, or phones and gateways may not correctly decode and present the media.

Redirect

JTAPI 1.2 specifies that one of the preconditions of the CallControlConnection.redirect() method is for the state of the connection to be in either the CallControlConnection.OFFERING or the CallControlConnection.ALERTING state. Cisco JTAPI also allows a connection in the CallControlConnection.ESTABLISHED state to be redirected.

The redirect() method includes the following overloaded form in the CiscoConnection interface. It allows applications to specify the behavior that is desired when a failure occurs while redirecting a call, specifying the calling search space, or resetting the original called field.

Applications choose the desired behavior, by passing one of the following INT parameters in the overloaded redirect method from the CiscoConnection interface:

Redirect drop on failure—When a call is directed to a busy or an invalid destination, Cisco CallManager can either drop the call if the redirect fails or leave the call at the redirect controller. The JTAPI application then has a chance to take corrective action, such as redirecting the call to another destination. The option for the redirect mode parameter follow:

CiscoConnection.REDIRECT_DROP_ON_FAILURE

CiscoConnection.REDIRECT_NORMAL

Calling Address search space—Redirect uses the calling search space parameter to indicate which callingSearchSpace is used. Applications can either use the calling party search space or the redirect controller search space. The parameter options for this scenario follow:

CiscoConnection.CALLINGADDRESS_SEARCH_SPACE

CiscoConnection.ADDRESS_SEARCH_SPACE

Resetting original called—The called address option parameter gets used to reset the original called fields. The options for this scenario follow:

CiscoConnection.CALLED_ADDRESS_UNCHANGED

CiscoConnection.CALLED_ADDRESS_SET_TO_REDIRECT_DESTINATION. This option affects the fields when the call arrives at the redirect destination.

For more information, refer to the com.cisco.jtapi.extensions.CiscoConnection documentation.

Routing

Routing in JTAPI requires the configuration of a CTI Route Point on the Cisco CallManager. Multiple calls can be queued to this Route Point, but only a single line can be configured on a CTI Route Point device.

JTAPI implementation of adjunct Routing as described in the call center package includes the following actions:

Registering route callbacks on Route Addresses

Creating appropriate handlers in response to the various routing events (routeSelect, routeEnd)


Note CTI Route Points represent devices that can process any number of incoming calls simultaneously on the same line. Calls may be routed by using the methods in the javax.telephony.callcenter package, or calls may be accepted, redirected, or disconnected by using the methods in the javax.telephony.callcontrol package. Each CTI Route Point may be configured with only one line in the Cisco CallManager. For details on how to configure and administer the CTI Route Point, refer to the Cisco CallManager Administration Guide.


Figure 1-4 shows the CTI Route Point configuration.

Figure 1-4 CTI Route Points

Cisco Route Session Implementation

When a call comes in to the RouteAddress, the implementation starts a Route Session thread and sends the application a RouteEvent. This thread in turn starts a timer thread to time the application response to a RouteEvent with either a routeSelect() or an endRoute(). If the application responds with a routeSelect (String[] selectedRoutes), JTAPI verifies that all preconditions are satisfied and then attempts to route the call to the first destination that is specified in the array. If the destination is a valid and available number, the call gets routed, and the application gets a RouteUsedEvent followed by a RouteEndEvent. Otherwise, if an error occurs in routing (which may be caused by an invalid/busy/unavailable destination), the application gets a ReRouteEvent. JTAPI starts the Timer Thread again before it sends the re-Route Event. Because Cisco CallManager does not support re-Routing, if the routing was unsuccessful, the caller will either receive a busy tone, or the call will get dropped. The application can clean up all failure instances and/or send JTAPI an endRoute to clean up the RouteSession. If the application does not respond with an endRoute(), the JTAPI timer once again expires, and JTAPI cleans up the Route Session by sending the application a RouteEndEvent().

If the routing timer expires before the application returns with a selectRoute() or an endRoute() method, the Cisco CallManager applies same treatment as when a call is made to an unregistered phone (that is play fast busy). If ForwardNoAnswer is configured on the Route Point, the call immediately forwards to that number when the timer expires.

If the application cannot respond with a valid address to which to route the call, the application may choose to call endRoute with an error. The JTAPI specification defines three errors in the RouteSession interface: ERROR_RESOURCE_BUSY, ERROR_RESOURCE_OUT_OF_SERVICE, and ERROR_UNKNOWN. If an endRoute is invoked on the RouteSession, the implementation currently accepts() the call at the RouteAddress, so the caller may begin to receive ringback. Thereafter, if forwarding is configured for the Route Point, the call gets forwarded when the Forwarding Timer expires.

Select Route Timer

Configure this timer via the JTAPI.ini configuration file that has a key called RouteSelectTimeout=5000. Use milliseconds as the unit. The default value for this timer specifies 5 seconds; however, depending on the needs of the application, you can extend or decrease this timer to improve Route Session cleanup efficiency. This timer should not be unreasonably large. Each Route Session as a thread represents a call to the Route Point, and these Route Sessions should be cleaned up. Should an application expect significant delays between receiving the Route Event and responding with a routeSelect/endRoute event, the application would want to appropriately extend this timer.

Forwarding Timer

The timer for Forward on No Answer that is currently system wide (that is, it applies to all devices on Cisco CallManager) can be configured via the Cisco CallManager Service Parameters configuration. The default value for this timer specifies 12 seconds. In future releases, a separate timer for CTI Route Points will be included, so Forwarding for the Route Point takes effect immediately after JTAPI accepts the call (when the application calls an endRoute or if the routing timer expires).

RouteSession Extension

CiscoRouteSession acts as a Cisco Extension to the JTAPI specification. Most importantly, this extension exposes the underlying Call object to the Applications. CiscoRouteSession.getCall() returns CiscoCall, and this call exposes other Call Model Objects such as the associated Addresses, Connections, and so on. The extension also defines additional errors for the application.

Caller Options Summary

In the absence of a callback or in the scenario RouteSession.routeSelect() or endRoute() has not responded to a routeEvent, the caller receives nothing until

The application can disconnect() or reject() the connection on the Route Point and thereby the caller receives a busy tone.

The application can accept the call, and then the Forward No Answer, if configured, will kick-in.

The application can drop the call. The caller holds the receiver with no clue about what happened.

With a callback, if the application chooses to call an endRoute(), after endRoute() returns, the caller receives a ringback until:

client calls a disconnect() that would drop the call.

The client redirects() the call.

The forward on no answer timer that is configured via the scm.ini will kick in and forward the call unless the preceding two options have already kicked in.

If no forwarding is configured for the Route Point, the caller continues to receives a ringback unless the first two options kick in.

Fault Tolerance When Using Route Points

One way for an application that uses route points to deal with fault tolerance requires connecting two JTAPI applications to two different Cisco CallManagers, each registering a different RouteAddress. For example, Application1 manages RouteAddress1 by using CallManager1. Application2 manages RouteAddress2 using CallManager2. In Cisco CallManager Administration, the ForwardNoAnswer configuration for these CTI Route Points must be administered so they point to each other. In this example, RouteAddress1 would have FNA=RouteAddess2, and RouteAddress2 would have FNA=RouteAddress1. If CallManager1 goes down, calls forward to RouteAddress2, so Application2 takes over. Furthermore, both applications could be configured to reconnect to the proper Cisco CallManager server when they receive a ProviderShutdown event.

Redundancy

Configuration requires that devices are configured into device pools and are assigned static Cisco CallManager groups. Devices register with a particular Cisco CallManager server that handles call control signaling. When a Cisco CallManager server fails, the devices failover to the backup Cisco CallManager server in the group. When the primary Cisco CallManager comes back online, it waits until no active calls exist on the device, then re-homes to the primary Cisco CallManager server. Cisco JTAPI informs the applications of this transition by sending a temporary out-of-service message while registering to the backup Cisco CallManager server.

Cluster Abstraction

The CTIManager provides a virtual representation of all the Cisco CallManagers in a cluster. Cisco JTAPI applications communicate with the CTIManager instead of with a specific Cisco CallManagers. The CTIManager also maintains connection between Cisco CallManagers in a cluster. This allows a provider to represent any devices in the cluster under the CTIManager. Figure 1-5 illustrates "Single-box Configuration with JTAPI, Cisco CallManager, and CTIManager in One Box." Figure 1-6 illustrates "Redundant Cisco CallManager and CTIManagers with JTAPI Deployed as a Separate Client."

For more details about the cluster administration and device pool settings, refer to the Cisco CallManager help pages.

Figure 1-5 Single-box Configuration with JTAPI, Cisco CallManager, and CTIManager in One Box

Figure 1-6 Redundant Cisco CallManager and CTIManagers with JTAPI Deployed as a Separate Client


Note In previous releases of Cisco CallManager, applications that are running on Cisco JTAPI could only control or monitor devices that are registered under a single Cisco CallManager. If a Cisco CallManager server went down, the connection between the Cisco CallManager server and JTAPI would terminate and the Provider would shut down. Cisco CallManager Release 3.1, introduced CTIManager service.


Cisco CallManager Server Failure

If a Cisco CallManager server fails, the associated devices re-home to the next Cisco CallManager server in the group. The prioritized list of Cisco CallManagers in the device pool information configuration for each device defines this process. Failure of a Cisco CallManager server only results in a partial outage of devices in the cluster. Those devices remain available following a successful Cisco CallManager failover and registration with a secondary Cisco CallManager.


Note A device such as a Cisco IP Phone 7960 fails over to a secondary Cisco CallManager server only when no active calls exist on that device. The failure of a Cisco CallManager server during a call results only in termination of observation of that device. The media path continues to exist but without any further call control features.


Cisco JTAPI communicates this partial outage to applications by using CiscoAddrOutOfServiceEv and CiscoTermOutOfServiceEv events. When the Cisco CallManager fails over, the device must successfully register to the secondary Cisco CallManager before the device is available to the JTAPI applications. Cisco JTAPI will send the CiscoAddrInServiceEv and CiscoTermInServiceEv events.

The Provider remains in service during this time. Devices on other Cisco CallManager servers remain available for call control. The events get sent on callbacks of the respective Address or Terminal observer objects. CiscoAddrOutOfServiceEv and CiscoAddrInServiceEv events get sent to an object that is implementing the AddressObserver and get added to an Address using the addressChangedEvent( ) callback object method. The CiscoTermOutOfServiceEv and CiscoTermInServiceEv events get sent to an object implementing the TerminalObserver interface and get added to a Terminal that is using the terminalChangedEvent( ) callback method.

If the devices are currently in a call, a CallObservationEnded message is sent on the CallObserver callChangedEvent() callback, followed by the CiscoAddrOutOfServiceEv and CiscoTermOutOfServiceEv messages.


Note Applications must monitor for and respond to the CiscoAddrOutOfServiceEv, CiscoTermOutOfServiceEv, CiscoAddrInServiceEv, and CiscoTermInServiceEv events before the calling call control functions on the Address or Terminal. Applications that do not support this may encounter unexpected errors because the applications do not know the exact state of the system.


Redundancy in CTIManagers

Cisco JTAPI also offers transparent applications for redundancy via the CTIManager. When the primary CTIManager fails, Cisco JTAPI automatically connects to the backup CTIManager and communicates the reconnection to applications. Instead of connecting to a single Cisco CallManager server, applications now connect to a set of CTIManagers. The applications supply the CTIManager server names when invoking JTAPI.

Cisco JTAPI and the CTIManager maintain bidirectional heartbeat signals to detect a loss of connectivity between them. The CTIManager detects when an application is no longer running and cleans up its allocated resources. Figure 1-7 illustrates the"Logical Representation of JTAPI, CTIManager and Cisco CallManager in a Cluster"


Note After Cisco JTAPI successfully connects to the primary CTIManager, it will alternately attempt to reconnect to the primary or backup CTIManager if the JTAPI connection to the CTIManager fails.


Figure 1-7 Logical Representation of JTAPI, CTIManager and Cisco CallManager in a Cluster

Invoking CTIManager Redundancy

When getProvider() method on the CiscoJtapiPeer is called during the application startup, Cisco JTAPI attempts a connection to the first CTIManager in the list and tries a connection to the next CTIManager if connection attempt fails with the first. If all the CTIManagers in the list are not available or if connection is refused by all CTIManagers, an exception gets sent to the application and no further reconnection attempts occur. After the first successful connection, Cisco JTAPI alternatively attempts to connect to the backup or primary CTIManager when a failure to CTIManager or connection to CTIManager is detected.

The list of redundant CTIManagers designates a comma-separated list that is passed into the CiscoJtapiPeer.getProvider(String providerString) method as a String. The usage for the providerString follows:

providerString = CTIManager;login=XXX;passwd=YYY;appinfo=ZZZ (Non-redundant feature)

providerString = CTIManager1,CTIManager2;login=XXX,passwd=YYY;appinfo=ZZZ (Redundant feature)


Note Because the appinfo parameter is optional, the application provides no specific appinfo parameter. Cisco JTAPI generates one from a JTAPI instance ID and the local host name.


Additionally, the jtapi.ini file may define different CTIManager lists to support the CiscoJtapiPeer.getServices() method. Cisco JTAPI accepts the following definition:

CtiManagers=<CTIManager1>,<CTIManager2>;<CTIManager3>

where

<CTIManager1>,<CTIManager2> specifies a redundant group.

<CTIManager3> specifies a nonredundant group.

CTIManager Failure

When Cisco JTAPI detects a loss of connection to a CTIManager, the application receives notification of this loss in service. The following events get sent to the application on the appropriate Observers:

A CallObservationEndedEv event gets sent to all Call Observers on an Address and calls in progress end. The calls get physically connected, but the application observation of the call ends because Cisco JTAPI cannot send call state changes.

A CiscoAddrOutOfServiceEv event gets sent to all Addresses on a Terminal and a CiscoTermOutOfServiceEv event gets sent to the Terminal.

This process repeats for all Terminals in the Provider user-controlled list. (A CiscoAddrOutOfServiceEv event gets sent only to the Addresses that have an active AddressObserver, and a CiscoTermOutOfServiceEv event gets sent only to Terminals with an active TerminalObserver.)

The Provider gets set in the out-of-service state, and the ProvOutOfServiceEv event gets delivered on any ProviderObserver callbacks present on the Provider.

Cisco JTAPI attempts a connection to the next CTIManager in the list and the ProvInServiceEv gets sent to the ProviderObserver, The devices previously registered under the application control get reinstated in the new CTIManager After the device is reinstated, CiscoAddrInServiceEv and CiscoTermInServiceEv events get sent to the application via the respective Observers. All previously added Observers are maintained. If any calls exist on the devices, a snapshot of the call gets sent to the respective CallObservers.

CTIPorts that were previously registered are reregistered with the same media parameters. RouteAddress call backs are maintained as before and these are recovered on the new CTIManager. No call snapshot, however, gets delivered to the RouteAddresses.

Heartbeats

Cisco JTAPI and the CTIManager maintain heartbeat signals to discover a failure in either the CTIManager or JTAPI. The CTIManager server controls the heartbeat parameters in the bidirectional heartbeat. Applications can request a desired server heartbeat interval when initializing Cisco JTAPI, but the CTIManager can override it.

Applications specify the desired heartbeat parameter by using DesiredServerHeartbeatInterval in the jtapi.ini setting.

Cisco JTAPI specifies the client's desired heartbeat interval during initialization. The CTIManager specifies to the client side heartbeat interval Cisco JTAPI and specifies the interval at which the server (CTIManager) will send heartbeats. A failure to receive heartbeat message over twice the server-specified interval results in a client-initiated teardown of the connection. To minimize heartbeat traffic, any messages from the client to the server or events from the server to the client substitute for a heartbeat.

Display Name Interface

The CiscoCall interface provides methods to get name displays of the calling party and the called party in a call. Applications can use getCurrentCallingPartyDisplayName() to get the display name of the calling party.

JTAPI applications can use the following interface to get the display names of the calling party and the called party.

{
..
..
	/**
	 *This interface returns the display name of the called party in 
the call.
	 *It returns null if display name is unknown.
	*/
	public String getCurrentCalledPartyDisplayName();

	/**
	 *This interface returns the display name of the calling party.
	 *It returns null if display name is unknown.
	*/
	public String getCurrentCallingPartyDisplayName();
}

The address objects store the display name internally and name gets updated when currentCallingAddress and currentCalledAddress are updated. NULL returns if the call is not in the active state and if currentCalling and currentCalled addresses of the call are not initialized.


Note The system does not support Call.getCurrentCalledAddress() and call.getCurrentCallingAddress() for conference calls. Also, the system does not support call.getCurrentCalledPartyDisplayName() and call.getCurrentCallingPartyDisplayName() for a conference call.


SetMessageWaiting Interface

SetMessageWaiting provides a method for applications gets to set the message waiting lamp or indicator for an address. The method is invoked on an address that is in the same partition as the destination.

The following interface specifies whether the message waiting indicator should be activated or deactivated for the address that the destination specifies. If enable is true, message waiting activates if not already activated. If enable is false, message waiting deactivates if not already deactivated.

{
public void setMessageWaiting (java.lang.String destination, boolean 
enable)
	throws		javax.telephony.MethodNotSupportedException,
			javax.telephony.InvalidStateException,
			javax.telephony.PrivilegeViolationException
}

Quite Clear

QuiteClear occurs at the other end when two parties are on a call and one address goes OutOfService because of a network outage, the Cisco CallManager goes down, application controlling CTIPort goes down, or CTIManager goes down. At this stage, the other end of the call can only drop the call or disconnect the connection. It cannot perform any other callControl operations.

For the party that went Out Of Service, applications will perceive ConnDisconnected/TermConnDroppedEvs and the other end of the call receives ConnFailedEv with CiscoCause of CiscoCallEv.CAUSE_TEMPORARYFAILURE.

If applications try to invoke the following features during Quite Clear mode, PlatformException with error code of CiscoJtapiException.CTIERR_OPERATION_FAILER_QUIETCLEAR gets thrown:

Consult transfer

Consult conference

Blind transfer

Hold

Unhold


Note Applications may only drop the call in this mode.


GetCallInfo Interface on Address

GetCallInfo interface on address provides applications with the ability to query CallInfo on an address. A query returns the CiscoAddressCallInfo object, which contains information about the number of active or held calls, maximum number of active or held calls, and the Call object for current calls on the address. This interface also specifies what calls are at a specific address at a specific time.

Use the following interface to get information about calls that are present at the terminal:

{ public CiscoAddressCallInfo getAddressCallInfo(Terminal iterminal);
}

DeleteCall Interface

DeleteCall interface provides applications the ability to delete a call that was created by using the createCall interface. This method accepts a call and throws an InvalidStateException if a provider is not in service or if the call is not in the IDLE state. DeleteCall moves the call to the INVALID state.

The following interface gets added to CiscoProvider:

{ public void deleteCall( Call call ) throws InvalidStateException;
}

Applications can use this interface to delete the call that was created by using createCall interface. This method accepts a call and throws an InvalidStateException if the provider is not in service or if the call is not in the IDLE state. DeleteCall moves the call to the INVALID state.

To successfully delete a call, the application creates the call by using createCall, and the call should be in the IDLE state.

GetGlobalCallID

GetGlobalCallID provides an interface on the CiscoCallID to get the nodeID and the Global Call ID (GCID ) of the call; this exposes the GCID information that is available in the internal call object.

The following methods get added to the CiscoCallID interface:

{	/**
	* returns the callmanager nodeID of the call
	*/
public int getCallManagerID();

	/**
	* returns the GlobalCallID of the call
	*/
public int getGlobalCallID ();
}

GetCallID in RTP Events

GetCallID provides an interface on RTP events to access any call information, such as calling party or called party, so applications can link RTP events with the calls.

The callLegID that is received in the RTP events from CTIManager gets used to determine the ICCNCall on the client side. This call passes on to the JTAPI layer, and the CiscoCall gets determined from which CiscoCallID is obtained. This information gets used to construct the RTP events that are delivered to the application.

The following interface gets added to CiscoRTPInputStoppedEv, CiscoRTPInputStartedEv, CiscoRTPOutputStoppedEv, and CiscoRTPOutputStartedEv:

{ public CiscoCallID getCallID();
}

XSI Object Pass Through

Applications can pass XML objects through JTAPI and CTI interfaces to the phone. The XML object can contain display updates, softkey update/enable/disable, and other types of updates on the phone that are available through IP phone services features. This allows applications to access IP phone service capabilities through JTAPI and CTI interfaces without maintaining independent connections to the phones.

CiscoTerminal Method

Applications can send an XSI object in the byte format to the Cisco IP Phone through the CiscoTerminal interface method. The payload is limited to 2000 bytes of data with this interface.

CiscoTerminal must be in the <CODE>CiscoTerminal.REGISTERED</CODE> state, its Provider must be in the <CODE>Provider.IN_SERVICE</CODE> state. Successful response indicates that the data that was pushed has arrived at the phone. However, note that the application cannot receive any XML back from the phone, including the CiscoIPPhoneResponse object from the push. If application request is not successful, PlatformException is thrown. Any request with more than 2000 bytes of data is rejected.

public String sendData ( String terminalData ) throws InvalidStateException, MethodNotSupportedException;

Before the application can make use of this feature, it must add TerminalObserver on the Terminal.

Authentication and Mechanism

Sending an HTTP POST request to the phone web server, which requires the phone IP address, performs an object push. The web server parses the request, authorizes the request through the HTTP returned to the Cisco CallManager, executes the request, and returns and XML response to the application indicating the success or failure of the request.

With XSI, the IP phone services object gets sent directly to the phone by the Skinny Client Control Protocol (SCCP). The phone does not authenticate the request, since the JTAPI client is trusted, and does not require the phone IP address. For more information on actual XML contents, please refer to the Cisco IP Phone Services Application Development Notes.

VG248 and ATA 186 Analog Phone Gateways

Cisco JTAPI supports control of analog phone that are connected to the VG248 and ATA 186 Analog Phone Gateways. By adding the VG248 and ATA 186 Analog Phone Gateways to the user-controlled list, applications can control the devices.

Applications receive events for the devices in a way similar to other IP phones. Applications can also initiate calls and invoke other features except answer Request through APIs. Make call works only when the device goes physically offhook.

Applications cannot answer calls from APIs for the devices. If an application attempts to answer () on TerminalConnection for the VG248 and ATA 186 Terminal, the system throws PlatformException with error CiscoJtapiException.COMMAND_NOT_IMPLEMENTED_ON_DEVICE. To answer calls, you must manually pick up the handset and then you can invoke other call control features such as transfer, conference, blind transfer, and park from the API.