PDU формат в мобильной связи
raxp@mail.zp.ua
Основой для статьи послужила отладка GSM – пейджера с голосовым дозвоном. Проект
в сети довольно известный [4].
На местном “радиорынке” готовые изделия (без телефона) котируются в районе 34$.
Сам контроллер ATtiny2313 – 2$, разницу чувствуете? Зачем платить “чужому дяде”…
Краткий экскурс...
Использовать мобильные аппараты средней цены невыгодно, а вот “бросовые” самое
оно… НО, как правило в таких аппаратах доступен только 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 + // F8/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<length(s)+1) do begin
result:= result + s[i+1]+s[i];
inc(i);inc(i)
end
end;
Сам текст сообщения в UCS2 в двухбайтном виде:
для английских символов кодировки добавляется байт 00h, для русских – из байта
вычитается C0h и прибавляется 410h …
function ucs2(s: string): string;
var i,k: integer;
begin
for i:=1 to length(s) do begin
k:= ord(s[i]);
if k>=192 then k:= k + 1040 - 192; // НЕПОСРЕДСТВЕННО преобразуем + 410h - C0h
result:= result + inttohex(k,4)
end
end;
Теперь дело за малым – проверим как работает:
sendcom('AT+CMGS='+inttostr(length(txt.text)*2)+#13+#10); // 0Dh
sendcom(pdu.Text+#26); // символ конца строки 1Ah
Обратите внимание!!! В параметре
AT команды: AT+CMGS=кол-во символов в тексте сообщения
1 символ представлен 2- байтами
|
Рис.1 – Тестовый конвертор PDU
|
Номер SMS – центра конечно можно читать из
SIM – карты (AT+CSCA?), при формировании PDU это поле оставлять пустым,
при этом будет “нулевая длина” 1 – поля и телефон при отправке сам найдет
его из памяти, НО – данный метод проходит не на всех карточках. |
Полные исходные тексты проекта на ATTiny с дозвоном
доступны по согласованию с автором.
Ссылки:
Контактная информация:
raxp@mail.zp.ua
14.11.2006
[Переход к списку статей]
|