Похоже, проблема не с софтфонами. Как оказалось, вдобавок * не получает busy, если абонент отбивает входящий на мобильном телефоне. В консоли при этом никакого сообщения не появляется, софтфону благополучно передаётся "180 ringing", дозвон на номер продолжается, но с другого №мобильного (порта шлюза), а счастливые клиенты после n-й попытки отбить назойливый вызов, с пеной у рта шипят: "Я занят". Normal call clearing получается только в случае отбоя вызова вызывающей стороной. Кстати, в SIP логе шлюза я тоже не вижу никакой реакции на отбой абонентом. Погрешил бы на оборудование, но используется ещё один транк к провайдеру, с которым точно такая проблема. FreePBX находится на виртуальной машине, используется KVM. Порты проброшены, убрано правило reject по умолчанию. Подскажите, где искать собаку?
Залогинился напрямую на шлюзе и повторил попытку. Та же самая ситуация. Стало быть, и правда не в настройках дело. А разве не должно сообщение busy доходить на шлюз, несмотря на задержку преобразования? Ведь я так понимаю, шлюз всё-таки принимает сообщение о занятости, но снова инициирует соединение с новым invite.
Снова проверил при непосредственной регистрации софтфона на шлюзе, занятость есть, в логе - 503 Service Unavailable. Если же звонить через транк на этот шлюз, то в логе тихо. Что происходит?
Если я правильно понял, при трансфере звонок попадает в отдельный контекст или контекст по умолчанию, где и проводится проверка на CID. Но тогда получается, что при переводе входящего звонка из GSM-сети, CallerID будет номером мобильного телефона, а никак не внутренним номером АТС, по которому и делается маршрутизация. Или мои рассуждения не верны?
А если всё правильно, то как тогда организовать трансфер по CID внутреннего номера на голом *? Преобразовывать ${BLINDTRANSFER} и присваивать её значение ${CALLERID(num)}?