RSS · Atom

Mikrokontrolery


System głosowania GSM, format PDU  

ARM7 / Kody źródłowe / System głosowania GSM
Opublikowany 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;
}

Napisz komentarz