Страница 1 из 1

Asterisk + chan_dongle + RTP

Добавлено: 10 ноя 2020, 20:20
vitaleg
Привет. Друзья, помогите плз с настройкой Asterisk 16 + chan_dongle. Проблема в NAT, очевидно. Ситуация следующая, если переводить вызов с донгла на внешний транк вот так:

Код: Выделить всё

exten => _+X.,1,Dial(PJSIP/101@5172-100)
exten => _+X.,n,Hangup()
то звука нет и получаем вот такую картину:

Код: Выделить всё

   -- Executing [+1234567890@dongle:1] Dial("Dongle/tan-0100000001", "PJSIP/101@5172-100") in new stack
    -- Called PJSIP/101@5172-100
    -- PJSIP/5172-100-00000005 is ringing
    -- PJSIP/5172-100-00000005 is ringing
       > 0x7317d0 -- Strict RTP learning after remote address set to: 195.122.19.14:31938
    -- PJSIP/5172-100-00000005 answered Dongle/tan-0100000001
    -- Channel PJSIP/5172-100-00000005 joined 'simple_bridge' basic-bridge <91fe51f0-0e67-441d-ad52-fb3def95e36c>
    -- Channel Dongle/tan-0100000001 joined 'simple_bridge' basic-bridge <91fe51f0-0e67-441d-ad52-fb3def95e36c>
    -- Channel PJSIP/5172-100-00000005 left 'simple_bridge' basic-bridge <91fe51f0-0e67-441d-ad52-fb3def95e36c>
    -- Channel Dongle/tan-0100000001 left 'simple_bridge' basic-bridge <91fe51f0-0e67-441d-ad52-fb3def95e36c>
  == Spawn extension (dongle, +1234567890, 1) exited non-zero on 'Dongle/tan-0100000001'
Но, если добавить Answer(), то всё работает:

Код: Выделить всё

exten => _+X.,1,Answer()
exten => _+X.,n,Dial(PJSIP/101@5172-100)
exten => _+X.,n,Hangup()
и выглядит уже вот так:

Код: Выделить всё

-- Executing [+1234567890@dongle:1] Answer("Dongle/tan-0100000003", "") in new stack
    -- Executing [+1234567890@dongle:2] Dial("Dongle/tan-0100000003", "PJSIP/101@5172-100") in new stack
    -- Called PJSIP/101@5172-100
    -- PJSIP/5172-100-0000000b is ringing
    -- PJSIP/5172-100-0000000b is ringing
       > 0x79d370 -- Strict RTP learning after remote address set to: 195.122.19.14:34132
    -- PJSIP/5172-100-0000000b answered Dongle/tan-0100000003
    -- Channel PJSIP/5172-100-0000000b joined 'simple_bridge' basic-bridge <5f8b93c5-94d7-414e-959f-b220ee1c3718>
    -- Channel Dongle/tan-0100000003 joined 'simple_bridge' basic-bridge <5f8b93c5-94d7-414e-959f-b220ee1c3718>
       > 0x79d370 -- Strict RTP switching to RTP target address 195.122.19.14:34132 as source
       > 0x79d370 -- Strict RTP learning complete - Locking on source address 195.122.19.14:34132
    -- Channel Dongle/tan-0100000003 left 'simple_bridge' basic-bridge <5f8b93c5-94d7-414e-959f-b220ee1c3718>
  == Spawn extension (dongle, +1234567890, 2) exited non-zero on 'Dongle/tan-0100000003'
    -- Channel PJSIP/5172-100-0000000b left 'simple_bridge' basic-bridge <5f8b93c5-94d7-414e-959f-b220ee1c3718>
Думаю, что проблема вот в этой настройке, которая происходит только если есть Answer():

> 0x79d370 -- Strict RTP switching to RTP target address 195.122.19.14:34132 as source
> 0x79d370 -- Strict RTP learning complete - Locking on source address 195.122.19.14:34132


Причём если просто звонить с внутреннего клиента на транк - всё прекрасно работает и с Answer и без.

Посоветуйте, пожалуйста, в чём может быть проблема?

Re: Asterisk + chan_dongle + RTP

Добавлено: 11 ноя 2020, 10:50
ded
Из мира GSM => Dongle => SIP:
USB-модем не передаёт голос (RTP) пока не получит Answer, ибо он переключается на ходу с режима SMS (data) в режим voice только если мы снимаем трубку (нажимаем зелёную трубочку на смартфоне).
Если же выполняется с внутреннего SIP клиента абоненту GSM
SIP => Dongle => GSM в мир,
то модем сразу видит, что это голос.

Re: Asterisk + chan_dongle + RTP

Добавлено: 11 ноя 2020, 19:10
vitaleg
Спасибо, но проблема в том, что при звонке на локальный sip клиент - никаких проблем со звуком нет и без Answer()

Код: Выделить всё

exten => _+X.,1,Dial(PJSIP/101)
exten => _+X.,n,Hangup()

Код: Выделить всё

-- Executing [+1234567890@dongle:1] Dial("Dongle/tan-0100000000", "PJSIP/101") in new stack
    -- Called PJSIP/101
[Nov 11 16:06:18] WARNING[2174][C-00000001]: channel.c:1079 channel_indicate: [Dongle/tan-0100000000] Don't know how to indicate condition 22
    -- PJSIP/101-00000000 is ringing
    -- PJSIP/101-00000000 is ringing
       > 0xcf9a60 -- Strict RTP learning after remote address set to: 192.168.100.29:10000
    -- PJSIP/101-00000000 answered Dongle/tan-0100000000
    -- Channel PJSIP/101-00000000 joined 'simple_bridge' basic-bridge <d9da28ef-2d1b-46e2-945e-889852afca49>
    -- Channel Dongle/tan-0100000000 joined 'simple_bridge' basic-bridge <d9da28ef-2d1b-46e2-945e-889852afca49>
       > 0xcf9a60 -- Strict RTP switching to RTP target address 192.168.100.29:10000 as source
    -- Channel Dongle/tan-0100000000 left 'simple_bridge' basic-bridge <d9da28ef-2d1b-46e2-945e-889852afca49>
  == Spawn extension (dongle, +1234567890, 1) exited non-zero on 'Dongle/tan-0100000000'
    -- Channel PJSIP/101-00000000 left 'simple_bridge' basic-bridge <d9da28ef-2d1b-46e2-945e-889852afca49>
И опять здесь есть вот это:

Strict RTP switching to RTP target address 192.168.100.29:10000 as source

Всё-таки, мне кажется, проблема где-то в этом ;(

Re: Asterisk + chan_dongle + RTP

Добавлено: 12 ноя 2020, 13:51
ded
Попробуйте вместо Answer поставить Progress()

Re: Asterisk + chan_dongle + RTP

Добавлено: 12 ноя 2020, 19:27
vitaleg
К сожалению, не помогло, звука так и нет :(

Код: Выделить всё

-- Executing [+1234567890@dongle:1] Progress("Dongle/tan-0100000000", "") in new stack
    -- Executing [+1234567890@dongle:2] Dial("Dongle/tan-0100000000", "PJSIP/101@5172-100") in new stack
    -- Called PJSIP/101@5172-100
[Nov 12 16:15:37] WARNING[2178][C-00000001]: channel.c:1079 channel_indicate: [Dongle/tan-0100000000] Don't know how to indicate condition 22
    -- PJSIP/5172-100-00000000 is ringing
    -- PJSIP/5172-100-00000000 is ringing
       > 0xa3e470 -- Strict RTP learning after remote address set to: 195.122.19.14:17104
    -- PJSIP/5172-100-00000000 answered Dongle/tan-0100000000
    -- Channel PJSIP/5172-100-00000000 joined 'simple_bridge' basic-bridge <9e373e9b-5b1f-44bc-9259-bbd9fdf59a8d>
    -- Channel Dongle/tan-0100000000 joined 'simple_bridge' basic-bridge <9e373e9b-5b1f-44bc-9259-bbd9fdf59a8d>
    -- Channel PJSIP/5172-100-00000000 left 'simple_bridge' basic-bridge <9e373e9b-5b1f-44bc-9259-bbd9fdf59a8d>
    -- Channel Dongle/tan-0100000000 left 'simple_bridge' basic-bridge <9e373e9b-5b1f-44bc-9259-bbd9fdf59a8d>
  == Spawn extension (dongle, +1234567890, 2) exited non-zero on 'Dongle/tan-0100000000'

Re: Asterisk + chan_dongle + RTP

Добавлено: 08 янв 2025, 19:42
sir_FreeFrag
Влетел ровно в этот же самый баг. Все как у топикстартера.

Кто-нибудь за 4 года смог найти решение?

Re: Asterisk + chan_dongle + RTP

Добавлено: 09 янв 2025, 04:44
ded
> 0xcf9a60 -- Strict RTP learning after remote address set to: 192.168.100.29:10000
Удалённый адрес не может быть 192.168.100.29, это внутренний адрес. Стало быть проблема прохождения NAT на удалённом узле. Сигнализация при INVITE должна получить внешний, публичный адрес и порт, кудв слать RTP.

Re: Asterisk + chan_dongle + RTP

Добавлено: 09 янв 2025, 21:34
sir_FreeFrag
В общем, сам спросил, сам отвечаю.

Это какой-то древний баг не то в chan_dongle, не то в PJSip. Способ обхода (workaround) вот такой:

Код: Выделить всё

Dial(PJSIP/someclient,60,A(silence))
Где "silence" -- коротенький звуковой файл с тишиной, например длительностью в 0.1 секунды.

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

Забавно, но факт. Вышеописанным способом срабатывает. Если убрать "A(silence)", то RTP не проходит. Причем судя по снифферу, Asterisk даже не пытается ничего никуда отправлять.

Re: Asterisk + chan_dongle + RTP

Добавлено: 10 янв 2025, 08:23
ded
Интересное явление. Никогда не сталкивались, хотя сами используем донглы в разных локациях около 15 лет, видимо потому, что не используем chan_pjsip.so
При Dial(SIP/123,,tT) таких трюков не нужно.

Re: Asterisk + chan_dongle + RTP

Добавлено: 10 янв 2025, 15:08
Zavr2008
Аналогичное и в OsmoBSC!!!
Спасибо за идею про A(silence), 2 месяца мучался!!!