Новое время - новые вызовы

В этой части я расскажу как скрестить Asterisk с новым поколением модемов диапазона LTE. В чем там особенность и что нужно учитывать.

Предыдущие статьи по теме:

Выбор подходящих модемов

Несмотря на то, что LTE модемов много, часть из них не поддерживает голос (и тут нет ничего нового, так было и во времена "старого GSM"), а еще значительная часть - не имеет соответствующих модулей для Asterisk.

Наиболее свежим можно считать Проект IchthysMaranatha, за что ему огромное человеческое спасибо. И несмотря на то, что заявлена поддержка нескольких модемов и чипов, наилучшие результаты достигаются с чипом Quectel EC25.

У чипа есть несколько вариантов как по диапозонам, так и по формату платы, на которой он напаян (и интерфейсов), но все это не так важно - главное подберите под свой регион. У меня заработал EC25G-E в формате USB свистка (а ниже будет рекомендация что лучше чем это).

no-name Quectel EC25G-E (антенны не показаны)
no-name Quectel EC25G-E (антенны не показаны)

Что нужно учитывать с LTE модемами

Все современные модемы - очень энергоемкие. Сразу все предупреждают что они потребляют 2.1A и что мощности "обычного" порта USB не хватит для их работы. Особенно это актуально для Raspberry Pi, где порт не дает больше 1.2А, да и то, если блок питания позволяет и другие потребители не кушают лишнего. В своем проекте я использовал другую плату, но даже там больше 1го модема система не тянула с блоком питания Apple 65W.

Второй момент - размер. Эти модемы значительно больше Е1550 и в соседние порты не войдут. Ни по вертикали, ни по горизонтали. Т.е. нужны или пигтейлы или внешний USB3 хаб (можно и на USB2, но они любят 3й, по крайней мере у меня, уж не знаю почему), у которого есть минимум 3 порта. Тогда можно вставить 2 модеме через 1 порт и все поместится. И да - хаб должен быть с внешним питанием.

Как я решал проблему питания

Так как у меня плата позволяет прокачать один модем, я взял внешний хаб D-Link DUB-1340, у которого заявлены те самые 2.5A на один порт. в него можно воткнуть 2 модема с внешними антеннами, или 3 в конфигурации "2 с антеннами + 1 без".

Предварительные настройки

Мы настроим GNSS и узнаем IMEI модема.

Важной особенностью чипсета Quectel EC25 является наличие GPS и WiFI. И если второй не особо страшен, то первый передает данные по ttyUSB как раз по каналу, по которому же идет и звук. Исправим.

Найдем устройства, которые создал наш модем, скажем ttyUSB6..9. Скорее всего ttyUSB9 будет для управления. Попробуем подключиться screen /dev/ttyUSB9 и послать комманду AT. Если ответ ОК - мы на нужном устройстве. Если ответа нет, пробуем другое до досижения успеха.

Собственно отключим вывод GNSS на ttyUSB.

Как только мы нашли устройство управления - пошлем следующую комманду:

AT+QGPSCFG=?

ответ должен быть:

+QGPSCFG: "outport",("none","usbnmea","uartdebug")

Отключим вывод данных GNSS в канал USB-Audio (я не использую эту опцию вообще, как оно поведет себя с uartdebug не готов сказать):

AT+QGPSCFG="outport"

ответом будет:

+QGPSCFG: "outport",none

Все, теперь нам никто не мешает слушать звук через ttyUSB устройство.

Смешно то, что модуль и сам Asterisk не будут ругаться на звуковое устройство, если в модеме не отключен вывод GNSS данных - просто звонок будет "виснуть", никто никого не будет слышать, а при сбросе вызова в клиенте, модем будет продолжать находиться в статусе Dial и поможет только ресет из консоли Asterisk.

Выясним IMEI модема, чтоб потом его использовать при описании в модуле Asterisk:

AT+CGSN

Ответом будет строка цифр - она нам нужна, запишем в файлик рядом с именем ttyUSB управления.

Для тех, у кго LTE DATA (PDP) не подхватилось само

Проверим состояние

Проверим что у нас есть SIM, что она зарегистрировалась в сети и что оператор - верный.
AT+CPIN?
AT+CGREG?
AT+COPS?


И есть ли у нас адрес
AT+CGPADDR?

Если последнее вернет адреса, а не нули - идите сразу к проверке соединения ниже. Если нули - продолжаем!

Проверим настройки PDP Context aka APN

Что у нас есть в модеме
AT+CGACT?

И создадим свой, если ничего нет или не работает
AT+CGDCONT=4,"IPV4V6","my.apn","0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0",0,0,0,1

Проверим какой PDP Context активен (активное APN)
AT+CGACT?

Активируем профиль
AT+CGACT=4,1

И отключим активные до этого (все, у которых второй знак 1, кроме нашего нового 4го профиля)
AT+CFACT=0,1

Проверка передачи данных

Проверим, что передача данных активна
AT+CGDATA?

И если нет - активируем ее
AT+CGDATA="PPP",4

Снова проверим адрес
AT+CGPADDR?

Проверим, есть ли соединение
AT+QPING=4,"8.8.8.8"

Проверим, в каком состоянии у нас звонок и есть ли при этом данные

Выполним вызов на другой номер
ATD81231234567

Пока вызов идет, можем выполнить проверку состояния сети
AT+CLCC
Ответ должен быть примерно таким:
+CLCC: 1,1,0,1,0,"",128
видите в 4й позиции стоит 1. Это нам намекает, что модем в режиме DATA, т.е. вызов ушел через VoLTE. По крайней мере так указано в официальной документации на чипсет EC25G.

Можно класть трубку и идти пить.... что-то.
ATH или AT+CHUP

Несколько слов о VoLTE и звонков через IP в современных сетях

И так, у нас есть современный модем. В LTE сетях, то, что у вас в телефоне включается крыжиком "Enable Calls over LTE (VoLTE)" входит в т.н. IMS (IP Multimedia Subsystem) - целую группу сервисов, которые доступны через IP сеть на современных терминалах. Подробнее можно посмотреть тут или в файле Quectel_EC2xEG9xEG2x-GEM05_Series_IMS_Application_Note из комплекта документации к чипсету Quectel.

Таким образом, нужно убедиться, что IMS на модеме активирована, и что произошло подключение к соответсвующему профилю, а так же активация VoLTE.

MBN профили и их подбор

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

Мы пойдем другим путем - попробуем воспользоваться тем, что нам отсыпали.
AT+QMBNCFG="List"

Команда выведет списко профилей, которые есть в чипсете:
+QMBNCFG: "List",0,0,0,"ROW_Generic_3GPP",0x05040820,202009031
+QMBNCFG: "List",1,0,0,"VoLTE-ATT",0x0501033C,202004261
+QMBNCFG: "List",2,1,1,"hVoLTE-Verizon",0x05010141,202011021
+QMBNCFG: "List",3,0,0,"Sprint-VoLTE",0x05010205,202010201
+QMBNCFG: "List",4,0,0,"Commercial-TMO_VoLTE",0x05010505,201811231
+QMBNCFG: "List",5,0,0,"Telus-Commercial_DO",0x05800C60,202009101
+QMBNCFG: "List",6,0,0,"Commercial-SBM",0x05011C18,202004211
+QMBNCFG: "List",7,0,0,"Commercial-DT",0x05011F1C,202006281
+QMBNCFG: "List",8,0,0,"Reliance_OpnMkt",0x05011B38,202003251
+QMBNCFG: "List",9,0,0,"TF_Germany_VoLTE",0x05010C1B,202004151
+QMBNCFG: "List",10,0,0,"TF_Spain_VoLTE",0x05010CFA,201909261
+QMBNCFG: "List",11,0,0,"Volte_OpenMkt-Commercial-CMCC",0x05012071,202004161
+QMBNCFG: "List",12,0,0,"OpenMkt-Commercial-CT",0x05011322,202001171
+QMBNCFG: "List",13,0,0,"OpenMkt-Commercial-CU",0x05011505,202001171
+QMBNCFG: "List",14,0,0,"Telstra-Commercial_VoLTE",0x0580079E,202009211
+QMBNCFG: "List",15,0,0,"Commercial-KDDI",0x0501071D,202004041
+QMBNCFG: "List",16,0,0,"Commercial-SKT",0x05012715,202007071
+QMBNCFG: "List",17,0,0,"Commercial-KT",0x05012C0D,202007211
+QMBNCFG: "List",18,0,0,"Commercial-LGU",0x05012626,202007071
+QMBNCFG: "List",19,0,0,"Commercial-USCC",0x05040D20,202011091

Нас интересует 3й бит, который должен стоять в позиции 1 - это активный профиль.
+QMBNCFG: "List",2,1,1,"hVoLTE-Verizon",0x05010141,202011021

Скорее всего, у вас будет активен ROW_Generic_3GPP и это ок. Запомнили, двигаемся дальше.

Проверка статуса IMS и его активация при необходимости

Выясним, актина ли у нас регистрация в IMS
AT+QCFG="ims"

Ответ будет в виде
+QCFG: "ims",1,0
Т.е. по второму биту (значение 1) видим что регистрация есть, а по последнему биту видим (значение 0), что VoLTE нам не активировали.

Танцы по включению VoLTE

Выполним предварительные пляски - откажемся от автовыбора профиля и отключим текущий
AT+QMBNCFG="AutoSel",0
AT+QMBNCFG="Deactivate"

Возьмем любой профиль на выбор из результатов AT+QMBNCFG="List"и активируем его
AT+QMBNCFG="Select","Sprint-VoLTE"

И для применения всех настроек, перезагрузим модем
AT+CFUN=1,1

Удача или нет, и что делать если мы не вкинулись

После перезагрузки модема, снова выполняем запрос статуса IMS
AT+QCFG="ims"

Если ответ будет в виде +QCFG: "ims",1,1 можно радоваться, и продолжать.
Если ответ будет в виде +QCFG: "ims",1,0 нам не повезло, возвращаемся к выбору профиля из доступного списка (AT+QMBNCFG="Select","MBN_name") до достижения результата.

А если я все сделал, но +QCFG: "ims",1,0 и никак?

Единственное, что я могу представить - запросить профили у продавца или пообщаться на профильных форумах. Вдруг кто-то имеет подходящий лично вам профиль...

Конфигурируем Asterisk

Ставим chan-quectel из ссылки. Там все описано подробно, не будут копировать.

Последним пунктом инструкции идет копирование конфигурационного файла quectel.conf в папку с Asterisk. После его выполнения нужно сделать следующее:

  • Настроить загрузку модуля в modules.conf не забыв заблокировать chan_dongle как лишний (если вы все модемы GSM убрали)
    ;load = chan_dongle.so
    load = chan_quectel.so

  • Настроить параметры в quectel.conf
    context=incoming - вставить нужное вам согласно dialplan
    imei=816068516637705 - вставить IMEI вашего модема, которую мы получили раньше
    ;audio= и ;data= - закомментируем эти 2 параметра, так как по моей просьбе разработчик добавил фичу автопоиска устройств упарвления и звука в модуль.
    rxgain=2 и txgain=-1 - конкретно у меня эти параметры такие. Можно начать с значений по умолчанию, но не забываем что иногда это помогает решить разные эффекты бочке и эхо.

  • Модифицируем dialplan в extensions.conf
    Так как я говорю про свою систему, я ссылаюсь на свой файл из предыдущих статей.

    • было достаточно провести элементарные :%s/dongle0/quectel0/g для всех моих устройств;

    • было достаточно провести элементарные :%s/Dongle\/dongle0/Quectel\/quectel0/g для всех моих устройств.

    • было достаточно провести элементарные :%s/DONGLENAME/QUECTELNAME/g для всех моих устройств.

Далее простое в консоли Asterisk:

module unload cahn_dongle
module load cahn_quectel
dialplan reload

По идее это должно быть все. Можно работать с модулем chan_quectel как и с chan_dongle заменяя команды на quectel. Учитывайте, что LTE модемы регистрируются в сети чуть дольше, чем обычные GSM и более чувствительны к качеству и уровню сигнала.

Пара замечаний, как быть с питанием, или что можно сделать иначе

Как уже писал выше, питание это боль. Решать это можно двумя способами:

А. Пигтейлы и внешние адаптеры питания

Можно взять вот такую пару на 3А и замутить связку.

no-name адаптеры, которые, иногда, работают
no-name адаптеры, которые, иногда, работают
USB3 пигтейл с доп-питанием
USB3 пигтейл с доп-питанием

Преимущество в том, что у нас точно можно использовать рядом стоящие порты, но придется подтягивать удлиннитель-разветвитель 220V, а еще адаптеры умеют греться (как и модемы). Короче такой себе колхоз. С другой стороны, можно разобрать адаптеры, наклеить их на плекс или что-то подобное, сделать электроразводку и вывести одним шнуром питания... такие себе очумелые ручки.

Б. Готовые платы с питанием для чипа и USB интерфейсом

На рынке есть готовые платы с доп-питанием и модемом. Я не пробовал, так как поздно про них узнал, но видел потом их в количестве. Так же решается вопрос с близкорасположенными портами, внешним питанием и аккуратностью всей конструкции. Единственное, что придется докупать нужные антенны и как-то все это размещать и закреплять, чтоб не развалилось.

all-in-one плата с модемом, питанием и USB
all-in-one плата с модемом, питанием и USB

И совсем на закуску

Есть одна проблема, которай я не коснулся - множетсвенность ttyUSB устройств. Это актуально когда а) несколько модемов одного производителя и б) когда несколько устройств, генерирующих ttyUSB.
Я обошел ее стороной по причине наличия автопоиска в модуле chan_quectel. Если бы не он, то как найти верное устройство? А как убедиться, что устройтво инициализировалось так же как в прошлый рез? Ведь ttyUSBx может съехать и все перепутается!

Можно, казалось бы, воспользоваться udev... но не всегда. Мои конкретные железки приехали от наших восточных друзей и у них...

idVendor 0x1d6b Linux Foundation
idProduct 0x0003 3.0 root hub
iProduct 2 xHCI Host Controller
iSerial 1 xhci-hcd.0.auto
idVendor 0x2c7c Quectel Wireless Solutions Co., Ltd.
idProduct 0x0125 EC25 LTE modem
iProduct 2 EG25-G
iSerial 0

Да-да, iSerial 0 ... и фильтруй как хочешь.
Т.е. SUBSYSTEM=="tty", ACTION=="add|change", ATTRS{idVendor}=="2c7c", ATTRS{idProduct}=="0125", KERNELS=="0:1:1.2", SYMLINK+="ttyUSB-quec0" не прокатывает! Даже если указать KERNELS.

Можно пойти другим путем, и в файле quectel.conf указать ссылку в виде полного пути к устройству: audio=/dev/serial/by-path/platform-xhci-hcd.0.auto-usb-0:1.4:1.0-port0

Но, так как у нас есть автопоиск, то достаточно указать просто imei= и радоваться вот таким сообщениям в консоли:
[quectel1] IMEI 816068516637705 found on data_tty=/dev/ttyUSB10 audio_tty=/dev/ttyUSB9

Второй момент связан с Raspbian - клоном Debian для плат Raspberry Pi.
Там, при ручной установке Asterisk из исходников, не создается пользователь, группа и не прописывается разрешение для бинарника.

Т.е. если вы создадите сервис systemd и указате в нем пользователя и группу как asterisk, вас ждут веселые старты с ошибками доступа к куче мест.
Решается это все просто (с правами root):
useradd -c "Asterisk PBX" -d /var/lib/asterisk asterisk &&usermod -a -G dialout,uucp asterisk && find /var -name asterisk -type d -exec chown asterisk:asterisk {} ; && setcap cap_net_bind_service +ep /usr/sbin/asterisk

На закуску, если вам не нужно, можно избавиться и от wwanX интерфейсов модемов.

В файле /etc/modprobe.d/qmi_wwan.conf напишем blacklist qmi_wwan

Обновим initramfs update-initramfs -u

Выгрузим ненужный нам модуль rmmod qmi_wwan

Комментарии (17)


  1. HellKaim Автор
    28.10.2022 18:21

    Пошел смотреть внешние платки, и нашел вот такой интересный проект


  1. toxmost
    28.10.2022 18:49
    +1

    Совсем не понятно, где тут Volte. По поиску в тексте нашел только 2 раза слово - в заголовке и в тегах в подвале. Автор, как так?) Думал и правду volte прикрутили в астер..... Эх....


    1. HellKaim Автор
      28.10.2022 18:50

      видимо созвучно, есть же такое понятие как Voice over LTE = VoLTE. Хабр интерпретирует его иначе. Убрал из тегов.


  1. HellKaim Автор
    28.10.2022 18:51

    Для тех, кто кто не понял - модем сам делает вызов через VoLTE, ему от Asterisk ничего передавать не нужно, если частота и выбор типа вызова "из коробки".


    1. toxmost
      28.10.2022 19:22
      +2

      Volte вызов осуществляется через интернет путем соединения с CORE через интернет\sgw провайдера (хорошо описано здесь https://itechinfo.ru/content/vowifi). Как вы поняли, что при соединении модем использует технологию Volte? Спрашиваю не из праздного интереса: если это так, то можно в малинку воткнуть 1 модем и гонять по нему и интернет и голос одновременно. А это уже совсем другой цимес получается.....


      1. HellKaim Автор
        28.10.2022 23:46

        У меня оно подхватилось сразу. Если у вас вдруг нет, то тогда делаем так:

        Preparation checks that we have sim, registred and are on the required Network.

        AT+CPIN?
        AT+CGREG?
        AT+COPS?

        Check what APN we do have (PDP Context)

        at+cgdcont?

        Set your own APN (change APN.NAME to whatever)

        AT+CGDCONT=3,"IPV4V6","APN.NAME","0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0",0,0,0,1

        check what PDP we are on now

        AT+CGACT?

        Activate our profile

        AT+CGACT=3,1

        Check if we have address

        AT+CGDATA?
        AT+CGPADDR?

        Test connectivity

        AT+QPING=3,"8.8.8.8"


        1. HellKaim Автор
          29.10.2022 00:47

          Ну и для совсем сомневающихся можно еще вывод AT+CLCC посмотреть.
          Нам интересно +CLCC: 1,1,0,1,0,"",128 - видите в 4й позиции стоит 1. Это нам намекает, что модем в режиме DATA. Я сделал просто - послал вызов прямо из терминала и посмотрел статус.


          1. HellKaim Автор
            29.10.2022 01:35

            См вот тут описание VoLTE


      1. HellKaim Автор
        29.10.2022 00:53

        Volte вызов осуществляется через интернет путем соединения с CORE через интернет\sgw провайдера (хорошо описано здесь https://itechinfo.ru/content/vowifi)

        Мне кажется, идет путаница в VoWiFi и VoLTE. Последний работает через сеть оператора, хотя может быть и похож по реализации на VoWiFI. В любом случае, мой провайдер не дает именно VoWiFI , но требует VoLTE c января следующего года. В конце концов, я думаю все будет или ок, или у меня "будет веселая ночка".


  1. HellKaim Автор
    29.10.2022 02:10

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

    Но если вам хочется, ни что не мешает не удалять модуль и получить wwanX интерфейс, настроить его, прописать в требованиях для сервиса Asterisk чтоб поднимался только после настройки wwan и вуаля. Если что-то случится с картой, коначатся деньги или модем повис - вы сами с усами, я предупредил.


  1. Abyss777
    29.10.2022 08:44

    Дополню.
    для VoLTE не достаточно только APN.
    Т.к. рассматриваемый модем Qualcomm то в EFS должен быть профиль вашего оператора (ну или дефолтный должен быть с ним совместим) и проведены другие настройки.

    Кстати VoLTE поддерживает очень качественный кодек EVS, как он со связкой с asterisk ? Происходит транскодирование? Можно ли напрямую отправить?


    1. HellKaim Автор
      29.10.2022 14:52

      Благодарю, быо бы интересно узанть про профиль, так как из описания команд модема в явном виде не ясно о чем речь. Я вижу там 3 профиля с завода, один из которых называется IMS. Разница, кроме протокола IP в сжатиях заголовков, но все работает вне зависимости какой профиль я выбираю.

      Касательно кодеков, вы не можете этим управлять. Есть 2 варианта подключения звука в Asterisk - как усройство потоковой передачи ttyUSB, где звук идет в Asterisk и там перекодируется в нужный нам кодек, и как устройство PCM (оно же цифровая звуковая карта в модеме), где звук приходит на вход звуковой карты хоста и оттуда уже можно принять его в Asterisk через модуль asound (ALSA).

      Я, честно скажу, не увидел смысла в asaund, так как это приводит к усложнению настроек и большему количеству точек отказа. Я использую потоковый звук из ttyUSB.

      Так же, по моим наблюдениям, основная проблема не в когдеках, а в jitter, или, если угодно, качетсву соединения шлюза, основного PBX и клиента.

      P.S. В любом случае я буду благодарен за дополнения.


      1. Abyss777
        29.10.2022 16:08

        Настройка производится не через AT команды, через них только нужно добавить в композицию порта DM (diag mode).

        Дальше настройка происходит через QPST правкой efs и/или QPST PDC Tool настройками профиля.
        Вот отправная точка для поиска информации https://4pda.to/forum/index.php?showtopic=682632

        Есть 2 варианта подключения звука в Asterisk - как устройство потоковой передачи ttyUSB, где звук идет в Asterisk и там перекодируется в нужный нам кодек

        Вот на этом этапе звук в каком формате идёт? Несжатый WAV или как-то закодирован?


        1. HellKaim Автор
          29.10.2022 21:04

          Ну, это не совсем верно. Я дополнил статью - там рассказывается как быть с имеющимися MBN в модеме


        1. HellKaim Автор
          29.10.2022 23:21

          Во всех случаях, звук идет в формате PCM 8KHz, 16bit, Mono
          Или, по крайней мере, так утверждает документация на чипсет модема.

          Из этого, мы делаем вывод, что перекодирование происходит в куче мест: ваш SIP Phone, Asterisk и модем. Скорее всего, как я уже писал - узкое место это сеть. Кодеки вроде a-law или u-law дают вполне сносную речь. Да, это не SILK, но вполне пригодно для разговора.


          1. Abyss777
            30.10.2022 06:00

            Жаль, потому что EVS кодек и его AMR-WB дают совершенно иное качество звука.


            1. HellKaim Автор
              30.10.2022 12:23

              Ну, можно в Asterisk добавить EWS - вот проект... Только не ясно зачем, так как, в 99% случаев SIP телефоны в него не умеют, как и еще целый ряд другого софта. Так же можно почитать документацию на управление звуком в модеме и попробовать там настроить соответсвующее решение.