ラズベリーパイをweb経由で遠隔操作

スマホから遠隔操作でRaspberry PiのGPIOを遠隔操作できるようにしたので
その方法を備忘録として残しておきます

全体の流れ

1.Apacheのインストール(Webサーバー)
2.PHP7.0のインストール(CGI用スクリプトエンジン)
3.ApacheからPHPを使えるようにする
4.phpファイルの作成
5.python側でファイルを監視

大体こういう流れです

Apacheのインストール

Apacheはwebサーバーのアプリケーションです
外部からブラウザなどを使ってホームページを表示させるのに必要です

$sudo apt-get apache2

でインストール出来ます

PHP7.0のインストール

PHPはプログラムを使ってWeb表示をするためのアプリケーションです
通常のWebページはサーバーに置いてあるファイルをそのまま表示するだけですが
PHPなどのアプリケーションを使うとWebサーバーがプログラムを元に動的にwebページを作成して表示してくれます
データをサーバ側で組み立てるのでクライアント側にはソースが見えないのが特徴です

$sudo apt-get php7.0

でインストール出来ます

ApacheからPHPを使えるようにする

phpファイルを作成してもソースコードが表示されるだけでCGIとして認識されない
という事態になったのでネットで色々調べました

sudo apt install libapache2-mod-php

CGIのパス通しなどを試してみてもうまくいかなかったのですが
これを導入したら動くようになりました
もしかしたら掛け合いもあるかもしれません

PHPファイルを作成

ラズパイのwebページを置くディレクトリは
/var/www/html
フォルダにあります

ここにphpファイルを作りたいのですが、初期ではアクセス権限が無くてファイルを作ることが出来ません

なのでhtmlフォルダ以下に全ユーザーのアクセス権限を与えます(もしかしたら危険かも)

sudo chmod -R 777 /var/www/html

と入力すればhtmlフォルダとそれ以下のファイルのアクセス権限がフルコントロールになります

テストPHPファイルを作ってみます

$sudo nano /var/www/html/test.php

<?php
phpinfo();
?>

Ctrl+O → Enterで保存、Ctrl+Xでエディタを終了します

同一LAN内のPC等からhttp://192.168.1.20/test.phpアクセスします
(192.168.1.20はラズパイのアドレスにしてください)

PHPの情報一覧が表示されると思います

PHP経由でGPIOを操作する方法として
私はファイルを通じて指示を出すという方法を取りました

流れ:
PHPファイルはアクセスがあるとコマンドパラメータをそのままファイルとして書き出す
Pythonプログラムはそのファイルを監視し、コマンドの内容に応じてGPIOを操作、ファイルを削除する
という流れです

以下が受け取ったコマンドをそのままファイルに書き出すPHPサンプル

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
	<title>Command</title>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
	<meta name="viewport" content="width=device-width">
</head>

<form name="form1" id="form1" action="command.php" method="post">

<?php
/* ---------------------------------------------------
	 GETリクエストがあった時、commandパラメータをcommand.txtに書き出す
 -------------------------------------------------- */
if ($_SERVER["REQUEST_METHOD"] == "GET") {
	if($_GET["user"] == "username"){
		$filename = "./command.txt";
		$f = fopen($filename, "w") or die("失敗!");
		fwrite($f, $_GET["command"]);
		fclose($f);
		echo $_GET["command"]."要求を受け付けました。";		
	}else{
		echo "アクセスが無効です";
	}
}
?>

</form>
</body>
</html>

これをcommand.phpとして保存し

外部からhttp://192.168.1.20/command.php?user=username&command=test
のようにアクセスします

するとcommand.phpと同じフォルダにtestという内容のcommand.txtが作成されます
(userはユーザー名を指定することでアクセスパスワード代わりにしています)

このファイルをPythonで監視するわけです

Command.txtをPythonから監視

PythonのIDEを起動しPythonのプログラムを書いていきます

以下がサンプル

# -*- coding: utf-8 -*-

import os
import RPi.GPIO as GPIO
import datetime, time
from time import sleep

GPIO.setmode(GPIO.BCM)
GPIO.setup(25, GPIO.OUT)

path = "/var/www/html/command.txt"

try:
    while True:       
        sleep(2)
        if os.path.exists(path):
            cmd = open(path).read()
            if cmd == "on":
                GPIO.output(25, GPIO.HIGH)
                print("on")
            elif cmd == "off":
                GPIO.output(25, GPIO.LOW)
                print("off")
            elif cmd == "":
                print("Command Error")
            os.remove(path) 

except KeyboardInterrupt:
    pass

GPIO.cleanup()

2秒おきにcommand.txtの存在の有無をチェックして
ファイルが見つかったら内容を読み取り
onと書かれていたらGPIO25をHIGHにして
offと書かれていたらGPIO25をLOWにする
読み取ったらファイルを削除
という流れになってます

os.path.exists(path)がファイルの有無を判定する関数
os.remove(path) がファイルを削除する関数です

これでコマンドを対応した処理を書いていけば
ブラウザからラズパイを自在に操作できると思います

ラズパイ同士の連携

天井裏に照明やセンサーを管理するラズパイAがあり
玄関先にはカメラを持ったラズパイBがあるとします

天井裏のラズパイAが玄関のセンサーを検知したら
ラズパイBのwebにアクセスしてカメラを撮影させるといった事ができます

カメラ側は割愛しますが、ラズパイAからラズパイBにwebアクセスするプログラム例です

import requests
requests.get('http://192.168.1.20/command.php?user=username&command=camera')

requestsを使うことでwebに簡単にアクセスできます

command次第で写真を撮る枚数を指定したり、ブザーを鳴らしたりなど自由自在ですね


その他

同一LAN内からではなく、外出先からスマホで操作する場合などはポート開放をする必要があると思います
1.Apacheのサーバーポートの設定
2.ルーター側のポートとIPアドレスの関連付け(機器ごとにIPアドレスが割り当てられていて、このポートにアクセスが来た場合はLAN内のこの機器にアクセスしてくださいという設定。外部からはパソコンもラズパイも同じIPアドレスに見えている)
といった流れ


以上が大まかな流れですが、誰かの参考になれば幸いです。

次回記事を書きました(2022/11/29)

おすすめ

1件の返信

  1. 2022年11月29日

    […] 3年ほど前に書いたラズベリーパイをweb経由で遠隔操作するという記事にアクセスが多いようなのでpart2を書きました […]

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です