codeigniter中的星号事件



我正在使用Codeigniter框架(php-jquery)开发一个联系人管理系统,并使用Asterisk(11或更高版本)来管理呼叫。

在这个系统中,既有来电也有呼出。如果是呼出电话,我想通过点击按钮给某人打电话,如果是来电,我想在发生这种情况时将其显示为弹出通知。为此,我编写了一个库类,如下所示,它只管理传出调用。

class Asterisk {
public $server;
public $port;
public $socket;
public $error;
const NOSOCKET      = 'No Socket Defined';
const CONNECTFAILED = 'Connection Failed';
const AUTHFAIL      = 'Authentication Failed';
const NORESP        = 'Server Didn't Respond';
public function __construct($params = array()) {
$this->server = $_SERVER['HTTP_HOST'];
$this->port = 5038;
if (isset($params['server']))
$this->server = $params['server'];
if (isset($params['port'])) {
$this->port = $params['port'];
}
}
private function _check() {
if ($this->socket)
return true;
$this->error = Asterisk::NOSOCKET;
redirect('');
}
private function _command($query, $expect = null, $error = null) {
$this->_check();
fputs($this->socket, $query."rn");
$response = fgets($this->socket);
if (!$response) {
$this->error = Asterisk::NORESP;
return false;
}
if ($expect == null)
return true;
if (strpos($response, $expect) != false)
return true;
$this->error = $error;
return false;
}
/* ************************************************************************************************************** */
public function connect($server = null, $port = null) {
if ($this->socket)
$this->close();
if ($server != null && $port != null) {
$this->server = $server;
$this->port = $port;
}
$this->socket = fsockopen($this->server, $this->port, $errno, $errstr, 1);
if (!$this->socket) {
$this->error =  Asterisk::CONNECTFAILED . " - $errstr ($errno)";
return false;
}
stream_set_timeout($this->socket, 3);
return true;
}
public function close() {
$this->_check();
fclose($this->socket);
return true;
}
public function login($username, $password) {
return $this->_command(
"Action: Loginrn".
"UserName: $usernamern".
"Secret: $passwordrn".
"Events: offrn",
"Message: Authentication accepted",
Asterisk::AUTHFAIL
);
}
public function logout() {
return $this->_command(
"Action: Logoffrn"
);
}
/* ************************************************************************************************************** */
public function call($channel, $context, $extension, $callerId, $priority = 1, $async = true, $timeout = 30000) {
return $this->_command(
"Action: Originatern".
"Channel: $channelrn".
"Context: $contextrn".
"Exten: $extensionrn".
"Priority: $priorityrn".
"Async: $asyncrn".
"CallerId: $callerIdrn".
"TimeOut: $timeoutrn"
);
}
}

如何更新此类以处理传入呼叫及其事件?

我知道有一些像PAMI这样的现有库,但它不能正确地使用codeigniter和mvc模型。

我如何管理这些来电?有人能发布一些示例代码吗?

谢谢。

我已经在一些实现中做到了这一点,使用PHP和Laravel以及PAMI(以及用于引导自定义AGI交互的PAGI)。

简而言之:AMI事件流需要主动侦听一系列事件并解析流中的数据。为了处理流,我总是创建一个单独的小程序(在带有PAGI的PHP中),它处理事件流,并通过WebSocket(在两端使用HOA-WebSocket)将事件发送回主机应用程序。

采用这种方法的原因是:

  • 允许一个小型轻量级程序来侦听所有AMI事件
  • 将"实时"系统与web应用程序解耦,并以与web应用应用程序被使用的方式相称的方式与web应用进行对话
  • 取消阻塞来自AMI的流式事件的消耗,因为您必须在线查看事件,并在没有确认响应的情况下通过套接字连接发送消息
  • 使用一个很棒的库,比如PAMI,来处理AMI,并共享一个自定义DTO库,以便将AMI原始信息映射到特定于应用程序的DTO只发生在AMI消费者程序上,而我的其他应用程序不必了解AMI
  • 最重要的是:PHP作为web应用程序的运行时配置很可能与使用实时事件流的程序的配置非常不同。如果你错过了一个活动,你就不会再得到它了

一旦设置了AMI网关程序,该程序将接收事件并将其传递给主应用程序,您就可以使用AMI网关程序向Asterisk(操作)发送指令,并且您已经有了处理操作响应的方法。

相关内容

  • 没有找到相关文章

最新更新