Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: pobieranie danych na serwer z urzadzenia
Forum PHP.pl > Forum > PHP
gitbejbe
witam

Nigdy takiego czegoś nie robiłem a teraz musze ; )

Proszę osoby znające się w temacie o pomoc merytoryczną. Przedstawie problem bardzo ogólnie bo nie chce zaliczyć jakiejś wtopy w pojęciach.

Mam kilka urzadzeń pomiarowych. Rejestrują one między innymi temperature oraz posiadają możliwosc ustawień kilku parametrów. Urządzenia te nie wspołpracują z sobą i mogą być używane gdziekolwiek. Moim zadaniem jest napisanie strony internetowaj, na która po zalogowniu na swoje konto mogę odczytywac parametry z takiego urządzenia oraz dokonywać wybrancyh zmian w jego ustawieniach. PHP i cała ta otoczka tworzenia srron i aplikacji internetowych nie jest mi obca i nie tutaj jest problem. Zastanawiam się bardziej jak uzyskać połaczenie pomiędzy urządzniem a serwerem ?

Narazie jestem na etapie planowania. Urządzenia pomiarowe już mam i działają. Ich modyfikacja zajmuje się oddzielny programista. Ja narazie chce poznać sam zamysł jak to ma wszystko działać i dlatego też chciałbym was sie poradzić.

Obecnie dostałem wytyczne, że klient który kupi takie urządzenie pomiarowe moze wejsc sobie na strone internetową i zarejestrowac swoje urządzenie. Kluczowym elementem rejestracji będzie kod urządzenia, który będzie grał role identyfikacji urzadzenia. Po poprawnym zarejestrowaniu klient może na tej stronie podglądać pomiary temperatur oraz dokonywac zmian wybranych ustawień, i tutaj zaczyna się dla mnie bajka. Jak stworzyć połączenie pomiedzy urządzeniem a serwerem tak aby serwer mógł odbierac asynchronicznie aktualne dane pomiarowe z urzadzenia oraz również potrafił wysłać odpowiedź w postaci zmiany ustawień urządzenia - jęsli np klient wybierzez na stronie jakąś opcje do zmiany ?

freemp3
Urządzenie powinno wysyłać do serwera co pewien okres czasu dane, które aplikacja nasłuchująca na serwerze zapisze w odpowiednim miejscu. Jako odpowiedź aplikacja może wysłać informacje o zmianie ustawień lub też ich braku. Zwróć uwagę, na to że możliwość inicjacji połączenia przez serwer z urządzeniem odpada bo może ono być umieszczone, za ruterem, switchem lub jeszcze czymś innym. Dlatego też lepiej, aby to urządzenie rozpoczynało połączenie wysyłając odpowiednie dane i w odpowiedzi otrzymując informacje o ustawieniach.
Zasda działania jest identyczna jak w przypadku stron internetowych. Serwer czeka na połączenie, wykonuje odpowiednie operacje i odpowiada.
gitbejbe
no dobra rozumiem.

to teraz, czym wysyłać i odbierac te dane ?

za pomocą czego urządzenie bedzie wysyłało dane ? Przyjmijmy, ze urządzenie wysyła co minutę 60 linijek tekstu. Czym mam odebrać ten tekst i czym odesłać mój tekst z ewentualnymi zmianami ? chodzi mi teraz o sam sposób komunikacji
freemp3
Po prostu podpinasz urządzenie do internetu i ustawiasz, aby komunikowało się z serwerem na którym jest strona www. Na serwerze powinien działać demon, który będzie nasłuchiwał na wybranym przez Ciebie porcie. Urządzenie wysyłając informacje nawiązuje połączenie na tym porcie, demon obsługuje odpowiednio dane i odpowiada.

Tak właściwie to co to za urządznia? Jakie posiadają możliwości komunikacji? W jaki sposób można zmienić im ustawienia? Wysyłasz strukturę danych zdefiniowaną przez Ciebie i ją obsługujesz na urządzeniu, czy jest to z góry narzucone?
gitbejbe
te urządzenie to troche bardziej skomplikowany mechanizm niż go tutaj przedstawiłem, ale to akurat nie jest tutaj ważne. Zostańmy przy tym, że zajmuje sie ono różnymi pomiarami. Jeśli chodzi o samo dostosowanie urządzenia, to jak wpsomniałem zajmuje sie tym grupa programistów znających się w tym temacie. Urządzenie faktycznie będzie podpinane kablem do internetu a komunikacja oparta będzie na TCPIP. Czytałem w sieci że takie połączenie można obsłużyć w php za pomoca secetów. jak to działa ? Takie połączenie potrafi wysłać protokół http ? Jeśli tak to zmienne można byłoby przesyłać w GET pod konkretny aders? Chyba ze tak to nie działa to prosze o wyjaśnienie lub jakiś link.

co to jest demon ? Serwer będzie wynajmowany zapewne w home.pl tak więc moze być lekki problem z dogrywaniem jakiś dodatkowych komponentów. Nie wiem jeszcze czy to będzie dedyk czy nie. Na początek raczej jakiś VPS.

Cytat
Urządzenie wysyłając informacje nawiązuje połączenie na tym porcie, demon obsługuje odpowiednio dane i odpowiada.

no dobra ale jak te informacje będą wysyłane, w jakiej postaci ? zmienna w adresie, plik ...jak ?

za zmiane ustawień w urzadzeniu będzie służyła komenda string którą zwróce z serwera. Urządzenie je rozpoznaje i dokonuje zmian. Przypominam, ze urządzenie będzie wysyłać co 30sec/60sec pakiet danych około 30-60 linijek tekstu.
freemp3
Owszem php obsługuje połączenia protokołem TCP/IP, ale tutaj to urządzenie będzie nawiązywać połączenie, a tworzenie aplikacji w php do nasłuchiwania raczej nie wypali. Konieczne jest napisanie małego programu (np. w C++), który działał by jako demon (czyli proces działający w tle systemu operacyjnego, w windowsie nazywa się to usługami) i nasłuchiwał na jakimś porcie.

To w jaki sposób wyślesz dane zależy już od Ciebie (lub programistów urządzeń), ale na pewno nie zrobisz tego przy pomocy http i metody GET. 30 - 60 linijek tekstu za dużo nie mówi, ponieważ jedna linijka może mieć 10 znaków, a może mieć i 10000 więc w żądaniu GET może się nie zmieścić.
Można pokusić się o wysłanie tego metodą POST, ale i ona ma swoje ograniczenia długości. Wszystko sprowadza się do tego ile będzie znaków (nie linijek wink.gif ). W zasadzie można zrobić całość komunikacji na zasadzie strony internetowej. Urządzenie wysyłało by dane przy pomocy powiedzmy metody POST, Ty je obsługujesz przy pomocy php i wysyłasz (wyświetlasz) informacje dla urządzenia w postaci json-a, xml-a lub jak sobie tam ustalicie z programistami.

Według mnie powinno to wyglądać tak:
1. Urządzenie pakuje dane do postaci ustalonej struktury np. tablicy lub mapy (mapa jest odpowiednikiem tablicy asocjacyjnej).
2. Komunikuje się przy pomocy protokołu TCP/IP z serwerem i wysyła daną strukturę.
3. Demon na serwerze odbiera dane i zapisuje je, powiedzmy do bazy danych.
4. Następnie sprawdza, czy są jakieś ustawienia dla tego urządzenia jeśli tak pakuje je także w ustaloną strukturę i odsyła. Jeśli nie ma, kończy połączenie. Nie ma potrzeby wysyłania potwierdzenia otrzymania danych, ponieważ protokół TCP/IP posiada tego typu mechanizm. Poza tym za najpóźniej minute i tak przyjdą kolejne dane smile.gif
5. Jeśli zostały wysłane ustawienia urządzenie odbiera je i modyfikuje, po czym wysyła potwierdzenie, że się powiodło lub że pojawiły się jakieś błędy (wszystko jest możliwe).
6. Demon po otrzymaniu potwierdzenia o zmienionych ustawieniach usuwa informację o konieczności ich zmiany.

Dlaczego akurat tak? Bo będzie szybciej. C++ jest o niebo szybszy od php i zapewne okaże się to dużą zaletą przy dużej ilości urządzeń. Oczywiście dochodzi jeszcze kwestia sprawdzania, czy urządzenie o takim numerze seryjnym jest zarejestrowane itp. ale to już są szczegóły techniczne.
Co do strony w php zaś to całość sprowadzała by się do tego, że wyniki były by wczytywane z bazy danych, natomiast zmiana ustawień była by do niej zapisywana.
gitbejbe
dokładnie o taką odpowiedź mi chodziło : ) ! dzięki wielkie za wyjaśnienie, w razie dalszych pytań odświeżę temat
destroyerr
Cytat
a tworzenie aplikacji w php do nasłuchiwania raczej nie wypali

Dlaczego nie wypali w php? Polecasz napisanie tego w C++ a nie wspominasz nic o tym, że powinno być przede wszystkim oparte o obliczenia równoległe (procesy/wątki/pętla zdarzeń).

Cytat
ale na pewno nie zrobisz tego przy pomocy http i metody GET

Dlaczego nie da się tego zrobić przy pomocy http i GET?

Cytat
Można pokusić się o wysłanie tego metodą POST, ale i ona ma swoje ograniczenia długości.

Jakie są te ograniczenia i z czego one wynikają?

Cytat
ponieważ protokół TCP/IP posiada tego typu mechanizm

Tutaj też radziłbym się zastanowić chwilę. Najpierw trzeba sprawdzić czy urządzenie posiada stos TCP/IP z takimi możliwościami. Następnie zastanowiłbym się czy interesuje mnie czy dane odebrał stos czy dane te odebrała także aplikacja.
gitbejbe
widzę, że zaczynają pojawiac się nowe możliwości. chciałbym omówić ta kwestie z kimś jeszcze ode mnie z firmy ale obecnie jestem w tej kwestii uziemiony. Dopiero za 2 tygodnie mój dził łączy s ie w ogólny dział projektowy i będe wtedy miał wszystkicj i wszystko obok siebie. Narazie mam sam przemyśleć całe te zagadnienie, dlatego tez napisałem na tym forum. Jest to dla mnie nowy temat a jak już dojdzie do spotkania wszystkich projektantów, to chciałbym posiadać troche ogólnej wiedzy na ten temat.

tak więc co proponujesz destroyerr ?

nie ukrywam, ze kwestia szybkosci działania bedzie jednym z najistoniejszych elmentów. Jesli faktycznie demon w dużej mierze moze w tym pomoc, to raczej od tego rozwiazania nie odstaniemy. Pytanie brzmi czy znacie moze jakiegos gotowe tego typu skrypty, lub pod jaką naza ich szukać ? czyli skryptu który będzie nasłuchiwał na danym porcie, pobierał dane i zapisywał je do bazy ? Wiem, że idealnego skryptu pod moje wymagania nie znajde, ale moze będzie coś działajacego własnie na tej zasadzie. W C dawno nie programowałem (studia) i raczej nie chce tykać się sam tego tematu ale chętnie z nim sie zapoznam, bo zapewne ja taki skrypt będe musiał umieścić na serwerze.

napisałem, ze bedzie 60 linijek tekstu. Szczerze powiem, że sam nie wiem do konca ile moze być znaków. Ale wydaje mi się, ze wiecej niz 3600 nie powinni być, a nawet moze byc to połowa tego albo jeszcze mniej. co raz bardziej jestem też za tym aby dane te były wysyłane w formacie xml lub json
styryl
Zrób to normalnie w php, poczytaj o "restful services". Ja mam podpięte w ten sposób około 1000 urządzenie zbierających dane o pH wody i nie mam z tym najmniejszego problemu, dane z urządzenia są wysyłane POST-em. Co do ustawień samego urządzenia zastosuj tę samą metodę.
gitbejbe
@styryl mógłbyś podesłac jakiegoś linka do tego ? Wygooglowałem tą fraze ale nie wiem jakie informacje z tychh stron są dla mnie istotne. moze konkretniej:

będzie serwer na linuxie w przyczyn oczywistych (wynajmowany). Na początek vps z czasem zapewne mocny dedyk. Jakibyś podlinkowac jakis artykuł jak to zrobić pod ten system czy coś w tym kierunku to byłby wdzięczny

moich urządzeń bedzie sporo więcej. z czasem może być ich nawet 100 000tyś, i wszytskie te urzadzenie wysyłałyby co 30sec/60sec dane

EDIT

znalazłem już info : ) zaraz sie wgłebie i jakby co będe dalej pytać
freemp3
Cytat
Dlaczego nie wypali w php? Polecasz napisanie tego w C++ a nie wspominasz nic o tym, że powinno być przede wszystkim oparte o obliczenia równoległe (procesy/wątki/pętla zdarzeń).

Sam sobie odpowiedziałeś na pytanie. Zamiast krytykować wystarczyło uzupełnić informacje o konieczności użycia obliczeń równoległych. Podałem tylko przykład C++, można użyć innych języków, jak c, java, na upartego asembler, itd. Kwestia tego co kto lubi.

Cytat
Dlaczego nie da się tego zrobić przy pomocy http i GET?

Cytat
Jakie są te ograniczenia i z czego one wynikają?

Fakty, tutaj trochę przesadziłem. Oparłem się na ograniczeniach wynikających z możliwości przeglądarek oraz konfiguracji serwera. Jednak zrobienie komunikacji na protokole http wydaje mi się nietrafionym pomysłem. Oprócz surowych danych przesyłane są także nagłówki http, które są zbędne i niczemu nie służą. Ponad to zamiast trafić do odpowiedniej aplikacji, która je obsłuży i zapisze najpierw jest uruchamiany serwer http (np apache2), a dopiero on uruchamia odpowiednią aplikacje. Jednym słowem strata czasu i zasobów systemu.

Cytat
Tutaj też radziłbym się zastanowić chwilę. Najpierw trzeba sprawdzić czy urządzenie posiada stos TCP/IP z takimi możliwościami. Następnie zastanowiłbym się czy interesuje mnie czy dane odebrał stos czy dane te odebrała także aplikacja.

Protokół TCP sam w sobie posiada mechanizm pozytywnego potwierdzenia ( dane odebrane są albo poprawnie albo wcale ). Owszem mógłby wystąpić błąd w działaniu aplikacji, jednak samo urządzenie za wiele z tym nie zrobi. Można użyć port knockingu i zrobić jej reset lub wysłać informacje o błędzie do kogoś z obsługi technicznej, ale wyobraź sobie, że kilka tysięcy urządzeń naraz zaczyna wykonywać tego typu operacje.
Tak jak napisałem wcześniej. Podczas wysyłania danych raczej nie ma sensu wysyłania zwrotki z potwierdzeniem bo i tak za niedługo przyjdą następne informacje. Zwrotka bardziej przyda się przy zmianie konfiguracji urządzenia. Jeśli np będą prowadzone statystyki urządzenia i historia parametrów to faktycznie może się przydać zwrotka w obu miejscach. To już jest kwestia detali.


gitbejbe
dobra poczytałem troche o tym REST i rozumiem, ze jest to mechanizm przeznaczony głównie do pisania API. Co na tym zyskuje ? Jest jakaś znacząca róznica (np w szybkości/bezpieczeństwie), która lepsza byłaby od zwykłej wysyłki danych metodą POST lub GET (oczywiscie dane te będą mocno szyfrowane i zabezpieczane pod wieloma aspektami)? Tutaj akurat nie potrzebuje ładnych url, bo tego nikt nie będzie widzieć. komunikacja ta będzie stwrzona tylko dla urzadzenia i serwera. Czyli urządzenie wysyła mi metodą dane POST/GET na dany adres, skrypt na tym adresie te infomacje przetwarza i dodaje do bazy. W czym lepszy jest REST w tym przypadku ? Narazie mam polecenie zrobienia jak najprostrzego połączenia dla testów, ale jeśli pisanie API niesie ze sobą znaczące korzyści to to wykorzystam.

@freemp3

propozycja demona jest mocno kusząca ale własnie dowiedziałem się, że z poczatku nie bedziemy inwestować w lepszy serwer. Tak wiec na zwykłym wynajmowanym vps-sie raczej nie ma możliwości dodawania sobie demonów. Raczej wątpie aby np home.pl na to poszło.

zastanawiams się też grubo na sensie dodawania tych parametrow odrazu do bazy. Celem tej aplikacji internetowej będzie podgląd tych pomiarów z urzadzeń. Dokładne pomiary beda wyswietlane tylko z dnia obecnego, wczesniejsze dni będą archiwizowane oraz uszczuplane ze zbędnych informacji (bedzie mozna je np zobaczyć na jakims wykresie). Tak więc sądzę, że warto byłoby sie zastanowić na cachoewaniu tych danych do pliku, a po np 24h archizowaniu ich do bazy. Sądze, zę mocno usprani to szybkosc działania całego mechanizmu
freemp3
Na temat REST się nie wypowiem bo nie korzystałem i mam dosyć ubogą wiedzę na ten temat.

Co do vps-a z tego co mi wiadomo jest to serwer dedykowany tyle, że wirtualny. Oznacza to, że możesz z nim robić praktycznie to samo co ze zwykłym dedykiem więc raczej nie powinno być problemu z uruchomieniem na nim demona.

Odnośnie zapisu pomysł jak najbardziej słuszny, oczywiście jeśli zostanie to dobrze zaplanowane i zrealizowane. Proponował bym także zapisywać okrojone dane do bazy na bierząco. Odczyt danych z ostatnich 24 godzin i ich optymalizacja może trochę czasu pochłonąć więc lepiej to robić od razu.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.