2023-01-27

PHP i VIRTUINO z REST API - czyli zaczynamy cz I

 


Dlaczego PHP i VIRTUINO już wspominałem - jest to konieczność umieszczenia jakiś informacji na stronie WWW, wysyłanych przez ESP  schowany za ruterem w wewnętrznej domowej sieci. A bez choćby minimalnej znajomości kodowania PHP to się nie uda. Jednak cały mój kurs nauki postaram się ograniczyć do kilku elementów związanych z odbiorem informacji z mikrokontrolera i  ich prezentacją na stronie WWW. 

A wszystko to z pomocą  PHP właśnie.


Po przestudiowaniu podstawowego kursu o PHP  trochę odetchnąłem z ulgą. Na szczęście cały ten PHP to nieco udziwniony ale stary dobry znajomy (choćby z ARDUINO IDE ) C/C++.  Zmienne, funkcje, operatory itd itd to kalka niemalże 1:1 ze znanego już nieco języka. Jeśli ktoś chce pójść dalej w obszary zajęte przez obiekty, klasy konstruktory to również nie będzie miał z tym problemu znając C. Ale bądźmy szczerzy - do podstawowego oprogramowania mikrokontrolera nie jest to w ogóle potrzebne więc pewnie i do prostych kodów PHP nie trzeba się tego uczyć. W końcu człek jest elektronikiem z podstawową (powiedzmy nawet z bardzo podstawową) umiejętnością programowania a nie programistą w językach wyższego rzędu z pobieżną znajomością materialnej elektroniki.

Kilka wiadomości nowych (dla mnie) aczkolwiek podstawowych

  • jeśli chcemy zastosować w pliku choćby fragment kodu PHP plik musi mieć rozszerzenie .php
  • o ile plik .html otwiera się w naszej przeglądarce z dowolnego miejsca (np. z pulpitu komputera) to plik .php musi być umieszczony na serwerze WWW i z niego wywoływany przeglądarką
  • żeby coś wydrukować na naszej stronie w ramach kodu PHP stosujemy funkcję echo zaś zawartość do wydrukowania umieszczamy między '  ' lub "  " (co kiedy  - do przeczytania w kursie :) ). Inna funkcja to printf() działa jak C/C++
  • nazwy zmiennych poprzedza znak $ ($nazwa_zmiennej)   a typ zmiennej dowiązywany jest automatycznie  (choć może być określony jawnie jak w C)
  • wprowadzenie jakiś danych przez użytkownika wymaga zastosowania formularza HTML (więcej tu) zaś wprowadzone dane jako zmienne muszą trafić na serwer WWW do odpowiedniego pliku .php gdzie zostaną jakoś przetworzone a następnie jakoś wyświetlone
  • jeśli ESP będzie umiał wysłać na serwer WWW informację podobną do tej z formularza strony WWW to odpowiedni plik .php na serwerze  ją odbierze, przetworzy i wyświetli
  • problemem do rozwiązania jest zapamiętanie danych na serwerze w czasie pomiędzy zapisaniem ich przez ESP a odczytem przez stronę użytkownika chcącego odczytać to co ESP  wysłał
Jeśli to co powyżej ogarnę kodowaniem .php to nie pozostaje mi nic innego jak umieścić oba pliki (.html i .php) na jakimś serwerze i wysyłać do niego z ESP określone dane. Dane te muszę opakować tak by symulowały  formularz html lub innym podobnym sposobem powodującym iż w zmiennych pliku .php pojawią się informacje wysyłane z ESP.  Końcowym działaniem będzie wyświetlenie tych danych  na stronie WWW. W teorii brzmi prosto - zobaczymy co przyniesie praktyka.

Na początek trzeba poszukać darmowego serwera WWW, na którym można ćwiczyć zabawę z PHP. Blogger niestety odpada gdyż w żaden sposób nie da się na nim umieścić plików .php.
Znalazłem darmowy hosting  https://www.000webhost.com/ z łatwym interfejsem do ładowania plików na serwer. Dodatkowo dostajemy za darmo domenę typu  nazwa_konta.000webhost.com

Moja domena to https://esp8266restapi.000webhostapp.com/  i tam  umieszczam pliki do przetestowania.

Nauka wysyłania poprzez GET danych na serwer  WWW.


Wsparłem się wiedzą ze tej strony 

GET wysyła dane w sposób jawny w adresie zapytania wysyłanego do serwera czyli popularnego UR. Można te dane wpisać z ręki można je wysłać formularzem ze strony. Wysyłamy je do pliku .php który potrafi to odebrać i wyświetlić. Stworzyłem dwa pliki jeden .html z formularzem drugi .php z kodem odbioru i wyświetlania danych

Kod pliku dwa.php wygląda tak

<html>
 <head>
  <title>
   Wyniki
  </title>
 </head>
 <body>
Czujnik : <?php echo $_GET['czujnik']?><br>
Odczytana wartość <?php echo $_GET['wartosc']?><br>
 </body>
</html>

Wywołanie samego pliku (tu link) zgłosi błąd gdyż nie wysyłamy do niego żadnych danych.

Można wywołać ten plik z paska adresu przeglądarki w postaci 

https://esp8266restapi.000webhostapp.com/dwa.php?czujnik=temperatura&wartosc=23

Co jest nazwą zmiennej a co jej daną widać wprost. Można wysłać dane ze strony WWW zawierającej formularze. Adres strony testowej

https://esp8266restapi.000webhostapp.com/jeden.html

i kod HTML strony testowej jeden.html

<html>
 <head>
  <title>

   Test formularza
  </title>
 </head>
 <body>
    <h2>To jest strona do testowania wysyłania danych ze strony</h2>
<h2>na serwer WWW metodą GET i ich wyświetlania na stronie</h2><br/><br/>
 <form action="dwa.php" method="GET">
  Czujnik: <input type=text name="czujnik" value="temperatura"/><br/>

  Odczytana wartość <input type=text name="wartosc" value="123"/><br/>
  <input type=submit value="Wyślij"/>
  </form>
 </body>

</html>

Jeśli więc będę umiał wysłać z klienta odpowiedni URL to sprawa wysłania i wyświetlenia danych z mojego ESP powinna być rozwiązana.


Nauka wysyłania poprzez POST danych na serwer  WWW.

Tą razą wsparłem się wiedzą z tej strony

Wysyłanie poprzez POST odbywa się w sposób niejawny. Dane zawarte są w nagłówku strony. Toteż wysłanie ich metodą POST z przeglądarki wymaga użycia formularza. 

Przykładowa strona z formularzem POST post_h.html ma kod

<form action="post_p.php" method ="POST" accept-charset="utf-8">
    Rodzaj czujnika: <input name ="first_name" type="text" value="Wpisz coś">
    <br /><br />
    Wartość czujnika: <input name ="last_name" type="text">
    <br /><br />
    <p><input type="submit" value="Submit"></p>
</form>

<p><a href="post_p.php">TARGET</a></p>

i odbierający te dane plik post_p.php ma kod 

<?php

if(isset($_POST['first_name']) && isset($_POST['last_name'])){
    $fist_name = $_POST['first_name'];
    $last_name = $_POST['last_name'];
    echo "Odczytałem:  >> $fist_name $last_name";
}
?>
<p><a href="post_h.html">POST_H</a></p>


Możemy też wysłać wygenerowane jakimś innym sposobem zapytanie na serwer. o takim formacie nagłówka, który będzie zawierał dane przekazywane do pliku .php

Ma to mieć postać podobną do tego

POST /test HTTP/1.1
Host: foo.example
Content-Type: application/x-www-form-urlencoded
Content-Length: 27

field1=value1&field2=value2

lub za pomocą JSON

POST /echo/post/json HTTP/1.1 Host: reqbin.com Content-Type: application/json Content-Length: 80 { "Id": 12345, "Customer": "John Smith", "Quantity": 1, "Price": 10.00 }

Co to oznacza jeszcze nie wiem ale niech nad tym się głowi nasz ulubiony ciąg dalszy.










Brak komentarzy:

Prześlij komentarz