четверг, 9 декабря 2010 г.

SMPP - краткое описание на русском

Описание

SMPP протокол, который используется мобильными операторами для организации службы коротких сообщений (SMS).
Согласно своему имени протокол SMPP определяет клиента (ESME) и сервер (часто называемого SMSC).
Клиент инициализирует TCP соединение и выполняет команду bind для организации соединения со специфичными параметрами.
Схемы соединения клиента:
1. receiver — клиент может только получать сообщения от SMSC.
2. transmitter — клиент может только отправлять сообещения на SMSC
3. transceiver — клиент осуществляет двухстороннюю передачу сообщений.

Таким образом для организации двухстороней передачи сообщений можно либо установить соединение тип transceiver, либо устанавливать 2 соединения типов transmitter и receiver.



Для завершения SMPP сессии используется команда unbind.

После установки SMPP соединения происходит обмен сообщениями, называемыми PDU (protocol data unit). Общение между клиентом и сервером происходит по принципу запрос-ответ (request-response). Запросы содержат в себе определенное уникальное в данной сессии число, и в свою очередь ответные PDU, содержат в себе то же самое число — благодаря этому механизму возможна асинхронная передача сообщений.

Протоколом определены несколько команд для отправки разных типов сообщений, замены и отмены ранее отправленных сообщений и т. д. Наиболее часто используемой из них командой является submit_sm — отправка простого текстового сообщения. Ответом на эту команду является PDU submit_sm_resp. Отчет о доставке сообщения посылается в виде PDU deliver_sm.

Также стоит сказать про ограничение длины SMPP сообщений. В протоколе SMPP, длина поля short_message ограничена 254 байтами, однако нижележащие протоколы накладывают другие требования. Например GSM ограничивает длину коротких сообщений в 140 байт.

Пример организации соединения и отправки текстового сообщения на языке Perl с использованием модуля Net::SMPP

#!/usr/bin/perl -w

use strict;
use Net::SMPP;

#Номер от которого отправляется СМС
my $SMPP_SOURCE_ADDR='FROM';
#Номер кому отправляется СМС
my $SMPP_DEST_ADDR='79000000000';

#Инициируем соединение типа transceiver
#В параметрах указываем system_id и password - аналог имени пользователя и пароля для аутентификации на SMSC
#адрес и порт, с которым соединяемся и версию протокола SMPP
my $smpp = Net::SMPP->new_transceiver('192.168.1.1',
system_id => 'username',
password => 'password',
port => '2775',
smpp_version=> 0x34
)
or die "Can't connect to SMSC: $!";

&send_message($SMPP_SOURCE_ADDR, $SMPP_DEST_ADDR, 'Hello SMS!!!');


#Процедура отправки сообщения submit_sm
#В параметрах send_message передаем адрес отправителя, адрес получателя, то есть его номер телефона и текст
#сообщения
#Параметры source_addr_ton, source_addr_npi, dest_addr_ton, dest_addr_npi определяют дополнительные параметры
#адресов отправителя и получателя. Подробнее о них в спецификации протокола SMPP.
sub send_message {
my ($sm_source_addr, $sm_dest_addr, $sm_message) = @_;
my $result = eval {
my $pru = $smpp->submit_sm(
source_addr_ton => 0x05,
source_addr_npi => 0x01,
source_addr => $sm_source_addr,
dest_addr_ton => 0x01,
dest_addr_npi => 0x01,
destination_addr => $sm_dest_addr,
data_coding => 0x01,
short_message =>$sm_message
) or return 1;
return 0;

};
if ($result == 1){
"Can't send message: $!";
}

}

#Разрываем соединение с SMSC
$smpp->unbind();


Где-то уже не помню где  нашел неофициальный перевод спецификации протокола SMPP на русский, вот он.
Если найдется его автор, скажу большое спасибо ))).

3 комментария:

Unknown комментирует...

Дружище, ты лучше подскажи, как смс в кириллице.

Unknown комментирует...

Karton, использую библиотеку Net_SMPP, у меня получилось так:
http://stackoverflow.com/questions/31557625/not-latin-symbols-in-sms-php-smpp

Анонимный комментирует...

Hi, SMPP Client that features separate layers. All the layers can be managed very easily allowing the users to upgrade the core nodes for handling SMS traffic in the most seamless manner.