Witam wszystkich!
Ostatnimi czasy na topie jest problem wlasnej komunikacji UDP. Jest to temat dosc popularny jako , ze Mirek porusza go w BB. Wiec kazdy kto tam dochodzi staje przed problemem kiedy chcialby zrobic cos swojego.
Jak osobiscie zauwazylem wiekszosc z Was wybiera droge przez programowanie C#. No i tutaj dla niektorych moga sie pojawic problemy jesli jeszcze wczesniej nie bawili sie tym jezykiem programowania.
Dlatego postanowilem napisac poradnik dotyczacy tworzenia wlasnej aplikacji w C# wlasnie do komunikacji UDP. Bedzie on oczywiscie przeprowadzac Was krok po kroku jak osiagnac wybrany cel.
Na chwile obecna aby kazdy mogl pracowac w swoim tempie i aby mozna bylo pomoc ludziom w zrozumieniu dzialania tych mechanizmow poradnik bedzie podzielony na kilka czesci.
Kolejne czesci bede uzupelnial az opracujemy w pelni wielowatkowy program do wysylania/odbierania.
Technologia jaka wykorzystamy to Visual Studio. Ja osobiscie bede uzywac 2013 ale mozna to osiagnac rowniez korzystajac ze wczesniejszych wersji. Jedyne co moze byc problematyczne to , ze zrzuty ekranu prezentowane przeze mnie beda w j.ang wiec jak tylko bede mogl to staral sie Was naprowadzic na ta opcje w j.pol
Kolejna informacja to forma projektu. Bedziemy uzywac Windows Forms. W dzisiejszych czasach to juz jak "dziadek" ale da rade , zebysmy mogli osiagnac to czego potrzebujemy
Przygotowanie srodowiska do pracyWiec uruchamiamy nasze Visual Studio i tworzymy nasz nowy projekt. Nadajemy mu jakas "sensowna" nazwe
i wybieramy odpowiednio
- Aby byl to jezyk ptogramowania C#
- Aby wersja .Net to 4.0 (ma to znaczenie jesli uzywamy cos innego niz VS2013)
- Aby nasz projekt byl typu Windows Forms Application
Jako , ze chcialbym utrzymac ten poradnik w tonie funkcjonalnym pozostawiam Wam drodzy czytelnicy uklad graficzny aplikacji
My zaczniemy od bardzo prostej rzeczy , czyli .....
Dodajemy pierwsza kontrolkeW naszej aplikacji bedziemy dzialac w odpowiedzi na jakies zdarzenie. Te najbardziej powszechne to "nacisniecie guzika". Wiec .... z
Toolbox widocznego po lewej stronie wybieramy "button" i przeciagamy go na nasza aplikacje.
W ten oto sposob mamy zakonczony wstepny etap. Nastepnie ,zeby nasza aplikacja wiedziala , ze cos ma sie stac klikamy dwa razy w nasz guzik. Visual Studio automatycznie utworzy dla nas metode obslugujaca
zdarzenie dla wcisnietego guzika Jesli nie zmienialiscie Cie nazwy guzika i pozostaliscie przy domyslnej powinniscie teraz miec cos na wzor tego co w ponizszym zrzucie ekranu ... czyli poprawnie3 utworzona metode dla obslugi naszego zdarzenia.
Aby dalej moc pracowac i tworzyc kod musimy dodac nastepujaca referencje u gory naszego kodu , bo inaczej ani rusz
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Zanim przejdziemy dalej chcialem Wam pokazac , w ktorym miejscu bede tworzyc zmienne
GLOBALNE. Dlatego zawsze kiedy pozniej bede wspominac , ze tworze zmienna takiego zasiegu - zwroccie prosze uwage gdzie ona sie znajduje.
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
W tym momencie mozemy stworzyc juz zmienne , ktora wykorzystamy do wysylania naszych ramek UDP.
Zaczynamy od
IPEndpoint.Potrzebna nam bedzie ona w dalszej czesci. Dzieki tej zmiennej definiujemy jaki adres IP wykorzystamy oraz na jakim porcie. Jako , ze bedziemy wysylac dane podajemy tutaj dane naszego komputera / serwera. Port 1234 jest przykladowy i moze/powienenen byc zmieniony na cokolwiek co Wam odpowiada.
Ponizsze zmienne jeszcze
NIE DEFINIUJA naszego urzadzenia
DOCELOWEGO ... to pozniej
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Prosze poswiec chwilke zeby zobaczyc co sie dzieje w tym kodzie. Tworzymy nasza zmienna a nastepnie jako parametry do jej stworzenia musimy podac adres IP naszego komputera/serwera a pozniej port , ktory wykorzystamy do komunikacji UDP. Bardzo wazne na tym etapie jest by adres IP byl poprawny. W przeciwnym wypadku aplikacja niestety sie wysypie (kontrola bledow to temat rzeka na inny poradnik wiec zostawiam to w Twojej mocy)
Teraz jestesmy gotowi aby stworzyc zmienna , ktora posluzy nam do komunikacji UDP. Bedzie to takze zmienna o zasiegu
GLOBALNYM i bedzie typu
UDPClientDzieki powyzszej modyfikacji nasz kod zmienia sie troszeczke ... i wyglada nastepujaco.
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Po tych wszystkich zabiegach przejdziemy do naszej metody obslugujacej nacisniecie naszego guzika. Przed chwila zainicjalizowalismy sobie zmienna o nazwie
klient i to wlasnie ja tam wykorzystamy do wysylania danych.
Zanim jednak przejdziemy do sedna ... Pamietaj , ze bedziemy wysylac bajty
nikt nie oczekuje , ze bedziesz w stanie wpisac bajty do wyslania. Mirek slusznie zauwaza ,ze chcemy pracowac z ASCII - dlatego wiec chcialbym na wstepie zaznaczyc , ze aby to obslugiwac w C# bedziemy korzystac z dostepnych metod opisanych ponizej....
- Aby zamienic wartosc ze string na byte[] wykorzystamy
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
- Aby zamienic wartosc z byte[] na string wykorzystamy
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
- Aby sprawdzic ile byte'ow ma nasz string wykorzystamy (jest to jeden z wielu sposobow)
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Aby powyzsze zadzialalo prawidlowo musimy dodac kolejna referencje na poczatku naszego programu. Tym razem jest ona potrzebna do dzialania powyzszych funkcji.
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Moze juz zastanawiasz sie gdzie jest cos definiujacego miejsce do ktorego wysylamy nasze ramki ? No i masz racje. Nie zdefiniowalismy takiego jeszcze.
Tak jak i wczesniej bedzie to zmienna o zasiegu
GLOBALNYM i nazwie
ep_destination język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
W powyzszym musisz zdefiniowac adres IP pod ktory bedziesz wysylac dane oraz port na ktorym docelowa aplikacja nasluchuje.
Teraz mamy wszystkie nasze skladniki gotowe.... wracamy wiec do miejsca wysylania naszej ramki. We wczesniej wspomnianej metodzie przygotujemy sobie nowa zmienna typu
string oraz wyslemy ja wykorzystujac wczesniejsza zmienna o nazwie
klientjęzyk csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
No i na chwile obecna to wszystko - po uruchomieniu naszej aplikacji oraz klikniecia guzika nasza aplikacja wysle pakiet UDP pod wskazany adres oraz port.
Aby potwierdzic to sprawdzamy sobie konsolowa aplikacja ktora nasluchuje na okreslonym porcie.... no i dziala
Jednak ktos moglby powiedziec ... ale czy naprawde dziala ? Na potrzeby poradnika zrobilem zrzut ekranu programem do analizy ruchu sieciowego (takze na jego potrzeby byl to broadcast
ale dziala tak samo )
No i na chwile obecna to chyba tyle jesli chodzi o czesc I. Jesli chodzi o punkty warte zwrocenia uwagi to :
- Pracujac z obsluga sieci zapewnij sobie program do analizy ruchu sieciowego. Ja polecam WireShark'a
- Zanim powiesz , ze cos nie dziala sprawdz czy jest ruch sieciowy / czy adresy IP sie zgadzaja oraz czy porty sa odpowiednie
- Pracujac z AVR pomysl o tym jak rozpoznajesz czy nadeszla ramka, ktorej oczekujesz....
Mam nadzieje ,ze sie przyda. Jesli bedzie zapotrzebowanie bedziemy kontynuowac serie.
Pozdrawiam
Raf