[copy-past] Роутер + GPRS модем = mini VoIP АТС или GSM шлюз своими руками


На днях появилась необходимость поднять в удаленном, маленьком, офисе телефонию.
Стабильного канала Интернет, как и в большинстве удаленных регионов, в городке не нашлось, по этому задача свелась к созданию бюджетной АТС с локальным GSM каналом + VoIP связь с центральной (корпоративной) АТС.

Описание решения

 

Система состоит:

1. Роутер — DLink DIR-320. Конечно можно было посмотреть на более производительные (например ASUS RT-N16, 400Мгц против 200Мгц), но задача собрать бюджетное рещение (4500р. Asus против 1500 Dlink).
2. GPRS модем — Huawei E1550, этот выбор обаснован техническими особенностями, причины будут ясны по мере прочтения статьи.
3. USB Hub 7 портов — StLab, можно любой другой, главное — внешнее питание.
4. MicroSD Flash на 1ГБ — любая (объем тоже может быть большим).

Предстоящие задачи:

1. Прошиваем роутер «альтернативной» прошивкой.
2. Подготовка GPRS модема.
3. Монтируем MicroSD карту для устанавливаемого на роутер ПО.
4. Установка и настройка на роутер IP-PBX Asterisk.

Прошиваем роутер «альтернативной» прошивкой

Этот пункт наверное очень «замылен», и тем неменее крадко приведу последовательность действий.
Саму прошивку можно взять отсюда, ее особенностью является ядро верси 2.6, т.к. 2.4 не поддерживает тайминги процессора, что очень необходимо как астериску так и его модулю chan_datacard (с помощью которого мы и будем использовать GSM модем как канал).
В связи с ограничениями Flash выбранного роутера из прошивки исключены Samba, FTP, SSH, что без труда можно доустановить потом.
Прошивку скачали, осталось прошить. Предпологается что в руках DIR-320 «из коробки».
В корне системного диска на ПК (для удобства) создадим каталог «bin», в него помещаем прошивку и переименовываем ее в firmware.bin.
Там-же (в каталоге bin), создаем скрипт flashing.bat со следующим содержимым:
@Echo Off
:BEGIN
ping -n 1 -w 1 192.168.0.1
If errorlevel 1 Goto BEGIN
If errorlevel 0 Goto FLASH
Goto END

:FLASH
Echo *** Start Flashing ****
tftp -i 192.168.0.1 put c:\bin\firmware.bin

:END

В строке «c:\bin\firmware.bin» букву диска меняем на свою.
Устанавливаем настройки сетевой карты (к которой подключен роутер):
IP адрес — 192.168.0.2
Маска подсети — 255.255.255.0
При выключенном питании роутера нажимаем и удерживаем кнопку Reset (задняя панель роутера), включаем питание.
Как только на роутере загорится индикатор LAN порта отпускаем кнопку Reset и запускаем скрипт flashing.bat.
Прошивка займет 1-2 минуты, как только загорится индикатор статуса — сбрасываем настройки роутера, нажатием с удержанием кнопки Reset пока не заморгает индикатор статуса.
Настройки сетевой карты возращаем на «получать автоматически».
IP адрес роутера — 192.168.1.1, логин от WEB интерфейса управления — admin/admin.

Кратко необходимые настройки роутера:
1. Change Name — для удобства можно сменить на root.
2. Change Password — меняем на свой.
3. Убеждаемся что telnet разрешен.
4. Примеряем настройки и перезагружаем роутер.

Подготовка GPRS модема

В своем «нормальном» состоянии модем E1550 виден ОС как составное USB устройство.
Роутеру мешает наличие эмуляции модемом CDRom с ПО, вот ее то (эмуляцию) мы и отключим, а заодно и привязку к симкарте оператора снимем.

1. Нам потребуется dc-unloker для ввода команд и отображения состояния устройства, скачать его можно здесь.
Качаем, устанавливаем.
2. Подключаем GSM модем с MicroSD картой к ПК, дожидаемся установки драйверов и обнаружения уствройства.
3. Запускаем dc-unloker и нажимаем «Поиск».
4. Как только устройство будет найдено увидим краткое его описание, с перечислением IMEI, версии ПО и прочее. Копируем IMEI в буфер.
5. Идем на страницу OnLine генератора кодов разблокировки.
6. Вставляем IMEI и заполняем капчу. В резултате получаем 2 кода Unlock и Flash (код для перепрошивки устройства). Нам нужен Unlock, копируем в буфер.
7. В dc-unloker необходимо выполнить 2 команды, в текстовом окне:
AT^U2DIAG=256 (девайс в режиме модем + Card Reader)
AT^CARDLOCK="<Unlock код из буфера>"

Модем отвязан от опеторских SIM и не эмулирует CDRom.

Монтируем MicroSD карту для устанавливаемого на роутер ПО

1. Используемое ПО:
Putty
WinCP
2. Подключаем модем к роутеру. Включаем питание роутера.
3. Используя протокол Telnet в Putty подключаемся к роутеру IP 192.168.1.1, логин/пароль admin/admin.
4. Используя утилиту fdisk удаляем существующие разделы с карты, MicroSD будет видна как /dev/sda.
Выполняем команды:
fdisk /dev/sda
Command (m for help): p

Если разделы есть, последовательно удаляем их:
Command (m for help): d
Если разделов нет либо удалили на предыдущем этапе:
Command (m for help): n
p
1
далее везде по умолчанию (просто Enter)
Command (m for help): w

5. Созданный раздел отформатируем:
mke2fs -j /dev/discs/disca/part1
6. Смонтируем раздел в каталог /opt
mount /dev/discs/disca/part1 /opt
7. Следующие команды позовлят в дальнейшем использовать ipkg для установки пакетов из репозитория:
mkdir -p /opt/tmp/ipkg
ipkg.sh update
ipkg.sh install ipkg-opt
ipkg update

8. Установим необходимый (либо просто удобный) софт из репозитория:
ipkg install mc (файловый менеджер)
ipkg install nano (текстовый редактор)
ipkg install opnenssh (SSH сервер и SFTP)
ipkg install asterisk16 (IP АТС астериск)

9. Настроим автомонтирование MicroSD карты и автозапуск OpenSSH сервера и Asterisk:
в каталоге /etc создаем файл fstab, наприемр так:
touch /etc/fstab
открываем (nano /etc/fstab) и пишем в него:
#!/bin/sh
/dev/discs/disca/part1 /opt ext3 rw,noatime 1 1

в каталоге /tmp/local/ создаем файл .files:
touch /tmp/local/.files
записываем в него:
/etc/fstab
в каталоге /tmp/local/ создаем каталог sbin и в нем следующие файлы
mkdir /tmp/local/sbin
touch /tmp/local/sbin/pre-mount (скрипт вызывающийся перед монтированием)
touch /tmp/local/sbin/post-mount (скрипт вызывающийся после монтирования)
touch /tmp/local/sbin/pre-shutdown (скрипт вызывающийся перед выключении/перезагрузке)

в файл pre-mount записываем:
#!/bin/sh
e2fsck -f -y -v /dev/discs/disca/part1 (проверка файловой системы перед монтированием)

в файл post-mount записываем:
#!/bin/sh
/opt/etc/init.d/S40sshd (запуск OpenSSH демона)
/opt/sbin/asterisk (запуск astrisk)

в файл pre-shutdown записываем:
#!/bin/sh
/bin/umount /opt (отмонтировать каталог /opt)

назначаем на созданные скрипты права на исполнение:
cd /tmp/local/sbin
chmod +x /usr/local/sbin/*

сохраняем все изменения в энергонезависимой памяти:
flashfs save
flashfs commit
flashfs enable

перезагружаем роутер:
reboot
После загрузки, если все было выполнено верно, к роутеру можно подключится по SSH и SFTP.

Установка и настройка на роутер IP-PBX Asterisk

Установку Астериск мы выполнили на предыдущем шаге, осталось настроить его.
Для начала скачиваем архив с модулем chan_datacard отсюда (можете собрать сомостоятельно его, но описывать весь процесс сборки не хочу, по этому выкладываю).
Файл chan_datacard.so копируем в каталог /opt/lib/asterisk/modules/
Файл datacard.conf копируем в каталог /opt/etc/astrisk/
В конфиге /opt/etc/astrisk/modules.conf пишем (оригинал желательно сохранить в другое место):
[modules]
autoload=no
load => format_pcm.so
load => codec_ulaw.so
load => codec_alaw.so
load => app_dial.so
load => app_macro.so
load => app_playback.so
load => app_setcallerid.so
load => app_disa.so
load => app_transfer.so
load => func_timeout.so
load => func_callerid.so
load => func_logic.so
load => func_strings.so
load => pbx_config.so
load => pbx_spool.so
load => chan_sip.so
load => res_musiconhold.so
load => func_shell.so
load => func_channel.so
load => chan_datacard.so
load => chan_oss.so

В конфиге /opt/etc/asterisk/datacard.conf пишем (обратите внимание, в данном конфиге подключено 2 модема):
[datacard0]
context=datacard-incoming ; context for incoming calls
audio=/dev/ttyUSB1 ; tty port for audio connection
data=/dev/ttyUSB2 ; tty port for AT commands
resetdatacard=yes ; reset datacard during initialization
disablesms=yes
rxgain=3 ; increase the incoming volume
txgain=3 ; increase the outgoint volume
group=1 ; calling group

[datacard1]
context=datacard-incoming ; context for incoming calls
audio=/dev/ttyUSB4 ; tty port for audio connection
data=/dev/ttyUSB5 ; tty port for AT commands
resetdatacard=yes ; reset datacard during initialization
disablesms=yes
rxgain=3 ; increase the incoming volume
txgain=3 ; increase the outgoint volume
group=1 ; calling group

В конфиге /opt/etc/asterisk/sip.conf пишем (оригинал желательно сохранить в другое место):
[general]
context=from-pstn-unauth
allowoverlap=yes
allowguest=yes
alwaysauthreject=yes
bindport=5060
bindaddr=0.0.0.0
srvlookup=no
nat=yes
canreinvite=no
insecure=invite
tos_sip=cs3
tos_audio=ef
tos_video=af41
disallow=all
allow=ulaw
allow=alaw

[101]
type=friend
defaultuser=101
secret=test
host=dynamic
context=test
disallow=all
allow=alaw
allow=ulaw

В конфиге /opt/etc/asterisk/extensions.conf пишем (оригинал желательно сохранить в другое место):
[general]
static=yes
writeprotect=no
autofallthrough=no
clearglobalvars=no
priorityjumping=yes

[globals]

[test]
exten => _8XX.,1,Dial(Datacard/g1/${EXTEN})
exten => _8XX.,n,Hangup()

[datacard-incoming]
exten => _.,1,Dial(SIP/101)
exten => _.,n,Hangup()

Убеждаемся что симкарты используемые в модеме не требуют PIN (в противном случае отключаем).
Перезегружаем роутер.
Подключаемся SIP клиентом к серверу с учеткой 101@192.168.1.1 и паролем test.
Входящие вызовы будут поступать на этот внутренний номер.
Исходящие вызовы будут посылаться через GSM модемы.
PS: настройки астериска приведены исключительно в позновательных целях, для построения демонстрационного стенда, для использования в боевом режиме рекомендую изучить документацию по Asterisk.

Рабочий вариант с одним модемом на базе Tp-link MR3420:

gsm 2 sip gateway asterisk 11 chan_dongle chan_cdma