codeigniter 中的星号事件
asterisk events in codeigniter
我正在使用 Codeigniter 框架 (php-jquery) 开发联系人管理系统,并且我正在使用 Asterisk(11 或更高版本)来管理呼叫。
在这个系统中,既有呼入也有呼出。在拨出电话的情况下,我想通过单击按钮呼叫某人,在拨入电话的情况下,我想在发生这种情况时将它们显示为通知弹出窗口。为此,我正在编写一个库 class,如下所示,它只管理拨出电话。
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."\r\n");
$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: Login\r\n".
"UserName: $username\r\n".
"Secret: $password\r\n".
"Events: off\r\n",
"Message: Authentication accepted",
Asterisk::AUTHFAIL
);
}
public function logout() {
return $this->_command(
"Action: Logoff\r\n"
);
}
/* ************************************************************************************************************** */
public function call($channel, $context, $extension, $callerId, $priority = 1, $async = true, $timeout = 30000) {
return $this->_command(
"Action: Originate\r\n".
"Channel: $channel\r\n".
"Context: $context\r\n".
"Exten: $extension\r\n".
"Priority: $priority\r\n".
"Async: $async\r\n".
"CallerId: $callerId\r\n".
"TimeOut: $timeout\r\n"
);
}
}
如何更新此 class 以处理来电及其事件?
我知道有一些现有的库,例如 PAMI,但它不能正确地与 codeigniter 和 mvc 模型一起使用。
我如何管理这些来电?有人可以 post 一些示例代码吗?
谢谢。
我已经在几个实现中做到了这一点,使用 PHP 和 Laravel 以及 PAMI(和用于启动自定义 AGI 交互的 PAGI)。
简而言之:AMI 事件流需要主动监听一系列事件并从流中解析数据。为了处理流,我总是创建一个单独的小程序(在 PHP 中使用 PAGI),它处理事件流并通过 WebSocket 将事件发送回主机应用程序(在两者上都使用 HOA Websocket结束)。
采用这种方法的原因是:
- 允许小型轻量级程序完成侦听所有 AMI 事件的工作。
- 将 'real-time' 系统与 Web 应用程序分离,并以与 Web 应用程序习惯被交谈的方式相称的方式与 Web 应用程序交谈
- 取消阻止从 AMI 流式传输事件的使用,因为您只需要查看事件,并通过套接字连接发送消息而不确认响应。
- 使用像 PAMI 这样的优秀库来处理 AMI 并共享一个自定义 DTO 库,以便将 AMI 原始信息映射到特定于应用程序的 DTO 只发生在 AMI 消费者程序上,而我的其他应用程序则不会必须了解 AMI。
- 最重要的是:运行 作为 Web 应用程序的 运行 时间配置很可能与旨在使用实时事件流的程序的配置有很大不同。如果您错过了一个活动,您将不会再参加!
一旦设置了 AMI 网关程序,它接收事件并将它们传递给主应用程序,您就可以使用 AMI 网关程序向 Asterisk 发送指令(Actions),并且您已经有了处理的方法操作的响应。
我正在使用 Codeigniter 框架 (php-jquery) 开发联系人管理系统,并且我正在使用 Asterisk(11 或更高版本)来管理呼叫。
在这个系统中,既有呼入也有呼出。在拨出电话的情况下,我想通过单击按钮呼叫某人,在拨入电话的情况下,我想在发生这种情况时将它们显示为通知弹出窗口。为此,我正在编写一个库 class,如下所示,它只管理拨出电话。
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."\r\n");
$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: Login\r\n".
"UserName: $username\r\n".
"Secret: $password\r\n".
"Events: off\r\n",
"Message: Authentication accepted",
Asterisk::AUTHFAIL
);
}
public function logout() {
return $this->_command(
"Action: Logoff\r\n"
);
}
/* ************************************************************************************************************** */
public function call($channel, $context, $extension, $callerId, $priority = 1, $async = true, $timeout = 30000) {
return $this->_command(
"Action: Originate\r\n".
"Channel: $channel\r\n".
"Context: $context\r\n".
"Exten: $extension\r\n".
"Priority: $priority\r\n".
"Async: $async\r\n".
"CallerId: $callerId\r\n".
"TimeOut: $timeout\r\n"
);
}
}
如何更新此 class 以处理来电及其事件?
我知道有一些现有的库,例如 PAMI,但它不能正确地与 codeigniter 和 mvc 模型一起使用。
我如何管理这些来电?有人可以 post 一些示例代码吗?
谢谢。
我已经在几个实现中做到了这一点,使用 PHP 和 Laravel 以及 PAMI(和用于启动自定义 AGI 交互的 PAGI)。
简而言之:AMI 事件流需要主动监听一系列事件并从流中解析数据。为了处理流,我总是创建一个单独的小程序(在 PHP 中使用 PAGI),它处理事件流并通过 WebSocket 将事件发送回主机应用程序(在两者上都使用 HOA Websocket结束)。
采用这种方法的原因是:
- 允许小型轻量级程序完成侦听所有 AMI 事件的工作。
- 将 'real-time' 系统与 Web 应用程序分离,并以与 Web 应用程序习惯被交谈的方式相称的方式与 Web 应用程序交谈
- 取消阻止从 AMI 流式传输事件的使用,因为您只需要查看事件,并通过套接字连接发送消息而不确认响应。
- 使用像 PAMI 这样的优秀库来处理 AMI 并共享一个自定义 DTO 库,以便将 AMI 原始信息映射到特定于应用程序的 DTO 只发生在 AMI 消费者程序上,而我的其他应用程序则不会必须了解 AMI。
- 最重要的是:运行 作为 Web 应用程序的 运行 时间配置很可能与旨在使用实时事件流的程序的配置有很大不同。如果您错过了一个活动,您将不会再参加!
一旦设置了 AMI 网关程序,它接收事件并将它们传递给主应用程序,您就可以使用 AMI 网关程序向 Asterisk 发送指令(Actions),并且您已经有了处理的方法操作的响应。