Asterisk: Contact already exists for AOR - Contact limit exceeded (Траблшутинг PJSIP)
- В CLI Asterisk появляется предупреждение
WARNING[1234]: res_pjsip_registrar.c: Contact already exists for AOR '101' - Contact limit exceeded. - SIP-телефон или софтфон не может зарегистрироваться, получая ответ
SIP/2.0 403 ForbiddenилиSIP/2.0 503 Service Unavailable. - При перезагрузке роутера или смене IP-адреса клиента старая регистрация зависает в памяти Asterisk до истечения TTL.
- Команда
pjsip show aor <номер>показывает исчерпание пула доступных контактов.
1. Анализ текущего состояния AOR
asterisk -rx "pjsip show aor 101"
asterisk -rx "pjsip show contacts" | grep 1012. Корректировка конфигурации pjsip.conf
Откройте файл /etc/asterisk/pjsip.conf (или соответствующий файл конфигурации в pjsip.d/) и добавьте параметры max_contacts и remove_existing в секцию типа aor:
[101]
type = aor
max_contacts = 2
remove_existing = yes
qualify_frequency = 30
qualify_timeout = 3.0
default_expiration = 300
maximum_expiration = 600
minimum_expiration = 603. Применение изменений без перезапуска Asterisk
asterisk -rx "pjsip reload"4. Принудительная очистка зависших контактов в CLI
Если требуется сбросить зарегистрированные контакты вручную:
asterisk -rx "pjsip send unregister 101"Или удалите устаревший контакт напрямую из astdb:
asterisk -rx "database deltree registrar/contact/101" Частые вопросы (FAQ)
Что делает параметр remove_existing = yes?
Параметр remove_existing = yes автоматически удаляет самую старую активную регистрацию при попытке зарегистрировать новый контакт, если достигнут лимит max_contacts. Это решает проблему со сменой динамических IP на мобильных клиентах.
Почему max_contacts по умолчанию равен 1?
В PJSIP значение по умолчанию равно 1 для обеспечения классического сценария 'один номер — одно устройство'. Для одновременной работы настольного телефона и мобильного софтфона увеличьте max_contacts до 2 или выше.
Как qualify_frequency помогает предотвратить эту ошибку?
Параметр qualify_frequency отправляет периодические SIP OPTIONS запросы. Если клиент отключился без отправки SIP REGISTER с Expires: 0, Asterisk признает контакт недоступным (Unreachable) и очистит его быстрее, освобождая слот.
Можно ли задать глобальный remove_existing для всех эндпоинтов?
Нет, директива remove_existing задается индивидуально для каждого блока [type=aor] либо через шаблоны конфигурации PJSIP (!).