SMPP

Поделись знанием:
Перейти к: навигация, поиск

SMPP — (Short Message Peer-to-Peer) короткие сообщения одноранговой Сети. Является открытым стандартом в телекоммуникационной отрасли, который разработан специально, что бы обеспечить гибкий интерфейс для передачи коротких сообщений между внешними сущностями (устройства, приложения) коротких сообщений (ESME), маршрутизаторами и центров сообщений (SMSC).

SMPP часто используют третьи лица, такие как поставщики дополнительных услуг, новостные агентства, для передачи сообщений — часто массово, передачи SMS сообщений. По данному протоколу можно передавать SMS, EMS, голосовую почту, уведомления, сотовое радиовещание, WAP-сообщения, USSD сообщения и пр. Из-за своей универсальности и поддержкой SMS-протоколов без GSM, как UMTS, IS-95 (CDMA), CDMA2000, ANSI-136 (TDMA) и подобных, SMPP является наиболее широко используемым протоколом для короткого обмена сообщениями за пределами сетей ОКС7(SS7).





Процесс работы

SMPP использует модель работы клиент-сервер. Центр сообщений (SMSC), как правило, выступает в качестве сервера, ожидая подключения от клиента — ESME. Когда SMPP используется для SMS пиринга, отправляющий MC обычно выступает в качестве клиента.

Протокол основан на парах запрос-ответ PDU (блоков данных протокола или пакетах) обмениваются через OSI слой 4 (TCP сессии или X25 SVC3) соединений. Общеизвестный порт, назначенный IANA для SMPP при работе над TCP является 2775, но часто используются произвольные номера портов.

Перед обменом сообщений, должна быть отправлена команда привязки и подтверждена. Команда привязки определяет, в каком направлении можно будет отправлять сообщения; bind_transmitter позволяет клиенту только отправлять сообщения на сервер, bind_receiver означает, что клиент будет только получать сообщения, и bind_transceiver (введен в SMPP 3.4) позволяет передавать сообщения в обоих направлениях. При отправки команды привязки, ESME должен себя идентифицировать с помощью параметров system_id, system_type и password; address_range предназначен для указания адреса ESME, но обычно, передается пустым. Так же, в команде связки есть interface_version, в котором указывают версию протокола, который будет использоваться во время сессии.

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

Формат PDU

В SMPP блоки PDU являются бинарными и кодируются для эффективности. Они начинаются с заголовка, который соответствуют телу:

SMPP PDU
PDU Header (обязательный) PDU Body (опционально)
Command

length

Command

Id

Command

Status

Sequence

Id

PDU Body
4 octets Length = (Command Length value — 4) octets

PDU header

Каждый PDU начинается с заголовка. Заголовок состоит из 4-х полей, длина каждого из которых равна 4 октетам: command_length

Общая длина PDU в октетах (включая саму команду длины поля); должна составлять не менее 16 октетов, так как каждый PDU должен содержать заголовок 16 октета
command_id
Указывает операцию SMPP (или команды)
command_status
Всегда значение 0 в запросах; в ответе он несет в себе информацию о результате операции
sequence_number
Используется для корреляции запросов и ответов в рамках сессии SMPP; обеспечивает асинхронную связь (с помощью метода «скользящего окна»)
Все числовые поля в SMPP пользуются большим обратным порядком, а это значит, что первый октет является старшим байтом (MSB).

Примеры

Это пример двоичного кодирования 60 октетов submit_sm PDU. Данные представлены в значениях октетных Hex как единого дампа и затем заголовка и тела разбивкой этого PDU.

Объём значений показан в десятичном виде в скобках и значениями Hex после них. Если вы видите один или несколько шестнадцатеричных октета, то это потому, что данный размер поля использует 1 или более октетов кодирования.

Опять же, прочитав определение submit_sm PDU из спецификации сделает все это яснее.

Заголовок PDU

'command_length', (60) ... 00 00 00 3C
'command_id', (4) ... 00 00 00 04
'command_status', (0) ... 00 00 00 00
'sequence_number', (5) ... 00 00 00 05

Содержимое PDU

'service_type', () ... 00
'source_addr_ton', (2) ... 02
'source_addr_npi', (8) ... 08
'source_addr', (555) ... 35 35 35 00
'dest_addr_ton', (1) ... 01
'dest_addr_npi', (1) ... 01
'dest_addr', (555555555) ... 35 35 35 35 35 35 35 35 35 00
'esm_class', (0) ... 00
'protocol_id', (0) ... 00
'priority_flag', (0) ... 00
'schedule_delivery_time', (0) ... 00
'validity_period', (0) ... 00
'registered_delivery', (0) ... 00
'replace_if_present_flag', (0) ... 00
'data_coding', (3) ... 03
'sm_default_msg_id', (0) ... 00
'sm_length', (15) ... 0F
'short_message', (Hello Wikipedia) ... 48 65 6C 6C 6F 20 77 69 6B 69 70 65 64 69 61'

Обратите внимание, что текст в поле short_message должен соответствовать data_coding. Когда data_coding 8 (UCS2), текст должен быть в UCS-2BE (или его расширения, UTF-16BE). Когда data_coding указывает на 7-битную кодировку, каждый септет хранится в отдельном октете в поле short_message (с наиболее старшим битом, установленным в 0). SMPP 3.3 data_coding точно скопированны значения TP-DCS GSM 03.38, что делает его пригодным только для GSM 7-битного алфавита по умолчанию, UCS2 или бинарных сообщений; SMPP 3.4 введен новый список значений data_coding:

data_coding Значение
0 SMSC Default Alphabet (SMPP 3.4) / MC Specific (SMPP 5.0)
1 IA5 (CCITT T.50)/ASCII (ANSI X3.4)
2 Octet unspecified (8-bit binary)
3 Latin 1 (ISO-8859-1)
4 Octet unspecified (8-bit binary)
5 JIS (X 0208-1990)
6 Cyrillic (ISO-8859-5)
7 Latin/Hebrew (ISO-8859-8)
8 UCS2 (ISO/IEC-10646)
9 Pictogram Encoding
10 ISO-2022-JP (Music Codes)
11 Зарезервирован
12 Зарезервирован
13 Extended Kanji JIS (X 0212-1990)
14 KS C 5601
15-191 Зарезервирован
192—207 GSM MWI control — see GSM 03.38
208—223 GSM MWI control — see GSM 03.38
224—239 Зарезервирован
240—255 GSM message class control — see GSM 03.38

Описание data_coding = 4 или 8 является таким же, как в SMPP 3.3. Другие значения в диапазоне 1-15 зарезервированы в SMPP 3.3. К сожалению, в отличие от SMPP 3.3, где data_coding = 0 был однозначно GSM 7-битный алфавит, для SMPP 3.4 и выше GSM 7-битный алфавит по умолчанию отсутствует в этом списке, и data_coding = 0 могут отличаться для различных СМСЦ — это может быть ISO-8859-1, ASCII, GSM 7-битный алфавит, UTF-8 или любая другая настроенная для каждого ESME. При использовании data_coding = 0, обе стороны (ESME и SMSC) должны быть уверены, что они считают это указателем к одной и той же кодировке. В противном же случае, лучше не использовать data_coding = 0. Это может затруднить использование GSM 7-битного алфавита, так как некоторые СМСЦ требует data_coding = 0, другие, например, data_coding = 241.

Реализации

SMPP был реализован на Java в проекте jSMPP. Он используется в Apache Camel и различных других популярных бесплатных программных проектах для SMS-сообщений. Альтернативная реализация Java nmote-smpp. Проект python-SMPP предоставляет SMPP для пользователей Python. Проект PHP-SMPP предоставляет SMPP для пользователей PHP.

Особенности

Несмотря на широкое распространение, SMPP имеет ряд проблемных особенностей:

  • Нет data_coding для GSM 7 bit default alphabet
  • Нет стандартного значения data_coding=0
  • Нечеткая поддержка кодировки Shift-JIS
  • Несовместимость submit_sm_resp между версиями SMPP
  • Особенности ID сообщения при получении отчета о доставки, при использовании SMPP 3.3

Нет data_coding для GSM 7 bit default alphabet

В SMPP 3.3 все значения data_coding трактуются согласно GSM 03.38, но начиная с SMPP 3.4 отсутствует значение data_coding для GSM 7 bit default alphabet

Нет стандартного значения data_coding=0

Согласно SMPP 3.4 и 5.0 data_coding=0 означает ″SMSC Default Alphabet″. Какая кодировка это на самом деле, зависит от типа SMSC и его конфигурации.

Нечеткая поддержка кодировки Shift-JIS

Одна из кодировок в CDMA стандартной C.R1001 является Shift-JIS используется для японского языка. SMPP 3.4 и 5.0 определяет три кодировки для Японии (JIS, ISO-2022-JP и Расширенная кандзи JIS), но ни один из них не совпадает с CDMA MSG_ENCODING 00101.

Несовместимость submit_sm_resp между версиями SMPP

Напишите отзыв о статье "SMPP"

Примечания

Другие протоколы SMS

Ссылки

Отрывок, характеризующий SMPP

– И то, и то, – сказал Несвицкий. – Нет, а чего бы я желал, – прибавил он, прожевывая пирожок в своем красивом влажном рте, – так это вон туда забраться.
Он указывал на монастырь с башнями, видневшийся на горе. Он улыбнулся, глаза его сузились и засветились.
– А ведь хорошо бы, господа!
Офицеры засмеялись.
– Хоть бы попугать этих монашенок. Итальянки, говорят, есть молоденькие. Право, пять лет жизни отдал бы!
– Им ведь и скучно, – смеясь, сказал офицер, который был посмелее.
Между тем свитский офицер, стоявший впереди, указывал что то генералу; генерал смотрел в зрительную трубку.
– Ну, так и есть, так и есть, – сердито сказал генерал, опуская трубку от глаз и пожимая плечами, – так и есть, станут бить по переправе. И что они там мешкают?
На той стороне простым глазом виден был неприятель и его батарея, из которой показался молочно белый дымок. Вслед за дымком раздался дальний выстрел, и видно было, как наши войска заспешили на переправе.
Несвицкий, отдуваясь, поднялся и, улыбаясь, подошел к генералу.
– Не угодно ли закусить вашему превосходительству? – сказал он.
– Нехорошо дело, – сказал генерал, не отвечая ему, – замешкались наши.
– Не съездить ли, ваше превосходительство? – сказал Несвицкий.
– Да, съездите, пожалуйста, – сказал генерал, повторяя то, что уже раз подробно было приказано, – и скажите гусарам, чтобы они последние перешли и зажгли мост, как я приказывал, да чтобы горючие материалы на мосту еще осмотреть.
– Очень хорошо, – отвечал Несвицкий.
Он кликнул казака с лошадью, велел убрать сумочку и фляжку и легко перекинул свое тяжелое тело на седло.
– Право, заеду к монашенкам, – сказал он офицерам, с улыбкою глядевшим на него, и поехал по вьющейся тропинке под гору.
– Нут ка, куда донесет, капитан, хватите ка! – сказал генерал, обращаясь к артиллеристу. – Позабавьтесь от скуки.
– Прислуга к орудиям! – скомандовал офицер.
И через минуту весело выбежали от костров артиллеристы и зарядили.
– Первое! – послышалась команда.
Бойко отскочил 1 й номер. Металлически, оглушая, зазвенело орудие, и через головы всех наших под горой, свистя, пролетела граната и, далеко не долетев до неприятеля, дымком показала место своего падения и лопнула.
Лица солдат и офицеров повеселели при этом звуке; все поднялись и занялись наблюдениями над видными, как на ладони, движениями внизу наших войск и впереди – движениями приближавшегося неприятеля. Солнце в ту же минуту совсем вышло из за туч, и этот красивый звук одинокого выстрела и блеск яркого солнца слились в одно бодрое и веселое впечатление.


Над мостом уже пролетели два неприятельские ядра, и на мосту была давка. В средине моста, слезши с лошади, прижатый своим толстым телом к перилам, стоял князь Несвицкий.
Он, смеючись, оглядывался назад на своего казака, который с двумя лошадьми в поводу стоял несколько шагов позади его.
Только что князь Несвицкий хотел двинуться вперед, как опять солдаты и повозки напирали на него и опять прижимали его к перилам, и ему ничего не оставалось, как улыбаться.
– Экой ты, братец, мой! – говорил казак фурштатскому солдату с повозкой, напиравшему на толпившуюся v самых колес и лошадей пехоту, – экой ты! Нет, чтобы подождать: видишь, генералу проехать.
Но фурштат, не обращая внимания на наименование генерала, кричал на солдат, запружавших ему дорогу: – Эй! землячки! держись влево, постой! – Но землячки, теснясь плечо с плечом, цепляясь штыками и не прерываясь, двигались по мосту одною сплошною массой. Поглядев за перила вниз, князь Несвицкий видел быстрые, шумные, невысокие волны Энса, которые, сливаясь, рябея и загибаясь около свай моста, перегоняли одна другую. Поглядев на мост, он видел столь же однообразные живые волны солдат, кутасы, кивера с чехлами, ранцы, штыки, длинные ружья и из под киверов лица с широкими скулами, ввалившимися щеками и беззаботно усталыми выражениями и движущиеся ноги по натасканной на доски моста липкой грязи. Иногда между однообразными волнами солдат, как взбрызг белой пены в волнах Энса, протискивался между солдатами офицер в плаще, с своею отличною от солдат физиономией; иногда, как щепка, вьющаяся по реке, уносился по мосту волнами пехоты пеший гусар, денщик или житель; иногда, как бревно, плывущее по реке, окруженная со всех сторон, проплывала по мосту ротная или офицерская, наложенная доверху и прикрытая кожами, повозка.
– Вишь, их, как плотину, прорвало, – безнадежно останавливаясь, говорил казак. – Много ль вас еще там?
– Мелион без одного! – подмигивая говорил близко проходивший в прорванной шинели веселый солдат и скрывался; за ним проходил другой, старый солдат.
– Как он (он – неприятель) таперича по мосту примется зажаривать, – говорил мрачно старый солдат, обращаясь к товарищу, – забудешь чесаться.
И солдат проходил. За ним другой солдат ехал на повозке.
– Куда, чорт, подвертки запихал? – говорил денщик, бегом следуя за повозкой и шаря в задке.
И этот проходил с повозкой. За этим шли веселые и, видимо, выпившие солдаты.
– Как он его, милый человек, полыхнет прикладом то в самые зубы… – радостно говорил один солдат в высоко подоткнутой шинели, широко размахивая рукой.
– То то оно, сладкая ветчина то. – отвечал другой с хохотом.
И они прошли, так что Несвицкий не узнал, кого ударили в зубы и к чему относилась ветчина.
– Эк торопятся, что он холодную пустил, так и думаешь, всех перебьют. – говорил унтер офицер сердито и укоризненно.
– Как оно пролетит мимо меня, дяденька, ядро то, – говорил, едва удерживаясь от смеха, с огромным ртом молодой солдат, – я так и обмер. Право, ей Богу, так испужался, беда! – говорил этот солдат, как будто хвастаясь тем, что он испугался. И этот проходил. За ним следовала повозка, непохожая на все проезжавшие до сих пор. Это был немецкий форшпан на паре, нагруженный, казалось, целым домом; за форшпаном, который вез немец, привязана была красивая, пестрая, с огромным вымем, корова. На перинах сидела женщина с грудным ребенком, старуха и молодая, багроворумяная, здоровая девушка немка. Видно, по особому разрешению были пропущены эти выселявшиеся жители. Глаза всех солдат обратились на женщин, и, пока проезжала повозка, двигаясь шаг за шагом, и, все замечания солдат относились только к двум женщинам. На всех лицах была почти одна и та же улыбка непристойных мыслей об этой женщине.
– Ишь, колбаса то, тоже убирается!
– Продай матушку, – ударяя на последнем слоге, говорил другой солдат, обращаясь к немцу, который, опустив глаза, сердито и испуганно шел широким шагом.
– Эк убралась как! То то черти!
– Вот бы тебе к ним стоять, Федотов.
– Видали, брат!
– Куда вы? – спрашивал пехотный офицер, евший яблоко, тоже полуулыбаясь и глядя на красивую девушку.
Немец, закрыв глаза, показывал, что не понимает.
– Хочешь, возьми себе, – говорил офицер, подавая девушке яблоко. Девушка улыбнулась и взяла. Несвицкий, как и все, бывшие на мосту, не спускал глаз с женщин, пока они не проехали. Когда они проехали, опять шли такие же солдаты, с такими же разговорами, и, наконец, все остановились. Как это часто бывает, на выезде моста замялись лошади в ротной повозке, и вся толпа должна была ждать.
– И что становятся? Порядку то нет! – говорили солдаты. – Куда прешь? Чорт! Нет того, чтобы подождать. Хуже того будет, как он мост подожжет. Вишь, и офицера то приперли, – говорили с разных сторон остановившиеся толпы, оглядывая друг друга, и всё жались вперед к выходу.
Оглянувшись под мост на воды Энса, Несвицкий вдруг услышал еще новый для него звук, быстро приближающегося… чего то большого и чего то шлепнувшегося в воду.