Interactive SMS  
SMPP

SMS-рассылки от 3 коп. за SMS!!!

    О проекте     Вопросы и ответы     Статьи     Архив     Утилиты     Программы     Обратная связь    

Отправка длинных СМС.
При внимательном прочтении спецификации можно обнаружить, что в ней описан алгоритм отправки длинных СМС, которые при отправке разбиваются на стандартные 140 октетные СМС, и при получении склеиваются.

Для отправки склеенных СМС можно использовать 2 пути:
  1. Использование опциональных параметров.
  2. Использование UDH.
Использование опциональных параметров.
В этом методе используются опциональные параметры протокола SMPP 3.4.
  • sar_total_segments
  • sar_segment_seqnum
  • sar_msg_ref_num
Из названий параметров ясно, что в них должно находиться:
  • sar_total_segments - общее количество СМС для склейки
  • sar_segment_seqnum - порядковый номер СМС
  • sar_msg_ref_num - уникальный номер, единый для данной группы склеенных СМС.
Интересно, что СМСЦ, получив такие СМС, обрабатывает их и переводит в формат с UDH.
При такой отправке необходимо указывать ESM_class=0, и, в соответствии с DCS, представлять сам текст. Т.е. если DCS=0, то текст должен быть упакован в 7-битным алгоритмом.
Также, согласно спецификации для таких СМС накладываются определенных ограничения на длину каждой составляющей СМС. Т.к. СМС с sar параметрами на СМСЦ переводятся в формат с UDH, то длина текстовой части СМС не должна превышать 134 октетов (140-6). Т.е. в GSM-default длина текста каждого СМС в несжатом виде должна быть не более 153 символов (134*8/7=153), а в юникоде 67 символов (134 /2-67).

Использование UDH.
Для отправки склеенных сообщений используя UDH, никаких сложностей не возникает, пока не приходится отсылать сообщения в GSM-default кодировке.
Сразу отметим, что ограничения на длину тела сообщений такие же, как и в предыдущем случае.
При отправке СМС с UDH необходимо установить соответствующее значение ESM_class=0x40, DCS устанавливается согласно тексту и может быть DCS=0x08 для Unicode кодировки и DCS=0x00 для GSM-default кодировки.
UDH представляет из себя следующее:
  • 0x05
  • 0x00
  • 0x03
  • 1 октет - уникальный для данной группы СМС номер
  • 1 октет - количество СМС для склейки
  • 1 октет - порядковый номер СМС

Далее идет текст в соответствующей кодировке.
А вот теперь о кодировании. Если для отправки СМС в Unicode кодировке ничего делать не надо (за исключением, конечно, правильно сформированного текста), то при отправке СМС в GSM-default кодировке возникают некоторые проблемы.
Из-за того, что изготовители телефонов всегда вольно обращались со спецификациями, могла возникнуть ситуация, когда телефон не поддерживает склейку. В данном случае разработчики спецификации постарались учесть это, и такой телефон отобразит СМС, но с некоторыми добавками в начале.
Если рассмотреть алгоритм 7-битного кодирования, то его смысл в том, что используется только первые 128 символов 8 битной кодовой страницы, при этом старший бит всегда равен 0. Поэтому он обрезается и мы имеем сжатие с коэффициентом 7/8=0.875. Т.е. в сжатом виде каждый 8 байт является отдельным блоком, который можно раскодировать отдельно.
Если мы при отправке СМС в GSM-default кодировке к UDH добавим закодированный в 7-битку текст, то телефон при раскодировании будет пытаться это сделать, начиная с 1 байта СМС, т.е. с UDH, в результате отобразит совсем не то, что должен быть. Это связано с тем, что UDH не надо сжимать и его длина 6 октетов. Если бы длина UDH в несжатом виде была бы 8 октетов - то никаких манипуляций делать не надо было бы. В данном же случае приходится привести длину UDH к 8 октетам, закодировать полученное сообщение и отрезать лишнее.
Итак, для отправки склеенного сообщения в GSM-default кодировке производим следующие манипуляции:
  • добавляем в начало текста сообщения 7 октетов, равных 0x00
  • кодируем полученный текст в 7-битку
  • удаляем сначала текста 6 октетов( они равны 0x00)
  • склеиваем UDH и полученный текст и отправляем на СМСЦ.

Пример получения сформированного сообщения.
sub scl
{
my ($dcs,$s)=@_;
if($dcs== 0x08){return $s};
$s=&pack_7bit(("\x00"x7).$s);
$s=~ /^\x00\x00\x00\x00\x00\x00(.*)/;
return $1
}


Текст скрипта по отправке длинного сообщения


$SMS="Concatenated message. This long message which is necessary for cutting, transferring and pasting together. The message is written by Umnikov Alexander. http://www.isms.ru";
@text_in=split(/(.{153})/,$SMS);

use SMPP;

($smpp_t,$err) = Net::SMPP->new_transmitter(
        "192.168.0.0",
        port=>"2775",
        system_id => 'isms.ru',
        password => 'isms.ru',
        system_type=>'isms.ru'

        ) or die;

print"Connect-transmitter. Status=",$err->{status},"*\n";

for($i=0;$i<=$#text_in;$i++)
{

$resp = $smpp_t->submit_sm(
        protocol_id=>0x00,
        validity_period=>'',
        source_addr_ton => 0x05,
        source_addr_npi => 0x00,
        source_addr => 'isms.ru',
        dest_addr_ton => 0x01,
        dest_addr_npi => 0x01,
        destination_addr => '71111111111',
        data_coding => 0x00,
        short_message=>
"\x05\x00\x03\xA9".chr($#text_in+1).chr($i+1).&scl(0,$text_in[$i]),
        esm_class => 0x40,
        priority_flag =>3,
        );
print "\$resp-$tm\n";
foreach $each (keys(%$resp))
{
print "[$each]-[$resp->{$each}]\n";
}

}

sub scl
{
my ($dcs,$s)=@_;
if($dcs== 0x08){return $s};
$s=&pack_7bit(("\x00"x7).$s);
$s=~ /^\x00\x00\x00\x00\x00\x00(.*)/;
return $1
}

sub pack_7bit {
        my ($s) = @_;
        $s = unpack 'b*', $s;
        $s =~ s/(.{7})./$1/g;
        return pack 'b*', $s;
}
sub unpack_7bit {
        my ($s) = @_;
        $s = unpack 'b*', $s;
        $s =~ s/(.{7})/${1}0/g;
        $s = pack 'b*', $s;
        chop $s if substr($s, -1, 1) eq "\x00";
        return $s;
}
  wlxml2xml & xml2wlxml  
Нужен ли сервис на сайте?
Да (774)50%
Нет (515)33%
Все равно (222)14%
gsm 7 (22)1%
Другой  

Предыдущие голосования
 
  Реклама  
sms2web - легкий путь стать контент-провайдером

 
  Новости-OnLine  

Архив Новостей

 
  Статьи  
 
  Статистика  
  • Посещений:15369910
  • Форумов:13
  • Тем:1367
  • Сообщений:6289
  • Пользователей:6043