Чтобы нам не расслабляться, хотелось бы обратиться с просьбой помочь решить следующую проблему. Но начну со схемы организации связи, построенной у нас.
Картинку со схемой прикладываю к посту. Сразу оговорюсь, что это часть схемы, у нас там много чего накручено, но это к возникающей ошибке отношения не имеет.
В двух словах схема у нас такая: Городские линии (Ростелеком) -> TAU32 -> Asterisk -> SIP-клиенты и абоненты, подключенные к FXS-портам TAU32.
На стенде мы использовали 2 входящие линии от провайдера, которые подключили соответственно к портам FXO1 и FXO2.
На указанных портах настроены номера 901 и 902 соответственно.
Для передачи вызовов со шлюза на Asterisk я использовал функцию hotline (кстати, это может быть неправильно, хотелось бы уточнить). Т.е. на FXO1 и FXO2 в настройках портов прописаны вызовы на hotline-номера 801 и 802 соответственно.
Еще важные данные для понимания проблемы: на шлюзе (как писал выше) также используются FXS-порты, к которым подключены аналоговые телефоны в офисе. У портов нумерация назначена нами такая: FXS1 - 201, FXS2 - 202, FXS3 - 203, FXS4 - 204, FXS5 - 505, FXS6 - 506, FXS7 - 507, FXS8 - 508.
Также на шлюзе создан SIP-профиль (Profile 2), с помощью которого все порты (FXS и FXO) регистрируются на Asterisk (на нем естественно в sip.conf созданы соответствующие аккаунты).
Причем, что важно. Для номеров, соответствующих FXO-линиям (901, 902 и тп) указан context=incoming; для номеров, соответствующих FXS-линиям (201, 202, 505 и т.п.) указан context=out_tau32. Первый контекст обрабатывает входящие вызовы, второй исходящие.
И, после долгого вступления, теперь собственно о самой проблеме.
При поступлении входящего вызова (от внешнего абонента) через провайдера, допустим на порт FXO1, шлюз принимает вызов (сначала идут статусы Preringing и т.п.), затем осуществляет донабор hotline-номера 801, тем самым вызов должен попадать на контекст incoming, где указана логика обработки вызова, поступающего на экстеншен 801.
И вот тут вырастает странный глюк - по какой-то причине, по принципу абсолютного случайного математического тыка, входящие вызовы со шлюза TAU32 на Asterisk поступают не с номера 901, а с номеров FXS-линий. В частности, входящий вызов (см. дамп eltex_tau32_test2), пришедший на порт FXO1 шлюза (номер 901) на Asterisk попал уже от номера 505, закрепленного за портом FXS5.
Код: Выделить всё
(Данным логам соответствует дамп TCPDUMP eltex_tau32_test2)
[Apr 18 20:23:22] NOTICE[1024]: chan_sip.c:22622 handle_request_invite: Call from '505' (172.16.130.225:5060) to extension '801' rejected because extension not found in context 'out_tau32'.
== Using SIP RTP CoS mark 5
И естественно, такой вызов на Asterisk не обрабатывается и вываливается с ошибкой, т.к. обработка вызова в данном случае ведется контекстом, закрепленным за аккаунтом 505 (т.е. out_tau32), где обработки вызовов на экстеншен 801 не предусмотрено.
Т.е. проблема абсолютно гуляющая - входящие вызовы на Asterisk каждый раз поступают от разных аккаунтов. Если "повезло", то вызовы поступают с аккаунтов 901-904 и обрабатываются верно (т.к. попадают на контекст incoming), а если "не повезло", то вызовы по мнению Asteriskа приходят с аккаунтов, привязанных к FXS-портам и все ломается.
В частности, вот пример логов Asterisk'а, когда звонок все-таки проходит успешно (звонок поступал на FXO1 (901)):
Код: Выделить всё
(Данным логам соответствует дамп TCPDUMP eltex_tau32_test1)
-- Executing [802@incoming:1] NoOp("SIP/904-00000077", "") in new stack
-- Executing [802@incoming:2] Answer("SIP/904-00000077", "") in new stack
-- Executing [802@incoming:3] Goto("SIP/904-00000077", "ivr,s,1") in new stack
-- Goto (ivr,s,1)
-- Executing [s@ivr:1] NoOp("SIP/904-00000077", "") in new stack
-- Executing [s@ivr:2] Set("SIP/904-00000077", "fname=2014_04_18_20:15-") in new stack
-- Executing [s@ivr:3] Set("SIP/904-00000077", "recdir=/etc/asterisk/Recordings/2014/04/18") in new stack
-- Executing [s@ivr:4] System("SIP/904-00000077", "mkdir /etc/asterisk/Recordings/2014/04/18") in new stack
-- Executing [s@ivr:5] MixMonitor("SIP/904-00000077", "/etc/asterisk/Recordings/2014/04/18/2014_04_18_20:15-.wav") in new stack
-- Executing [s@ivr:6] GotoIfTime("SIP/904-00000077", "8:00-18:00,mon-fri,*,*?default:holyday") in new stack
-- Goto (ivr,s,7)
-- Executing [s@ivr:7] NoOp("SIP/904-00000077", "") in new stack
-- Executing [s@ivr:8] Wait("SIP/904-00000077", "2") in new stack
== Begin MixMonitor Recording SIP/904-00000077
-- Executing [s@ivr:9] BackGround("SIP/904-00000077", "/etc/asterisk/ivr/hello_holi") in new stack
-- <SIP/904-00000077> Playing '/etc/asterisk/ivr/hello_holi.slin' (language 'en')
== Spawn extension (ivr, s, 9) exited non-zero on 'SIP/904-00000077'
== MixMonitor close filestream
== End MixMonitor Recording SIP/904-00000077
== Using SIP RTP CoS mark 5
Как мы здесь видим, Астериск почему-то воспринимает вызов опять же не с номера 901, а с 904, но так как для обоих номеров контекст указан incoming, то вызов обрабатывается верно.
Ниже привожу набор данных.
1) TCPDump eltex_tau32_test1: http://yadi.sk/d/QB9moizPMnAnK
2) TCPDump eltex_tau32_test2: http://yadi.sk/d/QqqCveNMMnAnT
3) Конфиг на ТАУ32 - прилеплен к посту.
Содержимое sip.conf:
Код: Выделить всё
[miacip]
type=friend
context=out_tau32
host=dynamic
canreinvite=no
qualify=yes
disallow=all
dtmfmode=auto
allow=alaw
allow=ulaw
insecure=port,invite
;experimental account for FXO
;first 4 lines - lines from Rostelecom
[901](miacip)
context=incoming
secret=qwerty
username=901
[902](miacip)
context=incoming
secret=qwerty
username=902
[903](miacip)
context=incoming
secret=qwerty
username=903
[904](miacip)
context=incoming
secret=qwerty
username=904
[201](miacip)
secret=qwerty
username=201
;Grishin AA (202)
[202](miacip)
secret=qwerty
username=202
;Rezerv (203)
;[203](miacip)
;secret=qwerty
;username=203
;Datacenter Office (204)
[204](miacip)
secret=qwerty
username=204
Содержимое extensions.conf
Код: Выделить всё
[incoming]
;Detection of incoming calls from outside
;incoming call from line 901
exten => _801,1,NoOp
exten => _801,2,Answer
exten => _801,3,Goto(ivr,s,1)
;incoming call from line 902
exten => _802,1,NoOp
exten => _802,2,Answer
exten => _802,3,Goto(ivr,s,1)
;дальше переход на IVR