[Freeswitch-users] Mod Event Socket

Michael Collins msc at freeswitch.org
Thu Oct 28 17:57:49 PDT 2010


Be sure to learn the difference between inbound and outbound event socket.
In your case you are doing outbound event socket. The dialplan calls the
socket app which does an outbound socket connection to port 9090 on the
localhost. Make sure that your app is listening on port 9090.

The event_socket.conf.xml file is for configuring inbound socket
connections, e.g. when you have a script that attempts to connect to FS
where FS is listening on port 8021. So change your event_socket.conf.xml
file back to the default and retry.

Report back here if you have trouble. Also, buy or borrow the FreeSWITCH
book and check out chapter 9. Lots of good stuff there on how the even
system works.

-MC

On Thu, Oct 28, 2010 at 2:14 PM, Will Smith <willbelair at yahoo.com> wrote:

> Hi,
> I am new to FS, and trying to get the mod event socket installed and
> running. I have FS running, with SIP account, can dial in/out via gateway.
> Now I want to dial in, FS will send some info to client browser, here is
> one question, does this work over the internet, or just local ? Info sent
> could be the uuid, so that client browser could decide to bridge the call,
> send to IVR or transfer ...
> Please give me some guide line how to set this up.
> I added to dialplan/default.xml
> -----
>
>  <extension name="socketTest">
>       <condition field="destination_number" expression="^444$">
>         <action application="socket" data="127.0.0.1:9090 async full"/>
>       </condition>
>  </extension>
>
> -----
>
>
> got the php sample file:
>
> <?php
>
> /**
>  * Based loosely on the NET_Server code in PEAR.
>  * This is only an example - considerable additional work is needed
>  * Specifically, the code in the handleConnection method should be
>  * handled in a subclass
>  *
>  *
>  */
>
> class Message
> {
>   var $properties = array();
>   var $content = null;
> }
>
> class EventSocketListener
> {
>
>   var $host;
>   var $port;
>   var $sock;
>   var $is_parent = true;
>   var $clientInfo;
>   var $clientFD;
>
>   var $connectionContext = array();
>
>
>   function &create($port, $host = "localhost")
>       {
> 	$esl = new EventSocketListener;
> 	$esl->port = $port;
> 	$esl->host = $host;
>         if (!function_exists('socket_create')) {
>             return PEAR::raiseError('Sockets extension not available.');
>         }
> 	return $esl;
>       }
>
>   function start()
>   {
> 	if (($this->sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
> 	  echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
> 	}
>
> 	if (!socket_set_option($this->sock, SOL_SOCKET, SO_REUSEADDR, 1)) {
> 	  echo 'Unable to set option on socket: '. socket_strerror(socket_last_error()) . PHP_EOL;
> 	}
>
> 	if (socket_bind($this->sock, $this->host, $this->port) === false) {
> 	  echo "socket_bind() failed: reason: " . socket_strerror(socket_last_error($this->sock)) . "\n";
> 	}
>
> 	if (socket_listen($this->sock, 5) === false) {
> 	  echo "socket_listen() failed: reason: " . socket_strerror(socket_last_error($this->sock)) . "\n";
> 	}
>
>         // Dear children, please do not become zombies
>         pcntl_signal(SIGCHLD, SIG_IGN);
>
>         // wait for incmoning connections
>         while (true)
>         {
>             // new connection
>             if(($fd = socket_accept($this->sock)))
>             {
> 	      $pid = pcntl_fork();
> 	      if($pid == -1) {
> 		  return  PEAR::raiseError('Could not fork child process.');
>                 }
>                 // This is the child => handle the request
>                 elseif($pid == 0) {
>                     // this is not the parent
>                     $this->_isParent = false;
>                     // store the new file descriptor
>                     $this->clientFD = $fd;
>
>                     $peer_host    =    "";
>                     $peer_port    =    "";
>                     socket_getpeername($this->clientFD, $peer_host, $peer_port);
>                     $this->clientInfo    =    array(
>                                                       "host"        =>    $peer_host,
>                                                       "port"        =>    $peer_port,
>                                                       "connectOn"   =>    time()
>                                                    );
> 		    $this->handleConnection();
> 		    socket_shutdown($this->clientFD, 2);
> 		    socket_close($this->clientFD);
> 		}
> 		else /* Parent does nothing */
> 		  {
> 		  }
> 	    }
> 	}
>   }
>
>   function handleConnection()
>   {
>     $fd = $this->clientFD;
>     //first, read headers & setup a state for this connection
>     $line = "";
>     socket_write($fd, "CONNECT\n\n");
>     do
>       {
> 	$line = socket_read($fd, 2048, PHP_NORMAL_READ);
> 	if (trim($line) == "")
> 	  break;
> 	//we got a header, we need to add it to the
> 	list($key, $value) = explode(":", $line);
> 	$key = trim($key);
> 	$value = trim(urldecode($value));
> 	$this->connectionContext[$key] = $value;
>       }
>     while ($line != "");
>
>     //    print_r($this->connectionContext);
>     $this->callConnected();
>
>     exit();
>
>   }
>
>   function processMessages($returnOnReply = false)
>   {
>     $fd = $this->clientFD;
>     $result = new Message();
>     $props = array();
>     while (true)
>       {
> 	do
> 	  {
> 	    $line = @socket_read($fd, 2048, PHP_NORMAL_READ);
> 	    if (socket_last_error($fd) == 104)
> 	      return null;
> 	    if ($line == null || $line == FALSE || trim($line) == "")
> 	      break;
> 	    //we got a header, we need to add it to the message
> 	    list($key, $value) = explode(":", $line);
> 	    $key = trim($key);
> 	    $value = trim(urldecode($value));
> 	    $props[$key] = $value;
> 	  }
> 	while ($line != "");
> 	$result->properties = $props;
>
> 	if (isset($props['Content-Length']))
> 	  {
> 	    $length = $props['Content-Length'];
> 	    print("Reading content - $length\n");
> 	    $data = socket_read($fd, $length);
> 	    $result->content = $data;
> 	  }
> 	if (isset($props['Content-Type']))
> 	  {
> 	    $type = $props['Content-Type'];
> 	    if ($returnOnReply &&
> 		($type == "command/reply" || $type == "api/response"))
> 	      {
> 		return $result;
> 	      }
> 	    else if ($type == "text/event-plain") //only plain events for now
> 	      {
> 		$this->handleEvent($result);
> 	      }
> 	  }
> 	else
> 	  {
> 	    print("UNKNOWN MESSAGE: \n");
> 	    print_r($result);
> 	  }
>       }
>   }
>
>
>
>   function invokeCommand($command)
>   {
>     //Send the command
>     print("Invoking: $command\n");
>     $this->sendCommand($command);
>     // Wait for the response
>     $result = $this->processMessages(true);
>     return $result;
>   }
>
>   function sendCommand($command)
>   {
>     $fd = $this->clientFD;
>     socket_write($fd, trim($command) . "\n\n");
>   }
>
> /*-----------------------------------------------------*/
>   /* Abstract Methods - should move to subclass*/
>
>   function callConnected()
>   {
>     print_r($this->connectionContext);
>     print("----------------\n");
>     $result = $this->invokeCommand("log DEBUG");
>     print_r($result);
>     $result = $this->invokeCommand("event plain ALL");
>     print_r($result);
>
>     $this->processMessages(false);
>     print("DONE PROCESSING MESSAGES");
>     print_r($this->connectionContext);
>   }
>
>   function handleCommandResponse($response)
>   {
>     print("Recieved Unhandled Response:\n");
>     print_r($response);
>   }
>
>   function handleEvent($event)
>   {
>     print("Recieved Unhandled Event:\n");
>     print_r($event);
>   }
> }
>
>
>
>
> // create a server that forks new processes
> $server  = &EventSocketListener::create(9090);
>
> // start the server
> $server->start();
> ?>
>
> --------
>
> ( this is the original file, not perfect sample) I tried to run this, and got error with auth.
>
> Also, I modify the even_socket_conf.xml  in autoload_configs/
>
> change listen-ip to  0.0.0.0 , port = 9090 , disable password
>
>
> What did I miss?
>
> Thankyou for your help
>
> Will
>
>
>
>
> _______________________________________________
> FreeSWITCH-users mailing list
> FreeSWITCH-users at lists.freeswitch.org
> http://lists.freeswitch.org/mailman/listinfo/freeswitch-users
> UNSUBSCRIBE:http://lists.freeswitch.org/mailman/options/freeswitch-users
> http://www.freeswitch.org
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.freeswitch.org/pipermail/freeswitch-users/attachments/20101028/e1a36ee9/attachment-0001.html 


More information about the FreeSWITCH-users mailing list