Call IVR
Synopsis - callIvr
callIvr(String phoneno, String appname, String selfdelete, String callerid, String detection)
Description - callIvr
Objective
Make a phone call to the specified number and use the IVr application to interact and control the phone call.
Parameters
phoneno |
The phone number to call. |
appname |
The name of the deployed IVR application. |
selfdelete |
Ask the gateway to automatically delete the call request after the call is made if it is set to '1'; |
callerid |
The 11 digit caller ID number. |
detection |
The amount of detection for our system to recognize human answer. 0= balanced, 1= more aggressive, 2= most aggressive, 3= detection off. |
Returns
reqId |
The return value is the call request ID. |
Example - callIvr
callIvr("123-4567", "reminderApp", 1, "12345678911", 1);
Call Status Responses
Synopsis - callStatus
callStatus(String reqId, HashMap responses)
Description - callStatus
Objective
Check the call status and responses of the call with reqId. The second parameter is a reference to an array and is used to collect responses. So if you have an element named AttendMeeting, the response can be accessed as responses["AttendMeeting"]. Please note that you can have multiple IVR elements that collect responses.
Parameters
<reqId> |
The reqId. |
<responses> |
Reference to an array and is used to collect responses. |
Example - callStatus
String status = callStatus("1234035434", responses);
if (responses.get("AttendMeeting").equals("1")) { ... };
Source Code
------------------
File Voicent.java:
------------------
import java.net.URL;
import java.net.URLEncoder;
import java.net.HttpURLConnection;
import java.io.PrintWriter;
import java.io.InputStream;
public class Voicent
{
/**
* Constructor with default localhost:8155
*/
public Voicent()
{
host_ = "localhost";
port_ = 8155;
}
/**
* Constructor with Voicent gateway hostname and port.
* @param host Voicent gateway host machine
* @param port Voicent gateway port number
*/
public Voicent(String host, int port)
{
host_ = host;
port_ = port;
}
/**
* Make a call to the number specified and play the text message
* using text-to-speech engine.
*
* @param phoneno Phone number to call, exactly as it should be dialed
* @param text Text to play over the phone using text-to-speech
* @param selfdelete After the call, delete the call request automatically if set to 1
* @return Call request ID
*/
public String callText(String phoneno, String text, boolean selfdelete)
{
// call request url
String urlstr = "/ocall/callreqHandler.jsp";
// setting the http post string
String poststr = "info=";
poststr += URLEncoder.encode("Simple Text Call " + phoneno);
poststr += "&phoneno=";
poststr += phoneno;
poststr += "&firstocc=10";
poststr += "&selfdelete=";
poststr += (selfdelete ? "1" : "0");
poststr += "&txt=";
poststr += URLEncoder.encode(text);
// Send Call Request
String rcstr = postToGateway(urlstr, poststr);
return getReqId(rcstr);
} /**
* Make a call to the number specified and use the IVR app for call control
*
* @param phoneno Phone number to call, exactly as it should be dialed
* @param appname deployed IVR application name on Voicent Gateway
* @param selfdelete After the call, delete the call request automatically if set to 1
* @return Call request ID
*/
public String callIvr(String phoneno, String appname, boolean selfdelete)
{
// call request url
String urlstr = "/ocall/callreqHandler.jsp";
// setting the http post string
String poststr = "info=";
poststr += URLEncoder.encode("Simple Text Call " + phoneno);
poststr += "&phoneno=";
poststr += phoneno;
poststr += "&firstocc=10";
poststr += "&selfdelete=";
poststr += (selfdelete ? "1" : "0");
poststr += "&startapp=";
poststr += URLEncoder.encode(appname);
// Send Call Request
String rcstr = postToGateway(urlstr, poststr);
return getReqId(rcstr);
}
/**
* Make a call to the number specified and play the audio file. The
* audio file should be of PCM 8KHz, 16bit, mono.
*
* @param phoneno Phone number to call, exactly as it should be dialed
* @param audiofile Audio file path name
* @param selfdelete After the call, delete the call request automatically if set to 1
* @return Call request ID
*/
public String callAudio(String phoneno, String audiofile, boolean selfdelete)
{
// call request url
String urlstr = "/ocall/callreqHandler.jsp";
// setting the http post string
String poststr = "info=";
poststr += URLEncoder.encode("Simple Audio Call " + phoneno);
poststr += "&phoneno=";
poststr += phoneno;
poststr += "&firstocc=10";
poststr += "&selfdelete=";
poststr += (selfdelete ? "1" : "0");
poststr += "&audiofile=";
poststr += URLEncoder.encode(audiofile);
// Send Call Request
String rcstr = postToGateway(urlstr, poststr);
return getReqId(rcstr);
}
/**
* Get call status of the call with the reqID.
*
* @param reqID Call request ID on the gateway
* @return call status
*/
public String callStatus(String reqID)
{
// call status url
String urlstr = "/ocall/callstatusHandler.jsp";
// setting the http post string
String poststr = "reqid=";
poststr += URLEncoder.encode(reqID);
// Send Call Request
String rcstr = postToGateway(urlstr, poststr);
return getCallStatus(rcstr);
} /**
* Get call status of the call with the reqID.
*
* @param reqID Call request ID on the gateway
* @param responses Touch tone responses name-value pair, name is IVR element name
* @return call status
*/
public String callStatus(String reqID, HashMap responses)
{
// call status url
String urlstr = "/ocall/callstatusHandler.jsp";
// setting the http post string
String poststr = "reqid=";
poststr += URLEncoder.encode(reqID);
// Send Call Request
String rcstr = postToGateway(urlstr, poststr);
return getCallStatus(rcstr, responses);
}
/**
* Remove all request from the gateway
*
* @param reqID Call request ID on the gateway
* @return call status
*/
public void callRemove(String reqID)
{
// call status url
String urlstr = "/ocall/callremoveHandler.jsp";
// setting the http post string
String poststr = "reqid=";
poststr += URLEncoder.encode(reqID);
// Send Call remove post
postToGateway(urlstr, poststr);
}
/**
* Invoke BroadcastByPhone and start the call-till-confirm process
*
* @param vcastexe Executable file vcast.exe, BroadcastByPhone path name
* @param vocfile BroadcastByPhone call list file
* @param wavfile Audio file used for the broadcast
* @param ccode Confirmation code
*/
public void callTillConfirm(String vcastexe, String vocfile, String wavfile, String ccode)
{
// call request url
String urlstr = "/ocall/callreqHandler.jsp";
// setting the http post string
String poststr = "info=";
poststr += URLEncoder.encode("Simple Call till Confirm");
poststr += "&phoneno=1111111"; // any number
poststr += "&firstocc=10";
poststr += "&selfdelete=0";
poststr += "&startexec=";
poststr += URLEncoder.encode(vcastexe);
String cmdline = "\"";
cmdline += vocfile;
cmdline += "\"";
cmdline += " -startnow";
cmdline += " -confirmcode ";
cmdline += ccode;
cmdline += " -wavfile ";
cmdline += "\"";
cmdline += wavfile;
cmdline += "\"";
// add -cleanstatus if necessary
poststr += "&cmdline=";
poststr += URLEncoder.encode(cmdline);
// Send like a Call Request
postToGateway(urlstr, poststr);
}
private String postToGateway(String urlstr, String poststr)
{
try {
URL url = new URL("http", host_, port_, urlstr);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setRequestMethod("POST");
PrintWriter out = new PrintWriter(conn.getOutputStream());
out.print(poststr);
out.close();
InputStream in = conn.getInputStream();
StringBuffer rcstr = new StringBuffer();
byte[] b = new byte[4096];
int len;
while ((len = in.read(b)) != -1)
rcstr.append(new String(b, 0, len));
return rcstr.toString();
}
catch (Exception e) {
e.printStackTrace();
return "";
}
}
private String getReqId(String rcstr)
{
int index1 = rcstr.indexOf("[ReqId=");
if (index1 == -1)
return "";
index1 += 7;
int index2 = rcstr.indexOf("]", index1);
if (index2 == -1)
return "";
return rcstr.substring(index1, index2);
}
private String getCallStatus(String rcstr)
{
if (rcstr.indexOf("^made^") != -1)
return "Call Made";
if (rcstr.indexOf("^failed^") != -1)
return "Call Failed";
if (rcstr.indexOf("^retry^") != -1)
return "Call Will Retry";
return "";
} private String getCallStatus(String rcstr, HashMap responses)
{
responses.clear();
int startIndex = 0;
for (int i = 0; i <= 7; i++) {
int index = rcstr.indexOf("^", startIndex);
if (index == -1) break;
startIndex = index + 1;
if (i < 7) continue;
String respstr = rcstr.substring(index+1);
index = respstr.indexOf("^");
if (index != -1)
respstr = respstr.substring(0, index);
parseCallResponses(respstr, responses);
}
return getCallStatus(rcstr);
}
private void parseCallResponses(String respstr, HashMap responses)
{
while (! respstr.isEmpty()) {
int index = respstr.indexOf('|');
String nvstr = respstr;
if (index != -1)
nvstr = respstr.substring(0, index).trim();
int index2 = nvstr.indexOf('=');
if (index2 == -1)
responses.put("__response___", nvstr);
else {
String key = nvstr.substring(0, index2).trim();
String value = nvstr.substring(index2+1).trim();
responses.put(key, value);
}
if (index == -1)
break;
respstr = respstr.substring(index+1).trim();
}
}
/* test usage */
public static void main(String args[])
throws InterruptedException
{
String mynumber = "1112222"; // replace with your own
Voicent voicent = new Voicent();
String reqId = voicent.callText(mynumber, "hello, how are you", true);
System.out.println("callText: " + reqId);
reqId = voicent.callAudio(mynumber, "C:/Program Files/Voicent/MyRecordings/sample_message.wav", false);
System.out.println("callAudio: " + reqId);
while (true) {
Thread.currentThread().sleep(30000);
String status = voicent.callStatus(reqId);
if (status.length() > 0) {
System.out.println(status);
voicent.callRemove(reqId);
break;
}
}
voicent.callTillConfirm("C:/Program Files/Voicent/BroadcastByPhone/bin/vcast.exe",
"C:/temp/testctf.voc",
"C:/Program Files/Voicent/MyRecordings/sample_message.wav",
"1234");
}
private String host_;
private int port_;
}