Promotic

Transmisja danych w sieci poprzez Sokety

Komunikacja poprzez sokety w chwili obecnej jest w systemie PROMOTIC uważana już za starszy sposób transmisji danych i została zastąpiona przez prostszą i bardziej jawną komunikacją przy pomocy XML patrz opis: Współdzielenie danych XML.
Soket komunikacja służy głównie do wymiany danych pomiędzy aplikacjami w sieci.
Podczas komunikacji w sieci wykorzystuje się model klient-server. To znaczy, że projektant musi najpierw ustawić dwie (lub więcej) aplikacji, które będą razem komunikować i zdecydować, która z aplikacji będie oferować dostęp do swoich danych a która aplikacja będzie odczytywać lub zapisywać te dane. Jeżeli aplikacja oferuje dane do wykorzystania, wtedy jest to aplikacja typu serwer danych, jeżeli aplikacja odczytuje inne, oferowane dane, wtedy jest to aplikacja typu klient danych. W praktyce to znaczy, że w aplikacji PROMOTIC serwer definiujemy tzw. serwerowe grupy soketów, następnie w aplikacji PROMOTIC klient definiujemy klienckie grupy soketów.
I jeżeli w serwerowej grupie soketów jest ustawione tylko jej imię i parametry wykorzystania, kliencka grupa soketów określa, z którym komputerem węzłowym będzie się komunikować i do której grupy serwerowej będzie się odnosić dana grupa kliencka.
Użytkownik definiuje kliencką część komunikacji tym, że wytwarza klienckie grupy soketów w oknie konfiguracyjnym "Sokety". Klient jest w tym przypadku określony adresem komputera docelowego i nazwą grupy serwerowej.
Serwerowa część komunikacji jest analogicznie definiowana przez wytworzenie grup serwerowych w tejże karcie.
Sama komunikacja jest realizowana przy pomocy obiektu PmaData, który jest w ustawieniach przyszeregowany do jednej ze zdefiniowanych grup (kliencckich lub serwerowych), transmisja wykonuje się przy pomocy metod PmaData.ReadFromSocket lub PmaData.WriteToSocket.
Uwaga: Komunikacje poprzez sokety w systemie PROMOTIC podlega licencjonowaniu, tzn. żeby działała w runtime (z licencją runtime), jest konieczne do licencji runtime dokupienie pozycji dla sieciowych klientów typu "PmDataClient". Zakup licencji jest konieczny tylko jeżeli w danej aplikacji jest zdefiniowana serwerowa grupa soketów i jest konieczny zakup takiej ilości licencji, z jaką maksymalną ilością klientów będzie się aplikacja komunikować. W środowisku deweloperskim działają komunikacje przez sokety automatycznie w celu testowania dla maksymalnej ilości 5 klientów.

Do transmisji danych można zastosować dwa typy protokołów sieciowych:
1. protokół TCP, który umożliwia transmisję danych o nieograniczonej długości, jak również zapewnia poprawność kolejności i poprawności danych ipołączenia. Jednak nawiązanie połączenia z komputerem docelowym nie jest tak szybkie jak w przypadku protokołu UDP.
2. protokół UDP, który umożliwia bardzo szybkie nawiązanie połączenia, jednak długość danych jest ograniczona do 512 bajtów. W konfiguratorze "Ograniczona długość danych (UDP)" w oknie "Soket serwerowa grupa" jest to pozycja "Ograniczona długość danych (UDP)".

Oba typy protokołów są w systemie PROMOTIC standardowo wykorzystywane tak, że najpierw nadaje się w nich nagłówek PROMOTIC a za nim następują transmitowane dane. W nagłówku znajduje się identyfikacja danych, które są przeznaczone do jednoznacznego określenia danych po stronie docelowej. To jednoznaczne określenie jest dane nazwą "Item" pozycji w konfiguracji soketów (patrz karta "PmaData > Sokety"). Standardowe soket wiadomości są więc zawarte w nagłówku i standardowo mogą być tym rodzajem komunikacji połączone wyłącznie aplikacje PROMOTIC pomiędzy sobą.

UDP bez nagłówka PROMOTIC:
W celu możliwości transmisji dowolnych danych użytkownika poprzez sokety został wytworzony podtyp komunikacji UDP - UDP bez nagłówka PROMOTIC. Przy pomocy tego typu komunikacji można przenośić dowolne dane zdefiniowane w obiekcie danych. Ponieważ system PROMOTIC do tych transmitowanych danych już nic nie dodaje, projektant ma możliwość zdefiniować dokładnie taką strukturę danych, jaka odpowiada danym na drugiej stronie transmisji.
Bajty wartości typu Integer oraz Long są transmitowane w odwrotnej kolejności niż na komputerze (najpierw zostanie przeniesiony HIGH a dopiero następnie LOW bajt). Taki sposób transmisji wartości typu danych Integer oraz Long (tzw. Big-endian) jest bowiem w komunikacji poprzez Sokety standardem. Jeżeli byłoby konieczne przesyłać takie wartości pod postacią używaną w komputerych PC (tzw. Little-endian), wtedy jest konieczne do pozycji PmaData > Sokety > Pozycja (Item) zapisać tekst "e=L;". W innym przypadku pozycja ta powinna pozostać pusta (ponieważ nagłówek nie jest trasmitowany, to ta pozycja już nie służy do identyfikacji danych).
Przy wyborze tego rodzaju transmisji danych może obiekt serwerowy (tzn. obiekt podłączony do serwerowej grupy soketów) tylko odbierać dane a klient wyłącznie dane transmitować a więc jest możliwe tylko wywołanie metody WriteToSocket. Jednakw tym wypadku może istnieć większa ilość obiektów serwerowych (tzn. obiektów które odbierają dane ze soketów) i dlatego musi istnieć mechanizm, który przy odbiorze danych rozpozna, do którego obiektu należą odbierane dane. W tym celu jest konieczne w obiektach serwerowych pierwsze trzy zmienne uważać za pozycje systemowe a dopiero w następnych pozycjach będzie zapisywana odebrana wiadomość. Teraz opiszmy znaczenie tych trzech systemowych pozycji:
0. pozycja (nazwijmy ją PM_enable) musi być typu Integer. Wartość 0 oznacza, że obiekt ten w tej chwili nie odbiera zadnych danych, 1 oznacza odbiór. Wartość można dynamicznie zmieniać.
1. pozycja (nazwijmy ją PM_id) musi być typu String. Wartość określa, czy odebrana wiadomość należy do danego obiektu (jeżeli odbiór nie jest zakazany przez 0.pozycję). Wartość składa się z tekstu który ma na przykład kształt: "l=24;b3=235;b7=4;". W tym przypadku to znaczy, że odebrane dane należą do danego obiektu tylko jeżeli ich długość wynosi 24 bajtów (l=24, l jako length) a równocześnie 3. bajt posiada wartość 235 (b3=235, b jako bajt) i równocześnie 7. bajt posiada wartość 4 (b7=4). Przy tym każde określenie jest zakończone średnikiem (;), określenie "bx=y;" może występować więcej razy, i jeżeli tekst jest pusty, wtedy odebrane dane należą do danego obiektu zawsze, jeżeli odebrana wiadomość nie należy do żadnego innego obiektu z nie pustym tekstem.
2. pozycja (nazwijmy ją PM_size) musi być typu Long. Jeżeli wiadomość należy do danego obiektu, wtedy odebrana data zostanie zapisana do pozycji poza 3 wartościami systemowymi. Do 2. pozycji zapisze się z kolei ilość pozycji danych, ktore zostały wypełnione odebraną wiadomością.
© MICROSYS, spol. s r.o.