Архив метки: sip

SIP: Записки о протоколе

Заголовки INVITE

 

Method and RURI (Request URI) — назначение запроса, используется прокси-серверами для роутинга запроса.

Via: сообщает, куда слать ответы на данный запрос, каждый прокси-сервер добавляет свой заголовок Via. Параметр branch идентифицирует транзакцию.

To: не используется для роутинга, содержит display name и SIP URI.

From: содержит display name и SIP URI, которые идентифицируют звонящего (Caller ID). Параметр Tag добавляется телефоном.

Call-ID: глобальный уникальный идентификатор вызова

Call-ID + To Tag + From Tag: вместе идентифицируют SIP диалог — Dialog ID (tags используются in parallel forking)

CSeq: command sequence инкременрируется при каждом запросе в текущем диалоге.

Contact: прямой маршрут для связи с userA (как сконтактировать с клиентом напрямую).

 

Разница между Via и Contact

 

  • Via: говорит, куда слать ответы
  • Contact: говорит, куда слать будущие запросы

 

Описанием медиа, кодеков и т.д. занимается протокол SDP. Описание вкладывается в тело SIP запроса. Описание SDP используется при установлении RTP сессии.

Если Record Routing не вовлечен, ACK посылается напрямую пользователю, минуя прокси-сервера (я так понимаю, это Stateless режим работы прокси-сервера).

Но зачастую используются Stateful режим и прокси-сервера таки добавляют заголовок Record Route в сообщения, чтобы заставить «пользователей» слать все запросы через себя. Это дает возможность мониторить состояние сессий.

ACK — метод, не требующий ответа. ACK отсылается только на INVITE, на BYE — нет (BYE—>, <—OK, все, сессия завершена)

Конечные пользователи изучают друг друга через Contact.

 

INVITE/200 OK/ ACK  называют SIP three-way handshake.

 

Разница между SIP-транзакцией и SIP-диалогом

 

  • SIP-транзакция: запрос — промежуточные ответы (если есть) — окончательный ответ.

ACK на положительный ответ — новая транзакция.
ACK — на отрицательный ответ — принадлежит существующей INVITE-транзакции, новая транзакция не создается.

  • SIP-диалог: все общение от начала до конца, идентифицируется Dialog ID (Call-ID+From Tag+To Tag)

 

Разница между SIP-Proxy и B2BUA (PBX)

 

  • SIP-Proxy:

Маршрутизирует запросы (1 leg)
Как быстро опознать? Один и тот же Call-ID

  • B2BUA (back-to-back user agent):

Отвечает на входящий вызов (a-leg)
Инициирует исходящий вызов (b-leg)
Bridge 2 legs — соединяет 2 ноги
Как быстро опознать? Call-ID разные

Call-ID сохраняется при прохождении через прокси-сервер, но при прохождении через B2BUA у вызова 2 ноги, Call-ID у двух ног разные

 

Remote-Party-ID (RPID)  -не стандартизирован, но популярен, используется для определения CallerID.

Стандарный путь для определения CallerID, это заголовки:

P-Asserted-Identity
P-Prefered-Identity
Privacy headers

 

Режимы работы Proxy-серверов

 

  • Stateful
  • Stateless

 

Initial and Sequential Requests

 

Initial and Sequential Requests — почему важно различать? — по разному роутятся

  • Initial — отсутствует To Tag (например, запрос INVITE)
  • Sequential (In-Dialog)— есть To Tag; Same Call-ID, From Tag , To Tag (например BYE, ACK, RE-INVITE)

 

SDP Negotiation

 

  • Normal Negotiation:

INVITE with SDP offer —>
<— 200 OK with SDP answer
ACK without SDP —>

-последнее слово в согласовании за UAS

  • Late Negotiation:

INVITE without SDP —>
<— 200 OK with SDP offer
ACK with SDP answer —>

-последнее слово в согласовании за UAC

 

DTMF

 

  • inband DTMF
  • named events (RFC 2833)
  • SIP INFO

 

Cisco 7940: мелкие неприятные грабли при работе c SIP

Все ниже написанное касается прошивки P0S3-8-12-00.

Вроде все правильно, но не регистрируется.

Грабля номер раз

Формат записи адреса Proxy-сервера, на котором телефон будет регистрироваться: если указываем доменное имя — заключаем в кавычки, если ip-адрес — кавычки убираем!

Правильно:

# Proxy Server
proxy1_address: "sip.pro-voip.com.ua"

Правильно:

# Proxy Server
proxy1_address:  10.10.10.111

Неправильно:

# Proxy Server
proxy1_address:  "10.10.10.111"

Симптомы — у меня телефон так не смог зарегистрироваться, хотя посылал запросы REGISTER на первый взгляд с правильными заголовками и на правильный ip-адрес сервера…

Грабля номер два

Это NAT. Чтобы телефон зарегистрировался за NAT’ом мне потребовалось:

  1. Отредактировать SIPDefault.cnf:
# NAT/Firewall Traversal
nat_enable: 1;                 0-Disabled (default), 1-Enabled
nat_address: "";               WAN IP address of NAT box (dotted IP or DNS A record only)
voip_control_port: 5060;       UDP port used for SIP messages (default - 5060)
start_media_port: 16384;       Start RTP range for media (default - 16384)
end_media_port: 16391;         End RTP range for media (default - 32766)
nat_received_processing: 1;    0-Disabled (default), 1-Enabled

2. На роутере выполнить проброс UDP-портов 5060 (sip) и 16384-16391 (rtp)

3. На роутере отключить SIP ALG (не везде он есть). На джунипере это делается командой:

set security alg sip disable

Cisco 7940: Файл диалплана dialplan.xml

Поскольку логику обработки вызовов проще организовать на ip-pbx, файл dialplan.xml является необязательным, но может внести некоторые полезные дополнительные функции, такие как автоматический набор и вторичный тоновый сигнал.

Файл dialplan.xml имеет следующую стркутуру:

где:

pattern может содержать: . (точка) для замены любого символа, * (звездочка) для замены одного или более символов, , (запятая) для генерации вторичного сигнала.
sec – время в секундах, после которого начинается набор.
type – может быть IP или Phone. Тэг, добавляемый к номеру, регистронезависим.
xxx – номер, который будет набираться вместо введенного пользователем при совпадении с pattern.
route – адрес прокси-сервера SIP, на который перенаправляется звонок, значение может быть default, emergency или имя прокси-сервера.
tone – если не задан, используется вторичный гудок по умолчанию, если стоит запятая и затем имя гудка, то проигрывает этот звук; без запятой гудок игнорируется.

Также можно указать решетку (#) и звездочку (*) как набираемые символы. По умолчанию # означает «набрать сейчас», не дожидаясь совпадения с шаблоном из номерного плана. * по умолчанию означает * или . в шаблоне (wildcard-символ).

В качестве вторичного гудка можно использовать следующие значения (после запятой): Bellcore-Alerting, Bellcore-dr5, Bellcore-Reorder, Bellcore-Busy, Bellcore-dr6, Bellcore-Stutter, Bellcore-BusyVerify, Bellcore-Hold, CallWaiting-2, Bellcore-CallWaiting, Bellcore-Inside, CallWaiting-3, Bellcore-Confirmation, Bellcore-None, CallWaiting-4, Bellcore-dr1, Bellcore-Outside (default), Cisco-BeepBonk, Bellcore-dr2, Bellcore-Permanent, Cisco-Zip, Bellcore-dr3, Bellcore-Reminder, Cisco-ZipZip, Bellcore-dr4.

К каждому правилу можно добавить <!— комментарий —> в конце каждой строки.

TIMEOUT=»0″ при совпадении паттерна, указывает сразу же отправить вызов на обработку — так реализуется вышеупомянутый автоматический набор.

<TEMPLATE MATCH=»1..» TIMEOUT=»0″ /> <!— Local Extensions —>

Например, набираем номер 110, подпадаем под первое правило и сразу идет вызов без дополнительных действий с нашей стороны, не нужно нажимать Dial или #.

Для звонков в другие страны будем использовать правило с паттерном 9,00* — пользователь поднимает трубку, слышит длинный гудок, набирает 9 — слышыт другой длинный  гудок (вторичный тоновый сигнал, это нам дает запятая в паттерне), затем номер, начинающийся с двух нулей (в Украине это код выхода на международную линию). Таймаут здесь уже не ставим 0, поскольку не указано точное колличество цифер, которые будут набраны.

<TEMPLATE MATCH=»9,00*» TIMEOUT=»10″ />

Номер в канал передается польностью — вместе в первой цифрой 9 — учитывайте это в диалплане на ip-pbx.

Cisco 7940: Обновление прошивки. Из SCCP в SIP

Особенности Cisco 7940

Питание: работает через POE. Если хотите отдельное питание на 220V, нужно докупить блок питания и шнур питания дополнительно.
Протокол: заточен под работу с Cisco Call Manager, дефолтная прошивка идет с SCCP протоколом, если нужен SIP — нужно заливать прошивку с SIP. Также есть прошивки с MGCP протоколом, если кто-то его использует.
Апгрейд и конфигурирование: производится через tftp — в корень tftp-сервера заливаем файл прошивки и конфигурационные файлы, а циске сообщаем адрес этого tftp-сервера

 

Получение файлов

Для начала файлы SIP-прошивки нужно получить. На сайте cisco.com они есть, но они залочены для обычного зарегистрированного пользователя, нужно либо иметь контракты на обслуживание компании, или связывать аккаунт с серийными номерами ваших цисковских продуктов, в общем нужно показать, что вы у циски что-либо приобрели и имеете право на поддержку.

 

Подготовка телефона

Обновление прошивки производится посредством TFTP-сервера. Сам циско-фон нужно сбросить, настроить сетевые параметры (ip/маска/шлюз) и указать адрес TFTP-сервера. Это можно сделать с помощью DHCP-сервера или прописать вручную через меню телефона.

 

Сброс и подготовительная настройка параметров телефона

Сначала разблокировать конфиг:

Settings — > Unlock config
пароль cisco (это пароль по умолчанию, но его могли поменять)

Сброс:

Settings -> Network Setup -> Erase Configuration:YES

уйдет в ребут.

После этого телефон пробует получить сетевые настройки и адрес TFTP от DHCP-сервера. Если DHCP-сервер не используется, настраиваем вручную.

 

Настройка DHCP-сервера

Пример настройки isc-dhcp на FreeBSD

/usr/local/etc/dhcpd.conf

# phones
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.101 192.168.1.149;
option routers 192.168.1.1;
option tftp-server-name «192.168.1.2»;
}

Значение опции tftp-server-name указываем в кавычках (потому что это строка), иначе вернет ошибку:

/usr/local/etc/dhcpd.conf line 29: expecting string.
option tftp-server-name 192.

 

Ручная настройка параметров телефона

Используем, если нет DHCP-сервера. Сначала снова разблокируем конфиг:

Settings — > Unlock config

Отключаем DHCP:

Settings — > Network Setup ->DHCP Enabled: NO

затем можно редактировать настройки ip/mask/gw и адрес tftp-сервера

 

Файлы прошивки и конфигурационные файлы на TFTP

В директории tftp должны оказаться следующие файлы:

  • OS79XX.TXT (необязательно с 8-й версии)
  • XMLDefault.cnf.xml (если есть SEP<mac>.cnf.xml, вроде как необязательно его создавать)
  • SEP<mac>.cnf.xml
  • P0S3-8-12-00.loads
  • P0S3-8-12-00.sb2
  • P003-8-12-00.bin
  • P003-8-12-00.sbn
  • SIPDefault.cnf
  • SIP<mac>.cnf
  • dialplan.xml (необязательно)
  • RINGLIST.DAT (необязательно)

 

OS79XX.TXT

это файл Dual-boot, в нем указывается, какую версию прошивки загрузить (имеется в виду не релиз, а выбор протокола — SCCP, SIP или MGCP). С 8-й версии прошивки он уже не нужен.

Имя файла OS79XX.TXT чувствительно к регистру и может содержать только имя загружаемого файла без расширения .bin. К примеру, при загрузке ПО SIP версии 2.3 в его имени должна присутствовать только строка P0S30203. Если нужно загрузить ПО версий 3.0 и позднее, имя файла должно находиться в формате P0S3-xx-y-zz. К примеру, при загрузке ПО SIP версии 7.4 в имени файла OS79XX.TXT должна присутствовать строка P0S3-07-4-00.
(c) cisco.com

 

XMLDefault.cnf.xml

файл для определения версии прошивки, которую нужно загрузить

 

SEP<mac>.cnf.xml

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

 

SIPDefault.cnf

конфигурационный файл для SIP, в нем указываются общие настройки

 

SIP<mac>.cnf

конфигурационный файл для SIP, в котором указываются настройки, специфичные для конкретного телефона. Параметры, указанные здесь, перезаписывают параметры, указанные в SIPDefault.xml. Здесь можно указывать не только логин/екстеншен/пароль для подключения, а любые значения, которые присутствуют в SIPDefault.

 

dialplan.xml (необязательно)

файл диалплана.

 

RINGLIST.DAT (необязательно)

Листинг аудио-файлов, которые могут использоваться как мелодии звонков. Эти аудио-файлы также должны находиться на tftp

 

Ну и необходимые бинарники, без них «кина не будет»:

P0S3-8-12-00.loads
P0S3-8-12-00.sb2
P003-8-12-00.bin
P003-8-12-00.sbn

Скачать прошивку можно здесь, а примеры конфигурационных файлов здесь.

 

Полезные ссылки

http://www.voip-info.org/wiki/view/Asterisk+phone+cisco+79xx

Cisco 7940: Конфигурацианные файлы SIPDefault.cnf и SIPXXXXYYYYZZZZ.cnf

tftp-сервер нам жизненно необходим только при обновлении прошивки. Для конфигурирования телефонов tftp — удобная, но не обязательная вещь.

Т.е. можно единожды настроить телефон вручную или через tftp и убрать tftp (или убрать cnf-файлы с tftp, или закрыть доступ к tftp), и перенести телефон в сеть к пользователю, где tftp не будет.

Когда телефон включается, он сначала идет на tftp-сервер за конфигурационными файлами (если они есть), а если не находит, то загружает параметры, сохраненные локально в его флеш-памяти.

С tftp телефон загружает  следующие файлы:
сначала:
SIPDefault.cnf — дефолтный конфигурационный файл
затем:
SIPXXXXYYYYZZZZ.cnf — phone-specific конфигурационный файл — для конкретного телефона с MAC-адресом SIPXXXXYYYYZZZZ. MAC-адрес записывается в верхнем регистре, расширение .cnf — в нижнем.

 

Параметры, указанные в SIPXXXXYYYYZZZZ.cnf, перезаписывают параметры, указанные в SIPDefault.xml. В SIPXXXXYYYYZZZZ.cnf можно указывать не только логин/екстеншен/пароль для подключения, а любые значения, которые присутствуют в SIPDefault.cnf.

 

Правила записи переменных

Переменные в конфигурационных файлах имеют следующий формат:

variable-name : value ; optional comments

  • одна переменная — одно значение;
  • разделяем переменные и значения двоеточием;
  • на одну строку одна пара переменная:значение, пару не разрываем (не переносим «значение» в следующую строку);
  • можно ставить пробелы перед/после переменных и значений. Если нужен пробел в значении, заключаем значение в кавычки одинарные или двойные. Открывающие и закрывающие кавычки должны быть одинаковыми — либо одинарными, либо двойными;
  • для комментариев используются ; или #
  • строки могут быть пустыми, или с комментариями;
  • названия переменных — регистроНЕзависимые.

Примеры файлов конфигурации для настройки SIP-протокола на телефонах Cisco 7940 (взяты с сайта cisco):

SIPDefault.cnf — файл с общими параметрами SIP, применяемый ко всем телефонам (скачать)
SIPXXXXYYYYZZZZ.cnf — файл в настройками конкретного телефона (скачать)

 

SIPDefault.cnf


 

SIPXXXXYYYYZZZZ.cnf


 

 

Freeswitch: SIP-стек Sofia

Осноhttp://pro-voip.com.ua freeswitchвой любой VoIP-телефонии является какой-либо VoIP-протокол (SIP, H.323, IAX и др.), согласно правилам которого и работает эта самая VoIP-телефония. Нативным протоколом для FS является SIP — SIP-стек представлен в виде модуля mod_sofia.

SIP is a crazy protocol and it will make you crazy too if you aren’t careful.

Настройка SIP-стека FS по своему вкусу производится через, так называемые, sip_profile (SIP-профили). В этих профилях, помимо различных настроек sip’а, указываются «фундаментальные» (что-то другого слова не приходит на ум) — это пары ip-port, которые слушает FS на предмет входящих запросов.

Профилей может быть столько, сколько вы можете обеспечить уникальных пар ip-port.

В дефолтной конфигурации FS представлены 2 профиля: internal  и external:

  • internal  — для регистраций внутренних пользователей (users), слушает порт 5060
  • external — для подключения внешних линий (gateways), слушает порт 5080.

Sofia. Логическая структура

Схема:

Sofia-Logical-Structure

То же самое в XML:

 

Физически же эту структуру для удобства администрирования можно разбивать на несколько файлов, не забывая их связать друг с другом в нужной иерархической последовательности с помощью команды препроцессора —  include.

 

Sofia. Profiles

Подробнее про каждую секцию конфигурации профиля


<aliases>

alias — это просто еще одно имя для одного и того же профиля;


<gateways>

gateways — секция подключения к внешним шлюзам; если хотите зарегистрировать FS у оператора и иметь выход во внешний мир, то вам сюда (или в настройку домена — там тоже встречается секция gateway).

Минимальная конфигурация gateway:

 

Некоторые (не все) параметры для расширенной настройки смотрите ниже:

gateway name:
<gateway name=»provoip»>
— имя шлюза; можно указывать реальное доменное имя или ip-адрес; также можно указывать произвольное имя, но тогда реальное доменное имя или ip-адрес нужно будет указать в параметре realm;

username:
<param name=»username» value=»username1» />
— имя пользователя *required*;

realm:
<param name=»realm» value=»provoip.in.ua«/>
— auth realm: *optional* — если это поле не указано, используется имя gateway. realm — это поле sip-запроса аутентификации, которое определяет область отклика аутентификации (заумная фраза не моя — так написано в книге по sip); короче, это «домен», к которому будет относиться пользователь. Обязательно должен содержать реальное имя домена или ip-адрес;

from-user:
<param name=»from-user» value=»5555555«/>
— имя пользователя в поле From: *optional* — если не указано, используется значение поля username;

from-domain:
<param name=»from-domain» value=»provoip.in.ua«/>
— имя домена в поле From: *optional* — если не указано, используется значение поля realm;

password:
<param name=»password» value=»mystrongpassword«/>
— пароль пользователя *required*;

extension:
<param name=»extension» value=»8888888«/>
— номер (extension) для входящих звонков *optional* — если не указано, исп-ся значение поля username;

proxy:
<param name=»proxy» value=»provoip.in.ua«/>
— proxy host: *optional* — если не указан, исп-ся значение поля realm;

register-proxy:
<param name=»register-proxy» value=»pro-voip.com.ua«/>
— посылать register на этот хост (другими словами, регистрироваться на этом хосте) *optional* — если не указано, исп-ся значение поля proxy;

expire-seconds:
<param name=»expire-seconds» value=»60«/>
— register expire (in seconds) *optional* — по умолчанию 3600 сек;

register:
<param name=»register» value=»false«/>
— не регистрироваться; параметр пригодится, если, например, нужно будет построить sip-транк с оператором на множество номеров, а оператор вас авторизирует по ip-адресу и не дает вам логин-пароль 🙂 НО! даже если вы не используете регистрацию, то поля username и password все равно должны быть заполнены какими-либо значениями (пофигу какими);

register-transport:
<param name=»register-transport» value=»udp«/>
— какой транспорт (читай: протокол транспортного уровня) — tcp или udp — использовать при регистрации; default — udp;

retry-seconds:
<param name=»retry-seconds» value=»30«/>
— если регистрация потерпела неудачу или отвалилась по таймауту, то сколько секунд ждать перед повторной попыткой? — указываем здесь; default — 30;

caller-id-in-from:
<param name=»caller-id-in-from» value=»true«/>
— при исходящих вызовах через данный шлюз callerid берем из поля From (берем значение поля From A-ноги и суем это значение в поле From B-ноги); default —  false — callerid = username;

<!—extra sip params to send in the contact—>
<!—<param name=»contact-params» value=»tport=tcp»/>—>
<!—send an options ping every x seconds, failure will unregister and/or mark it down—>
<!—<param name=»ping» value=»25″/>—>

</gateway>

Настройки вне тега <gateway>, но внутри тега <gateways> (пока без описания):

<!—rfc5626 : Abilitazione rfc5626 ///—>
<!—<param name=»rfc-5626″ value=»true»/>—>
<!—rfc5626 : extra sip params to send in the contact—>
<!—<param name=»reg-id» value=»1″/>—>


<domains>

domain — индикатор, который дает установку профилю открыть XML-регистр FS’а и выполнить действия над доменом в зависимости от следующих настроек:

  • alias: [true/false] — автоматически создавать алиас для данного профиля; alias name = domain name в этом случае;
  • parse: [true/false] — сканировать домен на наличие gateway и включать их в этот профиль;
  • name: [<string>] — здесь указываем имя конкретного домена или all (для всех доменов), над которыми производим вышеперечисленные действия alias и parse.

Например:

дает указание создавать алиасы к этому профилю для всех доменов и не сканировать домены на наличие gateway.


<settings>

 

Basic settings

user-agent-string:
<param name=»user-agent-string» value=»FreeSWITCH Rocks!»/>
— выставляем свой User-Agent заголовок во всех SIP-сообщениях. Можно выставлять любое значение. но нужно быть внимательным к спец-символам — например,  другие SIP-сервера, с которыми общается наш FS, может отклонить сообщение из-за наличия в заголовке User-Agent символа «@». Без установки этого параметра, User-Agent будет выглядеть примерно следующим образом (зависит от вашей инсталяции FS):

User-Agent: FreeSWITCH-mod_sofia/1.2.22+git~20140311T001049Z~9495f2534d~32bit

shutdown-on-fail:
<param name=»shutdown-on-fail» value=»true»/>
— если нужно, чтобы FS потушился, если данный профиль не загрузится, ставим true; default: false;

context:
<param name=»context» value=»public»/>
указываем, в какой контекст помещать входящие вызовы, которые идут на ip-port этого профиля

sip-port:
<param name=»sip-port» value=»5060″/>
— порт, который слушает FS на предмет входящих соединений;

sip-ip:
<param name=»sip-ip» value=»10.10.10.10″/>
— ip-адрес, на который FS принимает входящие sip-запросы; Не используйте доменные имена — только IP-адрес!

rtp-ip:
<param name=»rtp-ip» value=»10.10.10.10″/>
— ip-адрес, на который FS принимает rtp-потоки; Не используйте доменные имена — только IP-адрес!

dialplan:
<param name=»dialplan» value=»XML»/>
— какой тип диалплана использовать для пользователей этого профиля.

 

Media relaited options

resume-media-on-hold и bypass-media-after-hold:

<param name=»media-option» value=»resume-media-on-hold»/>
<param name=»media-option» value=»bypass-media-after-hold»/>

— если FS настроен так, чтобы не проксировать через себя медиа-потоки (bypass_media = true), а у нас появилась необходимость перехватить медиапоток, нажав на кнопку hold, то используются эти две медиа-опции (работают в паре): resume-media-on-hold перехвачивает медиа, а bypass-media-after-hold после повторного нажатия hold, возвращает вызов в исходный bypass-media режим.

bypass-media-after-att-xfer:
<param name=»media-option» value=»bypass-media-after-att-xfer»/>
— после перевода вызова (при attended transfer) вернуться к режиму bypass media.

inbound-bypass-media и inbound-proxy-media:
— два взаимоисключающих параметра (если один параметр true, второй должен быть false)- установка режима работы с медиапотоками.
<param name=»inbound-bypass-media» value=»true»/> — не прокрисовать медиапоток через FS; FS контролирует только SIP-сессию, а rtp-потоки текут напрямую между конечными точками.
<param name=»inbound-proxy-media» value=»true»/> — проксировать медиапоток через FS; rtp-потоки проходят через FS, но модифицировть их мы не можем.
default: false/false — при такой конфигурации rtp-потоки проксируются через FS и можем с ними производить любые манипуляции.

t38-passthru:
<param name=»t38-passthru» value=»true»/>
— [true/false/once] — факс по протоколу t38

 

Codecs related options

inbound-codec-prefs:
<param name=»inbound-codec-prefs» value=»PCMA, PCMU»/>
— порядок предпочтения того или иного кодека в процессе согласования кодека с другой стороной диалога при входящих (inbound) вызовах. Здесь предпочтение кодеку PCMA.

outbound-codec-prefs:
<param name=»outbound-codec-prefs» value=»PCMA, PCMU»/>
— то же самое, но по отношению к исходящим (outbound) вызовам.

codec-prefs:
<param name=»outbound-codec-prefs» value=»PCMA, PCMU»/>
— то же самое, но для inbound и outbound направлений одновременно.

inbound-codec-negotiation:
<param name=»inbound-codec-negotiation» value=»generous»/>
— параметр, значение которого решает «кто главный» в процессе согласования кодека:

  • «generous» — «главный» список кодеков удаленной стороны;
  • «greedy» — «главный» список кодеков FS;
  • «scrooge» — идет дальше «greedy» — FS выигрывает даже тогда, когда противоположная сторона лжет о своих возможностях в ходе переговорного процесса.

inbound-late-negotiation:
<param name=»inbound-late-negotiation» value=»true»/>
— позволяет сначала пройтись по диалплану, а зачем уже выбирать кодек для a-leg.

disable-transcoding:
<param name=»disable-transcoding» value=»true»/>
— запретить транскодинг; FS будет предлагать вызываемой стороне только те кодеки, которые поддерживает вызывающая сторона.

 

DTMF

dtmf-type:
<param name=»dtmf-type» value=»info»/>

  • «info»
  • «rfc2833»
  • «none»

— тип DTMF. Этот же параметр можно представить в виде переменной в секции <gateway> или <user> (но это не канальная переменная!):

Заметьте, параметр dtmf-type пишется через дефис «-«, а переменная dtmf_type через нижнее подчеркивание «_».

Для распознавания inbound DTMF есть приложение в диалплане start_dtmf.

rfc2833-pt:
<param name=»rfc2833-pt» value=»101″/>
— rfc2833 payload type — идентификатор для отличия rfc2833 dtmf от остальных типов rtp-трафика.

dtmf-duration:
<param name=»dtmf-duration» value=»2000″/>
— длительность dtmf-тона.

liberal-dtmf:
<param name=»liberal-dtmf» value=»true»/>
— всегда предлагать rfc2833, а принимать и rfc2833, и info dtmf.

 

Информация почерпана с wiki.freeswitch.org. Продолжение следует…