Monday, July 9, 2007

README

Собственно, вот и оБубликовал. Процесс занял примерно 3 часа чистого времени, с правкой, постингом картинок, etc. Заодним вспомнил о существовании UUE. Надеюсь, оцените.
Читать следует "с конца-в-начало", чтобы слвсем "по-блоггерски" получилось.
Что сказать... I got a fun!... чего и Вам желаю. Будут комментарии -- не стесняйтесь!

Выше, дальше, сильнее.

Это все про SMS?

Предыдущую статью следует считать некоей точкой в повествовании об SMS. Была еще мысль сделать -- небольшой на пару статей -- обзор остальных протоколов, но потом я от нее отказался по двум причинам. Во-первых, такой обзор получиться бы мог весьма скомканным. А во-вторых, работа с различными протоколами, _по_сути_, одинакова (бес, как известно, в деталях :). Думается, что ознакомившись с предыдущими статьями, читатель сможет построить клиента, способного отсылать и принимать _текстовые_ короткие сообщения по спецификациям любого протокола. Что же дальше? Хороший вопрос, и не менее хороший ответ: а, собственно, дальше и начнется рассмотрение технологий используемых в _современных_ сервисах. Я имею ввиду технологии EMS/MMS, принимающие статус отраслевых стандартов, и корпоративные технологии доставки rich media контента на мобильные устройства, то есть то что относится к так называемым сетям 2.5G. Но сначала, для того, чтобы "закруглить тему" поговорим еще немного о тексте.

Кодировка.

Часто (точнее -- всегда) недостаточно передавать только латинский текст, да и передача собственно "иностранных" сообщений, содержащих специальные символы требует некоторых дополнительных усилий. Таким образом вполне закономерно теперь поговорить о кодировке текста в сообщениях.

Видимо не секрет для читателей, уже разбиравшихся с протоколами SMS, что в мобильной сети сообщения большей частью передаются в так называемой кодировке GSM. Это семибитная кодировка -- каждый передаваемый символ предатавляется 7-ю старшими битами октета, младший бит относится уже к следующему символу. В следующем октете "отсекаются" уже два бита, и так далее, до тех пор, пока на 8-м октете символы опять не выровняются на границе. Не Бог весть какое сжатие, но позволяет сэкономить каждый восьмой октет, или, другими словами, впихнуть в 140 октетов пресловутые 160 символов. Приведем таблицу кодировки GSM (в сравнении с IA5):



Кодировка GSM.

Выбор кодировки осуществляется полем data_coding в submit_sm, о котором писано уже парой статей выше. Таким образом, при выборе кодировки 0x0, (SMSC default alphabet) можно надеятся, что центр воспримет текст сообщения именно в стандартной кодировке GSM.

Вообще говоря кодировке сообщений посвящен документ GSM 03.38, в котором возможные значания параметра data_coding (DCS -- data coding scheme) рассмотрены весьма подробно. Посмотрим и мы на них, так как этим параметром регулируется еще одна вещь: так называемый класс сообщения.

Класс сообщения.

Класс сообщения является своего рода "указанием" для принимающей стороны (SME, или мобильного терминала), как с этим сообщением поступить (в основном это, разумеется, относится к Mobile Terminated -- MT -- "предназначенным для мобильного устройства" сообщениям). Приняв сообщение, устройство может поступить с ним следующим образом:

  • Немедленно отобразить. (Class 0)
  • Записать в память устройства. (Class 1)
  • Записать в память SIM-карты. (Class 2)
  • Передать на терминальное устройство. (Class 3)

Сообщения класса 3 описаны в GSM TS 07.05 и здесь мы не будем на них останавливаться. С остальными классами, надеюсь, все ясно без комментариев. Можно только добавить, что сообщения 0-го класса называются также "Flash messages" и могут быть потеряны сразу же после прочтения.

Спецификация DCS.

А теперь приведем, наконец, описание DCS из GSM 03.38.


Биты 7..4 (Coding Group Bits) Значение битов 3..0
00xx

Если бит 5 не установлен, то текст считается не сжатым, в противном случае используется стандартное сжатие GSM (в GSM 03.38 не описано).

Если бит 4 не установлен, считается, что биты 1 и 0 не несут смысловой нагрузки и зарезервированы, в противном случае биты 1 и 0 указывают на класс сообщения:
Бит 1 Бит 0 Значение
0 0 Class 0
0 1 Class 1
1 0 Class 2
1 1 Class 3

Биты 3 и 2 указывают на алфавит:
Бит 3 Бит 2 Значение
0 0 Default alphabet (7 bit)
0 1 8 bit
1 0 UCS 2 (16 bit) -- Unicode
1 1 Зарезервировано

Частный случай DCS = 0x0 -- 0000 0000(bin) -- означает Default alphabet с неуказанным классом.
0100..1011 Зарезервировано
1100,1101,1110 Эти группы используются, когда, наряду с передачей текста, пользователя необходимо уведомить о том, что на его адрес получены сообщения других типов (Message Waiting Indication group), напрмер сообщения Voice Mail, FAX, E-Mail или сообщение другого типа. Аппарат может уведомить пользователя с помощью иконки на экране (индикатора) или другим способом. При этом:
  • Группа 1100 предписывает аппарату просто изменить состояние индикатора, не сохраняя при этом собственно текст SM
  • Группа 1101 предписывает изменить состояние индикатора и сохранить текст SM. Текст имеет кодировку Default alphabet.
  • Группа 1101 предписывает изменить состояние индикатора и сохранить текст SM. Текст имеет кодировку UCS2 -- Unicode.

Бит 3 при этом может принимать значения:
  • 0 - отключить индикатор
  • 1 - включить индикатор

Биты 1 и 0 указывают на тип ожидающего сообщения:
Бит 1 Бит 0 Значение
0 0 Voice Mail
0 1 FAX
1 0 E-Mail
1 1 Другое
1111 Бит 3 не используется и устанавливается в 0.
Бит 2 указывает кодировку и может принимать значения:
  • 0 - Default alphabet.
  • 1 - 8 bit.

Биты 1 и 0 указывают на класс сообщения.
Бит 1 Бит 0 Значение
0 0 Class 0
0 1 Class 1
1 0 Class 2
1 1 Class 3

Принимая во внимание вышесказанное приведем примеры: для передачи Flash сообщения, содержащего русское "Привет от Иванова!" нужно использовать DCS = 0x18, а для передачи двоичных данных (напрмер -- тех же картинок и мелодий) используется DCS=0xF5.

Заключение.

Вот мы и подошли вплотную к передаче rich media. Следующая статья будет посвящена передаче мелодий, логотипов, графики (точнее, с нее начнется обсуждение этих вопросов). Это еще не совсем 2.5G, но уже и не просто текст. Оставайтесь с нами!

SMS-приложение. Часть 5. "Разбор полетов"

Вопросы наших читателей.

Меня вот спросили: "А почему это Вы себя во множественном числе именуете?". Отвечаю: это не то что вы подумали (хотя, может и стоит у психоаналитика проконсультироваться на предмет мании величия ;), а издержки опыта "научнописания". В статьях считается хорошим тоном писать во множественном числе, имея ввиду коллектив авторов. Так и тут, предполагалось, что данный цикл я буду вести не в одиночку, посему и задан такой "околонаучный" тон. Однако так выходит, что заниматься этим мне приходится в "единственном числе", посему, принимая во внимание данное замечание, в дальнейшем обязуюсь повествовать от собственного лица (другого не имею :) пока-таки не появятся помощники.

Что же такое ESME?

В данной статье мы (с Вами :) побеседуем о том, как на самом деле устроены эти так называемые ESME и для чего, собственно, они предназначены. Вообще говоря, это нужно было бы сказать с самого начала, но я решил, что сначала неплохо дать читателю (т. е. Вам) присмотреться, а уж потом "делать строгое лицо". Итак, казалось бы чего проще -- подцепил к COM-порту радиопад, типа SIEMENS, и вещай себе прямо в эфир (по сути, такая конструкция эквивалентна "домашнему" сервис центру). В некоторых случаях подобный "агрегат" представляется приемлемой альтернативой, пока речь не заходит об интенсивности траффика. Именно при построении "профессиональных" сервисов, рассчитанных на охват большой аудитории, ESME и будет являться компонентой сервисных систем.

Так что же такое ESME? Для того, чтобы строго ответить на этот вопрос придется обратиться к известной OSI/ISO модели (рис. 1).




Рис. 1. Модель OSI

Ниже приведена таблица, показывающая, как на ней "размещается" ESME. Для примера приведены стэки протоколов для Microsoft Networking и регулярного TCP/IP приложения, например почтового клиента. Мы, по-прежнему, обсуждаем ESME, связывающееся с сервис центром по протоколу TCP/IP.
OSI
Layer
Microsoft
Networking
TCP/IP
Internet
ESME OSI
Protocols
Application
Layer 7
Application Programs and Protocols
for file transfer, electronic mail, DB connectivity, etc.
Presentation
Layer 6
Server
Message
Block
(SMB)
(Telnet, FTP,
SMTP, etc.)
Protocol packet
composing/parsing
module
(for example SMPP)
ISO
8823
Session
Layer 5
Network Basic
Input/Output
System
(NetBIOS)
Session management
module,
internal buffers
management module
ISO
8327
Transport
Layer 4
Network
Basic Extended
User Interface
(NetBEUI)
Transmission
Control Protocol (TCP),
Unacknowledged
Datagram Protocol (UDP)
Transmission
Control Protocol (TCP),
Unacknowledged
Datagram Protocol (UDP)
ISO
8073
TP0-4
Network
Layer 3
Internet
Protocol
(IP)
Internet
Protocol
(IP)
ISO
8473
(CLNP)
Data Link
Layer 2
Network Interface Cards: Ethernet, Token-Ring, ARCNET, StarLAN, LocalTalk, FDDI, ATM, etc.
NIC Drivers: Open Datalink Interface (ODI), Network Independent Interface Specification (NDIS)
Physical
Layer 1
Transmission Media:
Twisted Pair, Coax, Fiber Optic, Wireless Media, etc.

Теперь видно, что собственно ESME занимает то же положение на стэке, что и регулярный TCP/IP клиент. Правда, если ESME не оформлено в виде библиотеки, оно может простираться и на самый верхний -- седьмой -- уровень. Таким образом, самым верхним подлежащим уровнем для ESME будет реализация TCP/IP стэка операционной системы, что мы собственно и видели. К слову, сама программа (библиотека) может быть и не так жестко разбита на "слои", но здесь я явно их выделил. Давайте обсудим эти уровни по отдельности.

  • Session layer предназначен для решения задач, не относящихся собственно к передаче данных. В этот круг задач могут входить аутентификация сторон, восстановление физических или логических соединений, организация двунаправленных потоков (bidirectional traffic), token management, синхронизация и пр.
  • Presentation layer отвечает за преобразование данных.

Общая структура dumb_esme представлена на картинке:



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

Session layer.

В нашем простом примере этот уровень не представлен со всей фундаментальной четкостью, часть функций (в т. ч. решение о закрытии соединений) делегирована основной функции (main), а восстановление соединений и поддержание внутренних циклических (FIFO) буферов и вовсе опущено. В реальных проектах приходится организовывать такие "очереди октетов" по той причине, что (в отличие от X.25) TCP/IP не гарантирует что одним вызовом recv мы получим ровно один отправленный протокольный пакет и целиком. Типичная ситуация, проявляющаяся в частности при больших загрузках: за один вызов recv приходит два целых пакета и "кусок" третьего. Разумеется, в связи с гарантированной доставкой данных по TCP-каналу, недостающий "кусок" будет получен следующим вызовом, но, возможно, еще с чем-то "на хвосте". Ситуацию, как я уже сказал, решают созданием FIFO буфера: модуль, непосредственно оперирующий сокетом, пишет в "хвост" такого буфера, а вышестоящий модуль, "откусывает помаленьку" с "головы". Кроме того, в протоколе SMPP, в отличие, скажем, от EMI или SIMD, не предусмотрены маркеры начала и конца пакета, так что при возникновении "мусора" в канале "ловля" начала следующего неиспорченного пакета превращается в серьезную (вообще говоря -- неразрешимую) проблему и проще переустановить соединение, сбросив буфер. Вообще говоря, достаточно в заголовке пакета указать неверную длину, чтобы вывести канал из строя.

В нашем простом примере проблема частично решена путем обработки входящих пакетов "в два удара": сначала обрабатывается заголовок пакета (длина которого строго фиксирована), а потом принимается из канала ровно столько октетов, сколько указано в заголовке. К слову, и при работе со внутренним буфером также приходится сначала обрабатывать заголовок, ибо именно в нем указан тип команды. Возвращаясь к модели OSI отметим, что все же многие функции обсуждаемого уровня инкапсулированы в нашем примере в двух классах.

class connector

Это простая классовая оболочка вокруг системной реализации протокола TCP/IP, именно он оперирует непосредственно с сокетом. В реальном проекте, скорее всего, здесь был бы реализован буфер FIFO. Интересной задачей могла бы являться реализация данного класса как наследника basic_iostream из стандартной библиотеки, что нибудь наподобие sockstream...

class smpp_connector

Наследник класса connector, выполняющий большинство функций, характерных для Session Layer, как то: аутентификацию (посредством SMPP bind), разбор и проверку заголовков пакетов, поддерживает внутреннюю нумерацию команд SMPP. Обращаясь к реальным проектам, следует сказать, что этот класс -- самое место для управления восстановлением соединения для ESME работающих в непрерывном (ждущем) режиме. Стоит также заметить, что есть все основания задуматься о вынесении функциональности данного класса в отдельный поток исполнения (thread).

Presentation layer.

Представлен двумя классами transmitter и receiver. Как явствует из названия, эти классы (будучи оба наследниками класса smpp_connector) инкапсулируют особенности сессий в состояниях BOUND_TX и BOUND_RX, занимаются распаковкой и упаковкой пакетов (я говорю пакеты, подразумевая, конечно же PDU) и переправляют их "вверх" приложению и "вниз" -- в сокет. Интерфейс с приложением поддерживается с помощью двух структур данных: message, являющейся абстракцией как для входящего, так и для исходящего сообщений, и status_info, отображающей факт изменения состояния сообщения (принято/не принято, доведено/не доведено).

Заключение.

Вот, собственно, и вся реализация протокола. Остальные классы, вошедшие в проект являются вспомогательными, их суть видна из названий (и откомментирована в коде).

Надеюсь, данным циклом статей, не затрагивающим, как я уже сказал, все "интересные" вопросы мне удалось показать технику написания такого класса приложений. Я старался обсудить наиболее общие вопросы, не привязываясь к определенной платформе и не "отступая далеко" от реальных проектов, в создании которых мне удалось принять участие (один из таких, кстати, оправдывая описанный подход, в настоящее время трудится в непрерывном режиме, пропуская в пиках до 5 млн. сообщений в сутки).

Что же "осталось за скобками"? Да довольно многое. Мы никак не обсудили передачу двоичных данных (графики, мелодий), сосредоточившись на SMPP, оставили без внмания другие протоколы, не коснулись интересных особенностей программирования под конкретные OS. Честно говоря, я не могу сейчас сказать, чем будет продолжен этот цикл статей, посему, это отличный повод для аудитории сделать заявки. Надеюсь на вашу активность.

SMS-приложение. Часть 4. Но не последняя...

И ни в чем себе не отказывать...

Наконец-то (с заметным перерывом), нам удалось выпустить следующую статью цикла. Собственно, как мы и обещали, она содержит код простого, но работающего SMS приложения (для нетерпеливых: брать тут (см. заголовок ;) ).

Некоторые детали.

Собственно, задержка обусловлена еще и тем, что мы достаточно долго решали, а насколько простым должно быть это приложение. С одной стороны, это не продукт, а нечто, что можно написать и отладить за пару дней и за столько же "разобрать" и осознать. Но, с другой, хотелось показать основные "подводные камни", с которыми приходится сталкиваться в реальных проектах. Как кажется, разумный компромисс найти удалось.

Что с этим делать.

Архив (в формате tar) содержит исходные файлы на C++ (содержащие, надеемся, достаточные комментарии); файлы окружения (.dsw) и проекта (.dsp) для MS VC 6 -- в каталоге MSVC6. Под *NIX (тестировался на Linux RH 6.2, если кто возьмет на себя труд собрать и потестировать на другой *NIX платформе -- будем благодарны за комментарии; фактически, должно работать на любой... но, как обычно -- as is) же проект собирается обычным образом:


$./configure
$make
Инсталлировать не надо -- надо положить рядышком конфигурационный файл. Вот пример такого файла:
# This is a dumb_esme configuration file

# Host and port
host=192.168.0.5
port=8200

# Bound parameters
system_id=System ID
password=the password
system_type=Dumb ESME

# Lifetime in seconds
lifetime=60

# Time delay for select operation seconds...
tv_sec=0
# ...and microseconds
tv_usec=100000
# i. e. 0.1 sec

Где брать эмулятор SMSC.

В googl'е наберите 'SMSC emulator'. Мы же тестировали на "внутреннем" эмуляторе и на реальном SMSC (поверьте на слово -- отправляет и принимает).

Как это работает.

Само приложение совсем простое: будучи запущенным, оно "висит" указанное количество времени (параметр "lifetime" в конфигурационном файле), открывая два соединения к центру (transmitter и receiver). Receiver принимает все, что успевает за это время (не забывая отвечать ACK-ами) и "складывает" принятое в файл с именем "inbox", а transmitter отправляет все, что смог прочитать из файла "outbox". Вот пример формата файла "outbox":


1234 1 1 9672345 1 1 9872345 Message text

  • Первая группа цифр -- идентификатор сообщения, присваиваемый пользователем, ни для кого, кроме него он значения не имеет (и никуда не передается), но служит для связи ответов SMSC с исходными сообщениями.
  • Далее, через пробел, TON, NPI и адрес оригинатора (т. к. ESME, в принципе, может обслуживать как отдельный номер, так и диапазон, или набор), т. е. адрес ESME.
  • То же для получателя.
  • Все остальное до конца строки -- текст сообщения. Проверка на длину, кстати, для простоты, опущена (как и многие другие проверки, в т. ч. на длину адресов).

После обработки "outbox" переименовывается. Далее, по приходу ACK'а заносится запись в файл "sent" (в случае, если код ACK'а рапортует положительный статус) или, в обратном случае, в файл "err". В файл "sent" помешается строчка, содержащая упомянутый пользовательский идентификатор и идентификатор, присваиваемый центром. В файл "err" -- только пользовательский. По приходу же delivery receipt'а (status report'а) в файл "deliv" помещается строчка с идентификатором сообщения, выданный центром, если, опять же, в рапорте сообщается об успешном доведении, и, в обратном случае, такая же запись помещается в файл "undeliv".

Такой механизм работы позволяет связать исходное сообщение с ответами центра. Действительно, не сложно написать приложение (а, фактически, с этим может справиться несложный скрипт) для анализа полученных файлов. На практике же, обычно "входом" и "выходом" часто является некая база данных, но механизм связывания остается примерно тем же. Это то, что мы между собой называем "чехордой идентификаторов" :). Но подробнее об этом в следующей статье.

Заключение.

Подробный "разбор полетов" будет в следующей статье. А пока можно просто проанализировать код и, кому удастся, потестировать приложение. Мы, к слову, ввиду недостатка времени, тестировали не очень интенсивно, так что bug-report'ы направляйте в форум ;). Тем не менее, на стенде этот простенький (dumb!) SMS client показал устойчивую работу при нагрузках порядка 100 mess/sec в обоих каналах, что явилось некоторой неожиданностью. Для тех же, кто дочитал до конца, еще раз ссылка:

Dowload SMSC client sources (tarball ~45 Kb )

dumb_esme

А вот и способ борьбы с отсутствием возможности прикреплять файлы :).

Давным-давно, когда компьютеры были большими, а диски маленькими, придуман был формат 
UUE. Внизу -- примерчик. Для распаковки просто скопируйте все, что между линиями,
в буфер обмена и вставьте в текстовый файл dumb_esme-0.1.tar.gz.uue


Под Windows файл с расширением .uue открывают WinRAR, WinZip, 7-Zip etc.
Под *NIX следует выполнить:
$ uudecode -o dumb_esme-0.1.tar.gz dumb_esme-0.1.tar.gz.uue

UPD: По просьбам трудящихся перезалил в base64.

-------------------------------------------------------------------------------------

H4sIABps4TsAA+w8aXPbRpb5qq79ER2FNRKzJHVZ1phapUhTlM2NJKpIKrE3nqJBoEliBQIcHKKZ
zfz3fe/1gQYPH7OOZysxq2w1+nj97ve60Q0vm42GIpmJ6mHt6OCb3+V3ePjk8OzsFP4eHp49lX/h
p//K8tnJ2eHx09Ozo+NvDo+OTw+ffsNPfx90ir8sSZ2Y828eHM95iB639oujKP0S+Hzhn1eQ/43z
IMZ+IGp++BnnODw6PHz69MkW+R+fHj890/J/cnyI8n9yenr6DT/8jDhs/f3J5f8dt2TOJyIUsZMK
jztZGs2c1HedIFjy0VJVPAh+VHvCx3E0ywc6M8a+461ovoz9yTTl+60yP3r27EkF/z+t/pX+PuNX
sRC8H43ThRMLfhVloQcTRGGFd0K3BhAGUz8poAOPYxyUqEHnPJ2KrXAAwsR/FAnPwsCf+UjFXMQz
P0mgkacRdwFD7oTeQRRzz0/S2B9lqeB+WoGhCz+dcmjAv1GW8lnk+WMgHyEnFe4kPIjCCf5NEc0w
At4IxHAei0TEj8KrMU3DPI4msTPD1nwejwNFiP80mgsoOCnMDNMFAR8JniVinAWICPTlP3cGL7v3
A968fc1/bvZ6zdvB6wqSgOPFu1SEqaQtRbggncBZnGvUAYZ4FHIufzYPfOgCrIqdMF3yaMxv2r3W
S4DYfN657gxeI9FXncFtu9/nV90eb8L4u2Zv0GndXzd7/O6+d9ftt5E4+eMPHoAPornEPXoU8SIG
bku+zJ04/fbbb/n+SEz8sPyd+THG+i/b19f8gjeo0GAsiV3Pj7FGlhosjebDvDZ/arCf7pqDl3ZX
4PvYf4c1stRg4p1wh3m19QhzjfxQQZWlBkvyqkTXBf4Ih6nq/KnBQMccVa2KAGGZuFE41kDME7RM
QTc9cC0gH9VaqIGZIjAtu0OhgjDJsaAaPxxHqkoVG2zmaBJkCXu5QeYJ01E/NVgUeIXGgyyJD1QN
Y5ft/uCy0+MXjM0fJjm1pX1VLh807pqtH5sv2g3sYfAr7cviSnthqtJ+/mj3I3mPMj/wZD/Qsmbr
uttqkpqoYoM17wfdVvf2iipVWdbeNH9s61osy9qX7eZlu6fr5RNM1rntD5pSA1WxoeuGd73ui17z
xmrTVQ3AvnkzXKkdXl03X/TLZvxlc9C0B+NzDr3f6nXuBna7rAGFB7NMxlE8k4pMfmNoKoehMxOA
+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

-------------------------------------------------------------------------------------

Sunday, July 8, 2007

SMS-приложение. Часть 3

Отправка/прием сообщений.

Мы продолжаем обсуждать команды протокола. Нам осталось рассмотреть две самые интересные команды, с помощью которых, собственно, и осуществляется прием/передача сообщений. Это команды submit_sm и deliver_sm. Первая служит для отправки SMS от ESME в PLMN, а вторая -- для приема SMS из PLMN.

submit_sm. command_id = 0x04

Тело пакета submit_sm состоит из следующих полей:


Field name Size (octets) Type Description
service_type Var. max 6 C-Octet String Используется для доступа к специальным функциям SMSC. Может принимать значения:
  • ““ (NULL) Default
  • “CMT” Cellular Messaging
  • “CPT” Cellular Paging
  • “VMN” Voice Mail Notification
  • “VMA” Voice Mail Alerting
  • “WAP” Wireless Application Protocol
  • “USSD” Unstructured Supplementary Services Data

Если не используется (в большинстве случаев), выставляется в NULL.

source_address_ton 1 Integer Тип номера источника (см. пред. статью)
source_address_npi 1 Integer Индикатор плана номеров источника (см. пред. статью)
source_address 20 C-Octet String Адрес источника, если неизвестен выставляется в NULL
dest_address_ton 1 Integer Тип номера получателя (см. пред. статью)
dest_address_npi 1 Integer Индикатор плана номеров получателя (см. пред. статью)
dest_address 20 C-Octet String Адрес получателя. Для mobile-terminated (т. е. предназначенных для передачи непостредственно на сотовый телефон) сообщений это в точности номер телефона.
esm_class 1 Integer Указывает на тип сообщешия и его режим (mode). Может принимать следующие значения:
Bits 7 6 5 4 3 2 1 0 Meaning
Messaging Mode (bits 1-0)
x x x x x x 0 0 Default SMSC Mode (e.g. Store and Forward)
x x x x x x 0 1 Datagram mode
x x x x x x 1 0 Forward (i.e. Transaction) mode
x x x x x x 1 1 Store and Forward mode (use to select Store and Forward mode if Default SMSC Mode is non Store and Forward)

Message Type (bits 5-2)
x x 0 0 0 0 x x Default message Type (i.e. normal message)
x x 0 0 1 0 x x Short Message contains ESME Delivery Acknowledgement
x x 0 1 0 0 x x Short Message contains ESME Manual/User Acknowledgement

GSM Network Specific Features (bits 7-6)
0 0 x x x x x x No specific features selected
0 1 x x x x x x UDHI Indicator (only relevant for MT short messages)
1 0 x x x x x x Set Reply Path (only relevant for GSM network)
1 1 x x x x x x Set UDHI and Reply Path (only relevant for GSM network)

При работе в т. н. Store and Forward mode и отказе от использования дополнительных свойств (что верно в большинстве случаев) это поле будет содержать 0.
protocol_id 1 Integer Идентификатор протокола (специфично для сети). В стандарте GSM этот параметр регулируется документом GSM 03.40 (т. н. "Библией SMS") и используется для указания на низлежащий протокол связи ESME с SMSC. В простейшем случае -- 0.
priority_flag 1 Integer При передаче по GSM сетям: 0 -- приоритет отсутствует, 1-3 -- приоритет (равноправны). >3 -- не используется
schedule_delivery_time 1 или 17 C-Octet String Время отложенного доведения (в формате SMPP -- см. ниже) или 0 для немедленного доведения.
validity_period 1 или 17 C-Octet String Срок годности (в формате SMPP -- см. ниже) или 0 для срока годности, установленного SMSC по умолчанию
registered_delivery 1 Integer Запрос на подтверждение доставки от SMSC (delivery_receipt). 1 -- требуется, 0 -- не требуется
replace_if_present_flag 1 Integer Флаг, указывающий, должно ли сообщение заместить уже имеющееся с совпадающими полями source address, destination address и service_type
data_coding 1 Integer Указывает на то, каким образом представлены данные. Может принимать значения:
Bits 7 6 5 4 3 2 1 0 Meaning
0 0 0 0 0 0 0 0 SMSC Default Alphabet
0 0 0 0 0 0 0 1 IA5 (CCITT T.50)/ASCII (ANSI X3.4) (b)
0 0 0 0 0 0 1 0 Octet unspecified (8-bit binary) (b)
0 0 0 0 0 0 1 1 Latin 1 (ISO-8859-1) (b)
0 0 0 0 0 1 0 0 Octet unspecified (8-bit binary) (a)
0 0 0 0 0 1 0 1 JIS (X 0208-1990) (b)
0 0 0 0 0 1 1 0 Cyrllic (ISO-8859-5) (b)
0 0 0 0 0 1 1 1 Latin/Hebrew (ISO-8859-8) (b)
0 0 0 0 1 0 0 0 UCS2 (ISO/IEC-10646) (a)
0 0 0 0 1 0 0 1 Pictogram Encoding (b)
0 0 0 0 1 0 1 0 ISO-2022-JP (Music Codes) (b)
0 0 0 0 1 0 1 1 reserved
0 0 0 0 1 1 0 0 reserved
0 0 0 0 1 1 0 1 Extended Kanji JIS(X 0212-1990) (b)
0 0 0 0 1 1 1 0 KS C 5601 (b)
0 0 0 0 1 1 1 1 reserved
:
1 0 1 1 1 1 1 1 reserved
1 1 0 0 x x x x GSM MWI control - see [GSM 03.38] (d)
1 1 0 1 x x x x GSM MWI control - see [GSM 03.38] (d)
1 1 1 0 x x x x reserved
1 1 1 1 x x x x GSM message class control - see [GSM 03.38] (e)

Notes:
a. These coding schemes are common to GSM, TDMA and CDMA. The SMPP protocol allows ESME applications to use the same DCS value (i.e. the GSM 03.38 value) for all three technologies.
b. In cases where a Data Coding Scheme is defined for TDMA and/ or CDMA but not defined for GSM, SMPP uses GSM 03.38 reserved values.
c. There is no default setting for the data_coding parameter.
d. The data_coding parameter will evolve to specify Character code settings only. Thus the recommended way to specify GSM MWI control is by specifying the relevant settings in the optional parameters _ms_msg_wait_facilities and ms_validity.
e. The data_coding parameter will evolve to specify Character code settings only. Thus the recommended way to specify GSM message class control is by specifying the relevant setting in the optional parameter dest_addr_subunit.
sm_default_msg_id 1 Integer Указывает на "предопределенное" ("canned") сообщение, т. е. заранее сохраненное на SMSC. Может принимать значение 0-254 (0 если не используется).
sm_length 1 Integer Длина в октетах следующего поля
short_message Var 0-254 Octet String Собственно, сообщение :). Обратим внимание, что это поле расширено до 254 остетов (против 160-ти). Это связано с тем, что возможна передача сообщений в различных кодировках.

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

submit_sm_resp. command_id = 0x80000004

Тело пакета submit_sm_resp состоит из следующих полей:


Field name Size (octets) Type Description
message_id Var. max 65 C-Octet String Идентификатор сообщения, назначенный SMSC

В том случае, если поле command_status заголовка пакета не содержит нулевого значения (т. е. указывает на ошибку), тело пакета не передается. Идентификатор, назначенный SMSC используется для дальнейших операций с сообщениями, как то: запросы, удаление, замещение. Кроме того, он же будет фигурировать в delivery_receipt-е. От внимательного читателя не укрылось, что длина идентификатора в 65 октетов (символов), вообще говоря, не позволяет хранить его ни в каком из цифровых форматов. Тем не менее, на практике почти всегда это поле содержит значение, укладывающееся в 32-х битное целое (по крайней мере, другого не наблюдалось). Так что выбор формата хранения smsc_id целиком на совести разработчика ESME ибо чаще всего эти значения хранятся в поле таблицы базы данных, а поиск цифрового значения гораздо более эффективен, нежели строки.

Формат представления даты в SMPP.

В данной версии протокола все поля, связанные с датой и временем должны быть представлены в формате “YYMMDDhhmmsstnnp” где:

  • ‘YY’ последние две цифры года (00-99)
  • ‘MM’ месяц (01-12)
  • ‘DD’ день месяца (01-31)
  • ‘hh’ час (00-23)
  • ‘mm’ минута (00-59)
  • ‘ss’ секунда (00-59)
  • ‘t’ десятая секунды (0-9)
  • ‘nn’ различие в четвертях часа между локальным временем и временем UTC(Universal Time Constant) (00-48).
  • ‘p’ = “+”локальное время опережает UTC.
  • ‘p’ = “-” локальное время отстает от UTC.
  • ‘p’ = “R” локальное время задано относительно времени SMSC.

В зависимости от значения параметра "p" (+/- или R) различают абсолютный (+/-) или относительный (R) формат даты. Абсолютный формат указывает на точно специфицированный момент времени (как показано выше), а относительный -- промежуток времени относительно текущего времени SMSC. Например, '020610233429000R' будет истолковано как 2 года, 6 месяцев, 10 дней, 23 часа, 34 минуты и 29 секунд от текущего времени SMSC.

В ответах SMSC дается его локальное время в формате “YYMMDDhhmmss”.

deliver_sm. command_id = 0x5

Формат пакета deliver_sm полностью совпадает с форматом пакета submit_sm (в части описанных обязательных параметров), посему мы не будем здесь его еще раз повторять. Упомянем только о специфике в значениях некоторых полей:

  1. schedule_delivery_time не используется и выставляется в 0.
  2. Поле validity_period не используется и выставляется в 0.
  3. Поле registered_delivery указывает что необходимо подтверждение ESME (ESME acknowledgement). Для отправки подтверждения ESME должно использовать пакет submit_sm со специальным значением (см. выше) поля esm_class.
  4. Поле replace_if_present_flag не используется и выставляется в 0.
  5. Поле sm_default_msg_id не используется и выставляется в 0.

Напомним, что SMSC использует этот пакет как для доставки входящих (для ESME) сообщений так и для передачи подтверждений доставки (delivery_receipt). Тип сообщения (входящее/подтверждение) указывается, как и для submit_sm, в поле esm_class:


Bits 7 6 5 4 3 2 1 0 Meaning
Message Mode (bits 1-0)
x x x x x x x x not applicable - ignore bits 0 and 1

Message Type (bits 5-2)
x x 0 0 0 0 x x Default message Type (i.e. normal message)
x x 0 0 0 1 x x Short Message contains SMSC Delivery Receipt
x x 0 0 1 0 x x Short Message contains SME Delivery Acknowledgement
x x 0 0 1 1 x x reserved
x x 0 1 0 0 x x Short Message contains SME Manual/User Acknowledgment
x x 0 1 0 1 x x reserved
x x 0 1 1 0 x x Short Message contains Conversation Abort (Korean CDMA)
x x 0 1 1 1 x x reserved
x x 1 0 0 0 x x Short Message contains Intermediate Delivery Notification
all other values reserved

deliver_sm_resp. command_id = 0x80000005

Формат пакета deliver_sm_resp в точности совпадает с форматом пакета submit_sm_resp с тем исключением, что поле message_id не используется и выставляется в 0.

Формат подтверждения доставки.

Как уже говорилось, для поттверждения доставки SMSC использует пакет deliver_sm со специальным (см. выше) значением поля esm_class. Обычно оно содержит значение 0x4, но, как видно, младшие два бита могут содержать любое значение. Сама информация подтверждения содержится в поле short_message. Точное значение этого поля зависит от производителя и модели SMSC, но, в большинстве случаев, подчиняется рекомендованному формату: “id:IIIIIIIIII sub:SSS dlvrd:DDD submit date:YYMMDDhhmm done date:YYMMDDhhmm stat:DDDDDDD err:E text: . . . . . . . . .” Где:

Field name Size (octets) Type Description
id 10 C-Octet String (Decimal) Идентификатор сообщения, назначенный SMSC
sub 3 C-Octet String (Decimal) Количество посланных сообщений. Используеся, если сообщения послано нескольким получателям. Дополняется ведущими нулями
dlvrd 3 C-Octet String (Decimal) Количество доведенных сообщений. Используеся, если сообщения послано нескольким получателям. Дополняется ведущими нулями
submit date 10 C-Octet Fixed Length String Время, когда сообщение было отправлено в формате 'YYMMDDhhmm'
done date 10 C-Octet Fixed Length String Время, когда сообщение достигло финального состояния (доведено/не может быть доведено) в формате 'YYMMDDhhmm'
stat 7 C-Octet Fixed Length String Состояние. (см. ниже)
err 3 C-Octet Fixed Length String Может содержать код ошибки (если необходимо)
text 20 C-Octet String Первые 20 символов исходного сообщения.

State Stat field value Description
DELIVERED DELIVRD Сообщение доведено получателю
EXPIRED EXPIRED Истек срок годности сообщения
DELETED DELETED Сообщение было удалено
UNDELIVERABLE UNDELIV Сообщение не может быть доведено
ACCEPTED ACCEPTD Было прочитано вручную от имени подписчика
UNKNOWN UNKNOWN Сообщение в некорректном состоянии
REJECTED REJECTD Сообщение отвергнуто

Unbind.

Команды unbind и unbind_resp имеют значения command_id 0x6 и 0x80000006 соответственно и не содержат тел (т. е. состоят из одного header'а)

Заключение

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