Делаем VoIP GSM шлюз из Tp-link mr-3020 и Huawei E-171 — часть первая

Сказ о том как взять пару маленьких устройств и получить нечто большее или TP-LINK MR3020 + Huawei E171 = VoIP<->GSM



Только женщина может часа два мило щебетать по телефону, а потом спросить: «А с кем я говорю?» – и выяснить, что человек просто ошибся номером.


На этот сказ меня сподвигли 2 женщины и счет за телефон. Так уж сложилось, что дома практически не работает сотовая связь — или выходить на балкон или использовать домашний dect, точнее он не совсем dect — он dect PSTN + IP, последнее и стало решающим фактором.

Оговорюсь сразу, кто хорошо знаком с openwrt не найдет для себя ничего нового.

Итак роутер TP-Link mr-3020 и донгл Huawei e-171, в принципе подойдет и другой, но для удобства, чтобы не брать в руки паяльник лучше всеж с флешкой на борту.


Первым делом надо разблокировать модем, это уже привычка, думать о том, что может никогда и не понадобится :)
Заострять внимания на этом не буду, мест много, мне понравилось тут

Далее переводим модем в режим Modem + CardReader.
Для этого используем AT команду.
AT^U2DIAG=256

и включим голосовую функцию
AT^CVOICE=0


Отложим пока модем и вернемся к роутеру, на него надо установить openwrt, у кого родная прошивка могут просто прошить из web-интерфейса, у меня была openwrt, поэтому захожу на mr-3020 и переустанавливаю в консоли
cd /tmp/
wget http://downloads.openwrt.org/snapshots/trunk/ar71xx/openwrt-ar71xx-generic-tl-mr3020-v1-squashfs-factory.bin
mtd -r write /tmp/openwrt-ar71xx-generic-tl-mr3020-v1-squashfs-factory.bin firmware

Я специально использовал версию из trunk, т.к. в RC1 присутствует лишний на этом этапе веб интерфейс, но можно использовать и RC1.

После перезагрузки, выставляем основные настройки.

passwd
vi /etc/config/network 


config interface 'lan'
        option ifname 'eth0'
        option type 'bridge'
        option proto 'static'
        option ipaddr '192.168.5.5'
        option netmask '255.255.255.0'
        option gateway '192.168.5.254'
        list dns '8.8.8.8'
        list dns '192.168.5.254'


echo /etc/config/ >> /etc/sysupgrade.conf 
 reboot


Устанавливаем необходимые пакеты, прийдется перенести на microSD rootfs, точнее по терминологии openwrt это будет pivotroot.
opkg install kmod-usb-storage block-mount kmod-fs-ext4 kmod-usb-uhci kmod-usb2 

Если ставили trunk, не RC1, то ещё должно поместиться e2fsprogs и fdisk, тогда можно будет подготовить флэшку прям в роутере, иначе прийдется это делать на сторонней машине.
opkg install e2fsprogs fdisk

Если вы собираетесь использовать swap на флеш, не забудьте проверить наличие swap-utils
Размечаем flash, я здесь не использую swap.
fdisk /dev/sda

создаем раздел, форматируем и клонируем overlay
mkfs.ext4 /dev/sda1
mount /dev/sda1 /mnt/
tar -C /overlay -cvf - . | tar -C /mnt/ -xvf -


Далее приводим /etc/config/fstab к виду:

config mount
        option target   /overlay
        option device   /dev/sda1
        option fstype   ext4
        option options  rw,sync
        option enabled  1
        option enabled_fsck 0



И вот тут началось самое интересное, если делать coldreset т.е. отключать питание, то pivotroot ни в какую не монтируется, после загрузки появляется устройство /dev/sda, а /dev/sda1 нет, либо пока не «потрогать» каким-нибудь образом /dev/sda т.е. не сделать blkid /dev/sda либо head /dev/sda либо mount /dev/sda /mnt, после любого из этих способов, либо после перетыкания донгла, все появляется, но поезд как говорится ушел и уже /overlay смонтирован как и без флеш, места катастрофически не хватает, очень подмывало просто добавить reboot где-нибудь в стартовые скрипты, т.к. если делать hotreset при помощи reboot в консоли, все как по-волшебству работало.

вот пример холодного старта, часть вывода, в которой видно как уходит на jffs2, там где ожидается увидеть pivotroot с ext4

- merge overlay components -

[    7.720000] SCSI subsystem initialized

[    7.900000] usbcore: registered new interface driver usbfs
[    7.900000] usbcore: registered new interface driver hub

[    7.910000] usbcore: registered new device driver usb

[    8.410000] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[    8.420000] ehci-platform ehci-platform: Generic Platform EHCI Controller
[    8.430000] ehci-platform ehci-platform: new USB bus registered, assigned bus number 1

[    8.460000] ehci-platform ehci-platform: irq 3, io mem 0x1b000000
[    8.480000] ehci-platform ehci-platform: USB 2.0 started, EHCI 1.00
[    8.480000] hub 1-0:1.0: USB hub found
[    8.480000] hub 1-0:1.0: 1 port detected
[    8.500000] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
[    8.540000] uhci_hcd: USB Universal Host Controller Interface driver

[    8.600000] Initializing USB Mass Storage driver...
[    8.610000] usbcore: registered new interface driver usb-storage
[    8.610000] USB Mass Storage support registered.

[    8.810000] usb 1-1: new high-speed USB device number 2 using ehci-platform

[    8.970000] scsi0 : usb-storage 1-1:1.3

[    9.970000] scsi 0:0:0:0: Direct-Access     HUAWEI   SD Storage       2.31 PQ: 0 ANSI: 2

[    9.980000] sd 0:0:0:0: [sda] Attached SCSI removable disk

switching to jffs2
- init -

и последствия
root@OpenWrt:~# ls /dev/|grep sda
sda
root@OpenWrt:~# df -h
Filesystem                Size      Used Available Use% Mounted on
rootfs                    1.3M      1.2M    152.0K  89% /
/dev/root                 1.5M      1.5M         0 100% /rom
tmpfs                    14.2M     60.0K     14.1M   0% /tmp
tmpfs                   512.0K         0    512.0K   0% /dev
/dev/mtdblock3            1.3M      1.2M    152.0K  89% /overlay
overlayfs:/overlay        1.3M      1.2M    152.0K  89% /


Перепробовав разные варианты, как ни странно, кроме mount ничего не помогло, то что помогало после загрузки «растолкать» /dev/sda ни в какую не помогало во время загрузки, спас mount.
Пришлось подправить /lib/preinit/50_determine_usb_root

vi /lib/preinit/50_determine_usb_root 
                             
                [ -n "$extroot_settle_time" ] && [ "$extroot_settle_time" -gt 0 ] && {
                        sleep $extroot_settle_time                                    

                       echo -----dirty workaround Huawei gsm dongle cardreader  -----                              
                       sleep 2                                                       
                       mount /dev/sda /mnt                                               
                       sleep 10                                                     
                }                                   



После этого все получилось

- merge overlay components -

[    7.720000] SCSI subsystem initialized

[    7.900000] usbcore: registered new interface driver usbfs
[    7.910000] usbcore: registered new interface driver hub

[    7.920000] usbcore: registered new device driver usb

[    8.420000] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[    8.420000] ehci-platform ehci-platform: Generic Platform EHCI Controller
[    8.430000] ehci-platform ehci-platform: new USB bus registered, assigned bus number 1

[    8.470000] ehci-platform ehci-platform: irq 3, io mem 0x1b000000
[    8.490000] ehci-platform ehci-platform: USB 2.0 started, EHCI 1.00
[    8.490000] hub 1-0:1.0: USB hub found
[    8.490000] hub 1-0:1.0: 1 port detected
[    8.510000] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
[    8.550000] uhci_hcd: USB Universal Host Controller Interface driver

[    8.620000] Initializing USB Mass Storage driver...
[    8.620000] usbcore: registered new interface driver usb-storage
[    8.630000] USB Mass Storage support registered.

[    8.820000] usb 1-1: new high-speed USB device number 2 using ehci-platform

[    8.980000] scsi0 : usb-storage 1-1:1.3

[    9.980000] scsi 0:0:0:0: Direct-Access     HUAWEI   SD Storage       2.31 PQ: 0 ANSI: 2

[    9.990000] sd 0:0:0:0: [sda] Attached SCSI removable disk

-----dirty workaround Huawei gsm dongle cardreader -----

[   30.670000] sd 0:0:0:0: [sda] 3854336 512-byte logical blocks: (1.97 GB/1.83 GiB)
[   30.680000] sd 0:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA

[   30.690000]  sda: sda1

[   41.850000] EXT4-fs (sda1): recovery complete

[   42.130000] EXT4-fs (sda1): mounted filesystem with ordered data mode. Opts: (null)

switching to external rootfs

- init -


и результат

root@OpenWrt:~# df -h
Filesystem                Size      Used Available Use% Mounted on
rootfs                    1.8G     37.1M      1.7G   2% /
/dev/root                 1.5M      1.5M         0 100% /rom
tmpfs                    14.2M    408.0K     13.8M   3% /tmp
tmpfs                   512.0K         0    512.0K   0% /dev
/dev/sda1                 1.8G     37.1M      1.7G   2% /overlay
overlayfs:/overlay        1.8G     37.1M      1.7G   2% /


Доставляем, то что не могли поставить без pivotroot т.к. не хватало места и то что просто хочется, тут уже можно по вкусу добавлять mc, luci и т.д.

opkg install kmod-usb-serial kmod-usb-serial-option usb-modeswitch usb-modeswitch-data

после установки kmod-usb-serial проверяем наличие ttyUSB

ls /dev | grep USB
ttyUSB0
ttyUSB1
ttyUSB2


изучаем wiki.openwrt.org/ru/doc/howto/build и берем исходные коды для версии которая у нас на tp-link trunk или release/release candidate

качаем asterisk-chan-dongle, он необходим, для работы asteriska со «свистком»
code.google.com/p/asterisk-chan-dongle/downloads/list

распаковываем и копируем в дерево пакетов
cp -vrf chan_dongle-1.1.r14/contrib/openwrt/asterisk18-chan-dongle attitude_adjustment/feeds/packages/net/

правим feeds/packages/net/asterisk18-chan-dongle/Makefile под нашу версию астериска
WITH_ASTERISK=asterisk-1.8.3.2 

на ( root@OpenWrt:~# asterisk -V, если не собран grep PKG_VERSION:= ./feeds/packages/net/asterisk-1.8.x/Makefile )
WITH_ASTERISK=asterisk-1.8.10.1

иначе не соберется.

И собираем пакетом chan-dongle
Target System (Atheros AR7xxx/AR9xxx)  --->
Target Profile (TP-LINK TL-MR3020)  ---> 
Network  --->   
	asterisk18 (Complete Open Source PBX), v1.8.x  ---> 
 		<M> asterisk18-chan-dongle..................... Huawei UMTS 3G dongle support


Копируем собранное на tp-link.
scp attitude_adjustment/bin/ar71xx/packages/asterisk18-chan-dongle_1.1.r10-18_ar71xx.ipk root@192.168.5.5:/overlay/ 

Также лучше перенести libiconv-full и asterisk18 с которыми собирался chan-dongle в моем случае это
attitude_adjustment/bin/ar71xx/packages/libiconv-full_1.11.1-1_ar71xx.ipk
attitude_adjustment/bin/ar71xx/packages/asterisk18_1.8.10.1-2_ar71xx.ipk
иначе велик шанс увидеть много нового вроде такого:
OpenWrt*CLI> module load chan_dongle.so
Unable to load module chan_dongle.so
Command 'module load chan_dongle.so' failed.
WARNING[1854]: loader.c:777 inspect_module: Module 'chan_dongle.so' was not compiled with the same compile-time options as this version of Asterisk.
WARNING[1854]: loader.c:778 inspect_module: Module 'chan_dongle.so' will not be initialized as it may cause instability.
WARNING[1854]: loader.c:861 load_resource: Module 'chan_dongle.so' could not be loaded.

Хотя надо сказать, что libiconv-full я ставил opkg-м с интернета, а вот asterisk и chan-dongle взял те, что собирал сам, т.к. я их делал в rc1 а в trunk-е уже была другая версия asterisk-a.

Устанавливаем и проверяем.
opkg install /overlay/asterisk18_1.8.10.1-2_ar71xx.ipk  libiconv-full  /overlay/asterisk18-chan-dongle_1.1.r10-18_ar71xx.ipk
 
/etc/init.d/asterisk start
asterisk -rv
OpenWrt*CLI>  dongle show devices
ID           Group State      RSSI Mode Submode Provider Name  Model      Firmware          IMEI             IMSI             Number        
dongle0      0     Free       22   0    0       Beeline        E171       11.126.85.01.143  **********1  2****************  Unknown     


Настройку asterisk-а можно посмотреть тут.
UPD: и тут.

На сегодня я до неё не дошел, как и до паяльника, чтобы сделать импровизированное PoE.

UPD: Часть 2
Share post

Similar posts

Comments 16

    0
    Спасибо, за мануал.
    Ранее уже делалось на dir-320. Чем и я страдал. Долго мучался. Нынче всё проще.
    habrahabr.ru/post/160299/
      0
      Ссылка на этот пост есть в предпоследнем предложении :)

      На хабре есть несколько статей на тему, но почему-то нигде не было подробностей про сборку под openwrt chan-dongle и странного поведения cardreader-а huawei-ых модемов в частности на этой архитектуре(как на других не знаю), пришлось обзавестись usb->uart т.к. пока игрался с этим багом, потерял рулежку от mr-3020 — не прогружался, потом смог вернуть только с консолью.
      0
      тьфу ты перепутал пост вот ссыло habrahabr.ru/post/125186/
        0
        Добавил в ссылки, спасибо, я её читал, но куда-то потерял из закладок.
          0
          мельком прочитал
          Астериск в роутере крутится?
            0
            Да, задумка была раскрутить на роутере об этом и писал, ещё мысль есть выкинуть это дело на балкон(как я говорил дом — железобетон жутко экранирует, по квартире сотовые почти не работают, если только найти место и сидеть не двигаясь) и запитать по витой паре, благо витуху везде раскидал во время ремонта, зарегать на него dect(siemens C470 IP) и все с префиксом этого сотового оператора отправить туда, чтоб жена с тещей могли спокойно говорить не через pstn->gsm, а gsm->gsm, т.к. находятся в одном регионе, ну и сливать туда бонусы бесплатных минут заодно, которые у меня сгорают от ненадобности на моем телефоне. Как-то так.
              0
              в качестве полноценной атс не получится использовать, так как процессор слабоват и памяти мало, но вот как дешевый VoIP-GSM шлюз для личного использования самое то…
              0
              А можешь поделиться скомпилированным модулем chan_dongle.so, а то у меня чего то не компилируется…
                0
                Вечером выложу последнюю сборку куда-нибудь, все на домашнем ноуте. Makefile у chan-dongle поправить под версию астериска, не забыли?
                  0
                  Да как только не пробовал Makefile изменять, дня два провозился и отложил…
                  0
                  Только добрался до ноута www.dropbox.com/sh/xjldxibmzo6bdye/88eCAN2j9S это trunk, отдельно so-шка скорее всего без asterisk с той же сборки не пойдет, если надо с RC1 могу попробовать чуть позже собрать, да, у меня были грабли со сборкой когда обновлял и забывл делать make dirclean оставался старый toolchain
                    0
                    Огромное спасибо, пакет asterisk18-chan_dongle стал и завелся сразу!!!
                    0
                    вернее attitude adjustment, сейчас сдерну — поставлю собираться, в ссылке выше BARRIER BREAKER r35905 из второй части
                      0
                      это же надо, забыл роутер на работе :) спасибо за пакеты, завтра попробую Ваши ipk установить…
                        0
                        ох тыж, тоже не смог собрать в AA, но не chan-dongle, а
                        chan-sccp-b
                        Checking out files from the svn repository…
                        svn: E160013: '/svnroot/chan-sccp-b/!svn/bc/3795/trunk' path not found
                        svn: E160013: '/svnroot/chan-sccp-b/!svn/bc/3795/trunk' path not found
                        make[3]: *** [/path/currwrk/attitude_adjustment/dl/asterisk18-chan-sccp-b-r3004.tar.gz] Error 1
                        make[3]: Leaving directory `/path/currwrk/attitude_adjustment/feeds/packages/net/asterisk-chan-sccp-b'
                        make[2]: *** [package/feeds/packages/asterisk-chan-sccp-b/compile] Error 2
                        make[2]: Leaving directory `/path/currwrk/attitude_adjustment'
                        make[1]: *** [/path/currwrk/attitude_adjustment/staging_dir/target-mips_r2_uClibc-0.9.33.2/stamp/.package_compile] Error 2
                        make[1]: Leaving directory `/path/currwrk/attitude_adjustment'
                        make: *** [world] Error 2

                        попробую без него, выяснять в чем дело пока некогда
                          0
                          выложил без chan-sccp-b по тойже ссылке
                          Судя по всему у Attitude Adjustment в Makefile chan-sccp-b не актульный PKG_SOURCE_URL, если сменить на
                          PKG_SOURCE_URL:=http://svn.code.sf.net/p/chan-sccp-b/code/trunk
                          по-идее поможет, или вообще взять Makefile из trunk

                          Only users with full accounts can post comments. Log in, please.