Raspberry Pi - Jak ovládat GPIO z webu / How to control a GPIO from website
- August 17 2014
- Raspberry Pi, Cubieboard, Banana Pi, BeagleBone
- 8898x Přečteno
Zde jsou ke stažení 2 PHP soubory a 1 python script.
Pokud si zahráváte s myšlenkou ovládat zařízení pomocí webové stránky, pak byste si tento článek měli určitě přečíst.
V článku rozeberu možnosti jak ovládat GPIO z webové stránky. K dispozici jsou zdrojové kódy python script a 2 php soubory.
Rozsvítíme LED pomocí PHP, který přímo spustí python script nebo PHP soubor pouze zapíše do databáze MySQL a cron spustí každou minutu náš python script.
V prvním případě budeme zapisovat "nového" uživatele přímo do /etc/sudoers.tmp a ošetříme chybu "sudo: no tty present and no askpass program specified". Ve druhém případě vytvoříme nový cron proces, který se má spouštět každou minutu do cronetab.
V obou případech PHP stránka zapíše proměnou do MySQL databáze odkud si python script bude kontrolovat změny.
Vytvořte si databázi zkouska a tabulku lpm (led+python+mysql)
v něm budou prvky id, který je typu UNSIGNED INT a má nastaven PRIMÁRNÍ klíč. poté vytvořte prvek gpio, který je typu VARCHAR a je nulový. Nakonec prvek onoff, který je typu UNSIGNED INT a je opět nulový. Délka množiny není jinak důležitá. U typů INT zadejte například 2 u typu VARCHAR například 10.
Databázi si samozřejmě můžete vytvořit i jinou, stačí si poté upravit PHP soubory a python script.
Nyní k samotnému řešení. Pokud použijete metodu, kde PHP souborem spustíte přímo python script, pak vězte, že si musíte dávat opravdu veliký pozor! Musíte totiž uživatele www-data (apache) přidat do sudoers a povolit mu mimojiné právě spuštění python scriptů. Zde je nebezpečí, že toho může nějaký útočník využít při pokusu o SQL Injection, kde místo MySQL dotazů použije shell příkazy. Například takové rm -rf vám smaže celý disk. Výhodou ale je okamžitá změna, resp. okamžité spuštění python scriptu. Narozdíl od cronu, kde nejmenší časový úsek je jedna minuta.
Na začátku si musíte (pokud ještě nemáte) nainstalovat balík python-mysqldb.
To provedeme pomocí příkazu v terminálu: sudo apt-get install python-mysqldb
Pokud už máte vytvořenou databázi (buď v phpmyadmin nebo pomocí příkazu mysql -u USER -p), tak musíte použít příkaz mysql -u USER -p, kterým se dostanete "přímo k ovládání" MySQL. Zde zadáte příkaz: USE zkouska.
Pokud to neuděláte, vyskočí upozornění Error 1046 No database Selected.
Poté přidáme uživatele www-data (apache) do sudoers pomocí příkazu: sudo pkexec visudo kam na poslední řádek napíšeme:
www-data ALL=(ALL) NOPASSWD: ALL
Jak jsem již napsal, tato cesta je velmi riskantní, proto byste se měli dobře rozmyslet, zda nepoužít raději crontab.
Pokud se vám objeví hláška sudo: no tty present and no askpass program specified, pak zkontrolujte správný zápis do sudoers.
Poté stačí nahrát 2 PHP soubory a 1 python script do /var/www/. Soubory budou ke stažení níže společně s komentářem.
Verze 2: spouštění python scriptu v pravidelných intervalech pomocí crontab.
V PHP souborech, respktive v souboru zmena.php zakomentujeme jeden řádek (viz. komentáře v souboru)
zadáme do terminálu: sudo crontab -e
otevře se nám textový editor, kde na poslední řádek napíšeme: * * * * * sudo /usr/bin/python /var/www/led-python-mysql.py, při tomto příkazu se bude cron spouštět každou minutu. Nyní cron restartujeme pomocí sudo service cron restart.
Pokud zadáme do terminálu ps aux | grep /var/www/led-python-mysql.py, uvidíme běžící proces.
Na závěr bych chtěl znova zdůraznit možnost zneužití uživatele www-data do sudoers.
Schéma:
Zde jsou ke stažení 2 PHP soubory a 1 python script.
<#EN>
Download 2 PHP files and 1 python script
If you want to control GPIO through webpage, you have to read this article.
I will describe how to control GPIO from webpage. You can download 2 PHP files and 1 python script.
I will describe two ways how to run python script which will control GPIO. First way will run python script directly from PHP.
We will turn on LED with PHP which write to the MySQL database and the cron runs our python script every minute.
In the first way we add "new" user to /etc/sudoers.tmp and we repair the error "sudo: no tty present and no askpass program specified". In the second way we create new cron process which we write to the cronetab.
In both options, the PHP writes the variable to the MySQL database and the python script reads the variable and it controls the GPIO.
The first, you have to the database database and the table lpm (led+python+mysql).
You create element id, type UNSIGNED INT and it has PRIMARY KEY. Next element will be gpio, type VARCHAR and it is NULL. And last onoff, type UNSIGNED INT and it is NULL.
The length set is not important. For INT for example 2 and VARCHAR for example 10.
You can create other database, but you have to rewrite php files and python script
Now, solution. If you use first metode (add www-data (apache) to the etc/sudoers.tmp), you must be very careful. The PHP can run python script, but if somebody uses SQL injection and he uses shell script, he can delete your disk (rm -rf).
Nevertheless, the change GPIO is immediate. If you use cron, the shortest time interval is one minute.
You have to install package python-mysqldb. You write sudo apt-get install python-mysqldb in the terminal.
If you created the database, you have to use command USE test in the phpmyadmin or in the mysql -u USER -p.
When you don't use, you will see warning Error 1046 No database Selected.
After you will add user www-data (apache) to the sudoers through terminal: sudo pkexec visudo. You write:
www-data ALL=(ALL) NOPASSWD: ALL
on the last line.
If you will see sudo: no tty present and no askpass program specified, you check your line in the sudoers.
The end, you upload 2 PHP files and 1 python script on your website. Files are download at the end of the page with comments.
Second way: running python script with crontab.
You comment one line (comments in the zmena.php file) in the zmena.php.
write in the terminal: sudo crontab -e
You write this command on the last line.
* * * * * sudo /usr/bin/python /var/www/led-python-mysql.py
The cron will run every minute. Now, restart cron.
sudo service cron restart
If you write ps aux | grep /var/www/led-python-mysql.py to the terminal, you see running process.
Schematic:
Download 2 PHP files and 1 python script