Пожалуйста, войдите здесь. Часто задаваемые вопросы О нас
Задайте Ваш вопрос

диалплан биллинг

0

Пытаюсь написать диалплан, что-то вроде биллинга Ставит лимит на определенные исходящие звонки, в данном примере на все номера, но я потом поменяю

exten => _X.,1,MYSQL(Connect connid localhost asterisk_user Some_Pass_Aster01 asterisk)
exten => _X.,n,MYSQL(Query resultid ${connid}SELECT\SUM(billsec)\FROM\cdr\WHERE\src=${CALLERID(num)})
exten => _X.,n,MYSQL(Fetch fetchid ${resultid} billing)
exten => _X.,n,MYSQL(Clear ${resultid})
exten => _X.,n,GotoIf($["${fetchid}"="1"]?true:false)
exten => _X.,n,GotoIf($["${billing}" < "1"]?call:end)
exten => _X.,n(call),Dial(SIP/300)
exten => _X.,n,MYSQL(Clear ${resultid})
exten => _X.,n,Hangup()
exten => _X.,n(false),Playback(goodbye)
exten => _X.,n,Hangup()

есть у меня база, создала я там табличку cdr, он данные о звонках берет и записывает, все работает нормально

только вот проблема в диалплане, делаю звонок он мне говорит goodbye, значит дело в запросе, fetchid возвращает 0 Но почему?

И да на всякий случай лог

== Using SIP RTP TOS bits 184
  == Using SIP RTP CoS mark 5
    -- Executing [300@from-internal:1] MYSQL("SIP/301-00000002", "Connect connid localhost asterisk_user Some_Pass_Aster01 asterisk") in new stack
    -- Executing [300@from-internal:2] MYSQL("SIP/301-00000002", "Query resultid 3SELECT\SUM(billsec)\FROM\cdr\WHERE\src=301") in new stack
    -- Executing [300@from-internal:3] MYSQL("SIP/301-00000002", "Fetch found  billing") in new stack
    -- Executing [300@from-internal:4] MYSQL("SIP/301-00000002", "Clear ") in new stack
    -- Executing [300@from-internal:5] GotoIf("SIP/301-00000002", "0?true:false") in new stack
    -- Goto (from-internal,300,10)
    -- Executing [300@from-internal:10] Playback("SIP/301-00000002", "goodbye") in new stack
    -- <SIP/301-00000002> Playing 'goodbye.gsm' (language 'RU')
    -- Executing [300@from-internal:11] Hangup("SIP/301-00000002", "") in new stack
  == Spawn extension (from-internal, 300, 11) exited non-zero on 'SIP/301-00000002'
    -- Executing [h@from-internal:1] Macro("SIP/301-00000002", "hangupcall") in new stack
    -- Executing [s@macro-hangupcall:1] GotoIf("SIP/301-00000002", "1?endmixmoncheck") in new stack
    -- Goto (macro-hangupcall,s,9)
    -- Executing [s@macro-hangupcall:9] NoOp("SIP/301-00000002", "End of MIXMON check") in new stack
    -- Executing [s@macro-hangupcall:10] GotoIf("SIP/301-00000002", "1?nomeetmemon") in new stack
    -- Goto (macro-hangupcall,s,28)
    -- Executing [s@macro-hangupcall:28] NoOp("SIP/301-00000002", "End of MEETME check") in new stack
    -- Executing [s@macro-hangupcall:29] GotoIf("SIP/301-00000002", "1?noautomon") in new stack
    -- Goto (macro-hangupcall,s,34)
    -- Executing [s@macro-hangupcall:34] NoOp("SIP/301-00000002", "TOUCH_MONITOR_OUTPUT=") in new stack
    -- Executing [s@macro-hangupcall:35] GotoIf("SIP/301-00000002", "1?noautomon2") in new stack
    -- Goto (macro-hangupcall,s,41)
    -- Executing [s@macro-hangupcall:41] NoOp("SIP/301-00000002", "MONITOR_FILENAME=") in new stack
    -- Executing [s@macro-hangupcall:42] GotoIf("SIP/301-00000002", "1?skiprg") in new stack
    -- Goto (macro-hangupcall,s,45)
    -- Executing [s@macro-hangupcall:45] GotoIf("SIP/301-00000002", "1?skipblkvm") in new stack
    -- Goto (macro-hangupcall,s,48)
    -- Executing [s@macro-hangupcall:48] GotoIf("SIP/301-00000002", "1?theend") in new stack
    -- Goto (macro-hangupcall,s,50)
    -- Executing [s@macro-hangupcall:50] AGI("SIP/301-00000002", "hangup.agi") in new stack
    -- Launched AGI Script /var/lib/asterisk/agi-bin/hangup.agi
    -- <SIP/301-00000002>AGI Script hangup.agi completed, returning 0
    -- Executing [s@macro-hangupcall:51] Hangup("SIP/301-00000002", "") in new stack
  == Spawn extension (macro-hangupcall, s, 51) exited non-zero on 'SIP/301-00000002' in macro 'hangupcall'
  == Spawn extension (from-internal, h, 1) exited non-zero on 'SIP/301-00000002'

Поправьте меня или укажите на ошибку, я в этом новичок, возможно кое что не так делаю?

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

спросил 2014-01-22 15:56:58 +0400

Diana92 Gravatar Diana92
11 8 5

обновил 2014-01-22 16:00:43 +0400

Comments

не пытайтесь реализовать алгоритм какого-либо биллинга в диалплане. это - неправильно. правильней звать из диалплана radius и а с самим радиусом использовать биллинговое решение которое имеет с ним сопряжение через libradius, таких очень много, в том числе есть бесплатные. или можно обратиться к профессионалам - все настроят :) любые заплатки и "наколеночные" решения рано или поздно упираются в "потолок" - в данном случае невозможность автоматизированной отладки и много другое...

octopas ( 2014-01-25 11:47:28 +0400 )редактировать

1 Ответ

1
${connid}SELECT

Вставьте пробел между ${connid} и SELECT

${connid} SELECT

Ну и перед выполнением запроса не мешало бы выполнить проверку на соединение:

exten => _X.,n,Gotoif($["${connid}" = ""]?false)
ссылка удалить спам редактировать

ответил 2014-01-22 16:31:53 +0400

Olpag Gravatar Olpag
1884 3 4 29

обновил 2014-01-22 16:32:25 +0400

Comments

проверку после соединения сделать?

exten => X.,1,MYSQL(Connect connid localhost asteriskuser SomePassAster01 asterisk) exten => _X.,n,Gotoif($["${connid}" = ""]?false) exten => _X.,n(false),Playback(error) exten => _X.,n,MYSQL(Query resultid ${connid}SELECT\SUM(billsec)\FROM\cdr\WHERE\src=${CALLERID(num)}) exten => _X.,n,MYSQL(Fetch fetchid ${resultid} billing) exten => _X.,n,MYSQL(Clear ${resultid}) exten => _X.,n,GotoIf($["${fetchid}"="1"]?true:false) exten => _X.,n,GotoIf($["${billing}" < "1"]?call:end) exten => _X.,n(call),Dial(SIP/300) exten => _X.,n,MYSQL(Clear ${resultid}) exten => _X.,n,Hangup() exten => _X.,n(false),Playback(goodbye) exten => _X.,n,Hangup()

Diana92 ( 2014-01-22 16:50:22 +0400 )редактировать

В диалплане, который в вопросе топика, вставить проверку (exten => _X.,n,Gotoif($["${connid}" = ""]?false)) сразу после первой строки. Все.

Olpag ( 2014-01-22 16:54:15 +0400 )редактировать

метка false есть в конце диалплана

Olpag ( 2014-01-22 16:55:34 +0400 )редактировать

соединения нет, специально чтоб не путаться поставила другую метку для соединения, и поставила плэйбэк типа ошибка, только потом он проиграл второй плэйбэк гудбай. вот так вот. не пойму в чем проблема. имя пользователя пароль все правильно. или мне ввести имя рут и его пароль?

Diana92 ( 2014-01-22 18:07:00 +0400 )редактировать

не а рут тоже ничем не помог.(((

Diana92 ( 2014-01-22 18:10:46 +0400 )редактировать

никто не знает?

Diana92 ( 2014-01-22 19:52:33 +0400 )редактировать

используйте funcodbс или mysql realtime. не используйте эту старую appmysql. она не удалена ИСКЛЮЧИТЕЛЬНО из совместимости.

meral ( 2014-01-22 20:47:36 +0400 )редактировать

или используйте AGI для работы с базами данных

Olpag ( 2014-01-23 01:19:11 +0400 )редактировать

не надо использовать AGI. никогда. если вашей проффесиональности не хватате на fastAGI лучше вообеще не пишите. ато вон freepbx до сих пор страдает потому как один раз один експерт всунул agi-set-callerid скрипт.

meral ( 2014-01-23 02:13:47 +0400 )редактировать

Нормально AGI работает, не надо тут ля-ля. Конечно не надо использовать его как во freepbx, когда в процессе одного звонка запускается десяток AGI скриптов. А если один вызов полностью в одном скрипе обрабатывается то это работает достаточно быстро.

switch ( 2014-01-23 09:39:36 +0400 )редактировать

а где я могу с нуля прочитать про AGI? Все что нашла в гугле, это для разбирающихся людей хД. С нуля как писать AGI скрипт где прочитать? Можно книги или еще что?

Diana92 ( 2014-01-23 10:36:18 +0400 )редактировать

to meral: не надо переходить на личности... я показал направление, а что конкретно использовать - AGI или FastAGI, топикстартер, я думаю, разберется. В любом случае, изучать начнет с AGI...

to Diana:

http://www.voip-info.org/wiki/view/Asterisk+AGI

http://www.voip-info.org/wiki/view/Asterisk+FastAGI

Olpag ( 2014-01-23 14:35:36 +0400 )редактировать

не показывайте неправильные направления. задолбало потом отвечать на вопросы типа "почему астериск такой тормозной".

meral ( 2014-01-23 16:46:18 +0400 )редактировать

meral: решение должно быть сообразно задаче. по производительности - лучше один asyncagi скрипт (фактически - управление всей АТС через AMI в асинхронном режиме). НО!если asyncagi скрипт упадет то вся АТС грохнется... главное в АТС - это надежность. asyncagi не только сложнее в реализации - он существенно проигрывает в надежности AGI по определению. не всегда можно отследить внешним планировщиком, даже если он очень хорошо написан - висит asyncagi скрипт или просто работает... планировщик например может прибить и перезапустить asyncagi скрипт по-ошибке и все вызовы упадут... можно конечно форкать отдельный процесс на каждый вызов при поступлении - но тогда в чем отличие от простого agi? imho asyncagi нужен для конкретных и весьма специфичных задач, которые нельзя решить в синхронном режиме...fastagi же практически ничем не отличается от простого agi - только по сети (скрипты AGI могут исполнятся на отдельном сервере - особо смысла, если вызовов не тысячи одновременно - скорее случай оператора связи )

octopas ( 2014-01-25 08:57:27 +0400 )редактировать

fastagi скрипты вполне надежны. отличие от простого agi в том, что 1) используется меньше памяти 2) потоки fastagi создаются с запасом и не во время звонка, что убирает пики cpu. 3) не расходуется ресурсы на пересоздание и перекомпиляцию(здраствуй phpagi) каждый раз. у меня количество разных систем с fastagi перевалило за сотню уже. сложность программирования - такая же.

meral ( 2014-01-25 13:01:25 +0400 )редактировать

Ваш ответ

Please start posting your answer anonymously - your answer will be saved within the current session and published after you log in or create a new account. Please try to give a substantial answer, for discussions, please use comments and please do remember to vote (after you log in)!
[скрыть предварительный просмотр]

Закладки и информация

Добавить закладку

подписаться на rss ленту новостей

Статистика

Задан: 2014-01-22 15:56:58 +0400

Просмотрен: 294 раз

Обновлен: Jan 22 '14

Похожие вопросы:

Проект компании "АТС Дизайн"
Asterisk® и Digium® являются зарегистрированными торговыми марками компании Digium, Inc., США.
IP АТС Asterisk распространяется под лицензией GNU GPL.