Swego czasu natknąłem się na pewien projekt w którym należało zbierać informację o pozycji pojazdu (GPS) za pomocą ramek (pakietów) przesłanych przez sieć komórkową za pomocą technologii GPRS. Najprostszy schemat takiej komunikacji możemy przedstawić następująco: system GPS —> pojazd z zamontowanym modułem GPS <—> GPRS (sieć GSM) <—> nasz server —> urządzenie prezentujące pozycję pojazdu (komputer, tablet itp.).
Trochę czasu mi to zajęło, dlatego postanowiłem opisać tu moje doświadczenia, które może komuś się przydadzą, a mnie pozwolą utrwalić i udokumentować zdobytą wiedzę 😉
Jak zwykle (w moim przypadku) zdecydowałem się na technologię PHP i zastosowałem dostępne rozszerzenie tego języka, które nazywa się sockets.
Jak zobaczycie Sockets jest bardzo ciekawym rozszerzeniem języka PHP pozwalającym na zestawienie komunikacji sieciowej w architekturze klient <-> server.
Technicznie: jest to implementacja niskopoziomowego interfejsu komunikacyjnego.
Jak funkcjonuje: pozwala odczytywać i wysyłać komunikaty (pakiety sieciowe / ramki) przesyłane przez/do klienta (np. przez moduł GPS zainstalowany w pojeździe).
W ramkach tych mogą być przesyłane różne dane, począwszy od aktualnej pozycji pojazdu kończąc na stanie paliwa czy aktualnej prędkości pojazdu.
Specyfikacja modelu przekazywanych informacji za pomocą ramek znajduje się w dokumentacji technicznej użytego modułu GPS. UWAGA ! To nie jest standardowa dokumentacja dostarczana wraz z urządzeniem. O dokument przedstawiający szczegółową specyfikację ramek trzeba poprosić producenta.
Aby nastąpił napływ ramek moduł musi skomunikować się z serwerem.
Opcje modułu możemy skonfigurować np. przez wiadomości SMS (wysyłamy odpowiednio sformatowane wiadomości SMS na nr tel. modułu).
Podstawowe ustawienia to IP oraz port nasłuchu serwera, częstotliwość przesyłania ramek itp.
Przykładowa komunikacja moduł GPS – Server przebiega następująco:
1) Moduł wysyła za pomocą sieci komórkowej (GPRS) pakiet początkowy w którym się "przedstawia". Zazwyczaj w takiej ramce znajduje się IMEI urządzenia nawiązującego połączenie. Przykład wysyłanej ramki(x to nr IMEI urządzenia generującego ruch): ##,imei:XXXXXXXXXXXXXXX,A;
2) Serwer odpowiada odpowiednim komunikatem do modułu z którego nadszedł pierwszy pakiet (komunikat wg dokumentacji technicznej urządzenia, w moim przypadku był to ciąg znaków "LOAD").
3) Moduł po otrzymaniu komunikatu z pkt. 2 przesyła ramki zawierające aktualną pozycję GPS oraz inne zdefiniowane dane (co pewien czas, który został zdefiniowany podczas konfiguracji urządzenia).
Przykład ramki: imei:XXXXXXXXXXXXXXX,tracker,1401122019,,F
,191949.000,A,5022.6199,N,01958.8937,E,32.05,181.43,,1,0,0.35%,,;
4) Serwer każdorazowo potwierdza otrzymanie ramki z pkt. 3 itd….,
Niektóre funkcje sockets. Pełna dokumentacja znajduje się pod adresem http://php.net/manual/en/book.sockets.php:
1) socket_create — Create a socket (endpoint for communication)
2) socket_bind — Binds a name to a socket
3) socket_listen — Listens for a connection on a socket
4) socket_select — Runs the select() system call on the given arrays of sockets with a specified timeout
5) socket_accept — Accepts a connection on a socket