отправка SMS через 3G модем, OpenWRT

Juniper/Cisco/Allied Telesis/D-Link/Zyxel
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35182
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

отправка SMS через 3G модем, OpenWRT

Непрочитанное сообщение Alex Keda » 2019-08-10 13:33:40

мысли вслух, нахрена мне это надо...

собсно, последние года два-полтора вначале SMS шлюзы задрали цены, потом сами операторы полезли в бутылку - одним писмо предоставь, другим имя оплати ... как итог - цены снова поднялись, до единиц рублей за SMS внутри РФ =(

при том что сама SMS ничего и не стоит по сути. 160 штоле байт информации неприоритетно передать - это же вообще ни о чём...

в общем, покопался в тарифах, у всех из большой четвёрки есть тарифы с большим количеством SMS. до 500, в месяц, при этом цена будет десятки копеек за штуку. анлима у них нет, ни у одного. ну или не нашёл.

зато нашёл у виртуального оператора, одноимённого известному банку с агрессивной рекламой и русским названием с уклоном в англицизм (тинькоф, короче) тариф 49 рублей - безлимитно SMS.

заказал доп. симку, на след. день привезли. (уже с полгода как пересадил и себя и жену и детей на него - расходы на связь вдвое упали, от мегафона на котором сидел с 2003 года)

в тумбочке, уже много лет, валяется 3G модем, в датацентре в стойке с серверами стоит старый ASUS c OpenWRT
поехали.

пока обкатываю на том что под рукой есть (Asus WL500GP V2), в датацентр попозже поедет всё это.
и не факт что на этом железе - эта точка на даче стоит, и она там нужна. в датацентре и труба пониже и дым пожиже...

голая OpenWRT 18.06.2, оставляет на этой железке массу свободного места (т.к. железка с 8mb флэшкой, на 4mb будет впритирку или собирать свой образ придётся)

Код: Выделить всё

root@OpenWrt:~# df -h
Filesystem                Size      Used Available Use% Mounted on
/dev/root                 2.6M      2.6M         0 100% /rom
tmpfs                    13.6M    408.0K     13.2M   3% /tmp
/dev/mtdblock5            3.8M    320.0K      3.5M   8% /overlay
overlayfs:/overlay        3.8M    320.0K      3.5M   8% /
tmpfs                   512.0K         0    512.0K   0% /dev
root@OpenWrt:~# 
ставим модули ядра, и smstools3 который будет отправлять SMS.
к сожалению, в репозиториях нет gnokii который гораздо лучше и информативней =(

Код: Выделить всё

root@OpenWrt:~# opkg install comgt kmod-usb-core kmod-usb-serial kmod-usb-serial-option kmod-usb-uhci kmod-usb2 smstools3
Installing comgt (0.32-30) to root...
Downloading http://downloads.openwrt.org/releases/18.06.2/targets/brcm47xx/legacy/packages/comgt_0.32-30_mipsel_mips32.ipk
Installing chat (2.4.7-12) to root...
Downloading http://downloads.openwrt.org/releases/18.06.2/packages/mipsel_mips32/base/chat_2.4.7-12_mipsel_mips32.ipk
Package kmod-usb-core (4.14.95-1) installed in root is up to date.
Installing kmod-usb-serial (4.14.95-1) to root...
Downloading http://downloads.openwrt.org/releases/18.06.2/targets/brcm47xx/legacy/packages/kmod-usb-serial_4.14.95-1_mipsel_mips32.ipk
Installing kmod-usb-serial-option (4.14.95-1) to root...
Downloading http://downloads.openwrt.org/releases/18.06.2/targets/brcm47xx/legacy/packages/kmod-usb-serial-option_4.14.95-1_mipsel_mips32.ipk
Installing kmod-usb-serial-wwan (4.14.95-1) to root...
Downloading http://downloads.openwrt.org/releases/18.06.2/targets/brcm47xx/legacy/packages/kmod-usb-serial-wwan_4.14.95-1_mipsel_mips32.ipk
Installing kmod-usb-uhci (4.14.95-1) to root...
Downloading http://downloads.openwrt.org/releases/18.06.2/targets/brcm47xx/legacy/packages/kmod-usb-uhci_4.14.95-1_mipsel_mips32.ipk
Package kmod-usb2 (4.14.95-1) installed in root is up to date.
Installing smstools3 (3.1.21-2) to root...
Downloading http://downloads.openwrt.org/releases/18.06.2/packages/mipsel_mips32/packages/smstools3_3.1.21-2_mipsel_mips32.ipk
Configuring chat.
Configuring kmod-usb-serial.
Configuring kmod-usb-serial-wwan.
Configuring kmod-usb-serial-option.
Configuring comgt.
Configuring smstools3.
Creating minimum spool directories
Configuring kmod-usb-uhci.
смотрим чё сожрало места

Код: Выделить всё

root@OpenWrt:~# df -h
Filesystem                Size      Used Available Use% Mounted on
/dev/root                 2.6M      2.6M         0 100% /rom
tmpfs                    13.6M      1.1M     12.5M   8% /tmp
/dev/mtdblock5            3.8M    540.0K      3.3M  14% /overlay
overlayfs:/overlay        3.8M    540.0K      3.3M  14% /
tmpfs                   512.0K         0    512.0K   0% /dev
root@OpenWrt:~# 
тут, обнаруживаю, что команды lsusb нету. ставим

Код: Выделить всё

root@OpenWrt:~# opkg install usbutils
Installing usbutils (007-9) to root...
Downloading http://downloads.openwrt.org/releases/18.06.2/packages/mipsel_mips32/base/usbutils_007-9_mipsel_mips32.ipk
Installing librt (1.1.19-1) to root...
Downloading http://downloads.openwrt.org/releases/18.06.2/targets/brcm47xx/legacy/packages/librt_1.1.19-1_mipsel_mips32.ipk
Installing libusb-1.0 (1.0.22-1) to root...
Downloading http://downloads.openwrt.org/releases/18.06.2/packages/mipsel_mips32/base/libusb-1.0_1.0.22-1_mipsel_mips32.ipk
Configuring librt.
Configuring libusb-1.0.
Configuring usbutils.
снова место, надо все цифры запомнить, мне ещё это всё на 4mb потом впихивать...

Код: Выделить всё

root@OpenWrt:~# df -h
Filesystem                Size      Used Available Use% Mounted on
/dev/root                 2.6M      2.6M         0 100% /rom
tmpfs                    13.6M      1.1M     12.5M   8% /tmp
/dev/mtdblock5            3.8M    852.0K      3.0M  22% /overlay
overlayfs:/overlay        3.8M    852.0K      3.0M  22% /
tmpfs                   512.0K         0    512.0K   0% /dev
root@OpenWrt:~# 
смотрим список USB устройств

Код: Выделить всё

root@OpenWrt:~# lsusb 
Bus 001 Device 003: ID 19d2:1217 ZTE WCDMA Technologies MSM MF652
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 002: ID 0424:2502 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
root@OpenWrt:~# 
мопед виден, правда, модель нифига не правильно показывает. в реальности это MF192, известная бага, работе не мешает...
однако, устройства не появилось:

Код: Выделить всё

root@OpenWrt:~# ll /dev/tty* | grep -i usb
root@OpenWrt:~# 
прописываем вендора и устройство, перезагружаемся

Код: Выделить всё

root@OpenWrt:~# vim /etc/modules.d/usb-serial
root@OpenWrt:~# cat /etc/modules.d/usb-serial
usbserial vendor=19d2 product=1217
root@OpenWrt:~# 
root@OpenWrt:~# 
root@OpenWrt:~# reboot
фигвам. неправильно прописал

Код: Выделить всё

root@OpenWrt:~# logread  | grep usbserial
Sat Aug 10 02:01:06 2019 kern.err kernel: [   16.304270] usbserial: `19d2' invalid for parameter `vendor'
Sat Aug 10 02:01:06 2019 kern.err kernel: [   17.402469] usbserial: `19d2' invalid for parameter `vendor'
Sat Aug 10 02:01:06 2019 kern.err kernel: [   17.814861] usbserial: `19d2' invalid for parameter `vendor'
Sat Aug 10 02:01:06 2019 kern.err kernel: [   17.843890] usbserial: `19d2' invalid for parameter `vendor'
Sat Aug 10 02:01:06 2019 user.err kernel: [   17.923867] kmodloader: dependency not loaded usbserial
Sat Aug 10 02:01:06 2019 user.err kernel: [   17.943843] kmodloader: dependency not loaded usbserial
Sat Aug 10 02:01:06 2019 user.err kernel: [   17.976984] kmodloader: - usbserial - 0
root@OpenWrt:~# 
прописываем правильно

Код: Выделить всё

root@OpenWrt:~# vim /etc/modules.d/usb-serial
root@OpenWrt:~# cat /etc/modules.d/usb-serial
usbserial vendor=0x19d2 product=0x1217
root@OpenWrt:~# reboot
модем увидело

Код: Выделить всё

root@OpenWrt:~# ll /dev/tty* | grep -i usb
crw-------    1 root     root      188,   0 Aug 10 02:05 /dev/ttyUSB0
root@OpenWrt:~# 
рисуем конфиг smstools3

Код: Выделить всё

root@OpenWrt:~# cat /etc/smsd.conf 
#
# Description: Main configuration file for the smsd
#

devices = GSM1
incoming = /var/spool/sms/incoming
outgoing = /var/spool/sms/outgoing
checked = /var/spool/sms/checked
failed = /var/spool/sms/failed
sent = /var/spool/sms/sent
receive_before_send = no
autosplit = 3
logfile = 1
loglevel = 5

# Uncomment (and edit) this section to allow smsd to start:
#
[GSM1]
init = AT+CPMS="ME","ME","ME"
device = /dev/ttyUSB0
incoming = yes
pin = 0000
baudrate = 115200
раскомментировал раздел про GSM1, да прописал путь к устройству - конфиг-то готовый лежит уже после установки

перезапускаем сервис

Код: Выделить всё

root@OpenWrt:~# /etc/rc.d/*sms* restart
Creating minimum spool directories
root@OpenWrt:~# 
смотрим лог

Код: Выделить всё

root@OpenWrt:~# logread | tail 
Sat Aug 10 02:09:13 2019 daemon.info smsd[1549]: 2019-08-10 02:09:13,2, smsd: Smsd mainprocess terminated.
Sat Aug 10 02:11:22 2019 daemon.info smsd[1641]: 2019-08-10 02:11:22,2, smsd: Smsd v3.1.21 started.
Sat Aug 10 02:11:22 2019 daemon.info smsd[1641]: 2019-08-10 02:11:22,2, smsd: Running as root:root (0:0).
Sat Aug 10 02:11:22 2019 daemon.info smsd[1641]: 2019-08-10 02:11:22,4, smsd: File mode creation mask: 022 (0644, rw-r--r--).
Sat Aug 10 02:11:22 2019 daemon.info smsd[1641]: 2019-08-10 02:11:22,2, smsd: Running in terminal mode.
Sat Aug 10 02:11:22 2019 daemon.info smsd[1641]: 2019-08-10 02:11:22,5, smsd: Outgoing file checker has started. PID: 1641.
Sat Aug 10 02:11:22 2019 daemon.info smsd[1641]: 2019-08-10 02:11:22,5, GSM1: Modem handler 0 has started. PID: 1644.
Sat Aug 10 02:11:22 2019 daemon.info smsd[1641]: 2019-08-10 02:11:22,5, GSM1: Using check_memory_method 1: CPMS is used.
Sat Aug 10 02:11:23 2019 daemon.info smsd[1641]: 2019-08-10 02:11:23,5, GSM1: IMEI: 355582044570362
Sat Aug 10 02:11:23 2019 daemon.info smsd[1641]: 2019-08-10 02:11:23,5, GSM1: IMSI: 250621001272994
root@OpenWrt:~# 
всё хорошо.

проверяем, шлём себе SMS

Код: Выделить всё

root@OpenWrt:~# sendsms +79265933919 "est text message"
-- 
Text: est text message
To: +79265933919
root@OpenWrt:~# 
смотрим лог, пока телефон не успел брякнуть =)

Код: Выделить всё

root@OpenWrt:~# logread | tail -2
Sat Aug 10 02:15:13 2019 daemon.info smsd[1641]: 2019-08-10 02:15:13,5, smsd: SMS To: 79265933919. Moved file /var/spool/sms/outgoing/send_icgdkN to /var/spool/sms/checked
Sat Aug 10 02:15:16 2019 daemon.info smsd[1641]: 2019-08-10 02:15:16,5, GSM1: SMS sent, Message_id: 39, To: 79265933919, sending time 3 sec.
root@OpenWrt:~# 
всё хорошо, но, кириллицу оно не умеет из коробки. в отличие от вышеупомянутого gnokii
поэтому снова обновляем список пакетов

Код: Выделить всё

root@OpenWrt:~# opkg update
Downloading http://downloads.openwrt.org/releases/18.06.2/targets/brcm47xx/legacy/packages/Packages.gz
Updated list of available packages in /var/opkg-lists/openwrt_core
Downloading http://downloads.openwrt.org/releases/18.06.2/targets/brcm47xx/legacy/packages/Packages.sig
Signature check passed.
Downloading http://downloads.openwrt.org/releases/18.06.2/packages/mipsel_mips32/base/Packages.gz
Updated list of available packages in /var/opkg-lists/openwrt_base
Downloading http://downloads.openwrt.org/releases/18.06.2/packages/mipsel_mips32/base/Packages.sig
Signature check passed.
Downloading http://downloads.openwrt.org/releases/18.06.2/packages/mipsel_mips32/luci/Packages.gz
Updated list of available packages in /var/opkg-lists/openwrt_luci
Downloading http://downloads.openwrt.org/releases/18.06.2/packages/mipsel_mips32/luci/Packages.sig
Signature check passed.
Downloading http://downloads.openwrt.org/releases/18.06.2/packages/mipsel_mips32/packages/Packages.gz
Updated list of available packages in /var/opkg-lists/openwrt_packages
Downloading http://downloads.openwrt.org/releases/18.06.2/packages/mipsel_mips32/packages/Packages.sig
Signature check passed.
Downloading http://downloads.openwrt.org/releases/18.06.2/packages/mipsel_mips32/routing/Packages.gz
Updated list of available packages in /var/opkg-lists/openwrt_routing
Downloading http://downloads.openwrt.org/releases/18.06.2/packages/mipsel_mips32/routing/Packages.sig
Signature check passed.
Downloading http://downloads.openwrt.org/releases/18.06.2/packages/mipsel_mips32/telephony/Packages.gz
Updated list of available packages in /var/opkg-lists/openwrt_telephony
Downloading http://downloads.openwrt.org/releases/18.06.2/packages/mipsel_mips32/telephony/Packages.sig
Signature check passed.
root@OpenWrt:~# 
и ставим iconv

Код: Выделить всё

root@OpenWrt:~# 
root@OpenWrt:~# opkg install iconv
Installing iconv (1.11.1-3) to root...
Downloading http://downloads.openwrt.org/releases/18.06.2/packages/mipsel_mips32/base/iconv_1.11.1-3_mipsel_mips32.ipk
Installing libiconv-full (1.11.1-3) to root...
Downloading http://downloads.openwrt.org/releases/18.06.2/packages/mipsel_mips32/base/libiconv-full_1.11.1-3_mipsel_mips32.ipk
Installing libcharset (1.11.1-3) to root...
Downloading http://downloads.openwrt.org/releases/18.06.2/packages/mipsel_mips32/base/libcharset_1.11.1-3_mipsel_mips32.ipk
Configuring libiconv-full.
Configuring libcharset.
Configuring iconv.
root@OpenWrt:~# 
контроль места =)

Код: Выделить всё

root@OpenWrt:~# 
root@OpenWrt:~# df -h
Filesystem                Size      Used Available Use% Mounted on
/dev/root                 2.6M      2.6M         0 100% /rom
tmpfs                    13.6M    992.0K     12.6M   7% /tmp
/dev/mtdblock5            3.8M    888.0K      2.9M  23% /overlay
overlayfs:/overlay        3.8M    888.0K      2.9M  23% /
tmpfs                   512.0K         0    512.0K   0% /dev
root@OpenWrt:~# 
всё готово, но нет API, через которое биллинг, ради которого и затеяно всё это, будет слать сообщения.

рисуем его:

Код: Выделить всё

root@OpenWrt:~# cat /www/cgi-bin/test.sh 
#!/bin/sh

# example
# http://192.168.252.10/cgi-bin/test.sh?to=%2B79265933919&text=%D1%82%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%BE%D0%B5%20%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BA%D1%83%D0%B4%D0%B0-%D1%82%D0%BE

# headers                                    
echo "Content-type: text/html; charset=utf-8"                                           
echo                                                                                    

# $GET variables                                                                                        
to=`echo "$QUERY_STRING" | sed -n 's/^.*to=\([^&]*\).*$/\1/p'`
text=`echo "$QUERY_STRING" | sed -n 's/^.*text=\([^&]*\).*$/\1/p'`
                            
# url decode            
to=`uhttpd -d "$to"`
text=`uhttpd -d "$text"` 

# temporary file for save SMS
FILE=$(mktemp /tmp/sms_XXXXXXX)
chmod 644 $FILE
# SMS header
echo -e "To: $to\nAlphabet: UCS2\nUDH: false\n" >$FILE
# charset convrsion for russian symbols
echo $text | iconv -f UTF-8 -t UCS-2BE >>$FILE

#cat $FILE

# move file to send
mv $FILE /var/spool/sms/outgoing/

echo OK

root@OpenWrt:~# 
и делаем файл исполняемым

Код: Выделить всё

root@OpenWrt:~# chmod 755 /www/cgi-bin/test.sh
root@OpenWrt:~# 
собственно и всё.

можно подёргать API - пример в нём же есть, работает.
докрутить авторизацию - uhttpd её умеет, или просто ограничить доступ на веб-интерфейс файрволлом (что, наверное, более правильно)

цена вопроса - вечер времени (самое дорогое), 49 рублей в месяц, и мусор из тумбочки - точка доступа с USB и 3G модем

собсно, на АВИТО можно купить и точку с 8Mb/64Mb памяти и модем, главное в список совместимого железа не забыть заглянуть на сайте OpenWRT.
цена вопроса - рублей 400 за оба устройства. просто поискать надо. или 500 - если срочно =)

P.S. это себе на память писалось.
Убей их всех! Бог потом рассортирует...

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35182
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

отправка SMS через 3G модем, OpenWRT

Непрочитанное сообщение Alex Keda » 2019-08-10 15:59:27

отправил 4 сотни SMS как в примере, только номер в начало добавил к каждой, с интервалом в секунду
пролезло нормально, тормозил толи оператор, толи телефон на приёме
места в спуле заняло 1.6 мегабайта

т.е. 64mb оперативки рекомендуется, либо регулярная перезагрузка/чистка спула от отправленных
Убей их всех! Бог потом рассортирует...

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35182
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

отправка SMS через 3G модем, OpenWRT

Непрочитанное сообщение Alex Keda » 2019-08-14 0:47:51

выяснил забавную особенность shell в BusyBox

Код: Выделить всё

echo $variable 
заменят в содержимом varaible символы \n (новая строка) на пробелы
почти два часа бился не понимая что за нафиг...

обновлённый скриптик отпарвки SMS

Код: Выделить всё

root@GL-AR150:/tmp# cat /www/cgi-bin/sms.sh
#!/bin/sh

# example
# http://192.168.252.10/cgi-bin/test.sh?to=%2B79265933919&text=%D1%82%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%BE%D0%B5%20%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BA%D1%83%D0%B4%D0%B0-%D1%82%D0%BE

# headers                                    
echo "Content-type: text/html; charset=utf-8"                                           
echo                                                                                    

# $GET variables                                                                                        
to=`echo "$QUERY_STRING" | sed -n 's/^.*to=\([^&]*\).*$/\1/p'`
text=`echo "$QUERY_STRING" | sed -n 's/^.*text=\([^&]*\).*$/\1/p'`
                            
# url decode            
to=`uhttpd -d "$to"`
# locale shell have problem with "echo \n" symbols. need use temoprary file
FILE1=$(mktemp /tmp/text_XXXXXXX)
uhttpd -d "$text" > $FILE1

# temporary file for save SMS
FILE2=$(mktemp /tmp/sms_XXXXXXX)

# SMS header
echo -e "To: $to\nAlphabet: UCS2\nUDH: false\n" >$FILE2
# charset conversion for russian symbols
cat $FILE1 | iconv -f UTF-8 -t UCS-2BE >>$FILE2

# move file to send
mv $FILE2 /var/spool/sms/outgoing/

# delete temprary file
rm -f $FILE1

echo OK
Убей их всех! Бог потом рассортирует...