воскресенье, 7 февраля 2016 г.

Использование поля Diversion в SIP пакете и возможные решения проблемы недозвона при двойной переадресации в Asterisk.

Справка о использовании поля Diversion, а так же описание переадресации в SIP здесь: https://tools.ietf.org/html/rfc5806

При двойной переадресации вызова в Asterisk могут быть проблемы недозвона. Например, имеем схему:


Запрос INVITE, поступающий на Asterisk будет такой:
INVITE sip:2057004@10.200.104.12:5172;user=phone SIP/2.0
Accept: application/sdp;q=0.3
Accept: application/ISUP;q=0.2
Accept: multipart/mixed;q=0.1
Allow: INVITE,ACK,CANCEL,BYE,INFO,PRACK,UPDATE,OPTIONS,REGISTER,REFER,SUBSCRIBE,MESSAGE,PUBLISH
Call-ID: 41a5c682bgw882nql@10.200.101.11
Contact: "3303030" <sip:3303030@10.200.101.11:5060;user=phone>
CSeq: 298 INVITE
Expires: 3600
From: "3303030" <sip:3303030@10.200.101.11:5060;user=phone;cpc=ordinary>;tag=t8uu0piu60
To: "205704" <sip:2057004@10.200.104.12:5172;user=phone>
Organization: IskraTel
User-Agent: SI3000
Via: SIP/2.0/UDP 10.200.101.11:5060;branch=z9hG4bK-8uhf0-9alb1
Max-Forwards: 69
Subject: Call from CS6111
Diversion:"910123000"<sip:9101230000@10.200.101.11:5060>;reason=unconditional;privacy=full;counter=1
Content-Length:  233
Content-Type: application/sdp
Content-Disposition: session;handling=required
На Asterisk поступает уже переадресованный вызов с мобильного телефона. Вызов приходит с полем Diversion, в котором указывается номер телефона, на котором установлена переадресация.  На Asterisk в extension.conf установлена переадресация на другой мобильный телефон. 


В этой схеме можем наблюдать проблемы недозвона. 
Проблема возникает из-за того, что некоторые операторы неадекватно реагируют на поле Diversion и могут отбросить вызов, если не смогут его тарифицировать.

Можно решить проблему глобально, выключив поддержку заголовка SIP Diversion глобально в sip.conf. Для этого в глобальных настройках sip.conf необходимо прописать:
send_diversion=no (по умолчанию «yes»). 
Обычно Asterisk отправляет Diversion хидеры с определенным SIP invites для ретрансляции данных о переадресованных звонках. Если выключено, Asterisk не будет отсылать Diversion хидеры, Отсылка будет только если их добавят вручную.
Таким образом, установив в sip.conf
send_diversion=no
и следующие правила переадресации в extensiom.conf
exten => 2057004,1,Set(CALLERID(all)="2057004" <2057004>)
exten => 2057004,n,Dial(${OUTTRUNKSI}/89276132605,120,r)
exten => 2057004,n,Hangup()
будем иметь нормально установленный вызов:


Выходящий с Asterisk запрос INVITE не будет иметь поле Diversion:
INVITE sip:89276132605@10.200.101.11 SIP/2.0.
Via: SIP/2.0/UDP 10.200.104.12:5172;branch=z9hG4bK50851d21.
Max-Forwards: 70.
From: "2057004" <sip:2057004@10.200.104.12:5172>;tag=as07f597ec.
To: <sip:89276132605@10.200.101.11>.
Contact: <sip:2057004@10.200.104.12:5172>.
Call-ID: 26f878371ab6f22b7f68b67923197933@10.200.104.12:5172.
CSeq: 102 INVITE.
User-Agent: Asterisk PBX 13.1-cert2.
Date: Sun, 31 Jan 2016 15:01:25 GMT.
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE.
Supported: replaces, timer.
Content-Type: application/sdp.
Content-Length: 271.

Решить проблему исключения заголовка Diversion из исходящих INVITE запросов можно и локально для одного абонента, выключив глобальную настройку send_diversion, то есть установив send_diversion=yes.
При этом переадресацию в extension.conf нужно записывать вот так:
exten => 2057004,1,Set(CALLERID(all)="2057004" <2057004>)
exten => 2057004,n,Set(CALLERID(rdnis)=)
exten => 2057004,n,Dial(${OUTTRUNKSI}/89276132605,120,r)
exten => 2057004,n,Hangup()

При необходимости можно добавить второе поле Diversion в SIP пакет INVITE. Это делается так:
exten => 2057004,1,Set(CALLERID(all)="2057004" <2057004>)
exten => 2057004,n,SIPAddHeader(Diversion: <sip:2057004@10.200.104.12>\;user=phone\;privacy=off\;reason=unconditional)
exten => 2057004,n,Dial(${OUTTRUNKSI}/89276132605,120,r)
exten => 2057004,n,Hangup()
Здесь:
privacy=off -пераметр указывает удаленной стороне не верить полю Remote-Party-ID
reason=unconditional - причина перевода (reason) - безусловная переадресация (unconditional)
Пакет INVITE, ходящий с Asterisk будет такой:
INVITE sip:89276132605@10.200.101.11 SIP/2.0.
Via: SIP/2.0/UDP 10.200.104.12:5172;branch=z9hG4bK36d97725.
Max-Forwards: 70.
From: "2057004" <sip:2059590@10.200.104.12:5172>;tag=as540b20bf.
To: <sip:89276132605@10.200.101.11>.
Contact: <sip:2057004@10.200.104.12:5172>.
Call-ID: 3471e7a82c066a3b34ed1aee4a4bd18c@10.200.104.12:5172.
CSeq: 102 INVITE.
User-Agent: Asterisk PBX 13.1-cert2.
Date: Sun, 31 Jan 2016 15:13:33 GMT.
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE.
Supported: replaces, timer.
Diversion: <sip:2057004@10.200.104.12>;user=phone;privacy=off;reason=unconditional.
Diversion: "9101230000" <sip:9101230000@10.200.104.12>;reason=unconditional.
Content-Type: application/sdp.
Content-Length: 270.





4 комментария:

  1. Спасибище тебе огромное, выручил! Очень помогла эта заметка.

    ОтветитьУдалить
  2. Не работал call forwarding на аппаратах fanvil. Не знаю, дело в ростелекоме (провайдер транка) или в аппарате, но, видимо, отдавался некорректный diversion. Короче, переадресация на федеральные номера утыкались в робота ростелекома, который говорил о том, что услуга недоступна. Отключение этого поле помогло - звонки уходят. Благодарю за заметку.

    Не знаю, связано или нет, но у меня есть еще ошибка, с которой пока не разобрался: Not accepting call completion offers from call-forward recipient. С удалением поля diversion она не ушла, надо курить.

    ОтветитьУдалить
  3. Большое спасибо.
    Для Linksys SPA504G помогло обнуление RDNIS.
    Set(CALLERID(rdnis)=)

    ОтветитьУдалить
  4. Присоединяюсь к предыдущим ораторам) большое спасибо за подсказку, вы даже сподвигли меня завести тут блог.

    ОтветитьУдалить