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