Пользователь
0,0
рейтинг
12 марта 2013 в 01:06

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


Есть такой стандарт 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
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] далее астериск отвечает и 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 и переделанная «бочка» со стороны раутера



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


UPD: не забывайте делать make dirclean после обновления svn иначе могут быть проблемы со сборкой.
UPD: то что собралось у меня: www.dropbox.com/sh/xjldxibmzo6bdye/88eCAN2j9S

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

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
forum.asterisk.ru/viewtopic.php?f=3&t=1160&start=10

Часть 1
@701054
карма
9,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (3)

  • +1
    Долгое время я развлекался подобным на роутере с Tomato (уж сильно пришлась мне по душе WEB GUI). До OpenWRT руки не доходили, а потом наступил момент, когда колупаться в песочнице надоело из-за ограничений платформы.
    Последней каплей стало отсутствие возможности запустить iLBC или g729 на MIPSEL для Asterisk (требовалось звонить через мобильный интернет).
    Плюнул и поднял сервер на старом ноутбуке, о чем не жалею.
    Респект за терпение!
  • 0
    А с входящим DTMF проблем нет случайно?
  • 0
    не знаю, с DTMF не игрался, есть ещё момент с «пропаданием» sms если gigaset не зарегистрирован на астере, но в общем мне в таком виде достаточно, это просто шлюзик для выноса на балкон под один телефон для домашнего пользования, что-то серьезнее пока не нужно, был вариант сделать по-другому — поднять на домашнем mediaserver-е, он на базе intel atom, но тогда не было ясности как выносить без костылей донгл на ~ 15 метров, т.к. в том месте где медиасерв сотовая связь просто не работает.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.