Показаны сообщения с ярлыком VOIP. Показать все сообщения
Показаны сообщения с ярлыком VOIP. Показать все сообщения

среда, 12 августа 2026 г.

Использование sipsak для проверки доступности и регистрации

 Ставим из net-misc/sipsak.


Проверка доступности сообщением OPTIONS.

# sipsak -vv -s sip:4520@10.2.1.7 -D 5

Где, 

s - проверяемый sip URI;

D - таймаут.

Внимание! Замечено, что в версии 0.9.8 sipsak не подставляет занимаемый им динамический порт в поле Contact, поэтому не получает ответа от клиента. Решением является непосредственно указывать локальный порт ключом -l. Например,  -l 41908.

При оценке результата запроса можно ориентироваться на код завершения. При получении 200 возвращает 0, при 404 возвращает 1, на таймаут или сброс - 3. 

четверг, 18 сентября 2025 г.

Щелчки в начале проигрыша сообщений в Астериск

 Возникают при конвертации RIFF файлов (.wav) в чистый a-law. Остается заголовок RIFF, который приводит к щелчку при проигрывании.

Решение: удалить заголовок. Например, с помощью RIFFStrip.

среда, 23 июля 2025 г.

Модификация приложения Record для отлавливания нужного кода DTMF

Продолжаем мучать app_record.c

Задача: отловить набор внутреннего номера. Номера начинаются с "4".

Т.е. нужно прервать запись только по нажатию "4", и сообщить об этом факте.

Добавим опцию "e" в приложение Record. Для этого:

вторник, 6 мая 2025 г.

Добавляем в CDR причину и инициатора разрыва соединения

 Добавляем в CDR две колонки:

- hangupcause (int4);

- hangupparty (varchar или сделать отдельный тип enum 'caller|callee').

Далее добавляем в app_dial.c переменную типа char buf_hangup_str[8], по очереди пишем в неё значения ast_channel_hangupcause(chan) и ast_check_hangup(chan), и сбрасываем в CDR через ast_cdr_setvar.

Соответствующий патч ниже.

вторник, 1 апреля 2025 г.

Модули маршрутизации в OpenSIPS

CARRIERROUTE

Модуль, обеспечивающий возможности маршрутизации, балансировки и черных списков. Он считывает маршруты из базы данных или файла конфигурации на старте OpenSIPS. Может использовать одно дерево маршрутизации (для одного оператора) или, при необходимости, для каждого пользователя — отдельное дерево маршрутизации (уникальное для каждого оператора) для маршрутизации на основе префикса номера. Поддерживает несколько доменов дерева маршрутов, например, для резервирования маршрутов или разных правил маршрутизации в зависимости от пункта назначения.

Модуль скалируется до более чем нескольких миллионов пользователей и способен обработать более нескольких сотен маршрутов. В сценариях балансировки рекомендуется использовать файл конфигурации, чтобы не вносить дополнительную сложность с запросами БД. 

В целом, этот модуль можно использовать в качестве замены для модулей lcr и dispatcher, если у есть определенные требования к производительности, гибкости и/или интеграции, с которыми эти модули не справляются. Но для небольших установок, вероятно, имеет смысл использовать lcr и диспетчерский модуль.

Если модуль используется в маршруте ошибки (failure route), то необходимо вызвать функцию append_branch() после перезаписи RURI, чтобы сообщение ушло новому получателю. 

Зависимости: tm, database (если используем БД)

четверг, 20 марта 2025 г.

Модули SIP сигнализации в OpenSIPS

B2B_ENTITIES

Реализация модели B2B разделена на два уровня:

 - нижний, который реализует этот модуль, для базовых функций UAS и UAC;

 - верхний, который реализует модуль b2b_logic (см. ниже), для всей логики B2BUA.

Этот модуль хранит записи соответствующих диалогов, в которых используется модель B2BUA. Он представляет API для других модулей, которые используют свои функции для создания нового диалога, для отправки сообщений этого диалога и заодно оповещает модуль верхнего уровня о поступлении сообщения внутри диалога. Записи разделяются на два типа: b2b записи сервера и b2b записи клиента, в зависимости от того, в каком режиме они созданы. Записи созданные для полученного начального запроса будут серверными, в то время как записи, для которых будут оправлены начальные запросы (т.е. создан новый диалог), станут записями b2b клиента. Этот модуль не реализует модель B2BUA самостоятельно, к нему ещё нужен модуль B2B логики.

Модуль b2b_entities может отвечать на запросы аутентификации, если загружен модуль uac_auth. Список реквизитов для аутентификации так же предоставляется модулем uac_auth.

Зависимости: b2b_logic, tm, db, uac_auth (если нужна аутентификация)

вторник, 11 февраля 2025 г.

Маршруты в OpenSIPS

 Логика маршрутизации

Логика маршрутизации представляет из себя сумму маршрутов (routes), которые содержат правила обработки сообщений SIP.

Маршруты делятся на два вида:

- основные маршруты (top routes) - это маршруты, которые напрямую запускаются (вызываются) OpenSIPS при возникновении некоторых событий (таких как поступление запроса или ответа, ошибка транзакции и т.п.);

- подмарштуры (sub-routes)- маршруты, которые вызываются из других маршрутов скрипта. Подмаршруты имеют имена и должны вызываться по ним из других маршрутов или подмаршрутов. Подмаршруты могут принимать параметры или возвращать числовой код (избегайте возврата нулевого значения (0), так как это завершит работу всего скрипта). Подмаршруты похожи на процедуры или функции в любом языке программирования!


Для перехода в подмаршрут используется функция route.

route(name [, param1 [, param2 [, ...] ] ] )

Она может принимать до семи параметров, которые в дальнейшем могут быть получены обращением к псевдо переменной '$param(idx)'.

Например, route(HANDLE_SEQUENTIALS, 1, "param", $var(param));

   

четверг, 6 февраля 2025 г.

Переменные в OpenSIPS

В OpenSIPS несколько типов переменных. Их отличия в том, в какой части скрипта они видны, за чем закреплены, могут ли хранить несколько значений (как массив) и являются ли перезаписываемыми.

Переменные определяются по наличию знака "$" перед их именем.

Обращение к переменной имеет следующий синтаксис (зеленые поля опциональны): $(<context>name(subname)[index]{transformation})

name - имя переменной. Например: pvar, avp, ru, DLG_status.

subname - идентификатор конкретного значения переменной данного типа (тип задаётся именем). Например: hdr(From), avp(name).

index - индекс в массиве, если переменная поддерживает хранение нескольких значений. Индекс может быть отрицательным числом, где "-1" означает последнее добавленное значение, а "-2" - предпоследнее.

transformation - некоторые преобразования, которые можно применить к переменной. Например: обрезка, преобразование типа, вычисление длины и т.п. Преобразования могут быть каскадными, в этом случае каждое последующее преобразование осуществляется над результатом предыдущего. Список преобразований тут.

context - контекст, где переменная будет востребована. Есть два контекста: reply и request. Контекст reply может быть указан в failure маршруте для получения переменной из ответа на запрос. Контекст request может быть указан в маршруте reply для получения переменной из соответствующего запроса.

пятница, 31 января 2025 г.

Астериск возвращает "404" на запрос OPTIONS

При получении OPTIONS Астериск ищет номер "s" в контексте default.

Поэтому простого диалпана вида

[default]

exten => s,1,Hangup

достаточно, чтобы Астериск возвращал "200", вместо "404".



понедельник, 27 января 2025 г.

Заголовки SIP Path

 Просто чтобы не забыть.

Заголовок Path - это такой аналог Record-Route для сообщений REGISTER и ответов на них, т.е. для сообщений вне диалога. Назначение аналогичное - запись цепочки адресов прокси, через которые проходят сообщения. Синтаксис аналогичен Record-Route.

Подробно в RFC 3327.                              

среда, 22 января 2025 г.

Реализация привязки аккаунта к IP-адресу с помощью модуля permissions в OpenSIPS

Проверка привязки делается по двум группам в таблице address модуля permissions. Сначала в одной группе ищется совпадение username из реквизитов аутентификации по сети 0.0.0.0/0 (т.е. по всем адресам), затем в другой группе ищется совпадение IP/username. Если совпадает, то запрос обрабатывается обычным образом.

На примере запроса REGISTER. Аккаунту 4521 разрешено подключаться только с IP 10.49.2.78.

четверг, 28 ноября 2024 г.

Strict и loose маршрутизация SIP, модуль rr в Opensips

Строгая (strict) и свободная (loose) маршрутизация SIP отличаются наличием или отсутствием модификации заголовка Request-URI (R-URI). Строгая маршрутизация устарела, сейчас обычно используется свободная.

При строгой маршрутизации SIP прокси обязан использовать для маршрутизации адреса из заголовка Route повторных запросов (ACK, BYE, Re-INVITE). При этом адрес в R-URI заменяется на "верхний" адрес из Route и сообщение передаётся на этот новый R-URI. Таким образом R-URI всегда содержит адрес следующего хоста (например, следующего прокси или уже самого получателя). Строгая маршрутизация подразумевает, что сообщение пройдет только по хостам, перечисленным в заголовке Route.



вторник, 26 ноября 2024 г.

Заголовки Via, Record-Route и Route

Заголовки Via содержат записи обо всех устройствах (прокси, АТС и т.п.), которые прошел начальный запрос на своём пути к получателю.  Ответы на запрос получатель должен отправлять на адрес из последнего заголовка Via. На обратном пути к отправителю каждое устройство удаляет заголовок Via со своим адресом, таким образом к отправителю приходит ответ с одним исходным Via, и UAC не получает информацию, каким путем прошли сообщения транзакции.

Для statefull маршрутизации используются заголовки Record-Route и Route. Каждый прокси добавляет к начальному запросу заголовок Record-Route со своим адресом. Важна последовательность заголовков, т.к. их порядок определяет путь запроса через сеть. UAS в ответах передает полный набор полученных заголовков Record-Route, и они не удаляются в процессе передачи сообщения между прокси.

Для непосредственных ответов (таких как "200 OK") на начальный запрос в рамках одной транзакции используются адреса из заголовков Via в обратном порядке. А вот для маршрутизации последующих запросов диалога (ACK, BYE, Re-INVITE) берутся адреса из Record-Route. Для этого UAC формирует заголовок Route, используя адреса из заголовков Record-Route, полученных с финальным ответом на начальный запрос. Для формирования заголовка Route адреса берутся в обратном порядке, что позволяет проходить прокси в нужной очерёдности. Прокси, получивший сообщение с заголовком Route, пересылает это сообщение на адрес из Route.

Таким образом, использование заголовков Record-Route позволяет сохранить путь запросов через сеть в рамках всего диалога. Что может быть важно для корректной маршрутизации и биллинга.

Про диалоги и транзакции читаем тут.

Подробное описание на английском тут.

пятница, 8 ноября 2024 г.

Ошибки E1

 LOS = Loss of Signal. You aren't getting signal.

LOF = Loss of Framing. Your packets aren't getting through framed correctly.

AIS = receiving Alarm Indicator Signal. The far end isn't getting things through framed correctly, and is indicating that back to you.

RAI = Remote Alarm Indicator. The far end is getting an error and is signalling that back to you.

вторник, 22 октября 2024 г.

Opensips. Пример обработки INVITE

if (is_method("INVITE")) {

    # Если не получилось авторизовать данными из БД

    if (!www_authorize("", "subscriber")) {

        # Всегда пишем код возврата в переменную

        $var(reg) = $retcode;

        # Обработка неправильного пароля, начальный запрос без Authorization вернёт код -4

        if ($var(reg)==-2) {

            sl_send_reply(403,"Wrong side, dude");

            exit;

        }

        #  Запрос авторизации

        www_challenge("");

       exit;

    }

пятница, 11 октября 2024 г.

Настройка регистрации на Opensips 3.4

 Потребуются следующие модули.

#### USeR LOCation

loadmodule "usrloc.so"

    modparam("usrloc", "db_url", "postgres://username:password@localhost/dbname")

    # Тут надо выбрать подходящий режим работы

    modparam("usrloc", "working_mode_preset", "single-instance-sql-write-through")

#### REGISTRAR module

loadmodule "registrar.so"

#### Postgresql

loadmodule "db_postgres.so"

#### Auth module

loadmodule "auth.so"

# Database authentications

loadmodule "auth_db.so"

    modparam("auth_db", "db_url", "postgres://username:password@localhost/dbname")

    # Используем пароли в clear text

    modparam("auth_db", "calculate_ha1", 1)

   # Прямо указываем таблицу с паролями, по-умолчанию ищет хэш в h1

    modparam("auth_db", "password_column", "password")

    modparam("auth_db", "use_domain", 1)


В БД должны быть таблицы subscriber и location.


Код:

if (is_method("REGISTER")) {

    if (!www_authorize("", "subscriber")) {

    www_challenge("");

    exit;

};

save("location");

exit;

};

среда, 19 июня 2024 г.

Установка Opensips на Gentoo без ebuild

 Скачиваем исходники Opensips, ставим зависимости.

# emerge -avg gcc bison lynx subversion flex dev-libs/confuse

Выполняем make или make menuconfig.

При выполнении может вывалиться ошибка ncurses:

usr/libexec/gcc/x86_64-pc-linux-gnu/ld: curses.o: undefined reference to symbol 'stdscr'

/usr/libexec/gcc/x86_64-pc-linux-gnu/ld: /usr/lib64/libtinfo.so.6: error adding symbols: DSO missing from command line

collect2: error: ld returned 1 exit status

В таком случае пересобираем ncurses без tinfo. Нюанс в том, что флаг tinfo замаскирован, так что надо поправить конфиг профиля:

# echo "sys-libs/ncurses -tinfo" >> /etc/portage/profile/package.use.force/ncurses

# emerge -av sys-libs/ncurses

# emerge @preserved-rebuild




понедельник, 16 октября 2023 г.

Подключение FastAGI скриптов через xinetd

 Ставим xinetd, если его нет.

Далее в /etc/services пишем:

fastagi             4573/tcp                        # FastAGI service

Создаем /etc/xinetd.d/fastagi со следующим содержимым:

service fastagi

{
        socket_type  = stream
        user         = root
        group        = nobody
        server       = /путь_к_скрипту.sh
        wait         = no
        protocol     = tcp
        bind         = 10.2.1.31
        disable      = no
        per_source   = UNLIMITED
        instances    = UNLIMITED
        cps          = 100 0
}

понедельник, 12 декабря 2022 г.

Нюансы версии DAHDI в зависимости от версии ядра Линукса

Which version of DAHDI to use depends on the Linux kernel version, as given by "uname -r". Roughly, Linux kernel 3.x should use DAHDI 2.9, kernel >=4.0 and < 4.15 should use DAHDI 2.11, and kernel >= 4.15 or greater should use DAHDI 3.x.

Отсюда.

четверг, 8 декабря 2022 г.

UnixODBC и Asterisk 16 (и 18). Функции func_odbc обрезают ответ базы до первых 14 знаков.

Бага в libodbcpsql.so из самого пакета unixODBC.

Решение: установка psqlodbc. Psqlodbc создаёт библиотеки psqlodbca.so и psqlodbcw.so. Их и используем для подключения в odbcinst.ini.

[PostgreSQL]

Description=ODBC for PostgreSQL

Driver=/usr/lib64/psqlodbcw.so

Setup=/usr/lib64/libodbcpsqlS.so

Threading=5

UsageCount=1

FileUsage=1


In addition, the "w" and "a" at the end of the file names almost certainly refer to the Unicode ("w" for "wide") and ANSI ("a") versions of the driver.

psqlodbca.so - ANSI

psqlodbcw.so - widechar