Делаем VoIP GSM шлюз из Tp-link mr-3020 и Huawei E-171 — часть вторая добавляем Siemens Gigaset c470IP и SMS

от автора


Есть такой стандарт ETSI 201 912 SMS для «наземных линий» (landline sms зап. источники) как оказалось его поддерживает Gigaset c470IP и sms можно отправлять используя VoIP, узнав это захотел сделать «перекладывание sms» т.е. все что приходит в донгл пересылается на Gigaset C470 IP, и наоборот — чтобы была возможность отправлять sms с C470IP во внешний мир через донгл, все это будет происходить как и в первой части на tp-link mr-3020 под openwrt, также будет показана окончательная конфигурация и немного картинок.
Для тех кто пропустил первую часть, в ней я рассказывал о базовой установке openwrt и asterisk на tp-link 3020 с использованием pivotroot на внешней флэш памяти кард-ридера донгла от huawei E-171.

Суть решения довольна простая, есть специальное приложение для asterisk app_sms и с ним бинарник smsq для отправки «landline» sms, для работы донгла с sms нам помимо chan-dongle понадобится функция BASE64_DECODE.
Но к сожаления ни бинарник ни функция, что по сути модуль астериска не устанавливаются в openwrt, для того чтобы их собрать и установить, прийдется компилировать из исходных кодов, в этом случае удобнее сразу собирать всю систему(с) Droidman. Я для удобства собирал все что надо сразу и сделал свой репозиторий, подправив потом opkg.conf, имхо лучше собрать лишнего, чем недособрать, список пакетов и важных на мой взгляд опций приведу в конце статьи. Сейчас остановимся на наиболее важном. Все что написано далее по крайней мере актуально для openwrt BARRIER BREAKER (Bleeding Edge, r35905).

Отметим модулем все пакеты связанные с asterisk18, как говорил выше проще собрать лишнего и не ставить, чем недособрать и отслеживать зависимости.

Для того чтобы собрать smsq добавляем patch перед сборкой
cat ./trunk/feeds/packages/net/asterisk-1.8.x/patches/011-smsq_fix.patch

--- a/utils/utils.xml +++ b/utils/utils.xml @@ -41,7 +41,7 @@  	<support_level>extended</support_level>    </member>    <member name="smsq"> -	<defaultenabled>no</defaultenabled> +	<defaultenabled>yes</defaultenabled>  	<depend>popt</depend>  	<support_level>extended</support_level>    </member> 

После сборки нам понадобится перенести ./trunk/build_dir/target-mips_r2_uClibc-0.9.33.2/asterisk-1.8.10.1/utils/smsq на роутер в /usr/sbin/. Наверняка smsq при запуске будет выдавать «smsq: can’t load library ‘libstdc++.so.6’» — лечится при помощи:

cd /lib/ ln -s libuClibc-0.9.33.2.so libstdc++.so.6   

Также нужно будет перенести из каталога сборки ./trunk/build_dir/target-mips_r2_uClibc-0.9.33.2/asterisk-1.8.10.1/funcs/func_base64.so на роутер в /usr/lib/asterisk/modules/

Т.к. в первой части не приводил конфиги, тут покажу все, голосовая часть сделана по мотивам из ссылок в конце первой части, на sms остановлюсь подробней.

dongle.conf

[dongle0] audio=/dev/ttyUSB1		; tty port for audio connection; 	no default value data=/dev/ttyUSB2		; tty port for AT commands; 		no default value context=dongle-incoming group=0 rxgain=4; txgain=5; resetdongle=yes u2diag=-1 usecallingpres=yes callingpres=allowed_passed_screen imei=Тутимейдонгла ; не забудьте сменить 

root@OpenWrt:/lib# cat /etc/asterisk/sip.conf

[general] externip=10.10.10.10;       Эти поля у меня на самом деле не используются externaddr=10.10.10.10; localnet=192.168.5.0/255.255.255.0; Это локалка, gigaset тоже в этой сети context=private; allowguest=no; context=default                 ; Default context for incoming calls ;allowguest=no                  ; Allow or reject guest calls (default is yes) udpbindaddr=0.0.0.0    tcpenable=yes                    ; Enable server for incoming TCP connections (default is no) tcpbindaddr=0.0.0.0             ; IP address for TCP server to bind to (0.0.0.0 binds to all interfaces) srvlookup=yes                   ; Enable DNS SRV lookups on outbound calls  [sg470ip] type=friend                                  host=dynamic secret=pass context=from-sg470ip           ; Контекст для siemens 470 IP, он единственный клиент  canreinvite=yes dtmfmode=rfc2833 permit=192.168.5.200/255.255.255.255 qualify=yes  

root@OpenWrt:/lib# cat /etc/asterisk/extensions.conf

[general] static=yes writeprotect=no clearglobalvars=no   [dongle-incoming] include => dongle-incoming-sms-ussd exten => s,1,Dial(SIP/sg470ip) exten => h,n,Hangup()   [from-sg470ip] exten => _7X.,1,Dial(Dongle/dongle0/holdother:+${FILTER(0-9,${EXTEN})}) exten => _+7X.,1,Dial(Dongle/dongle0/holdother:+${FILTER(0-9,${EXTEN})}) exten => _8X.,1,Dial(Dongle/dongle0/holdother:+7${FILTER(0-9,${EXTEN:1})}) exten => _007X.,1,Dial(Dongle/dongle0/holdother:+7${FILTER(0-9,${EXTEN:3})})  exten => 2000,1,NoOp(Receiving SMS from ${CALLERID(num)}) exten => 2000,n,Answer exten => 2000,n,SMS(2000,as) exten => 2000,n,System(/etc/asterisk/sms-out.sh) exten => h,n,Hangup()   [dongle-incoming-sms-ussd] exten => sms,1,Verbose(Incoming SMS from ${CALLERID(num)} ${BASE64_DECODE(${SMS_BASE64})}) exten => sms,n,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} - ${DONGLENAME} - ${CALLERID(num)}: ${BASE64_DECODE(${SMS_BASE64})}' >> /var/log/asterisk/sms.txt) exten => sms,n,System(/usr/sbin/smsq --mt --oa="${CALLERID(num)}" --mttx-callerid="2001" --mttx-channel="SIP/sg470ip" --ud="${BASE64_DECODE(${SMS_BASE64})}") exten => sms,n,Hangup()  exten => ussd,1,Verbose(Incoming USSD: ${BASE64_DECODE(${USSD_BASE64})}) exten => ussd,n,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} - ${DONGLENAME}: ${BASE64_DECODE(${USSD_BASE64})}' >> /var/log/asterisk/ussd.txt) exten => ussd,n,System(/usr/sbin/smsq --mt --oa="0" --mttx-callerid="2001" --mttx-channel="SIP/sg470ip" --ud="${DONGLENAME}: ${BASE64_DECODE(${USSD_BASE64})}") exten => ussd,n,Hangup() 

Последний конфиг касательно sms разберем более подробно, дело в том, что когда в 470IP указывется sms центр, то при отправке сообщений, на * они приходят на номер и ещё 0 в конце, в C470IP у меня прописан номер смс-центра 200, таким образом все исходящие sms прилетают на 2000 см. ([from-sg470ip]) далее астериск отвечает и exten => 2000,n,SMS(2000,as) означает 2000 имя очереди, a — ответить, s — действовать как смс центр, т.е. сообщение сохраняется в /var/spool/asterisk/sms/morx/2000.* где звездочка это дата время, за более подробной информацией по SMS() можно обратиться к ссылкам в конце поста, далее выполняется скрипт, который парсит сохранившийся файл и пересылает через донгл.

/etc/asterisk/sms-out.sh

#!/bin/sh  SPOOL='/var/spool/asterisk/sms/morx'  for SMS in `ls -1 "$SPOOL"`; do   DST=`grep -e '^da=' "$SPOOL/$SMS" | sed 's/da=//'`   MSG=`grep -e '^ud=' "$SPOOL/$SMS" | sed 's/ud=//'`   valid="true"      if [ ${#DST} -gt 1 ] ; then 	DSTPRFX=${DST:0:2} 	if [ $DSTPRFX = "89" ] ; then 	DST=`echo $DST | sed 's/8/\+7/'` 	asterisk -rx "dongle sms dongle0 $DST $MSG" 	 	else valid="false"         fi     else  	if [ $DST = "0" ] ; then         asterisk -rx "dongle ussd dongle0 $MSG" 	else valid="false" 	fi      fi  if [ $valid = "false"  ] ; then 	echo "unknown dest number $DST" >> /var/log/asterisk/sms-out.log 	smsq --mt --mttx-callerid="2001" --mttx-channel="SIP/sg470ip" --oa="200" --ud="ERR unknown dest $DST" fi   rm -f "$SPOOL/$SMS"  done 

Здесь выбираются поля кому и тело смс, далее идет проверка, если номер назначения начинается на 89, то 8 заменяется на +7 (на сименсе нельзя набрать + в номере) и посылается сообщение через донгл, если номер назначения 0, то посылается тело как ussd запрос, это сделано, чтоб можно было слать USSD запросы, например отправив *100# на 0 c sgc470ip можно проверить баланс на симке в донгле 🙂 Если же условия не выполняются, то запись в log и отправка сообшения об ошибке на телефон при помощи smsq, обратите внимание, что при ответе от смс центра уже добавляется 1 вместо 0 в номере смс-центра(хотя на сименсе и с 0 тоже вроде работает) телефон зная этот номер не звонит как обычно, а тихо пытается получить смску, вкратце принцип команды smsq из листинга — сгенерировать файл в /var/spool/sms/mttx/0.*, сгенерировать .call файл никаких дополнительных действий не требуется, все необходимые параметры есть в командной строке, можно почитать подсказки ключами —help и —usage.

[dongle-incoming-sms-ussd] в extensions.conf думаю уже понятен, это для смс входящих по gsm каналу «в донгл» — логирование и пересылка при помощи smsq на 470ip, тоже самое для входящих ответов на USSD с той лишь разницей, что у USSD в caller-id будет «ussd» gigaset такое не любит, поэтому там параметр при пересылке от(—oa) выставлен в «0»

Как это выглядит:
Смс отправленно с мобильника на номер который в донгле номер начинался с "+", пришло 810

Само смс

Звонок, если есть в записной книге gigaset-a

Звонок, если нет в книге gigaset-a

Сама настройка gigaset тривиальна, как видно из картинок, провайдер у меня называется GSM, план набора gigaset-a отправляет все что начинается на 89 на этого провайдера(mr-3020), настройки смс центра сделаны с декта-трубки, sms-центр номер 200, выбран этот центр для отправки и выбран провайдер, что интересно, может не совпадать с диалпланом в базе, все равно улетит в то, что указано в настройках смс, также может быть выставлено еще несколько смс центров, только на прием.

Список пакетов, которые у меня используются, необходимы не все, но все же лучше приведу полный

opkg list-installed

 asterisk18 - 1.8.10.1-4 asterisk18-app-exec - 1.8.10.1-4 asterisk18-app-readexten - 1.8.10.1-4 asterisk18-app-senddtmf - 1.8.10.1-4 asterisk18-app-setcallerid - 1.8.10.1-4 asterisk18-app-sms - 1.8.10.1-4 asterisk18-app-system - 1.8.10.1-4 asterisk18-app-verbose - 1.8.10.1-4 asterisk18-chan-dongle - 1.1.r10-18 asterisk18-chan-local - 1.8.10.1-4 asterisk18-codec-alaw - 1.8.10.1-4 asterisk18-func-shell - 1.8.10.1-4 asterisk18-pbx-spool - 1.8.10.1-4 asterisk18-sounds - 1.8.10.1-4 base-files - 134-r35905 blkid - 2.21.2-1 block-mount - 0.2.0-10 busybox - 1.19.4-6 dnsmasq - 2.62-3 dropbear - 2012.55-2 e2fsprogs - 1.42.4-1 fdisk - 2.21.2-1 firewall3 - 2013-03-02 glib2 - 2.34.3-1 hotplug2 - 1.0-beta-4 httping - 1.5.2-1 iptables - 1.4.18-2 iw - 3.6-1 jshn - 2013-01-29-0bc317aa4d9af44806c28ca286d79a8b5a92b2b8 kernel - 3.8.2-1-f0811f6432963110cc6f2a1623174e3a kmod-ath - 3.8.2+2013-02-22-1 kmod-ath9k - 3.8.2+2013-02-22-1 kmod-ath9k-common - 3.8.2+2013-02-22-1 kmod-cfg80211 - 3.8.2+2013-02-22-1 kmod-crypto-aes - 3.8.2-1 kmod-crypto-arc4 - 3.8.2-1 kmod-crypto-core - 3.8.2-1 kmod-crypto-hash - 3.8.2-1 kmod-crypto-manager - 3.8.2-1 kmod-fs-ext4 - 3.8.2-1 kmod-gpio-button-hotplug - 3.8.2-1 kmod-ipt-conntrack - 3.8.2-1 kmod-ipt-core - 3.8.2-1 kmod-ipt-nat - 3.8.2-1 kmod-ipt-nathelper - 3.8.2-1 kmod-leds-gpio - 3.8.2-1 kmod-ledtrig-default-on - 3.8.2-1 kmod-ledtrig-netdev - 3.8.2-1 kmod-ledtrig-timer - 3.8.2-1 kmod-ledtrig-usbdev - 3.8.2-1 kmod-lib-crc-ccitt - 3.8.2-1 kmod-lib-crc16 - 3.8.2-1 kmod-mac80211 - 3.8.2+2013-02-22-1 kmod-nls-base - 3.8.2-1 kmod-nls-utf8 - 3.8.2-1 kmod-ppp - 3.8.2-1 kmod-pppoe - 3.8.2-1 kmod-pppox - 3.8.2-1 kmod-scsi-core - 3.8.2-1 kmod-usb-core - 3.8.2-1 kmod-usb-ohci - 3.8.2-1 kmod-usb-serial - 3.8.2-1 kmod-usb-serial-option - 3.8.2-1 kmod-usb-serial-wwan - 3.8.2-1 kmod-usb-storage - 3.8.2-1 kmod-usb-uhci - 3.8.2-1 kmod-usb2 - 3.8.2-1 kmod-wdt-ath79 - 3.8.2-1 libblkid - 2.21.2-1 libblobmsg-json - 2013-01-29-0bc317aa4d9af44806c28ca286d79a8b5a92b2b8 libc - 0.9.33.2-1 libcom_err - 1.42.4-1 libcyassl - 1.6.5-2 libext2fs - 1.42.4-1 libffi - 3.0.11-1 libgcc - 4.6-linaro-1 libiconv-full - 1.11.1-1 libip4tc - 1.4.18-2 libip6tc - 1.4.18-2 libiwinfo - 39 libiwinfo-lua - 39 libjson - 0.9-2 liblua - 5.1.5-1 libncurses - 5.7-5 libnet1 - 1.1.2.1-2 libnl-tiny - 0.1-3 libopenssl - 1.0.1e-1 libpcap - 1.1.1-2 libpopt - 1.7-5 libpthread - 0.9.33.2-1 librpc - 0.9.32-rc2-0a2179bbc0844928f2a0ec01dba93d9b5d6d41a7 librt - 0.9.33.2-1 libubox - 2013-01-29-0bc317aa4d9af44806c28ca286d79a8b5a92b2b8 libubus - 2013-01-13-bf566871bd6a633e4504c60c6fc55b2a97305a50 libubus-lua - 2013-01-13-bf566871bd6a633e4504c60c6fc55b2a97305a50 libuci - 2013-01-04.1-1 libuci-lua - 2013-01-04.1-1 libusb-1.0 - 1.0.9-1 libusb-compat - 0.1.4-1 libustream-cyassl - 2013-01-22-da607e6272d789ed5dae3b0efff90912fda6f81f libuuid - 2.21.2-1 libxtables - 1.4.18-2 lua - 5.1.5-1 luci - trunk+svn9678-1 luci-app-diag-core - trunk+svn9678-1 luci-app-diag-devinfo - trunk+svn9678-1 luci-app-firewall - trunk+svn9678-1 luci-i18n-english - trunk+svn9678-1 luci-i18n-russian - trunk+svn9678-1 luci-lib-core - trunk+svn9678-1 luci-lib-ipkg - trunk+svn9678-1 luci-lib-nixio - trunk+svn9678-1 luci-lib-sys - trunk+svn9678-1 luci-lib-web - trunk+svn9678-1 luci-mod-admin-core - trunk+svn9678-1 luci-mod-admin-full - trunk+svn9678-1 luci-proto-core - trunk+svn9678-1 luci-proto-ppp - trunk+svn9678-1 luci-sgi-cgi - trunk+svn9678-1 luci-ssl - trunk+svn9678-1 luci-theme-base - trunk+svn9678-1 luci-theme-openwrt - trunk+svn9678-1 mac-to-devinfo - 1.0.0-2 mc - 4.7.5.3-2 mtd - 20 nano - 2.2.6-1 netdiscover - 0.3-beta6-3 netdiscover-to-devinfo - 1.0.0-2 netifd - 2013-02-19-486aa750a164d41905beb61afec89268e3eb7f48 opkg - 618-3 ppp - 2.4.5-9 ppp-mod-pppoe - 2.4.5-9 procd - 2012-12-20-d343dd9e9a64d4ae7d225ea29169e97fa8d116a1 px5g - 1 smap - 0.6.0-2 smap-to-devinfo - 1.0.0-2 swap-utils - 2.21.2-1 swconfig - 10 terminfo - 5.7-5 uboot-envtools - 2012.04.01-1 ubus - 2013-01-13-bf566871bd6a633e4504c60c6fc55b2a97305a50 ubusd - 2013-01-13-bf566871bd6a633e4504c60c6fc55b2a97305a50 uci - 2013-01-04.1-1 uhttpd - 2013-01-22-14e3971c37e6feb0ec5eda0988e07d8a786ba9f9 uhttpd-mod-ubus - 2013-01-22-14e3971c37e6feb0ec5eda0988e07d8a786ba9f9 usb-modeswitch - 1.2.5-1 usb-modeswitch-data - 20121109 wpad-mini - 20130302-1 zlib - 1.2.7-1 

Нюансы:

Ни в коем случае не надо создавать папки вида /overlay/var или /overlay/tmp иначе они начнут сохраняться на флэш, это вызывает сразу 2 проблемы: скорость обращения и восстановление неактуальных файлов от прошлой загрузки, т.е. если вы увидите например в консоли астериска: WARNING[1751]: db.c:115 dbinit: Unable to open Asterisk database ‘/var/lib/asterisk/astdb’: No such file or directory
Верным решением будет добавить mkdir -p /var/lib/asterisk в соответствующем месте в /etc/init.d/boot

Busybox в openwrt по-умолчанию собирается без поддержки unicode, используйте опцию CONFIG_BUSYBOX_CONFIG_UNICODE_SUPPORT=y.

Кривость рук не позволила припаяться к mini-USB, но подобие POE удалось на расстоянии около 15 метров, использовался простой инжектор, блок питания от d-link usb-hub 5V 3A и переделанная «бочка» со стороны раутера

И на последок картинка, которая должна была быть первой 🙂

Полезные ссылки по теме:

www.voip-info.org/wiki/index.php?page=Asterisk+cmd+SMS
wiki.e1550.mobi/doku.php?id=usage
www.automated.it/asterisk/sms.html
forum.ixbt.com/topic.cgi?id=88:1699-26
Часть 1

ссылка на оригинал статьи http://habrahabr.ru/post/172345/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *