Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Приемы и технологии программирования Работаем с SMS


Информационный Канал Subscribe.Ru

http://www.mrblack.pp.ru
Приемы и технологии программирования #3

Работаем с SMS

В сети существует такой класс сервисов, которые дают пользователям возможность вызывать какие-либо функции, посылая SMSки на специальные номера и получая ответы также в SMSках. Например, вы можете зарегистрировать email-ящик для которого можно установить форвардинг входящего мыла на ваш телефон. Можно получать в реальном времени новости и участвовать в чатах. Можно с помощью SMS заказывать картинки и мелодии для своей мобилы. Наконец, можно участвовать в голосованиях. Некоторые ОпСоСы поддерживают такую услугу, когда за каждую отправленную юзером SMSку он платит не только ОпСоСу, но и владельцу сервиса, осуществляя оплату за услуги, чаще всего, виртуальные. Пользуясь телефоном, мы не придаем сопутствующему расходу денег такого значения, как при использовании WebMoney или при платежах через СберБанк. Возможности SMS дают широкий простор для электронного бизнеса. Многих привлекает заманчивая перспектива получать легкие деньги, когда ты только наблюдаешь на процессом и считаешь деньги, а работают за тебя скрипты на сервере. Я не ставлю цели составить руководство по новому виду "бизнеса для одного человека". В этой статье я изложу лишь техническую сторону проблемы автоматизированной обработки SMS.

Разные подходы

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

  • Только передавать SMS можно через формы на сайтах ОпСоСов или на каких-нибудь порталах. Это бесплатно. Так можно реализовать отправку SMS со своего портала, но для реализации платного сервиса, от которого юзеры ждут особой надежности, это несерьезно. О них много уже писалось, поэтому не буду заострять на них внимание, тем более, что все они в настоящее время защищены тестом Тьюринга, так что этот способ в настоящее время недоступен.
  • Специальные http-to-SMS шлюзы для бизнес-приложений. Ты платишь, и тебе дают возможность http-запросами из своих скриптов посылать SMSки в любую точку мира, а также получать SMS, отправленные на специальные номера. Так очень легко сделать портал с SMS-формой или уведомление о новых письмах.
  • Протокол SMPP дает возможность не только принимать и передавать SMS, но и получать уведомления о доставке отправленных сообщений, а также отменять и заменять сообщения. Тебе выделяется номер или целый диапазон номеров, ты получаешь все сообщения, приходащие на него и отправляешь сообщения от любого номера. Возможно уведомление о полученных сообщениях: SMS-центр подсоединяется на предварительно указанный IP и порт и передает тебе сообщения.

В этой статье я расскажу об SMPP как о самом продвинутом методе работы с SMS-шлюзами.

SMPP

С помощью этого протокола можно принимать и посылать SMS через так называемые SMS-центры. SMS-центры являются шлюзами между интернетом и сотовыми сетями.

Для работы с этим протоколом существуют готовые решения, например, Net::SMPP в Perl.

Описание протокола и ссылки на программные продукты можно найти по адресу www.smpp.org. Последняя версия протокола на момент написания статьи - 3.4. Там же можно скачать прогу для тестирования клиентского ПО - SMPP Client Test Tool (SCTT). Пока еще не купили доступ к реальному SMS-центру, надо как-то тестить свои проги. Неудобно только ко, что SCTT написана под Linux, так что придется повозиться с Virtual PC или сразу кодить под Linux.

Описание протокола

Инициировать соединение может как пользователь, называемый в описании протокола External Short Message Entity (ESME), так и SMS-центр (SMSC).

Заметим, что ввиду этой возможности было бы неправильно называть SMS-центр сервером, поскольку он может быть и клиентом.

Первый вариант используется, как правило, при отправке сообщений, а второй при получении, хотя никто не запрещает отправлять сообщения через соединение, установленное SMS-центром и получать через соединение, установленное тобой самим.

Все данные в протоколе SMPP вложены в блоках, называемых Protocol Data Units (PDU), которые имеют заголовок, в котором указан размер блока и код операции.

Формат PDU header:

DWORDLengthдлина всего блока, включая заголовок
DWORDCommandКод команды
DWORDStatus0 в запросах и код ошибки и ответах
DWORDSequenceNumberпорядковый номер

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

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

Все операции также делятся на те, которые могут использоваться ESME, которые могут использоваться SMSC и те, которые могут использоваться обеими сторонами.

Соединение может находиться в следующих состояниях:

  • Открыто (еще не пройдета аутентификация)
  • Передача
  • Прием
  • Прием и передача
  • Закрыто

В состоянии "Открыто", т. е. сразу после установления TCP-соединения ESME, желающий передать SMS, должен послать запрос bind_transmitter. Для приема - bind_receiver. Для обоих действий сразу - bind_transceiver. В этом запросе передается логин и пароль. Если соединение установлено SMSC, то сначала он должен послать запрос outbind и в нем передать логин и пароль, потому что в этой ситуации уже его права доступа надо проверять.

Для примера покажу, как выгладит команда bind_transmitter:

Заголовок
DWORDДлинаДлина может быть разной, поскольку в пакете есть строки
DWORDCommand= BIND_TRANSMITTER
DWORDStatus= 0
DWORDSequence number 
Данные
СтрокаЛогин 
СтрокаПароль 
СтрокаТип системынапример, WWW или Mail
BYTEВерсия протокола = 0x34
BYTEaddr_tonтип номеров, 0 = default
BYTEaddr_npiNumber Plan, 0 = default
СтрокаДиапазон номеровпустая строка, если провайдер и сам знает, какие номера мы обслуживаем

Строки - ASCIIZ, т. е. Null-terminated.

Большинство параметров этого запроса могут быть нулями или пустыми строками.

В ответ на такой запрос придет ответ, в котором кроме заголовка будет SystemId SMS-центра, а в поле Status будет ноль в случае успеха.

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

Завершив работу, посылаем сообщение unbind и отключаемся.

В большинстве запросов есть куча параметров, над которыми можно особо не париться и занулять их. Так что несмотря на внушительный объем документации, простенький SMS-автоответчик, на основе которого можно построить какую-нибудь справочную систему, получился у меня объемом всего в 25 кБ текста на C++, и тест на SCTT показал, что всё работает, и осталось только купить доступ к SMSC :).

К кому подключаться

Сообщения по протоколу SMPP для своих клиентов принимают многие ОпСоСы, так что никаких конкретных ссылок. Ищите инфу на сайте того ОпСоСа, к которым предпочетаете работать.

Кроме того, свой SMS-центр, работающий по протоколу SMPP, предоставляет уже известный по статьям в X Кликатель: читать тут _

2005-07-18

mr. Black <mrblack@pochta.ws>
Аська: 179497623
Сайт: http://www.mrblack.pp.ru/
Программа "Голосовая Почта"
Программа "Simple RAS Dialer"
Статьи о технологиях программирования

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.techn
Отписаться
Вспомнить пароль

В избранное