Socket TCP konkretne bajty

0

Hej!

Na początku - próbuję "napisać" swój pierwszy program w C. Ma być to klient TCP do obsługi projektora multimedialnego. Komunikacja jest dość prosta i opisana w dokumentacji projektora.

Bez problemowo komunikuję się z nim używając Netcata - chciałbym jednak mieć do tego dedykowaną aplikację.

Generalnie o ile wysłanie konkretnych danych do socketu nie sprawia mi jakichś szczególnych problemów to mam problem z ich odebraniem.

Po wysłaniu poprawnej komendy - projektor odpowiada. Przedstawię to na przykładzie odczytu licznika lampy.

0xFE - bajt startowy
0x00 - ID projektora
1 do n bajtów - treść odpowiedzi
1 bajt Suma kontrolna
0xFF - bajt końca

Konkretny przykład dla odczytu licznika lampy

0xfe 0x00 0x76 0x90 0x00 0x33 0x6f 0x3d 0xe5 0xff

No i tu pojawiają się pierwsze problemy z którymi kompletnie nie potrafię sobie poradzić...

Otóż sekwencja 0x76 0x90 0x00 0x33 0x6f 0x3d zawiera dane które potrzebuję odczytać

0x76 mówi mi o tym, że odczytuję dane lampy
0x90 mówi mi o tym, że odczytuję licznik lampy

0x00 0x33 0x6f 0x3d to słowo DWORD big endian (MSB, Byte 1, Byte 2, LSB)

Dane z socketu odczytuję poprzez:```

    n = read(sockfd,lamp_timer,sizeof(lamp_timer));

        //Test długości lamp_timer w bajtach
        int leng;
        leng = sizeof(lamp_timer);
        printf("%d\n",leng);

    if (n < 0)
         error("ERROR reading from socket");
    printf(lamp_timer);

Problem jest taki, że za cholerę nie wiem jak z tego co projektor odeśle użyć konkretnych bajtów i jak je zamienić na cokolwiek zrozumiałego dla człowieka. W powyższym przypadku projektor powinien podać czas pracy lampy w sekundach.

Czyli - jak mam odczytać konkretne bajty z tego co przyjdzie od projektora?
Jak to zamienić na cokolwiek zrozumiałego?

Podejrzewam, że większość z was uzna ten wątek za śmieszny ale dla kogoś kto próbuję się czegoś nauczyć - jest to dość skomplikowana kwestia :)

Z góry dzięki za pomoc
PS. Nie oczekuję rozwiązań na tacy :)

1
char flampFameData[] = { 0x76, 0x90, 0x00, 0x33, 0x6f, 0x3d };
if (flampFameData[0] != LampDataMark) {
    return error;
}
f (flampFameData[1] != LampCounterMark) {
    return error;
}
long unsigned lampLifetime = 0;
int i;
// read big endian value
for (i=2; i<6; ++i)
    lampLifetime = (lapLifetime << 8) | (unsigned char)flampFameData[i];

fprintf(stdout, "Lamp lifetime is: %lu", lampLifetime);

1 użytkowników online, w tym zalogowanych: 0, gości: 1