hamel1on писал(а):Через AMI тоже можно, но сложно. Надо писать демон, который будет отслеживать эти события, также можно с помощью этого демона задать переменную канала с временем наступления этого события. А после разрыва соединения эту переменную занести в CDR, через exten=>h,1 ... . Вариант хороший. Еще есть варианты?
Там демон строк от силы в 50 выходит, вот 90% демона :
....
#include <astxx/manager.h>
#include <astxx/manager/action/agi.h>
namespace manager = astxx::manager;
namespace action = astxx::manager::action;
manager::connection *connection;
void process_event(astxx::manager::message::event e)
{
if ((e["Event"] == "Newstate") && (e["ChannelStateDesc"] == "Ringing")) {
// ....
}
}
...
int main() {
string ami_host = "localhost";
string ami_name = "ami7";
string ami_pass = "ami7_pass";
try {
connection = new manager::connection(ami_host);
boost::signals::scoped_connection c =
connection->register_event("", process_event);
action::login login(ami_name, ami_pass);
login(*connection);
for (;;) {
connection->wait_event();
connection->pump_messages();
connection->process_events();
}
}
catch (const manager::action::channel_not_found &c) {
cerr << "main: channel not found " << endl;
}
return 0;
}
....