VIDEOCHAT  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

Call Completion Request -- syntax error

Проблемы Asterisk без вэб-оболочек и их решения

Модераторы: april22, Zavr2008

Ответить
sadm
Сообщения: 21
Зарегистрирован: 17 авг 2011, 21:41

Call Completion Request -- syntax error

Сообщение sadm »

Пытаюсь настроить CCSS на Asterisk 10.4.0 согласно доке:
https://wiki.asterisk.org/wiki/display/ ... on+Example

Поскольку я храню пользователей в mysql, добавил поля cc_agent_policy и cc_monitor_policy со значением generic в базу.

В extensions.ael добавил следующий код:

Код: Выделить всё

 _30 => {
    CallCompletionRequest();
    Hangup();
 };

 _31 => {
    CallCompletionCancel();
    Hangup();
 };
Пытаюсь заказать звонок:
Звоню с телефона 1 на телефон 2 (занятый), ложу трубку, поднимаю, набираю 30, ложу.
Ложу трубку на телефоне 2 -- начинает звонить телефон 1, беру трубку на телефоне 1, звонок рвётся.

В логах вот что:

Код: Выделить всё

[Feb  7 15:56:05] VERBOSE[1856] pbx.c:     -- Executing [~~s~~@wrapdial:1] MSet("SIP/8899-00000d87", "LOCAL(to)=") in new stack
[Feb  7 15:56:05] ERROR[1856] app_stack.c: Tried to set LOCAL(to), but we aren't within a Gosub routine
[Feb  7 15:56:05] VERBOSE[1856] pbx.c:     -- Executing [~~s~~@wrapdial:2] MSet("SIP/8899-00000d87", "LOCAL(timeout)=") in new stack
[Feb  7 15:56:05] ERROR[1856] app_stack.c: Tried to set LOCAL(timeout), but we aren't within a Gosub routine
[Feb  7 15:56:05] VERBOSE[1856] pbx.c:     -- Executing [~~s~~@wrapdial:3] MSet("SIP/8899-00000d87", "LOCAL(roc)=") in new stack
[Feb  7 15:56:05] ERROR[1856] app_stack.c: Tried to set LOCAL(roc), but we aren't within a Gosub routine
[Feb  7 15:56:05] VERBOSE[1856] pbx.c:     -- Executing [~~s~~@wrapdial:4] Set("SIP/8899-00000d87", "NEWTO=") in new stack
[Feb  7 15:56:05] VERBOSE[1856] pbx.c:     -- Executing [~~s~~@wrapdial:5] AGI("SIP/8899-00000d87", "distchange.php,") in new stack
[Feb  7 15:56:05] VERBOSE[1856] res_agi.c:     -- Launched AGI Script /var/lib/asterisk/agi-bin/distchange.php
[Feb  7 15:56:05] VERBOSE[1856] res_agi.c:     -- <SIP/8899-00000d87>AGI Script distchange.php completed, returning 0
[Feb  7 15:56:05] VERBOSE[1856] pbx.c:     -- Executing [~~s~~@wrapdial:6] Set("SIP/8899-00000d87", "to=") in new stack
[Feb  7 15:56:05] WARNING[1856] ast_expr2.fl: ast_yyerror():  syntax error: syntax error, unexpected '=', expecting $end; Input:
[Feb  7 15:56:05] WARNING[1856] ast_expr2.fl: If you have questions, please refer to https://wiki.asterisk.org/wiki/display/AST/Channel+Variables
[Feb  7 15:56:05] VERBOSE[1856] pbx.c:     -- Executing [~~s~~@wrapdial:7] GotoIf("SIP/8899-00000d87", "?8:10") in new stack
[Feb  7 15:56:05] VERBOSE[1856] pbx.c:     -- Goto (wrapdial,~~s~~,10)
[Feb  7 15:56:05] VERBOSE[1856] pbx.c:     -- Executing [~~s~~@wrapdial:10] Dial("SIP/8899-00000d87", ",,Ttr") in new stack
[Feb  7 15:56:05] WARNING[1856] app_dial.c: Dial requires an argument (technology/number)
[Feb  7 15:56:05] VERBOSE[1856] pbx.c:   == Spawn extension (wrapdial, ~~s~~, 10) exited non-zero on 'SIP/8899-00000d87'
[Feb  7 15:56:05] VERBOSE[1856] pbx.c:     -- Executing [h@wrapdial:1] Goto("SIP/8899-00000d87", "9991") in new stack
[Feb  7 15:56:05] VERBOSE[1856] pbx.c:     -- Goto (wrapdial,h,9991)
[Feb  7 15:56:05] VERBOSE[1856] pbx.c:     -- Executing [h@wrapdial:9991] Set("SIP/8899-00000d87", "~~parentcxt~~=") in new stack
[Feb  7 15:56:05] VERBOSE[1856] pbx.c:     -- Executing [h@wrapdial:9992] GotoIf("SIP/8899-00000d87", "1?9996") in new stack
[Feb  7 15:56:05] VERBOSE[1856] pbx.c:     -- Goto (wrapdial,h,9996)
[Feb  7 15:56:05] VERBOSE[1856] pbx.c:     -- Executing [h@wrapdial:9996] NoOp("SIP/8899-00000d87", "") in new stack
Не смог нагуглить ничего внятного по этой ошибке.
Прошу помощи - что я делаю не так?
ded
Сообщения: 15626
Зарегистрирован: 26 авг 2010, 19:00

Re: Call Completion Request -- syntax error

Сообщение ded »

Вам Астериск говорит человечьим языком что не так -
Dial requires an argument (technology/number)
потому что изменили строку Dial, и вместо аргумента ${EXTEN} там пусто.
Dial("SIP/8899-00000d87", ",,Ttr")

А аргумента нету, потому что квадратные колёса на велосипеде не крутятся:
MSet("SIP/8899-00000d87", "LOCAL(to)=")
MSet("SIP/8899-00000d87", "LOCAL(timeout)=")
ругается на синтаксис макроса Gosub.
sadm писал(а):Прошу помощи - что я делаю не так?
Ну, как бы помягче, судя по этому логу - всё делаете не так, просто всё.
sadm
Сообщения: 21
Зарегистрирован: 17 авг 2011, 21:41

Re: Call Completion Request -- syntax error

Сообщение sadm »

ded писал(а):Ну, как бы помягче, судя по этому логу - всё делаете не так, просто всё.
Извиняюсь за своё скудоумие, но я не понимаю на какое место оно ругается. Где этот неправильный Dial находится?
Теоретически, астериск должен использовать процедуру дозвона до абонентов из того контекста, в котором находится заказавший обратный вызов абонент. Процедура вызова внутренних абонентов одна единственная и вот уже пол года работает без изменений и нареканий. Я просто добавил заказ звонка (CallCompletionRequest) в конфиг и поля agent_policy и cc_monitor_policy в базу.
Ещё раз извиняюсь.
ded
Сообщения: 15626
Зарегистрирован: 26 авг 2010, 19:00

Re: Call Completion Request -- syntax error

Сообщение ded »

Прозвучало ключевое (для меня) понятие - "процедура дозвона до обонентов".
Это автообзвон.
По идейным соображениям я не буду ничего подсказывать по этой теме.
sadm
Сообщения: 21
Зарегистрирован: 17 авг 2011, 21:41

Re: Call Completion Request -- syntax error

Сообщение sadm »

ded писал(а):Прозвучало ключевое (для меня) понятие - "процедура дозвона до обонентов".
Не понимаю что не так в этом понятии?
У меня два вида внутренних абонентов, до которых нужно дозваниваться. Соответственно нужно было создать процедуру автоматического выбора способа дозвона.

Код: Выделить всё

 _8[345678]XX => {                          //Вызовы внутренних абонентов
    &cidchange_local(${CALLERID(num)});
    Answer();
    AGI(migrated_numbers.php,${EXTEN});     //смотрим, переведён ли номер на астериск, ищем его в таблице migrated_numbers
    if(${NUMMIGRATED} = 1) {                //нашли - звоним на сип
        &CheckUser(${EXTEN});
            switch (${usertype}) {
                case 7:                                  //С агентами
                    Queue(${EXTEN},nr,,,${GLOBAL(QUEDIALTIME)});
                default:                                 //Несуществующие
                    break;
            };
        &wrapdial(SIP/${EXTEN},${GLOBAL(INTDIALTIME)},0);
    }
    else {                                  //нет - на аваю
        &wrapdial(DAHDI/i1/62${EXTEN},${GLOBAL(INTDIALTIME)},0);
    };
    &dialstatspeak(${DIALSTATUS});
    Hangup();
 };

macro wrapdial(to,timeout,roc) {
 Set(NEWTO=${to});                //Инициируем переменную, в которую скрипт передаст изменённое значение
 AGI(distchange.php,${to});       //Выбираем из таблицы distchange значения, встречающиеся в нашем номере и заменяем
 Set(to=${NEWTO});                //совпадения на нужные значения (например SIP/sipnet/8 заменить на SIP/sipnet/7)
 if(${roc} = 1) {                 //Звоним. Параметр roc у нас во всех случаях 0, timeout - глобальный параметр ${GLOBAL(ISPDI
ALTIME)}
   Dial(${to},${timeout},Ttm(ring));//m: Проигрывать звонящему абоненту музыку ожидания (Music on Hold) до тех пор, пока на вы
зов не ответят. Этот параметр абсолютно взаимоисключающий с параметром 'r'. Используйте m(class) для обозначения, из какого по
дкласса выбрать эту музыку.
 }
 else {
   Dial(${to},${timeout},Ttr);      //r: Генерировать сигналы вызова звонящему абоненту (ложный КПВ). 
 }
 Set(D4HANGUPSTATUS=${HANGUPCAUSE});
 return;
};


Дада. Вот такой вот колхоз. Номерная ёмкость распределена между * и avaya definity. И мы потихоньку съезжаем на первый.
ded
Сообщения: 15626
Зарегистрирован: 26 авг 2010, 19:00

Re: Call Completion Request -- syntax error

Сообщение ded »

Как-то всё сложно у вас, всё на ручной передаче, блоки и кабестаны. К тому же на AGI.

Код: Выделить всё

//смотрим, переведён ли номер на астериск, ищем его в таблице migrated_numbers
Если самописным конфигом и без AGI, то всё проще, например так:
exten => _8[345678]XX,1,Dial(SIP/1${EXTEN}&DAHDI/g1/1${EXTEN},,tT)

Если при помощи freePBX, то ещё наглядней. Каждый абонент пускай заведён как SIP extension (пусть и не существующий пока) и как кастомный пир вида DAHDI/g1/122, и для каждого включить Follow me со стратегией ring all, что, сопсно, и будет так же, как выше изложено. Только менеджмент попонятней.
Ответить
© 2008 — 2025 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH