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



Teraz jest 24 kwi 2024, o 09:22


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 12 ] 
Autor Wiadomość
PostNapisane: 16 sie 2014, o 09:01 
Offline
Użytkownik

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

Próbuję napisać prosty kod w PHP, który pośredniczyłby w komunikacji pomiędzy mną, a czujnikiem na Atmedze i układzie ENC28J60. Sam czujnik komunikuje się ze światem za pomocą pakietów UDP. Po wysłaniu requestu (komenda AT) zwraca określoną wartość, zapisaną w formie liczby całkowitej - odbiorca musi sobie to już sam przeliczyć.

Aplikacja w PHP ma realizować następujące zadania:
1) Utworzenie socketu sieciowego do obsługi UDP.
2) Wysłanie zapytania w formie odpowiedniej komendy AT.
3) Odebranie odpowiedzi i wyświetlenie przeliczonego wyniku.

Na razie próbuję zrealizować podstawową komunikację i niestety już trafiłem na problem...

Na chwilę obecną kod wygląda następująco:

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


Niestety jego wykonanie powoduje wyświetlenie pustej strony w przeglądarce. Co ciekawe, jeśli odkomentuję ostatnią partię (odpowiedzialną za odbiór pakietu) wcześniejsza część się wykonuje, dając w przeglądarce następującą treść:

Cytuj:
zaczynamy
Socket utworzony
Komenda AT+CPM została wysłana z powodzeniem


Przejrzałem kilka różnych tutoriali i z tego co widzę, wszędzie jest to robione podobnie. Gdzie może leżeć przyczyna?



Ostatnio edytowano 20 sie 2014, o 17:51 przez Atlantis, łącznie edytowano 5 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 sie 2014, o 12:38 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 cze 2013
Posty: 988
Lokalizacja: Byram, MS 39272
Pomógł: 55

Atlantis napisał(a):
Przejrzałem kilka różnych tutoriali i z tego co widzę, wszędzie jest to robione podobnie. Gdzie może leżeć przyczyna?



Nie widziałem tutoriali ale czy podobnie znacz tak samo? Ja robiłem kiedyś takie cosie ale w całkiem inny sposób. Jak znajdę czas i w między czasie nikt Ci nie pomoże to poszukam w starociach i podeśle.

_________________
Pomysły na podpis - wyślij SMSa +1 769 243 0011



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 sie 2014, o 12:41 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sty 2013
Posty: 272
Pomógł: 3

Zacznij od dodania na samym początku:

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


bo skoro się wyświetla pusta strona to pewnie masz jakiś błąd ale jest domyślnie ukryty.

Jaka wersja PHP? Na czym to odpalasz? WebServ? XAMPP?

@edit
Zobacz na pierwszą z brzegu funkcję http://uk1.php.net/manual/en/function.socket-create.php
Podajesz jej trzy parametry, z czego ostatni to 0! Czemu? Skoro w manualu jest napisane:
Cytuj:
The protocol parameter sets the specific protocol within the specified domain to be used when communicating on the returned socket. The proper value can be retrieved by name by using getprotobyname(). If the desired protocol is TCP, or UDP the corresponding constants SOL_TCP, and SOL_UDP can also be used



@edit2
socket_sendto
Masz w parametrze "len" podać długość w bajtach, póki co podajesz ilość znaków.


I dodaj na końcu skryptu:
http://uk1.php.net/manual/en/function.socket-close.php

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 sie 2014, o 14:59 
Offline
Użytkownik

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

arturf209 napisał(a):
Jaka wersja PHP?


5.4.4-14+deb7u12

Cytuj:
Na czym to odpalasz? WebServ? XAMPP?


lighttpd


Cytuj:
Podajesz jej trzy parametry, z czego ostatni to 0! Czemu? Skoro w manualu jest napisane:


Na samym początku próbowałem zastosować flagę SOL_UDP, efekt był dokładnie taki sam. Zero wkleiłem dopiero później, ponieważ taką konstrukcję zastosowano w jakimś tutorialu. Jak nie trudno się domyślić - nie pomogło.


Cytuj:
Masz w parametrze "len" podać długość w bajtach, póki co podajesz ilość znaków.


To akurat nie powinno mieć nic do rzeczy. Po pierwsze sendto raportuje poprawne wysłanie komendy, biały ekran nie pojawia się na tym etapie, o ile tyko mam zakomentowane recvrom. Po drugie widzę, że pakiety docierają do czujnika - po przy ciągłym odświeżaniu strony ze skryptem miga dioda RX na urządzeniu.
Poza tym znam swoje urządzenie i wiem, że problem zwyczajnie nie może leżeć tutaj. Brakujące \0 na końcu w razie czego i tak jest "dorabiane", natomiast jeśli wysłałbym błędną komendę, to i tak otrzymałbym zwrotną wiadomość o treści "+INFO: UNKNOWN COMMAND". Parsowanie komend odbywa się na poziomie pakietów - nie są one rozkładane na linie. Wszystko wg zasady "jeden pakiet - jedna wiadomość". Tak więc możliwości są dwie:
1) Wyślę nieprawidłową komendę - dostanę info o błędzie.
2) Wyślę prawidłową komendę - dostanę wartość, o którą prosiłem.

Tutaj zwyczajnie nie ma miejsce na brak odpowiedzi.

Cytuj:


Nie pomogło. Chociaż oczywiście masz rację, że to polecenie powinno się tam znaleźć.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 sie 2014, o 19:44 
Offline
Użytkownik

Dołączył(a): 05 lut 2013
Posty: 302
Pomógł: 19

a co logiem dodaniem: error_reporting(E_ALL); ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 sie 2014, o 21:40 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sty 2013
Posty: 272
Pomógł: 3

charsz napisał(a):
a co logiem dodaniem: error_reporting(E_ALL); ?

Kolega ma racje, specjalnie dodałem to na samym początku, abyś przypadkiem nie przeoczył.

_________________
sig off ;(



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

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

charsz napisał(a):
a co logiem dodaniem: error_reporting(E_ALL); ?


Jego dodanie nie zmieniło absolutnie niczego. Wciąż wyświetla się biała strona, bez jakichkolwiek informacji o błędach.
Żeby było ciekawiej, najwyraźniej socket jest cały czas inicjowany i pakiety wysyłają się poprawnie - przy odświeżaniu strony ze skryptem miga dioda na czujce.



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

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

Pomógł: 101

W logu też nic nie ma?

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 sie 2014, o 20:49 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sty 2013
Posty: 272
Pomógł: 3

Specjalnie dla Ciebie zainstalowałem sobie xampp'a i przetestowałem kod:
Składnia: [ Pobierz ] [ Ukryj ]
język php
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


W wyniku jego działania otrzymuję:
Cytuj:
zaczynamy
Socket utworzony
Komenda AT+CPM została wysłana z powodzeniem


Bez reszty z odbieraniem :)

P.S. Jeżeli nie używasz formatowania, a tego nie robisz to używaj
Składnia: [ Pobierz ] [ Ukryj ]
język php
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

będzie znacznie szybsze :)

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sie 2014, o 22:55 
Offline
Użytkownik

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

Dzisiaj spróbowałem jeszcze z serwerem TCP i funkcją socket_recv(). Sytuacja wygląda dokładnie tak samo. Czyżby winę ponosi system /serwer HTTP/PHP na moim Raspberry Pi? Nie mam już pomysłów... Ktoś ma jakieś sugestie co do tego go jeszcze mogę sprawdzić?



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

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

Naprawdę nie wiem skąd ten ton...

1) To, że nie zdaje dokładnego raportu nie znaczy, nie nie sprawdziłem rozwiązań zaproponowanych wcześniej. Sprawdziłem i nie przyniosły one żadnego rezultatu. Ponieważ w wątku była cisza postanowiłem przeprowadzić eksperyment i sprawdziłem, czy ten sam problem będzie dotyczył także połączenia po TCP. Okazuje się, że występuje dokładnie taki sam objaw. Podzieliłem się tą dodatkową informacją sądząc, że może komuś skojarzy się z jakąś przyczyną. Zamiast tego zostałem bezpodstawnie oskarżony o ignorowanie udzielonych mi rad.
2) Za zdecydowane przegięcie uważam wkładanie w moje usta słów, których nigdy nie wypowiedziałem. Proszę o wskazanie miejsca, w którym miałem rzekomo napisać "To za proste, tego nie chcę, to zbyt prymitywne... ".
3) Wspomniany drugi wątek dotyczył zupełnie innej sytuacji, innego języka i innego połączenia sieciowego. To, że kilka dni temu natknąłem się na problem podczas korzystania z socketów w PHP nie znaczy, że podobny (ale zupełnie inny w swojej naturze) problem w programie C mam opisywać w tym samym wątku. Gdyby stosować się takich zasad, to dopiero zrobiłby się bałagan na forum.
4) Nigdy nie twierdziłem, że jestem specjalistą od socketów. Zgodnie z prawdą napisałem tylko, że już miałem okazję je stosować. Wielokrotnie też powtarzałem, że dopiero uczę się C, a już w szczególności pod Linuksem, tak więc nieraz może mi umknąć coś, co dla kolegi jest "oczywistą oczywistością".
5) Wniosek o błędnie działającym/skonfigurowanym systemie nie wziął się tylko z tej sytuacji. Kiedyś próbowałem odpalić kilka różnych "webowych" klientów MPD, napisanych w PHP. Chociaż wszystko było dokładnie opisane w ich dokumentacji i tutorialach, niektóre za nic nie chciały działać - zupełnie jakby właśnie łączność z serwerem zawodziła. Wtedy sobie darowałem i zastosowałem najprostszy, który akurat nie robił problemów. Teraz ta sytuacja mi się przypomniała.
6) IPTABLES mam akurat tak skonfigurowane, że przepuszczają cały ruch po localhost. To sprawdzałem już na samym początku, poza tym chyba wspominałem, że łączność "symulowana" za pomocą telnetu albo netcata działa.

7) Pakiety jak już mówiłem są wysyłane - to sprawdziłem. Czy wracają - sprawdzę. W każdym razie urządzenie na 100% je odbiera, a inne programy (poza tym skryptem PHP) wyświetlają te odpowiedzi prawidłowo. Tak czy inaczej, czy nie jest dziwne, że wywołanie socket_recv/socket_revcfrom powoduje wyświetlenie pustej strony, nawet bez komunikatów, które bez tego się pojawiają? Bez jakikolwiek informacji o błędach?
8)Co do zezwoleń na komunikację, to phptest podaje następującą informację:

Cytuj:
Registered Stream Socket Transports: tcp, udp, unix, udg, ssl, sslv3, tls


I żeby nie było. Ja naprawdę nie uchylam się od krytyki, nie unikam także lektury dokumentacji. Po prostu sytuacja z wyświetlaniem pustej strony wydaje mi się na tyle nietypowa, że zadanie pytania na forum zdaje się być lepszym pomysłem niż wertowanie podręczników i manuali.



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

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

Zainstalowałem TCP dump i muszę powiedzieć, że sprawa wygląda jeszcze dziwniej. Skrypt w wersji podstawowej, właściwie takiej jak na początku (z drobnymi poprawkami, które zasugerowano później). Wysyła do czujnika request w pakiecie UDP, ale socket_recvfrom() jest jak na razie zakomentowane. Jak widać pakiet wychodzi, a czujnik wysyła odpowiedź.

Kod:
marek@raspberrypi ~ $ sudo tcpdump -n "dst host 192.168.1.85 or src host 192.168.1.85"
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
16:32:48.975686 IP 192.168.1.95.60656 > 192.168.1.85.56345: UDP, length 6
16:32:48.977195 IP 192.168.1.85.56345 > 192.168.1.95.60656: UDP, length 10
16:32:53.984842 ARP, Request who-has 192.168.1.85 tell 192.168.1.95, length 28
16:32:53.986006 ARP, Reply 192.168.1.85 is-at 00:a4:b0:fa:51:c3, length 46


Sytuacja wygląda dziwniej po odkomentowaniu socket_recvfrom() - wtedy tcpdump nie wychwytuje niczego. Zupełnie jakby umieszczenie tej jednej instrukcji w kodzie uniemożliwiało odpalenie całego skryptu. Zgadzałoby się to z brakiem jakichkolwiek oznak działania kodu (pusta strona). Jest jednak jedno "ale" - przy ciągłym odświeżaniu przeglądarki (przytrzymany klawisz F5) szybko miga dioda na złączu RJ45 czujnika - zupełnie jakby odbierał jakieś pakiety. Tcpdump nie wykrywa wtedy jednak żadnych pakietów...

EDIT:

Hmm... Przy odświeżaniu przeglądarki jest rejestrowany ruch między Raspberry Pi (serwer HTTP) i desktopem (klient), co nie jest niczym dziwnym. Tylko w jaki sposób odbija się to od czujnika, który jest podłączony do switcha (nie, to switch, a nie hub)?

Kod:
marek@raspberrypi ~ $ sudo tcpdump -n "src host 192.168.1.95 and dst net 192.168.1.0/24"
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
16:56:36.506646 IP 192.168.1.95.80 > 192.168.1.2.49723: Flags [P.], seq 901:1081                                                                                                 , ack 2083, win 660, length 180
16:56:36.596011 IP 192.168.1.95.80 > 192.168.1.2.49724: Flags [P.], seq 901:1081                                                                                                 , ack 2083, win 660, length 180
16:56:36.747323 IP 192.168.1.95.80 > 192.168.1.2.49725: Flags [P.], seq 901:1081                                                                                                 , ack 2083, win 660, length 180
16:56:36.874109 IP 192.168.1.95.80 > 192.168.1.2.49726: Flags [P.], seq 901:1081                                                                                                 , ack 2083, win 660, length 180
16:56:37.011675 IP 192.168.1.95.80 > 192.168.1.2.49722: Flags [P.], seq 1081:126                                                                                                 1, ack 2430, win 660, length 180
16:56:37.147083 IP 192.168.1.95.80 > 192.168.1.2.49723: Flags [P.], seq 1081:126                                                                                                 1, ack 2430, win 660, length 180
16:56:37.275336 IP 192.168.1.95.80 > 192.168.1.2.49724: Flags [P.], seq 1081:126                                                                                                 1, ack 2430, win 660, length 180
16:56:37.386606 IP 192.168.1.95.80 > 192.168.1.2.49725: Flags [P.], seq 1081:126                                                                                                 1, ack 2430, win 660, length 180



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: 12 ] 

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