unix 2012-02-26 18-39-10
Отправка и прием SMS под Линуксом
Что такое 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, заслуживающие особого внимания, или когда назначается важная встреча. Вы можете сделать так, чтобы компьютер ждал сообщения, затем инициировал звонок на заданный номер и проиграл для телефона назначения звуковой файл. Все, чем вы сейчас ограничены,- это ваша фантазия и возможности вашего телефона.