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