00 Вступление
Много лет не писал нечего кроме заметок для себя, но тут получилось интересное решение поэтому решил поделиться со всеми пользователями habr(он много поучаствовал в принятие и поиске решения), не судите строго. Постараюсь разделить все логически правильно, но не обещаю что получится.
01 Задача
Есть куча старых железок, работающая по протоколу SMPP и присылающая уведомления по нему на номера телефонов людей (кроме этого она умеет работать напрямую с GSM-модемом и слать с него-но 21 век на дворе, да и стоимость СМС поражает). Расходы на эти уведомления то дешевели, то дорожали меняли операторов которые предоставляют сервис достаточно часто, эти вечные поиски дешевле и лучше пришли к логическому концу и было принято решение увезти все это куда нибудь в свое пользование, у нас в регионе популярные менеджеры это telegram and viber. У обоих есть боты у обоих есть API. Но так как я все таки ИТ-спец и свои скилы программирования не прокачиваю, буду использовать чужие наработки и опыт в стыковке. В итоге получилась комбинация работающая даже интереснее чем надо, т.к. теперь любые уведомления (с 1С, freepbx, backup) можно напрямую посылать в чатбот по номеру телефона.
10 Вступление
С smpp умеет работать несколько софтин, еще находил несколько исходных кодов серверов на VS, попробовал несколько и понял что код то есть, но заставить его работать не всегда тривиальная задача и некоторые из них платные, а делать потом интеграцию это еще та проблема, поэтому выбор пал на kannel старый и кривой софт. Сколько времени потрачено на то чтобы он заработал на свежем дистрибутиве это отдельная история, но он работает, и в практике работает без особых проблем. В общем нам понадобится старенький комп(можно виртуалку) на борту которой стоит поставить минимальный образ Centos 7 далее можно просто вставлять команды(осторожнее с включением ssh):
#disable selinux, iptables and other....
systemctl enable sshd
systemctl start sshd
yum install mc
mcedit /etc/selinux/config #edit setenforce 0
yum update
yum install gcc libxml2-devel mariadb mariadb-devel wvdial vim openssl-devel texlive-* m4 gcc-c++ make wget -y
yum groupinstall "Development tools" -y
yum remove bison -y
mkdir /usr/local/kannel/
mkdir /usr/local/kannel/src
cd /usr/local/kannel/src
wget https://ftp.gnu.org/gnu/bison/bison-2.7.tar.gz
wget --no-check-certificate http://www.kannel.org/download/1.4.4/gateway-1.4.4.tar.gz
wget --no-check-certificate http://www.kannel.org/download/1.4.5/gateway-1.4.5.tar.gz
wget --no-check-certificate https://www.kannel.org/download/1.5.0/gateway-1.5.0.tar.gz
tar zxvf bison-2.7.tar.gz && cd bison-2.7 && ./configure && make && make install && cd src
cp bison /usr/local/bin/bison && cp bison /usr/bin/bison
cd /usr/local/kannel/src
tar -zxvf gateway-1.4.4.tar.gz && tar -zxvf gateway-1.4.5.tar.gz && tar -zxvf gateway-1.5.0.tar.gz
cd /usr/local/kannel/src/gateway-1.4.5
./configure --prefix=/usr/local/kannel --enable-start-stop-daemon --with-mysql --with-mysql-dir=/usr/lib/mysql/ --enable-debug --enable-assertions --disable-localtime --enable-start-stop-daemon --enable-pam
make && make install
cd /usr/local/kannel/src/gateway-1.4.5/addons/opensmppbox/
./configure --prefix=/usr/local/kannel --with-kannel-dir=/usr/local/kannel
make && make install
cd /usr/local/kannel/src/gateway-1.4.5/addons/sqlbox/
./configure --prefix=/usr/local/kannel --with-kannel-dir=/usr/local/kannel
make && make install
systemctl stop firewalld
systemctl disable firewalld
mkdir /var/log/kannel
chmod 777 /var/log/kannel/
yum install php -y
После выполнения набора этих команд вы получите centos с установленным и работающим kannel`ом
11 Настройка Kannel
Все действия будем проводить в каталоге установки kannel, поэтому
cd /usr/local/kannel/sbin/
touch kannel.conf
touch killrestart.sh
touch opensmppbox.conf
touch ouser
touch test.php
все файлы создали, приступим к настройке, рассказывать по всем параметрам смысла не вижу, по идее это все можно с помощью переводчика перевести с перевода на перевод, но общий смысл уловить можно, это простой рабочий конфиг под конкретную цель:
nano kannel.conf
#и приводим файл к следующему виду:
group = core
admin-port = 13000
admin-password = test
smsbox-port = 13001
dlr-storage = internal
store-type = file
log-file = "/var/log/kannel/kannel.log"
access-log = "/var/log/kannel/access.log"
log-level = 4
store-location = "/var/log/kannel/kannel.store"
group = smsbox
smsbox-id = smsboxid
bearerbox-host = localhost
sendsms-port = 13013
group = smsc
smsc = http
smsc-id = tophp
smsc-username = default
smsc-password = default
system-type = kannel
port = 63015
alt-charset = "utf-8"
send-url = http://127.0.0.1:63016/
max-sms-octets = 1000
nano opensmppbox.conf
#и приводим файл к следующему виду:
group = core
dlr-storage = internal
store-type = file
store-location = "/var/log/kannel/smpp_store_sms"
group = opensmppbox
opensmppbox-id = opensmppbox
opensmppbox-port = 3700
bearerbox-host = 127.0.0.1
bearerbox-port = 13001
our-system-id = opensmppbox
smpp-logins = /usr/local/kannel/sbin/ouser
use-systemid-as-smsboxid = true
log-level = 4
log-file = /var/log/kannel/opensmppbox.log
nano ouser
#и приводим файл к следующему виду:
test1 123 user-smpp *.*.*.*
test2 123 user-smpp *.*.*.*
nano killrestart.sh
#и приводим файл к следующему виду:
pkill bearerbox
pkill opensmppbox
pkill php
rm /var/log/kannel/* -f
/usr/local/kannel/sbin/bearerbox /usr/local/kannel/sbin/kannel.conf
/usr/local/kannel/sbin/opensmppbox /usr/local/kannel/sbin/opensmppbox.conf
cd /tmp/ && php -S 0.0.0.0:63016 test.php
Чтобы проверить выполним запуск
/usr/local/kannel/sbin/bearerbox /usr/local/kannel/sbin/kannel.conf
/usr/local/kannel/sbin/opensmppbox /usr/local/kannel/sbin/opensmppbox.conf
cd /tmp/ && php -S 0.0.0.0:63016
Теперь с железки необходимо отправить smpp запрос на IP(где крутится Kannel)на порт 3700, после чего увидите запрос в консоли.
Если все получилось, отлично. Иначе следует смотреть логи.(Для тестирования можно использовать клиент https://inetlab.com/Products/Inetlab.SMPP.html скачать dll with samples, в папке найти Inetlab.SMPP.zip\bin\net461\SmppClientDemo.exe)