Device::Gsm
Dec. 15th, 2007 07:52 pmПобедил декодирвку исходящих сообщений.
Оно таки у них там сломано. Я починил.
Патч -- идиотский. В нужном месте заменить единицу на двойку!
СМС сообщение добывается из телефона посредством специальных AT команд, и представляет из себя набор символов 0-9,A-F, которыми типа в текстовом виде представленны хранящиеся в телефоне данные.
Ошибка была в куске кода, который начинал разбор первого поля. Поле это состоит из двух частей: Длинна поля, и собственно данные. Когда в поле данных нет, то длинна равна нулю.
Нюанс тут в том, что байт тут занимает два символа, ибо все напечатано в шеснацетиричном виде (0011FF0B919761059698F20000AD085378789E16BF43)
И вот такой замечательный код обрабатывал все это дело:
Для входящих сообщений все работало хорошо, ибо в них длинна этого поля всегда не равна нулю. А вот во всех исходящих -- равна. Обнаружив это, парсер откусывал только первый нолик из двух, в результате чего вся конструкция фактически сдвигалась на четыре бита(!) влево, и естественно ничего больше разкодироваться правильно не могло.
Все... В ванную, вынуть сообщения, послать патч разработчкиу.
Оно таки у них там сломано. Я починил.
Патч -- идиотский. В нужном месте заменить единицу на двойку!
СМС сообщение добывается из телефона посредством специальных AT команд, и представляет из себя набор символов 0-9,A-F, которыми типа в текстовом виде представленны хранящиеся в телефоне данные.
Ошибка была в куске кода, который начинал разбор первого поля. Поле это состоит из двух частей: Длинна поля, и собственно данные. Когда в поле данных нет, то длинна равна нулю.
Нюанс тут в том, что байт тут занимает два символа, ибо все напечатано в шеснацетиричном виде (0011FF0B919761059698F20000AD085378789E16BF43)
И вот такой замечательный код обрабатывал все это дело:
$length = substr $msg, 0, 2;
if( $length eq '00' ) {
$self->data( '' );
$self->state( Sms::Token::DECODED );
# Remove length-octet read from message
$$rMessage = substr( $$rMessage, 1 ); ## !!!!!!!!!!!!! Вот тут ошибка
return 1;
}
# ну и тут дальше код, который знает что делать, если длинна не нулеваяДля входящих сообщений все работало хорошо, ибо в них длинна этого поля всегда не равна нулю. А вот во всех исходящих -- равна. Обнаружив это, парсер откусывал только первый нолик из двух, в результате чего вся конструкция фактически сдвигалась на четыре бита(!) влево, и естественно ничего больше разкодироваться правильно не могло.
Все... В ванную, вынуть сообщения, послать патч разработчкиу.
no subject
Date: 2007-12-19 04:25 pm (UTC)в какой кодировке нужно отдать текст модулю? koi8 utf8 блин я уже в них путаться начал :(
no subject
Date: 2007-12-19 08:59 pm (UTC)Так что, "вы можете либо реализовать это сами, используя наши материалы: http://shaplov.ru/devel-notes/sms/ , либо нанять нас, чтобы мы решили ваши проблемы" ;-)
Там, по ссылке, в конце идет несколько спецификаций по кодировке SMS'ок.