Модем будет использоваться марки 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 — консольная программа для работы с мобильными телефонами
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-системах, модем работать не будет.
Код: Выделить всё
lsusb
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
Код: Выделить всё
dmesg
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
Создаем конфиг gnokii.
Код: Выделить всё
nano /usr/local/share/zabbix/alertscripts/sms.conf
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
Это значит не нашлось файла по пути:
~/.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
проверяем от пользователя zabbix
Код: Выделить всё
su - zabbix -s /bin/bash
ls -l ~/.cache/gnokii/gnokii-errors
ls -l /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
Send succeeded with reference 105!
Дальше логинимся под пользователем zabbix и пишем очень простой скрипт.
Код: Выделить всё
nano /usr/local/share/zabbix/alertscripts/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"
Не забываем от рута сделать:
Код: Выделить всё
chmod +x /usr/local/share/zabbix/alertscripts/smsscript
Код: Выделить всё
/usr/local/share/zabbix/alertscripts/smsscript +79111111111 test
Send succeeded with reference 109!
Проверка отправки от пользователя zabbix
Код: Выделить всё
su - zabbix -s /bin/bash
/usr/local/share/zabbix/alertscripts/smsscript +79111111111 test2
Send succeeded with reference 18!
Если пришла sms — все практически готово! Осталось прикрутить к Zabbix-у.
Если не пришла, то проверяем, все ли сделали так как написано выше.
Код: Выделить всё
nano /usr/local/etc/zabbix_server.conf
AlertScriptsPath=/usr/local/share/zabbix/alertscripts
Если у вас не так, то либо меняем расположение скрипта, либо изменяем в конфиге путь на
/usr/local/share/zabbix/alertscripts — не забыть рестаратнуть zabbix server!
/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
Важно заметить, что данный скрипт работает с модемами фирмы "Мегафон”.
Для других операторов нужны свои данные: СМС с каким текстом и на какой номер отсылать (в примере посылается СМС с текстом "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 порту (данная плата не поддерживает отключение способ ниже не вышло)
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
Тут было много разных вариантов скриптов и т.п. так как тут я еще относительно только начинал работать с 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('"')])
Скачать СКРИПТ НА 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
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
Код: Выделить всё
#!/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
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, вы должны передать его в байты (закодировать его).
Еще ВАРИАНТЫ ПОПЫТОК
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
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=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