Elektroda.pl
Elektroda.pl
X
Elektroda.pl
MetalworkMetalwork
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Arduino UNO - ENC28J60 + PHP i HTML na domowym serwerze np. w laptopie

13 Paź 2016 18:49 1917 12
  • Poziom 5  
    Witajcie,

    zaczynam przygodę z Arduino i zakupiłem do niego płytkę ENC28J60. Chciałbym pobawić się odczytem danych i sterowaniem z poziomu www. Chcę do tego użyć PHP i HTML, które będą poza Arduino, żeby nie obciążać pamięci.

    W chwili obecnej do testów używam Macbooka na którym postawiłem sobie serwer MAMP.

    Jak to wszystko połączyć?

    Dajmy na to, że pliki html,php znajdują się pod adresem: localhost:8888/arduino/ (na macbooku).

    Jak łączyć się z Arduino, żeby on łączył się z serwerem i dawał wyniki na podstawie skryptów napisanych na ww serwerze.

    Pozdrawiam
  • MetalworkMetalwork
  • Poziom 38  
    Zrobiłeś już własnoręcznie cokolwiek, choćby miganie LED-em?
  • MetalworkMetalwork
  • Poziom 5  
    JacekCz napisał:
    Zrobiłeś już własnoręcznie cokolwiek, choćby miganie LED-em?

    Tak.

    Przetestowałem też kod Link. Mniej więcej go przeanalizowałem (nie zagłębiałem się w struktury bibliotek), ale zasadniczo kod rozumiem. Jednym słowem nie jestem totalnie zielony, ale raczej początkujący, jeśli do tego Twoje pytanie zmierza.
  • Poziom 38  
    prezeswer napisał:
    JacekCz napisał:
    Zrobiłeś już własnoręcznie cokolwiek, choćby miganie LED-em?

    Tak.

    Przetestowałem też kod Link. Mniej więcej go przeanalizowałem (nie zagłębiałem się w struktury bibliotek), ale zasadniczo kod rozumiem. Jednym słowem nie jestem totalnie zielony, ale raczej początkujący, jeśli do tego Twoje pytanie zmierza.


    Tam na arduino realizują serwer, ty potrzebujesz klienta.
    Przejrzałem githuba od tych płytek, nie widzę klienta.
    Na pewno klasa ETHER_28J60 tam użyta jest tylko serwerem.

    Jak mnie coś oświeci to dopiszę.

    EDIT: na mój designerski gust klasa jest źle nazwana. Zakładając optymistycznie że autor o projektowaniu coś wie, wolę przyjąć że to ukłon w stronę realnych programistów (kopiujących kod) - mieli by mocne dylematy sumienia z namespace.Client itd .
  • Poziom 5  
    Znalazłem takiego klienta:
    Kod: c
    Zaloguj się, aby zobaczyć kod



    No i tu już trochę się gubię. Czy możesz powiedzieć jak w ogóle wygląda proces komunikacji i pobierania/wyświetlania danych do/z Arduino.

    Nie wiem czy dobrze rozumuję.
    Arduino łączy się ze stroną, w tym przypadku odpala sobie (co jakiś określony czas, za pomocą loop() ) strone save.php na zewnętrznym serwerze, przesyłając wartości w taki sposób: save.php?pwd=secret&client=WARTOŚĆ&status=temperature-WARTOŚĆ

    Skrypt w save.php zapisuje podane dane w bazie/tablicy i żeby sobie odczytać muszę wejść na właśnie ten serwer i np. odpalić dane.php, które wyświetlą to co arduino za pomocą skryptu save.php zpisało?
  • Poziom 38  
    prezeswer napisał:
    Znalazłem takiego klienta:

    No i tu już trochę się gubię. Czy możesz powiedzieć jak w ogóle wygląda proces komunikacji i pobierania/wyświetlania danych do/z Arduino.

    Nie wiem czy dobrze rozumuję.
    Arduino łączy się ze stroną, w tym przypadku odpala sobie (co jakiś określony czas, za pomocą loop() ) strone save.php na zewnętrznym serwerze, przesyłając wartości w taki sposób: save.php?pwd=secret&client=WARTOŚĆ&status=temperature-WARTOŚĆ


    To jest wywołanie przez tzw GET.
    Wszystko co nie jest literą/cyfrą tzreba by kodowac przez URL encode (znasz to, %20 to spacja itd... ). Czyli ponieważ na maluchu nie chcemy/nie możemy szaleć, najprościej sobie założyć że pozostajemy w obrębie ww znaków

    Jest z tym drugi problem, GET ma byc do odczytu, czyli ma nie zmieniać stanu serwera choćby było zero wywołań czy pięć (jak przeglądarka z Ctrl-R / F5)
    Nie p o w i n n o się GET-em zapisywać danych. Na "maluchu" możemy być zmuszeni do różnych kompromisów, powinniśmy być tego świadomi.

    Do aktualizacji powinno być POST (jak wypełnianie formatki z przeglądarki) lub PUT.
    Zaraz zrobię herbatę i poczytam kod tej biblioteki.

    EDIT:
    1. masz jakiś adres jak github na źródła tej biblioteki?

    2. fragment w twoim poście używa GET
    przeczytaj coś z materiałów o hhtp, pierwszy z brzegu to: https://www.jmarshall.com/easy/http/

    w tym fragmenciku koło słów HTT 1.0
    trzeba by zbudować nieco inną sekwencję POST. Wartości pól nie idą w linii URL, tylko po nagłowkach i jednej pustej linii. Odpowiednio PHP by trzeba symetrycznie zrobić.

    Nie jest to jakiś koniec świata z tym GET. Gdybym musiał aktualizować dane mając tylko GET i zapewnić by było raz-i-tylko-raz, to coś by wymyślił.

    Czy GET, czy POST można i warto sprawdzić co serwer zwraca. Jak rozumiem skrypt zintegrowany z arduino nie będzie jakiś wielki, ale kod 200 OK albo inny to powinien zwrócić.
    Czy zwróci jakieś dane, nie jest to obowiązkowe.


    prezeswer napisał:

    Skrypt w save.php zapisuje podane dane w bazie/tablicy i żeby sobie odczytać muszę wejść na właśnie ten serwer i np. odpalić dane.php, które wyświetlą to co arduino za pomocą skryptu save.php zpisało?


    Tak, ale to już inny poziom abstrakcji niż łączenie arduino. "malucha" nie obchodzą inne strony, może ich byc wiele, niektóre graficznie odbajerowane dla ludzi a nie algorytmów itd ....

    Zasadniczo dobrze to rozumiesz.
    Skrypt dla integracji (ten "save") jakiś bez HTML-a, tylko dane te najprostsze jako text.
    SKrypt/y dla człowieka oczywiście z tabelką HTML, kolorami itd itd...
  • Poziom 5  
    Dobra chyba muszę wrócić do samego początku. Znasz jakieś ciekawe, przystępnie napisane "lekcje" wyjaśniające jak ugryźć ten temat? Bo widzę, że z grzebania w kodzie bez wyjaśnień od znającego się na temacie, to mi niewiele przyjdzie.

    Dodano po 2 [godziny] 20 [minuty]:

    Znalazłem bardzo fajny artykuł wyjaśniający (podstawy) wysyłania danych z Arduino + ENC28J60 do bazy MySQL. Może komuś też się przyda.
    http://www.tweaking4all.com/hardware/arduino/arduino-ethernet-data-push/
  • Pomocny post
    Poziom 38  
    prezeswer napisał:
    Dobra chyba muszę wrócić do samego początku. Znasz jakieś ciekawe, przystępnie napisane "lekcje" wyjaśniające jak ugryźć ten temat? Bo widzę, że z grzebania w kodzie bez wyjaśnień od znającego się na temacie, to mi niewiele przyjdzie.


    Zależy gdzie odczuwasz braki

    Z jednej język PHP (o ile w PHP będziesz implementował, prawdopodobnie tak, ale nie jest to nigdzie wymuszone)

    Z drugiej tu realizujemy rodzaj "web services". Tu bardzo ogólny przegląd, skupia się an "cięższych" standardach
    https://pl.wikipedia.org/wiki/Us%C5%82uga_internetowa
    https://en.wikipedia.org/wiki/Web_service

    Brakuje w polskim przeglądzie REST (co ciekawe jest na przypisach JSON). To co chcesz zrobić jest w duchu REST. Nie ma przymusu temu sie podporządkować (choćby z limitów na uP) ale daje to dobre spojrzenie.

    Nie od rzeczy będzie zerknąć jak teoria sieci (i praktyka też) dzieli warstwy. Wdrożenia uP zawierają ich mniej, jest "skompresowane", ale nadal warstwy są, rozjaśnia to rozmowy np o HTTP. Rzucić okiem przy kawie i nie wkuwać.
    https://pl.wikipedia.org/wiki/Model_TCP/IP
    https://pl.wikipedia.org/wiki/Model_OSI
    W większości rozwiązań arduino widać 3 warstwy, czasem 4. Stąd mój upór, że klasa implementująca transmisję w 3ciej warstwie nie powinna się nazywać jak symbol chipu, jest to projektowo błędne.

    Jeśli tu daję cokolwiek teorii to nie dla znęcania się, czy właśnie wkuwania, ale dla panoramicznego spojrzenia (przynajmniej ja tak potrzebuję)

    *) tak w ogóle nie ma przymusu łączyć się HTTP, inne rodzaje połączeń mogą być radykalnie wydajniejsze. Mam sieciowo na "dużych" b.dobre wyniki z Apache Thrift - przechodząc z HHTP. Na maluchy coś z rodziny MQTT, protokół przeznaczony do telemetrii. Ale na pewno HTTP jest najpowszechniejsze i najprostsze, temat serwera masz najprostszy. Wspominam dla obrazu teoretycznego: HTTP jest aż i tylko opakowaniem, nośnikiem dla funkcjonalności


    prezeswer napisał:

    Dodano po 2 [godziny] 20 [minuty]:

    Znalazłem bardzo fajny artykuł wyjaśniający (podstawy) wysyłania danych z Arduino + ENC28J60 do bazy MySQL. Może komuś też się przyda.
    http://www.tweaking4all.com/hardware/arduino/arduino-ethernet-data-push/


    Ujęcie "dydaktyczne" o wszystkich aspektach, poprawne, ale ... .
    W zasadzie (pozornie???) szybciej prowadzi do wyniku.
    Na mój typ myślenia wolę bardziej "architektoniczne". W programowaniu też obowiązuje zasada "divide et impera". W danej chwili skupiam się na jednym, a resztę widzę jako "czarne skrzynki", funkcjonalności

    Przykład, nie to że się czepiam: artykuł zawiera słowa 'ale wtedy serwer musi posiadać plik.php' . Z punktu widzenia połączenia klienckiego to już nie jest plik, to inna abstrakcja, można użyć słowa URL, można użyć słowa funkcjonalność udostępniona przez sieć. Np wiele różnych URL może być zaimplementowanych przez jeden kod/plik źródłowy
    W usługach http tego typu klient nie dotyka plików na serwerze. Wykonanie przez serwer algorytmu z pliku.php to nie znaczy transmisja pliku.php
    Programista arduino w danych momencie nie dotyka też bazy MySQL itd.... ja wolę patrzenie "black-box"
  • Poziom 5  
    Dzięki za linki. Poczytam, jak mówisz - do kawy.

    Cytat:
    W usługach http tego typu klient nie dotyka plików na serwerze. Wykonanie przez serwer algorytmu z pliku.php to nie znaczy transmisja pliku.php
    Programista arduino w danych momencie nie dotyka też bazy MySQL itd.... ja wolę patrzenie "black-box"


    To chyba rozumiem. Używając zapewne nieodpowiedniej nomenklatury chodzi o to, że w usługach HTTP Arduino zachowuje się jak zwykły "użytkownik" i wchodzi w odpowiedni adres, a całą resztę operacji na plikach wykonuje już skrypt zapisany na serwerze. Ale czy w takim razie da się w prosty sposób za pomocą HTTP zmusić Arduino do odczytu danych z MySQL? Rozumiem, że musiałby "wejść" w odpowiedni URL, który wyciągnie interesujące nas dane z bazy, a Arduino je odczyta, wyciągnie i zapisze u siebie?
  • Poziom 38  
    prezeswer napisał:

    To chyba rozumiem. Używając zapewne nieodpowiedniej nomenklatury chodzi o to, że w usługach HTTP Arduino zachowuje się jak zwykły "użytkownik" i wchodzi w odpowiedni adres, a całą resztę operacji na plikach wykonuje już skrypt zapisany na serwerze. Ale czy w takim razie da się w prosty sposób za pomocą HTTP zmusić Arduino do odczytu danych z MySQL? Rozumiem, że musiałby "wejść" w odpowiedni URL, który wyciągnie interesujące nas dane z bazy, a Arduino je odczyta, wyciągnie i zapisze u siebie?


    Dobrze rozumiesz. Arduino -> URL -> algorytm na serwerze (skrypt) -> baza i z powrotem wyniki

    Wrzuciłem w google, ktoś gdzieś próbował bezpośredni driver bazodanowy arduino->MySQL ale to z wielu, wielu względów nie jest zalecane.
  • Poziom 5  
    EDIT: Poniższy problem rozwiązałem przenosząc zapytanie http do loop() z setup(). I działa jak należy! :)


    To jeszcze pozwolę sobie zadać jedno pytanie, bo powoli w bardzo prymitywnej formie dochodzę do tego co potrzebuję.

    W poniższym kodzie chodzi o to, żeby połączyć się z zewnętrznym serwerem, za pomocą GET odczytać URL, pobrać ostatni znak, którym jest wynik z zapytania bazy MySQL: "1" lub "0". Generalnie śmiga ładnie, ale albo mi coś nie działa jak powinno albo ja źle robię/nie rozumiem. Chodzi o odświeżanie. Chcę aby Arduino łączył się z serwerem powiedzmy co 5 sekund i sprawdzał czy stan (wartość w bazie MySQL) się nie zmienia. W poniższym przykładzie Arduino łączy się pobiera dane, o które proszę, ustawia HIGH lub LOW na zadanym pinie i się rozłącza. Dlaczego?
    Jakie w tym przypadku zadanie ma poniższa linia?
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Co zrobić, żeby co parę sekund pobierał te dane bez rozłączania się z serwerem i czy w ogóle to dobry pomysł, żeby w ten sposób to robić? Choć szczerze to nie przychodzi mi lepszy.

    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Poziom 38  
    dzi_dziuś napisał:
    Robiłem kiedyś podobny projekt, bardzo pomocna okazała się strona:
    http://www.homeguard24.pl/arduino-i-mysql/
    http://atlas.ifj.edu.pl/praktyki/materialy_20...aluszka_Przesy%C5%82anie_danych_na_serwer.pdf

    prezeswer napisał:
    Jakie w tym przypadku zadanie ma poniższa linia?
    Kod: c [rozwiń] [zaznacz wszystko]

    client.println("Refresh: 5");


    Odświeża automatycznie stronę co 5 sek.


    Jest to, jak rozumiem, prośba do serwera, aby w odsyłanej odpowiedzi dał mi "refresh : 5" (mało standardowy, o ile nie będzie w skrypcie php reakcji, zostanie zignorowany). Przeglądarka nie jest w stanie poprosić "wyślij mi następną odpowiedź za 5 sek" - zawsze inicjatorem jest klient, serwer tylko daje odpowiedz.
    Podobny wiersz wśród nagłówków jakie serwer daje klientowi jest dobrze zakorzeniony w tradycji, może być takie coś w generowanym response, niezależnie czy klient nas prosił, czy nie. Ale przeglądarka nie musi być posłuszna (np Lynx, ktoś coś odłączył bo chce dłużej niż 5 sekund czytać poprzednie treści).

    Nasz client jest bardzo biedny w kod i bufory RAM i ztcw nie realizuje takiego refresh (zresztą nie jest przeglądarką)
    Najbardziej naturalnie będzie w loop dać delay 4,5sek i wykonać powtórnie wywołanie

    PS. Aktualna wersja źródeł klienta, która dyskutujecie, jest na jakimś githubie?
    Jak ma ukryte możliwości, np czy spełnia prośbę o refresh - tzreba przeczytać.