logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[ATMEGA][C] - Porządny stos TCP/IP na AVR (alternatywa dla tuxgraphics.org)

adambehnke 30 Gru 2014 09:04 9768 84
  • #1 14270668
    adambehnke
    Poziom 24  
    Witam

    Wiem że na forum wałkowane były te tematy ale nie znalazłem w nich nic co by mnie nakierowało na moje potrzeby więc zakładam nowy temat.

    Przez ostatnie dwa tygodnie użerałem się wraz z kolegami z forum(za co im bardzo dziękuję) nad przesyłaniem pakietów UDP do sieci internet.
    Niestety mam tak wspaniały router od Orange (FUNBOX) że jest to praktycznie niemożliwe. Czekam na kontakt z BOK ale pewnie jeszcze długo poczekam zanim zostanę "olany" dosłownie.

    Zatem.
    Poszukuję jakiegoś dobrego i sprawdzonego stosu TCP/IP na małe avr-ki ( u mnie akurat Mega32) .
    Do tej pory stosowałem biblioteki z tuxgraphics.org ale one nie są pierwszych lotów.
    Fakt że do UDP w sieci lokalnej się nadają ale chciałbym spróbować czegoś lepszego.
    Teraz z uwagi na to że nie mogę u siebie zastosować UDP muszę przejść na TCP.
    Myślałem o uIP ale nie mogę znaleźć jakichś sensownych przykładów przesyłania i odbierania w ramach jednego programu jakichś stringów.
    U mnie w urządzeniu które robię będzie to wyglądało tak że mój moduł będzie odpytywany z internetu. To znaczy że gdzieś tam w kraju użyję PC lub tablet, uruchomię aplikację którą piszę i wyślę zapytanie do mojego modułu avr w domu.
    Moduł ten rozpozna zapytanie i udzieli stosownego raportu.

    Może ktoś orientuje się czym powinienem się zainteresować i po jakie biblioteki sięgnąć. Albo może ma pod ręką jakieś stosowne przykłady?
    Jak pisałem chcę pominąć biblioteki z tuxgraphics.
  • #2 14271022
    tmf
    VIP Zasłużony dla elektroda
    IMHO w takim przypadku czas na przesiadkę na jakiegoś większego ARMa. AVR8 to mimo wszystko proste mikrokontrolerki, a porządna obsługa stosu TCP/IP wymaga pewnej ilości pamięci RAM na bufory i sporo kodu, którego jedynym zadaniem jest sprawdzanie poprawności pakietów. To co odbierasz/nadajesz też trzeba mieć gdzie poskładać. Z tego co widziałem, wszelkie stosy na AVR powstały w celach rozrywkowo/zabawowych a nie do czegoś poważniejszego. Pewną protezą jest zastosowanie scalonych kontrolerów ethernetu, które implementują elementy stosu, ale sławny ENC jest też raczej zabugowaną zabawką. Są poważniejsze moduły WiFi ze stosem na pokładzie, np. Redpine, łatwo się to łączy z AVR. Także raczej szukłabym w kierunku modułów z zaimplementowanym stosem, jeśli już musi to być na AVR.
  • #3 14271214
    adambehnke
    Poziom 24  
    Używam właśnie sławnego ENC. I na razie przesiadka mi nie potrzebna do tego celu który chcę osiągnąć. Fakt ARM fajna sprawa ale nie w tej chwili jeszcze,gdyż znów trzeba by było siedzieć i "kuć" zanim cokolwiek udało by mi się uruchomić.A i osprzętu w tym momencie nie mam żadnego jak np. programatora etc.
  • #4 14271350
    tronics
    Poziom 38  
    Biorąc pod uwagę, że na dobrą sprawę AVR8 zatrzymuje się na 8KB RAM, a większość nawet tanich ARM od tej ilości mniej więcej startuje to nie ma się chyba co dłużej zastanawiać skoro potrzeba bardziej rozbudowanej obsługi. Niektóre ARMy mają w sobie nawet część funkcjonalności ethernet z wydzielonym na te potrzeby obszarem RAM.
  • #5 14271412
    tmf
    VIP Zasłużony dla elektroda
    Na szczęście AVR8 mają do 32 kB RAM, to ciągle nie porywa, niemniej jednak mamy problem z porządnym stosem. Do projektów ethernetowych wziąłbym coś na czym da się skompilować coś żywcem wziętego z linuksa, a przynajmniej stos, co do którego można mieć jakieś zaufanie. Niestety tego typu soft dla AVR jest pisany na zasadzie "a jednak się da" i np. z bezpieczeństwem, a przynajmniej odpornością na niestandardowe pakiety nie ma nic wspólnego. Także do sieci domowej, jako sterowanie LEDa przez ethernet to ok, ale jeśli to ma być urządzenie pracujące normalnie w sieci to IMHO wyłącznie gotowe moduły z wbudowanym stosem jeśli na siłę pchać się w AVRy.
  • #6 14271552
    tronics
    Poziom 38  
    Cytat:
    Na szczęście AVR8 mają do 32 kB RAM

    Seria mega kończy się na 8 (atmega2560, 2561), dopiero xmega a1 i a3 to 16KB, B też 16, jedynie C3 ma topowo 32KB. Przy czym w tej samej cenie bez problemu znajdziesz ARM z 2x szybszym zegarem i 2-3x większą pamięcią RAM (i więcej DMA, i więcej timerów, etc. etc.) W tym przypadku oprócz sentymentu (tudzież znajomości jedynie tej rodziny MCU) nie ma chyba pojedynczego atutu przemawiającego za AVR. Z drugiej strony sam Atmel tak jasno nie wydziela AVR8 poza swoje działania w zakresie IoT więc może coś się też w tej sprawie ruszy.
  • #7 14271631
    adambehnke
    Poziom 24  
    Moduł mam już gotowy i nie będę na razie pchał się w nową zabawę z PCB itp. Do tej pory moduł pracował jakieś 2 lata i obsługiwał pakiety UDP. Niestety mam w tej chwili tak "gówn..." router i operatora że nie mogę dalej pozostać przy UDP i muszę przejść na TCP tylko ze względu na operatora. Może brzmi to komicznie ale tak jest.
    Jak robiłem ten moduł to pamiętam że męczyłem się okropnie z TCP i dlatego wybór wtedy padł na UDP. I słusznie bo znakomicie się sprawował. Ale teraz czas na zmianę. Nie wykluczam nowego modułu już na innym procku ale jeszcze nie teraz.
    Dlatego pytam czy ktoś bawił się na AVR8 czymś sensownym.
  • #8 14271696
    michalko12
    Specjalista - Mikrokontrolery
    tronics napisał:
    Seria mega kończy się na 8 (atmega2560, 2561)


    Ehhh.. ATmega1284 - 16kB

    uIP i AVR to dobra para, można na tym spokojnie robić komunikację. Z uIP jest mały problem jeśli chodzi o retransmisje, ale można to obejść. W dodatku TCP można tak skonfigurować, że i cały stos ruszy na 512B ramu.
  • #10 14271786
    excray
    Poziom 41  
    michalko12 napisał:
    Ehhh.. ATmega1284 - 16kB

    ATmega2564 ma nawet 32kB :-)
  • #11 14271865
    michalko12
    Specjalista - Mikrokontrolery
    excray napisał:
    ATmega2564 ma nawet 32kB

    To jakaś nowość w stosunku do tego kiedy ja tam zaglądałem.

    Dodam jeszcze, że A. Dunkels pisał uIP na AT90S8515. Pod ten procesor były pierwotne źródła tego stosu.
  • #12 14271953
    tronics
    Poziom 38  
    @excray - taa, qfn64 tak łatwo się lutuje. Za 27zł mamy STM32F105 z usb otg i ethernetem oraz jak pisałem 2x więcej RAM i 2x wyższa dopuszczalna częstotliwość. Na swoją obronę dodam, że akurat wspomniane uC są (może poza 1284) nie do dostania dla hobbystów (a sama mega2564 jest w zasadzie jedynie w farnellu dostepna).
  • #13 14272476
    adambehnke
    Poziom 24  
    michalko12 napisał:
    uIP i AVR to dobra para, można na tym spokojnie robić komunikację.


    Dlatego właśnie pytałem o uIP. Trochę sobie poczytałem zanim zapytałem na forum. A czy może dysponuje ktoś jakimiś fragmentami działających(sprawdzonych) kodów i bibliotekami? Słyszałem że jest kilka wersji bibliotek i nawet są jakieś z zeszłego roku uaktualnione.
  • #14 14273274
    michalko12
    Specjalista - Mikrokontrolery
    Napisałem, że AVR i uIP do dobra para, ale nie napisałem, że implementacja tego stosu wymaga od programisty trochę większego zaawansowania niż zabawki z tuxgraphix. uIP stosowałem na AVR jakieś 10 lat temu. Jak się do tego zabierałem to opanowałem teorię związaną z protokołami, wydrukowałem sobie źródła uIP i przez kilka dni rozgryzałem linijkę po linijce z fleszerami w ręku.
  • #16 14275715
    adambehnke
    Poziom 24  
    Po przeczytaniu całej masy wszelkiej maści opisów bibliotek wydaje mi się że chyba nie ma potrzeby abym przechodził na inne biblioteki gdyż na avr zbyt wiele nie zaoferują mi w porównaniu do bibliotek z tuxgraphix.
    Zatem jedynym słusznym rozwiązaniem jest wykorzystanie tego co mam i przejście na TCP.

    Testowałem sobie komunikację pomiędzy dwoma PC programem TCP TEST TOOL i wszystko działa bezbłędnie(no prawie bo czasem nie mogę nawiązac połaczenia)
    Ale znów problem. O ile w VB.NET na PC nie mam problemu aby napisać sobie aplikację klient-serwer to na avr nie wiem od czego zacząć.
    Pozostanę już przy bibliotece z tuxgraphics , skoro działało mi na tym UDP to i TCP powinno pójść.
    Szukałem w sieci przykładów połączenia TCP za pomocą tych bibliotek ale wszędzie ładują obsługę przez przeglądarkę internetową a to mi nie potrzebne.
    Mój moduł ma łączyć się z każdym IP jakie będzie próbowało nawiązać połączenie.
    Kwestie bezpieczeństwa rozwiążę programowo (choćby za pomocą CRC32)-ale to potem.
    Przeglądałem wnikliwie przykłady z książki Pana Mirka K. i o ile UDP rozumiem to nie wiem jak zabrać się za zestawienie i nawiązanie połączenia pomiędzy dwoma komputerami oraz jak przesłać z jednego do drugiego jakiś tekst jak w przypadku UDP. Zasada powinna być zbliżona do UDP poza zestawieniem połączenia.
    Może ma Ktoś jakiś przykład albo wskaże co robić i od której strony zacząć.
    Program zaczynam pisać od zera. Na mojej płytce z ENC mam wyświetlacz i na nim muszę wyświetlać jaki komputer(zdalny) połączył się z modułem i na jakim porcie.
    Chcę ustawić sztywno port nasłuchowy modułu gdyż będę musiał ten port przekierować w routerze.

    Wiadomo że po uruchomieniu modułu będzie musiał:

    1.Zostać przypisany i uruchomiony port nasłuchowy
    2.W momencie nadejścia połączenia na ten port musi nastąpić połączenie
    3.W tym momencie muszę wyświetlić na lcd w module z jakim zdalnym IP jestem połączony i jakie dane przesłał
    4.Muszę mieć mozliwośc odesłania mu danych w postaci tekstowej.

    Absolutnie nie chcę opierać połączenia i przesyłania danych o żadną przeglądarkę internetową. Mi żadne grafiki itp. nie są potrzebne. Ja muszę mieć mozliwośc przesyłania krótkich ramek tekstowych coś , dokładnie jak w przypadku UDP.


    Proszę o jakieś sugestie.
  • Pomocny post
    #17 14279155
    Eagle
    Poziom 24  
    Nie śledziłem twojej wymiany postów na temat nowego routera, ale rozumiem że masz możliwość przekierowania portu na routerze ? Że zrobiłeś symulację świat -> router -> twój PC i można się wbić na twój serwer ze świata, masz stałe IP lub DDNS ?
    Kiedyś miałem taki problem, że potrzebowałem robić pomiary z "N" czujników każdy w innej lokalizacji z dynamicznym IP, bez możliwości konfigurowania routera. Wyjściem okazało się odwrócić komunikację, odczyty były wysyłane do serwera z publicznym IP, a ja łączyłem się z tym serwerem przeglądając wyniki.
  • #18 14279378
    adambehnke
    Poziom 24  
    No właśnie nie mam stałego IP ale mam NO-IP. Ale już rozpoczełem pisanie nowego programu do komunikacji przez TCP zamiast UDP. Fakt że troszkę ugrzęzłem gdyż nie wiem jak do końca uruchomić nasłuch i zestawić połączenie przy użyciu bibliotek z tuxgraphix.
  • Pomocny post
    #19 14279430
    Eagle
    Poziom 24  
    A jak z przekierowaniem portów na routerze ? Jaki masz pomysł na wbicie się ze świata do swojego urządzenia, skoro nie znasz jego IP ? Większość routerów obsługuje DDNS, który w wielkim skrócie informuje świat jaki teraz router ma IP. Jednak to pół sukcesu ruch z zewnątrz odbywa się na konkretnym porcie, ten port musi być przekierowany na lokalny IP. Będziesz miał taką możliwość ?
  • #20 14279451
    adambehnke
    Poziom 24  
    Mam skonfigurowane u siebie NO-IP (zapomniałem :P) . Kontakt z zewnątrz to "pikuś" gdyż mam ustawiony DMZ na mój moduł i mogę bezpośrednio wchodzić z zewnątrz do mojego modułu.
    Ale nie mogę nic wysłać. No chyba że dzięki TCP.
  • Pomocny post
    #21 14279452
    piotrva
    VIP Zasłużony dla elektroda
    @Eagle , NO-IP to właśnie DDNS, też używam ;)
    I słuszna uwaga - może cały problem @adambehnke polega na braku przekierowania portów w routerze na adres IP urządzenia w sieci lokalnej?
  • #22 14279487
    adambehnke
    Poziom 24  
    Ale czy mam ustawione DMZ czy po prostu przekieruję odpowiedni port dla mojego modułu to mam bezproblemową łączność z moim modułem z zewnątrz. Co prawda DMZ to gruba przesada aby to stosować tylko dla jednego używanego port ale biorę pod uwagę że mój router jest "upośledzony" i wolałem się zabezpieczyć.

    Adres mojego modułu mam ustawiony w routerze na sztywno (poza pulą DHCP) więc nie zmienia się on i bez problemu powinno to chodzić.
    W sieci lokalnej mam bezproblemową dwukierunkową transmisję ale kiedy chcę wysłać coś na zewnętrzne IP to wszystko jakby rozbijało się o firewalla albo wycinane jest już u operatora.

    Testowane bardzo gruntownie dzięki Nmap i Wireshark. I widać że moduł otrzymuje dane z zewnątrz oraz wysyła dane dokładnie na IP (te z którego nadeszły dane) jakie powinien.
    Ale niestety nic nie dochodzi.

    Dodano po 14 [minuty]:

    Ja na prawdę wolałbym pozostać przy UDP. Ale powiedzcie czy jest to fizycznie/realnie możliwe aby zrealizować taki scenariusz:

    1.Mam w domu router do którego mam podłączone mój moduł avr (karta na ENC28j60).
    2.Mam zmienne IP (ale to nie problem gdyż od czego jest NO-IP)
    3.Mam przypisane dla modułu na sztywno adres 192.168.1.2 oraz przekierowany port (albo DMZ) 2015 właśnie na ten IP. Więc łączność powinna być dwukierunkowa.
    4.Firewall na najniższym poziomie (niżej już się nie da)

    i teraz:

    A.Chcę używać komunikacji -wysyłaniu ramek UDP z określonego zewnętrznego(internet) IP dokładnie na mój adres IP (dzięki DDNS) .

    I to działa poprawnie gdyż wysyłając odpowiednią ramkę UDP gdzieś z internetu to dochodzi do mojego modułu gdzie zostaje bez problemu rozpoznana i wykonana.

    Ale teraz kiedy mój moduł ma dać raport-odpowiedź na to IP z którego przyszła ramka i na określony port to niestety to nie działa.
    Fakt że moduł bez problemu wie skąd (z jakiego IP i na jaki port) przyszła ramka i gdzie ma wysłać odpowiedź. I dokładnie to robi. Ale nic nie dociera.

    Ale znowu:

    Wysyłając ramkę gdzieś z internetu nie mam przecież możliwości aby dotrzeć do ustawień routera z którego wysyłam ramkę. Załóżmy że jestem gdzieś w kawiarence internetowej czy jakiś Hot-Spot , uruchamiam sobie na tablecie mój program który napisałem właśnie do tego celu i wysyłam ramkę do mojego modułu (dzięki DDNS).
    Przecież żeby odebrać dane zwrotne to musiałbym przekierować odpowiedni port na to IP jakie przydzielił mi w tym momencie router (DHCP) w miejscu w którym się znajduje. Dobrze kombinuję? Bo nie widzę innej realnej możliwości. Każdy mówi co innego i już nic nie wiem.

    Ale wydaje mi się że tak powinno to wyglądać.
  • #23 14279564
    TvWidget
    Poziom 38  
    adambehnke napisał:
    Co prawda DMZ to gruba przesada aby to stosować tylko dla jednego używanego port ale biorę pod uwagę że mój router jest "upośledzony" i wolałem się zabezpieczyć.
    [...] I widać że moduł otrzymuje dane z zewnątrz oraz wysyła dane dokładnie na IP (te z którego nadeszły dane) jakie powinien.
    Ale niestety nic nie dochodzi.

    Czy pakiety są odsyłane na odpowiedni adres MAC (routera) ?
  • #24 14279584
    Eagle
    Poziom 24  
    A jak testujesz zamiast modułu zwykły PC to da się coś wysłać w świat ?
    Bo jak dostawca wycina ruch to i tak nic nie odeślesz czy to modułem czy to PC.
    Napisałeś
    Cytat:
    mogę bezpośrednio wchodzić z zewnątrz do mojego modułu
    . Możesz opisać bardziej precyzyjnie, po czym poznajesz że się połączyłeś z modułem, moduł odpowiedział coś ?

    I może na początek bo zaczynam się gubić, co chcesz osiągnąć, bo rozwiązania są dwa.
    1) Moduł pracuje jako serwer i możesz się wbić do niego wydać mu polecenie i odebrać odpowiedź, ale (!) moduł musi być widziany w świecie, więc stosowna konfiguracja routera wymagana.

    2)Moduł pracuje jako klient i próbuje się połączyć z czymś o znanym IP (serwer) i tam przekazuje dane. To rozwiązanie nie wymaga konfiguracji routera.
  • #25 14279589
    adambehnke
    Poziom 24  
    W zasadzie jest to dokładnie to IP z którego przyszły dane.
    Jeśli dla przykładu dane przyszły z 83.12.12.12 to moduł wysyła dane dokładnie na 83.12.12.12

    Adres mojego routera w sieci lokalnej to 192.168.1.1

    Poza tym to testowałem komunikację na dwóch różnych komputerach i dwóch oddzielnych łączach internetowych dzięki programowi UDP TEST TOOL. I z jednego komputera na drugi mogę przesyłać ramki UDP na określony port ale z mojego komputera na ten drugi nie mogę wysłać nic.

    Może po prostu jestem za cienki i nie wiem jak się za to zabrać. Bo sam już nie wiem.
  • #27 14279602
    adambehnke
    Poziom 24  
    Eagle napisał:
    1) Moduł pracuje jako serwer i możesz się wbić do niego wydać mu polecenie i odebrać odpowiedź, ale (!) moduł musi być widziany w świecie, więc stosowna konfiguracja routera wymagana.


    Dokładnie tak jest. Mój moduł ma na sobie lcd i widzę dokładnie jakie IP i na jaki port przysłało mu ramkę. Dodatkowo widzę kiedy moduł jest pingowany ( dioda led) .
    Dodatkowo moduł ten działa także w sieci RS485 i po wysłaniu ramki UDP przesyła mi raporcik po RS485 na PC co i gdzie wysłał,oraz co otrzymał.
  • #28 14279621
    TvWidget
    Poziom 38  
    adambehnke napisał:
    Testowane bardzo gruntownie dzięki [...]Wireshark. I widać że moduł otrzymuje dane z zewnątrz oraz wysyła dane dokładnie na IP (te z którego nadeszły dane) jakie powinien.
    Ale niestety nic nie dochodzi.

    Rozumiem, że podsłuchiwałeś co się dzieje w tej sieci, do której podłączony jest moduł. Podaj jeśli możesz jak wyglądała ramka Ethernet pakietu odbieranego przez moduł i wysłanej odpowiedzi na niego.
  • #29 14279629
    piotrva
    VIP Zasłużony dla elektroda
    Jeszcze jedna sprawa, jak skonfigurujesz 2 komputery, jeden w sieci wewnętrznej na adresie IP takim co moduł i na nim postawisz program do wysyłania UDP, i drugi dostający się z zewnątrz to wtedy możesz wysłać jakikolwiek z sieci LAN do komputera na zewnątrz (WAN)?
  • #30 14279631
    Eagle
    Poziom 24  
    Czy jak zrobisz, że swojego urządzenia projekt jak tu Link to zobaczysz z zewnątrz stronę jak w przykładzie ?
REKLAMA