tomek6068 Napisano Lipiec 10, 2023 Udostępnij Napisano Lipiec 10, 2023 (edytowany) Witam. Mam taki problem. Próbuję na Raspberry Pi Pico W postawić server używająć socketów. Po piątej "wymianie" informacji między klientem a serwerem (prosta odpwoeidz na połaczenie) następuje zawieszenie komunikacji po stronie Pico (testowałem to między PC z Windowsem i RPi Zero i wszystko działało (oczywiscie bez fragmentu kodu o łaczeniu z wifi z pico)) co 3 sekundy nastepowała wymiana wiadomości i tak w nieskończoność. Problem pojawia się w momencie postawienia servera na Pico. Dodam że nie jestem biegły w Pythonie. Hobbystycznie bawię się w programowanie mikrokontrolerów (przerabiałem już arduino 🙂) Kod servera na Pico: from machine import Pin import network import utime import rp2 import socket as s rp2.country('PL') HOST='192.168.1.38' PORT=1310 BUFFER=1024 led=Pin("LED", Pin.OUT) led.off() wifi=network.WLAN(network.STA_IF) wifi.active(True) wifi.config(pm = 0xa11140) ssid='salon-24' password='*******' wifi.connect(ssid, password) timeout=10 while timeout > 0: if wifi.status() < 0 or wifi.status() >= 3: break timeout -= 1 print('Czekam na połaczenie ...') utime.sleep(1) if wifi.status() != 3: print('Błąd połączenia') else: led.on() status=wifi.ifconfig() print('Twoje IP ' + status[0]) server_socket=s.socket(s.AF_INET, s.SOCK_STREAM) server_socket.bind((HOST,PORT)) server_socket.listen(2) while True: client_socket, address = server_socket.accept() print(f'Podłaczono z {address}') wiadomosc=client_socket.recv(BUFFER).decode("utf8") print(wiadomosc) KOD KLEINTA NA RPI ZERO: import socket as s import time HOST='192.168.1.38' # adres servera PORT=1310 # port Sertvera BUFFER=1024 while True: try: client_socket=s.socket(s.AF_INET, s.SOCK_STREAM) client_socket.connect((HOST,PORT)) wiadomosc="wiadomosc testowa".encode("utf8") client_socket.send(wiadomosc) #msg=client_socket.recv(BUFFER).decode("utf8") #print(msg) #client_socket.close() time.sleep(3) except: print('Koniec') break Edytowano Lipiec 10, 2023 przez tomek6068 Link do komentarza Share on other sites More sharing options...
H1M4W4R1 Lipiec 10, 2023 Udostępnij Lipiec 10, 2023 4 godziny temu, tomek6068 napisał: #client_socket.close() Może warto by zamknąć połączenie po wysłaniu wiadomości, a nie otwierasz kilkanaście połączeń i liczysz, że MCU magicznie to ogarnie? To nie komputer 😉 Link do komentarza Share on other sites More sharing options...
tomek6068 Lipiec 10, 2023 Autor tematu Udostępnij Lipiec 10, 2023 (edytowany) 1 godzinę temu, H1M4W4R1 napisał: Może warto by zamknąć połączenie po wysłaniu wiadomości, a nie otwierasz kilkanaście połączeń i liczysz, że MCU magicznie to ogarnie? To nie komputer 😉 Doprecyzuję. Akurat to co wkleiłem, jest tam zakomentowane #client_socket.close() bo próbowałem na różne sposoby stąd i ta opcja bez użyciai close. Właśnie problem polega na tym że pod odkomentowaniu tej lini dalej to samo. Wiem że zatyka Pico ale nie wiem jak to rozwiązać. Edytowano Lipiec 10, 2023 przez tomek6068 Link do komentarza Share on other sites More sharing options...
matsobdev Lipiec 10, 2023 Udostępnij Lipiec 10, 2023 (edytowany) Nie wystarczy powtarzać .send()? Jeśli nie to, to może: import gc del client_socket gc.collect na koniec pętli. Chociaż nie, nic nie warte 😄 Edytowano Lipiec 10, 2023 przez matsobdev Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Produkcja i montaż PCB - wybierz sprawdzone PCBWay! • Darmowe płytki dla studentów i projektów non-profit • Tylko 5$ za 10 prototypów PCB w 24 godziny • Usługa projektowania PCB na zlecenie • Montaż PCB od 30$ + bezpłatna dostawa i szablony • Darmowe narzędzie do podglądu plików Gerber Zobacz również » Film z fabryki PCBWay
tomek6068 Lipiec 10, 2023 Autor tematu Udostępnij Lipiec 10, 2023 16 minut temu, matsobdev napisał: Nie wystarczy powtarzać .send()? Jeśli nie to, to może: import gc del client_socket gc.collect Dziękuję za odpowiedź. Wkleiłem to do pętli jak mi się wydaje 🙂 w miejcu jak poniżej, ale niestety nie działą chyba że coś źle zrobiłęm. Z tym send() w pętli pomysł jest dobry ale jak chcę docelowo aby 2 lub 3 różne zewnętrzne urządzenia łączyły sie z tym serwerem na piko, pobrały dane i się rozłączły i tak co jakiś czas. Tego klienta "pytającego "stworzyłem żeby pokazać problem który się pojawia. (zapytania mogą sie powjawiać w odstępei 5 minut a i tak po 5 razie przestaje działać) while True: # odbieranie połączenia od klienta client_socket, address = server_socket.accept() print(f'Podłaczono z {address}') print(client_socket.recv(BUFFER).decode("utf8")) del client_socket gc.collect Link do komentarza Share on other sites More sharing options...
ReniferRudolf Lipiec 10, 2023 Udostępnij Lipiec 10, 2023 Masz chyba jakiś problem w tej pętli "while True". Metoda accept() zwraca przy każdym wywołaniu nowy socket - client_socket. Po zakończeniu komunikacji z klientem ten client_socket musi zostać zwolniony przez wywołanie metody client_socket.close(). Jest całkiem możliwe, że Twój serwer wisi w wywołaniu metody accept(), która nie zwraca rezultatu, ponieważ nie ma zasobów (socketów) do obsłużenia jeszcze jednego połączenia od klienta. 1 1 Link do komentarza Share on other sites More sharing options...
tomek6068 Lipiec 10, 2023 Autor tematu Udostępnij Lipiec 10, 2023 (edytowany) 7 minut temu, ReniferRudolf napisał: Masz chyba jakiś problem w tej pętli "while True". Metoda accept() zwraca przy każdym wywołaniu nowy socket - client_socket. Po zakończeniu komunikacji z klientem ten client_socket musi zostać zwolniony przez wywołanie metody client_socket.close(). Jest całkiem możliwe, że Twój serwer wisi w wywołaniu metody accept(), która nie zwraca rezultatu, ponieważ nie ma zasobów (socketów) do obsłużenia jeszcze jednego połączenia od klienta. Dziękuję !!!!! Dokładnie o to chodziło. client_socket.close() w pętli servera. Ja to dawałem w kliencie i kicha. Problem rozwiązany. Dziękuję wszystkim za pomoc. Edytowano Lipiec 10, 2023 przez tomek6068 Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Bądź aktywny - zaloguj się lub utwórz konto!
Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony
Utwórz konto w ~20 sekund!
Zarejestruj nowe konto, to proste!
Zarejestruj się »Zaloguj się
Posiadasz własne konto? Użyj go!
Zaloguj się »