В сети существует такой класс сервисов,
которые дают пользователям возможность
вызывать какие-либо функции, посылая 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:

DWORD Length — длина всего блока, включая
заголовок
DWORD Command
DWORD Status — 0 в запросах и код ошибка и ответах
DWORD SequenceNumber — порядковый номер.

Порядковый номер в ответе должен
равняться номеру в запросе.

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

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

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

Заголовок:
DWORD Длина
DWORD Command = BIND_TRANSMITTER
DWORD Status = 0
DWORD Sequence number

Данные:
Строка Логин
Строка Пароль
Строка Тип системы (например, WWW или Mail)
BYTE Версия протокола = 0x34
BYTE addr_ton (тип номеров), 0 = default
BYTE addr_npi (Number Plan), 0 = default
Строка Диапазон номеров, пустая строка,
если провайдер и сам знает, какие номера мы
обслуживаем

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

Большинство параметров этого запроса
могут быть нулями или пустыми строками. В
ответ на такой запрос придет ответ, в
котором кроме заголовка будет SystemId SMS-центра,
а в поле Status будет ноль в случае успеха. Если
установлено соединение для передачи, то мы
имеем право посылать запросы submit_sm, а если
установлено соединение для приема, то надо
ждать запросов deliver_sm, содержащих тексты
поступивших сообщений, и обрабатывать их.
Завершив работу, посылаем сообщение unbind и
отключаемся. 

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

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

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

http://www.clickatell.com/brochure/products/api_smpp.php

Оставить мнение

Check Also

Энкодеры msfvenom. Разбираемся с кодированием боевой нагрузки при бинарной эксплуатации

Генерация полезной нагрузки — неотъемлемая часть эксплуатации. При использовании модулей M…