Оповещение через СМС / SMS при помощи USB модема.

Процесс установки zabbix а так же дополнительных различных вспомогательных программ
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 804
Стаж: 5 лет 1 месяц
Откуда: Вологодская область
Поблагодарили: 33 раза
Контактная информация:

Оповещение через СМС / SMS при помощи USB модема.

Сообщение Артём Мамзиков »

Оповещение через СМС / SMS при помощи USB модема.
modem
modem
Модем будет использоваться марки MTS E156 подключать будем к Linux Debian.

Данные инструкции еще с 2018 года написание поста 02.2023г.





Устанавливаем следующие пакеты:

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

apt-get install gnokii 
apt-get install usb-modeswitch
apt-get install gnokii-smsd-mysql
apt-get install minicom
Gnokii — это пакет программ для работы с мобильными телефонами.
В состав пакета входят, в частности, следующие программы:
gnokii — консольная программа для работы с мобильными телефонами
sendsms — консольная программа для отправки SMS в форме диалога (использует gnokii)[2]
xgnokii — графический интерфейс к gnokii
smsd — программа для отправки и получения SMS, хранящая сообщения в базе данных


Настройка модема Huawei E156G в Debian

Как правильно подключить?
Во избежание глюков и свистопляски, с меняющимися после перезагрузки именами /dev/tty/USB0-3, модем нужно подключать напрямую в usb-порт материнской платы, без usb-хабов и корпусных usb-отводов.

Определяется модем как несколько устройств /dev/ttyUSB0, /dev/ttyUSB1 или /dev/ttyUSB2.
Возможно и /dev/ttyUSB3, для этого нужно смотреть вывод dmesg или gnome-device-manager. Но это ещё не всё -). В системе появятся внешний CD-ROM MTS Connect (с виндо-софтом внутри и системными файлами) и Huawei MMC Storage. Без этого богатства, как показала практика подключения в 3ёх linux-системах, модем работать не будет.
Bus 002 Device 006: ID 12d1:1003 Huawei Technologies Co., Ltd. E220 HSDPA Modem / E270 HSDPA/HSUPA Modem

Bus 002 Device 008: ID 12d1:1003 Huawei Technologies Co., Ltd. E220 HSDPA Modem / E230/E270/E870 HSDPA/HSUPA Modem
Bus 002 Device 040: ID 12d1:1003 Huawei Technologies Co., Ltd. E220 HSDPA Modem / E230/E270/E870 HSDPA/HSUPA Modem
drivers/usb/serial/usb-serial.c: USB Serial support registered for GSM modem (1-port)
option 2-10:1.0: GSM modem (1-port) converter detected
usb 2-10: GSM modem (1-port) converter now attached to ttyUSB0
option 2-10:1.1: GSM modem (1-port) converter detected
usb 2-10: GSM modem (1-port) converter now attached to ttyUSB1
usbcore: registered new interface driver option
drivers/usb/serial/option.c: USB Driver for GSM modems: v0.7.1
usb-storage: device scan complete
scsi 4:0:0:0: Direct-Access HUAWEI MMC Storage 2.31 PQ: 0 ANSI: 2
sd 4:0:0:0: [sdb] Attached SCSI removable disk

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

ls /dev/ttyUSB*
Видим что-то типа: /dev/ttyUSB0 /dev/ttyUSB1 /dev/ttyUSB2

Про /dev/ttyUSB0


Создаем конфиг gnokii.

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

nano /usr/local/share/zabbix/alertscripts/sms.conf
[global]
port = /dev/ttyUSB0
model = AT
initlength = default
connection = serial
use_locking = no
serial_baudrate = 115200
[flags]
huawei=E156G

Huawei E220 E230/E270/E870 HSDPA/HSUPA

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

echo "text" | gnokii --config /usr/local/share/zabbix/alertscripts/sms.conf --sendsms +79*********
- проверка придет смс
Запрос баланса

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

echo "11" | gnokii --config /usr/local/share/zabbix/alertscripts/sms.conf --sendsms 111

zabbix Разрешаем ему использовать модем.

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

nano /etc/group
dialout:x:20:zabbix (у меня уже был прописан)

Это значит не нашлось файла по пути:
~/.cache/gnokii/gnokii-errors

пишем что ни будь и сохраняем чтоб создался файл

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

nano ~/.cache/gnokii/gnokii-errors
Даем права

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

chmod 777 ~/.cache/gnokii/gnokii-errors
chown zabbix:zabbix  ~/.cache/gnokii/gnokii-errors
Проверяем права

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

ls -l ~/.cache/gnokii/gnokii-errors
-rwxrwxrwx 1 zabbix zabbix 5 июн 24 08:12 /root/.cache/gnokii/gnokii-errors

проверяем от пользователя zabbix

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

su - zabbix -s /bin/bash
ls -l ~/.cache/gnokii/gnokii-errors
ls -l /var/lib/zabbix/.cache/gnokii/gnokii-errors
-rwxrwxrwx 1 zabbix zabbix 6 июн 26 11:22 /var/lib/zabbix/.cache/gnokii/gnokii-errors

или попробовать
chmod 4710
chmod ug+s
chown root:zabbix

Домашний каталог заббикса если нужен
usermod -md homedir username - пример
usermod -md /zabbix zabbix - команда


Права на порт устройства

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

chmod 777 /dev/ttyUSB0
chmod 777 /dev/ttyUSB2
Отправка СМС
Проверка команды

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

echo "text" | gnokii --config /usr/local/share/zabbix/alertscripts/sms.conf --sendsms +79111111111
GNOKII Version 0.6.30
Send succeeded with reference 105!

Дальше логинимся под пользователем zabbix и пишем очень простой скрипт.

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

nano /usr/local/share/zabbix/alertscripts/smsscript
Скрипт smsscript

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

#!/bin/sh
export LANG=ru_RU.UTF-8
# номер телефона
zabbixesmsto=$1
# текст сообщения
zabbixsubject=$2
echo "$zabbixsubject" | /usr/bin/gnokii --config /usr/local/share/zabbix/alertscripts/sms.conf --sendsms "$zabbixesmsto"
Сохраняем. Именно /usr/bin/sudo и /usr/bin/gnokii — это оказалось важно!
Не забываем от рута сделать:

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

chmod +x /usr/local/share/zabbix/alertscripts/smsscript 
Проверяем работу скрипта:

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

/usr/local/share/zabbix/alertscripts/smsscript +79111111111 test
GNOKII Version 0.6.30
Send succeeded with reference 109!

Проверка отправки от пользователя zabbix

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

su - zabbix -s /bin/bash
/usr/local/share/zabbix/alertscripts/smsscript +79111111111 test2
GNOKII Version 0.6.30
Send succeeded with reference 18!

Если пришла sms — все практически готово! Осталось прикрутить к Zabbix-у.
Если не пришла, то проверяем, все ли сделали так как написано выше.

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

nano /usr/local/etc/zabbix_server.conf
Я создавал скрипт для заббикса в /usr/local/share/zabbix/alertscripts потому что в конфиге zabbix_server.conf написно:
AlertScriptsPath=/usr/local/share/zabbix/alertscripts

Если у вас не так, то либо меняем расположение скрипта, либо изменяем в конфиге путь на
/usr/local/share/zabbix/alertscripts — не забыть рестаратнуть zabbix server!
Пример расположения
Показать
find / -name AlertScripts -поиск
/usr/local/share/zabbix/AlertScripts

find / -name gnokii - поиск
/usr/share/doc/gnokii
/usr/bin/gnokii
/etc/xdg/gnokii
/etc/xdg/gnokii/config - конфиг
В интерфейсе заббикса идем в Администрирование — Способы оповещений.
Создать способ оповещения.
SMSUSB - Скрипт - smsscript

Проблемма
{EVENT.DATE} {EVENT.TIME} {TRIGGER.NAME}

Восстановление
{EVENT.RECOVERY.DATE} {EVENT.RECOVERY.TIME} {TRIGGER.NAME}


{ALERT.SENDTO} > Параметры скриптов оповещений Значение 'Отправлять на' из настройки методов оповещений пользователя.
Поддерживается начиная с 3.0.0.
{ALERT.SUBJECT} > Параметры скриптов оповещений Значение 'Темы по умолчанию' из настройки действия.
Поддерживается начиная с 3.0.0.
{ALERT.MESSAGE} > Параметры скриптов оповещений Значение 'Сообщения по умолчанию' из настройки действия.
since 3.0.0.

Настройка интернета
Показать
Что нужно знать?
Нужно знать, как выглядит строка инициализации своего оператора. У Мтс она такая: AT+CGDCONT=1,”IP”,”INTERNET.MTS.RU”
А так же нужны логин с пасом.
Мтс - mts
Ещё понадобится номер дозвона - *99#
Всё это актуально для Москвы, в любом случае информация есть на сайтах операторов.
Вообще модем изначально заблокирован для работы только с simками мтс, так что в остальных случаях его потребуется разлочить.

Чем дозваниваться?
Я использовал wvdial.
Все настройки сводятся к правильной правке конфига /etc/wvdial.conf, так как дистрибутивы этот модем хорошо узнают, ставить драйвер не требуется.
Дозвон (от обычного юзера, без кавычек) осуществляется командой "wvdial", либо "wvdial название_соединения", если в конфиге прописаны всякие варианты (девайсов может быть в системе и несколько). Для настройки ещё можно использовать Webmin (в разделе сети, дозвонщик).

Ниже представлен мой рабочий вариант для Мтс (тариф Онлайнер).
Содержание /etc/wvdial.conf
[Dialer Defaults]
Phone =
Username =
Password =
New PPPD = yes

[Dialer huawei]
Auto Reconnect = on
Init2 = AT+CGDCONT=1,"IP","internet.mts.ru"
Baud = 115200
Init1 = ATZ
Modem = /dev/ttyUSB0
Phone = *99#
Username = mts
Abort on Busy = on
Password = mts
Stupid Mode = on

Автозапуск соединения.
После многократных плясок именно с этим модемом (особенно связка модем + прокси-сервер squid)я остановился на банальном варианте: сунуть в автозапуск гнома (Система-Параметры-Сеансы) команду wvdial huawei.
Более ранний старт приводил к неудачам в соединении(что уже видно при загрузке...многочисленные huawei... failed), впрочем в Ubuntu 8.04 это работало, но после загрузки гнома соединение падало. Видимо модем не успевал инициализировать свои устройства в системе.

Firewall.
Поскольку firestarter в дебиане не работает корректно (по крайней мере у меня), а iptables крутить руками не все могут, будет (для минимума хотя бы) разумно использовать конфигуратор arno-iptables-firewall. В качестве внешнего (external) интерфейса укажем ppp0, внутреннего (internal) - ethX (где x - номер интерфейса сетевой карты, если таковая имеется).

Раздача интернета.
С этим хорошо справляется proxy-сервер squid.
Запрос баланса СМС
Показать

scripts balance.sh

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

#!/bin/bash
# PIN-код

notify-send "Модем" "Запрос баланса..."
# echo "$PIN" | gnokii --entersecuritycode PIN
# gnokii --deletesms SM 0 end
echo "0" | gnokii --sendsms 000100
sleep 2
gnokii --getsms SM 0 5 -F ~/.3g-balance.txt
sed -ie 's/^M/\n/g' ~/.3g-balance.txt

#^M скопировать не получится, для красоты сообщений желательно ее ввести с помощью <ctrl-v><ctrl-m>
notify-send "Модем" "`grep 'Баланс.*руб\.' .3g-balance.txt`"

date +%d.%m.%Y-%H:%M >> balance-history
grep 'баланс:' .3g-balance.txt >> balance-history
echo >> balance-history
tail balance-history
Права на выполнение скрипта

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

chmod 777 balance.sh
chmod ugo+x balance.sh
Запускаем скрипт

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

./balance.sh
Вместо переменной PIN необходимо вставить свой PIN-код.
Важно заметить, что данный скрипт работает с модемами фирмы "Мегафон”.
Для других операторов нужны свои данные: СМС с каким текстом и на какой номер отсылать (в примере посылается СМС с текстом "0? на номер 000100).
Для моего яичного оператора нужно отсылать "11? на номер 111.
Вся информация должна быть на сайте оператора

MTC

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

#!/bin/bash
# PIN-код
# PIN=0000

notify-send "Модем" "Запрос баланса..."
# echo "$PIN" | gnokii --entersecuritycode PIN
# gnokii --deletesms SM 0 end
echo "11" | gnokii --sendsms 111
sleep 2
gnokii --getsms SM 0 5 -F ~/.3g-balance.txt
sed -ie 's/^M/\n/g' ~/.3g-balance.txt

#^M скопировать не получится, для красоты сообщений желательно ее ввести с помо$
notify-send "Модем" "`grep 'Баланс:' .3g-balance.txt`"

date +%d.%m.%Y-%H:%M >> balance-history
grep 'баланс:' .3g-balance.txt >> balance-history
echo >> balance-history
tail balance-history
Отправка СМС
Показать

Периодически модем мог зависать и не работать помогало отключить физически модем от сервера и подключить обратно.
Попытка найти способ выключать питание на usb порту (данная плата не поддерживает отключение способ ниже не вышло)
Скрипт от зависания если отваливается периодически модем
Показать
nano /usr/local/share/zabbix/scriptcron/modemsms
chmod 777 /usr/local/share/zabbix/scriptcron/modemsms
chmod ugo+x /usr/local/share/zabbix/scriptcron/modemsms
/root/.local/share/scripts/modemsms

#!/bin/sh

if [ $( ls /dev/tty* | grep 'USB0' | wc -l ) -eq 0 ]; then
usb_modeswitch -R -v 12d1 -p 1003
fi;

crontab -e
минута час день месяц день_недели команда
40 * * * * /usr/local/share/zabbix/scriptcron/modemsms

Питание на порту
ls /sys/bus/usb/devices/
1-0:1.0 1-1:1.0 2-1 2-1:1.0 2-1.1:1.1 2-1.4:1.0 usb1
1-1 2-0:1.0 2-1.1 2-1.1:1.0 2-1.4 2-1.4:1.1 usb2

dmesg
usb 2-1.1: GSM modem ttyUSB0
usb 2-1.1: GSM modem ttyUSB1
usb 2-1.1: GSM modem ttyUSB2
usb 2-1.1: Manufacturer: HUAWEI Technology
usb 2-1.1: Product: HUAWEI Mobile
option 2-1.1:1.0: GSM modem
option 2-1.1:1.1: GSM modem
option 2-1.1:1.2: GSM modem
usb-storage 2-1.1:1.0: USB Mass Storage device
usb-storage 2-1.1:1.1: USB Mass Storage device
usb-storage 2-1.1:1.2: USB Mass Storage device

dmesg | grep "ttyUSB2" просмотр привязки порта
[ 14.564655] usb 2-1.1: GSM modem (1-port) converter now attached to ttyUSB2
[106730.687430] option1 ttyUSB2: GSM modem (1-port) converter now disconnected from ttyUSB2

echo suspend > /sys/bus/usb/devices/1-9/power/level говорит _устройству_ перейти в режим энергосбережения.
Питание при этом не снимается и не все устройства это хорошо поддерживают

сам файл level является аналогом файла control который поддерживает два параметра:
on(всегда включён) и auto (разрешает авто выключение(файл autosuspend) если устройство не используется)
( сия прелесть доступна с версии ядра 2.6.32).

ставим значение auto(разрешаем авто выключение)
echo "auto" > "/sys/bus/usb/devices/2-1.1/power/control" было on
echo "auto" > "/sys/bus/usb/devices/2-1.1/power/level"
echo "auto" > "/sys/bus/usb/devices/2-1.1/power/runtime_status" нет доступа

ставим авто выключение через ноль секунд(запись в файлик autosuspend):
echo 0 | tee /sys/bus/usb/devices/2-1.1/power/autosuspend было 2

echo "0" > "/sys/bus/usb/devices/2-1.1/power/autosuspend_delay_ms" было 2000

отключаем(делаем его не активным): нет доступа
echo "2-1.1" > /sys/bus/usb/drivers/usb/unbind

Параметры по умолчанию
sys/bus/usb/devices/2-1.1/power/active_duration параметр 593057436 активная продолжительность
sys/bus/usb/devices/2-1.1/power/async параметр enablad асинхронный
sys/bus/usb/devices/2-1.1/power/autosuspend параметр 2 автоматическая приостановка
sys/bus/usb/devices/2-1.1/power/autosuspend_delay_ms параметр 2000 автоматическая приостановка задержки ms
sys/bus/usb/devices/2-1.1/power/connected_duration параметр 599705192 продолжительность подключения
sys/bus/usb/devices/2-1.1/power/control параметр on управление
sys/bus/usb/devices/2-1.1/power/level параметр on уровень
sys/bus/usb/devices/2-1.1/power/persist параметр 1 продолжать существовать
sys/bus/usb/devices/2-1.1/power/runtime_active_kids параметр 0 активные дети во время выполнения
sys/bus/usb/devices/2-1.1/power/runtime_active_time параметр 593057452 во время выполнения активного времени
sys/bus/usb/devices/2-1.1/power/runtime_enabled параметр enabled время выполнения включено
sys/bus/usb/devices/2-1.1/power/runtime_status параметр suspended приостановить состояние выполнения
sys/bus/usb/devices/2-1.1/power/runtime_suspended_time параметр 7041288 во время выполнения приостановил время
sys/bus/usb/devices/2-1.1/power/runtime_usage параметр 0 использование среды выполнения

nano /usr/local/share/zabbix/scriptcron/kick_modem
#!/bin/sh
echo "Выключение питания"
echo "1" > "/sys/bus/usb/devices/2-1.1/power/active_duration"
echo "1" > "/sys/bus/usb/devices/2-1.1/power/connected_duration"
echo "1" > "/sys/bus/usb/devices/2-1.1/power/runtime_active_time"
echo "auto" > "/sys/bus/usb/devices/2-1.1/power/control"
echo "auto" > "/sys/bus/usb/devices/2-1.1/power/level"
echo "0" > "/sys/bus/usb/devices/2-1.1/power/autosuspend_delay_ms"
echo "0" > "/sys/bus/usb/devices/2-1.1/power/autosuspend"
sleep 30
echo "Включение питания"
echo "593057436" > "/sys/bus/usb/devices/2-1.1/power/active_duration"
echo "599705192" > "/sys/bus/usb/devices/2-1.1/power/connected_duration"
echo "593057452" > "/sys/bus/usb/devices/2-1.1/power/runtime_active_time"
echo "2" > "/sys/bus/usb/devices/2-1.1/power/autosuspend"
echo "2000" > "/sys/bus/usb/devices/2-1.1/power/autosuspend_delay_ms"
echo "on" > "/sys/bus/usb/devices/2-1.1/power/level"
echo "on" > "/sys/bus/usb/devices/2-1.1/power/control"


chmod 777 /usr/local/share/zabbix/scriptcron/kick_modem
chmod ugo+x /usr/local/share/zabbix/scriptcron/kick_modem
/usr/local/share/zabbix/scriptcron/kick_modem

права были
ls -l /sys/bus/usb/devices/2-1.1/power/
итого 0
-r--r--r-- 1 root root 4096 июл 23 14:38 active_duration
-rw-r--r-- 1 root root 4096 июл 23 14:38 async
-rw-r--r-- 1 root root 4096 июл 23 14:37 autosuspend
-rw-r--r-- 1 root root 4096 июл 23 14:37 autosuspend_delay_ms
-r--r--r-- 1 root root 4096 июл 23 14:38 connected_duration
-rw-r--r-- 1 root root 4096 июл 23 14:37 control
-rw-r--r-- 1 root root 4096 июл 23 14:37 level
-rw-r--r-- 1 root root 4096 июл 23 14:38 persist
-r--r--r-- 1 root root 4096 июл 23 14:38 runtime_active_kids
-r--r--r-- 1 root root 4096 июл 23 14:38 runtime_active_time
-r--r--r-- 1 root root 4096 июл 23 14:38 runtime_enabled
-r--r--r-- 1 root root 4096 июл 23 14:38 runtime_status
-r--r--r-- 1 root root 4096 июл 23 14:38 runtime_suspended_time
-r--r--r-- 1 root root 4096 июл 23 14:38 runtime_usage
Запрос баланса USSD
Показать

Тут было много разных вариантов скриптов и т.п. так как тут я еще относительно только начинал работать с bash


ПОПЫТКА 1
баланс gammu не работает настроен на порт 0 для смс
apt-get install gammu
nano /etc/gammurc
пишем
[gammu]
port= /dev/ttyUSB0
connection = at

Проверка gammu --identify
Device : /dev/ttyUSB0
Manufacturer : Huawei
Model : unknown (E156G)
Firmware : 11.608.05.00.143
IMEI : 358181029325897
SIM IMSI : 250011441767094

Запрос баланса gammu getussd "*100#
gsm-ussd -m /dev/ttyUSB1 "*100#"
gammu getussd *100# | grep "Service reply" | sed -e "s/.*\"\(.*\)\".*/\1/" | xxd -r -ps | iconv -f=UTF-16BE -t=UTF-8

еще нужен iconv проверка iconv --list

На некоторых модемах сумма приходит не числом, а кодировкой
Расшифровка баланса.
return binascii.b2a_hex (res.encode ( ' utf-8 ' ))
return res.encode ( ' hex ' )
.encode('hex')
print((l[10:l.rfind('"')]).decode('hex')).encode('utf8')
print(l[10:l.rfind('"')]).decode('hex')

encode() возвращает кодированную версию строки
decode() декодирует строку, используя кодек, зарегистрированный для кодирования

print(base64.b16decode(l[10:l.rfind('"')]).decode('utf-16-be')).encode('utf8')

Кодировки base64, base32 и base16 преобразуют 8-битные байты в значения
Модуль base64 содержит функции для преобразования двоичных данных в подмножество ASCII
Помимо base 64, модуль предоставляет функции для работы с закодированными данными base 32 и base 16 (hex)

В Python 2 , str состоит из последовательностей 8-битовых значений, тогда как unicode состоит из последовательностей
й символов Unicode. Следует иметь в виду, что str а также unicode могут быть использованы вместе с операторами,
если str состоит только из 7-битных символов ASCI
одно и тоже
print(l[10:l.rfind('"')]).decode('hex')
print(base64.b16decode(l[10:l.rfind('"')])

Скачать
unicodeHEXde.zip
unicodeHEXde.zip
(190.1 КБ) 8 скачиваний
СКРИПТ НА BASH

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

#!/bin/sh
SCR=/tmp/ussdscp
OST=/tmp/lastcheck
(
echo 'send "ATZ"'>$SCR
echo 'send ""' >>$SCR
echo 'send "AT+CUSD=1,AA180C3602,15"'>>$SCR
echo 'expect {'>>$SCR
echo '"\"," ! killall -9 minicom'>>/$SCR
echo '   }'>>$SCR
echo '! killall -9 minicom'>>$SCR
minicom -w -S $SCR -C $OST >/dev/null 2>&1
) >/dev/null 2>&1
reset
grep '".*"' $OST | sed -e "s/\(.*\"\)\(.*\)\(\".*\)/\\2/" > $SCR
perl -e '@a=split(//,unpack("b*", pack("H*",`cat /tmp/ussdscp`))); for ($i=6; $i < $#a; $i+=7) {$a[$i].="0" } print pack("b*", join("", @a))."
"'
echo ""
unlink $OST
unlink $SCR
Описание скрипта
Показать
Что где в скрипте
#!/bin/sh
SCR=/tmp/ussdscp
OST=/tmp/lastcheck
(
echo 'send "ATZ"'>$SCR
echo 'send ""' >>$SCR
echo 'send "AT+CUSD=1,AA180C3602,15"'>>$SCR команда запрома баланса *100#
echo 'expect {'>>$SCR
echo '"\"," ! killall -9 minicom'>>/$SCR
echo ' }'>>$SCR
echo '! killall -9 minicom'>>$SCR
minicom -w -S $SCR -C $OST >/dev/null 2>&1
) >/dev/null 2>&1
reset
grep '".*"' $OST | sed -e "s/\(.*\"\)\(.*\)\(\".*\)/\\2/" > $SCR
perl -e '@a=split(//,unpack("b*", pack("H*",`cat /tmp/ussdscp`))); for ($i=6; $i < $#a; $i+=7) {$a[$i].="0" } print pack("b*", join("", @a))."
"'
echo ""
unlink $OST удалить файл параметры запроса и ошибки если есть
unlink $SCR удалить файл ответ баланса
Вывод в файл

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

#!/bin/sh
SCR=/tmp/ussdscp
OST=/tmp/lastcheck
unlink $OST
unlink $SCR
(
echo 'send "ATZ"'>$SCR
echo 'send ""' >>$SCR
echo 'send "AT+CUSD=1,AA180C3602,15"'>>$SCR
echo 'expect {'>>$SCR
echo '"\"," ! killall -9 minicom'>>/$SCR
echo '   }'>>$SCR
echo '! killall -9 minicom'>>$SCR
minicom -w -S $SCR -C $OST >/dev/null 2>&1
) >/dev/null 2>&1
reset
grep '".*"' $OST | sed -e "s/\(.*\"\)\(.*\)\(\".*\)/\\2/" > $SCR
"'
echo ""


Еще была ПОПЫТКА через скрипт на python
Загрузка Selenium для Python
Показать
apt-get install python-pip
pip install selenium

dpkg -i
python-ply_3.4-5_all.deb \
python-pycparser_2.10+dfsg-3_all.deb \
python-cffi_0.8.6-1_i386.deb \
python-colorama_0.3.2-1_all.deb \
python-cryptography_0.6.1-1+deb8u1_i386.deb \
python-distlib_0.1.9-1_all.deb \
python-html5lib_0.999-3_all.deb \
python-openssl_0.14-1_all.deb \
python-ndg-httpsclient_0.3.2-1_all.deb \
python-urllib3_1.9.1-3_all.deb \
python-requests_2.4.3-6_all.deb \
python-setuptools_5.5.1-1_all.deb \
python-pip_1.5.6-5_all.deb \
python-pyasn1_0.1.7-1_all.deb \
python-wheel_0.24.0-1_all.deb

https://github.com/mozilla/geckodriver/ ... x32.tar.gz
chmod +x geckodriver
mv geckodriver /usr/local/bin/

apt-get install build-essential autoconf libtool pkg-config python-opengl python-imaging python-pyrex python-pyside.qtopengl idle-python2.7 qt4-dev-tools qt4-designer libqtgui4 libqtcore4 libqt4-xml libqt4-test libqt4-script libqt4-network libqt4-dbus python-qt4 python-qt4-gl libgle3 python-dev libssl-dev
apt-get install python3 python-dev python3-dev \
build-essential libssl-dev libffi-dev \
libxml2-dev libxslt1-dev zlib1g-dev \
python-pip
easy_install greenlet
easy_install gevent

pip install psutil
import psutil
Скрипт balance7bit
balance7bit.zip
balance7bit.zip
(693 байт) 9 скачиваний

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

#!/usr/bin/python2.7
# coding: utf8

import base64, io, tty

def write2p(a):
   #p.write(bytes(a + '\r\n', 'utf8'))
   p.write(a + '\r\n')

def to7bit(src):
   """
   Encode ASCII text to 7-bit encoding
   """
   result, count, last = [], 0, 0
   for c in src:
      this = ord(c) << (8 - count)
      if count:
         result.append('%02X' % ((last >> 8) | (this & 0xFF)))
      count = (count + 1) % 8
      last = this
   result.append('%02x' % (last >> 8))
   return ''.join(result)

p = io.open('/dev/ttyUSB2', 'w+b', 0)
tty.setraw(p)
write2p('AT+CUSD=1,' + to7bit('*100#') + ',15')

import time

time.sleep(2)

#print('Waiting answer...')
for l in p:
   #print(l)
   if l.startswith('+CUSD'):
      print(base64.b16decode(l[10:l.rfind('"')]).decode('utf-16-be')).encode('utf8')
      break

p.close()

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

/root/balance7bit
Жду строку +CUSD
AT+CUSD=1,AA180C3602,15
OK
^RSSI:15
+CUSD: 0,"04110430043B0430043D0441003A0034003500320440",72
Баланс:452р

Ожидание
import time
time.sleep(1)

ошибка на питоне 3
Traceback (most recent call last):
File "./balance7bit", line 26, in <module>
write2p('AT+CUSD=1,' + to7bit('*100#') + ',15')
File "./balance7bit", line 8, in write2p
p.write(a + '\r\n')
TypeError: 'str' does not support the buffer interface

В чем ошибка
Если используете код для Python2, то либо исполняйте его в Python2, либо прочитайте, чем он отличается от Python3.
использует Питон 3. text в вашем примере является Юникодной строкой в Питон 3 — последовательностью Юникодных символов (Unicode codepoints). ord(c) возвращает номер символа. Исторически первые Юникодные символы упорядочены также как в ASCII (по дизайну) поэтому номера совпадают с соответствующими байтами. bytes уже является последовательностью байтов (int) — не нужно ord() вызывать. – jfs
Так list(map(int, 'вася'.encode()))? – gil9red
нет. "bytes уже является последовательностью байтов (int)". Ничего не нужно вызывать, например, b = data или for b in data работают как есть. – jfs
Если вы используете Python3x, то string не является тем же типом, что и для Python 2.x, вы должны передать его в байты (закодировать его).


Еще ВАРИАНТЫ ПОПЫТОК
Проверка баланса USSD
Показать
chmod 777 /usr/local/share/zabbix/externalscripts/balance7bit
zabbix_get -s 192.168.175.111 -p 10050 -k balance7bit

Установить apt-get install minicom
Удалить apt-get remove --auto-remove minicom
Первоночальная настройка minicom -l -8 -c on -s
Запуск minicom -l -8 -c on

minicom -D "/dev/ttyUSB0"

killall -9 minicom - убит процесс

Есть at-команда для работы с USSD (Unstructured Supplementary Service Data): +cusd. Вот только at+cusd=1,*111#
at+cusd=1,*100#,\15 — и о чудо, увидел таки +CUSD: 0,»Vash balans 29.56hrn

как работать с USSD-меню: at+cusd=1,*123#,15 выдает

+CUSD: 1,»
1.Christina Aguilera
2.Gra «Tanchyky»
3.Otrymaite Pryzy
4.Internet
5.100SMS/MMS
6.Perekaz balancu
7.MeloRing
8.Kartynky i melodi»,15
at+cusd=1,4,15

Набираю at+cusd=1,4,15 для выбора 4-го пункта меню:

+CUSD: 1,»1. GIGA Internet
2. Internet 350
3. Internet 100
4. EDGE+/GPRS+»,15

Ну и тому подобное.

Если команда выдает ошибку, можно попытаться ussd-запрос нужно написать с парными кавычками, т.е. «*111#»

Единственное, что нужно проверить — это пополнение счета.
По логике вещей это делается командой at+cusd=1,*111*код_пополнения#,15

английской версией запроса #102#


Еще способ gammu getussd *100# | grep "Service reply" | sed -e "s/.*\"\(.*\)\".*/\1/" | xxd -r -ps | iconv -f=UTF-16BE -t=UTF-8



Качаем скрипт balance.sh отсюда или копипастим.

/root/.local/share/scripts/balance.sh
#!/bin/bash
# PIN-код
# PIN=0000

notify-send "Модем" "Запрос баланса..."
# echo "$PIN" | gnokii --entersecuritycode PIN
# gnokii --deletesms SM 0 end
echo "11" | gnokii --sendsms 111
sleep 2
gnokii --getsms SM 0 5 -F ~/.3g-balance.txt
sed -ie 's/^M/\n/g' ~/.3g-balance.txt

#^M скопировать не получится, для красоты сообщений желательно ее ввести с помощью <ctrl-v><ctrl-m>
notify-send "Модем" "`grep 'Баланс:' .3g-balance.txt`"

date +%d.%m.%Y-%H:%M >> balance-history
grep 'баланс:' .3g-balance.txt >> balance-history
echo >> balance-history
tail balance-history

/root/.local/share/scripts/balanc.sh

#!/bin/sh
SCR=/tmp/ussdscp
OST=/tmp/lastcheck
(
echo 'send "ATZ"'>$SCR
echo 'send ""' >>$SCR
echo 'send "AT+CUSD=1,AA180C3602,15"'>>$SCR
echo 'expect {'>>$SCR
echo '"\"," ! killall -9 minicom'>>/$SCR
echo ' }'>>$SCR
echo '! killall -9 minicom'>>$SCR
minicom -w -S $SCR -C $OST >/dev/null 2>&1
) >/dev/null 2>&1
reset
grep '".*"' $OST | sed -e "s/\(.*\"\)\(.*\)\(\".*\)/\\2/" > $SCR
perl -e '@a=split(//,unpack("b*", pack("H*",`cat /tmp/ussdscp`))); for ($i=6; $i < $#a; $i+=7) {$a[$i].="0" } print pack("b*", join("", @a))."
"'
echo ""
unlink $OST
unlink $SCR

После этого сохраняем его куда-нибудь, например в /usr/bin — куда указывает наш PATH и делаем файл исполняемым: chmod +x /usr/bin/balance.sh

Выводим модем в сеть командой startmodem.sh

Выполняем скрипт командой balance.sh


echo 'at+cusd=1,AA180C3602,15' > /dev/ttyUSB2


Команды отправляются в эмуляторе терминала. Пример, отправить в порт модема ttyUSB0 команду "AT":

cat /dev/ttyUSB0 &
echo AT > /dev/ttyUSB0

Примечание: Команда "cat /dev/ttyUSB0 &" используется, чтобы увидеть на экране ответ модема. После использования её желательно или остановить комбинацией кнопок "Ctrl + C", или командой "killall cat" ("killall -9 cat", "busybox killall cat"), или командой "kill $PPID" (где $PPID - номер, который выводится в терминале справа от числа в квадратных скобках после запуска команды "cat...").
Вместо "cat /dev/ttyUSB0 &" можно использовать "tr -s "" < /dev/ttyUSB0 &" (или "busybox tr -s "" < /dev/ttyUSB0 &").

После завершения работы с AT-командами необходимо перезагрузить устройство!


/usr/share/doc/minicom/examples/minirc.dfl
/usr/share/doc/minicom
/usr/share/menu/minicom
/usr/share/bash-completion/completions/minicom
/usr/bin/minicom
/etc/minicom - конфиги

#!/bin/bash
cat /dev/ttyUSB2 & echo AT+CUSD=1,AA180C3602,15 > /dev/ttyUSB2 ; sleep 3; kill %cat

wget http://linux.zum-quadrat.de/downloads/g ... 25_all.deb
dpkg -i gsm-ussd_0.4.0-25_all.deb
apt-get install libexpect-perl
ошибка
apt-get -f install
dpkg -i gsm-ussd_0.4.0-25_all.deb
Проверка
gsm-ussd
gsm-ussd -m /dev/ttyUSB0 '*100#'
gsm-ussd -m /dev/ttyUSB0 --no-cleartext '*100#'
gsm-ussd -m /dev/ttyUSB0 no-cleartext '*100#'
gsm-ussd -m /dev/ttyUSB0 --debug '*100#'

Bus 002 Device 034: ID 12d1:1003 Huawei Technologies Co., Ltd. E220 HSDPA Modem / E230/E270/E870 HSDPA/HSUPA Modem
ls /dev/ttyUSB*
/dev/ttyUSB0 /dev/ttyUSB1

gsm-ussd -m /dev/ttyUSB2 --debug '*100#'
[DEBUG][main] Start, Version 0.4.0, Args: -m /dev/ttyUSB1 --debug *100#
[DEBUG][main] Setting output to UTF-8
ERROR: Modem port "/dev/ttyUSB1" is not accessible. Possible causes:
* Modem not plugged in/connected
* Modem not detected by system
* Wrong device file given
* No read/write access to modem
[DEBUG][main] END: Cleaning up

скрипт
#!/bin/bash

/usr/bin/gsm-ussd
sleep 30
/usr/bin/gammu getallsms | grep -e Sent -e expire | tee -a balance.txt
/usr/bin/gammu deleteallsms 1

еще способ
https://sourceforge.net/projects/ussdq/files/
ussdq -i /dev/ttyUSB2 *188#


Переподключение по питанию USB
cat /usr/sbin/kick_modem
#!/bin/sh
echo "Выключение питания"
echo suspend > /sys/bus/usb/devices/2-1.2/power/level
sleep 10
echo "Включение питания"
echo on > /sys/bus/usb/devices/1-9/power/level

echo suspend > 1-1/power/level
Проверка lsusb
echo on > 1-1/power/level


[DEBUG][main] Start, версия 0.4.0, Args: - m /dev/ttyUSB0 --debug *100#
[DEBUG][main] установка вывода в UTF-8
[DEBUG] [main] открытие модема
[Отладка][GSMUSSD::модем] запирающее устройство
[Отладка][GSMUSSD::для lockfile] установить замок: в /var/блокировки/ЛКК..ttyUSB0
[Отладка][GSMUSSD::модем] Открытие устройства
[Отладка][GSMUSSD::модем] настройки будут действовать до его закрытия для устройства
[Отладка][GSMUSSD::действовать до его закрытия] сохранение серийный государства
[Отладка][GSMUSSD::действовать до его закрытия] настройка серийный государства
[Отладка][GSMUSSD::модем] инициализация ожидать
[Отладка][GSMUSSD::модем] прощупывания модем (в)
[DEBUG][Gsmussd:: Modem] отправка команды: AT
[Отладка][GSMUSSD::модем] В найти, -> в
[Отладка][GSMUSSD::модем] ОК нашли.
[Отладка][GSMUSSD::модем] модем найти (на->ОК)
[Отладка][GSMUSSD:: Modem] сброс модема (ATZ)
[Отладка][GSMUSSD::модем] послав команду: АТЗ
[Отладка][GSMUSSD::модем] В найти, -> АТЗ
[Отладка][GSMUSSD::модем] ОК нашли.
[Отладка][GSMUSSD::модем] сбросить успешным
[Отладка][Gsmussd:: Modem] включение модемного Эха (ATE1)
[DEBUG][Gsmussd:: Modem] отправка команды: ATE1
[Отладка][GSMUSSD::модем] В найти, -> ATE1
[Отладка][GSMUSSD::модем] ОК нашли.
[Отладка][Gsmussd:: Modem] ATE1 успешно
[Отладка][GSMUSSD::модем] начальное состояние запроса симка (at+CPIN?)
[Отладка][GSMUSSD::модем] отправка команды: at+CPIN?
[Отладка][GSMUSSD::модем] В найти, -> в+CPIN?
[Отладка][GSMUSSD::модем] ОК нашли.
[DEBUG][Gsmussd:: Modem] получен ответ на запрос состояния SIM-карты
[Отладка] [Gsmussd:: Modem] SIM-карта разблокирована
[Отладка][Gsmussd:: Modem] ожидание регистрации сети, не более 10 попыток
[Отладка][Gsmussd:: Modem] попробуйте: 1
[Отладка][GSMUSSD::модем] отправка команды: at+Крег?
[Отладка][GSMUSSD::модем] В найти, -> в+Крег?
[Отладка][GSMUSSD::модем] ОК нашли.
[Отладка][GSMUSSD::модем] чистый результат регистрации получено запросов, парсинг
[DEBUG][GSMUSSD:: Modem] зарегистрирован, домашняя сеть
[Отладка] [Gsmussd:: Modem] запрос типа модема
[Отладка][GSMUSSD::модем] отправка команды: at+CGMM
[Отладка][GSMUSSD::модем] В найти, -> в+CGMM
[Отладка][GSMUSSD::модем] ОК нашли.
[Отладка][GSMUSSD::модем] модем типа нашли: E156G
[Отладка][GSMUSSD::модем модель модема E156G кэширования
[Отладка] [GSMUSSD::UssdQuery] тип модема нуждается в открытом тексте для USSD-запроса: E156G
[Отладка][GSMUSSD:: UssdQuery] запуск USSD-запроса *100#
[DEBUG][Gsmussd:: Modem] отправка команды: AT+CUSD=1,"*100#",15
[Отладка][GSMUSSD::модем] В найти, -> в+CUSD=1,"*100#",15
[Отладка] [Gsmussd:: Modem] найдена ошибка.
[Отладка][GSMUSSD::UssdQuery] УССД запрос не удалось, ошибка: нарушено команды модема
Сломанная команда модема
[Отладка][главная] закрытие
[DEBUG][main] конец: очистка
[Отладка][GSMUSSD::действовать до его закрытия] восстановить серийный государства
[Отладка][GSMUSSD::для lockfile] Лок /ВАР/Лок/ЛКК..ttyUSB0 выпущен


dmesg или gnome-device-manager
[ 4.054384] scsi 9:0:0:0: CD-ROM HUAWEI Mass Storage 2.31 PQ : 0 ANSI: 2
[ 4.056319] scsi 10:0:0:0: Direct-Access HUAWEI MMC Storage 2.31 P

[ 16.616556] usbserial: USB Serial support registered for GSM modem (1-port)
[ 16.616610] option 2-1.2:1.0: GSM modem (1-port) converter detected
[ 16.616695] usb 2-1.2: GSM modem (1-port) converter now attached to ttyUSB0
[ 16.616709] option 2-1.2:1.1: GSM modem (1-port) converter detected
[ 16.616786] usb 2-1.2: GSM modem (1-port) converter now attached to ttyUSB1
[ 16.717018] EXT4-fs (sda1): re-mounted. Opts: errors=remount-ro
[ 17.135789] systemd-journald[193]: Received request to flush runtime journal from PID 1

lsusb
Bus 002 Device 003: ID 12d1:1003 Huawei Technologies Co., Ltd. E220 HSDPA Modem / E230/E270/E870 HSDPA/HSUPA Modem

ls -l /sys/bus/usb/devices/
total 0
lrwxrwxrwx 1 root root 0 Nov 29 14:59 1-0:1.0 -> ../../../devices/pci0000:00/0000:00:1a.0/usb1/1-0:1.0
lrwxrwxrwx 1 root root 0 Nov 29 14:59 1-1 -> ../../../devices/pci0000:00/0000:00:1a.0/usb1/1-1
lrwxrwxrwx 1 root root 0 Nov 29 14:59 1-1:1.0 -> ../../../devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1:1.0
lrwxrwxrwx 1 root root 0 Nov 29 14:59 2-0:1.0 -> ../../../devices/pci0000:00/0000:00:1d.0/usb2/2-0:1.0
lrwxrwxrwx 1 root root 0 Nov 29 14:59 2-1 -> ../../../devices/pci0000:00/0000:00:1d.0/usb2/2-1
lrwxrwxrwx 1 root root 0 Nov 29 14:59 2-1:1.0 -> ../../../devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1:1.0
lrwxrwxrwx 1 root root 0 Nov 29 14:59 2-1.2 -> ../../../devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2
lrwxrwxrwx 1 root root 0 Nov 29 14:59 2-1.2:1.0 -> ../../../devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0
lrwxrwxrwx 1 root root 0 Nov 29 14:59 2-1.2:1.1 -> ../../../devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.1
lrwxrwxrwx 1 root root 0 Nov 29 14:59 2-1.2:1.2 -> ../../../devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.2
lrwxrwxrwx 1 root root 0 Nov 29 14:59 2-1.2:1.3 -> ../../../devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.3
lrwxrwxrwx 1 root root 0 Nov 29 14:59 2-1.4 -> ../../../devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.4
lrwxrwxrwx 1 root root 0 Nov 29 14:59 2-1.4:1.0 -> ../../../devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.4/2-1.4:1.0
lrwxrwxrwx 1 root root 0 Nov 29 14:59 2-1.4:1.1 -> ../../../devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.4/2-1.4:1.1
lrwxrwxrwx 1 root root 0 Nov 29 14:59 usb1 -> ../../../devices/pci0000:00/0000:00:1a.0/usb1
lrwxrwxrwx 1 root root 0 Nov 29 14:59 usb2 -> ../../../devices/pci0000:00/0000:00:1d.0/usb2

lsusb
Bus 002 Device 003: ID 12d1:1003 Huawei Technologies Co., Ltd. E220 HSDPA Modem / E230/E270/E870 HSDPA/HSUPA Modem
Прописать
обавил в nano /etc/usb_modeswitch.conf строки:
DefaultVendor= 0x12d1
DefaultProduct= 0x1003

TargetVendor= 0x12d1
TargetProduct= 0x1003

DetachStorageOnly=1

После запуска
usb_modeswitch -c /etc/usb_modeswitch.conf

Ничего не меняется, уже создал правило для udev:
nano /etc/udev/rules.d/40-modem.rules
SUBSYSTEMS=="usb", ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1003", RUN+="/usr/sbin/usb_modeswitch -c /etc/usb_modeswitch.conf; eject /dev/sr1"
SUBSYSTEMS=="usb", SYSFS{idProduct}=="1003", SYSFS{idVendor}=="12d1", RUN+="/lib/udev/usb_modeswitch --vendor 0x12d1 --product 0x1003 --type option-zerocd"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1003", RUN+="/sbin/modprobe usbserial vendor=0x12d1 product=0x1003"

Даже продублировал опции для модуля usbserial:
nano /etc/modprobe.d/usb-modem.conf
options usbserial vendor=0x12d1 product=0x1003

Проверка версии apt-cache show usb-modeswitch

модем включился, после следующих действи
usb_modeswitch -c /etc/usb_modeswitch.d/12d1\:1003

Содержимое файла:
nano /etc/usb_modeswitch.d/12d1\:1003
#######################################################
# Huawei E156G

DefaultVendor= 0x12d1
DefaultProduct=0x1003

TargetVendor= 0x12d1
TargetProduct= 0x1003

MessageContent="55534243123456780000000000000011062000000100000000000000000000"

Команда
/sbin/modprobe usbserial vendor=0x12d1 product=0x1003

правда в ответ пришла куча цифр, это кодировка UCS2, как ее привести в нормальный вид, пока не знаю
Существует куча кодировок (at+cscs=?). MF620 выдает +CSCS: («IRA»,»GSM»,»UCS2?), Е398 +CSCS: («8859-1?,»ASCII»,»GSM»,»UCS2?,»UTF8?), есть еще hex…



ПЕРЕДАЧА БАЛАНСА В ZABBIX

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

nano /usr/local/etc/zabbix_agentd.conf
UserParameter=balance7bit,/usr/local/share/zabbix/externalscripts/balance7bit
Timeout=15

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

service zabbix-agent restart
проверка

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

zabbix_get -s 127.0.0.1 -k balance7bit
Элемент
Ключ balance7bit
Предобработка Обрезать слева Баланс:
Предобработка Обрезать справа р
раз в 6h

Триггер
USSD Balance menee {ITEM.LASTVALUE1}
{Zabbix:balance7bit.max(5m)}<100

Описание
Проверка Баланса *100#
UserParameter=balance7bit,/usr/local/share/zabbix/externalscripts/balance7bit
AT+CUSD=1,AA180C3602,15

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

apt-get update && apt-get install usb-modeswitch
- выводим из режима диска в модем не для всех устройств

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

ls -l /dev/disk/by-id/
AT^U2DIAG=0 устройство в режиме только модем
AT^U2DIAG=1 устройство в режиме модем + CD-ROM
AT^U2DIAG=257 устройство в режиме модем + CD-ROM + Card Reader
AT^U2DIAG=256 устройство в режиме модем + Card Reader

Только GPRS/EDGE: AT^SYSCFG=13,1,3FFFFFFF,2,4
Только 3G/WCDMA: AT^SYSCFG=14,2,3FFFFFFF,2,4
Предпочитать GPRS/EDGE: AT^SYSCFG=2,1,3FFFFFFF,2,4
Предпочитать 3G/WCDMA: AT^SYSCFG=2,2,3FFFFFFF,2,4
Так же есть команда на проверку активности Voice:
AT^CVOICE? (знак вопроса тоже пишем в команде)
при ответе: ^CVOICE:0,8000,16,20 — голос в модеме есть)))


Пути к скриптам
Запускаем smsd:
/usr/sbin/smsd -u smsgw -d smsgw -c localhost -m mysql -b SM -f /var/log/smsdaemon.log

/usr/local/share/zabbix/alertscript sms.conf smsscript
/usr/local/share/zabbix/externalscripts balanc.sh balance.sh (это смс) , balance7bit
от зависания ./usr/local/share/zabbix/scriptcron/modemsms
количество слов: 4378
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 804
Стаж: 5 лет 1 месяц
Откуда: Вологодская область
Поблагодарили: 33 раза
Контактная информация:

Оповещение через СМС / SMS при помощи USB модема.

Сообщение Артём Мамзиков »

Сводка Команд Minicom
Команды могут быть вызваны CTRL-A <key>
Каталог набора номера….D
Запустите сценарий..G
Очистить Экран.......C
Отправка файлов.........S
Принять файлы......R
Настройка Minicom…O
параметры связи....P
Добавить перевод строки….A
Приостановить minicom....J
Захват включено-выключено….L
Я Вешаю Трубку....H
Выход и сброс…. X
отправить перерыв......F
инициализировать модем…..M
Выход без сброса….Q
Настройки терминала..T
запустите Kermit….K
Режим клавиши курсора…. I
линия обруч(lineWrap) включено-выключено….W
локальное Эхо (Echo) выключено…E
Экран помощи.....Z
Вставить файл...Y
Переключение временной метки...N
Прокрутить назад........B
Добавить Ret Каретки...U
Выберите function или нажмите Enter для none.

СКАЧАТЬ
Команды програмки Minicom.zip
Команды програмки Minicom.zip
(11.53 КБ) 9 скачиваний
AT команды.zip
AT команды.zip
(194 КБ) 9 скачиваний

AT КОМАНДЫ

Команда Ответ Описание
+GCAP:+FCLASS,+CGSM OK Возможности модуля
SIMCOM_SIM900 OK Идентификатор модуля
Revision:1137B09SIM900M64_ST OK Ревизия
01322600XXXXXXX OK IMEI

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

AT+COPS?
+COPS: 0,0,»MTS-RUS» OK Информация об операторе

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

AT+COPS=?
+COPS: (2,»MTS RUS»,»»,»25001″),(1,»MOTIV»,»MOTIV»,»25035″),(1,»Utel»,»Utel»,»25039″),,(0,1,4),(0,1,2) OK Доступные операторы
+CPAS: 0 OK
Информация о состояние модуля
0 – готов к работе
2 – неизвестно
3 – входящий звонок
4 – голосовое соединение

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

AT+CREG?
+CREG: 0,1 OK
Тип регистрации сети
Первый параметр:
0 – нет кода регистрации сети
1 – есть код регистрации сети
2 – есть код регистрации сети + доп параметры
Второй параметр:
0 – не зарегистрирован, поиска сети нет
1 – зарегистрирован, домашняя сеть
2 – не зарегистрирован, идёт поиск новой сети
3 – регистрация отклонена
4 – неизвестно
5 – роуминг
+CSQ: 17,0 OK
Уровень сигнала:
0 -115 дБл и меньше
1 -112 дБл
2-30 -110..-54 дБл
31 -52 дБл и сильнее
99 – нет сигнала.

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

AT+CCLK?
+CCLK: «00/01/01,04:21:27+00» OK Текущая дата и время телефона.
+CBC: 0,95,4134 OK
Монитор напряжения питания модуля
Первый параметр:
0 – не заряжается
1 – заряжается
2 – зарядка окончена
Второй параметр:
1-100 % — уровень заряда батареи
Третий параметр:
Напряжение питание модуля (VBAT), мВ

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

AT+CADC?
+CADC: 1,7 OK Значение АЦП (до 2,8В)

Команды настроек вызовов

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

AT+CLIP=1
OK АОН 1 – вкл / 0 – выкл

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

AT+GSMBUSY=0
OK
Запрет входящих звонков
0 – разрешены
1 – запрещены
OK
Автоответ
0 – ручной
1-более – автомотический после заданного количества звонков

Команды настроек СМС

AT+CMGF=1 OK
Текстовый режим
1 – включить
0 – выключить
см. примечание

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

AT+CSCS= «GSM»
OK
Кодировка текстового режима
Доступны следующие кодировки:
IRA, GSM, UCS2, HEX, PCCP, PCDN, 8859-1
см. примечание

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

AT+CSCB=0
OK
Приём специальных сообщений
0 – разрешен (по умолчанию)
1 – запрещен

Прочие команды настроек модуля OK
ЭХО
1 – вкл (по умолчанию) / 0 – выкл
OK
Формат ответа модуля
0 – только ответ
1 – полный ответ с ЭХО (по умолчанию)

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

AT+CMEE=0
OK
Информация об ошибках
0 – отключён (по умолчанию)
1 – код ошибки
2 – описание ошибки

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

AT+CCLK=»18/11/30,15:01:33+03″

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

AT+CCLK=«18/11/30,15:01:33+00»
OK
Установка часов
«yy/mm/dd,hh:mm:ss+zz»
Где:
год/месяц/дата,
часы:минуты:секунды
+часовой пояс

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

AT+CPIN=XXXX
Ввод PIN кода
Сброс настроек до значений по умолчанию (не до заводских)
0 или 1 – выбор профиля
Сброс настроек до заводских
OK
Сохранение настроек для текущего профиля
Параметр 0 или 1 — выбор профиля
Параметр указывать сразу за командой (AT&W0)

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

AT+CPOWD=1
NORMAL POWER DOWN
Выключение модуля
0 – срочное
1 – нормальное

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

AT+CFUN=1,1
Энергосберегающий режим и перезагрузка
Первый параметр:
0 – минимальный функционал
1 – нормальный режим (по умолчанию)
2 – выключения цепей приёма и передачи сигнала
Второй параметр:
0 – выполнить без перезагрузки
1 – перезагрузить (доступно только в нормальном режиме, т.е. параметры = 1,1)

Команды для осуществления телефонных звонков

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

ATD+380XXXXXXXX;
OK Позвонить на номер +380XXXXXXXX;
NO DIALTONE Нет сигнала
BUSY Если вызов отклонён
NO CARRIER Повесили трубку
NO ANSWER Нет ответа
OK Позвонить по последнему исходящему номеру
OK Ответить на звонок
OK Повесить трубку/ разорвать соединение
RING Входящий звонок

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

AT+CLIP=1
OK см. настройки
RING
+CLIP: «+380XXXXXXXX»,145,»»,,»»,0 Входящий звонок с включенным АОН
Где:
Первый параметр – номер телефона входящего звонка
2 – тип входящего номера
129 – не определен
161 – национальный
145 – интернациональный
177 – сетевой, специальный

Команды для отправки СМС сообщений

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

AT+CMGS=
«+380XXXXXXXX»
>Test sms.elschemo.ru	>
+CMGS: 15
OK Отправка СМС.
Указываем номер получателя в кавычках и отправляем модулю с символом переноса строки (13 в ASCII).
После приглашения «>» вводим текст сообщения.
Для отправки в конце сообщения отправляем символ SUB (26 в ASCII) или ESC (27) для отмены.

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

AT+CMGF=1
Режим и кодировка.

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

AT+CSCS= «GSM»
см. настройки и примечание
+CMTI: «SM»,4
Уведомление о приходе СМС.
Второй параметр номер пришедшего СМС.

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

AT+CMGL=»REC UNREAD»
+CMGL: 4,»REC UNREAD»,»+380XXXXXXXX»,»
«,»13/09/24,23:02:22+24»
Test2. OK
Чтение групп СМС.
Всего 5 групп:
REC UNREAD – входящие непрочитанные
REC READ – входящие прочитанные
STO UNSENT – Пользовательские непрочитанные
STO SENT – пользовательские прочитанные
ALL – прочитать все сообщения

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

AT+CMGR=2
+CMGR: «REC READ»,»+380XXXXXXXX»,»
«,»13/09/21,11:57:46+24»
Test sms. elschemo.ru OK
Чтение SMS сообщений.
Запрос:
Первый параметр – номер сообщения.
Второй параметр (необязателен):
0 – обычный режим (по умолчанию)
1 – не изменять статус сообщения
Ответ:
Первый параметр – группа сообщений, см предыдущий пункт.
Второй параметр – номер отправителя
3 – дата отправки
Далее следует текс сообщения.

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

AT+CMGDA=»DEL SENT»
OK
Удаление групп СМС:
DEL READ — прочитанные
DEL UNREAD — не прочитанные
DEL SENT — отправленные
DEL UNSENT — не отправленные
DEL INBOX — полученные
DEL ALL — всех сообщения

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

AT+CMGD=4
OK
Удаление СМС.
Первый параметр – номер сообщения
Второй параметр:
0 – удаление указанного сообщения (по умолчанию)
1 – удаление прочитанных сообщений
2 – удаление прочитанных и отправленных сообщений
3 – удаление прочитанных, отправленных и не отправленных сообщений
4 – удаление всех сообщений

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

AT+CSCA?
+CSCA: «+380991234567»,145 OK
Возвращает номер сервис центра отправки сообщений.

Тоновый набор (DTMF)
Тоновые сигналы: 0-9,#,*,A-D

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

AT+VTD=3
OK
Длительность тоновых сигналов для AT+VTD.
Значение параметра 1..255

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

AT+VTS=»1,4,#,A,6,7,0″
OK
Отправить последовательность тоновых сигналов (до 20).
Длительность задается командой AT+VTS.

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

AT+CLDTMF=7, «1,4,#,A,6,7,0»
OK
Проиграть на модуле (через аудио выход) тоновые сигналы.
Первый параметр — длительность 1-100
Второй параметр – строка тоновых сигналов, до 20.

USSD
Команды приведены для текстового режима и в GSM кодировке.

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

AT+CUSD=1,»#100#»
OK
+CUSD: 0,»Balance:240,68r «, USSD запрос
Первый параметр – режим обработки операции:
0 – выполнить запрос, ответ проигнорировать
1 – выполнить запрос, вернуть ответ
2 – отменить запрос
Второй параметр – запрос в кавычках.

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

ATD#100#;
OK
+CUSD: 0,»Balance:280 UAH», Упрощенный USSD запрос (работает только при GSM кодировке)

Настройка и установка GPRS соединения:

AT+SAPBR=3,1,«CONTYPE»,«GPRS»
AT+SAPBR=3,1,«APN»,«internet.beeline.ru»
AT+SAPBR=3,1,«USER»,«beeline»
AT+SAPBR=3,1,«PWD»,«beeline»
AT+SAPBR=1,1 — установка GPRS связи
AT+SAPBR=2,1 — полученный IP адрес
+SAPBR: 1,1,«10.229.9.115»
AT+SAPBR=4,1 — текущие настройки соединения
AT+SAPBR=0,1 — разорвать GPRS соединение
AT+CUSD=1,"#100#"
at+cusd=1, *100# ,15
at+cusd=1,»*100#»,15

Кодировка запроса Пример для баланса
Онлайн можно тут раскодировать
Кодировка баланс.jpg
Кодировка баланс.jpg
или тут расшифровка ответа
http://crypt-online.ru/crypts/text2hex/
https://cryptii.com/pipes/hex-decoder
https://smspdu.benjaminerhart.com/

Text To Hex / Hex To Text (PDU-кодировка)
- преобразование текста в шестнадцатеричные коды его символов и обратно. Работает для текста в кодировках Windows-1251, UTF-16. Декодирует UTF-8 текст с кириллицей, который при закодировании в JSON переводится штатной php функцей json_encode() в \uXXXX кодировку.

ответ приходит в кодировки UNICOD

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

AT+CUSD=1,AA180C3602,15
это *100# (ответ +CUSD: 0,"04110430043B0430043D0441003A0034003500320440",72)
Баланс:452р (Unicode UCS2 XX UTF-16)

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

AT+CUSD=1,A3180C3602,15
это #100# (ответ +CUSD: 0,"C2303BEC1E9775B49A4C0E",15 )
ответ +CUSD: 0,"C2303BEC1E9775B89A4CCE62A6DB69BA0E2607",15
Balance:852r,Limit:0r (GSM 7-Bit)

echo 'at+cusd=1,AA180C3602,15' > /dev/ttyUSB2
cat /dev/ttyUSB2 & echo AT+CUSD=1,AA180C3602,15 > /dev/ttyUSB2 ; sleep 3; kill %cat
echo -e «AT+CUSD=1,AA180C3602,15\r»>/dev/ttyUSB0
AT+CUSD=1,»*100#» -> +CUSD: 2,»

#105# - A318AC3602 ; *105# - AA18AC3602 ; *102# - AA184C3602 ; #102# - A3184C3602
1, — режим обработки ответа

0 — выполнить запрос, полученный ответ проигнорировать
1 — выполнить запрос, ответ вернуть в терминал
2 — отменить операцию
"#100#" — само сообщение. Отправляется только то, что находится в скобках.
Второй выглядит как обычный набор номера. Результат всегда возвращается в терминале. Но работает не на всех версиях прошивки.
ATD#100#;
Ответное сообщение приходит в сообщении +CUSD:

у меня на 16-м порту. еще два порта в диспетчере устройств Порты(COM LPT) у меня 17 Application interface и 18 UI Interface при отправке AT+CUSD=1,AA180C3602,15 на 16-й порт, ответ приходит на 18-й.
print(base64.b16decode(l[10:l.rfind('"')]).decode('utf-16-be'))
хотя вхождение он нашел..
строки которые он перебирает пока не найдет..
Можно заменить на :
print decodeText7Bit(t)

python -c ‘print unicode(«″.decode(«hex»), «utf-16-be»).encode(«cp1251″)’
python2 -c 'print unicode(«крякозябры».decode(«hex»), «utf-16-be»).encode(«utf8»)'
python2 -c 'print unicode("041F0440043E043204350440043A043000200074006500730074002000310032003300340035".decode("hex"), "utf-16-be").encode("utf8")'
Проверка test 12345

AT+CSCS="HEX"
2 OK
3
4 AT+CUSD=1,#100#,15
5 OK
6
7 +CUSD: 2, "D6F01C0D1287D961F71C14BBCD5C3018485E1
8 7BB40C2B7BB3ED781602E180C24AF8B5D20E21BFE66BB
9 D3F432FBE4CE9741E2303BEC9EE775A0510C661B01" ,15

Функция print Python выводит заданные объекты на стандартное устройство вывода (экран) или отправляет их текстовым потоком в файл
startswith() проверяет, начинается ли строка с str, необязательно ограничивая согласование с заданными индексами начала и конца
str – это строка для проверки.
beg – это необязательный параметр, установка начального индекса границы соответствия.
end – это необязательный параметр, установка начального индекса границы соответствия.

Функция rfind() возвращает последний индекс, в котором находится подстрока str, или -1, если такой индекс отсутствует, дополнительно ограничивая поиск строкой [best:end].
Синтаксис
Ниже приводится синтаксис для функция rfind():
str.rfind(str, beg = 0 end = len(string))
Параметры
str – указывает строку для поиска.
beg – это начальный индекс, по умолчанию равен 0.
end – это конечный индекс, по умолчанию равный длине строки.

print('Waiting answer...')
for l in p:
print(l)
if l.startswith('+CUSD'):
print(base64.b16decode(l[10:l.rfind('"')]).decode('utf-16-be'))
break

p.close()

import re
line = re.sub('[!@#$]', '', line)

minicom -D "/dev/ttyUSB0"
послать команду AT^RESET перезагрузка
ATZ
количество слов: 849
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 804
Стаж: 5 лет 1 месяц
Откуда: Вологодская область
Поблагодарили: 33 раза
Контактная информация:

Оповещение через СМС / SMS при помощи USB модема.

Сообщение Артём Мамзиков »

[color=#FF0000]Входящие СМС в SQL[/color]

Gnokii — это пакет программ для работы с мобильными телефонами.
В состав пакета входят, в частности, следующие программы:
gnokii — консольная программа для работы с мобильными телефонами
sendsms — консольная программа для отправки SMS в форме диалога (использует gnokii)[2]
xgnokii — графический интерфейс к gnokii
smsd — программа для отправки и получения SMS, хранящая сообщения в базе данных

Количество сохраненных СМС
gnokii --showsmsfolderstatus

Устанавливаем
[code=Bash]apt-get install gnokii-smsd-mysql mysql-server[/code]

Создаем БД
[code=Bash]mysql -uroot -pПароль - вход в sql[/code]

Создать пользователя passms
mysql -u passms
> create database passms;
> ALTER DATABASE passms CHARACTER SET utf8 COLLATE utf8_general_ci
> GRANT ALL on passms.* to root@localhost IDENTIFIED BY 'gfhjkm
> FLUSH PRIVILEGES
Выходим из консоли mysql, набирая exit

Создаем структуру БД, используя поставляемый в комплекте с gnokii-smsd-mysql пример:
mysql -upassms passms < /usr/share/doc/gnokii-smsd-mysql/sms.tables.mysql.sql

(SQL-файл находится в системе (/usr/share/doc/gnokii-smsd-mysql/sms.tables.mysql.sql))
в результате будут созданы три простые таблицы inbox, outbox и multipartinbox,
структура которых имеет следующий вид:

CREATE TABLE inbox (
id int(10) unsigned NOT NULL auto_increment,
number varchar(20) NOT NULL default '',
smsdate datetime NOT NULL default '0000-00-00 00:00:00',
insertdate timestamp DEFAULT CURRENT_TIMESTAMP,
text text,
phone tinyint(4),
processed tinyint(4) NOT NULL default '0',
PRIMARY KEY (id)
);
CREATE TABLE outbox (
id int(10) unsigned NOT NULL auto_increment,
number varchar(20) NOT NULL default '',
processed_date timestamp DEFAULT 0,
insertdate timestamp DEFAULT CURRENT_TIMESTAMP,
text varchar(160) default NULL,
phone tinyint(4),
processed tinyint(4) NOT NULL default '0',
error tinyint(4) NOT NULL default '-1',
dreport tinyint(4) NOT NULL default '0',
not_before time NOT NULL default '00:00:00',
not_after time NOT NULL default '23:59:59',
PRIMARY KEY (id)
);
CREATE TABLE multipartinbox (
id int(10) unsigned NOT NULL auto_increment,
number varchar(20) NOT NULL default '',
smsdate datetime NOT NULL default '0000-00-00 00:00:00',
insertdate timestamp DEFAULT CURRENT_TIMESTAMP,
text text,
phone tinyint(4),
processed tinyint(4) NOT NULL default '0',
refnum int(8) default NULL,
maxnum int(8) default NULL,
curnum int(8) default NULL,
PRIMARY KEY (id)
);

Скачать [attachment=1]sms.tables.mysql.zip[/attachment]

Создать
nano /root/.config/gnokii/config
[global]
port = /dev/ttyUSB0
model = AT
initlength = default
connection = serial
use_locking = no
serial_baudrate = 115200
[flags]
huawei=E156G

Запускаем smsd:
/usr/sbin/smsd -u passms -d passms -c localhost -m mysql -b SM -f /var/log/smsdaemon.log
/usr/sbin/smsd -u passms -d passms -c localhost -m mysql -f /var/log/smsdaemon.log

/usr/sbin/smsd -uroot -pПароль -d passms -c localhost -m mysql -f /var/log/smsdaemon.log
smsd -uroot -pПароль -d passms -c localhost -m mysql -b SM -f /var/log/smsdaemon.log

smsd -u db_username -d db_name -p db_password \ -c db_hostname -m mysql -b SM -f /var/log/smsdaemon


где "-u" - имя пользователя БД, "-d" - имя базы, "-с" - хост, а "-m" - модуль хранения.

Отправив теперь SMS на подключенный к компьютеру телефон, smsd сразу перехватит
его и запишет в базу.

Отправив теперь SMS на подключенный к компьютеру телефон, smsd сразу перехватит его и запишет в базу.

Проверка записи смс в sql командой
выполнить mysql -upassms или mysql -uroot -pПароль
SHOW DATABASES; - просмотр баз список
выполнить use passms - выбор базы
выполнить select * from inbox;
выход exit

Для запуска сервера воспользуемся init-скриптом, приложенным к статье (см. в самом низу) и написанным мною (точнее, отредактированным из примера). Важно не забыть сменить значение DAEMON_ARGS на свои параметры.

Почти готово: осталось записать всё это в /etc/init.d/smsd, сделать файл исполняемым, добавить его в загрузку и запустить. Последнее в Debian делается так:
nano /etc/init.d/smsd
копируем из файла скрипт
сохраняем
chmod 755 /etc/init.d/smsd

update-rc.d smsd defaults
systemctl enable smsd
invoke-rc.d smsd start

cd /etc/init.d/
chkconfig --add smsd
chkconfig smsd on

service smsd status


[spoiler title=Перекодировка Русского текста в сообщениях]
Сделал так
nano /etc/mysql/my.cnf
добавь в my.cnf запись
[client]
default_character_set=utf8

[mysqld]
character_set_server=utf8
skip-character-set-client-handshake



1) ??????? ????? ???? ? Notepad++.
2) Encoding->Charachter Sets-> Western Europian -> CP1252.
3) ???????? ?????????? ?? ????? ????? ?? ? ????????? ? ??? ????????? ???? ? ????????? CP1252.
4) ?? ? ?????? ???????????? Encoding->Cyrillyc-> Windows 1251.
???????????? ???????????...))))


----------------------------------------------------
Ну и так... На всякий случай)) Смена кодировке при выводе из БД:

mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER SET 'utf8'");
mysql_query("SET SESSION collation_connection = 'utf8_general_ci'");


?????»?????° "?—?°???€?µ?‚ ?????…???????‰???… SMS" ???° ???????µ?€?µ 79115046675 ?????????»???‡?µ???°

?????»?????° "?—?°???€?µ?‚ ?????…???????‰???… SMS" ???° ???????µ?€?µ 79115046675 ?????????»???‡?µ???°

https://2cyr.com/decode/?lang=ru




надо прописать в my.cnf например:

[mysqld]
init_connect='SET collation_connection = utf8_general_ci'
init_connect='SET NAMES utf8
default-character-set=utf8
character-set-server=utf8
collation-server=utf8_general_ci
skip-character-set-client-handshake

(skip-external-locking) - было

[client]
default_character_set=utf8

В config.inc.php поставил

$cfg['DefaultConnectionCollation'] = 'utf8_unicode_ci';

еще // Use non-UTF-8 codepages

define('PMA_REMOVED_NON_UTF_8', 1);

в файле librariesdatabase_interface.lib.php
было if (!empty($GLOBALS['lang']) && (substr($GLOBALS['lang'], -5) != 'utf-8')
стало if (!defined('PMA_REMOVED_NON_UTF_8') && !empty($GLOBALS['lang']) && (substr($GLOBALS['lang'], -5) != 'utf-8')


Я нашёл для себя лазейку через phpMyAdmin

nano /etc/mysql/my.cnf
добавь в my.cnf запись
[client]
port = 3306
socket = /var/lib/mysql/mysql.sock
default_character_set = cp1251 - дописать

Еще способ
входим в MySQL через phpmyadmin. На домашней странице в phpmyadmin видим заголовок «Основные настройки», в подразделе «Сопоставление кодировки соединения с MySQL» выбираем UTF8_UNICODE_ci.
Далее проверим конфигурацию MySQL. В phpmyadmin выберем вкладку SQL и пошлем туда запрос вида:
SHOW VARIABLES LIKE 'char%';
в ответ имеем:
character_set_database - latin1
character_set_server - latin1

/etc/mysql/my.cnf, ищем модуль [mysqld] и меняем его на:

[mysqld]
skip-character-set-client-handshake
character_set_client=cp1251
character_set_server=cp1251

Делаем рестарт MySQL (перезагрузку необходимо делать всегда после внесения каких-либо изменений): service mysql restart

В phpmyadmin снова посылаем SQL - запрос вида:
SHOW VARIABLES LIKE 'char%';

Получаем ответ
character_set_database - cp1251
character_set_server - cp1251
[/spoiler]


[spoiler title=Скрипты Автозапуска]

[code=Bash]
#!/bin/sh
### BEGIN INIT INFO
# Provides: smsd
# Required-Start: $local_fs $remote_fs $syslog
# Required-Stop: $local_fs $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Gnokii SMSD
# Description: ihit SMSD script
### END INIT INFO

# Author: ynblpb

# Do NOT "set -e"

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="gnokii smsd"
NAME=smsd
DAEMON=/usr/sbin/$NAME
DAEMON_ARGS="-u smsgw -d smsgw -c localhost -m mysql -b SM -f /var/log/smsdaemon.log"
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh
VERBOSE=on

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
# and status_of_proc is working.
. /lib/lsb/init-functions

#
# Function that starts the daemon/service
#
do_start()
{
# Return
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
|| return 1
start-stop-daemon --start --quiet --pidfile $PIDFILE -m -b --exec $DAEMON -- \
$DAEMON_ARGS \
|| return 2
# Add code here, if necessary, that waits for the process to be ready
# to handle requests from services started subsequently which depend
# on this one. As a last resort, sleep for some time.
}

#
# Function that stops the daemon/service
#
do_stop()
{
# Return
# 0 if daemon has been stopped
# 1 if daemon was already stopped
# 2 if daemon could not be stopped
# other if a failure occurred
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
RETVAL="$?"
[ "$RETVAL" = 2 ] && return 2
# Wait for children to finish too if this is a daemon that forks
# and if the daemon is only ever run from this initscript.
# If the above conditions are not satisfied then add some other code
# that waits for the process to drop all resources that could be
# needed by services started subsequently. A last resort is to
# sleep for some time.
start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
[ "$?" = 2 ] && return 2
# Many daemons don't delete their pidfiles when they exit.
rm -f $PIDFILE
return "$RETVAL"
}

#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
#
# If the daemon can reload its configuration without
# restarting (for example, when it is sent a SIGHUP),
# then implement that here.
#
start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
return 0
}

case "$1" in
start)
[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
do_start
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
stop)
[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
do_stop
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
status)
status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
;;
#reload|force-reload)
#
# If do_reload() is not implemented then leave this commented out
# and leave 'force-reload' as an alias for 'restart'.
#
#log_daemon_msg "Reloading $DESC" "$NAME"
#do_reload
#log_end_msg $?
#;;
restart|force-reload)
#
# If the "reload" option is implemented then remove the
# 'force-reload' alias
#
log_daemon_msg "Restarting $DESC" "$NAME"
do_stop
case "$?" in
0|1)
do_start
case "$?" in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Old process is still running
*) log_end_msg 1 ;; # Failed to start
esac
;;
*)
# Failed to stop
log_end_msg 1
;;
esac
;;
*)
#echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
exit 3
;;
esac

:
[/code]

[/spoiler]

Веб интерфейс для ВХОДЯЩИХ CMC
работает на php5

расположение в sms

[b]connect.php[/b]
[code=php]
<?php
//Данные для подключения
$db_hostname = 'localhost';
$db_database = 'passms';
$db_username = 'passms';
$db_password = '';
//Подключаемся к mysql серверу
$mysqli_connect = mysqli_connect($db_hostname, $db_username, $db_password, $db_database) or die("Не возможно подключится к MySql");

mysqli_query($mysqli_connect, 'SET NAMES utf8');
//Выбираем базу данных
//mysqli_select_db($db_server, $db_database) or die('Невозможно найти базу данных: ' . mysqli_error());
?>
[/code]

[b]delete.php[/b]
[code=php]
<?php
//Устанавливаем кодировку
header('Content-Type: text/html; charset=utf-8');

//Коннектимся с БД
require 'connect.php';

//Получаем Id СМС
$id = $_GET['id'];

//Выбираем СМС из БД
$result = mysqli_query("DELETE FROM inbox WHERE id=$id");
if ($result== true)
{
//header ('Location: ajax.php');

echo "Данные удалены успешно!";
echo "<br><a href='index.php'>НАЗАД</a>";
}
else
{
echo "Данные не удалены!";
echo "<br><a href='index.php'>НАЗАД</a>";
}
?>
[/code]

[b]gridsorter.js[/b]
[code=js]
function gridsorter(tableId) {
var grid = document.getElementById(tableId);
if (!grid) {
return;
}

var sort_direction;
var pre_cellIndex = -1;

grid.onclick = function(e) {
if (e.target.tagName != 'TH') return;

if (e.target.cellIndex == pre_cellIndex) {}
else
sort_direction = true;

pre_cellIndex = e.target.cellIndex;

var colNum = e.target.cellIndex;
var type = e.target.getAttribute('data-type');

var tbody = grid.getElementsByTagName('tbody')[0];
var rowsArray = [].slice.call(tbody.rows);
var compare;

switch (type) {
case 'number':
compare = function(rowA, rowB) {
if (sort_direction) return rowA.cells[colNum].innerHTML - rowB.cells[colNum].innerHTML
else
return rowB.cells[colNum].innerHTML - rowA.cells[colNum].innerHTML
};
break;
case 'string':
compare = function(rowA, rowB) {
if (sort_direction)
return rowA.cells[colNum].innerHTML > rowB.cells[colNum].innerHTML
else
return rowA.cells[colNum].innerHTML < rowB.cells[colNum].innerHTML
};
break;
}

rowsArray.sort(compare);
grid.removeChild(tbody);

for (var i = 0; i < rowsArray.length; i++) {
tbody.appendChild(rowsArray[i]);
}

grid.appendChild(tbody);
sort_direction = !sort_direction;
};
};
[/code]

[b]index.php[/b]
[code=php]
<?php
//Устанавливаем кодировку
header('Content-Type: text/html; charset=utf-8');

error_reporting(E_ALL);
ini_set("display_errors", 1);
//Конектимся с БД
require_once 'connect.php';
$connect = require_once 'connect.php';

//Заголовок
echo '<h1 align="center">Входящие SMS</h1>';

//Выбираем данные столбцов из таблицы inbox
$query = "SELECT id, number, smsdate, insertdate, text, phone, processed FROM inbox";
$result = mysqli_query($connect, $query);
if (!$result)
die('Ошибка при выполнении запроса: ' . mysqli_error());
else {
echo '<table border=1 width="100%" id="grid1">';
//Шапка таблицы
echo '<thead><tr align="center"><th data-type="string" style="cursor: pointer;">Отправитель</th><th data-type="string" style="cursor: pointer;">Дата поступления СМС</th><th data-type="string" style="cursor: pointer;">Дата загрузки СМС</th><th data-type="string" style="cursor: pointer;">Входящие СМС Сообщения</th><th data-type="string" style="cursor: pointer;">Телефон</th><th data-type="string" style="cursor: pointer;">Обработанный</th><th></th></tr></thead>';
echo '<tbody>';
$rows = mysqli_num_rows($result);
for ($i = 0; $i < $rows; ++$i) {
$current_row = mysqli_fetch_row($result);
echo '<tr>';
echo '<td>' . $current_row[1] . '</td>';
echo '<td>' . $current_row[2] . '</td>';
echo '<td>' . $current_row[3] . '</td>';
echo '<td>' . $current_row[4] . '</td>';
echo '<td>' . $current_row[5] . '</td>';
echo '<td>' . $current_row[6] . '</td>';
echo '<td>' . '<a onclick="return(confirm(\'Удалить СМС?\'))" href="delete.php?id='. $current_row[0] .'">Удалить</a></td>';
echo '</tr>';
}
echo '</tbody>';
echo '</table>';
}

//Заголовок
echo '<h1 align="center">Входящие multipart сообщения</h1>';

//Выбираем данные столбцов из таблицы multipartinbox
$query = "SELECT id, number, smsdate, insertdate, GROUP_CONCAT(text ORDER BY id DESC) , phone, processed, refnum, maxnum, curnum FROM multipartinbox GROUP BY refnum";
$result = mysqli_query($query);
if (!$result)
die('Ошибка при выполнении запроса: ' . mysqli_error());
else {
echo '<table border=1 width="100%" id="grid2">';
//Шапка таблцы
echo '<thead><tr align="center"><th data-type="string" style="cursor: pointer;">Отправитель</th><th data-type="string" style="cursor: pointer;">Дата поступления СМС</th><th data-type="string" style="cursor: pointer;">Дата загрузки СМС</th><th data-type="string" style="cursor: pointer;">Входящие СМС Сообщения</th><th data-type="string" style="cursor: pointer;">Телефон</th><th data-type="string" style="cursor: pointer;">Обработанный</th><th></th></tr></thead>';
echo '<tbody>';
$rows = mysqli_num_rows($result);
for ($i = 0; $i < $rows; ++$i) {
$current_row = mysqli_fetch_row($result);
echo '<tr>';
echo '<td>' . $current_row[1] . '</td>';
echo '<td>' . $current_row[2] . '</td>';
echo '<td>' . $current_row[3] . '</td>';
echo '<td>' . $current_row[4] . '</td>';
echo '<td>' . $current_row[5] . '</td>';
echo '<td>' . $current_row[6] . '</td>';
echo '<td>' . '<a onclick="return(confirm(\'Удалить СМС?\'))" href="delete.php?id='. $current_row[0] .'">Удалить</a></td>';
echo '</tr>';
}
echo '</tbody>';
echo '</table>';
}

//Заголовк
echo '<h1 align="center">Отправленные СМС</h1>';

//Выбираем данные столбцов из таблицы outbox
$query = "SELECT id, insertdate, number, phone, text, processed, error, not_after, not_before, processed_date, dreport FROM outbox";
$result = mysqli_query($query);
if (!$result)
die('Ошибка при выполнении запроса: ' . mysqli_error());
else {
echo '<table border=1 width="100%" id="grid3">';
//Шапка таблцы
echo '<thead><tr align="center"><th data-type="string" style="cursor: pointer;">Дата отправки СМС</th><th data-type="string" style="cursor: pointer;">Номер</th><th data-type="string" style="cursor: pointer;">Телефон</th><th data-type="string" style="cursor: pointer;">Текст СМС Сообщения</th><th data-type="string" style="cursor: pointer;">Обработанный</th><th data-type="string" style="cursor: pointer;">Ошибка</th><th></th></tr></thead>';
echo '<tbody>';
$rows = mysqli_num_rows($result);
for ($i = 0; $i < $rows; ++$i) {
$current_row = mysqli_fetch_row($result);
echo '<tr>';
echo '<td>' . $current_row[1] . '</td>';
echo '<td>' . $current_row[2] . '</td>';
echo '<td>' . $current_row[3] . '</td>';
echo '<td>' . $current_row[4] . '</td>';
echo '<td>' . $current_row[5] . '</td>';
echo '<td>' . $current_row[6] . '</td>';
echo '<td>' . '<a onclick="return(confirm(\'Удалить СМС?\'))" href="delete.php?id='. $current_row[0] .'">Удалить</a></td>';
echo '</tr>';
}
echo '</tbody>';
echo '</table>';
}
?>
<script src="gridsorter.js"></script>
<script>

gridsorter('grid1');
gridsorter('grid2');
gridsorter('grid3');
</script>
[/code]

Скачать [attachment=0]sms.zip[/attachment]
Вложения
sms.zip
sms.zip
(3.02 КБ) 10 скачиваний
sms.tables.mysql.zip
sms.tables.mysql.zip
(587 байт) 10 скачиваний
количество слов: 2216
Ответить Вложения 8 Пред. темаСлед. тема

Вернуться в «Установка Заббикс и Дополнений»