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

Заводим GSMмодем

Добавлено: 09 мар 2015, 14:34
RomA
Введение:
Появилась необходимость иметь второй номер, но телефон у меня на одну сим-карту. И тут на глаза попался старый usb модем, который валялся без дела и в котором, о совпадение, был разъём под симку))

Дано:
Сервер на FreeBSD 10.1
Asterisk 11
GSM-modem Huawei 303s-2

Задача:
Настроить звонки с симки на рабочий номер и обратно

Решение:
Как на странно информации об этом деле не много - по сути есть только один модуль и его форк. Ну да ладно - asterisk у меня уже стоит и работает - надо поставить по сути драйвер для модема.

Создаём директорию в которой будем работать и переходим туда

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

# mkdir /usr/local/install
# cd /usr/local/install
Копируем сюда исходники модуля для asterisk 11

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

# git clone https://github.com/jstasiak/asterisk-chan-dongle.git
Cloning into 'asterisk-chan-dongle'...
remote: Counting objects: 279, done.
remote: Total 279 (delta 0), reused 0 (delta 0), pack-reused 279
Receiving objects: 100% (279/279), 202.97 KiB | 131.00 KiB/s, done.
Resolving deltas: 100% (156/156), done.
Checking connectivity... done.
Переходим в директорию и собираем модуль

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

# cd asterisk-chan-dongle

Начну с самого главного - у меня система FreeBSD 10.1 обновленная с 9 версии - и сколько я не компилировал модуль chan-dongle - он не хотел работать - писал вот такое безобразие

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

voip*CLI> module load chan_dongle.so
Unable to load module chan_dongle.so
Command 'module load chan_dongle.so' failed.
Тогда я решил посмотреть что же не так - в файл /usr/local/etc/asterisk/modules.conf добавил в секцию [modules] загрузку модуля при старте

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

preload => chan_dongle.so
после чего запустил астериск в режиме отладки - и в первых же строках увидел проблему

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

voip# asterisk -v
... вырезано ...
Error loading module 'chan_dongle.so': /usr/local/lib/asterisk/modules/chan_dongle.so: Undefined symbol "libiconv"
Module 'chan_dongle.so' could not be loaded.
Так вот оно что. не долго думая удаляю библиотеку

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

voip# cd /usr/ports/converters/libiconv
voip# make deinstall
и пересобираю модуль

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

voip# aclocal
aclocal-1.15: warning: autoconf input should be named 'configure.ac', not 'configure.in'
voip# autoconf
voip# automake -a
automake-1.15: warning: autoconf input should be named 'configure.ac', not 'configure.in'
configure.in:50: installing './compile'
configure.in:6: installing './config.guess'
configure.in:6: installing './config.sub'
configure.in:7: installing './install-sh'
configure.in:7: installing './missing'
automake-1.15: error: no 'Makefile.am' found for any configure output
voip# ./configure CC=gcc47
... Пропущено ...
voip# gmake
... Пропущено ...
voip# cp chan_dongle.so /usr/local/lib/asterisk/modules
voip# cp etc/dongle.conf /usr/local/etc/asterisk/

Тут следует сделать некое лирическое отступление - дело в том, что просто так модуль не соберётся - ему нужен компилятор gcc, который не идёт в FreeBSD 10 по умолчанию, а для того, что бы asterisk не вылетал - его тоже необходимо собрать этим же компилятором. Для всего этого необходимо установить компилятор

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

# cd /usr/ports/lang/gcc47
# make install clean
и прописать библиотеки в файл /etc/libmap.conf

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

libgcc_s.so.1   gcc47/libgcc_s.so.1
libgomp.so.1    gcc47/libgomp.so.1
libobjc.so.3    gcc47/libobjc.so.4
libssp.so.0     gcc47/libssp.so.0
libstdc++.so.6  gcc47/libstdc++.so.6
Теперь надо сделать так, что бы программы собирались нашим, а не стандартным компилятором, бля чего правим файл /etc/make.conf

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

.if !empty(.CURDIR:M/usr/ports/*) && exists(/usr/local/bin/gcc47)
CC=gcc47
CXX=g++47
CPP=cpp47
.endif
Теперь все программы из портов будут собираться нашим компилятором, ну а что бы им же собрался наш модуль - мы выше указали опцию, при конфигурировании
[/color][/i]

После чего перезапускаю asterisk и убеждаюсь что модуль подгрузился

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

voip# asterisk -v
... Пропущено ...
chan_dongle.so => (Huawei 3G Dongle Channel Driver)
В самом asterisk это выглядит так

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

voip*CLI> dongle show version

chan_dongle: Huawei 3G Dongle Channel Driver, Version 1.1, Revision 34
Project Home: http://code.google.com/p/asterisk-chan-dongle
Bug Reporting: http://code.google.com/p/asterisk-chan-dongle/issues/list
А так же можно посмотреть, увиделся ли модем

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

voip*CLI> dongle show devices
ID           Group State      RSSI Mode Submode Provider Name  Model      Firmware          IMEI             IMSI             Number        
dongle0      0     Not connec 0    0    0       NONE                                                                          Unknown      
нет модема ))) Пошли настраивать конфиги )))
Но сначала надо поправить исходники ядра, ибо моего 303 в конфигах нет
правим /sys/dev/usb/serial/u3g.c - находим там хуавеи и втискиваем туда рядом с похожим 173

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

	U3G_DEV(HUAWEI, E303, 0),
	U3G_DEV(HUAWEI, E303_INIT, U3GINIT_HUAWEISCSI),
затем файл /sys/dev/usb/usbdevs где так же рядом с 173 вписываем

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

product HUAWEI E303_INIT	0x14fe	3G modem initial
product HUAWEI E303		0x1506	3G modem
После через пересобираем мир с ядром и загружаемся с новыми данными.
Глянем как у нас определился модем при загрузке системы - ищем следующий вывод

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

voip# dmesg -a
Mar  9 17:58:51 voip kernel: ugen1.2: <HUAWEI> at usbus1
Теперь подгрузим модуль ядра для работы с модемом

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

voip# kldload u3g
Mar  9 18:02:56 voip kernel: u3g0: <HUAWEI HUAWEI Mobile, class 0/0, rev 2.00/1.02, addr 2> on usbus1
Mar  9 18:02:56 voip kernel: u3g0: Found 2 ports.
Посмотрим что у нас создалось

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

voip# ls -lah /dev/cuaU*
crw-rw----  1 uucp  dialer   0x77 Mar  9 18:02 /dev/cuaU0.0
crw-rw----  1 uucp  dialer   0x78 Mar  9 18:02 /dev/cuaU0.0.init
crw-rw----  1 uucp  dialer   0x79 Mar  9 18:02 /dev/cuaU0.0.lock
crw-rw----  1 uucp  dialer   0x7d Mar  9 18:02 /dev/cuaU0.1
crw-rw----  1 uucp  dialer   0x7e Mar  9 18:02 /dev/cuaU0.1.init
crw-rw----  1 uucp  dialer   0x7f Mar  9 18:02 /dev/cuaU0.1.lock
Видим что порты принадлежат далеко не тому пользователю, от которого работает asterisk - исправляем это дело и проверяем что у нас получилось

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

voip# pw groupmod uucp -m asterisk
voip# pw groupmod dialer -m asterisk
voip# pw groupshow dialer
dialer:*:68:asterisk
Теперь впишем эти порты в конфиг /usr/local/etc/asterisk/dongle.conf - а его сюда надо взять и положить из дистрибутива модуля

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

[dongle0]
audio=/dev/cuaU0.0
data=/dev/cuaU0.1 
Перезагружаем asterisk и смотрим что у нас получилось

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

voip*CLI> dongle show devices
ID           Group State      RSSI Mode Submode Provider Name  Model      Firmware          IMEI             IMSI             Number        
dongle0      0     Free       13   5    4       Beeline        E303       21.158.13.00.864  805014016241082  250961911801313  Unknown       

Отлично - модем увиден и опознан

Литература:
http://lists.freebsd.org/pipermail/free ... 52792.html
https://www.mail-archive.com/freebsd@ua ... 08108.html
http://unix.stackexchange.com/questions ... on-freebsd
http://oioki.ru/2012/11/nastroyka-huawe ... -asterisk/
https://github.com/superles/chan-dongle-asterisk12
http://www.ra1aie.ru/?p=1215
https://communities.vmware.com/message/2318102