Делаем VoIP GSM шлюз из Tp-link mr-3020 и Huawei E-171

в 9:03, , рубрики: asterisk, OpenWrt, tp-link mr3020, Песочница, метки: , ,

Сказ о том как взять пару маленьких устройств и получить нечто большее или 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 ] &

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


- 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/

правим Makefile под нашу версию астериска ( root@OpenWrt:~# asterisk -V )

WITH_ASTERISK=asterisk-1.8.3.2 

на

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-а можно посмотреть тут.

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

Автор: 701054

Источник


  1. Miki:

    Что за ерунда? Если статью перепечатывать то без ключевых ошибок :
    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
    }

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js