Arduino klient - ovládanie z webu

Kony
Příspěvky: 382
Registrován: 09 dub 2020, 11:43
Reputation: 0

Re: Arduino klient - ovládanie z webu

Příspěvek od Kony » 09 kvě 2020, 10:40

No tak ted jsem v tom totalne tumpachový :)))
Myslíš že bych tě mohl poprosit o pomoc s tím checkboxem ?

Uživatelský avatar
kiRRow
Příspěvky: 1151
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Arduino klient - ovládanie z webu

Příspěvek od kiRRow » 09 kvě 2020, 10:55

Si tam spustíš ten "Try it yourself" .... upravíš kód a dáš "Run" ... vedle vidíš co to dělá. Nebudu to psát za tebe. Pochybuji, že ostatním se bude chtít taky. Okradl bych tě o tu radost až si na to příjdeš sám. :)

PS : Momentálně se potřebuješ vzdělat na téma HTML a formuláře... to tě nakopne dál

Kony
Příspěvky: 382
Registrován: 09 dub 2020, 11:43
Reputation: 0

Re: Arduino klient - ovládanie z webu

Příspěvek od Kony » 09 kvě 2020, 10:57

Vím že musím zapracovat na téma HTML a odesílací formuláře...

Kony
Příspěvky: 382
Registrován: 09 dub 2020, 11:43
Reputation: 0

Re: Arduino klient - ovládanie z webu

Příspěvek od Kony » 09 kvě 2020, 11:28

Tak asi jsem to zvládl :))

Kód: Vybrat vše

<?php
	$server = "localhost";
	$user = "kony";
	$pass = "xxxxxxxxxxx";
	$db = "Domacnost";

	$mysqli = mysqli_connect($server, $user, $pass, $db); //připojení k MySQL

	$sql = 'SELECT * FROM arduino_data WHERE modul="svetlo1"';
	$doSql = $mysqli->query($sql);
	if($doSql->num_rows == 0){
		$sql = 'INSERT INTO arduino_data (modul, hodnota) VALUES ("svetlo1", 0)';
		$doSql = $mysqli->query($sql);
	}

	if(isset($_POST['odeslano'])){ //pokud byl formulář odeslán
		$hodnota = sanitize($_POST['stav']);

		$sql = 'UPDATE arduino_data SET hodnota="'.$hodnota.'" WHERE modul="svetlo1"';
		$doSql = $mysqli->query($sql);

	}

	$sql = 'SELECT * FROM arduino_data WHERE modul="svetlo1"';
	$doSql = $mysqli->query($sql);
	$hodnota = $doSql->fetch_assoc()['hodnota']; //načte hodnotu led z DB

	$zapnuto1Checked = $hodnota == 1 ? 'checked' : ''; //nastaví výchozí hodnotu radio buttonu
	$vypnuto1Checked = $hodnota == 0 ? 'checked' : '';



 	$sql = 'SELECT * FROM arduino_data WHERE modul="svetlo2"';
        $doSql = $mysqli->query($sql);
        if($doSql->num_rows == 0){
                $sql = 'INSERT INTO arduino_data (modul, hodnota) VALUES ("svetlo2", 0)';
                $doSql = $mysqli->query($sql);
        }

        if(isset($_POST['odeslano'])){ //pokud byl formulář odeslán
                $hodnota2 = sanitize($_POST['stav2']);

                $sql = 'UPDATE arduino_data SET hodnota="'.$hodnota2.'" WHERE modul="svetlo2"';
                $doSql = $mysqli->query($sql);

        }

        $sql = 'SELECT * FROM arduino_data WHERE modul="svetlo2"';
        $doSql = $mysqli->query($sql);
        $hodnota2 = $doSql->fetch_assoc()['hodnota']; //načte hodnotu led z DB

        $zapnuto2Checked = $hodnota2 == 1 ? 'checked' : ''; //nastaví výchozí hodnotu radio buttonu
        $vypnuto2Checked = $hodnota2 == 0 ? 'checked' : '';


 	$sql = 'SELECT * FROM arduino_data WHERE modul="svetlo3"';
        $doSql = $mysqli->query($sql);
        if($doSql->num_rows == 0){
                $sql = 'INSERT INTO arduino_data (modul, hodnota) VALUES ("svetlo3", 0)';
                $doSql = $mysqli->query($sql);
        }

        if(isset($_POST['odeslano'])){ //pokud byl formulář odeslán
                $hodnota3 = sanitize($_POST['stav3']);

                $sql = 'UPDATE arduino_data SET hodnota="'.$hodnota3.'" WHERE modul="svetlo3"';
                $doSql = $mysqli->query($sql);

        }

        $sql = 'SELECT * FROM arduino_data WHERE modul="svetlo3"';
        $doSql = $mysqli->query($sql);
        $hodnota3 = $doSql->fetch_assoc()['hodnota']; //načte hodnotu led z DB

        $zapnuto3Checked = $hodnota3 == 1 ? 'checked' : ''; //nastaví výchozí hodnotu radio buttonu
        $vypnuto3Checked = $hodnota3 == 0 ? 'checked' : '';


	echo '<form action="" method="POST" >';
		echo '<input type="hidden" value="1" name="odeslano" />';
		echo 'Světlo 1<br>';
		echo '<input type="radio" name="stav" value="1" '.$zapnuto1Checked.' /> Zapnout<br>';
		echo '<input type="radio" name="stav" value="0" '.$vypnuto1Checked.' /> Vypnout<br><br>';
		echo 'Světlo 2<br>';
		echo '<input type="radio" name="stav2" value="1" '.$zapnuto2Checked.' /> Zapnout<br>';
                echo '<input type="radio" name="stav2" value="0" '.$vypnuto2Checked.' /> Vypnout<br><br>';
		echo 'Světlo 3<br>';
                echo '<input type="radio" name="stav3" value="1" '.$zapnuto3Checked.' /> Zapnout<br>';
                echo '<input type="radio" name="stav3" value="0" '.$vypnuto3Checked.' /> Vypnout<br><br>';
		echo '<input type="submit" value="Odeslat">';
	echo '</form>';

	function sanitize($input){
		$input = htmlspecialchars($input);
		$input = htmlentities($input);
		$input = strip_tags($input);
		$input = trim($input);
		return $input;
	}
?>
Můj kod v IDE :

Kód: Vybrat vše

#include <SPI.h>
#include <ESP8266WiFi.h>
#define BUFF_DELKA 255

// Nazev Wi-Fi site, do ktere se mam pripojit
const char* ssid = "Kony";
// Heslo Wi-Fi site, do ktere se mam pripojit
const char* password = "xxxxxxxxx";
char server[] = "konycz.eu"; //URL adresa serveru
char buffer[BUFF_DELKA]; //zásobník na příchozí řetězec
WiFiClient client;

void setup() {
 // Nastartuj seriovou linku, do ktere budu vypisovat provozni informace
 Serial.begin(9600);

 // Na pin D1 je pripojene rele, nastavim jej tedy na vystup
 // Zaroven nastavim nizkée napeti, aby se rele po startu nesepnulo
 pinMode(0, OUTPUT);

 // Pripojeni k Wi-Fi
 Serial.println();
 Serial.print("Pripojuji k ");
 Serial.println(ssid);
 WiFi.begin(ssid, password);

 // Dokud nejsem pripojeny k Wi-Fi,zapisuj do seriove linky tecky progressbaru
 while (WiFi.status() != WL_CONNECTED) {
 delay(100);
 Serial.print(".");
 }

 // Jsem pripojeny k Wi-Fi a mohu pokracovat
 Serial.println();
 Serial.println("WiFi pripojena!");

 // Napis IP adresu, kterou mikropocitac dostal
 Serial.print("Pouzij k pripojeni tuto adresu: ");
 Serial.print("http://");
 Serial.println(WiFi.localIP());
}

// Smycka loop se opakuje stale dokola
void loop() {
    if(client.connect(server, 80)){
        delay(1000);
        client.println("GET http://konycz.eu/doma/svetlo1.php");
        client.println("Host: konycz.eu");
        client.println("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
        client.println("Connection: close");
        client.println();

        delay(1000);

        int inBuffer = 0;

        for(int i = 0; i < BUFF_DELKA; i++){ //vyprázdní buffer
            buffer[i] = '\\0'; //nastaví všechny prvky buffer na znak konce řetězce
        }
        
        while(client.available()){
            buffer[inBuffer] = client.read();    
            inBuffer++;
        }
        
        if(inBuffer == 6){
            if(buffer[0] == 'l' && buffer[1] == 'e' && buffer[2] == 'd'){
                if(buffer[4] == '1'){
                    digitalWrite(0, HIGH);
                }
                else{
                    digitalWrite(0, LOW);
                }
                Serial.println(buffer[4]);
            }
        }

        client.stop();
    }

    delay(60000);
}
ale světlo se mi nechce sepnout

Tak už vím kde mám chybu.......Tady se počítá s textem LED a já mám svetlo1

Kony
Příspěvky: 382
Registrován: 09 dub 2020, 11:43
Reputation: 0

Re: Arduino klient - ovládanie z webu

Příspěvek od Kony » 09 kvě 2020, 12:36

Po oprave vse jede jak z praku.

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: Arduino klient - ovládanie z webu

Příspěvek od martinius96 » 09 kvě 2020, 19:07

Ahoj, v tom PHP kóde máš SQL a z častí aj XSS injection.
Ak ti niekto spustí ten php script, je schopný ti vymazať celú databázu, ukradnúť ti dáta, ak nastaví správne požiadavku.

Keď niečo vypisuješ na stránku z databázy, používaj htmlspecialchars (aby si si nespustil nežiadúci XSS script, ak ti ho tam niekto nahraje ako text).
Čo sa týka preberania dát, chýba ti tam mysqli_real_escape_string, htmlspecialchars sa na spracovanie dát (pri ukladaní) nepoužíva. Ak ti tam nahráš takto, tak pri výpise si to (bez htmlspecialchars) sformátuješ rovnako a ten HTML kód sa spustí, ak by tam bol ten spomínaný script, rovnako tak aj v prípade htmlentities - je lepšie to používať pre výpis. Funkcia trim je OK, zmaže prípadné medzery.

Taktiež action toho formulára, ten môžeš volať na jeho PHP meno... cez PHP_SELF, scriptom je možné ten formulár presmerovať.
Na druhú stranu chválim, že používaš mysqli_queries a nie mysql_queries, ten je deprecated.

Kony
Příspěvky: 382
Registrován: 09 dub 2020, 11:43
Reputation: 0

Re: Arduino klient - ovládanie z webu

Příspěvek od Kony » 09 kvě 2020, 19:35

Pojede mi to na lokalnim serveru doma kam neni presnerovana verejka...9

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 11 hostů