О Gammu, Wammu, sms шлюзе и управление компьютером через смс. Часть 2.

gammu wammuВ первой части статьи были написаны общие моменты как подключать телефон и работать с программой gammu, а вернее через ее GUI фронтенд wammu. В этой часте речь пойдет о программе, которая входит в состав gammu – это gammu-smsd.

Работа gammu-smsd

При запуске демон через определенные моменты времени опрашивает телефон для проверки в телефоне новых смс, а также следит за папкой (таблицей базы данных) отправки. Если в папке (таблице) появилась новое сообщение, то оно передается на телефон и отправляется. После отправки сообщение перемещаются в папку (таблицу) переданные. Вот такая синхронизация смс в реальном времени между телефоном и компьютером.

Работа gammu-smsd с папками сообщений

Создаем файл /etc/gammu-smsdrc со следующим содержимым. Порт и скорость меняем на свои.


[gammu]
port = /dev/ttyUSB0
connection = at115200
logformat = textall
[smsd]
Service = files
phoneid = t68i
TransmitFormat = unicode
LogFile = /var/log/gammu-smsd
debuglevel = 1
InboxPath = /var/spool/sms/inbox/
OutboxPath = /var/spool/sms/outbox/
SentSMSPath = /var/spool/sms/sent/
ErrorSMSPath = /var/spool/sms/error/

Назначение всех переменных этого файла можно посмотреть в man руководстве gammu-smsdrc. Для нашего файла конфигурации требуется создать папку sms в каталоге /var/spool и внутренние папки inbox, outbox, sent и error.
Можно запускать демон gammu-smsd от root или sudo


# gammu-smsd --daemon

После запуска сразу можно заглянуть в папку /var/spool/sms/inbox/, если в телефоне были входящие сообщения, то через несколько секунд они появятся в этой папке. Если что-то идет не так, то первым делом смотрим лог ошибок /var/log/gammu-smsd.
Название файла каждого сообщения выглядит примерно так


IN20100920_133357_00_+79219876543_00.txt

В название файла закодировано, что

  • IN – входящая смс
  • 20100920 – год, месяц, число получения смс
  • 133357 – часы, минуты, секунды получения смс
  • 00 – порядок сообщения ( на случай если в это время пришло несколько сообщений)
  • +79219876543 – номер отправителя
  • 00 – часть сообщения, если сообщение состоит из нескольких частей

На самом деле это не все возможные опции расшифровки названий текстовых файлов.  Про все опции обязательно читать файл man gammu-smsd-files. Из прочтения этого man файла вы должны усвоить, что простейший пример названия файла для отправки смс – это положить файл в папку outbox с названием


OUT+номер_телефона.txt

отправит содержимое этого файла по номеру телефона в названии файла и переместит файл в каталог sent. Если вы ошиблись в опциях или в параметрах названия файла, то такие сообщения попадают в папку error. Удаление файлов из этих папок соответственно удаляют сами сообщения из памяти телефона. Помните – содержимое папок, кроме папки error, это зеркальное отображение сообщений в папках самого телефона.

Работа gammu-smsd с базой данных для смс шлюза

Демон gammu-smsd может хранить сообщения в таких популярных базах данных как mysql, postgresql и всех базах поддерживающих libdbi. Работать напрямую с базой данных и таблицами входящих-исходящих сообщений достаточно трудоемкая задача, да и не нужно все это обычному пользователю. Существует открытый проект kalkun, который фактически можно использовать как смс шлюз. Для работы kalkun требуется, чтобы была установлена база данных, поддерживаемая gammu-smsd и сервер http с поддержкой php. Я использовал настройку связки apache+php+mysql и стратовые скрипты apache и mysql для запуска связки вместе с ОС.
Коннектимся к базе MySQL и создаем новую базу данных kalkun. Также создаем нового пользователя, пароль пользователя и выдаем ему права на новую базу данных.


create database kalkun;
GRANT ALL ON kalkun.* TO kalkun@localhost IDENTIFIED BY 'pass';
flush privileges;

Распаковываем kalkun проект в папку на сервер http. Редактируем файл в проекте kalkun/system/application/config/database.php, где меняем следующие строки на те, что вы задали в базе


$db['default']['hostname'] = "localhost";
$db['default']['username'] = "user_for_kalkun";
$db['default']['password'] = "pass_user_kalkun";
$db['default']['database'] = "name_database";
$db['default']['dbdriver'] = "mysql";

и соединяемся через web интерфейс – http://localhost/kalkun/. Если все зависимости и пароли верны, то для установки kalkun требуется всего несколько нажатий на кнопку вперед и удалить в конце папку install из проекта. После установки база данных kalkun должна наполниться необходимыми таблицами.
Принудительно наполнить таблицы можно через команду


mysql name_database - u user_for_kalkun -p < media/db/install.sql

Переходим к созданию конфига gammu-smsd. Создаем файл /etc/gammu-smsdrc со следующим содержимым, но только со своими данными 🙂


[gammu]
port=/dev/ttyUSB0
connection = at115200
name = T68i
model =
synchronizetime = yes
logfile = /var/log/gammu-smsd
logformat = textall
use_locking = yes
gammuloc = locfile
startinfo = yes
gammucoding = utf8
usephonedb = yes
number1 = 1234
[smsd]
service = MYSQL
PIN =.
debuglevel = 1
logfile = /var/log/gammu-smsd
phoneid = +79211234567
commtimeout = 30
sendtimeout = 30
receivefrequency = 0
checksecurity = 1
resetfrequency = 0
deliveryreport = no
deliveryreportdelay = 10
inboxformat = unicode
transmitformat = auto
outboxformat = detail
user = user_for_kalkun
password = pass
pc = localhost
database = name_database

От root или sudo запускаем демон gammu-smsd


# gammu-smsd --daemon

Опять соединяемся через web интерфейс к kalkun, пароль/логин по умолчанию – kalkun/kalkun. Через некоторое время статус в kalkun вверху страницы должен измениться на “Status: Connected”. Теперь можно наполнять адресную книгу контактами и заводить пользователей доступа к kalkun.
Синхронизация телефона происходит автоматически, и при поступлении новых сообщений они будут выделены жирным цветом в интерфейсе kalkun.

Статистика смс

Адресная книга

Отправленные сообщения сгруппированнные по отправителю

Для прямой отсылки смс минуя web интерфейс kalkun можно воспользоваться командой gammu-smsd-inject.


# gammu-smsd-inject TEXT +79211234567 -text "Text message"
Log filename is "/var/log/gammu-smsd"
Written message with ID 212

Примечание: При работе с базой данных у меня не получилось отправлять смс кириллицей. Наверное это было связано с разной кодировкой таблиц mysql и моей системной локалью.

Скрипт управления командами при получении смс

При использовании демона gammu-smsd как в работе с папками сообщений, так и в работе с базами данных можно написать скрипт обработки полученных сообщений. Как мне показалось, скрипт для просмотра и анализа папки файлов /var/spool/sms/inbox написать проще, чем для анализа базы данных.
Вот пример моего скрипта


#!/bin/bash

for file in `ls /var/spool/sms/inbox`
do

    for command in `cat /var/spool/sms/inbox/$file`
        do
          case "$command" in
             'nowuptime')
              priority=A
              echo `uptime` > /var/spool/sms/outbox/OUT${priority}_+79211234567_00.txt ;;
               'nowdate')
               priority=B
               echo `date` > /var/spool/sms/outbox/OUT${priority}_+79211234567_00.txt ;;
                esac
        done
done

rm -rf /var/spool/sms/inbox/*

В нем для примера показано действие двух команд. Например когда приходит смс и внутри тела смс есть слово “nowuptime” или/и “nowdate” то в ответ на эти команды будут сгенерированы специальные названия файлов на определенный номер с содержанием соответствующих команд. Скрипт модно поставить на ежеминутное выполнение в crontab.

В скриптах можно обыграть множество команд и ситуаций. Все дело за вашей фантазией или фантазией ваших шефов 🙂

UPD
Чтобы избежать повторных вопросов в комментариях, напишу немного подробней про скрипт управления компьютером через смс.

Итак создаем обычный текстовый файл, как показано в примере выше, и складываем в папку с ограниченным доступом. Я предпочитаю для скриптов пользователя root создать отдельный каталог bin, в папке root. В каталоге bin и скопируем наш текстовый файл. Я назвал свой файл sms-command
Делаем файл исполняемым:

sudo chmod +x ./sms-command

Теперь немного про структуру файла sms-command.
Во первых, в файле показан запуск консольных команд. Т.е. скрипт не будет запускать графические программы, которые взаимодействуют с графической оболочкой. Я не сказал, что запуск графических программ невозможен :), я просто не разбирался с этим. А вот запуск программ в режиме демона – это как раз то, для чего и задумывался данный скрипт.
Во-вторых. Смс текст отсылаемый компьютеру регистрозависимый. Т.е. набранные смс “Nowdate” и “nowdate” это разные команды для компьютера.
Ну и напоследок пример скрипта, для запуска демона transmission. Команда будет отрабатывать только, если отправитель прислал команду с номера телефона 9211234567.


#!/bin/bash

 for command in `cat /var/spool/sms/inbox/*9211234567*`
   do
     case "$command" in
       'torrent')
           priority=A
           #!!!!следующая 2 строки внутри скрипта пишите в одну строку!!!! 
           su mik -c '/usr/local/bin/transmission-daemon' && echo `ps aux| grep transmission 
           | grep -v grep`  > /var/spool/sms/outbox/OUT${priority}_+79211234567_00.txt ;;
     esac
    done

rm -rf /var/spool/sms/inbox/*

Теперь достаточно написать внутри смс команду “torrent” (без кавычек), как при очередном запуске cron сработает запуск transmission-daemon от пользователя mik. После успешного запуска в ответ на номер 9211234567 придет смс в которой будет PID запущенного процесса этого демона.

Строка в cron у меня такая, запуск каждую минуту.


#run sms spool
*/1 * * * * /root/bin/sms_command 1> /dev/null 2>&1

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

Запись опубликована в рубрике Gateway, Linux, Программы с метками , , , , , , , . Добавьте в закладки постоянную ссылку.

12 комментариев О Gammu, Wammu, sms шлюзе и управление компьютером через смс. Часть 2.

  1. flash2071 говорит:

    Не удалось победить получение и отправку символов кириллицы. Получаю и от меня получают что-то типа ???????? ???? ?????? вместо кириллицы. Пробовал в подставлять в TransmitFormat ‘auto’, ‘unicode’, ‘7bit’.
    Результата нет.

    • mik говорит:

      Я так понимаю это вы работаете через файлы-папки?
      Какая локаль а компе? Сейчас протестировал в системной локале KOI8-R на передачу и прием, проблем нет. Параметр TransmitFormat = unicode.
      7bit определенно не будет работать, т.к. надо 8bit кодировку для передачи кириллицы.

  2. Makleking говорит:

    to flash2071
    Создавай sms-сообщение с помощью gammu-smsd-inject, а внутри изменяй пункт Coding на Unicode_No_Compression
    получиться что-то типа такого:
    [SMSBackup000]
    ; Gateway работает.
    ; (System is working, all right!)
    PDU = Submit
    DateTime = 20110418T084525Z
    State = Sent
    Number = “Number = “N”
    NumberUnicode = 00380039003200340036003100390034003500390033
    Name = “Name = “”
    NameUnicode =
    Text00 = 00470061007400650077006100790020044004300431043E0442043004350442002E000A002800530079007300740065006D00200069007300200077006F0072006B0069006E0067002C00200061006C006C00200072006900670068007400210029
    Coding = Unicode_No_Compression
    Folder = 1
    Length = 49
    Class = -1
    ReplySMSC = False
    RejectDuplicates = False
    ReplaceMessage = 0
    MessageReference = 0

  3. Dima говорит:

    А у меня Gammu смс не отправляет по комманеде
    gammu-smsd-inject TEXT +79211234567 -text “Text message”
    Создает файл в папке out а затем перемещает в error.
    В логах ничего конкретного не пишит.
    Хотя при копировании в папку для отправки файла по формату OUT+71234567890.txt отправляет без проблем и даже рускоязычные слова!!!
    Не могу понять в чем причина.

    • mik говорит:

      скорее всего текст сообщения не попадает в базу данных. Я надеюсь что вы поняли что команда “gammu-smsd-inject” работает только при правильной настроенной базе данных и конфиге smsd для баз данных.
      Попробуйте заполнить соответствующие поля базы данных вручную чтобы послать смс. Я сейчас не могу подсказать какие, но там полей и таблиц не так много.

  4. Dima говорит:

    Понятно, т.е. эта команда предназначена только для совместной работы с базой данных.
    Меня заинтересовал “Скрипт управления командами при получении смс”.
    В какой папке нужно создать файл с текстом скрипта, как назвать этот файл?
    Как будет выглядеть скрипт если:
    при получении смс в /var/spool/sms/inbox с определенного номера 792812345678
    необходимо запустить программу ( например transmission %F -торрент клиент) или открыть какойто файл для просмотра (например /media/arhiv/test.avi)

  5. Dima говорит:

    Автозапуск при включении ПК
    gammu-smsd –daemon

    Чтобы запускался из под рута можно в файл /etc/rc.local поместить вот такую строчку
    Цитата:
    su -l root -c ‘gammu-smsd –daemon’ #где gammu-smsd –daemon команда запуска

  6. mik говорит:

    Да, команда «gammu-smsd-inject» только для работы с базой данных.

    Файл лучше всего создать в папке /root/bin. Каталог bin в первый раз создайте сами и в этот каталог складывайте скрипты, которые по причинам безопасности обычным пользователям лучше не видеть 🙂 Ну например вы захотите выключать компьютер через смс. Чтобы никто кроме суперпользователя не видел какой командой смс это делается.
    Название файла можно любое, только не забудьте назначить права на выполнение этому файлу.
    Далее хотел написать примерно как запускать transmission, но передумал 🙂 мой скрипт примитивный и носит чисто ознакомительный характер развивающий данную тему.
    Вот ссылка на более полные скрипты управления сервером
    http://habrahabr.ru/blogs/sysadm/114912/.
    Там не совсем про gammu отправку, но при желании переделать можно.
    Или у вас проблемы с программированием?

  7. Dima говорит:

    Дак вотожжж, я совсем недавно стал с Ubuntu знакомиться. А из азов программирования только QBasik из 10-11 класса средней школы… Поэтому столько вопросов….
    Именно поэтому для меня даже Ваш “примитивный” скрипт очень важен – как основа для дальнейшего изучения этой темы.

  8. Николай говорит:

    Доброго времени суток. Вопрос следующего характера- какой формат должен иметь файл для того чтобы воспользоваться функцией “Import from file” при отправке сообщений в kalkun? Заранее благодарен за ответ.

    • mik говорит:

      Если честно, то не знаю. Я kalkun когда писал статью посмотрел ради интереса, больше им не пользовался. Я даже не помню была там в версии 0.2 такая опция или это уже в следующих версиях появилось. Я вот что-то не помню про это ничего 🙁

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *