System głosowania GSM, format PDU
ARM7 / Kody źródłowe / System głosowania GSMOpublikowany 05042008, 15:56
Wiadomości SMS mogą być udostępniane w formacie tekstowym lub w formacie PDU. Zazwyczaj obsługiwany jest format PDU. Format tekstowy, zależnie od telefonu, może być obsługiwany dodatkowo.
Drugi etap projektu opisanego w poście System głosowania GSM. Informacje dotyczące formatu PDU można znaleźć w anglojęzycznym dokumencie: Developer's Guide - PDU mode.
Poniżej widoczna wstępna wersja funkcji, dekodującej treść wiadomości SMS. Przy wywołaniu funkcji należy się upewnić, czy przekazywane bufory mają wystarczające rozmiary. Funkcja przetestowana dla SMSów z bramki internetowej oraz z telefonów sieci Plus i Orange.
Użyta w poniżej funkcji, funkcja int h2i(char*) konwertuje dwuelementowe ciągi znaków reprezentujące liczby heksadecymanlnie na ich reprezentację dziesiętną, np. "1A" - 26.
/** \brief Odczytuje nr nadawcy oraz treść wiadomości SMS. * * Nr nadawcy zwracany jest w formie niezdekodowanej. * * @param msg wiadomość SMS w formacie PDU * @param sender bufor na numer nadawcy SMSa * @param content bufor na treść SMSa * * @return 0 - OK, inna - błąd */ int get_content(char* msg, char* sender, char* content) { int i; char ch=0; char ch2=0; char n=0; char smsc_size = 0; char sender_size = 0; char sms_size = 0; smsc_size = h2i(msg); msg+=2; // pominięcie SMSC for (i=0; i < smsc_size ; i++) msg += 2; // pominięcie ,,sms deliver'' msg += 2; // rozmiar nr nadawcy sender_size = h2i(msg); if (sender_size % 2) sender_size++; msg += 2; msg += 2; // pominięcie typu nr // nr nadawcy, niedekodowany for (i=0; i < sender_size; i++) { sender[i] = *msg; msg++; } sender[i] = 0; msg += 2; // pominięcie TP-PID msg += 2; // pominięcie TP-DCS // pominięcie znacznika czasowego for (i=0; i < 7; i++) msg += 2; // rozmiar treści SMSa sms_size = h2i(msg); msg += 2; // dekodowanie treści SMSa for (i=0; i < sms_size; i++) { ch = h2i(msg); n = i % 8; ch <<= n; ch += ch2; ch &= 0x7F; content[i] = ch; n = 7-n; ch2 = h2i(msg) >> n; if (n==0) { ch2 = 0; msg -= 2; } msg += 2; } content[i] = 0; return 0; }