Наши партнеры

UnixForum






Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Тематический каталог -> Создание удобной рабочей среды в Linux

Отправка и прием SMS под Линуксом

Оригинал: Sending and Receiving SMS from your Linux Computer. Linux Gazette, #164
Автор: Suramya Tomar,
Дата публикации: июль 2009 г.
Перевод: С.Владимирский
Дата перевода: сентябрь 2009 г.

Что такое SMS? SMS - это сервис коротких сообщений, который используется для отправки текстовых посланий с одного сотового телефона GSM на другой. Но иногда вы бы хотели послать SMS-сообщение, используя ваш компьютер. Есть три способа, которыми вы можете послать SMS с компьютера:

  1. Использовать сервис SMS-шлюза, который позволяет вашему компьютеру соединиться с ним, используя API, и посылать сообщения. В Интернете существует огромное количество таких сервисов, но большинство из них не свободны и требуют оплаты.
  2. Использовать сотовый телефон или GPRS-модем, подключенный к компьютеру.
  3. Некоторые провайдеры позволяют отправлять SMS на номер телефона путем отправки почтового email-сообщения на специальный адрес электронной почты, обеспечивающий преобразование сообщения.

Я выбираю использование второго варианта, потому что мой провайдер не поддерживает последнюю опцию и, я думаю, это дешевле, чем первый вариант. Все, что вам необходимо, чтобы это работало, - это дополнительный телефон и дешевый тарифный план, что позволит вам отправлять и принимать SMS. В моем случае у меня был старый Sony Ericsson Т610, пылившийся в моем столе, так что я имел предоплаченную SIM-карту и был готов к действию.

Шаги перед установкой

Первое, что вы должны сделать, это подключить ваш сотовый телефон к вашему компьютеру. Я рекомендую использовать для этого Bluetooth, потому что в этом случает вам не нужно беспокоиться, хватит ли длины шнура, соединяющего телефон с компьютером. Если же ваш телефон не поддерживает Bluetooth, вы можете использовать соединительный USB-кабель.

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

Настроив телефон на автоматическое подключение без авторизации, мы готовы к дальнейшим действиям. Теперь для того, чтобы позволить вашему компьютеру общаться с вашим телефоном, вы должны будете установить на вашем компьютере драйвер модема для мобильных телефонов, называемый gnokii. Необходимые шаги для этого описаны ниже.

Установка gnokii

Для установки gnokii в системе Debian запустите следующие команды (как root):
apt-get install gnokii

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

Для установки из исходных кодов вам нужно будет загрузить последнюю версию gnokii с сайта проекта (http://www.gnokii.org/download/gnokii/).

Получив последнюю версию исходных кодов, мы можем установить их в нашей системе. Для того, чтобы это сделать, мы сначала должны раскрыть архив, выполнив следующую команду:

tar -zxf gnokii-0.6.27.tar.gz

Когда tar закончит раскрытие архива, перейдите в папку gnokii с помощью следующей команды:

cd gnokii-0.6.27/

Теперь, если вы подключаете ваш телефон к компьютеру с помощью Bluetooth, вам сначала будет необходимо установить библиотеку libbluetooth-dev с помощью следующей команды (от имени root-а):

apt-get install libbluetooth-dev

Когда библиотека установлена, вы можете настроить установщик gnokii, используя следующую команду:

./configure --with-bluetooth=/usr/include/bluetooth

Если вы не используете Bluetooth, вместо указанной команды вам необходимо будет использовать следующую команду:

./configure 

Когда настройка выполнена и вы не видите каких-либо ошибок, скомпилируйте gnokii с помощью следующей команды:

make

Если компиляция закончена без ошибок, установите gnokii посредством следующей команды (снова от root-а):

make install

После того, как gnokii установлена, вы должны будете настроить ее до того, как сможете начать использовать.

Настройка gnokii

Образец файла настройки для gnokii находится среди файлов исходных кодов в подпапке Docs/sample/ той папки, в которую вы развернули архив исходных файлов gnokii. Если вы установили gnokii с помощью apt-get, то образец файла настройки находится в папке /etc/gnokiirc.

Простейший способ настроить gnokii - изменить образец файла настройки. Для этого начнем с копирования образца файла настройки в вашу домашнюю папку с помощью следующей команды:

cp gnokii-0.6.27/Docs/sample/gnokiirc ~/.gnokiirc

и откроем файл в вашем любимом текстовом редакторе для его редактирования. Первое, что вы должны сделать, это сказать gnokii, какой телефон вы используете, путем установки переменной 'model' в соответствии с приведенными ниже указаниями:

  • Установить model = series40, если вы используете телефон Nokia, кроме серии Symbian Series60
  • Установить model = gnapplet, если у вас телефон Nokia Symbian Series60 до 3-ей версии
  • Установить model = AT для всех остальных моделей телефонов.

В моем случае я устанавливаю модель AT.

Далее вы должны сказать gnokii, каким образом ваш телефон подключается к компьютеру. Для этого вы должны будете изменить переменные 'connection', 'port' и 'rfcomm_channel'.

Если вы используете для соединения Bluetooth, установите для переменной соединения значение 'bluetooth', а для переменной порта значение адреса Bluetooth вашего телефона как показано ниже:

connection = bluetooth
port = 00:1e:3a:7e:a5:1f

В соответствии с руководством пользователя переменная 'rfcomm_channel' может быть опущена как автоопределяемая, однако я вынужден был выполнить настройку переменной во всех деталях, чтобы использовать gnokii для соединения.

Большинство телефонов используют переменную rfcomm_channel=1. Однако для моего Nokia N95 8GB я вынужден был установить значение '2', тогда как Sony Ericsson T610 использовал значение rfcomm_channel=1. Если вы не уверены, можете использовать команды 'sdptool search SP' или 'sdptool search DUN' или 'sdptool browse', чтобы найти правильный номер канала для вашего телефона.

Если вы для соединения используете USB, то имя соединения зависит от типа используемого вами соединительного кабеля и модели телефона. Некоторые из значений, которые вы можете попробовать подставить: 'connection = serial' для использования протокола AT и 'connection = dku2libusb' для использования протокола FBUS (если кабель и телефон поддерживают этот протокол).

Имя порта также зависит от типа кабеля: некоторые кабели создают /dev/ttyACM0, другие создают /dev/ttyUSB0. При использовании значения переменной connection = dku2libusb значение для port=1 устанавливает выбор для первого телефона, port=2 - для второго телефона и так далее. Для идентификации порта, к которому подключен телефон, смотрите /var/log/messages.

После того, как вы сделали изменения и сохранили файл настроек, вы готовы тестировать соединение.

Тестирование соединения gnokii с телефоном

В командной строке наберите следующую команду:

gnokii --identify

Если вы все установили корректно, то увидите выходной листинг для вашей модели телефона, аналогичный следующему:

suramya@Wyrm:~$ gnokii --identify
GNOKII Version 0.6.9
IMEI         : 35954XXXXXXXXXX
Manufacturer : Nokia
Model        : Nokia N95 8GB
Revision     : V06wk41v46.1

Если вы не видите этого листинга, значит, gnokii не смог подключиться к вашему телефону. Проверьте доступность вашего телефона для соединения Bluetooth, корректность указания модели, корректность адреса и протокола, по которым производится попытка соединения.

Если вы все еще не можете подключиться, вам следует включить режим отладки для gnokii путем установки флага 'debug = on' (без кавычек) в ~/.gnokiirc. Просмотр в режиме отладки позволит вам идентифицировать проблему и устранить ее.

Отправка SMS с вашего компьютера

Корректно настроив gnokii и получив выходной листинг как было показано выше, вы теперь готовы отправить SMS с вашего компьютера. Команда отправки SMS следующая:

	gnokii --sendsms destination_number

Эта команда использует контент со стандартного входа. Например, протокол отправки SMS на номер 555-123-4567 будет выглядеть следующим образом:

suramya@Wyrm:~$ gnokii --sendsms  5551234567
GNOKII Version 0.6.9
Please enter SMS text.
End your input with <cr><control-D>:This is a test message

Send succeeded!
suramya@Wyrm:~$

В переводе:

suramya@Wyrm:~$ gnokii --sendsms  5551234567
GNOKII, версия 0.6.9
Пожалуйста, введите текст SMS.
Завершите ввод с помощью <cr><control-D>:Это тестовое сообщение

Отправка успешно выполнена!
suramya@Wyrm:~$

gnokii может быть загружен с другими функциями. Используйте команду 'gnokii --help' для получения списка параметров и функциональности.

Теперь, когда вы имеете работающее соединение, вы ограничены только вашей фантазией, как вы можете это использовать. Я создал шлюз, который позволяет мне отправлять SMS путем отправки почтового сообщения на специально оформленный адрес электронной почты email. Далее эта программа описывается более подробно.

Отправка SMS с помощью специально оформленных email-сообщений

Чтобы отправлять SMS, когда я получаю специально оформленное email-сообщение, мне необходимо было написать программу, которая проверяет наличие новых сообщений email, а затем обрабатывает их. Для этого я использовал Perl, поскольку он превосходно подходит для обработки текста. Кроме того, я уже написал часть кода для другого проекта (отправка/прием IM как сособщений email).

Первое, что мне было нужно,- это новый email-аккаунт, к которому я мог бы иметь доступ через РОР3. Поскольку у меня есть свой домен, я вошел в панель управления моим доменом и создал новый email-адрес. Если хотите, вы можете использовать gmail.

В моей программе я полагаю, что номер телефона, на который я отправляю SMS, является темой отправленного email-сообщения, а содержание SMS - это фактическое содержание email-сообщения.

Код для подключения и загрузки email-сообщения прост:
    $pop3 = Net::POP3->new($ServerName);                # Connect to email server
       die "Couldn't log on to server" unless $pop3;

    $Num_Messages = $pop3->login($UserName, $Password); # Login to the server and get No of messages
      die "Couldn't log on to server" unless $pop3;

    $Messages = $pop3->list();                          # Get message list
     
    foreach $msg_id (keys(%$Messages))
    {
        $MsgContent = $pop3->top($msg_id, 40);
        ProcessEmail(@$MsgContent);
        $pop3->delete ($msg_id);
    }

В этом фрагменте кода мы подключаемся к почтовому серверу email, загружаем список новых email-сообщений, а затем загружаем каждое email-сообщение по кругу, обрабатываем его, а затем удаляем сообщение.

Вся обработка выполняется в функции ProcessEmail(). В этой функции мы сначала выделяем имя 'От кого'('From') из email-сообщения (оно добавляется в SMS, так что получатель SMS знает, кто его послал).

  my (@lines) = @_;
  my $body_start =FALSE;
  $sms_body = "";

  # Declare local variables
  my ($from, $line, $sms_to  );

  # Check each line in the header
  foreach $line (@lines)
  {
    if($line =~ m/^From: (.*)/)
    {
       # We found the "From" field, so let's get what we need
       $from = $1;
       $from =~ s/"|<.*>//g;
       $from = substr($from, 0, 39);				# This gives us the 'From' Name
   }

Получив поле 'От кого'('From'), мы выделяем тему из email-сообщения и проверяем, что это номер телефона (Этот номер может быть с префиксом '+' для обозначения кода страны). Если это не номер, мы игнорируем и удаляем email-сообщение. Листинг кода для этой операции показан ниже:

   elsif( $line =~ m/^Subject: (.*)/)
   {
       # We found the "Subject" field. This contains the No to send the SMS to.

       $sms_to   = $1;
       $sms_to = substr($sms_to, 0, 29);

       if ($sms_to =~ /^[+]?\d+$/ )   # here we check if the subject is a no. If so we proceed.
       {
           print "Got email. Subject is a number. Processing further\n";
       }
       else                           # Otherwise we delete the message and ignore it.
       {
            print "Got email. Subject is NOT a number. Ignoring it. \n";
            return;
       }
   }

Наконец, мы выделяем содержание из email-сообщения. Оно становится содержанием SMS-сообщения.

   # This is the last line in the email header; after this the body starts
   elsif(( $line =~ m/^Envelope-To:/)||($body_start eq TRUE)) 
   { 
	   if($body_start ne FALSE)
	   {
		   $sms_body = $sms_body . $line;
	   }

	   $body_start=TRUE;
   }

Теперь у нас есть все необходимые компоненты для отправки SMS: номер назначения, содержание SMS и адрес "От кого", так что мы готовы отправить SMS. Тем не менее, поскольку мы можем отправить в одном сообщении, как максимум, 160 знаков, перед отправкой SMS нам необходимо проверить, что содержание SMS умещается в 160 знаков.

  my @stringChunksArray = ($sms_body =~ m/(.{1,160})/gs);
  for($i=0;$i<@stringChunksArray;$i++)
  {
   # Start gnokii and wait for the SMS body
   open(GNOKII, "| gnokii --sendsms $sms_to") || die "Error starting gnokii failed: $!\n";
   print GNOKII $stringChunksArray[$i];      # Print the SMS body in 160 Char chunks
   close(GNOKII);
   # This is there so that the phone gets time to reset after each message;
   # otherwise the send fails
   sleep(10);
  }

Файлы исходных кодов программы Email2SMS доступны для скачивания.

Прием SMS-сообщений на вашем компьютере.

Возможность приема SMS на вашем компьютере зависит от модели телефона, который вы используете, поскольку gnokii поддерживает не все модели телефонов. Согласно информации на сайте проекта gnokii поддерживает большинство телефонов Nokia серий 3110/3180, 5110/6110, 7110/6210 и 6510/6310. К сожалению, поддержка АТ в телефонах серии Symbian OS сильно ограничена, так что на этих телефонах обеспечиваются только самые основные функции. Более детальная информация о поддержке телефонов доступна по на сайте проекта.

К моему прискорбию, я не смог прочитать SMS-сообщения с помощью gnokii с телефонов Nokia как серии N95, так и серии T610. Мне удалось организовать только отправку SMS-сообщений с этих телефонов.

Если ваш телефон поддерживается, вы можете прочитать SMS-сообщение на телефоне, используя следующую команду:

gnokii --getsms MemoryType Start [end]       

Тип памяти указывает gnokii, откуда считывать SMS-сообщение. Большинство телефонов поддерживают ограниченный подкласс типов памяти. Для получения списка поддерживаемых типов памяти используйте следующую команду:

gnokii --showsmsfolderstatus

Некоторые возможные значения:

  • ME: Internal Phone memory
  • SM: SIM card
  • MT: Combined ME and SIM phonebook
  • CB: Currently selected memory

Для считывания всех SMS из внутренней памяти телефонов на стандартный дисплей наберите следующую команду:

gnokii --getsms ME 1 end       

Другая интересная опция для считывания SMS: '--smsreader', которая обеспечивает ожидание входящих сообщений и сохранение их в почтовом ящике в папке /tmp/sms/* (фактическое имя файла может меняться). В этом случае сообщения никогда не сохраняются в телефоне.

Итоги

Теперь, когда у вас есть телефон, подключенный к вашему компьютеру, вы можете отправлять и получать SMS-сообщения с помощью компьютера, задавая определенные критерии для управления SMS, такие как входящие сообщения email, заслуживающие особого внимания, или когда назначается важная встреча. Вы можете сделать так, чтобы компьютер ждал сообщения, затем инициировал звонок на заданный номер и проиграл для телефона назначения звуковой файл. Все, чем вы сейчас ограничены,- это ваша фантазия и возможности вашего телефона.

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

Обратная связь: Обсудите эту статью с Ансвер Ганг


Биография автора (Suramya Tomar)

Я родился в 1980 году в небольшом госпитале военно-воздушных сил в городе Хашимара, Индия. Последующие 18 лет я провел в Индии, пройдя за это время двенадцатилетнее обучение в 7 школах.

Линукс я начал изучать в конце 1999г., когда друг дал мне инсталляционный CD-диск Redhat 7.1, а другой друг "пожертвовал" жесткий диск на 6ГБ. Это произошло сразу после того, как упал мой Windows 98 и я решил дать возможность выстрелить Линуксу. Я его испытал и почти сразу привязался к нему. Через два года я сделал апдейт на Redhat 7.3, но когда Redhat решил прекратить поддержку Redhat 7.3, я переключился на Debian и с тех пор чувствую себя счастливым.

Мне нравится много программировать и недавно я понял, как разобраться в неразберихе кодов, с помощью которых некоторые любят вызывать скрипты на Perl, и обнаружил, что мне это действительно нравится. Для интернет-сайтов я предпочитаю использовать РНР с СУБД MySQL. Я могу программировать на С, С++, VB, .NET. Мне также очень интересна компьютерная безопасность и искусственный интеллект. Я стараюсь как можно больше читать публикуемые здесь материалы.

Кроме работы за компьютером мне нравится читать (в основном фантастику и научно-популярную литературу, однако я читаю все что угодно, кроме романов и романтической литературы), слушать музыку (среди любимых певцов: Шаниа Тваин, Ин-Грид, Кристал Ватерс) и разбирать что-нибудь, чтобы посмотреть, как это работает.

Если вы действительно скучаете и хотите знать обо мне больше, посетите мой сайт в открытом доступе по адресу: http://www.suramya.com, где вы найдете больше информации обо мне, чем вы когда-либо хотели знать.



Средняя оценка 4 при 1 голосовавших