Pull to refresh

Comments 18

Для udev можно написать скрипт, который при втыкании модема выполнит AT-команду на получение его IMEI к примеру и создаст симлинк.
Это точно приз за лучший технический дизайн системы.
А, я извиняюсь даже как-то неловко спрашивать, несколько китайских gsm модемов даже без серийников в одном линукс сервере у вас ДЛЯ НАДЕЖНОСТИ, если вдруг отвалится один сотовый оператор?
Судя по всему, к разным симкам привязаны разные банк-онлайны: один номер = один клиент.
на мой дилетантский взгляд проще было бы разрубать все опираясь на номера подтверждений. один-два номера, для надежности лучше два на двух разных машинах от двух разных операторов, и ориентироваться на код подтверждения.
ведь каждый код подтверждения все равно привязан к конкретной операции, какой смысл в разных номерах для этого???
Например, два разных бухгалтера могут одновременно выполнить 2 разные операции для разных организаций, у которых одинаковый банк. Какое сообщение какому бухгалтеру слать? Ведь в разных банках подробности sms-информирования разные. Не у всех может быть указан полный набор данных, который можно распарсить и понять к какой организации относится та или иная sms. Да и номер отправителя будет, в данном случае, одинаковый.
А по одному коду подтверждения ничего не скажешь (не определишь).
я наверное чего-то не понимаю, но мне абсолютно непонятна схема которую вы рисуете. ведь не будет же банк высылать клиенту запрос на код подтверждения и просить его выслать на какой-то третий левый номер? Если бы банк просил выслать код подтверждения, он бы просил выслать его себе.
Тут я так понимаю бухгалтера свои операции обрабатывают и чтобы подтвердить операции своих клиентов ожидают от них подтверждения на свои номера. Когда есть вся информация об операции, код ожидаемый от клиента привязан к этой операции однозначно. и на какой номер он придет ну совершенно все равно. придет — операция подтверждена, не придет — не подтверждена.
Насколько я понял, есть N бухгалтеров, обслуживающих М организаций. За каждой организацией закреплена SIM-карта, на которую банк шлёт SMS c кодами (например для подтверждения перевода). Все симки воткнуты в модемы где-то на сервере. Задача, которая тут решалась — передать SMS бухгалтеру, не отдавая ему SIM-карту.
Скорее для безопасности, чтобы не привязывать все банковские сервисы к одной sim-карте
транслирую лог файл на пять последних смс через веб страницу
$output = shell_exec('tail -n 30 /tmp/sms.log');
Может все же на 30? ;)

За статью спасибо. Интересное решение.
Предложения по улучшению кода
Первый скрипт. Нет нужны дважды вызывать ls, в некоторых случаях может получиться так, что они вернут разные результаты (например, перед вызовом первого было 4 модема, а перед вызовом второго, один из них отвалился). Я бы этот код...
num=`ls /dev/ttyUSB* | awk -F tty '{print $2}' | awk -F USB '{print $2}' | awk 'BEGIN { ORS = " " } { print }' | sed 's/.$//'`
devlist=`ls /dev/ttyUSB* | awk -F tty '{print $2}' | awk 'BEGIN { ORS = "," } { print }' | sed 's/.$//'`

… заменил на
devlist=`ls /dev/ttyUSB* | awk -F tty '{print $2}' | awk 'BEGIN { ORS = "," } { print }' | sed 's/.$//'`
num=`echo "$devlist" | sed -e 's/USB//g;s/,/ /g'`

Второй скрипт. Зачем использовать case там, где место для if и наоборот? Т.е. вот этот код...
case "$1" in
  RECEIVED)
    if [ $imsi = 250014712255725 ]; then
       name="Иванов"
    fi
    if [ $imsi = 250014712342902 ]; then
       name="Петров"
    fi
    if [ $imsi = 250014712553982 ]; then
       name="Сидоров"
    fi
    if [ $imsi = 250014710661053 ]; then
       name="Яшин"
    fi
    # ТУТ ТОЖЕ БЫЛ КОД, НО УБРАЛ ЕГО, ДЛЯ КРАТКОСТИ
    ;;
esac

… на мой взгляд, лучше сделать так:
if [ "$1" = "RECEIVED" ] ; then
    case "$imsi" in
        250014712255725) name="Иванов" ;;
        250014712342902) name="Петров" ;;
        250014712553982) name="Сидоров" ;;
        250014710661053) name="Яшин" ;;
    esac
    # ТУТ ТОЖЕ БЫЛ КОД, НО УБРАЛ ЕГО, ДЛЯ КРАТКОСТИ
fi

Так он и короче и читается легче.
Заметил еще одно… Вот такое решение...
if grep "Alphabet: UCS2" $file >/dev/null; then

… из моей практики, не всегда отрабатывает верно. Поэтому я делаю так:
grep "Alphabet: UCS2" $file >/dev/null
if [$? -eq 0] ; then
вместо >/dev/null есть ключ -q у grep
Ребята, всем спасибо за комментарии, особенно за рекомендации по башу. Такие модемы достались мне в наследство от предыдущего админа. Куча ИП обслуживает один бухгалтер, для каждого ИП своя симка.
Можно с помощью udev задать каждому модему своё имя в зависимости от порта USB и не придётся мучиться с генерацией конфига каждый раз. Единственное, нельзя будет менять местами модемы
К сожалению модемы имеют свойство подвисать. Переткнул и всё, нумерация сбилась.
Но ведь номер порта не изменится при передёргивании модема? Или непременно надо перевставить в другой порт?
При обновлении ядра нумерация сбивается запросто. При переключении режима модема с помощью usb_modeswitch нумерация тоже может сбиться. У меня были как-то два модема, huawei и zte, так вот они друг друга не уважали так что при переключении режима одного (при втыкании) отваливался и заново обнаруживался второй.
Следуя рекомендациям товарищей немного оптимизировал скрипт обработки сообщений.
#!/bin/sh
status="$1"
file="$2"
imsi=`head -12 $file | grep -e "IMSI: " | awk -F" " '{print $2}'`
from=`head -n 12 $file | grep -e "From:"`
sent=`head -n 12 $file | grep -e "Sent:"`
rec=`head -n 12 $file | grep -e "Received:"`
message=`tail -n +13 $file | iconv -f UCS-2BE -t UTF-8`
utf_mes=`tail -n +13 $file`
 
if [ "$1" = "RECEIVED" ] ; then
    case "$imsi" in
        250014712255725) name="Иванов" ;;
        250014712342902) name="Петров" ;;
        250014712553982) name="Сидоров" ;;
        250014710661053) name="Яшин" ;;
    esac
    if grep "Alphabet: UCS2" $file >/dev/null; then
       echo "\n"$from"\n"$sent"\n"$rec"\n"$name"\n"$message >>/tmp/sms.log
#Раскомментируйте следующую строку для пересылки sms на почту
#      echo "\n"$from"\n"$sent"\n"$rec"\n"$name"\n"$message | mutt -x -s "$name" x@mail.ru
    else
       echo "\n"$from"\n"$sent"\n"$rec"\n"$name"\n"$utf_mes >>/tmp/sms.log
#Раскомментируйте следующую строку для пересылки sms на почту
#      echo "\n"$from"\n"$sent"\n"$rec"\n"$name"\n"$utf_mes | mutt -x -s "$name" x@mail.ru
    fi
    ;;
fi

В данном случае запись в файл /tmp/sms.log просиходит один раз для каждой смс, что избавляет нас от возможных проблем со смешением текста разных сообщений при одновременном приёме с нескольких модемов. Да и операций обращения к файловой системе становится меньше.
Sign up to leave a comment.

Articles