How To Put Click to Call On Your Website
Written by dean on Jun 16, 2007 - 12:54 PM
This question has cropped up a number of times in the forum and I felt it was time to address it more fully and present an open-source solution (part written by me, part by Ian Plain, part Asterisk/PHP mashup). We'll also be using AJAX to control an active "presence" system for the on screen button.
Let's have a look at some click-to-call background first and for the moment I'm going to assume that you're some kind of ecommerce webmaster using Asterisk or TrixBox for your VoIP PBX. You may be an online store or site providing an online service. Whether product or service, you may be thinking that if you could get your visitor on the telephone, you'll convert the sale or convince them they need your service. This is really the only consideration when analysing click to call as a commercial tool - will you generate more sales.
Here are some numbers
* from a report which are worth considering:-
- a 22%-25% reduction in Website abandonment from pages with click-to-call services
- as much as a 100% increase in transaction conversions from click-to-call users compared with toll-free callers
- 88% of click-to-call users say they are more likely to contact a company that offers a click-to-call service than one that does not
* - Data from Estara
| Quote: |
| A vendor of click-to-call products claims that 25 percent to 35 percent of consumers who use the function end up making a purchase, a figure far higher than the 3 percent conversion rate cited by Forrester. |
Quote from itBusinessEdge
I'm not talking here about telephone lead generation, which is something that works much like AdWords. As opposed to clicking through to a website, the user engages on the telephone. Google do have a program for this which they're rolling out extremely slowly. It has taken two years to date. The Google program may interest you and be available in your country. You can check if it is
here if you're interested.
The real benefit of telephone lead generation is that it doesn't require a website. But that's out of scope here and not what this article is about.
This is also not what I call a "true" click to call system, this is a "click, give us your number and we'll call you" type system. "Click to Call" has become a generic expression and the system described above probably should be called "Click to Speak".
The click to callback type setup I'm describing here is similar to the commercial offerings from the likes of Estara. But I'm going to be talking about doing this in a completely open-source (free) environment, using a combination of Asterisk, AJAX and PHP.
If you want true click to call, using an embeded VoIP softclient within your page, you'll need a widget. I have listed a group of 10 of those
here.
On the Asterisk side,
Ian Plain has kindly donated his code, which wraps a direct interface to the Asterisk management console within a PHP script. Quotes and comments on that aspect of code shown here are from him and not me.
So, you want to go ahead with this and put click to call buttons on your site and start seeing how it performs for you? There are a couple of immediate things to consider and we should look at some of the theories first.
Presence and Availability
Nothing would be more annoying to a site visitor than to see a click to call button, click it, and the phone just rings and rings. What's critical therefore is some kind of presence management system.
There are three basic presence states with click to call - (1) you're available, (2) you're away, and (3) you're there, but on the phone and already engaged. We can combine states (2) and (3) into one "away" state.
Visitors will sometimes land on a page and spend some time reading it - the "presence" indicator needs to be dynamically generated. Hence I'm using AJAX to allow a "real-time" presence update when a call is routed and answered (you're "engaged") or you're "away" and unable to answer. We'll do this in a very simple fashion to start with - if you're away or engaged the button is going to disappear from the page, on the fly. This could be easily adapted to display a different button or alert the viewer in any way you choose that there's been a change. For the usability reasons stated, it is important to do indicate presence
somehow.
Security
You can't just let any Tom, Dick or Harry onto your Asterisk box via the webserver. Nor can you allow any other webmaster put your button on someone elses site. So you need to ensure that the button will only display and operate on your pages, and you'll ignore any calls to it from any other referrer.
The referrer field, part of the HTTP Header Specification, is not 100% reliable. Some browsers will not forward it to the server. In my experience, it's about 95% reliable. You will need to assume 5% of calls or clicks on the click-to-call button are going to break. You can, however, detect that a header is invalid and send back a nice message.
You also need to restrict the call back number, assuming you do not want to pick up the cost of international calls to mobiles. Ian has done this within the Asterisk portion of code, allowing, in this example case, calls to the UK only. You'll need to adapt this call plan as you see fit, and we can have some further discussion on doing that later in this thread.
The theory and code presented here should scale easily enough to a multiple person/call centre type arrangement. The theory and considerations are the important part. This warrants much further discussion and I invite you to that in this thread.
OK let's get stuck in with some code. As this is likely to be adapated and improved, we'll call this starting point the VoIP User Click To Call System 1.0 BETA.
If you're not familiar with AJAX, you might want to read the starter guide
here. There are plenty of additional AJAX resources on the web if you want to
search around. We're a VoIP forum and specific advice on AJAX should be sought elsewhere. But I will give a basic overview by way of comments within the code.
We need some way to store the 2 basic states of presence that we'll be using. We'll do that on the webserver, assuming, as should be the case, your webserver and Asterisk box are running on two different servers. Asterisk is going to talk to the webserver, to update the presence status flag, as and when calls are routed or something changes. We'll drive the actual page the viewer sees with a 500ms Java timer, checking the presence status flag by calling a GET once every half a second. If you put something like this on a high traffic site, bear in mind the number of HTTP requests that will get generated by this timer and adjust the interval accordingly. Anything down to 2 or 3 seconds should be fine.
Step 1
Create a new directory, under your main www directory, called "clickcall". Create a new file in there, called "clickcalltest.html". Copy the following code into that file. You will need to change "example.com" to your own domain.
| Code: |
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
</head>
<script language="javascript">
// VoIP User Click To Call System 1.0 BETA
// AJAX Main Functions
// From http://www.voipuser.org/forum_topic_9696.html
// May 2007
//
// Set up our XMLHttpRequest Object
var XMLHttpRequestObject = false;
var currentStatus = 'offline';
var newStatus = 'offline';
if (window.XMLHttpRequest) { // Mozilla, Safari...
XMLHttpRequestObject = new XMLHttpRequest();
} else if (window.ActiveXObject) { // Internet Explorer
try {
XMLHttpRequestObject = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
XMLHttpRequestObject = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
}
}
if (!XMLHttpRequestObject) {
// Remove this once you're done debugging and let failures go. Worst case, the visitor just won't see the button
// Some users disable Java in their browsers. Not a great deal we can do about that.
alert('Failed to create XMLHTTP instance.');
}
// This function checks the presence flag on the webserver and outputs the button, or not
function getData(dataSource, divID)
{
if (XMLHttpRequestObject) {
var obj = document.getElementById(divID);
XMLHttpRequestObject.open("GET", dataSource);
XMLHttpRequestObject.onreadystatechange = function ()
{
if ( (XMLHttpRequestObject.readyState == 4) && (XMLHttpRequestObject.status == 200) ) {
if (XMLHttpRequestObject.responseText == 1) { newStatus = 'online'; }
if (XMLHttpRequestObject.responseText == 0) { newStatus = 'offline'; }
if (currentStatus != newStatus) {
if (newStatus == "online") { obj.innerHTML = '<a href="http://www.example.com/clickcall/callme.php" target="_blank"><input type="image" src="http://www.example.com/clickcall/click.jpg" alt="Click To Call" name="clickTocall"></a>'; } else { obj.innerHTML = ''; }
currentStatus = newStatus;
}
}
}
}
XMLHttpRequestObject.send(null);
}
var timerID = null
function StartTimer()
{
getData('http://www.example.com/clickcall/getstatus.php', 'targetDiv');
timerID = self.setTimeout("StartTimer()", 500);
}
</script>
<body onLoad="StartTimer()">
<div id="targetDiv">
</div>
</body>
</html>
|
The important part of the above code is in between the <script> tags. That's the AJAX and Javascript timer which check the presence status of the server/callee. Don't forget to include that Body OnLoad function call - that kickstarts the timer and the whole checking process.
OK, that's the AJAX part done and a demo page built. Note that the AJAX code calls a ../clickcall/getstatus.php script (coming up next) every 500ms. The getstatus.php script just needs to output a "1" or a "0" depending on the current state of callee presence - "1" meaning 'available' and "2" meaning 'unavailable'.
Presence "state" will be determined by the existence (or not) of a file residing on the Asterisk server (you will need Apache running on the Asterisk box). In other words, we check the state of presence by seeing if the file "http://path.to.asterisk.net/presencefile.html" exists or not. This won't scale particularly well. If you use a database, you could store state there, or you could even create and delete this file in a RAM disk for extra speed. Again, we can have some further discussion about that in this thread and we can improve these elements as we go.
Step 2
Create a new file in your "clickcall" directory and call it "getstatus.php". Copy the following code in there, changing $url to the file on your Asterisk server..
| Code: |
<?php
// VoIP User Click To Call System 1.0 BETA
// getstatus.php
// Check presence status and serve a 1 or 0 accordingly
// This is essentially a B2BUA, existing in order to hide the
// identity of the Asterisk server
// Change $url to point to a file on your Asterisk server
// Turn off all error reporting
error_reporting(0);
// Don't cache
header("Cache-Control: no-cache, must-revalidate");
$url = "http://example.com:64900/checkfile.html";
$online = fopen("$url",'r');
if ($online) {
// Online / Available
echo "1";
} else {
// Not online / Unavailable
echo "0";
}
?>
|
Now we need to
set the state of presence. This will be handled by Asterisk.
Step 3
Add some logic to your Asterisk configuration to enable the setting of presence status. Adjust directory and path accordingly.
| Code: |
exten => 222,1,Answer
exten => 222,n,Noop(${CHANNEL:0:8})
exten => 222,n,AddQueueMember(clik2call|${CHANNEL:0:8},j)
exten => 222,n,Noop(${AQMSTATUS})
exten => 222,n,system(/bin/touch /var/www/yourc2cdir/checkfile.htm)
exten => 222,n,Flite(You are ${AQMSTATUS} to the queue Thankyou)
exten => 222,n,Hangup()
exten => 222,104,Flite(You are already a ${AQMSTATUS:0:6} of the queue Thankyou)
exten => 222,105,Hangup()
exten => 221,1,Answer
exten => 221,n,Noop(${CHANNEL:0:8})
exten => 221,n,RemoveQueueMember(clik2call|${CHANNEL:0:8})
exten => 221,n,Noop(${AQMSTATUS})
exten => 221,n,Set(qc=${QUEUEAGENTCOUNT(clik2call)})
exten => 221,n,Noop(${qc})
exten => 221,n,Gotoif($["foo${qc}" = "foo0"]?101)
exten => 221,n,Flite(You are removed from the queue Thankyou)
exten => 221,n,Hangup()
exten => 221,101,system(/bin/unlink /var/www/yourc2cdir/checkfile.htm)
exten => 221,102,Flite(You are removed from the queue Thankyou)
exten => 221,103,Hangup()
|
Step 4
We're going to create a page to display when the user clicks the click to call button, and allows them to enter their phone number and request a callback. Create a new file in your "clickcall" directory and call it "callme.php". Copy the following code into that file, changing
www.example.com to the address of your server, and alter the path if necessary.
| Code: |
<html>
<head>
<title>Call Me Back</title>
</head>
<body>
<form method="POST" target="_blank" name="EntryForm" action="http://www.example.com/call.php" width=45,height=30,status=yes,resizable=no,scrollbars=no>
<table width="230" cellpadding=2 border=1 align="left">
<tr>
<td>
<p>At present only calls to UK STD numbers are accepted.</p>
<p align="right">Your Number 0:
<input name="scrname" size=14>
<input type=submit value="CallMe" >
</p></td>
</tr>
</table>
</form>
</body>
</html>
|
So that's our webserver and AJAX code done. The Asterisk server calls setstatus.php and passes to the script either "unavailable" or "available" and the file gets created or destroyed accordingly. If the file exists, any user browsing a page with the Click To Call button code in it will see the button and can use it, as the AJAX within that page gets a status update every half a second.
When you're on the phone, Asterisk will remove the file meaning viewers will not see the button. When you hang-up, the file will be reset. Simple.
OK, let's delve into some Asterisk code. Here's Ians call.php script that interfaces to Asterisk. This piece of code gets called by the Click to Call form (callme.php) we made above.
As you'll can see, a logfile is generated and an e-mail is sent detailing the call information. If you like, you can set the directory .htaccess file so that connections from any other site except the "client" are redrected (you should).
Step 5
Create a file called call.php in your "clickcall" directory and copy into it the following code,Change USER, SECRET etc with your Asterisk client information and example.com to your domain. Create your own file "callback.html" which will be sent in response to the viewer as confirmation that they will be called.
| Code: |
<html>
<body>
<?php
// VoIP User Click To Call System 1.0 BETA
// call.php
// Logs into Asterisk Console and sets up the callback
// Set USER, SECRET etc vars with your details
// Change example.com to your domain.
// Change /path/to/ as appropriate
$sys_ip = "127.0.0.1";
$User_str = "USER";
$Secret_str = "SECRET";
$our_exten = "Sip/1234";
$log_file = "/path/to/www/clickcall/log.html";
$WaitTime = "30";
$domain = "yoursite.com";
$strCustdata = "0${scrname}";
if (isset($_POST["scrname"])){
$digit_len = strlen($scrname);
if ($digit_len == 10 )
{
$oSocket = fsockopen($sys_ip, 5038, $errnum, $errdesc) or die("Connection to host failed");
sleep(1);
fputs($oSocket, "Action: login\r\n");
fputs($oSocket, "Username: $User_str\r\n");
fputs($oSocket, "Secret: $Secret_str\r\n\r\n");
fputs($oSocket, "Events: off\r\n\r\n");
fputs($oSocket, "Action: originate\r\n");
fputs($oSocket, "Channel: $our_exten\r\n");
fputs($oSocket, "WaitTime: $WaitTime\r\n");
fputs($oSocket, "CallerId: $strCustdata\r\n");
fputs($oSocket, "Exten: 80$scrname\r\n");
fputs($oSocket, "Context: php_webcall\r\n");
fputs($oSocket, "Async: true\r\n");
fputs($oSocket, "Priority: 1\r\n\r\n");
fputs($oSocket, "Action: Logoff\r\n\r\n");
fclose($oSocket);
$today = date("F j, Y, g:i a");
$data = fopen($log_file, "a+");
fwrite($data,"=======New call=======\nCallers IP address: $REMOTE_ADDR\nCall Time: $today\nChannel: $our_exten\nCallerid: ${name}, MaxRetries: 0\nRetryTime: 60\nWaitTime: 20\nContext: php_webcall\nExtension: 0${scrname}\nPriority: 1\n\n");
fclose($data);
echo "We will be calling you shortly on 0${scrname}\n ";
$url = "http://www.$domain/callback.html"; // target of the redirect
$delay = "1"; // 3 second delay
echo '<meta http-equiv="refresh" content="'.$delay.';url='.$url.'">';
}else{
echo "Sorry you entered an incorrect number, \n\rIt Must be a valid UK number with the leading zero removed, \n\rSuch as 1234123456 ";
$url = "http://www.$domain/callback.html"; // target of the redirect
$delay = "3"; // 3 second delay
echo '<meta http-equiv="refresh" content="'.$delay.';url='.$url.'">';
$data = fopen($log_file, "a+");
fwrite($data,"=======Failed call=======\nCallers IP address: $REMOTE_ADDR\nCall Time: $today\nChannel: $our_exten\n, \nMaxRetries: 0\nRetryTime: 60\nWaitTime: 20\nContext: php_webcall\nExtension: 0${scrname}\nPriority: 1\n\n");
fclose($data);
}
}
echo "Thank You";
?>
</body>
</html>
|
And that's it, you've got a nice, simple and free presence enabled click to call(back) system.
Suggested Improvements and Changes
I usually do a couple of further things with such a system - flood control and logging. Log IP addresses (and their telephone number of course) for blocking troublesome users. I also check the HTTP header referrer as mentioned above, so that this button doesn't end up on someone elses website. I also tend to drive presence from a database and allow a little extra complexity. For example I might show a different button if you're unavailable, so that at least the viewer sees the capability there, and can wait, if they like, until you become available again.
If you need any help with the Asterisk side of things, I recommend you take questions into the
Asterisk Forums rather than do that here. We'll talk about AJAX here, if needed, but it's not really our scope or forte.
A CRON job setting presence based on time and day of the week (online, for example, on weekdays between 9am and 5am) would be a nice touch.
One of the reasons for using AJAX in the above code is expandability. You could, for example, expand the presence theme to have Asterisk hand back to the client browser the number of agents online. You could then have that data displayed just underneath the button, giving the user live data about how many "agents" are currently available to take calls.
You could also expand the Asterisk call plan so that when no agents are available, the presence status is reset so that the button is not shown.
You could also use Asterisk call files rather than the console manager if preferred.
If anyone ends up rebuilding this for ASP, if you can send me the files I can post it up along with the PHP examples.
I hope you find this useful - please let us know if you implement it, and what your experiences with it are.
One last thing. A year or so ago I created this button for a proof of concept demo for an online car retailer. I only ever use it for demo-ing, so consider this graphic released as open-source and you can use it and otherwise do whatever you like with it. It might save you a job and at least serve as useful while you're testing.
Reply from ioncube on Jun 25, 2007 - 04:37 PM
Great post Dean/Ian. References to "Java" in the code and article should be "Javascript" though.
Reply from dean on Jun 25, 2007 - 04:57 PM
| Quote: |
| References to "Java" in the code and article should be "Javascript" though. |
Whoops, quite right - thanks
I'll edit that when I get a sec.
Reply from my_linuxbox on Jun 25, 2007 - 05:39 PM
Is there someway we can use the same solution with our voipusers account ?
Reply from dean on Jun 28, 2007 - 10:40 PM
| Quote: |
| Is there someway we can use the same solution with our voipusers account ? |
It wouldn't really work well - we have a 10 minute cut-off time on the PSTN leg.
VoIP User is not an appropriate system for a business. You really need to be in control with your own PBX.
Reply from meerkat on Jan 15, 2008 - 10:29 PM
I'm new to Asterisk and VoIP, but being in the telecoms field I need to learn this. I want to put click2call on my web site and have followed the steps so far, but is getting stuck at step 3.
Could you clarify where(.conf file) in Asterisk that need to be pasted.
Thanks.
Reply from ianplain on Jan 16, 2008 - 12:18 AM
Hi
Step 3 needs to be pasted into a conf file and context that is accessable from the handsets, for most installations this would be the default context as you want it accessable from all users.
Ian
Reply from ianplain on Jan 16, 2008 - 12:19 AM
Minor change that may be required.
Change
| Code: |
if ($digit_len == 10 )
{
$oSocket = fsockopen($sys_ip, 5038, $errnum, $errdesc) or die("Connection to host failed");
sleep(1);
fputs($oSocket, "Action: login\r\n");
fputs($oSocket, "Username: $User_str\r\n");
fputs($oSocket, "Secret: $Secret_str\r\n\r\n");
fputs($oSocket, "Events: off\r\n\r\n");
fputs($oSocket, "Action: originate\r\n");
fputs($oSocket, "Channel: $our_exten\r\n");
fputs($oSocket, "WaitTime: $WaitTime\r\n");
fputs($oSocket, "CallerId: $strCustdata\r\n");
fputs($oSocket, "Exten: 80$scrname\r\n");
fputs($oSocket, "Context: php_webcall\r\n");
fputs($oSocket, "Async: true\r\n");
fputs($oSocket, "Priority: 1\r\n\r\n");
fputs($oSocket, "Action: Logoff\r\n\r\n");
fclose($oSocket); |
to
| Code: |
if ($digit_len == 10 )
{
$oSocket = fsockopen($sys_ip, 5038, $errnum, $errdesc) or die("Connection to host failed");
sleep(1);
fputs($oSocket, "Action: login\r\n");
fputs($oSocket, "Username: $User_str\r\n");
fputs($oSocket, "Secret: $Secret_str\r\n\r\n");
fputs($oSocket, "Events: off\r\n\r\n");
fputs($oSocket, "Action: originate\r\n");
fputs($oSocket, "Channel: $our_exten\r\n");
fputs($oSocket, "WaitTime: $WaitTime\r\n");
fputs($oSocket, "CallerId: $strCustdata\r\n");
fputs($oSocket, "Exten: 80$scrname\r\n");
fputs($oSocket, "Context: php_webcall\r\n");
fputs($oSocket, "Async: true\r\n");
fputs($oSocket, "Priority: 1\r\n\r\n");
fputs($oSocket, "Action: Logoff\r\n\r\n");
sleep(2);
fclose($oSocket); |
Reply from pirhac on Feb 28, 2008 - 06:50 PM
If I understand "call.php" correctly, it will connect my customer to extension "1234" on my asterisk server ($our_exten = "Sip/1234"
What if I wanted my customers to reach me on my cell phone or home number? Could Asterisk make a "double call" and connect them? I know that would make your available/unavailble AJAX monitoring impossible.
You mention "Estara" in the article, that is what they do.
Reply from ianplain on Feb 28, 2008 - 08:34 PM
Yes you could make it call your mobile, Just use a local channel.
Ian
Reply from pirhac on Feb 29, 2008 - 11:17 PM
Not to be a pain (I'm a newb when it comes to Asterisk and VOIP), but how do I change your code so it would call my mobile number instead of an extension ?
Would we only have to change the value of "$our_exten" ?
Reply from ianplain on Feb 29, 2008 - 11:24 PM
Hi
Ok say to dial out you have extensions in the context pstn-out
then you could set $our_exten to Local/90123412324@pstn-out
and see what you get
Ian
Reply from pirhac on Mar 01, 2008 - 10:53 PM
I was excited about making a click-to-call button for my company. I don't want to switch to Asteriks completely yet - hence my question about calling externally before. But I can't get the script to work - even when calling an internal asterisk extension. Here is what I did:
1) Installed trixbox on a test server on my local LAN.
2) - Installed only 1 trunk: an IAX2 Gateway thru Voipjet.com (cheapeast rates I could find). All outgoing calls are routed thru that trunk.
3) - Installed an extension to a SIP phone. The SIP phone is a Conterpath softphone - extension 205.
4) - I can make calls from my softphone to anyphone without a problem.
5) Installed "call.php" on the trickbox server and made the necessary modifications.
6) When I run call.php ONLY my extension 205 rings (The PSTN number never rings). When I answer the call on the softphone, it says "Goodbye" and hangs up.
7) I tried modifying call.php to me on my cell instead of extension 205 (with your code from the last post) and then neither phone rang.
I'm obviously missing something. Do you have any ideas? I researched a lot on the Internet and found nothing that could help. I even found a script very similar to yours, (http://www.voipjots.com/2006/02/click-to-call-with-your-asteriskhome.html) - that tells me that the error is probably in my config and not on your PHP code.
Thanks in advance for the help.
Reply from ianplain on Mar 01, 2008 - 11:23 PM
Hi I would say that the problem is your contexts.
the line "fputs($oSocket, "Context: php_webcall\r\n");"
must match your context for out dialing.
without seeing what you have done its not possible to say much more, Post samples of your code (remove usernames and passwords) and I can debug it
Ian
Reply from pirhac on Mar 03, 2008 - 04:45 PM
Modifying the "Context" worked! Now I have a click-to-connect button that can connect an internal extension to an outside line (thru a PSTN gateway).
Here is my code (the relevant parts):
$sys_ip = "127.0.0.1";
$User_str = "------------";
$Secret_str = "xxxxxxxxxxxx";
$Context_str = "from-internal";
$our_exten = "SIP/205";
$log_file = "/var/www/html/c2c/log.html";
$WaitTime = "30";
$domain = "192.168.0.192";
$strCustdata = "0$scrname";
$today = date("r");
$oSocket = fsockopen($sys_ip, 5038, $errnum, $errdesc) or die("Connection to host failed");
sleep(1);
fputs($oSocket, "Action: login\r\n");
fputs($oSocket, "Username: $User_str\r\n");
fputs($oSocket, "Secret: $Secret_str\r\n\r\n");
fputs($oSocket, "Events: off\r\n\r\n");
fputs($oSocket, "Action: originate\r\n");
fputs($oSocket, "Channel: $our_exten\r\n");
fputs($oSocket, "WaitTime: $WaitTime\r\n");
fputs($oSocket, "CallerId: $strCustdata\r\n");
fputs($oSocket, "Exten: $scrname\r\n");
fputs($oSocket, "Context: $Context_str\r\n");
fputs($oSocket, "Async: true\r\n");
fputs($oSocket, "Priority: 1\r\n\r\n");
fputs($oSocket, "Action: Logoff\r\n\r\n");
sleep(2);
fclose($oSocket);
Now, I'd still like the click-to-call to call my cell phone instead of my SIP extension. If I change $our_exten to be "Local/<phone_number>@pstn-out" it doesn't work (Freepbx's report says it is an unknown Channel). I'm guessing it is because my server isn't directly connected to a PSTN phone. I described the rest of my Asterisk config on a prior post. Any ideas on how to change my config so it would connect 2 PSTN numbers ?
| Forum Rules and Guidelines |
About VoIP User |
Privacy Policy
|
All logos and trademarks in this site are property of their respective owner. Comments and posts are property of the poster, all the rest (c) 2003-2006 VoIP User.
No part of this site may be reproduced without our prior consent.
|