Rasberry Pi 3B + Blynkで実現、スマホからラズベリーパイを遠隔操作してシャットダウンする無料で簡単な方法

2018年11月30日

ラズパイってスマートフォンから操作できるの!?

簡単に思いつくのはhttpサーバーを立ててアクセスする方法です。
しかし、ローカルネットワークならまだしも、インターネットにさらすのはセキュリティ的にちょっと。。。

ということでネットで調べてみところ、素敵なサービスを発見!

Blynkというサービスを使って無料で簡単にスマホからラズベリーパイを操作できるということがわかりました。

そこで、第1弾として、ディスプレイやキーボード、タッチパネルが無い環境や、自宅のネットワークに接続できないときに、ラズパイ本体をシャットダウンできるようにしてみたいと思います!

追記

  • 2018-10-07 main.cpp の書き換え部分で、5行目のinclude文が不完全だった(ヘッダ部分が消えたいた)ので、そのままだとコンパイルエラーになってしまいます。該当箇所を修正しました。
  • 2018-06-03 システムデーモンに登録する際に、作成したシェルスクリプトでパスを通していないと起動に失敗するので、関連する部分を修正しました。

 

準備するモノ

・スマートフォン 今回はiPhone6S を使いました。
・Blynkアプリ AppStoreからインストールします。

Blynk – IoT for Arduino, RPi, Particle, ESP8266

もの凄く参考にさせていただいたサイト

ここにまとめてくださっている情報に感謝!

Blynkアカウントの作成

スマートフォンにインストールした「Blynk」を起動して、Create New Account を実行します。メールとパスワードを設定します。

最新のライブラリーをインストールする

インストール(gitを使用する)→zipファイルをダウンロードする方法を推奨

ラズパイの適当なフォルダにフォルダを作ってgit cloneします。

mkdir blynk
cd blynk
git clone https://github.com/blynkkk/blynk-library.git

blynkのlinuxフォルダに移動してmakeします。

cd blynk-library/linux
make clean all target=raspberry

※Blynk社のサイトからダウンロードしたライブラリに含まれている
README.mdのインストール方法を参考にしました。

 

インストール(zipファイルをダウンロードする)

Blynk社のサイトから、最新のライブラリをダウンロードしてラズパイにインストールします。gitでインストールした場合はここのインストールは不要です。

下の方にスクロールしていくとzipファイルが置いてあるのでこれをラズパイに落とします。

まず、適当なフォルダを作って、

[highlight_bash]$ mkdir -p ~/src/blynk
$ cd ~/src/blynk[/highlight_bash]

zipファイルをゲット
[highlight_bash]wget https://github.com/blynkkk/blynk-library/releases/download/v0.5.2/Blynk_Release_v0.5.2.zip[/highlight_bash]

展開
[highlight_bash]unzip Blynk_Release_v0.5.2.zip[/highlight_bash]

中に入ってmakeします。

[highlight_bash]$ cd ~/src/blynk/libraries/Blynk/linux/
$ make clean all target=raspberry
[/highlight_bash]

blynk という実行ファイルができれば成功です!

README.mdに一通りインストール方法が書いてあります。

 

パスが通る場所に設置する

どこからでも呼び出せるようにシンボリックリンクを作成します。

[highlight_bash]$ cd /usr/local/bin/
$ sudo ln -s /home/pi/src/blynk/libraries/Blynk/linux/blynk .[/highlight_bash]

実行ファイルを直接コピーして設置する場合はコチラ。

[highlight_bash]$ sudo cp /home/pi/src/blynk/libraries/Blynk/linux/blynk /usr/local/bin/[/highlight_bash]

 

プログラムの改造

バーチャルポートに対応したスクリプトを作成するだけで簡単に使えるようになります!(もの凄く便利、感謝!)

blynk/libraries/Blynk/linux/main.cpp を参考サイトの通りに書き換えます。

変更点は以下の通り。main.cpp.patch として保存してパッチを当てると楽です。

[highlight_bash]--- main.cpp.org 2018-06-03 23:51:00.351054533 +0900
+++ main.cpp 2018-06-03 23:52:10.450190240 +0900
@@ -25,11 +25,54 @@

#include <BlynkWidgets.h>

-BLYNK_WRITE(V1)
-{
- printf("Got a value: %s\n", param[0].asStr());
+void blynk_read_exec(int pin) {
+ char command[256] = "";
+ char buff[256] = "";
+ FILE *fp;
+ sprintf(command, "/home/pi/blynk/BLYNK_READ_V%d.sh", pin);
+ if((fp=popen(command,"r")) != NULL) {
+ if(fgets(buff, 255, fp) != NULL) strtok(buff, "\n\0");
+ }
+ pclose(fp);
+ Blynk.virtualWrite(pin, buff);
+ BLYNK_LOG("Command: %s -> %s", command, buff);
+}
+
+void blynk_write_exec(int pin, const BlynkParam& param) {
+ char command[256] = "";
+ char buff[256] = "";
+ sprintf(command, "/home/pi/blynk/BLYNK_WRITE_V%d.sh", pin);
+ for (int i=0; i<3; i++) {
+ if(! param[i].isValid()) break;
+ sprintf(buff, " %d", param[i].asInt());
+ strcat(command, buff);
+ }
+ BLYNK_LOG("Command: %s", command);
+ system(command);
}

+BLYNK_READ(V0) { blynk_read_exec(V0); }
+BLYNK_READ(V1) { blynk_read_exec(V1); }
+BLYNK_READ(V2) { blynk_read_exec(V2); }
+BLYNK_READ(V3) { blynk_read_exec(V3); }
+BLYNK_READ(V4) { blynk_read_exec(V4); }
+BLYNK_READ(V5) { blynk_read_exec(V5); }
+BLYNK_READ(V6) { blynk_read_exec(V6); }
+BLYNK_READ(V7) { blynk_read_exec(V7); }
+BLYNK_READ(V8) { blynk_read_exec(V8); }
+BLYNK_READ(V9) { blynk_read_exec(V9); }
+BLYNK_WRITE(V10) { blynk_write_exec(V10,param); }
+BLYNK_WRITE(V11) { blynk_write_exec(V11,param); }
+BLYNK_WRITE(V12) { blynk_write_exec(V12,param); }
+BLYNK_WRITE(V13) { blynk_write_exec(V13,param); }
+BLYNK_WRITE(V14) { blynk_write_exec(V14,param); }
+BLYNK_WRITE(V15) { blynk_write_exec(V15,param); }
+BLYNK_WRITE(V16) { blynk_write_exec(V16,param); }
+BLYNK_WRITE(V17) { blynk_write_exec(V17,param); }
+BLYNK_WRITE(V18) { blynk_write_exec(V18,param); }
+BLYNK_WRITE(V19) { blynk_write_exec(V19,param); }
+
+
void setup()
{
Blynk.begin(auth, serv, port);[/highlight_bash]

(追記)2018-10-07、5行目のinclude文でヘッダ部分が消えていたので修正しました。

修正したらmakeしましょう。

[highlight_bash]$ make clean all target=raspberry[/highlight_bash]

(追記)
先の手順でシンボリックリンクを作成していない場合は、できあがったblynkコマンドをパスが通る場所(/usr/local/bin/)にコピーしておきましょう。

変更点の BLYNK_READ(Vx)、BLYNK_WRITE(Vxx) で実行されるコマンドは、関数内に「“/home/pi/blynk/BLYNK_WRITE_V%d.sh"」のように記載されています。そのため、後に記載している「バーチャルポート用のスクリプト作成」では「/home/pi/blynk/」にファイルを作ってください。

 

Blynkアプリでプロジェクトを作成

アプリを起動して、プロジェクトを作成します。
名前はわかりやすいものに設定しました。

  • Project Name: RPi3-Shutdown
  • Chose Device: Raspberry Pi 3 B
  • Connection Type: WiFi

全て設定して「Create Project」を選択すると登録したメールアドレスにプロジェクト用のトークンが送られてきます。

ウィジェットの追加と設定

以下の5つのウィジェットを追加して、それぞれPINバーチャルポートを割り当てます。

  • V0 … CPU温度(グラフ)
  • V2 … ロードアベレージ(グラフ)
  • V10 … 安全装置(スライダー)
  • V11 … 再起動(ボタン)
  • V12 … シャットダウン(ボタン)

画面の何も無いところをタップするとウィジェットを選ぶことができます。設置したウィジェットをタップすると詳細設定画面が表示されますので、表示名やPIN、更新頻度(ここでは2秒おき)を設定します。

ウィジェットには分かりやすいように名前を付けておきましょう。

 

バーチャルポート用のスクリプト作成

V0, V2, V10, V11, V12 用にそれぞれ実行されるスクリプトを作ります。
参考サイトに従って5つのシェルスクリプトを用意します。

[code]cd blynk/[/code]

CPU温度取得用
BLYNK_READ_V0.sh

#!/bin/sh
data=`cat /sys/class/thermal/thermal_zone0/temp | awk '{printf($1/1000)}'`
printf "%3.1f" $data

ロードアベレージ取得用
BLYNK_READ_V2.sh

#!/bin/sh
cat /proc/loadavg | awk '{print $1*100}'

スライダーの値保存用
BLYNK_WRITE_V10.sh

#!/bin/sh
SLIDER_FILE=/tmp/V10
echo $1 > $SLIDER_FILE

再起動用
BLYNK_WRITE_V11.sh

#!/bin/sh
SLIDER_FILE=/tmp/V10
if [ "$1" = "1" ] ; then
  if [ -e $SLIDER_FILE ] ; then
    num=`cat $SLIDER_FILE`
    if [ $num -eq 255 ] ; then
      rm $SLIDER_FILE
      shutdown -r now
    fi
  fi
fi

シャットダウン用
BLYNK_WRITE_V12.sh

#!/bin/sh
SLIDER_FILE=/tmp/V10
if [ "$1" = "1" ] ; then
  if [ -e $SLIDER_FILE ] ; then
    num=`cat $SLIDER_FILE`
    if [ $num -eq 255 ] ; then
      rm $SLIDER_FILE
      shutdown -h now
    fi
  fi
fi

ラズパイでエージェントプログラムを起動

blynkを起動します。メールで送られてきたtokenを入れてください。

[highlight_bash]$ sudo blynk –token=送られてきたトークン[/highlight_bash]

※1)shutdown はsudo で実行しないといけないので、blynkを起動するときに、sudoで起動します。
※2)blynkを実行する時にパスが通っていないと実行に失敗します。起動に失敗する場合にはコマンドを設置した場所を絶対パスで指定(/usr/local/bin/blynk)として実行してみてください。

以下のように「Ready」が出たら準備完了!

[highlight_bash][0]
___ __ __
/ _ )/ /_ _____ / /__
/ _ / / // / _ \/ '_/
/____/_/\_, /_//_/_/\_\
/___/ v0.5.2 on Linux

[1] Connecting to blynk-cloud.com:80
[257] Ready (ping: 91ms).[/highlight_bash]

Blynkアプリでプロジェクトを実行

三角ボタンを押してプロジェクトを実行します。
上手くいけば、CPU温度、ロードアベレージが表示されます。

スライダー(安全装置)を最大(255)に設定して、再起動 or シャットダウン ボタンを押します(タップしただけでは反応しないようになっているのでちょっと長めに押します)。

無事ラズパイが再起動/シャットダウンしたら完了です!

※再起動したら blynk は停止してしまうので、適当に起動するように設定しておきましょう。systemdに登録して自動起動する方法を最後の方に記載しています。

 

ラズパイでのBlynk実行用のシェルを作る

プロジェクトごとにトークンが生成されるので、分かり易いようにシェルスクリプトにまとめておくと便利です。

[highlight_bash]$ mkdir ~/scripts
$ cd ~/scripts
$ vim start-blynk-shutdown.sh[/highlight_bash]

中身はこんな感じに。

#!/bin/sh
sudo /usr/local/bin/blynk --token=XXXXXXXXXX

XXXX…にはプロジェクトで作成したトークンを設定します。

(修正)念のためblynkコマンドを絶対パスで指定します。

実行するときは次のようにします。
[code]sh start-blynk-shutdown.sh[/code]

このあと使うのでstart-blynk-shutdown.shには実行権をつけておいてください。
[code]chmod +x start-blynk-shutdown.sh[/code]

 

エージェントプログラムをsystemdに登録

サービスを自動的に起動するために、systemdに登録します。

適当なフォルダ(ここでは、/home/pi/services/ とします)に、blynkapp.serviceという設定ファイルを作ります。

中身はこんな感じで。

[Unit]
Description=BlynkApp Shutdown
After=syslog.target

[Service]
Type=simple
ExecStart=/home/pi/scripts/start-blynk-shutdown.sh
TimeoutStopSec=5
StandardOutput=null

[Install]
WantedBy = multi-user.target

作った設定ファイルを/etc/systemd/system/にコピーして登録します。
[highlight_bash]sudo cp blynkapp.service /etc/systemd/system/[/highlight_bash]

サービスを起動して状態を確認してみましょう。

サービスの起動:
[highlight_bash]sudo systemctl start blynkapp[/highlight_bash]

サービスの停止:
[highlight_bash]sudo systemctl stop blynkapp[/highlight_bash]

ステータスの確認:

[highlight_bash]sudo systemctl status blynkapp[/highlight_bash]

●blynkapp.service - BlynkApp AlarmClock
Loaded: loaded (/etc/systemd/system/blynkapp.service; disabled)
Active: inactive (dead)
…

サービスの起動・停止が確認できたら、自動起動を設定します。

[highlight_bash]$ sudo systemctl enable blynkapp[/highlight_bash]

Created symlink from /etc/systemd/system/multi-user.target.wants/blynkapp.service to /etc/systemd/system/blynkapp.service.

サービスの自動起動をやめたい場合は以下のコマンドを実行します。

[highlight_bash]sudo systemctl disable blynkapp[/highlight_bash]

参考: Raspberry Piでプログラムを自動起動する5種類の方法を比較・解説

まとめ: スマートフォンからRaspberry Piを遠隔操作するにはBlynkを使うのがオススメ!

今回は、スマホからラズベリーパイを遠隔操作するために、Blynkというサービスを使う方法を紹介しました。

Blynkのウィジェットには他にもたくさんの種類があるので、色々と作って紹介したいと思います。

Raspberry Pi

Posted by まーく