Summary
In this article I'll be discussing a way to implement call data passing between disparate telephony systems, i.e., Computer Telephony Integration (CTI). The techniques I employ in this article (DNIS
pooling, database storage of call data, etc) are nothing
groundbreaking. In fact, these techniques are as old as the hills
(well, maybe not that old). What will be new here is the use of current
software architectures such as REST with highly-efficient run-time environments such as Node.js and Redis to realize an open data integration between 3rd party systems.
This article is the culmination of a series I've written on this topic. In Part 1, REST calls from Genesys Routing Strategies, I discussed how to make REST web service calls from one particular vendor's CTI system (Genesys). In Part 2, VXML and REST Web Services, I discussed REST web service execution from VXML applications.
I'll be leveraging information in this article that I've presented in the following previous articles:
Node/Basic Auth - HTTP Basic Auth on Node.js
Node/CA Certs - CA-signed SSL Certificates with Node
Implementation
Figure 1 below depicts the overall architecture. The 'RAM Cache'
component is the focus of this article. The overall use-case of that
cache is to provide 3rd Party telephony systems, with proprietary-only
integrations, an open standard method for passing call data between
them. Example: call that is transferred between two disparate systems.
It would be preferable to retain any data that was gathered by the
transferer and pass it to the transferee.
Figure 1 |
Figure 2 depicts the details of the transfer scenario mentioned
above. A caller calls Telephony System X, during the call System X
gathers various pieces of information relevant to the caller, then
System X transfers the call to System Y. The RAM Cache provides the
mechanism for call and data matching on that transfer. The RAM Cache
provides a target DNIS, from a pool of numbers assigned to System Y, for
System X to transfer the call. Additionally, the RAM Cache stores any
caller data under a DB key that is the combination of the target DNIS
and caller's ANI. The combination of the two provides some additional
protection from call/data collisions vs. systems based on either DNIS
or ANI alone. System Y can subsequently match the call and data upon
receipt of the transfer.
Figure 2 |
The RAM Cache architecture itself is depicted in Figure 3. The
Node runtime with various modules are utilized to implement: a. HTTP
server that provides the REST interface and b. a client to the Redis
database. A static configuration file is utilized for all server
information. Redis provides a key/value store for the DNIS:ANI-keyed
values. Additionally, by configuring key expirations in Redis we can implement automatic expulsion of stale key/values.
Figure 3 |
Figure 4 depicts the REST interface I implemented here. POST's
insert data into the store (Create). GET's fetch data from the store
(Retrieve). DELETE's both fetch the data and cause it to be deleted
from the store (Delete).
Example Use
Below are some cURL examples on use of the REST interface.
POST
curl --user "username:password" -v -i -H "Content-Type:application/json" -X POST -d '{"value" : "12345678", "ani" : "1234567890"}' https://yourDomain.com/cticache/DNIS-ANI
HTTP/1.1 201 Created
< X-Powered-By: Express
X-Powered-By: Express
< Location: /cticache/DNIS-ANI/5551234568:1234567890
Location: /cticache/DNIS-ANI/5551234568:1234567890
< Content-Type: application/json; charset=utf-8
Content-Type: application/json; charset=utf-8
< Content-Length: 59
Content-Length: 59
< Date: Mon, 29 Sep 2014 00:19:53 GMT
Date: Mon, 29 Sep 2014 00:19:53 GMT
< Connection: keep-alive
Connection: keep-alive
<
* Connection #0 to host yourDomain.com left intact
{"dnis":"5551234568","ani":"1234567890","value":"12345678"}
GET
curl --user "username:password" -v -i https://yourDomain.com/cticache/DNIS-ANI/5551234568:1234567890
HTTP/1.1 200 OK
< X-Powered-By: Express
X-Powered-By: Express
< Content-Type: application/json; charset=utf-8
Content-Type: application/json; charset=utf-8
< Content-Length: 20
Content-Length: 20
< ETag: W/"14-2814665325"
ETag: W/"14-2814665325"
< Date: Mon, 29 Sep 2014 00:24:14 GMT
Date: Mon, 29 Sep 2014 00:24:14 GMT
< Connection: keep-alive
Connection: keep-alive
<
* Connection #0 to host yourDomain.com left intact
{"value":"12345678"}
DELETE
curl --user "username:password" -v -i -X DELETE https://yourDomain.com/cticache/DNIS-ANI/5551234568:1234567890
HTTP/1.1 200 OK
< X-Powered-By: Express
X-Powered-By: Express
< Content-Type: application/json; charset=utf-8
Content-Type: application/json; charset=utf-8
< Content-Length: 20
Content-Length: 20
< Date: Mon, 29 Sep 2014 00:26:35 GMT
Date: Mon, 29 Sep 2014 00:26:35 GMT
< Connection: keep-alive
Connection: keep-alive
<
* Connection #0 to host yourDomain.com left intact
{"value":"12345678"}
Comments
Post a Comment