Прехвърляне на информация от asterisk към mysql. Изговаряне на текущото системно време на сървъра

Извършване на манипулации с MySQL база данни Инсталационната команда е част от пакета с добавки, който е наличен в Asterisk CVS. Това е ДОПЪЛНЕНИЕ към звездичката, този пакет не е инсталиран по подразбиране и трябва да бъде изтеглен и инсталиран от пакета с добавки MYSQL() Описание: Извършване на манипулации с MySQL базата данни MYSQL Syntax(Connect connid dhhost dbuser dbpass dbname).

Връзка с база данни. Аргументите съдържат стандартни параметри за свързване MySQL база данни, който ще бъде предаден на функцията mysql_real_connect. ИД на връзката ще бъде върнат в променливата $(connid).

MYSQL(Query resultid $(connid) query-string)

Изпълнява стандартна заявка към MySQL базата данни, заявката се съдържа в параметъра на низа на заявката, използвайки идентификатора на връзката, дефиниран в $(connid). Резултатът от заявката ще бъде съхранен в променливата $(resultid).

MYSQL(Извличане на fetchid $(resultid) var1 var2 ... varN)

Ако има налични записи за извличане в резултат на заявка към базата данни, $(fetchid) се задава на 1 и един запис ще бъде извлечен от върнатия резултат, съхранен в $(resultid). Получените стойности на полето ще бъдат присвоени на променливите $(var1), $(var2) ... $(varN) според реда, посочен в заявката.

Ако няма налични записи, тогава $(fetchid) ще бъде нулиран на 0 и $(var1), $(var2) ... $(varN) ще бъдат върнати непроменени.

MYSQL(Изчистване на $(resultid))

Изчиства паметта и структурите от данни, свързани с резултата от заявката.

MYSQL(Прекъсване на връзката $(connid))

Прекратява връзката с MySQL базата данни с дадения идентификатор.

Примери

exten => _X.,1,MYSQL(Connect connid localhost dbuser dbpass dbname)
разширение =>
разширение =>
exten => _X.,4,GotoIf($[$(AGIScript) = NULL]?5:7)
разширение => _X.,5,AGI($(DefaultAGIScript),$(EXTEN))
разширение => _X.,6,Goto(_X.,8)
разширение => _X.,7,AGI($(AGIScript),$(EXTEN))
exten => _X.,8,MYSQL(Изчистване на $(resultid))
exten => _X.,9,MYSQL(Прекъсване на връзката $(connid))
exten => _X.,10,Прекъсване


В горния пример, ако извикващият потребител прекъсне връзката, докато разговорът му е в ход, някъде между приоритет 5 и приоритет 7, тогава функциите MYSQL(Clear...) и MYSQL(Disconnect...) няма да бъдат изпълнени. В този случай връзката ще остане незатворена и с всяко ново такова обаждане броят на незатворените връзки ще се увеличава. В крайна сметка MySQL сървърът ще достигне ограничението за броя на едновременно отворените връзки към базата данни. (В зависимост от ограничението, зададено в конфигурационния файл на mysql). Следователно, за този случайтрябва леко да промените последователността от действия, както е показано по-долу:

exten => _X.,1,MYSQL(Connect connid localhost звездичка dbpass звездичка)
exten => _X.,2,MYSQL(Query resultid $(connid) SELECT\ scriptname\ from\ mac2pin\ where\ userid=$(CALLERIDNAME))
exten => _X.,3,MYSQL(Fetch fetchid $(resultid) AGIScript)
exten => _X.,4,MYSQL(Изчистване на $(resultid))
exten => _X.,5,MYSQL(Прекъсване на връзката $(connid))
exten => _X.,6,GotoIf($(fetchid)?7:9)
разширение => _X.,7,AGI($(DefaultAGIScript),$(EXTEN))
разширение => _X.,8,Прекъсване
разширение => _X.,9,AGI($(AGIScript),$(EXTEN))
exten => _X.,10,Прекъсване


Забележка за този случай. Тук изчистваме паметта и прекъсваме връзката с базата данни веднага след Fetch. Това гарантира, че преди да стартираме AGI скрипта, ние сме сигурни, че вече е извършено почистване на паметта и отделяне на базата данни. Този метод може да се използва, ако наистина трябва да получите нещо уникално или често променящо се от базата данни. Ако използвате цитати, те ще бъдат изпратени до приложението като част от заявката. Други знаци, които изискват екраниране, са кавички (\" и \"), запетая (\,) и обратна наклонена черта (\\). (Използвайте Mysqlscape- вижте примера по-долу) Полетата, върнати от заявката, ще бъдат присвоени на променливи в същия ред, в който са били върнати от MySQL. Не се препоръчва да използвате заявка като "SELECT *", защото няма гаранция, че върнатите полета ще бъдат в реда, в който очаквате да бъдат. Не е необходимо да използвате псевдоними за полета, избрани от базата данни като: „SELECT (дълъг израз) като short_name“, тъй като името на полето не влияе на реда на полетата, върнати от тази заявка. Описанието със звездичка за тази команда гласи, че $(fetchid) е зададено на TRUE, ако има налични записи. Не е правилно. Настроено е на 1, ако има данни от последното извличане и е настроено на 0, ако няма данни

exten => 888,1,MYSQL(Connect connid localhost ipcontact passwd ipcontact)
exten => 888,2,MYSQL(Query resultid $(connid) SELECT\ `number`\ FROM\ `phones`\ WHERE\ `channel`=\"$(chan)\")
exten => 888,3,MYSQL(Fetch foundRow $(resultid) number) ; извличане на ред
exten => 888,4,GotoIf($["$(foundRow)" = "1"]?7:5) ; напуснете цикъл, ако не е намерен ред
exten => 888.5,NoOp($(номер))
exten => 888,6,Goto(3) ; продължаване на цикъла, ако редът е намерен
exten => 888.7,MYSQL(Изчистване на $(resultid))
exten => 888,8,MYSQL(Прекъсване на връзката $(connid))

Бележки __Отбележете корекцията с MYSQL(Fetch). $(fetchid) - не е задължително да е зададено на 1, ако има налични данни. Тази функция задава това поле на 1, ако има данни само за това конкретно MYSQL(Fetch) извикване. Това първоначално беше неправилно обяснено след създаването на описанието на тази функция.
Ако не изчистите паметта и не прекъснете връзката с MySQL, връзките ще останат отворени и в крайна сметка ще достигнат ограничението, зададено за MySQL сървъра. Тогава единственият начин да коригирате тази ситуация е да рестартирате Asterisk или можете също да погледнете списъка с процеси и да убиете тези висящи процеси с командата kill.
В допълнение към горното, Flobi е измислил някакво извращение за почистване на ресурси. Тъй като не схванах логиката на действията му и ми се стори пълна глупост, не го преведох.

Файлът cdr.conf се използва за запис на параметри на повикване във файл или база данни. Съхраняването на записи на разговори понякога е необходимо за записване на разговори и време на разговор на абонат, предотвратяване на измами и т.н. . Настройките във файла cdr.conf определят как звездичката трябва да обработва тази информация.
Списък на някои параметри в раздела на файла cdr.conf:

enable = yes\no - Дали CDR е записан или не. По подразбиране е да.

batch = yes\no - Позволява данните да се записват в буфер, а не в базата данни, за да се намали натоварването на системата.
Ако е зададено да, данните може да бъдат загубени, ако системата се срине неочаквано!

размер = 100 Максимален брой CDR записи, натрупани в буфера преди предаване към сървърна част CDR системи за съхранение. Трябва да се използва, ако партида = да. По подразбиране е 100 записа.

време = 300 След колко време в секунди буферът се изчиства и данните се въвеждат в базата данни, независимо от броя на записите в буфера (определен от параметъра размер). Стойността по подразбиране е 300 s.

scheduleronly = да/не. Когато прехвърляте голям обем CDR записи към отдалечена база данни, трябва да зададете scheduleronly на yes. Тази настройка ще каже на Asterisk да обработи записа на CDR в нова нишка, като по същество присвоява специален планировчик на тази функция.

безопасно изключване = да/не. Задаването му на да ще попречи на Asterisk да се изключи напълно, докато буферът не бъде напълно изчистен и цялата информация не бъде записана в базата данни. Ако този параметър е настроен на не и Asterisk се изключва, докато има информация в буфера, тази информация вероятно ще бъде загубена.

endbeforehexten = да\не. Стойността по подразбиране е не. Ако посочите да, CDR ще бъде завършен преди да бъде изпълнено разширението h, така че стойностите на CDR като end и billsec да могат да бъдат извлечени в това разширение.

Повече информация можете да намерите в шаблона на файла cdr.conf.

Примерен cdr.conf файл:
;
; Конфигурация на машината за запис на подробности за повикване със звездичка
;
; CDR е подробен запис на повикване, който предоставя услуги за регистриране чрез различни
; сменяеми backend модули. Може да се запише подробна информация за разговора
; бази данни, файлове и др. Полезно за фактуриране, предотвратяване на измами, съответствие с
; Sarbanes-Oxley, известен още като Законът на Enron, QOS оценки и др.
;

; Определете дали да използвате или не CDR регистриране. Задаването на това на „не“ ще отмени
; всяко зареждане на backend CDR модули. По подразбиране е "да".
;активиране=да

; Определете дали да регистрирате неотговорени повиквания. Задаването на това на "да" ще
; докладвайте за всеки опит за позвъняване на телефон при опити за набиране, когато не е било
; отговори. Например, ако се опитате да наберете 3 разширения и тази опция е „да“,
; ще получите 3 CDR-а, по един за всеки телефон, на който е позвънено. По подразбиране е „не“. Някои
; намират тази информация за ужасно безполезна. Други го намират за много ценен. Забележете, в "да"
; режим, ще видите един CDR, с една от целите на повикването от едната страна и началния
; канал от другия и след това един CDR за всеки опитен канал. Това може да изглежда
; излишно, но не може да се помогне.
;
; Накратко, тази опция контролира отчитането на неотговорени повиквания, които имат само A
; партия. Обажданията, които се предлагат към изходяща линия, но не отговарят, остават
; регистрирано и това е очакваното поведение. (Това също така води до някои CDR от страна на B
; изход, тъй като имат страничния B канал като изходен канал и нямат дестинация
; канал.)
;без отговор=не

; Определете дали да регистрирате претоварени повиквания или не. Задаването на това на "да" ще
; докладвайте за всяко повикване, което не успява да завърши поради условия на претоварване. По подразбиране
; не е".
;задръстване = не

; Обикновено CDR не сазатворен, докато не бъдат завършени всички разширения
; изпълнение. Като активирате тази опция, CDR ще бъде прекратен преди изпълнение
; разширението "h" и манипулаторите за прекъсване, така че CDR стойностите като "end" и
; "billsec" може да бъде извлечен вътре в това разширение.
; Стойността по подразбиране е "не".
;endbeforehexten=не

; Обикновено полето "billsec" се регистрира в задните части (текстови файлове или бази данни)
; е просто крайното време (времето за затваряне) минус времето за отговор в секунди. Вътрешно
; звездичката съхранява времето в микросекунди и секунди. Чрез настройка
; започна секунди до "да", можешпринуди звездичката да докладва всяка секунда
; които са били инициирани (нещо като метод на заобикаляне). Технически това е
; когато микросекундната част от крайното време е по-голяма от микросекунда
; част от времето за отговор, тогава времето за billsec се увеличава с една секунда.
; Стойността по подразбиране е "не".
;initiatedseconds=не

; Определете пакетния режим на CDR, където вместо да публикувате CDR в края на
; всяко повикване, данните ще се съхраняват в буфер, за да се намали натоварването на
; сървър със звездичка. По подразбиране е "не".
;
; ПРЕДУПРЕЖДЕНИЕ ПРЕДУПРЕЖДЕНИЕ ПРЕДУПРЕЖДЕНИЕ
; Използването на групов режим може да доведе до загуба на данни след опасно прекъсване със звездичка
; т.е. софтуерен срив, прекъсване на захранването, убийство -9 и т.н.
; ПРЕДУПРЕЖДЕНИЕ ПРЕДУПРЕЖДЕНИЕ ПРЕДУПРЕЖДЕНИЕ
;
;партида=бр

; Определете максималния брой CDR, които да се натрупват в буфера преди публикуване
; ги към задните двигатели. "партида" трябва да бъде зададена на "да". По подразбиране е 100.
;размер=100

; Определете максималното време за натрупване на CDR в буфера, преди да ги публикувате
; към бекенд двигателите. Ако този срок е достигнат, то ще публикува
; записи, независимо от стойността, дефинирана за "размер". "партида" трябва да бъде зададена на
; "да". Имайте предвид, че времето е в секунди. По подразбиране е 300 (5 минути).
;време=300

; CDR машината използва вътрешния планировчик със звездички, за да определи кога да публикува
; записи. Публикуването може да се извърши в нишката на планировчика или ново
; може да се създаде нишка за изпращане на всяка партида. За малки партиди,
; може да е приемливо просто да използвате нишката на планировчика, така че задайте това на "да".
; За големи партиди кажете нещо над size=10, препоръчва се нова нишка, така че
; задайте това на "не". По подразбиране е "не".
;scheduleronly=не

; Когато изключвате asterisk, можете да блокирате, докато не бъдат изпратени CDR. Ако
; ако не го направите, тогава данните вероятно ще бъдат загубени. Винаги можете да проверите размера на
; пакетния буфер на CDR с командата CLI "cdr status". За да активирате блокирането на
; подаване на CDR данни по време на изключване на asterisk, задайте това на „да“. По подразбиране
; е "да".
;безопасно изключване=да

;
;
; ИЗБОР НА CDR "BACKEND" (какъв вид изход да се генерира)
;
; За да изберете бекенд, трябва да се уверите, че е правилната категория
; дефиниран в този файл, или че съответният конфигурационен файл съществува и има
; правилни определения в него. Ако има някакви проблеми, обикновено влизането ще стане
; мълчаливо се игнорира и не получавате резултат.
;
; Също така, имайте предвид, че можете да генерирате CDR записи във възможно най-много формати
; желание. Ако конфигурирате 5 различни CDR формата, тогава всяко събитие ще бъде регистрирано
; на 5 различни места! В примерните конфигурационни файлове всички формати са коментирани
; с изключение на формата cdr-csv.
;
; Ето всички възможни задни точки:
;
; csv, потребителски, мениджър, odbc, pgsql, радиус, sqlite, tds
; (също така, mysql е достъпен чрез asterisk-addons, поради лицензиране
; изисквания)
; (моля, имайте предвид също, че могат да бъдат създадени други бекендове чрез създаване
; нов backend модул в изходната директория cdr/!)
;
; Някои от модулите, необходими за осигуряване на тези бекендове, няма да бъдат изградени или инсталирани
; освен ако не са изпълнени някои изисквания за зависимост. Примери за това са pgsql, odbc,
; и т.н. Ако не получавате резултати, както бихте очаквали, първото нещо, което трябва да направите
; е да изпълните командата "make menuselect" и да проверите какви модули са налични,
; като погледнете в опцията "2. Запис на подробности за разговора" в главното меню. Ако твоят
; backend е маркиран с XXX, знаете, че командата "configure" не можа да намери
; необходимите библиотеки за тази опция.
;
; За да накарате CDR да се регистрират в plain-jane /var/log/asterisk/cdr-csv/Master.csv
; файл, дефинирайте категорията в този файл. Не е необходима база данни. Примерът
; конфигурационните файлове са настроени да предоставят този вид изход по подразбиране.
;
; За да получите персонализирани csv CDR записи, уверете се, че файлът cdr_custom.conf
; присъства и съдържа правилния раздел. Предимството на
; използване на този бекенд е, че можете да определите кои полета да изведете и в
; какъв ред. По подразбиране примерните конфигурации са настроени да имитират cdr-csv
; изход. Ако не правите никакви промени в съпоставянията, вие основно генерирате
; същото нещо като cdr-csv, но изразходването на повече CPU цикли за това!
;
; За да получите генерирани мениджърски събития, уверете се, че файлът cdr_manager.conf съществува,
; и разделът е дефиниран с единствената променлива "enabled = yes".
;
; За odbc се уверете, че всички правилни библиотеки са инсталирани, че "make menuselect"
; показва, че модулите са налични и файлът cdr_odbc.conf съществува и

;
; За pgsql се уверете, че всички правилни библиотеки са инсталирани, че "make menuselect"
; показва, че модулите са налични и файлът cdr_pgsql.conf съществува и
; има раздел с дефинирани правилни променливи.
;
; За регистриране в радиус бази данни, уверете се, че всички правилни библиотеки са инсталирани, това
; "make menuselect" показва, че модулите са налични и
; категорията е дефинирана в този файл и в този раздел се уверете, че "radiuscfg"
; променливата правилно сочи към съществуващ файл radiusclient.conf.
;
; За регистриране в бази данни на sqlite, уверете се, че файлът "cdr.db" съществува в директорията на журнала,
; което обикновено е /var/log/asterisk. Разбира се, подходящите библиотеки трябва да са налични
; по време на операцията "конфигуриране".
;
; За tds регистриране, уверете се, че правилните библиотеки са налични по време на „конфигуриране“
; фаза и че cdr_tds.conf съществува и е правилно настроен с категория.
;
; Освен това не забравяйте, че ако искате да регистрирате CDR информация в база данни, ще трябва да дефинирате
; конкретна таблица в тази база данни, за да работят нещата! Вижте директорията doc за повече подробности
; за това как да създадете тази таблица във всяка база данни.

Asterisk записва статистика автоматично, ако модулът cdr_csv.so е зареден; статистиката се съхранява по подразбиране в /var/log/asterisk/cdr-csv/Master.csv. По принцип тази статистика е достатъчна, но не е удобна за работа. Най-удобно е да се обработват статистики, съхранявани в базата данни. За да се записва статистика в MySQL, трябва да инсталирате от портовете:

първо добавяне на реда към Makefile:

CFLAGS+=-DMYSQL_LOGUNIQUEID

cd / usr / портове / net / asterisk-addons /
направи инсталацията чиста

В началото ще се появи диалогов прозорец за конфигуриране с един елемент:

┌───────────────────────────────────────── ──────────── ────────────────────┐ │ Опции за asterisk-addons 1.4.6_4 │ │ ┌───────── ────────── ───────────────────────────────────────── ──────┐ │ │ │ [ X] SAMPLE_CONFIG Инсталирайте примерни конфигурационни файлове │ │ │ │ │ │ │ │ │ │ ├─└──────────────────── ──────────── [OK] Cancel │ └───── ──────────────────────────────────────── ── ─────────── ──────────────┘

Изберете този елемент; той ви позволява да поставите примери за конфигурационни файлове. Примерите ще ни бъдат полезни и чакаме модула да бъде сглобен.
Естествено, вече трябва да имате MySQL сървър, при сглобяване на клиента портът ще бъде изваден от зависимости.
След като всичко е на мястото си, започваме настройката.
Първо, ще създадем база данни със звездичка в MySQL и потребител със звездичка с парола звездичка-123. За да направите това, свържете се с MySQL и изпълнете следните команди:

mysql -uroot
създаване на звездичка на база данни;
предостави всички на asterisk.* на "asterisk" @ "localhost", идентифициран от "asterisk-777";

а сега нека създадем таблица, в която ще съхраняваме информация:


ИЗПОЛЗВАЙТЕ звездичка;

СЪЗДАВАНЕ НА ТАБЛИЦА `cdr` (
` calldate` datetime NOT NULL по подразбиране "0000-00-00 00:00:00" ,
`clid` varchar(80) NOT NULL по подразбиране "",
` src` varchar(80) NOT NULL по подразбиране "",
`dst` varchar(80) NOT NULL по подразбиране "",
`dcontext` varchar(80) NOT NULL по подразбиране "",
`channel` varchar(80) NOT NULL по подразбиране "",
`dstchannel` varchar(80) NOT NULL по подразбиране "",
` lastapp` varchar(80) NOT NULL по подразбиране "",
` lastdata` varchar(80) NOT NULL по подразбиране "",
`продължителност` int(11) NOT NULL по подразбиране "0",
` billsec` int(11) NOT NULL по подразбиране "0",
` разпореждане` varchar(45) NOT NULL по подразбиране "",
`amaflags` int(11) NOT NULL по подразбиране "0",
` accountcode` varchar(20) NOT NULL default "",
` userfield` varchar(255 ) NOT NULL по подразбиране "",

` uniqueid` varchar(32) NOT NULL DEFAULT ""

) ;

Както можете да видите, таблицата по-долу изобщо няма индекси. Защо? Да, всичко е много просто, индексите се преизчисляват всеки път, когато се въведе нов запис, това забавя работата с базата данни. Ако обемът на разговорите е голям, това може да има отрицателно въздействие върху работата. Ако скоростта на изграждане на отчета е по-важна за вас (операция за избор, вземане на статистически извадки), можете да добавите индекси.

създаване на индекс cld_idx на cdr(calldate);
създаване на индекс src_idx на cdr(src);
създаване на индекс dst_idx на cdr(dst);
създаване на индекс acc_idx на cdr(accountcode);

Сега нека настроим връзка с MySQL; за да направите това, добавете настройки към нашия MySQL акаунт във файла /usr/local/etc/asterisk/cdr_mysql.conf:


[глобален]
име на хост=локален хост
dbname=звездичка
таблица = cdr
парола=звездичка-777
потребител=звездичка
чорап =/ tmp/ mysql.sock
потребителско поле =1

И заредете модула в звездичка. За да направите това, свържете се с работеща звездичка и заредете модула:
exten => _8.,1 ,MYSQL(Свързване connid localhost звездичка звездичка-777 звездичка)
exten => _8.,2 ,Dial(SIP/ prov1/ $(EXTEN) )
exten => h,1,MYSQL(Прекъсване на връзката $(connid))

Последният ред MYSQL(Disconnect $(connid)) е задължителен, той е посочен в разширението h. h е манипулатор, извикан по време на прекъсване, тоест когато комуникационният канал е прекъснат или просто когато една от страните затвори.

Най-често наричаният интерфейс е SIP. Обаждането се осъществява чрез командата Dial().


exten => 100,1,Dial(DAHDI/1,20,tTr)
exten => 100,2,Гласова поща(u100@по подразбиране)
exten => 100,102,Гласова поща(b100@по подразбиране)
;
exten => 105,1,Dial(SIP/105,20,tTr)
exten => 105,n,Гласова поща(u100@по подразбиране)
exten => 105,n,Гласова поща(b100@по подразбиране)

Този пример илюстрира различните налични опции, ако не се отговори на повикване. Първо се извиква каналът DAHDI/1, ако след 20 секунди никой не отговори, повикването се пренасочва към VoiceMail() със съобщението „абонатът не отговаря“ (u100), ако абонатът е зает, повикването ще продължи към приоритет N+101, в нашия случай това е приоритет 102 .

2.2.2 Маршрутизиране по CallerID в Asterisk

Пример за маршрутизиране чрез номер на повикване:


exten => 100/1234567,1,Претоварване
разширение => 100.1, набиране (DAHDI/1.20)
exten => 100,2,Гласова поща(u100)
exten => 100,102,Гласова поща(b100)

Ако се извика вътрешен номер 100, повикването се насочва към интерфейса DAHDI/1, освен ако повикването не е направено от абонат от номер 1234567. В този случай повикването се отхвърля. Примерът показва, че идентификационният номер на повикващия е посочен във формата "/1234567".

Друг пример за маршрутизиране, сега въз основа на липсата на CallerID:


exten => 100/,1,Zapateller
разширение => 100,1,Изчакайте(1)
exten => 100,2,Dial(DAHDI/1)

IN в този примерако пристигне повикване без CallerID, повикването се блокира с помощта на приложението Zapateller().

2.2.3 Обаждане на група телефони в Asterisk

Често се налага обаждането да бъде прехвърлено на друг телефон поради неприети повиквания. Нека да разгледаме как да направим това с помощта на примера „оператор“.


exten => _X.,1,Dial(DAHDI/1,15)
exten => _X.,2,Dial(DAHDI/1&DAHDI/2&DAHDI/3,15)
exten => _X.,3,Възпроизвеждане(фирмена пощенска кутия)
разширение => _X.,4,Гласова поща(100)
exten => _X.,5,Прекъсване

Обаждането идва към DAHDI/1, ако телефонът е зает или не отговори в рамките на 15 секунди, обаждането отива към група телефони, включително DAHDI/1. Ако никой не вдигне този път, обаждането отива към гласовата поща.

2.2.4 Вложени контексти

Един контекст може да включва други контексти, обработени в ред на изброяване.

включва => [||||]

Къде е включеният контекст
по желание може да се използва:

  • - часове, през които контекстът е валиден (например работно време 9:00-17:00)
  • -дни от седмицата (пон-пет)
  • - дни
  • - месеци


exten => _.,1,Dial(SIP/trunk1/$(EXTEN))

exten => _8.,1,Dial(SIP/trunk2/$(EXTEN))

включване => местно
включване => дълго

включване => местно

В този пример контекстът "local_long" включва два други контекста за град и комуникация на дълги разстояния, а контекстът "local_only" е само за градски.

2.2.5 Изходящи повиквания в диалплана на Asterisk

Посоката на изходящата комуникация може да се реализира чрез дефиниране на кратък код за достъп (например „9“) или чрез пълно дефиниране на модела на набираните номера.


ignorepat => 9
exten => _9810.,1,Dial(DAHDI/g2/$(EXTEN:1))
exten => _9810.,2,Претоварване
включва => дълги разстояния

ignorepat => 9
exten => _98XXXXXXXXXX,1,Dial(DAHDI/g2/$(EXTEN:1))
exten => _98XXXXXXXXXX,2,Претоварване
включване => местно

ignorepat => 9
exten => _9XXXXXX,1,Dial(DAHDI/g2/$(EXTEN:1))
exten => _9XXXXXX,2,Претоварване
включва => по подразбиране

Този пример разглежда 3 контекста с различни права за достъп Телефонна мрежаОбща употреба.

Конструкцията "ignorepat => 9" казва на Asterisk да не изключва тона за готовност след набиране на определената цифра.

Контекстът ви позволява да наберете международен номер с произволен брой цифри.
Контекст - междуселищен номер до 11 цифри.
Контекст - градски номер с дължина до 7 цифри.

Променливата $(EXTEN:1) премахва префикса:

  • $(123456789:1) - връща низ 23456789
  • $(123456789:-4) - връща низ 6789
  • $(123456789:0:3) - връща ред 123
  • $(123456789:2:3) - връща ред 345
  • $(123456789:-4:3) - връща ред 678

2.2.6 Тест за ехо на телефонен секретар

Необходим е тест за ехо на телефонния секретар, за да може абонатът да се обади, да тества качеството на комуникацията и работата на клиентското си оборудване. Когато позвъните на произволен вътрешен номер (например 7000), ще се случи следното:

  • Ние отговаряме на обаждането.
  • Възпроизвежда се предварително подготвен аудио файл с поздрав.
  • Гласът на повикващия се записва за няколко секунди, след което се възпроизвежда на повикващия.
  • Пуска се предварително подготвен прощален аудио файл.
  • Прекратете разговора.

За да реализирате този сценарий, добавете към файла extension.conf:

Exten => 7000,1,Answer() ;Вдигни телефона
exten => 7000,n,Wait(2) ;Изчакване 2 секунди
exten => 7000,n,Възпроизвеждане(/etc/asterisk/sounds/demo-echotest) ;Възпроизвеждане на поздрава
exten => 7000,n,Wait(1) ;Изчакване 1 секунда
exten => 7000,n,Set(fname=/etc/asterisk/sounds/records/$(STRFTIME($(EPOCH),%Y-%m-%d__%H-%M-%S))__$( CALLERID(номер))) ;Задайте името и местоположението на аудио файла
exten => 7000,n,Record($(fname).gsm,0,10,x) ;Записва гласа на обаждащия се за 10 секунди
exten => 7000,n,Playback(/etc/asterisk/sounds/beep) ;Уведомяване за края на гласовия запис със сигнал
exten => 7000,n,Изчакайте(1) ;Изчакване
exten => 7000,n,Playback($(fname)) ;Възпроизвеждане на гласов запис
exten => 7000,n,Възпроизвеждане(/etc/asterisk/sounds/demo-echodone) ;Възпроизвеждане за довиждане
exten => 7000,n,Wait(2) ;Изчакване
exten => 7000,n,Hangup() ;Прекратете разговора

2.2.7 Гласов ток Системно времесървъри

Разширение = 060,1, Възпроизвеждане (добре дошли)
exten = 060,n,PlayBack(цифри/днес)
exten = 060,n,SayUnixTime(,a)
exten = 060,n,SayUnixTime(,k)
exten = 060,n,Възпроизвеждане(часове)
exten = 060,n,SayUnixTime(,M)
exten = 060,n,Възпроизвеждане(минути)
exten = 060,n,Възпроизвеждане(сбогом)
exten = 060,n,Hangup()

2.2.8 Функция за запис на глас

Exten = 98,1,Отговор()
разширение = 98,n,запис(/tmp/myrecord%d:wav)
exten = 98,n,Изчакайте(1)
exten = 98,n,Възпроизвеждане($(RECORDED_FILE))
exten = 98,n,Изчакайте(1)
exten = 98,n,Hangup()

2.2.9 Как да изберете желания изходящ маршрут, когато използвате шаблони

Всеки контекст, дефиниран в план за набиране, казва на Asterisk как да обработва телефонни номера, които се обаждат в този контекст. Тъй като имате възможност да използвате шаблони, когато дефинирате разширения, е много вероятно повикваният телефонен номер да бъде свързан не с едно, а с няколко разширения в контекста. Asterisk няма да търси подходящи съвпадения с разширения на шаблони в реда, който сте описали в плана за набиране, защото Първо, разширенията на шаблона се сортират. Следователно Asterisk може да обработи повикването телефонен номерсъвсем не така, както би искал.

Този пример описва как Asterisk сортира разширенията на шаблони и как да контролира този ред на сортиране, за да гарантира, че Asterisk избира разширението, което искате, когато две или повече разширения на шаблони може да съвпадат с повиквания номер. Нека разгледаме контекста "пример", например искате обажданията до всички номера, които започват с 918, да преминават през аналогов телефонна линия, свързан към интерфейса DAHDI/1, а всички останали разговори минаваха през интерфейса SIP/200. Нека напишем пример:


exten => _918.,1,Dial(DAHDI/1/$(EXTEN),tTr)
exten => _.,1,Dial(SIP/200/$(EXTEN))
exten => h,1,прекъсване

Но този дизайн не работи както трябва! Ще откриете, че независимо от набрания номер, всички разговори се извършват през интерфейса SIP/200. Факт е, че Asterisk първо сортира разширенията и едва след това търси първото съвпадение. За да видите в какъв ред Asterisk търси съответстващо разширение, въведете командата в конзолата на Asterisk: "покажи пример за план за набиране" . Ще видите, че разширенията са сортирани в следния ред:

1. _.
2. _918.
3. ч

Имайте предвид, че този ред изобщо не е същият като този, който сте дефинирали във файла extensions.conf. Записът в този списък е _. е първият и означава съвпадение с всеки набран номер, включително номера, които започват с 918. Струва си да се отбележи, че разширението h (затваряне) също никога няма да бъде избрано, защото то също ще съответства на модела _.
И така, как можем да принудим Asterisk да проверява разширенията на шаблона за съвпадения в реда, от който се нуждаем? Има изход - това е да използвате директивата include, включвайки в текущия контекст друг контекст, съдържащ разширения на шаблони. Например:


включване => пример-под
exten => h,1,прекъсване
exten => _918.,1,Dial(Zap/1/$(EXTEN))

exten => _.,1,Dial(Zap/2/$(EXTEN))

Сега Asterisk (за контекста на "примера") ще провери числото за съвпадение в следния ред:

1. _918.
2.ч
3. _.

Какво прави Asterisk в този случай:

  • Записите в Exten в контекста на „пример“ ще бъдат записани първи и съответно първо ще бъдат проверени.
  • Включените контексти на всяка директива за включване ще бъдат съхранени в реда, в който са описани.

Активираните контексти ще бъдат проверени за съвпадения в реда, в който са описани във файла extensions.conf

2.2.10 Динамично маршрутизиране на клипове

Входящи повиквания към разширение за повикване

Разширение на Asterisk прави изходящо повикване към стационарен телефон или мобилен номер. Когато външен обаждащ се обади обратно на градска линия Asterisk, неговото повикване се насочва директно към извикващото разширение на Asterisk. За определяне на вътрешния номер на повикващия се използва стандартната MySQL база данни asteriskcdrdb, която се създава от уеб интерфейса на FreePBX.


exten => _X.,1,Set(CHANNEL(language)=ru)
exten => _X.,n,Set(CALLID=$(CALLERID(num):-11))
exten => _X.,n,MYSQL(Свържете connidcdr localhost userdb passworddb asteriskcdrdb utf8);; Всички ОБАДЕТЕ
exten => _X.,n,MYSQL(Query resultidcdr $(connidcdr) SELECT * FROM cdr WHERE dst LIKE "%$(CALLID)%" ORDER BY calldate DESC)
;; САМО БЕЗ ОТГОВОР
;;exten => _X.,n,MYSQL(Query resultidcdr $(connidcdr) SELECT * FROM cdr WHERE dst LIKE "%$(CALLID)%" AND disposition LIKE "NO ANSWER" ORDER BY calldate DESC)
;;
exten => _X.,n,MYSQL(Fetch fetchid $(resultidcdr) accid calldate clid src dst)
exten => _X.,n,Set(number=$(src))
exten => _X.,n,NoOp(повикващ --> $(clid) callee --> $(dst))
exten => _X.,n,GOTOIF($["$(dst)" = ""]?nodst:dst)
exten => _X.,n(dst),MYSQL(Изчистване на $(resultidcdr))
разширение =>
exten => _X.,n,Dial(SIP/$(номер),20,tT)
exten => _X.,n,GotoIf($["$(DIALSTATUS)" = "BUSY"]?nodst)
exten => _X.,n,GotoIf($["$(DIALSTATUS)" = "NOANSWER"]?nodst)
exten => _X.,n,GotoIf($["$(DIALSTATUS)" = "НЕУСПЕШНО"]?nodst)
exten => _X.,n(nodst),MYSQL(Изчистване на $(resultidcdr))
exten => _X.,n,MYSQL(Прекъсване на връзката $(connidcdr))
exten => _X.,n,Goto(from-trunk,$(DID),1)
exten => h,1,hangup()

Извадка от данни за последните 120 минути

SELECT * FROM cdr WHERE dst LIKE "%$(CALLID)%" AND calldate >= DATE_SUB(NOW(), INTERVAL 120 MINUTE) ORDER BY calldate DESC;

или след три часа:

SELECT * FROM cdr WHERE dst LIKE "%$(CALLID)%" AND calldate >= DATE_SUB(NOW(), INTERVAL 03 HOUR) ORDER BY calldate DESC;

Конзолен изход на Asterisk при маршрутизиране чрез cdr база данни:

Изпълнява се [3216111@from-samsung:1] Goto("SIP/samsung-00001694", "dynamic_did,3216111,1") в нов стек
-- Към (dynamic_did,1111,1)
-- Изпълнява се [3216111v@dynamic_did:1] Set("SIP/samsung-00001694", "CHANNEL(language)=ru") в нов стек
-- Изпълнява се [3216111@dynamic_did:2] Set("SIP/samsung-00001694", "CALLID=8129981138") в нов стек
-- Изпълнение на [3216111@dynamic_did:3] MYSQL("SIP/samsung-00001694", "Свързване connidcdr localhost userdb passworddb asteriskcdrdb utf8") в нов стек
-- Изпълнение [3216111@dynamic_did:4] MYSQL("SIP/samsung-00001694", "Query resultidcdr 11 SELECT * FROM cdr WHERE dst LIKE "%8129981138%" AND calldate >= DATE_SUB(NOW(), INTERVAL 03 HOUR) “) в нов стек
-- Изпълнение на [3216111@dynamic_did:5] MYSQL("SIP/samsung-00001694", "Fetch fetchid 12 accid calldate clid src dst") в нов стек
ПРЕДУПРЕЖДЕНИЕ: app_mysql.c:498 aMYSQL_fetch: ast_MYSQL_fetch: Повече полета (24), отколкото променливи (5)
-- Изпълнява се [3216111@dynamic_did:6] Set("SIP/samsung-00001694", "number=1000") в нов стек
-- Изпълнение на [3216111@dynamic_did:7] NoOp("SIP/samsung-00001694", "кой се обади --> 1000, който се обади --> 8129981138") в нов стек
-- Изпълнение на [3216111@dynamic_did:8] GotoIf("SIP/samsung-00001694", "0?nodst:dst") в нов стек
-- Към (dynamic_did,1111,9)
-- Изпълнение на [3216111@dynamic_did:9] MYSQL("SIP/samsung-00001694", "Изчистване 12") в нов стек
-- Изпълнява се [3216111@dynamic_did:10] MYSQL("SIP/samsung-00001694", "Прекъсване на връзката 11") в нов стек
-- Изпълнява се [3216111@dynamic_did:11] Набиране ("SIP/samsung-00001694", "SIP/1000,20,tT") в нов стек

2.2.11 Въвеждане на DTMF сигнали от клавиатурата на телефона и запис на данни в текстов файл

Повикващият въвежда dtmf сигнали, набраните номера се записват в текстов файл.

Exten => s,1,Answer()
разширение => s,2,възпроизвеждане (код за достъп)
exten => s,3,Read(myvar,beep,6,15)
exten => s,n,SayDigits($(myvar))
exten => s,n,Set(CDR(userfield)=$(myvar))
exten => s,n,Verbose($(myvar))
exten => s,n,System(echo "$(CALLERID(num))" - "$(myvar)" >> /var/log/asterisk/test)

Описание на контекстните стъпки:

  • Отговор - отговор на повикване (установяване на връзка)
  • Възпроизвеждане - възпроизвеждане на стандартно съобщение (въведете кода).
  • Четене - чете данни, въведени от потребителя, и ги запазва в променливата $myvar
  • SayDigits - произнесете данните, съхранени в променлива.
  • Задайте / функция "CDR" - запис на данни от променлива в потребителското поле CDR.
  • Verbose - извежда променливи данни към конзолата и регистрира.
  • Система - запис на данни променливо в текстов файл на нов ред.

2.2.12 Въвеждане на DTMF сигнали от клавиатурата на телефона и запис в базата данни MySQL

Exten => s,n,Authenticate(/tmp/pass,a)
exten => s,n,Playback(/var/lib/asterisk/sounds/custom/data)
exten => s,n,Read(data,beep,3,15)
exten => s,n,SayDigits($(данни))
exten => s,n,MYSQL(Connect connid localhost test test test)
exten => s,n,MYSQL(Query resultid $(connid) INSERT INTO _$(myvar) SET callerid=$(CALLERID(име)), data=$(data), date=$(STRFTIME($(EPOCH) ,%C%y%m%d%H%M)))
exten => s,n,MYSQL(Изчистване на $(connid))

Подобно на предишния пример, само данните се записват в MYSQL.

MYSQL(Connect connid dhhost[:dbport] dbuser dbpass dbname ) - свържете се с базата данни
MYSQL(Query resultid $(connid) query-string) - запис на данни в базата данни
MYSQL(Clear $(resultid)) - изчистване на паметта

2.2.13 Ограничаване на броя на едновременните повиквания до набран номер

  • Набира се номер 810ХХХХХХХ, в конзолата се изписва съобщение: Звездичка набиране 810ХХХХХХХ
  • функцията GROUP() присвоява повиквания към дълга група
  • Съобщението се показва в конзолата: Броят на едновременните повиквания е $(GROUP_COUNT(long)), където $(GROUP_COUNT(long) = пореден номер на повикване.
  • Условието се проверява, ако броят на едновременните повиквания е по-голям от 1, повикването се изпраща до разширение 666 и се прекъсва от изхода на конзолата: Броят на едновременните повиквания е 2 над ограничението.
  • Ако повикването е първото, номерът се набира през SIP trunk на доставчика.

    Exten => _810.,1,Verbose(1,***** Набиране със звездичка $(EXTEN) *******)
    същото => n, Set (GROUP()=long)
    същото => n,Verbose(1,**** Броят на едновременните повиквания е $(GROUP_COUNT(long)))
    същото => n,GotoIf($[$(GROUP_COUNT(long)) > 1]?666)
    същото => n, Set(CDR(userfield)=unblocked$(EXTEN))
    същото => n,Dial(SIP/провайдер/$(EXTEN),60)
    същото => 666,Verbose(1,***Броят едновременни повиквания са $(GROUP_COUNT(long)) над ограничението)
    същото => n, Set (DIALSTATUS=CHANUNAVAIL)

    2.2.14 Резервни връзки и LCR (избор на посока за изходящи повиквания с най-ниска цена)

    Много е полезно да конфигурирате LCR (маршрутизиране на крайбрежието) и пренасочване в случай на повреда на външната линия.


    exten => _98XXXXXXXXXX,1,Dial(DAHDI/g2/$(EXTEN:1))
    exten => _98XXXXXXXXXX,2,Congestion()

    exten => _98495XXXXXXX,1,Dial(IAX/trunk/$(EXTEN:1),tTr)
    exten => _98495XXXXXXX,n,Dial(DAHDI/g2/$(EXTEN:1))
    exten => _98495XXXXXXXX,n,Congestion()

    включва => low_rate_moscow
    включва => такса на дълги разстояния

    В този пример разговорите на дълги разстояния се насочват към интерфейса DAHDI, но разговорите към Москва се насочват през по-изгоден доставчик към IAX магистралата. Ако IAX магистралата не е налична, повикванията се пренасочват през DAHDI.

    Една от най-популярните (или може би непопулярни) функции на всяка съвременна телефонна система е гласовата поща. Естествено, Asterisk има доста гъвкава система гласова поща. Сред неговите възможности можем да споменем:

    • Неограничен размер, защитени с парола кутии за гласова поща, всяка от които съдържа папки за поща за
    • организиране на гласови съобщения.
    • Различни поздрави за заети и недостъпни състояния.
    • Стандартни и специални поздрави.
    • Възможност за свързване на телефони към множество пощенски кутии и пощенски кутии към множество телефони.
    • Известие за получаване на гласово съобщение по имейл с възможност за прикачване на гласово съобщение
    • поща като звуков файл.
    • Препращане и излъчване на гласова поща.
    • Индикатор за чакащо съобщение (мигаща светлина
    • или прекъсващ тон) в много видове телефони.
    • Указател на гласови пощенски кутии за служители на компанията.

    Конфигурацията на гласовата поща е описана в конфигурационния файл voicemail.conf. Този файл съдържа набор от настройки, които могат да се използват за приспособяване на системата за гласова поща към вашите специфични изисквания.

    Създаване пощенски кутии- Различни пощенски кутии са дефинирани във всеки контекст на гласова поща. Следният синтаксис се използва за описание на пощенска кутия:
    пощенска кутия => парола,име[,имейл[,имейл_пейджър[,опции]]]
    Нека обясним целта на всяка част от описанието на пощенската кутия:

    • пощенска кутия - Това е номерът на пощенската кутия. Това обикновено съответства на вътрешния номер на свързания с него телефонен апарат.
    • парола - цифрова парола, която ще се използва от собственика на пощенската кутия за достъп до неговата гласова поща. Ако потребителят промени паролата си, системата актуализира това поле във файла voicemail.conf.
    • име - Това е името на собственика на пощенската кутия. Текстът в това поле се използва в телефонния указател на компанията, за да позволи на абонатите да използват потребителски имена, когато се обаждат.
    • имейл - Това е имейл адресът на собственика на кутията за гласова поща. Asterisk може да изпраща известия за гласова поща (включително самото съобщение за гласова поща) до определен имейл акаунт.
    • pager_email - Това е имейл адресът на пейджъра или мобилния телефон на собственика на кутията за гласова поща. Asterisk може да изпрати кратко съобщение, което ви уведомява, че е получено гласово съобщение до определен имейл адрес.
    • опции – Това е списък с опции, които определят часовата зона, в която се намира собственикът на пощенската кутия и заменят глобалните настройки за гласова поща. Има девет валидни опции: прикачване, сървърна поща, tz, saycid, преглед, оператор, обратно извикване, набиране и изходен контекст. Тези опции се идентифицират чрез двойки опция=стойност, разделени с вертикална черта (|). Опцията tz задава часовата зона на потребителя към часовата зона, определена по-рано в раздела на файла voicemail.conf. Останалите осем опции заместват глобалните настройки за гласова поща, съответстващи на техните имена.

    Ето типично описание на пощенска кутия:

    101 => 1234, Джо Публик, [имейл защитен] ,[имейл защитен],tz=central|attach=да

    Продължавайки със създаването на нашия диалплан от миналата глава, нека настроим гласови пощенски кутии за Джон и Джейн. Нека дефинираме паролата за Джон като 1234, а за Джейн като 4444 (не забравяйте, че това се прави във файла voicemail.conf, а не в extensions.conf):


    101 => 1234, Джон Доу, [имейл защитен] ,[имейл защитен]
    102 => 4444, Джейн Доу, [имейл защитен] ,[имейл защитен]

    Добавяне на гласова поща към плана за набиране - Сега, след като създадохме пощенски кутии за Джейн и Джон, нека направим възможно обаждащите се да оставят съобщения за тях, ако не отговорят на повикването. За целта ще използваме приложението VoiceMail(). Приложението VoiceMail() насочва обаждащия се към определената пощенска кутия, за да може да остави съобщение. Пощенската кутия трябва да бъде описана като: mailbox@context, където context е името на контекста на гласовата поща. Буквите b или u също могат да бъдат добавени тук, за да поискате вида на поздрава. Ако се използва буквата b, абонатът ще чуе съобщение, че собственикът на пощенската кутия е зает. Ако се използва u, обаждащият се ще чуе съобщение, което показва, че собственикът на пощенската кутия (ако има такъв) не е наличен. Нека приложим това в нашия диалплан. Преди това следният ред беше разположен в контекста, предоставяйки възможността за извикване на Джон:

    Exten => 101.1,Dial($(JOHN))

    Сега нека добавим недостъпно съобщение, което обаждащият се ще чуе, ако Джон не отговори на повикването в рамките на 10 секунди.
    Не забравяйте, че вторият аргумент на приложението Dial() е времето за изчакване. Ако на повикването не се отговори преди изтичането на времето за изчакване, повикването се пренасочва към следващия приоритет. Нека да зададем времето за изчакване на 10 секунди и да добавим приоритет за прехвърляне на абоната към гласова поща, ако Джон не отговори на повикването навреме:

    Exten => 101,1,Dial($(JOHN),10)
    exten => 101,n,Гласова поща(101@по подразбиране,u)

    Сега нека коригираме това, така че ако Джон е зает (при друго повикване), обаждащият се пренасочва към гласова поща, където чува съобщение за заето. За да направим това, ще използваме променливата $(DIALSTATUS), която съдържа една от стойностите на състоянието (списък с всички възможни стойности може да бъде получен в конзолата на Asterisk с помощта на командата "core show application dial"):

    Exten => 101,1,Dial($(JOHN),10)
    exten => 101,n,GotoIf($["$(DIALSTATUS)" = "BUSY"]?busy:unavail)
    exten => 101,n(неналичен),Гласова поща(101@по подразбиране,u)
    exten => 101,n,Hangup()
    exten => 101,n(заето),Гласова поща(101@по подразбиране,b)
    exten => 101,n,Hangup()

    Повикващите вече ще получават съобщението на гласовата поща на Джон (с подходящ поздрав), ако Джон е зает или недостъпен. Остава обаче малък проблем - Джон няма възможност да извлече съобщенията си. Нека поправим това.

    Достъп до гласова поща - Потребителите могат да извличат своите съобщения в гласовата поща, да променят опциите и да записват поздравления в гласовата поща с помощта на приложението VoiceMailMain(). В типичния си формуляр за приложение VoiceMailMain() се извиква без аргументи. Нека добавим разширение 700 към контекста на плана за набиране, така че вътрешните потребители да могат да извършват повиквания за достъп до техните съобщения в гласовата поща:

    Exten => 700,1,VoiceMailMain()

    Създаване на телефонен указател за набиране на номер по име - Има една последна забележителна функция на гласовата система Поща със звездичкателефонен указателза набиране на номер по име. Създава се с помощта на приложението Directory(). Това приложение, използвайки имената, посочени в описанията на пощенските кутии във файла voicemail.conf, предоставя на абоната телефонен указател на PBX абонати за набиране на номера по име.

    Directory() приема три аргумента: контекста на гласовата поща, от който се четат имената, контекста на плана за набиране, в който се извиква
    потребител (по избор) и низ с опции (също по избор). По подразбиране Directory() търси потребител по фамилия.
    Ако е подадена опцията f, търсенето се извършва по име. Нека добавим две директории за набиране на номер по име в контекста на нашия
    примерен план за набиране, така че абонатите да могат да търсят или по име, или по фамилия:

    Exten => 8,1,Директория(по подразбиране,входящи,f)
    разширение => 9,1,Директория(по подразбиране,входящи)

    Ако абонатите натиснат бутон 8, те ще получат указател, компилиран по име. Ако наберат 9, ще получат указател, съставен по фамилия.

    2.2.16 Zapateller()

    Zapateller() е просто приложение на Asterisk, което възпроизвежда специален информационен тон в началото на разговора. Автоматичните дайлери (често използвани в системите за телепродажби) приемат този тон като сигнал за прекъсване на връзката. И те
    Те не само ще прекратят разговора, но и ще маркират номера като извън услуга, което ще помогне да се избегнат всички видове обаждания за телемаркетинг. За да използвате тази функционалност във вашия диалплан, просто извикайте приложението Zapateller().

    Ние също прилагаме опционалната опция nocallerid, така че тонът да се възпроизвежда само ако входящото повикване не предоставя информация за идентификацията на обаждащия се. Ето пример за използване на Zapateller() в контекстно разширение:


    разширение => s,1,Zapateller(nocallerid)
    exten => s,n,Playback(въведете-ext-of-person)

    2.2.17 Паркиране на повикване

    Друга удобна функция е паркирането на разговори. Той предоставя възможност за задържане на повикване и паркиране, така че да може да се отговори на друг вътрешен номер. Всички настройки за паркиране на разговори (като разширения за използване, брой места и т.н.) се задават в конфигурационния файл features.conf. Разделът features.conf на файла съдържа четири настройки относно паркирането на повиквания:

    • parkext - Това е вътрешният номер за паркиране. Прехвърлете повикване към този вътрешен номер и системата ще ви каже в кое място за паркиране се намира. Стандартният вътрешен номер за паркиране е 700.
    • parkpos - Тази опция определя броя на местата за паркиране. Например, като посочите номера 701–720, вие ще създадете 20 места за паркиране, номерирани 701–720.
    • контекст - Това е името на контекста за паркиране. За да можете да паркирате повиквания, трябва да активирате този контекст.
    • време за паркиране - Ако тази опция е зададена, тя определя колко дълго (в секунди) може да остане повикване на паркинг. Ако обаждането не бъде отговорено в рамките на определеното време, се извършва обаждане до вътрешния номер, от който е дошло обаждането на паркинга.

    След като редактирате файла features.conf, трябва да рестартирате Asterisk, защото този файл се чете само при стартиране на системата. Изпълнението на командата за презареждане няма да прочете файла features.conf.

    Също така имайте предвид, че тъй като потребителят трябва да може да прехвърля повиквания към разширение за паркиране, приложението Dial() трябва да използва опциите t и/или T.

    Така че нека създадем прост диалплан, за да демонстрираме паркиране на повиквания:


    включва => паркирани повиквания
    exten => 103,1,Dial(SIP/Bob,tT)
    exten => 104,1,Dial(SIP/Charlie,tT)

    Нека илюстрираме принципа на паркиране на повикване. Да кажем, че Алис се обажда на системата и набира вътрешен номер 103, за да говори с Боб. След известно време Боб прехвърля повикването към вътрешен номер 700, което му казва, че обаждане от Алис е паркирано в слот 701. След това Боб се обажда на Чарли на вътрешен номер 104 и му казва, че Алис чака на 701. Чарли набира вътрешен номер 701 и говори с Алис. Това е просто и ефективен методпредоставят възможност за превключване на обаждащите се между потребители на системата.
    Аргументите t и T на Dial() не са необходими за всички типове канали. Например, много SIP телефони прилагат това с помощта на функция или обикновен бутон и SIP сигнализиране.

    2.2.18 Организиране на конферентен разговор с помощта на MeetMe()

    Също толкова полезна функция е установяването на аудиоконферентен разговор с помощта на приложението MeetMe(). Това приложение позволява на множество абонати да комуникират едновременно, сякаш всички са физически на едно място. Основните функции включват:

    • Възможност за създаване на конференции, защитени с парола.
    • Администриране на конференцията (заглушаване на конференцията, блокиране на конференцията, изключване на участници).
    • Възможност за заглушаване на всички участници с изключение на един (полезно за фирмени съобщения, предавания и др.).
    • Създаване на статични или динамични конференции.

    Нека преминем през процеса на създаване на основна конферентна зала стъпка по стъпка. Опциите за конфигуриране на конферентната система MeetMe се намират във файла meetme.conf. Този конфигурационен файл указва стаи за срещи и незадължителни цифрови пароли. (Ако
    е зададена парола, ще се изисква влизане във всички конференции, провеждани с помощта на тази конферентна зала.) За нашия пример ще настроим конферентна зала на разширение 600. Първо ще зададем всички настройки във файла meetme.conf. Нека наречем тази конферентна зала
    600 и този път няма да задаваме парола:


    conf => 600

    След като приключите работата с конфигурационния файл, трябва да рестартирате Asterisk, за да може отново да прочете файла meetme.conf. След това ще добавим поддръжка на конферентна зала към диалплана с помощта на приложението MeetMe(). MeetMe() приема три аргумента: името на стаята за срещи (зададено в meetme.conf), набор от опции и парола, която потребителят трябва да въведе, за да се присъедини към срещата. Нека настроим проста конференция, използвайки конферентна зала 600, опцията i (която осигурява предупреждение, когато някой се е присъединил или напуснал конференцията) и паролата 54321:

    Exten => 600,1,MeetMe(600,i,54321)

    Когато обаждащите се достигнат до вътрешен номер 600, те ще бъдат подканени да въведат парола. Ако въведат правилно 54321, ще бъдат допуснати до конференцията.
    Друго полезно приложение е MeetMeCount(). Както подсказва името му, това приложение брои колко потребители има
    в една или друга конферентна зала. Необходими са два аргумента: залата за срещи, където трябва да се преброи броят на участниците, и незадължителното име на променливата, в която да се съхрани този номер. Ако вторият аргумент, тоест името на променливата, не е дадено, полученото число се възпроизвежда на повикващия:

    Exten => 601,1, Възпроизвеждане (conf-thereare)
    exten => 601,n,MeetMeCount(600)
    exten => 601,n,Възпроизвеждане(conf-peopleinconf)
    Ако променлива се подаде като втори аргумент на MeetMeCount(), общият брой участници се присвоява на тази променлива и самият номер
    не може да се играе. Ето как можете да ограничите броя на участниците:
    ; ограничете конферентната зала до 10 участници
    exten => 600,1,MeetMeCount(600,CONFCOUNT)
    exten => 600,n,GotoIf($[$(CONFCOUNT) 600,n(meetme),MeetMe(600,i,54321)
    exten => conf_full,1,Playback(conf-full)

    2.2.19 Обаждане на 3 (или повече) страни в Asterisk с помощта на ConfBridge()

    Тази настройка ви позволява да извършвате n-way повикване в Asterisk с помощта на приложението ConfBridge.
    Решението е адаптация на решението за работа с ConfBridge (по-ново конферентно приложение на Asterisk от MeetMe, което също не зависи от DAHDI модула).
    За да работи тази схема, Asterisk трябва да има изградени модули app_confbridge.so и chan_bridge.so.

    Описание на функционалността

    Код *0 се добавя към сервизните кодове на Asterisk (трябва да бъде описан във файла features.conf и добавен към променливата DYNAMIC_FEATURES). Кодът на услугата *0 предизвиква изпълнението на макроса nway-start, който създава конференция с име като UNIQUEID за текущото повикване и пренасочва абонат, който не е инициатор на конференцията, към създадената конференция. След това абонатът, стартирал конференцията, има възможност да добави 3-ти участник към конференцията.

    Следните кодове на услуги са достъпни за абонат, добавящ нов участник към конференция:

    • ** - прекратете разговора, не добавяйте извиканата страна към конференцията
    • # - добавяне на извиканата страна към конференцията

    След изпълнение на някой от тези сервизни кодове, абонатът, който е добавил нов участник, се връща в конференцията. Всички абонати в конференцията имат достъп до сервизен код *0. След като изпълни този код, абонатът напуска конференцията, получава възможността да добави участник към конференцията и след това се връща обратно в конференцията. Броят на едновременните разговори с n-страни и техните участници е ограничен само от производителността на сървъра.

    1) Настройки на ConfBridge: confbridge.conf


    тип = потребител
    тип = потребител
    тип = меню
    *0 = напускане на_конференция

    2) План за набиране: extensions.conf


    exten => s,1,ChannelRedirect($(BRIDGEPEER),nway-conf,$(CONFNO),1)
    ;

    exten => s,1,Read(NEW_CALLEE,dial,20,i)

    същото =>

    същото =>
    същото =>
    същото =>
    същото =>
    същото => n,Dial(Local/$(NEW_CALLEE)@from-internal ,gH)
    същото =>
    същото => n,ChannelRedirect($(CHANNEL(име)),nway-conf,$(CONFNO),1)
    ;

    exten => _X.,1,Отговор
    същото => n, Set(__CONFNO=$(EXTEN))
    същото => n, Set(DYNAMIC_FEATURES=$(DYNAMIC_FEATURES_NWAY))
    същото => n,Set(CONFBRIDGE(мост,език)=$(КАНАЛ(език)))
    същото => n, Set(CONFBRIDGE(user,announce_user_count)=no)
    същото => n, Set(CONFBRIDGE(user,announce_join_leave)=no)
    същото => n, Set(CONFBRIDGE(user,announce_only_user)=no)
    същото => n, Set(CONFBRIDGE(user,music_on_hold_when_empty)=yes)
    същото => n,ConfBridge($(CONFNO),nway_menu)
    същото => n, Goto(nway-invite,s,1)
    ;

    exten => s,1,Set(__CONFNO=$(UNIQUEID))
    същото => n,ChannelRedirect($(BRIDGEPEER),nway-conf,$(CONFNO),1)
    същото => n,Четене(NEW_CALLEE,dial,20,i)
    ; Добавете динамични функции за n-way покани
    същото => n, Set(DYNAMIC_FEATURES=$(DYNAMIC_FEATURES_NWAYINV))
    ; Определете контекста на набиране и наберете
    същото => n,ExecIf($[$(REGEX("H" $(DIAL_OPTIONS))) = 0]?Set(_DIAL_OPTIONS=$(DIAL_OPTIONS)H))
    същото => n, Set (CALLER=$(CALLERID(num)))
    същото => n,Set(DIALOUT_CONTEXT=$(SIPPEER($(CALLER),контекст)))
    същото => n,ExecIf($["$(DIALOUT_CONTEXT)" = ""]?Set(DIALOUT_CONTEXT=from-internal))
    същото => n,Dial(Local/$(NEW_CALLEE)@$(DIALOUT_CONTEXT) ,gH)
    същото => n,Set(DYNAMIC_FEATURES=$(DYNAMIC_FEATURES_NWAY)) n,ChannelRedirect($(CHANNEL(име)),nway-conf,$(CONFNO),1)

    3) Кодове на услугата Asterisk: features.conf


    прекъсване на връзката=**
    nway-start => *0,self,Macro,nway-start
    nway-ok => #,self/caller,Macro,nway-ok>

    Добавете към файла extensions.conf


    DYNAMIC_FEATURES = функция1#функция2#nway-start
    DYNAMIC_FEATURES_NWAY = функция1
    DYNAMIC_FEATURES_NWAYINV = функция2#nway-ok

    Описание на променливите:

    • прекъсване на връзката - стандартен сервизен код на Asterisk, който кара текущия разговор да приключи, feature1, feature2 - други потребителски кодове на услуги, конфигурирани на Asterisk (различни сервизни кодове могат да бъдат предоставени на различни етапи от конференцията).
    • DYNAMIC_FEATURES_NWAY - сервизни кодове, налични по време на n-way разговор
    • DYNAMIC_FEATURES_NWAYINV - сервизни кодове, налични по време на покана за n-way разговор

    2.2.20 Записване на телефонни разговори във формат (.wav).

    Записването на разговори е доста удобна функция. Винаги можете да слушате кой на кого какво е казал. Настройката не е сложна, просто включете функциите Monitor или MixMonitor в плана за набиране, за да обработите тази посока. Разликата между тези функции е, че Мониторът записва отделно гласа на повикващия и гласа на повикващия различни файлове. И MixMonitor създава един файл, който съдържа и двете посоки на разговора.
    В плана за набиране изглежда така за Monitor:


    exten => _8X.,1,Set(fname=$(STRFTIME($(EPOCH),%Y%m%d%H%M))-$(CALLERID(номер))-$(EXTEN))
    exten => _8X.,2,Монитор(wav,/home/share/monitor/$(fname),mb)
    exten => _8X.,3,Dial(SIP/trunk1/$(EXTEN),tTr)

    В този пример с първия ред, Set(fname и т.н., ние описваме името на файла, в който ще се съхранява записът на разговора. В нашия случай името на файла ще се състои от датата и часа, когато е извършено повикването , номерът на обаждащия се и къде се обажда, както вече беше споменато, ще се състои от два файла в края, числата 1 и 2 ще бъдат добавени съответно към номерата на каналите.
    И вторият пример е използването на MixMonitor, всичко е също толкова просто:


    exten => _8.,1,Set(fname=$(STRFTIME($(EPOCH),%Y%m%d%H%M))-$(CALLERID(номер))-$(EXTEN))
    exten => _8.,2,MixMonitor(/home/share/monitor/$(fname).wav)
    exten => _8.,3,Dial(SIP/trunk2/$(EXTEN),tTr)

    Тук всичко е същото, само има по-малко флагове в командата MixMonitor, тук се въвежда само името на файла с разширение.

    2.2.21 Записване на разговори на Asterisk с лесно управление чрез CLI

    Този документ описва как да създадете селективна система за запис на разговори, базирана на Asterisk.

    Кратко описание на решението

    Всички излизат и изходящо обажданесе изпраща в контекста за активиране на запис на разговор, в който се изпълнява търсене на правила на ниво специален диалплан. Вътрешна база данни на Asterisk се използва за съхраняване на правилата за запис. Този подход позволява:

    • използвайте вградени DB функции за търсене на стойности;
    • използвайте конзолата Asterisk и командата база данни, за да промените правилата.

    В базата данни има два клона:

    • rec_a - този клон съдържа номерата на абонат A (callerid), за които трябва да активирате запис;
    • rec_b - съответно в този клон правилата за броя на абонатите B (dnid).

    *CLI> база данни put rec_a 701 1
    Базата данни е актуализирана успешно
    *CLI> база данни put rec_b 2323956 1
    Базата данни е актуализирана успешно
    *CLI> показва база данни
    /rec_a/701: 1
    /rec_b/2323956: 1
    *CLI>

    В горния пример бяха създадени две правила. Единият ще записва всички обаждания от вътрешен потребител с номер 701, другият ще записва всички обаждания до номер 2323956. Както можете да видите, използва се флагът за активност на правилото - 0 или 1. Това ви позволява временно да деактивирате записа, без да изтривате номера от базата данни.

    Формат на запис
    Записаните файлове се записват в папката /var/spool/asterisk/monitor в следния формат:

    data/yyyy/mm/dd/hh_MM_ss_a_b_callid, където:

    • yyyy - година на запис;
    • mm - месец на запис;
    • дд - ден на запис;
    • hh - час на започване на разговора;
    • MM - минута на започване на разговора;
    • ss - секунда от началото на разговора;
    • a - абонатен номер a или неизвестен, ако callerid е скрит;
    • b - абонатен номер b;
    • callid - ID на повикване.

    По този начин името на файла съдържа цялата необходима информация, за да намерите желания запис по-късно. Когато използвате приложения, които хостват свои собствени презаписванеМожете да спрете записа на разговор. Когато прехвърляте повикване, трябва също да спрете записа на разговора в TRANSFER_CONTEXT и да започнете да записвате отново.

    План за набиране на звездичка

    По-долу е даден фрагмент от плана за набиране на Asterisk, който прилага описаната по-горе логика.

    extensions.conf:



    разширение =>
    exten => _X.,n,Dial(DAHDI/g1/$(EXTEN),t)

    разширение => _X.,1,Gosub(подзапис,$(EXTEN),1)
    exten => _X.,n,Dial(SIP/$(EXTEN),T)

    exten => s,1,StopMixMonitor()
    exten => _X.,1,Set(CALLER=unknown)
    exten => _X.,n,GoToIf($?db)
    exten => _X.,n,Set(CALLER=$(CALLERID(num)))
    exten => _X.,n(db),GotoIf($?record:stop)
    exten => _X.,n,GotoIf($?record:stop)
    exten => _X.,n(запис),MixMonitor(данни/$(STRFTIME(,%G/%m/%H_%M_%S))_$(CALLER)_$(CALLED).gsm)
    разширение => _X.,n(стоп),Връщане

    Недостатъци: Времето в името на файла е времето на пристигане на обаждането, но не и началото на разговора. За да посочите началния час на разговор, трябва да създадете символна връзка или да го преименувате след края на разговора

    2.2.22 Будилник на Asterisk

    Има много повече от един начин за внедряване на будилник в Linux (вероятно най-простият: „sleep 20m && mpg123 ~/bell.mp3“), но искам нещо красиво и нестандартно. Търсене в интернет за „събуждане със звездичка“ ще върне няколко решения, написани с помощта на различни езиципрограмиране и малко по-различен както в процеса на инсталиране, така и във възможностите. Най-популярният от тях е PHP скриптът wakeup.php, чийто автор е Andi Wysocki. Изтеглете tar архива от връзката, разопаковайте php файла в директория с AGI скриптове (Asterisk Gateway Interface - интерфейс на шлюз, чрез който външни програми могат да контролират диалплана на Asterisk) и го направете изпълним: “chmod a+x /var/lib /asterisk/agi -bin/wakeup.php" (желаната директория може да се намери, като се погледне стойността на променливата astagidir в конфигурацията на asterisk.conf).
    Скриптът wakeup.php съдържа редица променливи, които трябва да бъдат коригирани, като се вземат предвид системните настройки:

    ; Местоположението на PHP интерпретатора може да е различно в различните Linux системи
    #!/usr/bin/php -q
    ; По-добре е да премахнете дневника от /tmp
    $parm_error_log = "/var/log/asterisk/wakeup.log";
    ; По подразбиране скриптът създава временни файлове в /tmp,
    ; но ако тази директория е на отделен дял, wakeup.php ще откаже да работи, така че:
    $parm_temp_dir = "/var/spool/asterisk/tmp";

    Принципът на стартиране на скрипта е подобен на примера с Motion - просто въвеждаме информация за новия номер в extensions.conf:

    Exten => *97,1,Answer()
    разширение => *97,n,AGI(wakeup.php)
    exten => *97,n,Hangup()

    Сега просто трябва да се обадите на *97 и при поискване да въведете часа, когато системата трябва да извърши обратно повикване. Например, за да настроите аларма за 17:55 (днес е финалът за купата английска лига), наберете „0555“, а след това „2“ (1 - преди обяд, 2 - след обяд).
    Ако срещнете проблеми с изпълнението на скрипта, инсталирайте пакетите php5-cli и asterisk-sound-extra и използвайте помощната програма fromdos, за да приведете wakeup.php към стандартите на Unix.

    2.2.23 SIP/SIMPLE текстови съобщения в Asterisk

    Методът SIP MESSAGE (RFC 3428), известен също като SIMPLE протокол, се използва за препращане на съобщения. В Asterisk поддръжката му се появи във версия 10. Функционална конфигурация (използва се Asterisk версия 11).
    Опция 1
    Раздел за файл sip.confдобавят се редове:


    outofcall_message_context = съобщения
    auth_message_requests = не

    И в диалплан extensions.confдобавен е контекст:


    exten => _XXX,1,MessageSend(sip:$(EXTEN),"$(CALLERID(име))"$(MESSAGE(от)))

    Въведете количеството X в съответствие с броя на цифрите във вашите вътрешни номера.

    Вариант №2
    Раздел за файл sip.confдобавят се редове:

    Accept_outofcall_message = да
    outofcall_message_context = astms
    текстова поддръжка = да
    auth_message_requests = да

    И в диалплан extensions.confдобавен е контекст:


    exten => _.,1,NoOp(SMS получаване на диалплан извикан)
    exten => _.,n,NoOp(До $(MESSAGE(до)))
    exten => _.,n,NoOp(От $(MESSAGE(от)))
    exten => _.,n,NoOp(Body $(MESSAGE(body)))
    exten => _.,n,Set(ACTUALTO=$(CUT(MESSAGE(to),@,1)))
    exten => _.,n,MessageSend($(ACTUALTO),$(MESSAGE(from)))
    exten => _.,n,NoOp(Състоянието на изпращане е $(MESSAGE_SEND_STATUS))
    exten => _.,n,GotoIf($["$(MESSAGE_SEND_STATUS)" != "УСПЕХ"]?sendfailedmsg)
    exten => _.,n,Hangup()
    exten => h,1,Hangup()
    ;
    exten => _.,n(sendfailedmsg),Set(MESSAGE(body)="[$(STRFTIME($(EPOCH),%d%m%Y-%H:%M:%S))] Вашето съобщение до $(EXTEN) не бе успешно. Опитайте отново по-късно.")
    exten => _.,n,Set(ME_1=$(CUT(MESSAGE(from), exten => _.,n,Set(ACTUALFROM=$(CUT(ME_1,@,1)))
    exten => _.,n,MessageSend($(ACTUALFROM),ServiceCenter)
    exten => _.,n,Hangup()
    exten => h,1,Hangup()

    2.2.24 Функционалност за службата за сигурност и управление на фирма - Подслушване на разговори онлайн

    Опция 1


    разширение => 5555,1,Макро(user-callerid)
    exten => 5555,2,Authenticate(1234)
    exten => 5555,3,Четене(SPYNUM,agent-newlocation)
    exten => 5555.4,ChanSpy(SIP/$(SPYNUM))

    Вариант №2


    разширение => _555XX.,1,chanspy(sip/$(EXTEN:3))
    exten => 556,1,ChanSpy(channel,B) - и двата канала се чуват, като например тристранна конференция
    exten => 557,1,ChanSpy(channel,q) - каналите не чуват, вие чувате всичко
    exten => 558,1,ChanSpy(channel,w) - само каналът, към който се свързвате, може да ви чуе, вие можете да чуете и двата канала

    Основното шоу на приложението ChanSpy команда показва всички функционални опции

    Ето как работи на няколко телефона

    Exten => *9720,1,ChanSpy(SIP/720,wqv(-1))
    exten => *9701,1,ChanSpy(SIP/701,wqv(-1))
    exten => *9700,1,ChanSpy(SIP/700,wqv(-1))

    Вариант No3

    ;listen - Слушайте разговорите (те не могат да ви чуят)
    exten => _*222x.#,1,Macro(user-callerid,)
    exten => _*222x.#,n,Отговор
    разширение => _*222x.#,n,NoCDR
    разширение => _*222x.#,n,Изчакайте(1)
    разширение => _*222x.#,n,ChanSpy(sip/$(EXTEN:4),q)
    exten => _*222x.#,n,Hangup ;whisper - Нахлуване в разговор
    exten => _*223x.#,1,Macro(user-callerid,)
    exten => _*223x.#,n,Отговор
    разширение => _*223x.#,n,NoCDR
    разширение => _*223x.#,n,Изчакайте(1)
    разширение => _*223x.#,n,ChanSpy(sip/$(EXTEN:4),qw)
    exten => _*223x.#,n,Hangup ;barge - Всички 3 участници могат да чуят
    exten => _*224x.#,1,Macro(user-callerid,)
    exten => _*224x.#,n,Отговор
    разширение => _*224x.#,n,NoCDR
    разширение => _*224x.#,n,Изчакайте(1)
    разширение => _*224x.#,n,ChanSpy(SIP/$(EXTEN:4),qB)
    exten => _*224x.#,n,Прекъсване