Sample - Building a
web-based emergency notification system
-
using Voicent Java Simple Call Interface
This sample builds a simple, web-based emergency notification
system using Voicent Java Simple Interface.
For other programming languages, the steps are similar. Source code of this sample is
included, and you are free to use, redistribute, or modify the system any way you
prefer.
Using the Emergency Notification System
The main interface of this emergency notification system is a web
page. If you deploy the system on Voicent Gateway, you can access
it from the following URL:
-
http://<computer_name_or_ip_address>:8155/webalert/start-broadcast.htm
If you access it from the same computer the gateway is running,
you can use
http://localhost:8155/webalert/start-broadcast.htm
USAGE DESCRIPTION
To start an emergency alert, enter the emergency notification
message in the Alert Message Box, then click the Start
Emergency Broadcast button.
The system will start calling each phone numbers on the
emergency call list. When the
call is answered, either by a live human or answering
machine/voicemail, the system will play the alert message over the
phone. The alert message text is automatically converted to voice
using a text-to-speech engine. The default text-to-speech engine
included in Voicent Gateway is a free one from Microsoft. The
voice is robotic and hard to understand. For real usage, it is
strongly recommended that you get the
Voicent Natual
Text-to-Speech engine.
The following is the status page of the current emergency
broadcast.
This page shows the current call status. For every 10 seconds, it
will refresh the page and display the latest status. You could
also stop the broadcast by clicking the Stop Broadcast
button.
-
Install the System
- First, download the package and
unzip it to a folder.
-
- You should be able to deploy the software on any web server
that supports JSP. Here we show the steps to deploy it on
Voicent Gateway.
-
- Voicent Gateway contains a web server that supports JSP
(TOMCAT from Apache.org). The following configuration file is
included.
name =
Emergency Notification
keyword = webalert
inbound = 0
outbound= 1
appurl =
protectedappurl =
webappname=/webalert
appdir =
startexe =
readystring =
ctxmenu = Emergency Notification ...
ctxmenulocalurl = webalert/start-broadcast.htm
This configuration file simplifies the installation of this
application to Voicent Gateway. To install, unzip the webalert.zip
file to a folder. Then click on Voicent Gateway icon, choose
Application from the main menu, then choose Setup
Application...
Click the Install button, click the Browse button. Choose the
unzip folder for webalert. select conf folder, then
select the file named webalert.conf. Click OK. You should
see the following:
The webalert application is installed. (You can see that the
Call Scheduler is actually a regular Gateway application). If you
right mouse click on the gateway icon, you can see the context
menu will include "Emergency Notification...". The same
context menu item is also installed under the gateway main menu
under Application.
ENTER YOUR CALL LIST
Enter names and phone numbers to the file named "myCallList.txt"
under the gateway folder. The folder is at: C:\Program
Files\Voicent\Gateway.
The format is a comma separated file, with each person listed
in a separate line. The following is an example:
# comment
line starts with #
# name, phone
John Smith, 123-1111
John Doo, 333-3333-3333
If you just want to use the system as is, you can skip the rest of
this article.
Main Java
Classes
The following are the main Java classes for this application.
For details, please see
Javadoc for webalert classes.
-
BroadcastManager |
Main interface class |
BroadcastThread |
Background thread for managing calls |
BroadcastList |
Interface for call list |
BroadcastListFile |
Interface for call list, implemented as a
file |
Voicent |
Voicent Gateway Simple Call Interface |
EXAMPLE
It is straightforward to use BroadcastManager. Here is a simple
test loop:
- // get a
manager instance
BroadcastManager manager = BroadcastManager.getInstance();
-
- // this
will start the BroadcastThread in the background
manager.startBroadcast("Red Alert! Red Alert!");
do {
//
poll Voicent Gateway
Thread.currentThread().sleep(20000);
System.out.println("Calls Made: " +
Integer.toString(manager.getCallsMade()));
System.out.println("Calls Failed : " +
Integer.toString(manager.getCallsFailed()));
System.out.println("Calls Inprogress : " +
Integer.toString(manager.getCallsInprogress()));
System.out.println("Calls To be Made : " +
Integer.toString(manager.getCallsToBeMade()));
}
while (manager.getCallsInprogress() > 0);
The main program starts the broadcast by calling
startBroadcast with the alert notes. The BroadcastManager in
turn starts the BroadcastThread, which is the main loop for
submitting calls to Voicent Gateway and getting call status. The
thread main loop is the run method.
- // keep
loop until stopped or there are current calls
while (isOngoing_ || curReqIds_.size() > 0) {
//
any room for more call
while (isOngoing_ && curReqIds_.size() < lines_) {
if (! list_.next()) { // end of call
list
isOngoing_ =
false;
break;
}
// submit call
request to gateway
String phoneno =
list_.getValue(BroadcastList.PHONE);
String reqId = voicent_.callText(phoneno,
notes_, false);
curReqIds_.add(reqId);
// message
will be included in the gateway output.log
System.out.println("<<<<<<<<<< " +
phoneno + " : " + reqId);
}
//
check status
boolean hasFinishedCall = false;
int index = 0;
while (index < curReqIds_.size()) {
String reqId = (String)
curReqIds_.get(index);
String status =
voicent_.callStatus(reqId);
if (status.length() == 0) {
index++;
continue; //
not finished yet
}
System.out.println(">>>>>>>>>> " +
status + " : " + reqId);
if ("Call Made".equals(status))
callsMade_++;
else
callsFailed_++;
hasFinishedCall = true;
curReqIds_.remove(index);
voicent_.callRemove(reqId);
}
//
Voicent Gateway is like a web server, you have to
-
// poll in order to get status
// if no finished calls, wait 10 seconds before continue
if (! hasFinishedCall) {
try {
Thread.currentThread().sleep(10000);
}
catch (InterruptedException e) {
}
}
The variable isOngoing_ indicates whether the current
broadcast is still ongoing or not. It will be set to false when
stopBroadcast is called, or the end of the call list is
reached.
The first section submits calls to the gateway and tries to
maintain the number of calls to be the same as the number of phone
lines. Actually, the number of calls submitted does not have to be
equal to the number of phone lines. Any extra calls submitted will
be queued by the gateway scheduler. voicent_ is the object
representing the simple call interface, and callText is the
method for submitting call request to the gateway.
The next section checks the call status from the gateway. It
calls callStatus to get the call status. If the call is
made or failed, it calls callRemove to remove the call
record on the gateway.
Please note that if the call status is empty, you should not
remove the call record. The call might not be scheduled, or it
might be ongoing. Deleting the call record while the call is still
ongoing might cause audio cutoff or even system crash.
The last section simply wait for 10 seconds if all calls are
still ongoing.
-
User
Interface HTML and JSP Files
The following are the user interface files.
-
start-broadcast.htm |
HTML file containing the broadcast form |
startHandler.jsp |
JSP file to handle startBroadcast |
stop-broadcast.jsp |
JSP file to handle stopBroadcast |
broadcast-status.jsp |
JSP file to handle broadcast status |
-
start-broadcast.htm is the file that shows the broadcast
form. Once a user clicks the Start Broadcast button, the
form is submitted to startHandler.jsp.
- // get the
alert notes
- String
notes = request.getParameter("notes");
//
start broadcast thread
BroadcastManager manager = BroadcastManager.getInstance();
if (manager.startBroadcast(notes)) {
response.sendRedirect("broadcast-status.jsp");
return;
}
Once the broadcast thread is started in the background, the
page is forwarded to broadcast-status.jsp. This page simply
displays the current statistics of the broadcast every 10 seconds.
The following javascript refreshes the page.
<script>
var tleft=10;
function beginrefresh()
{
if (! document.images)
return
if (tleft == 1)
window.location.reload()
else {
tleft--
window.status="page rerefresh in "+tleft+"
seconds"
setTimeout("beginrefresh()", 1000)
}
}
window.onload=beginrefresh
</script>
Call
List
The java interface BroadcastList defines the methods for
a call list. In the simple sample, we implemented
BroadcastListFile to manage the actual call list. As the name
indicates, it is based on a text file using the following format
- name,
phone, [other value,...]
name, phone, [other value,...]
In this sample, only the phone number is used.
To simplify the sample, we have hard coded the file name in the
start-broadcast.htm file. The following hidden field is included
in the file:
<input
type=hidden name=calllist value="myCallList.txt">
This parameter is submitted to startHandler.jsp. This
file should be saved in webalert home directory. If you want to
change the location, you can specify an absolute path in the
value.
Another popular implementation for call list is to use a
relational database, such as mysql. We do not implement this
class. It should be straightforward to implement this class.
Call capacity can be increased by using more Voicent Gateways
to make phone calls. It is easy to change the program to
accommodate this. Since the gateways are distributed, you can add
as many gateways as you wish - there is virtually no limit to
build more call capacity.
To add support for additional gateways, 1). in the constructor of BroadcastThread:
public
BroadcastThread()
{
// We use only one gateway in this sample, but you can create
// multiple Voicent object for multiple gateways
voicent_ = new Voicent();
// set the number of phone lines available
// this number can be fetched from Voicent Gateway
// it is hard coded in this sample.
// it is fine if the number does not match the actual phone lines
// since the gateway call scheduler can decide which calls to
make
lines_ = 4;
}
create a Voicent object for each gateway instance, and
increase the lines_ for the additional call capacity; or
2). create a BroadcastThread object for each gateway
instance.
The following download contains both the source code and
compiled code.
Click here to download the sample source
code.
|