Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 9 kwi 2025, o 12:12


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 
    Autor Wiadomość
    PostNapisane: 7 sie 2014, o 22:17 
    Offline
    Użytkownik

    Dołączył(a): 05 gru 2013
    Posty: 246
    Pomógł: 0

    Mam problem z komunikacją po TCP.
    Próbuję napisać klienta MPC (Music Player Daemon) na Raspberry Pi, który w zamyśle ma wyświetlać kilka informacji na LCD. Zanim jednak przejdę do parsowania danych i sterowania wyświetlaczem, muszę sprawić, że popłyną dane. Z samym zainicjowaniem połączenia nie ma problemu. Program tworzy socketa i nawiązuje połączenie. Udaje mi się wysłać też pierwszą wiadomość. Potem zaczynają się dziać dziwne rzeczy...

    Program powstał na bazie jakiegoś przykładu z Internetu. Kłopotliwy fragment wygląda następująco:

    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Efekt działania programu wygląda następująco:

    Kod:

    Client-socket() OK
    Connection established...
    Sending command currentsong
     to the server localhost...
    Client-write() is OK
    String successfully sent lol!
    Waiting the localhost to echo back...
    1 bytes received
    OK MPD 0.16.0
    file: Janis Jop
    1 bytes received
    lin - 18 essential songs/18-M
    1 bytes received
    e And Bobby McGee.mp3
    Last-Mo
    1 bytes received
    dified: 2006-03-23T09:55:41Z

    1 bytes received
    Time: 237
    Artist: Janis Jopli
    1 bytes received
    n
    Title: Me And Bobby McGee
    A
    1 bytes received
    lbum: 18 essential songs
    Trac
    1 bytes received
    k: 18/18
    Genre: Psychedelic R
    1 bytes received
    ock
    Pos: 37
    Id: 37
    OK
    delic R




    Potem nie dzieje się kompletnie nic. Nie wywala błędu, nie wychodzi z programu - po prostu kursor stoi w miejscu, a żadne dane nie napływają, chociaż teoretycznie program po odebraniu i wyświetleniu wszystkich przychodzących danych powinien wysłać kolejnego requesta i zacząć cały proces od nowa. Wygląda to tak, że zawieszenie działania następuje gdzieś w trakcie wykonywania tego fragmentu:

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Nigdy nie dochodzi do wyświetlenia wiadomości "koniec odbioru".

    Ktoś ma jakiś pomysł?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 7 sie 2014, o 23:00 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 07 kwi 2013
    Posty: 418
    Lokalizacja: Rzeszów
    Pomógł: 102

    Zapewne funkcja "read" oczkuje na odbiór danych i na tej podstawie wykonywane są dalsze działania.
    Pewnie nie jest w stanie odebrać "nic" i zwrócić wartość 0, która przerwałaby działanie pętli.

    W tym przypadku jedyne co mi na szybko przychodzi do głowy to ustalenie pewnego timeout'u w stylu:

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Oczywiście czas trzeba dobrać odpowiednio (najlepiej doświadczalnie ;) ), a najlepiej użyć timer'ów.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 8 sie 2014, o 07:08 
    Offline
    Użytkownik

    Dołączył(a): 20 wrz 2013
    Posty: 647
    Zbananowany użytkownik

    Pomógł: 101

    W linii 32 jest dosyć istotny błąd, chociaż chyba nie związany z zawieszeniem programu, który powoduje, że ilość odczytanych bajtów jest 1. Zgodnie z priorytetem operatorów powinno być tak::
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Zresztą, może to być powodem zawieszania, wystarczy, że read() zwróci błąd.

    ~~~ (intensywne procesy myślowe) ~~~

    ....chociaż nie, po przemyśleniu uważam jednak to nie to. Prawdopodobnie, jak kolega post wyżej zauważył, read() czeka na dane. Jeżeli jest to działanie nieporządane to proponuję zainteresować się flagami kontrolnymi funkcji open() a w szczególności O_NONBLOCK.

    _________________
    +++++[>++++<-]>[>++++++<-]>.---------.+++.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 8 sie 2014, o 17:26 
    Offline
    Użytkownik

    Dołączył(a): 05 gru 2013
    Posty: 246
    Pomógł: 0

    Udało mi się nieco popchnąć sprawę do przodu. Teraz niby jakaś komunikacja występuje, ale nie taka, jak być powinna.
    Program prawidłowo reaguje tylko na pierwszą komendę, potem wariuje i nie widzi pozostałych...

    Cały kod programu wygląda następująco:

    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Pod konsolą wygląda to następująco:

    Kod:
    Client-socket() OK
    Connection established...
    OK MPD 0.16.0

    Type command:
    currentsong
    Sending command currentsong
     to the server localhost...
    Client-write() is OK
    String successfully sent
    Waiting for reply fromMPD server...
    Server response is:

    file: Frank Turner/Frank Turner - England Keep My Bones (2011)/07 - One Foot Before The Other.mp3
    Last-Modified: 2011-06-27T19:26:46Z
    Time: 206
    Artist: Frank Turner
    AlbumArtist: Frank Turner
    Title: One Foot Before The Other
    Album: England Keep My Bones
    Track: 7/12
    Date: 2011
    Genre: Alternative
    Pos: 1
    Id: 1
    OK



    Type command:
    stats
    Sending command stats
     to the server localhost...
    Client-write() is OK
    String successfully sent
    Waiting for reply fromMPD server...
    Server response is:

    ACK [5@0] {} No command given



    Type command:
    status
    Sending command status
     to the server localhost...
    Client-write() is OK
    String successfully sent
    Waiting for reply fromMPD server...
    Server response is:

    ACK [5@0] {} No command given



    Type command:
    play
    Sending command play
     to the server localhost...
    Client-write() is OK
    String successfully sent
    Waiting for reply fromMPD server...
    Server response is:

    ACK [5@0] {} No command given



    Type command:
    stop
    Sending command stop
     to the server localhost...
    Client-write() is OK
    String successfully sent
    Waiting for reply fromMPD server...
    Server response is:

    ACK [5@0] {} No command given



    Type command:



    Ktoś ma może jakiś pomysł, co może być nie tak? Dlaczego nie widzi prawidłowo moich komend?
    Pod telnetem wszystko działa...



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 9 sie 2014, o 06:11 
    Offline
    Użytkownik

    Dołączył(a): 05 gru 2013
    Posty: 246
    Pomógł: 0

    Przepraszam za zamieszanie, już znalazłem przyczynę.
    W przykładzie, na którym się opierałem zastosowano następującą konstrukcję:

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Tymczasem powinno być:

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    Wyświetl posty nie starsze niż:  Sortuj wg  
    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


    Nie możesz rozpoczynać nowych wątków
    Nie możesz odpowiadać w wątkach
    Nie możesz edytować swoich postów
    Nie możesz usuwać swoich postów
    Nie możesz dodawać załączników

    Szukaj:
    Skocz do:  
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO