Pdu формат в мобильной связи
Краткий экскурс…
Использовать мобильные аппараты средней цены невыгодно, а вот “бросовые” самое оно… НО, как правило в таких аппаратах доступен лишь PDU формат отправки сообщений в UNICODE кодировке.
Все вроде – бы ничего: преобразуй в UCS2 и посылай… но толковых готовых решений не оказалось, даже пресловутый PDUspy [5] не оправдал ожиданий по конвертации sms.
Формат однобайтовой кодировки SMS в статье не рассматривается, ввиду отсутствия в ней поддержки кириллицы.
Решение
Состав полей и алгоритм формирования PDU-SMS виден из текста ниже (в терминах си- компилятора контроллера приведенный код будет гораздо компактней) …
function cpdu(ksz,sz,num,msg: string): string;
begin
result:= inttohex(length(sz),2) + // 07=длина номера SMSC
’91’ + // 91=интернациональность номера SMSC
cnv(ksz + sz) + // 97103701F0=+790173100 плюс признак окончания номера F
’01’ + // 01=PDU Type: MTI=01 -> исходящий SMS
’00’ + // 00=MR — параметр, который устанавливается в SMSC
inttohex(length(num)-1,2) + // длина номера получателя-1
’91’ + // 91=интернациональность получателя
cnv(num) + // номер получателя
’00’ + // 00=PID идентификатор номера протокола
tcod + // 18/08=DCS схема кодирования на экран/вну: кириллическое
inttohex(length(msg)*2,2)+ // длина сообщения
ucs2(msg) // сообщение
end;
Формирование номера оправки и sms – центра осуществим по простому принципу: переставляем соседние цифры местами, если номер нечетный то добавляем Fh …
function cnv(s: string):string;
var i: integer;
begin
delete(s,1,1);
if length(s) mod 2>0 then s:=s + ‘F’;
i:= 1;
while (i=192 then k:= k + 1040 — 192;
result:= result + inttohex(k,4)
end
end;
Теперь дело за малым – проверим как работает:
sendcom(‘AT+CMGS=’+inttostr(length(txt.text)*2)+#13+#10); // 0Dh
sendcom(pdu.Text+#26); // символ конца строки 1Ah
Практика
Итак, имеем сформированное “100% отправляемое” кириллическое PDU сообщение:
AT+CMGS=54x0d
079183609310000001000C91835050391443000836041D043504420020043F043804420430043D0438044F0020043A043E043D04420440043E043B043B043504400430002000470053004Dx1a
… разберем подробно!!!
AT+CMGS=54 — длина в dec
07 91 836093100000 01 00 0C 91 835050391443 00 08 36
041D043504420020043F043804420430043D0438044F0020043A043E043D04420440043E043B043B043504400430002000470053004D
06 для номера SMSC + 1 байт интернациональности
91 интернациональность SMSC
836093100000 номер sms центра плюс признак окончания номера (перестановка)
01 PDU Type: исходящий SMS
00 MR — параметр, который устанавливается в SMSC
0C длина номера получателя-1 в hex
91 интернациональность получателя
835050391443 номер получателя (перестановка +380505934134)
00 PID идентификатор номера протокола
08 [18/08] = [на экран – flash / вну] DCS 2-x байтная схема кодирования данных
36 длина текста сообщения!!! заметьте- это длина в hex (каждый символ по 2-байта)
… текст сообщения
Полные исходные тексты проекта в AVR на ATTiny с дозвоном доступны по согласованию с автором.