![](https://habrastorage.org/storage2/dba/6c7/70f/dba6c770f9581a9302eb6a11913d7113.png)
Есть такой стандарт 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
![](https://habrastorage.org/storage2/9f3/e8a/812/9f3e8a8126c9a201c8984f622d076b4b.png)
Само смс
![](https://habrastorage.org/storage2/fe5/a9e/411/fe5a9e4117808c939248592a9792b1b8.png)
Звонок, если есть в записной книге gigaset-a
![](https://habrastorage.org/storage2/546/a93/322/546a93322652e97f30a2565e6ca3f7bb.png)
Звонок, если нет в книге gigaset-a
![](https://habrastorage.org/storage2/c1f/318/2cb/c1f3182cb3a9f561b2b92be1d7ec4d37.png)
Сама настройка 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 и переделанная «бочка» со стороны раутера
![](https://habrastorage.org/storage2/e7e/60a/9f0/e7e60a9f037fd394c930f89c57a60e9d.png)
![](https://habrastorage.org/storage2/54b/3a0/75a/54b3a075a967d2ff1ede4487ab27ce6e.png)
И напоследок картинка, которая должна была быть первой :)
![](https://habrastorage.org/storage2/9e1/f14/e97/9e1f14e9744166bffe11c1d1a02dda2b.png)
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