Определение факса при исходящем звонке на SIP канале. HELP!
Как сделать определения факса при исходящем звонке на канале SIP ?
Бьюсь об стену с этим вопросом уже 2ю неделю - решил спросить у сообщества.
Также пробовал использовать для этой цели Answering Machine Detect (AMD) - amd определяет факс с той стороны как MACHINE (автоответчик) исходя из этого можно конечно выполнять определенный алгоритм, но мне нужно определения тона факса в любой момент разговора когда с той стороны нажали "СТАРТ". AMD для этих целей не подходит.
Использую на данный момент последнюю версию * 1.6.2.11.
Faxdetect на sip канале при входящем звонке работет хорошо, а вот как заставить * что бы faxdetect заработал при исходящем звонке ?
| Код: |
| ; FAX detection will cause the SIP channel to jump to the 'fax' extension (if it exists) ; based one or more events being detected. The events that can be detected are an incoming ; CNG tone or an incoming T.38 re-INVITE request. ; faxdetect = yes ; Default 'no', 'yes' enables both CNG and T.38 detection ; faxdetect = cng ; Enables only CNG detection ; faxdetect = t38 ; Enables only T.38 detection ; faxdetect = both ; Enables both CNG and T.38 detection (same as 'yes') |
В конфиге написано что будет работать только при incoming (входящих) звонках.
Пробовал править исходник как описано тут - http://asterisk-support.ru/forum/topics/5470/?page=1 - не помогло
Разбираться самому в миллионах строк кода и поправить что нужно - увы мне не по силе
Посоветуйте что-то пожалуйста - очень надо.
Заранее благодарен.
Читайте внимательно - faxdetect при исходящем вызове.
В 1 десятке поиска для 1.6 он есть...
Пробовал NVFaxDetect, NVBackgroundDetect - даже пропатчил их что бы скомпилировать под 1.6.
Но они тоже не "ловят" факс при исходящем звонке.
Вообще NVFaxDetect, NVBackgroundDetect не нужны в 1.6 - там это уже встроено, но опять же для входящих звонков. На chan_dahdi есть возможность детектить все факсы, но мне нужно именно на SIP канале.
Added after 12 minutes:
Вот кстати что говорит voip-info.org по этому поводу http://www.voip-info.org/wiki/view/outgoing+fax+detect
а в макросе send запускай свой детектор чего хочешь и как хочешь.
вместо штатного АМД, можешь подцепить к разговору любое приложение, детекторы чего угодно записывальщики голоса и т.д.
Для макроса, твой звонок будет входящим, и детектор его нормально должен отработать.....
пример со штатным детектором.
[macro-send]
exten => s, 1,Wait(2)
exten => s,n,SIPDtmfMode(inband)
exten => s, n,SendDTMF(${ARG1}#,50)
exten => s, n,Wait(2)
exten => s, n,AMD
exten => s,,nGotoIf($[${AMDSTATUS}=HUMAN]?humn:mach)
далее с разговором делай что хочешь....
можнов макросе еще заюзать вот такое приложение, короче фантазируй...
BackgroundDetect(имяфайла[,sil[,min[,max]]])
Аналогично Background(), но пытается выявить разговор.
Во время воспроизведения файла выполняется отслеживание аудио-
сигналов во входящем потоке. Если период отсутствия тишины длится
больше min миллисекунд, но еще меньше max миллисекунд и за ним сле-
дует пауза продолжительностью как минимум sil миллисекунд, вос-
произведение звука прерывается и выполнение переходит в добавоч-
ный номер talk (разговор), если таковой доступен.
Если не заданы, параметры sil, min и max по умолчанию принимают
значения 1000 мс, 100 мс и бесконечное количество соответственно.
exten => 123,1,BackgroundDetect(tt-monkeys)
exten => 123,2,Playback(im-sorry)
exten => talk,1,Playback(yes-dear)
================
у меня детектор работает на исходящих звонках при оповещении клиентов о том что машина прибыла, только звонки делаются из внешней программы через originate (SIP/TRUNK@$Out_number,0001$Number_Car$Number_Zakaza,autodial), где $Oout_number номер вызываемого абонента?$Number_Car - номер машины.$Number_Zakaza -номер заявки
результат пишем в базу для дальнейшей обработки клиентской программой. которая должна видель что клиенту дозвонились, и быть уверенной что дозвонились клиенту, а не факсу или автоответчику.
по сути тот же принцип , для оператора звонок исходящий, для екстеншена _0001XXX это входящий и для АМД соответственно тоже входящий звонок.
а в плане
exten => _0001XXX.,1,Set(TIMEOUT(digit)=5) ; Set Digit Timeout to 5 seconds
exten => _0001XXX.,n,Set(TIMEOUT(response)=10) ; Set Response Timeout to 10 seconds
exten => _0001XXX.,n,Answer
exten => _0001XXX.,n,AMD
exten => _0001XXX.,n,NoOp(human=${AMDSTATUS})
exten => _0001XXX.,n,Wait(1)
exten => _0001XXX.,n,Background(../ru/out/go ; "К Вам подъехал автомобиль номер"
exten => _0001XXX.,n,Background(../ru/out/${EXTEN:4:1} ; "первая цифра номера машины"
exten => _0001XXX.,n,Background(../ru/out/${EXTEN:5:1} ; "вторая цифра номера машины"
exten => _0001XXX.,n,Background(../ru/out/${EXTEN:6:1} ; "третья цифра номера машины"
exten => _0001XXX.,n,MYSQL(Connect connid localhost root "" ams)
exten => _0001XXX.,n,MYSQL(Query resultid ${connid} insert into client ( zakaz, status ) VALUES ("${EXTEN:7}","${AMDSTATUS}"))
exten => _0001XXX.,n,Hangup()
==
результат в базе:
182 93288 HUMAN
183 93291 HUMAN
184 93265 HUMAN
185 93276 MACHINE
186 93267 HUMAN
187 93277 HUMAN
188 93274 HUMAN
189 93279 HUMAN
190 93290 HUMAN
191 93294 HUMAN
192 93292 MACHINE
193 93296 HUMAN
В исходном коде я закоментил обнуление faxdetect, теперь у меня ловятся факсы и при исходящем вызове.
Но появилась следующая проблема: отправка факса.
Т.е. делается исходящий вызов, далее удаленная сторона нажимает кнопку "старт", от провайдера приходит реинвайт на т.38, это успешно обнаруживает faxdetect, идет на экстеншен fax, где у меня настроен прием. Соответственно, оба факса пытаются принять.
Сейчас смотрю исходники на предмет внедрения какой - нибудь переменной, которой можно играться в диалплане (типа контекст, в котором есть или нет fax экстеншн). Потому как если в контексте нет этого эксеншена, то факс отправляется нормально.
Может у кого какие мысли по этому поводу есть?
написал функцию, которая определяет факсовый контекст на канале.
проверил работоспособность на сип канале.
Если кому будет интересно - стучитесь либо тут, либо в асю 259335130. (отдам бесплатно)
И если кто - нибудь подскажет, как сделать diff файл (там затронуто три файла), выложу патч сюда.
| Код: |
| diff -ruH каталог_с_оригиналом каталог_с_модификациями > patch.patch |
1) у меня есть факсовые аппараты (панасы), для них у меня в диалплане отведен отдельный контекст, в котором нету экстеншена fax. Это сделано для того, чтобы можно было с НИХ слать факсы, иначе при реинвайте на т38 при отсылке факса с факс аппарата все уходило в экстеншен fax.
2) для всех остальных офисных телефонов у меня настроено в диалплане екстеншен fax, т.е. они могут позвонить наружу и попросить отправить им факс, и как только удаленная сторона стартует, присходит реинвайт на т38 и уходит в fax.
3) для всех входящих в их контексте настроен экстеншен fax.
Таким образом, пользователям только в одном случае надо нажимать копку СТАРТ на факсе, чтобы принять его на бумажке тогда, когда они сами звонят с факс аппарата наружу, чтобы принять факс. В остальное время он сам посреди разговора детектится и складывается на фтп.
пример смотреть в патче.
Может, кто на дигиум в багрепорт выложет?
П.С.: Просьба протестировать, отписать. На си писал второй раз, код может быть кривоват.
П.П.С.: Работает только на реинвайт на т38, на CNG не делал, т.к. получаю то g729 и поэтому без надобности.
Просьба: сделайте кто нибудь нормальный патч и, пожалуйста, выложите в тему.
В аттаче уже пропатченные файлы.