Втулка балки, я так понял, вы SIP телефон вообще на внешнего SIP провайдера заводилию, чтобы общаться бесплатно... А на БТК просто к обычной линии подключили. У меня другая задача.
Ксати, я ее решил! Поборол глюки. Чуть позже расскажу подробно как. Может кому-нибудь будет интересно.
Пока не заглянул в сосрсы Asterisk'а - ничего бы не решил. Документации по этому нет в принципе.
Итак, что мы имеем (краткий пересказ прошлой страницы): после настройки на БТК (белтелеком т.е.), у Aterisk'а идет двойная регистрация, одна из которых успешна, другая нет. После успешной перерегистрации получаем отвал входящих.
Что на моём NAS'е установлено:
Asterisk Build: Asterisk/13.1.0
Asterisk GUI-version : 2.1.0-rc1
Полез в конфиг, вычитал:
register => [peer?][transport://]user[@domain][:secret[:authuser]]@host[:port][~expiry]
; Note that a register= line doesn't mean that we will match the incoming call in any
; other way than described above. If you want to control where the call enters your
; dialplan, which context, you want to define a peer with the hostname of the provider's
; server. If the provider has multiple servers to place calls to your system, you need
; a peer for each server.
Т.е. насколько я понял, строка регистрации должна сопоставляться с настройками пира (т.е. транка в users.conf или sip.conf) и если находится, к ней привязывается план. У меня почему-то не сопоставляется, и все работает по отдельности.
Есть некий странных параметр [peer?], который нигде не описан. а я так и не раскопал. Может быть он поможет в сопоставлении. непонятно. Я пробовал туда прописывать имя пира (название секции), не помогло.
Далее я заметил, что в настройках peer'а есть странны параметр
registersip = yes
host = 10.136.0.41
username = +37517мой_номер@ims.beltel.by
secret = мой пароль
trunkname = Beltelecom
context = DID_trunk_1
hasexten = no
hasiax = no
hassip = yes
registeriax = no
registersip = yes
trunkstyle = voip
disallow = all
allow = all
fromuser = +37517мой_номер
fromdomain = ims.beltel.by
qualify = yes
type = peer
insecure = invite
dtmfmode = inband
nat = yes
Попытался поставить no, и вот чудо! Вторая ошибчная регистрация пропала!
Теперь понятно почему у меня в sip show registry были две записи о регистрации:
10.136.0.41:5060 N +37517мой_номер 105 Registered Tue, 27 Sep 2016 14:12:39
10.136.0.41:5060 N +37517мой_номер 120 No Authentication
2 SIP registrations.
Это две параллельных регистрации так отметились, первая от команды register =>,
а вторая - это сам peer пытался зарегаться и неуспешно.
начал я искать доки на параметр registersip, во всем интернете не нашел.
Ну что, полез я в сорсы:
http://doxygen.asterisk.org/trunk/d5/dfe/chan__sip_8c.html
Оттуда вот важная секция, вычитка параметров конфига пира, если стоит registersip = yes:
- код выделить все
32211 if (ast_true(registersip) || (!registersip && genregistersip)) {
32212 char tmp[256];
32213 const char *host = ast_variable_retrieve(ucfg, cat, "host");
32214 const char *username = ast_variable_retrieve(ucfg, cat, "username");
32215 const char *secret = ast_variable_retrieve(ucfg, cat, "secret");
32216 const char *contact = ast_variable_retrieve(ucfg, cat, "contact");
32217 const char *authuser = ast_variable_retrieve(ucfg, cat, "authuser");
32218 if (!host) {
32219 host = ast_variable_retrieve(ucfg, "general", "host");
32220 }
32221 if (!username) {
32222 username = ast_variable_retrieve(ucfg, "general", "username");
32223 }
32224 if (!secret) {
32225 secret = ast_variable_retrieve(ucfg, "general", "secret");
32226 }
32227 if (!contact) {
32228 contact = "s";
32229 }
32230 if (!ast_strlen_zero(username) && !ast_strlen_zero(host)) {
32231 if (!ast_strlen_zero(secret)) {
32232 if (!ast_strlen_zero(authuser)) {
32233 snprintf(tmp, sizeof(tmp), "%s?%s:%s:%s@%s/%s", cat, username, secret, authuser, host, contact);
32234 } else {
32235 snprintf(tmp, sizeof(tmp), "%s?%s:%s@%s/%s", cat, username, secret, host, contact);
32236 }
32237 } else if (!ast_strlen_zero(authuser)) {
32238 snprintf(tmp, sizeof(tmp), "%s?%s::%s@%s/%s", cat, username, authuser, host, contact);
32239 } else {
32240 snprintf(tmp, sizeof(tmp), "%s?%s@%s/%s", cat, username, host, contact);
32241 }
32242 if (sip_register(tmp, 0) == 0) {
32243 registry_count++;
32244 }
32245 }
32246 }
Там я нашел, что если стоит registersip, то производится регистрация пира, так что команда register не нужна!
Но там же я заметил другой важный недокументированный параметр: authuser, который задавался в строке регистрации, но отсуствовал в настройках пира.
Добавил в секцию настроек пира:
authuser=+37517мой_номер@ims.beltel.by
а команду register=> удалил из sip.conf
и о чудо, всё заработало!
Теперь основная регистрация передает корректное имя юзера и не фейлится.
В sip show registry видна одна регистрация и олна успешна.
И диалплан не отваливается при переконнекте.
Есдинственное что я не нашел, это как для пира увеличить expiration, равноый 120 секундам.
В строке register это можно было задать в конце, параметр [~expiry], например ~3600
Тут нету такого параметра.
Можно только установить для всех коннекшнов в файле sip.conf:
defaultexpiry=120 ; Default length of incoming/outgoing registration