Новое время — новые вызовы
В этой части я расскажу как скрестить Asterisk с новым поколением модемов диапазона LTE. В чем там особенность и что нужно учитывать.
Предыдущие статьи по теме:
Выбор подходящих модемов
Несмотря на то, что LTE модемов много, часть из них не поддерживает голос (и тут нет ничего нового, так было и во времена «старого GSM»), а еще значительная часть — не имеет соответствующих модулей для Asterisk.
Наиболее свежим можно считать Проект IchthysMaranatha, за что ему огромное человеческое спасибо. И несмотря на то, что заявлена поддержка нескольких модемов и чипов, наилучшие результаты достигаются с чипом Quectel EC25.
У чипа есть несколько вариантов как по диапозонам, так и по формату платы, на которой он напаян (и интерфейсов), но все это не так важно — главное подберите под свой регион. У меня заработал EC25G-E в формате USB свистка (а ниже будет рекомендация что лучше чем это).
Что нужно учитывать с 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 управления.
Конфигурируем Asterisk
Ставим chan-quectel из ссылки. Там все описано подробно, не будут копировать.
Последним пунктом инструкции идет копирование конфигурационного файла quectel.conf в папку с Asterisk. После его выполнения нужно сделать следующее:
-
Настроить загрузку модуля в modules.conf не забыв заблокировать chan_dongle как лишний (если вы все модемы GSM убрали)
;load = chan_dongle.so
load = chan_quectel.so -
Настроить параметры в quectel.conf
context=incoming
— вставить нужное вам согласно dialplanimei=816068516637705
— вставить IMEI вашего модема, которую мы получили раньше;audio= и ;data=
— закомментируем эти 2 параметра, так как по моей просьбе разработчик добавил фичу автопоиска устройств упарвления и звука в модуль.rxgain=2 и txgain=-1
— конкретно у меня эти параметры такие. Можно начать с значений по умолчанию, но не забываем что иногда это помогает решить разные эффекты бочке и эхо. -
Модифицируем dialplan в extensions.conf
Так как я говорю про свою систему, я ссылаюсь на свой файл из предыдущих статей.-
было достаточно провести элементарные
:%s/dongle0/quectel0/g
для всех моих устройств; -
было достаточно провести элементарные
:%s/Dongle\/dongle0/Quectel\/quectel0/g
для всех моих устройств.
-
Далее простое в консоли Asterisk:
module unload cahn_dongle
module load cahn_quectel
dialplan reload
По идее это должно быть все. Можно работать с модулем chan_quectel как и с chan_dongle заменяя команды на quectel. Учитывайте, что LTE модемы регистрируются в сети чуть дольше, чем обычные GSM и более чувствительны к качеству и уровню сигнала.
Пара замечаний, как быть с питанием, или что можно сделать иначе
Как уже писал выше, питание это боль. Решать это можно двумя способами:
А. Пигтейлы и внешние адаптеры питания
Можно взять вот такую пару на 3А и замутить связку.
Преимущество в том, что у нас точно можно использовать рядом стоящие порты, но придется подтягивать удлиннитель-разветвитель 220V, а еще адаптеры умеют греться (как и модемы). Короче такой себе колхоз. С другой стороны, можно разобрать адаптеры, наклеить их на плекс или что-то подобное, сделать электроразводку и вывести одним шнуром питания… такие себе очумелые ручки.
Б. Готовые платы с питанием для чипа и 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
ссылка на оригинал статьи https://habr.com/ru/post/696042/
Добавить комментарий