Pull to refresh

Asterisk+Lua+регулярное обновление DEF кодов

Reading time 3 min
Views 5.7K
Снова всех приветствую. После написания прошлой статьи про использование lua в астериске, пришла мысль про небольшое пояснение об использовании DEF-кодов совместно с lua. Ранее тут пролетала статья про генерацию кодов используя скрипт на php. Я этим скриптом успешно пользовался и пользуюсь, но с небольшими (совсем не большими) доработками.


Приводить листинг самого скрипта не буду, вы можете его прочитать по ссылке:
habrahabr.ru/post/150793
тут укажу только сами доработки.

Первое — нам надо генерировать код на lua и сохранять его по стандартному «библиотечному» пути (/usr/lib/lua/5.1 или для 64бит систем /usr/lib64/lua/5.1). Для этого в выше упомянутом скрипте в самом его начале делаем запись:

$dp = fopen('/usr/lib/lua/5.1/mphonetable.lua','w');		//lua dialplan

эту строчку я вставил сразу после
$defs = array();


Далее, в конце оригинального скрипта, после цикла foreach я добавил следующую запись, которая генерирует код на lua:

# генерируем шаблоны для правила набора выхода через 9ку
$linecode = '98';

fwrite($dp,"extensions.mobile_out={\n");

foreach($regs as $op => $reg) {
    foreach($reg as $r) {
	fwrite($dp,"\t[\"_");
	echo "\t[\"_";
        echo $linecode.$r.'"]=call_mobile;'."\n";
        $line = $linecode.$r.'"]=call_mobile;'."\n";
        fwrite($dp,$line);
    }
}

# генерируем шаблоны для правила набора выхода без 9ки
$linecode = '8';

foreach($regs as $op => $reg) {
    foreach($reg as $r) {
	fwrite($dp,"\t[\"_");
	echo "\t[\"_";
        echo $linecode.$r.'"]=call_mobile;'."\n";
        $line = $linecode.$r.'"]=call_mobile;'."\n";
        fwrite($dp,$line);
    }
}
fwrite($dp,"\tinclude = {\"out_trunk\"};\n");
fwrite($dp,"}\n");
fclose($dp);


call_mobile — это функция которая обрабатывает события выхода на сотовые.

Второе — нам нужно применить изменения в Астериске:

#--------------------------------------------------------
ob_implicit_flush(true);
set_time_limit(0);
#Основные настройки
$host="192.168.xxx.xxx";          # айпишник сами вставите
$port="5038";
$user="login";
$pass="password";
$wrets="";
#открываем сокет
$socket = fsockopen("$host","$port");
if (!$socket) exit("no connect to ats");
#авторизация
fputs($socket, "Action: login\r\n");
fputs($socket, "Events: off\r\n");
fputs($socket, "UserName: $user\r\n");
fputs($socket, "Secret: $pass\r\n\r\n");
fputs($socket, "Action: command\r\n");
fputs($socket, "command: module reload pbx_lua\r\n\r\n");
fputs($socket, "Action: logoff\r\n\r\n");
#читаем ответ
while (!feof($socket)) {
    $line = fread($socket,8192);
    echo $line;
}
fclose($socket);

# там далее идут две функции оригинального скрипта...


Третье — сам скрипт вешаем в crone и забываем про его существование :) У меня скрипт исполнялся раз в сутки.

На самом деле можно избежать громоздкой записи экстеншена и реализовать парсинг собития выхода на внешку через функцию, но тут спорный вопрос — не факт что это будет оптимально. Описание событий всё ровно составляется не руками, а автоматом, поэтому можно после написания вообще забыть про эту проблему.

Про маршруты непосредственно самих звонков (какие направления через что или кого пропускать) тут вы уже сами решайте. У меня стояло около 8 gsm шлюзов. Для выхода на сотовые использовались два сотовых оператора с интересными тарифами. Эконимия должна быть экономной:).

Всё. До свиданья!
Tags:
Hubs:
+4
Comments 0
Comments Leave a comment

Articles