Developer Guide
Abbreviations
Short Name | Full Name |
CC | CUCM Connector |
GC-Client | Generic Connector Client Application |
AMQ | ActiveMQ |
Introduction
Purpose of this document
The purpose of this document is to assist CUCM Connector client applications developers to understand the flow of messages between CC and CC-Client.
Before You Start
You’re expected to have a good understanding of JMS and broker-based communication using ActiveMQ. You should know what are Topics and Queues, what is the difference between them, and how they can be used in different contexts. While you are exploring ActiveMQ, many questions arise in your mind and those are answered here.
Apache ActiveMQ is the most popular and powerful open source messaging and Integration Patterns server.
Apache ActiveMQ is fast, supports many Cross Language Clients and Protocols, and comes with easy-to-use Enterprise Integration Patterns and many advanced features while fully supporting JMS 1.1 and J2EE 1.4. Apache ActiveMQ is released under the Apache 2.0 License
First of all, download, install and run ActiveMQ Broker. You can find some samples on the ActiveMQ site. A basic Hello World program can be found here. You can find more complex examples here. All of these examples are implemented in java. If you are writing clients in a language other than Java, you can find examples in the respective technology on the ActiveMQ site.
ActiveMQ supports different types of topologies for communication. GC is using a Client-Server topology with TCP protocol for communication. You need to develop at least a simple application that communicates on given specifications.
CUCM Connector Communication Architecture
<Make diagram here showing CC-Client, CC, AMQ, CUCM>
- Describe a little bit about broker-based communication using AMQ
- On which protocol and ports CC communicate with AMQ
- The client is expected to subscribe to AMQ <Topic>Destination
- GC listens on AMQ <Queue>Destination
A message broker is an intermediary program module that translates a message from the formal messaging protocol of the sender to the formal messaging protocol of the receiver. Message brokers are elements in telecommunication or computer networks where software applications communicate by exchanging formally-defined messages. Apache ActiveMQ is fast, supports many Cross Language Clients and Protocols, and comes with easy-to-use Enterprise Integration Patterns.
CC uses ActiveMQ as a message broker for communication. By default, CC communicates with AMQ on port 61616 (openwire) using TCP protocol. You can change port in AMQ configurations. CC listens on Queue “Connector1”, all the commands from the client should be published to Queue “Connector1” and CC replies on Topic, specified by the client in the Hello command.
Message Pattern
CC communicates via AMQ that follows simple open text JMS messaging over OpenWire. A message could either be a request/command from the CC-Client or it could be an event/response sent by CC. In the rest of the document, the term “Command” is used to mention the message sent by the CC client, and the term “Event” is used to mention the message sent by CC.
Command Pattern
In a Command, JMS-Type contains the command and JMS-Body contains command arguments.
Commands are grouped into categories for the sake of clean and easier-to-interpret documentation.
Command Pattern | |
JMS-Type | <Command>#{<Agent_ID> | <Client_Destination>} |
JMS-Body | [ NULL | {Argument-1, Argument-2, …, Argument-N} ] |
Where
- <Command> is any of the supported commands. See All Commands
- <Agent_ID> is the agent’s login ID
- <Client_Destination> is the ActiveMQ topic which GC-client is subscribed on. On this AMQ Topic, GC will send all events to GC-Client
- In the JMS-Body, NULL represents an empty string and NOT a “NULL” string. If no command argument is needed, set the value to an empty string.
- Multiple Command arguments are mentioned in a comma-separated string.
Event Pattern
An Event is a message sent by GC in response to any command!
There are two patterns being used for the event listening!
Default Pattern
Event Pattern | |
JMS-Type | [ NULL ] |
JMS-Body | [ <Event_For>#<Event_Type>#[ {<Argument-1>}{#<Argument-2>}…{#<Argument-N>} ] |
<Event_For> | Possible values are:
|
<Event_Type> | The actual event. See All Events |
Where
- JMS-Type carries nothing (An empty String)
- JMS-Body contains the complete event
- <Argument-N> represents event arguments. Event Arguments are separated by #
JSON Pattern
An event is actually a JSON packet sent to the topic!
Error Pattern
If any command from client encountered by some error, GC will event contains error details.
Error Event Pattern | |
JMS-Type | NULL |
JMS-Body | <Error_For>#Error#<Error Details> |
<Error_For> | Possible values are:
|
<Error Details> | Details about the error. See All Errors |
Client Communication Use Cases
There may be 2 types of CC-Clients:
- Desktop client - running one instance per agent like MS-CRM USD Client
- Server client - moderating and communicating on behalf of multiple agents per server as in the case of Siebel SCAPI Driver, SAP IC, etc.
Establish Connection
The client application must ensure the proper establishment of a connection with CC before invoking any agent operations.
To establish a connection with CC via AMQ,
- CC-Client should create an AMQ topic (Client Destination) where this client will listen.
- For a Desktop client, this should be unique for every client instance.
- For a Server client, this should be unique for every server instance.
- Create an AMQ producer with Destination <Queue> name Connector1 to send commands.
- Send Hello Command
- If GC-Client receives System#IN_SERVICE, the GC is assumed to be connected and ready to listen.
Note: If CC-Client doesn’t receive System#IN_SERVICE after CONNECT_TIMEOUT (Max. 3 seconds suggested) period, it should periodically keep sending the Hello command.
All Commands
Following is the list of all possible commands supported by CC. Each of the commands is explained with parameters supplied, events expected against the command, and possible errors that can occur for that particular command.
Note: While sending a command message, set the value for the property Time To Live for the message to a certain time(milliseconds), after the specified time that message/command will automatically be discarded by AMQ. It needs to do so that the old command should not be processed.
CC supports synchronous requests. To achieve this, you need to send JMSCorrelationID along with the command, CC will send the same JMSCorrelationID with the event that corresponds to that particular command.
Set ReplyTo attribute of command message to the topic on which the client is subscribed to receive events.
Hello
Hello is the first command sent from Client to CC for handshake purposes. If CC replies with some event mean that your connection with CC has been established and the client is able to send further commands to CC. If the client does not receive any response from CC, either CC is dead or the command is not delivered to CC. Before sending a Hello command you should know on which topic the client will listen from CC. You need to create that topic on ActiveMQ explicitly and subscribe to it. Specify that particular topic in the hello command as <Client_Destination> parameter. If the client receives System#IN_SERVICE, you can supply further commands to CC (other than the hello command). Normally, Connect and Login commands are sent after a successful handshake to CC in order to start your session (Make and receive calls). If the client receives System#OUT_OF_SERVICE or no response from CC, keep sending the hello command.
Command: Hello | |
JMS-Type | Hello#<Client_Destination> |
JMS-Body | |
<Client_Destination> | ActiveMQ Topic name on which CC will send events to the client. The client should subscribe to this Topic in order to receive the events. |
Expected Event (s) Default Formate | There can be two possible events: System#IN_SERVICE: GC is connected to CUCM and can process commands. You can send further commands to GC. System#OUT_OF_SERVICE: GC is not connected to CUCM. Your commands will not be processed by GC. You are expected to send the Hello command continuously until you didn’t receive System#IN_SERVICE. |
Login
The Login command is used to actually log in to CUCM. This command actually registers the IP phone with CUCM. Login command parameters are agent extension, dummy_value, and dummy_value. In case of a successful login, CC raises Agent Info, AgentState, and Dialog state events. Now the agent will be able to make and receive calls on the client application.
Command: Login | |
JMS-Type | Login#<agent_extension> |
JMS-Body | <client_destination> |
<agent_extension> | Agent extension of the IP Phone |
Expected Event (s) | Three events will be sent: |
Possible Error (s) | The following errors are possible: |
Logout
The Login command is used to actually log in to CUCM. This command actually registers the IP phone with CUCM. Login command parameters are agent extension, dummy_value, and dummy_value. In case of a successful login, CC raises Agent Info, AgentState, and Dialog state events. Now the agent will be able to make and receive calls on the client application.
Command: Login | |
JMS-Type | Logout#<agent_extension> |
JMS-Body | |
<agent_extension> | Agent extension of the IP Phone |
Expected Event (s) | Three events will be sent: |
Possible Error (s) | The following errors are possible: |
Make a Call
This command allows a user to make a call. Source IP phone diales the destination extension and make a call.
Command: MakeCall | |
JMS-Type | MakeCall#<agent_login_Id> |
JMS-Body | <Extension_Number> |
<agent_login_Id> | Extension number of the source IP Phone |
<Extension_Number> | Extension of the other IP Phone. |
Expected Event (s) | The following events will arrive: |
Possible Error (s) |
Answer a Call
This command allows a user to answer an incoming call. Via NEW INBOUND Call event, we receive the details about the other extension.
Command: AnswerCall | |
JMS-Type | AnswerCall# <agent_login_Id> |
JMS-Body | <ConnectionId> |
<agent_login_Id> | Extension Number of the logged agent. |
<Coonectid_ID> | Id of the call connection, to whom we have to receive the call |
Expected Event (s) | The following events will arrive in a sequence: |
Possible Error (s) |
Release a Call
This command allows a user to drop a call.
Command: ReleaseCall | |
JMS-Type | ReleaseCall# <agent_login_Id> |
JMS-Body | <ConnectionId> |
<agent_login_Id> | Extension Number of the logged agent. |
<Dialog_ID> | Id of the call connection, to whom we have to release the call |
Expected Event (s) | The following events will arrive in a sequence: |
Possible Error (s) |
Hold a Call
This command allows a user to drop a call.
Command: ReleaseCall | |
JMS-Type | HoldCall# <agent_login_Id> |
JMS-Body | <ConnectionId> |
<agent_login_Id> | Extension Number of the logged agent. |
<Coonection_ID> | Id of the call connection, to whom we have to Holdthe call |
Expected Event (s) | The following events will arrive in a sequence: |
Possible Error (s) |
Retrieve a Call
This command allows a user to drop a call.
Command: ReleaseCall | |
JMS-Type | RetrieveCall# <agent_login_Id> |
JMS-Body | <ConnectionId> |
<agent_login_Id> | Extension Number of the logged agent. |
<Coonection_ID> | Id of the call connection, to whom we have to retrieve the call |
Expected Event (s) | The following events will arrive in a sequence: |
Possible Error (s) |
Blind Transfer
This command allows a user to transfer the call blindly without waiting for the other agent to receive the call.
Command: BlindTransfer | |
JMS-Type | Transfer_sst# <agent_login_Id> |
JMS-Body | <Other_Party_Extension_Number>,<ConnectionId> |
<agent_login_Id> | Extension Number of the logged agent. |
<Connection_ID> | Id of the call connection, to whom we have to transfer |
<Other_Party_Extension_Number> | Extension of the other agent. |
Expected Event (s) | The following events will arrive:
|
Possible Error (s) |
Consult Call
This command allows a user to initiate a consult call with another agent. Once the call is accepted by the other agent, the user can either transfer this call to the other agent or can initiate the conference call between all parties.
Command: CosultCall | |
JMS-Type | ConsultCall#<agent_login_Id> |
JMS-Body | <Other_Party_Extension_Number>,<ConnectionId> |
<agent_login_Id> | Login id of the agent. |
<Connection_ID> | Id of the call connection, to whom we have to transfer |
<Other_Party_Extension_Number> | Extension of the other agent. |
Expected Event (s) | The following events will arrive:
|
Possible Error (s) |
Consult Transfer
This command allows a user to transfer the customer call to the consulted agent. This will drop the consult call between agents and transfer the customer call to the other agent.
Command: TransferCall | |
JMS-Type | TransferCall#<agent_login_Id> |
JMS-Body | <Connection_ID> |
<agent_login_Id> | Login id of the agent. |
<Connection_ID> | ID of new inbound call (Main Call Dialog Id) |
<Agent_Extension> | Extension of the agent. (Extension of the 2nd agent) |
Expected Event (s) | The following events will arrive:
|
Possible Error (s) |
Conference Call
This command allows a user to initiate the conference call with the customer and the consulted agent.
Command: ConferenceCall | |
JMS-Type | Conferencecall#<agent_login_Id> |
JMS-Body | <Dialog_ID> |
<agent_login_Id> | Login id of the agent. |
<Dialog_ID> | The ID of new inbound call (Main Call Dialog Id) |
Expected Event (s) | The following events will arrive:
|
Possible Error (s) |
GetState
This command allows a user to drop a call.
Command: ReleaseCall | |
JMS-Type | GetState# <agent_login_Id> |
JMS-Body | |
<agent_login_Id> | Extension Number of the logged agent. |
Expected Event (s) | The following events will arrive in a sequence: |
Possible Error (s) |
All Events
System#IN_SERVICE
System#IN_SERVICE is the event that a client connected to CC receives frequently. Normally it is the response of Hello or Beat commands. It indicates that the GC is connected to CUCM and can perform actions in response to the command.
Default Format
Event: System#IN_SERVICE | |
JMS-Type | NULL |
JMS-Body | System#IN_SERVICE |
Event Category | System |
JSON Format
Attribute | Value | Description | JSON Payload |
type | System | Name of the event type | System
JS
|
status |
| Status of the CUCM |
System#OUT_OF_SERVICE
Normally it is the response of Hello or Beat commands. It indicates that the GC is not connected to CUCM and is unable to perform an action in response to the commands. After sending this event, GC will stop receiving further commands from clients. The client should send Hello until it didn’t receive System#IN_SERVICE.
Default Format
Event: System#OUT_OF_SERVICE | |
JMS-Type | NULL |
JMS-Body | System#OUT_OF_SERVICE |
Event Category | System |
JSON Format
Attribute | Value | Description | JSON Payload |
type | System | Name of the event type | System
JS
|
status |
| Status of the CUCM |
Note: Above events can also be received in case of CUCM is down or up!
Terminal#CiscoTermInServiceEv \ Terminal#CiscoTermOutServiceEv
System#IN_SERVICE is the event that a client connected to CC receives frequently. Normally it is the response of Hello or Beat commands. It indicates that the GC is connected to CUCM and can perform actions in response to the command.
Default Format
Event: System#IN_SERVICE | |
JMS-Type | NULL |
JMS-Body | Terminal#CiscoTermInServiceEv |
Event Category | System |
JSON Format
Attribute | Value | Description | JSON Payload |
type | System | Name of the event type | System
JS
|
status |
| Status of the CUCM |
DialogState
DialogState describes the current state of the call. Normally CC sends this event during call state change.
Default Format
Event: State | |
JMS-Type | NULL |
JMS-Body | <agent_login_Id>#DialogState#<agent_current_state>#<agent_StateChangeTimeString> |
<agent_login_Id> | Agent IP Phone Extension |
<agent_current_state> | Current State of Agent. Possible states are:
|
<agent_StateChangeTimeString> | time on state change |
Event Category | agent_state |
JSON Format
Attribute | Value | Description | |
type | DialogState | Name of the event type | System
JS
|
agentId | "42031" | Agent IP Phone Extension | |
state |
| ||
stateChangeTimeString | time on state change | ||
participants | [42032,32033] | Addresses of participants (Comma separated) | |
connectionID | 52129051 | Unique ID for each call connection |
Inbound Call State
This event is fired when CC receives an update about an agent from CUCM for an inbound call.
Event: InboundCall | |
JMS-Type | NULL |
JMS-Body | InboundCall#<Inboundcall_current_state>#<start_time> |
<agent_login_Id> | Agent IP Phone Extension |
<Inboundcall_current_state> | Current state of the dialog. Possible values are:
|
<start_time> | start time of the call |
Event Category | agent_dialog |
JSON Format
Attribute | Value | Description | |
type | InboundCall | Name of the event type | System
JS
|
agentId | "42031" | Agent IP Phone Extension | |
State |
| ||
startTime | time on state change | ||
participants | 42032 | address of the second participant | |
Connection | 52129051 | Uniqe Connection ID |
State
AgentState describes the current state of the agent. Normally CC sends this event when the agent call state changes!
JSON Format
Attribute | Value | Description | |
type | AGENT_STATE | Name of the event type | System
JS
|
agentId | "42031" | Agent IP Phone Extension | |
state |
| ||
state (Inside part) |
| time on state change | |
otherParticipants | Array of participants | ||
connectionID | 52129051 | Unique ID for each call connection |
All Errors
All the possible errors are listed below with the suggested action on the client side. You can display friendly messages against these messages on the client end. Error origin is mentioned with each error that helps the developer to debug the issue.
MISSING_EXTENSION
Extension is missing in request.
Default Format
Error: MISSING_EXTENSION | |
JMS-Type | NULL |
JMS-Body | <Error_For>#Error#MISSING_EXTENSION |
<Error_For> | Possible values are:
|
Error Origin | CUCM Connector |
Error Summary | The extension is missing in the request. |
Expected Client’s Behaviour | Display the error message and ask the user to enter valid Extension. Send the request again. |
JSON Format
Attribute | Value | Description | |
type | Error | Name of the event type | System
JS
|
errorType | MISSING_EXTENSION | ||
message | extension is missing | extension is missing |
WRONG_EXTENSION
The extension provided in the request contains alphabetic characters.
Error: WRONG_EXTENSION | |
JMS-Type | NULL |
JMS-Body | <Error_For>#Error#WRONG_EXTENSION |
<Error_For> | Possible values are:
|
Error Origin | Generic Connector |
Error Summary | Extension is not valid (contains alphabetic characters) |
Expected Client’s Behaviour | Display the error message and ask the user to enter valid Extension. Send the request again. |
JSON Format
Attribute | Value | Description | |
type | Error | Name of the event type | System
JS
|
errorType | WRONG_EXTENSION | ||
message | the extension is wrong or invalid | extension is missing |
USER_NOT_FOUND
Agent Extension isn't found in CUCM
Default Format
Error: USER_NOT_FOUND | |
JMS-Type | NULL |
JMS-Body | <Error_For>#Error#USER_NOT_FOUND |
<Error_For> | Possible values are:
|
Error Origin | CUCM |
Error Summary | Agent Extension isn't found in CUCM |
Expected Client’s Behaviour | Display the error message and ask the user to enter valid credentials. Send the request again. |
JSON Format
Attribute | Value | Description | |
type | Error | Name of the event type | System
JS
|
message | USER_NOT_FOUND | Error Message | |
message |
GENERAL_ERROR
When the root cause of the error is unclear. This error is sent only for the Login command.
Default Format
Error: GENERAL_ERROR | |
JMS-Type | NULL |
JMS-Body | <Error_For>#Error#GENERAL_ERROR |
<Error_For> | Possible values are:
|
Error Origin | CUCM |
Error Summary | When the root cause of the error is unclear. |
Expected Client’s Behaviour | Display the error message and send the request again. |
JSON Format
Attribute | Value | Description | |
type | Error | Name of the event type | System
JS
|
errorType | GENERAL_ERROR | ||
message |
CF_GENERIC_UNSPECIFIED
When the root cause of the error is unclear. No specific details are available. Can occur at any command.
Default Format
Error: CF_GENERIC_UNSPECIFIED | |
JMS-Type | NULL |
JMS-Body | <Error_For>#Error#CF_GENERIC_UNSPECIFIED |
<Error_For> | Possible values are:
|
Error Origin | CUCM |
Error Summary | The root cause of the error is unclear. No specific details are available |
Expected Client’s Behaviour | Display the error message and send the request again. |
JSON Format
Attribute | Value | Description | |
type | Error | Name of the event type | System
JS
|
errorType |
| Error Message |
CF_INVALID_OBJECT_STATE
The object is in the incorrect state for the request.
Default Format
Error: CF_INVALID_OBJECT_STATE | |
JMS-Type | NULL |
JMS-Body | <Error_For>#Error#CF_INVALID_OBJECT_STATE |
<Error_For> | Possible values are:
|
Error Origin | CUCM |
Error Summary | The object is in the incorrect state for the request. |
Expected Client’s Behaviour | Send the request again. |
JSON Format
Attribute | Value | Description | |
type | Error | Name of the event type | System
JS
|
errorType | CF_INVALID_OBJECT_STATE | Error Message |
PLEASE_RETRY
Invalid request params, IOException, request timeout.
Default Format
Error: PLEASE_RETRY | |
JMS-Type | NULL |
JMS-Body | <Error_For>#Error#PLEASE_RETRY |
<Error_For> | Possible values are:
|
Error Origin | CUCM Connector |
Error Summary | Invalid request params, IOException, request timeout. |
Expected Client’s Behaviour | Send the request again. |
JSON Format
Attribute | Value | Description | |
type | Error | Name of the event type | System
JS
|
errorType |
| Error Message |
INVALID_PARTY
An InvalidPartyException indicates that a party given as an argument to the method call was invalid. This may either be the originating party of a telephone call or the destination party of a telephone call.
Default Format
Error: PLEASE_RETRY | |
JMS-Type | NULL |
JMS-Body | <Error_For>#Error#INVALID_PARTY |
<Error_For> | Possible values are:
|
Error Origin | CUCM Connector |
Error Summary | Invalid request params, IOException, request timeout. |
Expected Client’s Behaviour | Send the request again. |
JSON Format
Attribute | Value | Description | |
type | Error | Name of the event type | System
JS
|
message | INVALID_PARTY | Error Message |
PRIVILLEGE_VIOLATION
A PrivilegeViolationException indicates that an action pertaining to a certain object failed because the application did not have the proper security permissions to execute that command.
Default Format
Error: PLEASE_RETRY | |
JMS-Type | NULL |
JMS-Body | <Error_For>#Error#PREVILLEGE_VIOLATION |
<Error_For> | Possible values are:
|
Error Origin | CUCM CONNECTOR |
Error Summary | Invalid request params, IOException, request timeout. |
Expected Client’s Behaviour | Send the request again. |
JSON Format
Attribute | Value | Description | |
type | Error | Name of the event type | System
JS
|
message | PREVILLEGE_VIOLATION | Error Message |
LICENSES_EXCEEDED
A LICENSES_EXCEEDED indicates that a client has crossed the max number of agents licensesed.
Default Format
Error: PLEASE_RETRY | |
JMS-Type | NULL |
JMS-Body | <Error_For>#Error#LICENSES_EXCEEDED |
<Error_For> | Possible values are:
|
Error Origin | Licenses expired or exceeded the limit. |
Error Summary | Invalid request params, IOException, request timeout. |
Expected Client’s Behaviour | Send the request again. |
JSON Format
Attribute | Value | Description | |
type | Error | Name of the event type | System
JS
|
message | LICENSES_EXCEEDED | Error Message |