ВидеоКонф(ВКС)  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

В поисках адекватной литературы.

Новичком считается только что прочитавший «Астериск - будущее телефонии»
http://asterisk.ru/knowledgebase/books
и пытающийся сделать большее

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

Re: В поисках адекватной литературы.

Сообщение Anubis_66RUS » 20 фев 2020, 14:33

Как не помочь! Конечно поможем! Алгоритм, описанный выше, носит название "Нормализация (то есть приведение к единому виду) Caller ID". Вот по этому ключу и поищите.

Вы не совсем правильно меня поняли. Нормализация - несколько другое. Моя задача в конкретном примере - маршрутизация. Т.е. по факту блок-схема обработки должна быть типа такого
Код: выделить все
Принят вызов
ЕСЛИ
{
  {citynumber} СРЕДИ {тут должна быть ссылка на облако значений}
                    Отправляем вызов на очередь1
   ИНАЧЕ
            ЕСЛИ {citynumber} СРЕДИ {тут должна быть ссылка на ВТОРОЕ облако значений}
                    Отправляем вызов на очередь2
                ИНАЧЕ
                    Отправляем вызов на очередь3
}


Если и синтаксис я могу получить используя операторы exten, то как объяснить астериску что такое облако значений которые нужно проверять до меня наотрез отказывается доходить(

Мимо!
Это мы первым шагом назначаем переменной CDR(userfield) бессмысленное с точки зрения CDR слово input. Создатель этого действия придумал так, типа, чтобы легко фильтровать по этому полю в CDR чтобы разом получить все входящие (!) звонки одним запросом. Но тот же результат можно получить как минимум двумя другими, штатными фильтрациями. Но об этом потом.

Данная строка вероятнее всего писалась для нашей CRM, вероятнее всего по этому слову происходила фильтрация для снятия данных в колонку "входящий/исходящий" для формирования отчета из CDR во внешнее прилолжение. Но на данном этапе для меня это шаманство немного более высокого уровня чем я нахожусь, поэтому спорить не буду :)

Синтаксис, с примерами, комментариями и пояснениями:
Глава 6. Основы диалплана
- как раз оно/

Лично сам переводил. Можно сказать специально для Вас!

Большое спасибо что стараетесь на благо мирового опенсорса. Не сочтите за сарказм, но это очередная проверка на необходимые для работы знания?
Код: выделить все
wget http://asterisk.ru/store/files/Asterisk-The_Definitive_Guide_4/chapter_6.odt
--2020-02-20 15:33:01--  http://asterisk.ru/store/files/Asterisk-The_Definitive_Guide_4/chapter_6.odt
Распознаётся asterisk.ru (asterisk.ru)… 198.101.10.130, 2a02:16d8:104:5::130
Подключение к asterisk.ru (asterisk.ru)|198.101.10.130|:80... соединение установлено.
HTTP-запрос отправлен. Ожидание ответа... 200 OK
Длина: 1208592 (1,2M) [application/octet-stream]
Сохранение в: «chapter_6.odt»

chapter_6.odt                                          2%[==>                                                      ]  31,69K   158KB/s
chapter_6.odt                                          6%[======>                                              ]  72,70K   182KB/s
chapter_6.odt                                          7%[=======>                                            ]  84,01K   209KB/s   за 0,4s     

2020-02-20 15:33:02 (209 KB/s) - Соединение закрыто, позиция 86025. Повтор.
Anubis_66RUS
 
Сообщений: 18
Зарегистрирован: 17 фев 2020, 10:55

Re: В поисках адекватной литературы.

Сообщение ded » 20 фев 2020, 15:33

Да что-то там в Америке спаммеры и кулхацкеры дудосят ресурсы, забили HDD под 100%, временные файлы уже никак в /tmp не создавались. Сейчас всё откроется даже без wget. Или скачайте всё целиком
http://asterisk.ru/store/files/Asterisk ... de_4th.pdf
и читайте главу 6.
ded
 
Сообщений: 15823
Зарегистрирован: 26 авг 2010, 19:00

Re: В поисках адекватной литературы.

Сообщение Anubis_66RUS » 20 фев 2020, 16:01

Благодарю.
Проглотил главу 6 целиком.
Однако, увы, для себя не нашел в ней ничего принципиально нового. Или просто не понял. Видимо немного глупенький. Не могли бы Вы указать чуть конкретнее: где описан способ воткнуть вместо переменной или шаблона в контекст область значений для сравнения?
Anubis_66RUS
 
Сообщений: 18
Зарегистрирован: 17 фев 2020, 10:55

Re: В поисках адекватной литературы.

Сообщение ded » 20 фев 2020, 17:03

Н-да, всё равно скатываемся к copy-paste!
Код: выделить все
; Приклеиваем имя к номеру вызывающего абонента, чтобы было видно из какого города он звонит
exten => _X.,n,ExecIf($[${FROM_DID}=74232026637]?Set(CALLERID(name)=Владивосток:))
exten => _X.,n,ExecIf($[${FROM_DID}=78442962147]?Set(CALLERID(name)=Волгоград:))
exten => _X.,n,ExecIf($[${FROM_DID}=73432887437]?Set(CALLERID(name)=Екатеринбург:))
exten => _X.,n,ExecIf($[${FROM_DID}=73952480437]?Set(CALLERID(name)=Иркутск:))
; Пропускаем 1 цифру в CALLERID(num) и смотрим на следующий три цифры - код города, отправляем в соотв. очередь.
exten => _X.,n,ExecIf($["${CALLERID(num):1:3}" = 423]?Queue(601),1)
exten => _X.,n,ExecIf($["${CALLERID(num):1:3}" = 442]?Queue(602),1)
exten => _X.,n,ExecIf($["${CALLERID(num):1:3}" = 343]?Queue(603),1)
exten => _X.,n,ExecIf($["${CALLERID(num):1:3}" = 395]?Queue(604),1)
ded
 
Сообщений: 15823
Зарегистрирован: 26 авг 2010, 19:00

Re: В поисках адекватной литературы.

Сообщение Anubis_66RUS » 20 фев 2020, 17:34

решил сам. не так красиво как Вы, конечно... Ну, тут опыт и знание операторов.
Сюда вернулся продемонстрировать решение и поинтересоваться возможностью оптимизации. Возможность оптимизации вы продемонстрировали до того как я сюда вернулся. Ну... да будет так.

Код: выделить все
exten => 7**********,1,Set(CDR(userfield)=input) ; нарисовали для црмки вызов
same => n,GotoIf($["${CALLERID(num):1:3}" = "343"]?100) ;Перебор для филиала Екатеринбург, пинок на приоритет ниже.
same => n,GotoIf($["${CALLERID(num):1:3}" = "342"]?100)
same => n,GotoIf($["${CALLERID(num):1:3}" = "347"]?100)
same => n,GotoIf($["${CALLERID(num):1:3}" = "301"]?101) ; Екб кончился, поехал Новосиб
same => n,GotoIf($["${CALLERID(num):1:3}" = "388"]?101)
same => n,GotoIf($["${CALLERID(num):1:3}" = "411"]?101)
same => n,GotoIf($["${CALLERID(num):1:3}" = "394"]?101)
same => n,GotoIf($["${CALLERID(num):1:3}" = "390"]?101)
same => n,GotoIf($["${CALLERID(num):1:3}" = "385"]?101)
same => n,GotoIf($["${CALLERID(num):1:3}" = "391"]?101)
same => n,GotoIf($["${CALLERID(num):1:3}" = "421"]?101)
same => n,GotoIf($["${CALLERID(num):1:3}" = "395"]?101)
same => n,GotoIf($["${CALLERID(num):1:3}" = "415"]?101)
same => n,GotoIf($["${CALLERID(num):1:3}" = "384"]?101)
same => n,GotoIf($["${CALLERID(num):1:3}" = "413"]?101)
same => n,GotoIf($["${CALLERID(num):1:3}" = "383"]?101)
same => n,GotoIf($["${CALLERID(num):1:3}" = "424"]?101)
same => n,GotoIf($["${CALLERID(num):1:3}" = "382"]?101)
same => n,GotoIf($["${CALLERID(num):1:3}" = "302"]?101)
same => n,GotoIf($["${CALLERID(num):1:3}" = "426"]?101)
same => n,GotoIf($["${CALLERID(num):1:3}" = "427"]?101)
same => n,GotoIf($["${CALLERID(num):1:3}" = "423"]?101)
same => n,GotoIf($["${CALLERID(num):1:3}" = "381"]?101:110) ;когда кончается Новосиб - остаётся вся оставшаяся Россия. Да будет её обрабатывать Ростов.
same => 100,MixMonitor(/r*******/${UNIQUEID}.wav)
same => n,Queue(bekb,rt,,,300)
same => n,Goto(200)
same => 101,MixMonitor(/r*******/${UNIQUEID}.wav)
same => n,Queue(nsk2,rt,,,300)
same => n,Goto(200)
same => 110,MixMonitor(/r*******/${UNIQUEID}.wav)
same => n,Queue(rdnrt,rt,,,300)
same => n,Goto(200)
same => 200,Hangup ; Поидее всё должно пиликать.


Дак вот. Я мог написать всё это изначально, но мне хотелось от этого уйти так как кроме этих номеров будут ещё и мобильные итд итп.
Поэтому я и спрашивал литературу где можно ознакомиться с возможностью замены в строчке same => n,GotoIf($["${CALLERID(num):1:3}" = "343"]?100) циферок 343 на список значений, среди которых искать совпадение...
типа
set CODENUM1 = 343,342,347
set CODENUM2 = 423,426,427
same => n,GotoIf($["${CALLERID(num):1:3}" СОДЕРЖИТСЯ В ${CODENUM1}]?100)
same => n,GotoIf($["${CALLERID(num):1:3}" СОДЕРЖИТСЯ В ${CODENUM2}]?101)
Anubis_66RUS
 
Сообщений: 18
Зарегистрирован: 17 фев 2020, 10:55

Re: В поисках адекватной литературы.

Сообщение ded » 20 фев 2020, 18:04

set CODENUM1 = 343,342,347 не пойдёт, CODENUM1 - это переменная, а не массив, а вы задаёте туда значения как для массива.
!) Вместо
Код: выделить все
same => n,GotoIf($["${CALLERID(num):1:3}" = "301"]?101) ; Екб кончился, поехал Новосиб
same => n,GotoIf($["${CALLERID(num):1:3}" = "388"]?101)
same => n,GotoIf($["${CALLERID(num):1:3}" = "411"]?101)
синтаксис с операндом ИЛИ в одну строку
same => n,GotoIf($["${CALLERID(num):1:3}" = 301 | 388 | 411]?101)[/code]

2)Вместо конкретного указания номера приоритета - 101, используйте метки
Код: выделить все
same => n,GotoIf($["${CALLERID(num):1:3}" = 301 | 388 | 411]?Novosibirsk)
same => n(Novosibirsk),MixMonitor(/r*******/${UNIQUEID}.wav)
same => n,Queue(nsk2,rt,,,300)

Синтаксис проверяйте, наобум пишу. А вообще делается через запрос в базу, даже внешнюю,
same => n,Set(CURL(https://rossvyaz.ru/deyatelnost/resurs- ... umeracii,${CALLERID(num)})
или лучше через внешний скрипт, который вы, без сомнения, напишете.
same => n,AGI(curlrequest.php,${CALLERID(num)})

Или вообще пишите на lua или ael - доп. языки диалплана для Астериск.
ded
 
Сообщений: 15823
Зарегистрирован: 26 авг 2010, 19:00

Re: В поисках адекватной литературы.

Сообщение Anubis_66RUS » 20 фев 2020, 19:05

set CODENUM1 = 343,342,347 не пойдёт, CODENUM1 - это переменная, а не массив, а вы задаёте туда значения как для массива.

Я привел это как условный пример того что я хочу видеть. Вы поняли о чем я говорил, УРА!

same => n,GotoIf($["${CALLERID(num):1:3}" = 301 | 388 | 411]?101)

ВОТ ОНО! ВОТ ОНО! Всё было так просто, блин!
А поймет ли меня астериск если я сделаю следующим образом?
Код: выделить все
set CODENUM1 = "301 | 388 | 411"
same => n,GotoIf($["${CALLERID(num):1:3}" = ${CODENUM1}]?101)


Вместо конкретного указания номера приоритета - 101, используйте метки

Благодарю за совет, однако про метки я уже в курсе :) Не использовал, т.к. указанный выше код писал в порыве "да пропади всё пропадом, сделаю через опу но быстро и чтоб работало". Код будет причёсываться.

Синтаксис проверяйте, наобум пишу. А вообще делается через запрос в базу, даже внешнюю,
same => n,Set(CURL(https://rossvyaz.ru/deyatelnost/resurs- ... umeracii,${CALLERID(num)})
или лучше через внешний скрипт, который вы, без сомнения, напишете.
same => n,AGI(curlrequest.php,${CALLERID(num)})

ВОТ ОНО! Это практически то что мне было нужно с самого начала! Благодарю! В какой главе книжки сие прописано? Желаю ознакомиться подробнее.

Или вообще пишите на lua или ael - доп. языки диалплана для Астериск.

Так, поставлю в список для ознакомления. Премного благодарю за развёрнутый ответ.
Anubis_66RUS
 
Сообщений: 18
Зарегистрирован: 17 фев 2020, 10:55

Re: В поисках адекватной литературы.

Сообщение ded » 20 фев 2020, 20:33

Anubis_66RUS писал(а):А поймет ли меня астериск если я сделаю следующим образом?

set CODENUM1 = "301 | 388 | 411"
same => n,GotoIf($["${CALLERID(num):1:3}" = ${CODENUM1}]?101)
Нет, не поймёт.
Знаете о различиях типа полей в переменных? "301 | 388 | 411" будет просто текстом, без логических операций ИЛИ.

Чтобы понять/простить не ленитесь вставлять операнды проверки содержания переменных, типа
Код: выделить все
same => n,Set(CODENUM1 = "301 | 388 | 411")
same => n,NoOp(variable CALLERID(num) have area code ${CALLERID(num):1:3})
same => n,NoOp(variable CODENUM1 contains the value ${CODENUM1})
и тогда наверняка будет понятней что с чем сравниваете.
ded
 
Сообщений: 15823
Зарегистрирован: 26 авг 2010, 19:00

Re: В поисках адекватной литературы.

Сообщение Anubis_66RUS » 21 фев 2020, 12:46

тут такая штука вырисовалась.
Астериск судя по всему не понимает логику "ИЛИ" в случае если количество вариантов больше двух, т.е. num1 | num2 - нормально num1 | num2 | num3 - уже отказывается работать. По крайней мере у меня он играет в игнор со всем после второго значения.
Ну или у меня лыжи не едут.

вырезку из логов, думаю, приводить смысла не имеет.

Немного причесал свои строки goto, пока всё работает.
Anubis_66RUS
 
Сообщений: 18
Зарегистрирован: 17 фев 2020, 10:55

Re: В поисках адекватной литературы.

Сообщение zzuz » 21 фев 2020, 13:07

Лыжи не едут, когда начинается сравнение неподходящих типов. Астериск использует динамическую типизацию , но неоднозначность может все поломать. Поэтому , если вы сравниваете строки , то и говорите ему про строки , например, добавляя ковычки для переменных . Аля , $["${var1}" = "${var2}"] . Потому как сравнение $[${var1} = ${var2}] , где var1="foo" , а var2=34 , приведет к непредсказуемому результату (а точнее к булевому сравнению) .
Линия24 - Системы Массового Телефонного Обслуживания
Аватар пользователя
zzuz
 
Сообщений: 1658
Зарегистрирован: 21 сен 2010, 13:33

Пред.След.

Вернуться в Вопросы новичков

Кто сейчас на форуме

Сейчас этот форум просматривают: Google [Bot] и гости: 22

© 2008 — 2024 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH