Skocz do zawartości

Pico W - problem z socket. PYTHON


tomek6068

Pomocna odpowiedź

 

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

pico-socket.jpg

Edytowano przez tomek6068
Link do komentarza
Share on other sites

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

(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 przez tomek6068
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

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

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

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.

  • Lubię! 1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

(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 przez tomek6068
Link do komentarza
Share on other sites

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ę »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.