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

Zdalne sterowanie Raspberry przez www (PHP)

kitarro 22 Sie 2013 22:13 4881 10
  • #1 22 Sie 2013 22:13
    kitarro
    Poziom 8  

    Witam,

    staram się rozwiązać problem sterowania Raspberry przez stronę internetową.
    Mam napisane programy w Pythonie, które sterują mi wyjścia w Raspberry.
    Chciałbym teraz, uruchomić program w Pythonie z poziomu strony internetowej.
    Czy możecie mi pomóc, jak zaimplementować kod z Pythona do PHP, aby można było sterować obiektami/funkcjami. Tak aby, sterowanie z poziomu lokalnego(przyciski połączone do Raspberry), oraz zdalnego (PHP) działały ze sobą współmiernie.

    Starałem się wywołać kod z poziomu php:

    Kod: php
    Zaloguj się, aby zobaczyć kod


    Niestety, nie działa.
    Za każdą wskazówkę będę wdzieczny.

    0 10
  • Deimic Smart Home
  • #2 23 Sie 2013 09:05
    adamz74
    Poziom 30  

    Ogólnie lepiej byłoby korzystać z czystego PHP i zrezygnować z wywoływania zewnętrznych skryptów. W przypadku skryptów zewnętrznych należy się liczyć z dodatkowymi kłopotami... uprawnienia, konfiguracja, wzajemna wymiana danych. To tylko moja opinia...

    W Twoim przypadku:
    1. Jeśli nie jest włączone, to włączył bym wyświetlanie błędów z PHP. Można to zrobić w konfiguracji globalnej parsera PHP (plik php.ini) lub z poziomu danego skryptu

    Kod: php
    Zaloguj się, aby zobaczyć kod


    2. Serwer www i tym samym skrypty PHP są uruchamiane najczęściej z uprawnieniami dedykowanego użytkownika. Nazywa się on różnie... apache, httpd, www. Użytkownik ten musi uprawnienia do wykonania polecenia sudo. Trzeba sprawdzić plik /etc/sudoers i ew. go przeedytować...
    Kod: bash
    Zaloguj się, aby zobaczyć kod

    , gdzie "apache", to nazwa użytkownika i ew. trzeba ją odpowiednio zmienić.

    3. Pozostają jeszcze do sprawdzenia uprawnienia na skryptach Pythona.

    Pozdr!

    0
  • Deimic Smart Home
  • #3 23 Sie 2013 15:51
    kitarro
    Poziom 8  

    Częściowo się z Tobą zgadzam, ale ja nie chcę tylko sterować z poziomu przeglądarki wykorzystując PHP.

    Mam program, który steruję wysokością rolety (3 poziomy), którego funkcje są wywoływane przez przyciski. Podłączone bezpośrednio do Raspberry, jest to sterowanie lokalne. Mając do dyspozycji LAN/WAN, chciałbym teraz to razem połączyć, realizując zdalne sterowanie.

    Sprawdziłem z poziomu PHP, kim jestem:

    Kod: php
    Zaloguj się, aby zobaczyć kod


    Dopisałem usera do:
    Kod: bash
    Zaloguj się, aby zobaczyć kod

    To mi jeszcze bardziej namieszało i uniemożliwiło pracę w Linuksie.

    Pomyślałem sobie, skoro w Pythonie operuję na zmiennych, to czy z poziomu strony mogę je odczytywać/zapisywać. Gdy uruchomię program z poziomu konsoli, wszystkie zmienne się ustawią i prg będzie gotowy na przyjmowanie komend.

    Moje przemyślenia i kombinacje:
    1.Toteż pytanie, jest możliwość podania pliku Pythona i odczytanie konkretnej zmiennej z PHP?

    2. Gdyby utworzyć kolejną zmienną, którą by Python zapisywał do pliku. Jeżeli wykona się funkcja, to
    Kod: bash
    Zaloguj się, aby zobaczyć kod


    W PHP sprawdzałbym zmienną i jeśli by miała np wartość=2 to wykonaj funkcję.
    Np coś takiego:
    Kod: php
    Zaloguj się, aby zobaczyć kod


    Tylko, że teraz trzeba by było zapisać nową zmienną z PHP, a tu coś mi nie wychodzi..

    Proszę Was o opinie i sugestię.

    0
  • #4 24 Sie 2013 22:34
    eros81
    Poziom 14  

    kitarro napisał:
    Witam,

    staram się rozwiązać problem sterowania Raspberry przez stronę internetową.
    Mam napisane programy w Pythonie, które sterują mi wyjścia w Raspberry.
    Chciałbym teraz, uruchomić program w Pythonie z poziomu strony internetowej.
    Czy możecie mi pomóc, jak zaimplementować kod z Pythona do PHP, aby można było sterować obiektami/funkcjami. Tak aby, sterowanie z poziomu lokalnego(przyciski połączone do Raspberry), oraz zdalnego (PHP) działały ze sobą współmiernie.

    Starałem się wywołać kod z poziomu php:
    Kod: php
    Zaloguj się, aby zobaczyć kod


    Niestety, nie działa.
    Za każdą wskazówkę będę wdzieczny.

    Witam
    Nie jestem pewien ale stosując sudo należy wpisać hasło.
    W tym przypadku exec nie wpisze za ciebie hasła.
    Co robi skrypt ledon.py że w php tego nie możesz napisać?

    Pozdrawiam

    0
  • #5 26 Sie 2013 09:52
    kradam
    Poziom 14  

    Po to jest NOPASSWD, żeby hasła nie pisać.
    Co to znaczy" To mi jeszcze bardziej namieszało i uniemożliwiło pracę w Linuksie."?
    Przekazywanie zmiennych między PHP a Phytoon można zrealizować właśnie przez argumenty wywołania skrytpów. Co do mojej opinii na temat przekazywania zmiennych przez pliki to brzmi ona: NO COMMENTS :-)
    Również bym się grubo zastanowił czy nie warto przepisać WWW i skryptów sterujących do jednego języka.

    0
  • #6 26 Sie 2013 20:15
    kitarro
    Poziom 8  

    eros81 napisał:
    kitarro napisał:
    Witam,

    staram się rozwiązać problem sterowania Raspberry przez stronę internetową.
    Mam napisane programy w Pythonie, które sterują mi wyjścia w Raspberry.
    Chciałbym teraz, uruchomić program w Pythonie z poziomu strony internetowej.
    Czy możecie mi pomóc, jak zaimplementować kod z Pythona do PHP, aby można było sterować obiektami/funkcjami. Tak aby, sterowanie z poziomu lokalnego(przyciski połączone do Raspberry), oraz zdalnego (PHP) działały ze sobą współmiernie.

    Starałem się wywołać kod z poziomu php:
    Kod: php
    Zaloguj się, aby zobaczyć kod


    Niestety, nie działa.
    Za każdą wskazówkę będę wdzieczny.

    Witam
    Nie jestem pewien ale stosując sudo należy wpisać hasło.
    W tym przypadku exec nie wpisze za ciebie hasła.
    Co robi skrypt ledon.py że w php tego nie możesz napisać?

    Pozdrawiam


    Program relizuje sterowanie obiektem, którym jest roleta okienna. Przemieszcza ją w 3 pozycjach.
    Tak, jak wspomniałem, sterowaniem lokalne jest realizowane przez skrypt w pythonie. Natomiast teraz, chciałem to zrealizować przez stronę internetową. Dlatego też php.

    kradam napisał:
    Po to jest NOPASSWD, żeby hasła nie pisać.
    Co to znaczy" To mi jeszcze bardziej namieszało i uniemożliwiło pracę w Linuksie."?


    Po wpisaniu do pliku: sudo nano /etc/sudoers/
    Kod: bash
    Zaloguj się, aby zobaczyć kod

    każdorazowe wydanie polecenia z użyciem sudo, zwraca error:

    Kod: bash
    Zaloguj się, aby zobaczyć kod



    kradam napisał:
    Przekazywanie zmiennych między PHP a Phytoon można zrealizować właśnie przez argumenty wywołania skrytpów. Co do mojej opinii na temat przekazywania zmiennych przez pliki to brzmi ona: NO COMMENTS Smile

    Chodzi o bezpieczeństwo systemu?

    kradam napisał:
    Również bym się grubo zastanowił czy nie warto przepisać WWW i skryptów sterujących do jednego języka.


    Proszę o sugestię jaki język, spełni moje wszystkie oczekiwania.
    Czyli lokalne sterowanie, przy użyciu przycisków podłączonych do RP, oraz zdalne przez stronę www.
    I dlaczego nie python? ;)

    0
  • #7 27 Sie 2013 08:30
    kradam
    Poziom 14  

    Skoro masz skopane sudoers, to można pewnie je naprawić.
    Niestety nie znam żadnego języka który potrafiłby "sterować przyciskami", ale skoro takie cuda potrafi Phytoon (z racji zwierzęcego pochodzenia zapewne), to podpowiem, że nadaje się on również do tworzenia stron WWW :-)

    0
  • #8 27 Sie 2013 11:37
    adamz74
    Poziom 30  

    sudoers nie lubi być edytowany inaczej niż przez specjalny edytor i tu właśnie to wyszło :(

    Wydaj polecenie

    Kod: bash
    Zaloguj się, aby zobaczyć kod
    i powinieneś zostać poproszony o hasło do pi (domyślne, to "raspberry"). Powinieneś w ten sposób uzyskać uprawnienia root-a. Następnie uruchom visudo, który powinien naprawić problem.

    Ogólnie wygląda, to dość sensownie i powinno to ładnie działać o ile rozwiąże się problem z wywoływaniem programów Pythona przez PHP.
    Co prawda z PHP można zrobić prawie wszystko (i np.: tu masz przykład jak sterować liniami GPIO https://github.com/ronanguilloux/php-gpio/blob/master/src/PhpGpio/Gpio.php),, ale ze względów bezpieczeństwa należy to rozdzielić i PHP nie powinno mieć uprawnień do bezpośredniego sterowania sprzętem.

    Sprawdź jeszcze czy PHP nie jest przypadkiem uruchomione w trybie bezpiecznym (safe mode) i ew. uwzględnij ograniczenia z tym związane.

    0
  • #9 27 Sie 2013 21:01
    kitarro
    Poziom 8  

    kradam napisał:
    Skoro masz skopane sudoers, to można pewnie je naprawić.


    dlatego pewnie w tej kwestii, przywróciłem sprawność sudoers.
    kradam napisał:
    Niestety nie znam żadnego języka który potrafiłby "sterować przyciskami", ale skoro takie cuda potrafi Phytoon (z racji zwierzęcego pochodzenia zapewne), to podpowiem, że nadaje się on również do tworzenia stron WWW :-)

    Jak widać, ja też mało znam te języki, ale postaram się zgłębić tajemnicę mrocznego pythona z Twoimi radami. ;)

    adamz74 napisał:

    sudoers nie lubi być edytowany inaczej niż przez specjalny edytor i tu właśnie to wyszło Sad

    Wydaj polecenie

    Kod Bash - [rozwiń]
    pkexec bash

    i powinieneś zostać poproszony o hasło do pi (domyślne, to "raspberry"). Powinieneś w ten sposób uzyskać uprawnienia root-a. Następnie uruchom visudo, który powinien naprawić problem.


    Jak mam rozumieć nie lubi, mam możliwość edycji, mam prawa roota. Mogę edytować. Tylko po edycji mi sypie błędami, takimi jak opisałem w poście wyżej.
    Nawet Twój sposób edycji nie pomógł dalej to samo.. :(

    Cytat:
    Co prawda z PHP można zrobić prawie wszystko (i np.: tu masz przykład jak sterować liniami GPIO https://github.com/ronanguilloux/php-gpio/blob/master/src/PhpGpio/Gpio.php),, ale ze względów bezpieczeństwa należy to rozdzielić i PHP nie powinno mieć uprawnień do bezpośredniego sterowania sprzętem.


    Testowałeś to może?
    Przyznam przeglądam to i nie bardzo to rozumiem...

    0
  • #10 11 Wrz 2013 11:38
    DarekMich
    Poziom 15  

    Witam, ja jestem w trakcie budowy sterownika CO w domu, i już sporo mi się udało osiągnąć w tej kwestii. Korzystam z Raspberry pi + piface, niestety czas nie pozwala na jakiekolwiek lutowanie, trawienia itp.

    Podstawowym założeniem również było wykonywanie poleceń z php, ja zmiennych zapisywać nie muszę nigdzie, gdyż stan wyjść jest niezmienny i w łatwy sposób można je odczytywać.

    jeżeli ustawisz 1 na wyjściu, to adres+8 jest odwzorowaniem stanu wyjścia jaki sam ustawiłeś.

    U mnie byłą podobna historia odnośnie sudo i php. Jednak udało mi się i skrypt bezproblemu wykonuje polecenia sudo, razem ze zwracaną zawartością.

    Zrezygnowałem z python ze względu na czas wykonywania się pojedynczej zmiany stanu lub odczytu stanu wynoszący nawet kilka s. Zamiast tego zastosowałem wirepiface, po instalacji doszła komenda w bash nie wymagająca sudo, nazywa się ona gpio, dołączony interfejs (u mnie piface) jest dostępny pod adresem 200 (1 bit na piface). kiedy próbowałem odczytać stan wyjścia zawsze zwracało mi 0, ale odczytywanie adresu 208 zwracało mi stan rejestru dla danego bitu wyjść (odpowiednio 201 - 209 itp...).

    Zastosowałem ramdrive ze względu na operowanie kilku zmiennymi na plikach, pamiętanie ostatnich pomiarów temperatury itp itd. zamiast apache użyłem ngix, php jest uruchamiane przez fastCGI. zdecydowanie urządzenie zyskało na "żywotności" (czyt. szybkości reakcji).

    efektem tego po restacie, stan rejestrów wyjściowych piface nadal pamięta wcześniej zadaną wartość, a ja nie muszę nic zapisywać do plików, czy z nich odczytywać, na samej karcie zapisuje jedynie najważniejsze dane tj. czy piec jest włączony (praca wymuszonego grzania), wyłączony (przeciwnie jak do włączenia), podstawowe ustawienia, wiele jeszcze w planach.

    Pisze dużo w internecie na temat tego dlaczego nie zezwalać PHP na wykonywanie poleceń sudo, można też zezwolić na tylko szczególne polecenia sudo itp. ale dopóki urządzenie nie ma bezpośredniego połączenia z internetem, żadnych usług typu FTP, SAMBA, NFS i innych podobnych nie czuję obawy.

    Zaznaczam, że nie jestem zaawansowanych użytkownikiem linuxa, wszystko co i jak znalezione w internecie.

    Ostatecznie mogę wysłać Ci "obraz mojej karty", jest na niej zaktualizowany python, dodane moduły do sterowania piface z bash i z python i kilka innych, oraz ustawiony php.
    Jedynie informacyjnie dodam, ze całość jest zainstalowana na karcie 8GB, więc będziesz musiał zaopatrzyć się w taką samą lub większą (producenci mogą oszukiwać nawet o kilka kb w danej karcie i 1 karta 8gb drugiej nie równa).

    0
  • #11 11 Wrz 2013 12:23
    szelus
    Specjalista - Mikrokontrolery

    adamz74 napisał:

    Co prawda z PHP można zrobić prawie wszystko (i np.: tu masz przykład jak sterować liniami GPIO https://github.com/ronanguilloux/php-gpio/blob/master/src/PhpGpio/Gpio.php),, ale ze względów bezpieczeństwa należy to rozdzielić i PHP nie powinno mieć uprawnień do bezpośredniego sterowania sprzętem.

    To jest właściwa uwaga na właściwym miejscu. :)
    Nie miałem czasu wnikać w podlinkowany projekt, ale początkującym, borykającym się z takimi problemami chciałbym zwrócić uwagę, że linuxie/unixie jest coś takiego, jak atrybut "setuid on execution" w uprawnieniach pliku. Polega to na tym, że przy wykonaniu programu/skryptu z takimi uprawnieniami, efektywny identyfikator użytkownika jest ustawiany na właściciela pliku. Jeżeli np. właścicielem takiego programu/skryptu jest root, to podczas wykonania program ma uprawnienia superużytkownika, ale może być wywołany przez kogokolwiek, kto ma uprawnienia do jego wykonania. I nie potrzeba wcale sudo.

    0