Anil agrahari
Anil agrahari

Reputation: 340

How to generate sip address on browser using asterisk

I need to generate a dynamic sip address on browsers so that my asterisk server can place a call on the same sip address. This way my web browser will become a sip client which can receive call.

I can see that webrtc is the way but I don't know how can I generate sip address on my browser?

Thanks

Upvotes: 0

Views: 1057

Answers (2)

Sébastien
Sébastien

Reputation: 1948

You can check my post on Asterisk 12 + Realtime + WebRTC : Websocket connection fails with asterisk 11

On top of that, add a WebService to insert a peer into the table sippeers. This Webservice would be called by your system to create the peer instantly available for a registration using SIP or whatever (SIP over WS/WSS, WebRTC...)

If you're working on Unix and need a .Net WebService, you can use NUSOAP and something like this : (sudo nano /var/html/www/mywebservice.php`. This is a basic implementation I used for testing.

<?php
require_once("nusoap.php");


$namespace = "http://yourdomain.com";
// create a new soap server
$server = new soap_server();
// configure your WSDL
$server->configureWSDL("AsteriskRealtime");
// set your namespace
$server->wsdl->schemaTargetNamespace = $namespace;
// register your WebMethod
$server->register(
                // method name:
                'HelloWorld',
            // parameter list:
                array('name'=>'xsd:string'),
                // return value(s):
                array('return'=>'xsd:string'),
                // namespace:
                $namespace,
                // soapaction: (use default)
                false,
                // style: rpc or document
                'rpc',
                // use: encoded or literal
                'encoded',
                // description: documentation for the method
                'A simple hello world');



$server->wsdl->addComplexType(
   'AsteriskExtensions',
   'complexType',
   'struct',
   'all','',
   array(
      'name' => array('name' => 'name', 'type' => 'xsd:string'),
      'custom_id' => array('name' => 'custom_id', 'type' => 'xsd:string')
   )
);

$server->wsdl->addComplexType(
   'AsteriskExtensionsArray',
   'complexType',
   'array','',
   'SOAP-ENC:Array',array(),
   array(
      array('ref'=>'SOAP-ENC:arrayType','wsdl:arrayType'=>'tns:AsteriskExtensions[]')
   ),
   'tns:AsteriskExtensions'
);


$server->register(
                // method name:
                'GetRegisteredExtensions',
                // parameter list:
                array(),
                // return value(s):
                array('AsteriskExtensions' => 'tns:AsteriskExtensionsArray'),
                // namespace:
                $namespace,
                // soapaction: (use default)
                false,
                // style: rpc or document
                'rpc',
                // use: encoded or literal
                'encoded',
                // description: documentation for the method
                'List the extensions registered in AsteriskRealtime database.');


$server->register(
                // method name:
                'AddUpdateExtension',
                // parameter list:
                array('name' => 'xsd:string', 'password' => 'xsd:string', 'custom_id' => 'xsd:string'),
                // return value(s):
                array('return' => 'xsd:string'),
                // namespace:
                $namespace,
                // soapaction: (use default)
                false,
                // style: rpc or document
                'rpc',
                // use: encoded or literal
                'encoded',
                // description: documentation for the method
                'Add or Update an extension in AsteriskRealtime database. NAME is the PRIMARY KEY.  Returns OK for success or ERR for failure.');



$server->register(
                // method name:
                'DeleteExtension',
                // parameter list:
                array('name' => 'xsd:string'),
                // return value(s):
                array('return' => 'xsd:string'),
                // namespace:
                $namespace,
                // soapaction: (use default)
                false,
                // style: rpc or document
                'rpc',
                // use: encoded or literal
                'encoded',
                // description: documentation for the method
                'Delete an extension registered in AsteriskRealtime database. Returns OK for success or ERR for failure. ');

$server->register(
                // method name:
                'GetByCustomId',
                // parameter list:
                array('name' => 'xsd:string'),
                // return value(s):
                array('AsteriskExtensions' => 'tns:AsteriskExtensionsArray'),
                // namespace:
                $namespace,
                // soapaction: (use default)
                false,
                // style: rpc or document
                'rpc',
                // use: encoded or literal
                'encoded',
                // description: documentation for the method
                'Gets an extension or a list of extensions for a CustomID. ');






function HelloWorld($sName)
{
    return 'Hello ' . $sName . '!  Hello world!';
}

function  GetRegisteredExtensions()
{ 
    $conn=odbc_connect('your-asterisk-connector-as-in-odbcinst.ini','your-mysql-user','your-mysql-password');
    $result = array();
    $req="SELECT * FROM `sippeers`";
    $res=odbc_exec($conn,$req);
    while($obj=odbc_fetch_object($res)) {
        $result[] = array( 'name' => $obj->name, 'custom_id' => $obj->custom_id);
    }
    return $result;
}

function  AddUpdateExtension($name,$password,$custom_id)
{
        $conn=odbc_connect('your-asterisk-connector-as-in-odbcinst.ini','your-mysql-user','your-mysql-password');
    $req="DELETE FROM `sippeers` WHERE `name` = '" . $name . "'";
        $res=odbc_exec($conn,$req);
        $req="insert into `sippeers` (`name`, `ipaddr`, `port`, `regseconds`, `defaultuser`, `fullcontact`, `regserver`, `useragent`, `lastms`, `host`, `type`, `context`, `permit`, `deny`, `secret`, `md5secret`, `remotesecret`, `transport`, `dtmfmode`, `directmedia`, `nat`, `callgroup`, `pickupgroup`, `language`, `disallow`, `allow`, `insecure`, `trustrpid`, `progressinband`, `promiscredir`, `useclientcode`, `accountcode`, `setvar`, `callerid`, `amaflags`, `callcounter`, `busylevel`, `allowoverlap`, `allowsubscribe`, `videosupport`, `maxcallbitrate`, `rfc2833compensate`, `mailbox`, `session-timers`, `session-expires`, `session-minse`, `session-refresher`, `t38pt_usertpsource`, `regexten`, `fromdomain`, `fromuser`, `qualify`, `defaultip`, `rtptimeout`, `rtpholdtimeout`, `sendrpid`, `outboundproxy`, `callbackextension`, `timert1`, `timerb`, `qualifyfreq`, `constantssrc`, `contactpermit`, `contactdeny`, `usereqphone`, `textsupport`, `faxdetect`, `buggymwi`, `auth`, `fullname`, `trunkname`, `cid_number`, `callingpres`, `mohinterpret`, `mohsuggest`, `parkinglot`, `hasvoicemail`, `subscribemwi`, `vmexten`, `autoframing`, `rtpkeepalive`, `call-limit`, `g726nonstandard`, `ignoresdpversion`, `allowtransfer`, `dynamic`, `path`, `supportpath`, `avpf`, `encryption`, `dtlsenable`, `dtlsverify`, `dtlscertfile`, `dtlsprivatekey`, `dtlssetup`, `force_avp`, `custom_id`) values('" . $name . "',NULL,NULL,NULL,'" . $name . "','','',NULL,'0','dynamic','friend','default',NULL,NULL,'" . $password . "',NULL,NULL,'udp,ws,wss','auto','no',NULL,NULL,NULL,NULL,NULL,'ulaw,alaw,g729,h264,g719,opus,vp8,gsm',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'no',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'yes','',NULL,'yes','yes','yes','no','/etc/asterisk/keys/asterisk.pem','/etc/asterisk/keys/asterisk.pem','actpass','yes','" . $custom_id . "')";
        $res=odbc_exec($conn,$req);

        return 'OK';
}


function  DeleteExtension($name)
{
        $conn=odbc_connect('your-asterisk-connector-as-in-odbcinst.ini','your-mysql-user','your-mysql-password');
        $req="DELETE FROM `sippeers` WHERE `name` = '" . $name . "'";
        $res=odbc_exec($conn,$req);
        return 'OK';
}

function GetByCustomId($name)
{
    $conn=odbc_connect('your-asterisk-connector-as-in-odbcinst.ini','your-mysql-user','your-mysql-password');
        $result = array();
        $req="SELECT * FROM `sippeers` WHERE `custom_id` = '" . $name . "'";
        $res=odbc_exec($conn,$req);
        while($obj=odbc_fetch_object($res)) {
                $result[] = array( 'name' => $obj->name, 'custom_id' => $obj->custom_id);
        }
        return $result;
}


// Get our posted data if the service is being consumed
// otherwise leave this data blank.
$POST_DATA = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $GLOBALS['HTTP_RAW_POST_DATA'] : '';

// pass our posted data (or nothing) to the soap service
$server->service($POST_DATA);
exit();
?>

Upvotes: 1

gkocjan
gkocjan

Reputation: 735

You need to create sip user in asterisk like in any other case and register to it via WebRTC, but first you have to enable it in configuration. Hear you have tutorial that I use to start.

In case you want to create dynamic sip users you have to use realtime in asterisk, then your configuration will be read from database. Useful links how to start with realtime: https://wiki.asterisk.org/wiki/display/AST/Realtime+Database+Configuration https://wiki.asterisk.org/wiki/display/AST/SIP+Realtime,+MySQL+table+structure

Upvotes: 2

Related Questions