Rasberry Pi 3B + Blynkで実現、スマホからラズベリーパイを遠隔操作してシャットダウンする無料で簡単な方法
ラズパイってスマートフォンから操作できるの!?
簡単に思いつくのはhttpサーバーを立ててアクセスする方法です。
しかし、ローカルネットワークならまだしも、インターネットにさらすのはセキュリティ的にちょっと。。。
ということでネットで調べてみところ、素敵なサービスを発見!
Blynkというサービスを使って無料で簡単にスマホからラズベリーパイを操作できるということがわかりました。
そこで、第1弾として、ディスプレイやキーボード、タッチパネルが無い環境や、自宅のネットワークに接続できないときに、ラズパイ本体をシャットダウンできるようにしてみたいと思います!
追記
- 2018-10-07 main.cpp の書き換え部分で、5行目のinclude文が不完全だった(ヘッダ部分が消えたいた)ので、そのままだとコンパイルエラーになってしまいます。該当箇所を修正しました。
- 2018-06-03 システムデーモンに登録する際に、作成したシェルスクリプトでパスを通していないと起動に失敗するので、関連する部分を修正しました。
準備するモノ
・スマートフォン 今回はiPhone6S を使いました。
・Blynkアプリ AppStoreからインストールします。
もの凄く参考にさせていただいたサイト
ここにまとめてくださっている情報に感謝!
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のウィジェットには他にもたくさんの種類があるので、色々と作って紹介したいと思います。
ディスカッション
コメント一覧
電子工作を楽しんでいる者です。
ちょっと長くなってしまいますが質問させてください。
当方BlynkでラズパイLED点灯と、それからラズパイ再起動をさせたくてググって居たところ、非常に分かり易い貴殿サイトに辿りつきました。
しかしながら、このサイトの通りやってみても、どういう訳か、思いどおりの結果がでません。
具体的に言うと、Blynkボタンに割り振ったスライダーボタン利用による再起動が、全く反応しません。
どこがわるいのか、色々試して見たのですが、それでも分からず、今回、こうして質問させて頂こうと思った次第です。
早速なんですが、以下の3点について教えて頂きたいです。
どうぞよろしくお願いします。
①blynk-library/linux/main.cppを以下の如く編集しました。
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 $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ディレクトリに、それぞれ保存しました。
ここまでやって、Blynkに該当のスライダーとボタンを、それぞれ設置し、スライダーを256まで動かし、再起動ボタンを押しても、まったく反応しないのです。
C言語やphpは、多少、やったことがあるのですが、今回のようなスクリプトは初めてで、見よう見まねでやっています。
それぞれ半角スペースを入れると入れないとか、また段落をズラすとかずらさないとか、その辺のこまかい事とかも、関係してくるのでしょうか?
③それから、ちょっと余談になってしまいますが、本サイトで、
『パスが通る場所に設置する どこからでも呼び出せるようにシンボリックリンクを作成します。』
とありますが、
$ cd /usr/local/bin/
$ sudo ln -s /home/pi/src/blynk/libraries/Blynk/linux/blynk .
とbinディレクトリにシンボリックリンクを作成していますが、なぜ、分かりやすいように、ルートディレクトリとかに作成しないのですか?
なぜ、わざわざbinと言う深層まで入っていってリンクを作成しているのですか?
以上、非常にながくなりましたが、後学の事も含め、三点について、是非、ご教示頂きたいです。
どうぞ、よろしくお願い致します。
コメント返し、お待ち申し上げています。
以上です。
お役に立てて光栄です!
ご質問の件、2番目が消えているようですが、3番目の上の段落と解釈してコメントします。
① main.cppの編集部分
1) 後半の「BLYNK_READ(V0) { blynk_read_exec(V0); }」の部分(36〜55行目)も必要です。READ/WRITEそれぞれ使用するV??が無いと動かないはずです。
2) 再起動スクリプト「BLYNK_WRITE_V11.sh」の中身
blynkを一般ユーザー(pi)で実行していると shutdownコマンドが実行されないと思います。blynkを実行するときに「sudo」をつけるか、スクリプトの再起動部分を「sudo shutdown -r now」にしてみると良いかもしれません。
3) 値の確認
スライダーを動かして、cat /tmp/V10 を実行すると書き込まれた値が見えます。正しく動いていればスライダーの状態に応じて値が変わるはずです。
② シェルスクリプトの書き方
簡単に言うとコマンドとして打ち込んでいるものをまとめたものです。
1) それぞれの半角スペース
大事です。コマンドラインではスペースで区切られるので、間を詰めると正しく動きません。例えば”[]”はtestコマンドの略式で、[の後と、]の前には必ず半角スペースが必要です。
2) 段落をずらすなど
インデントとしてのスペース・タブは気にする必要はありません。pythonだと厳密に扱う必要がありますが、シェルスクリプト(bash)であればインデントは無くてもエラーにはなりません。
なお、シェルスクリプトは単体でも実行できるので、
sh BLYNK_WRITE_V11.sh
とすれば実行結果を確認できます(シャットダウンするのでご注意を)
ということで、個別に実行して問題点を切り分けてみてください。
③ なぜ /usr/local/bin か。
Windowsユーザーからすると、不思議に思われるかもしれませんね。複数ユーザーで安全・便利に使うには一定のルールが必要です。以下、私の理解なのでご参考まで。
1) ディレクトリには意味があります。
一般的に「bin/」にはプログラムの実行ファイル(Binary code)を置きます。この辺りが参考になると思います。
https://qiita.com/totzyuta/items/84d610f56129a186f0c5
他のユーザーも使えるようにするには、置き場所を決めると便利です。なので、みんなが使う大事な・基本的なコマンドは「/bin」にあります。
2) アクセス権
コマンドの使い方次第ではシステムを破壊したり、データを消失させてしまいます。個人のLinuxなら自分が泣けばすみますが、サーバーなど多数の人(アカウント)が動くシステムでそれが起きたら大変です。誰かが突然シャットダウンしたら、保存していないデータが吹き飛びます!
誰かがこっそり危険なコマンドを設置していたら、、、。
3) ファイルシステムの制約
「/」は最上位の大事な所で、普通のユーザーはファイルを置く権限がありません。上記の通り、アクセス権を適切に扱う必要があるためです。
Windowsの場合、FAT16だとルートディレクトリには「512個」しかファイルを置けません。
ここにじゃんじゃんファイルを置いたらすぐ一杯になります。
https://freesoft.tvbok.com/windows_beginner/number_of_files_in_folder.html
たとえ話をするとしたら、
自宅(/home/pi/)の使い方は所有者(pi)の自由ですが、公道とか公園(/)に好き放題に物(ファイル)を置いたり、小屋(ディレクトリ)を作ったりするのは良くない、といった感じでしょうか。
Windowsだと、c:¥にいきなりフォルダを作ってファイルを置くことができるので、、、美しくないですw
そういう意味では、個人でしか使わない実行ファイルは自分のホームの下(/home/pi/bin)に置くのが良いかもしれませんね。
ざっとこんな感じですが、疑問が解決されていましたら幸いです。
また何かわからなければお気軽にコメントください。
プラグインの影響でコメントできなくなっていました。
キャッシュが残っているとうまく表示されないので、キャッシュクリア試してみてください。
ご対応のほう、ありがとうございました!
また、コメントできて嬉しいです。
さて、早速なんですが、以下の件、引き続き、どうぞよろしくお願いいたします。
長くなってしまうので、いくつかに分けてコメント投稿させて頂きたいと思います。
①大変申し訳ないのですが、もう一度、main.cppの全文を記載させて頂きます。
前回は、途中が切れてしまっていたみたいで申し訳ありませんでした。
【 以下、コード全文 】
/**
* @file main.cpp
* @author Volodymyr Shymanskyy
* @license This project is released under the MIT License (MIT)
* @copyright Copyright (c) 2015 Volodymyr Shymanskyy
* @date Mar 2015
* @brief
*/
//#define BLYNK_DEBUG
#define BLYNK_PRINT stdout
#ifdef RASPBERRY
#include
#else
#include
#endif
#include
#include
static BlynkTransportSocket _blynkTransport;
BlynkSocket Blynk(_blynkTransport);
static const char *auth, *serv;
static uint16_t port;
#include
BlynkTimer tmr;
#(ここから差し替え部分)
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);
tmr.setInterval(1000, [](){
Blynk.virtualWrite(V0, BlynkMillis()/1000);
});
}
void loop()
{
Blynk.run();
tmr.run();
}
int main(int argc, char* argv[])
{
parse_options(argc, argv, auth, serv, port);
setup();
while(true) {
loop();
}
return 0;
}
上記、編集後、sudo make clean all target=raspberryすると、下記の様な内容が表示されます。
これは、正しくmakeされているのでしょうか?
それとも、何か違って居るのでしょうか?
【 以下、表示内容 】
pi@raspberrypi:~/blynk/libraries/Blynk/linux $ sudo make clean all target=raspberry
rm main.o ../src/utility/BlynkDebug.o ../src/utility/BlynkHandlers.o ../src/utility/BlynkTimer.o blynk
rm: 'main.o' を削除できません: そのようなファイルやディレクトリはありません
rm: '../src/utility/BlynkDebug.o' を削除できません: そのようなファイルやディレクトリはありま せん
rm: '../src/utility/BlynkHandlers.o' を削除できません: そのようなファイルやディレクトリはありません
rm: '../src/utility/BlynkTimer.o' を削除できません: そのようなファイルやディレクトリはありま せん
rm: 'blynk' を削除できません: そのようなファイルやディレクトリはありません
Makefile:64: ターゲット 'clean' のレシピで失敗しました
make: [clean] エラー 1 (無視されました)
g++ -I ../src/ -I ./ -DLINUX -c -O3 -w -DRASPBERRY main.cpp -o main.o
main.cpp:30:2: error: invalid preprocessing directive #
錚 ーッーァー蠏オーウキヤー、コ鳥ィ膏
^
main.cpp:32:2: error: invalid preprocessing directive #
磽ーハウク褐オ鉧ソ
^
main.cpp:33:2: error: invalid preprocessing directive #BLYNK_WRITE
#BLYNK_WRITE(V1)
^~~~~~~~~~~
main.cpp:34:2: error: invalid preprocessing directive #{
#{
^
main.cpp:35:6: error: invalid preprocessing directive #printf
# printf("Got a value: %s\n", param[0].asStr());
^~~~~~
main.cpp:36:2: error: invalid preprocessing directive #}
#}
^
main.cpp:38:2: error: invalid preprocessing directive #
筍篁ヤ
吾・潟若 にそっくりそのまま差し替え!
^
main.cpp:85:2: error: invalid preprocessing directive #(
#(差し替え部分、ここまで)
^
Makefile:70: ターゲット 'main.o' のレシピで失敗しました
make: *** [main.o] エラー 1
pi@raspberrypi:~/blynk/libraries/Blynk/linux $
(次のコメントに続きます)
① 「main.cpp」の修正
make時のerror「invalid preprocessing directive #」を見て原因がわかりました。
1) include文でヘッダ部分が抜け落ちています。このコメント欄同様に、Webに載せた際に<>の部分が許可されていないタグとして除外されたのだと思います。
修正版を本文に反映しましたので確認して下さい。
2) コメントの記載を間違えている。
「#(差し替え部分、ここまで)」と書いていますが、cppはC言語やPHPと同様に「//」や「/**/」を使わないとエラーになります。
ということで、main.cppファイルに文法ミスがあり、makeで失敗しているので修正内容が反映された実行ファイルが作られていないという状態のようです。
まーくさま
お世話になります。また、ご親切に色々と、ほんとうにありがとうございます!
さて、『main.cpp』の編集、及び『sudo make clean all target=raspberry』について、最終的に上手く行ったようです。
以下の内容が表示され入力画面にもどりました。
【 以下表示されたコード 】
pi@Scspy01:~/blynk/libraries/Blynk/linux $ sudo make clean all target=raspberry
rm main.o ../src/utility/BlynkDebug.o ../src/utility/BlynkHandlers.o ../src/utility/BlynkTimer.o blynk
g++ -I ../src/ -I ./ -DLINUX -c -O3 -w -DRASPBERRY main.cpp -o main.o
g++ -I ../src/ -I ./ -DLINUX -c -O3 -w -DRASPBERRY ../src/utility/BlynkDebug.cpp -o ../src/utility/BlynkDebug.o
g++ -I ../src/ -I ./ -DLINUX -c -O3 -w -DRASPBERRY ../src/utility/BlynkHandlers.cpp -o ../src/utility/BlynkHandlers.o
g++ -I ../src/ -I ./ -DLINUX -c -O3 -w -DRASPBERRY ../src/utility/BlynkTimer.cpp -o ../src/utility/BlynkTimer.o
g++ main.o ../src/utility/BlynkDebug.o ../src/utility/BlynkHandlers.o ../src/utility/BlynkTimer.o -lrt -lpthread -s -lwiringPi -o blynk
pi@Scspy01:~/blynk/libraries/Blynk/linux $
内容的には、エラーが表示されてないように思いますが、何か問題等ありますでしょうか?
無事に解決したようで何よりです^^
エラー出ずに終わっているので問題無いと思いますよ(^o^)
楽しいラズパイ生活を!
続きです。
②まーくさんのコメントの①の3)を入力すると、
pi@raspberrypi:~ $ cat /tmp/V10
cat: /tmp/V10: そのようなファイルやディレクトリはありません
となってしまいますが、これは、何が間違っているのでしょうか?
③BLINK_WRITE_V10.shとBLINK_WRITE_V11.shを、それぞれblynkディレクトリに保存しました。
pi@raspberrypi:~/blynk $ ls
BLINK_WRITE_V10.sh BLINK_WRITE_V11.sh Blynk_Release_v0.5.4.zip libraries tools
そして、このあと、単体で再起動のスクリプトを実行してみました。
pi@raspberrypi:~ $ sh BLINK_WRITE_V11.sh
sh: 0: Can’t open BLINK_WRITE_V11.sh
すると、上記の様に表示され、再起動が行われませんでした。
これは、なぜ、実行されないのでしょうか?
それとも、私が作成してそれぞれV10とV11のコードの内容が行けないのでしょうか?
それぞれ私のコード内容を以下に記します。
(と言っても、まーくさんのサイトのものを、そのまま、そっくりコピペさせてもらっただけですが(^_^;))
【 BLINK_WRITE_V10.sh 】
#!/bin/sh
SLIDER_FILE=/tmp/V10
echo $1 > $SLIDER_FILE
【 BLINK_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
sudo shutdown -r now
fi
fi
fi
それから、後学の為に『tmp』ディレクトリについて、分かり易く説明して頂けると大変嬉しいです。
(前回のbinの説明の仕方が、例も含めて、分かり易すぎて、感銘を受けてしまいました。あのような具合に、今回のtmpの方も、ご説明頂けないでしょうか(^_^;))
② 「/tmp/v10」が無い
①で書いたとおり、makeに失敗しているので初期状態のblynkのままであるため、スクリプトが実行されず、/tmp/v10 が作成されていないのが原因です。
③ スクリプト単体で実行できない
スクリプトと同じディレクトリで実行していない(パスの指定を間違えている)のが原因です。
コメントを見ると、スクリプトを「~/blynk」というディレクトリに置いてますが、実行時には「~/」つまり、ホームディレクトリで実行しています。
以下のように場所(アドレス)を指定して実行してみてください。
sh ~/blynk/BLINK_WRITE_V11.sh
※「カレントディレクトリ」やパス(絶対パス/相対パス)の理解を深めると良いと思います。
③-2 「/tmp」とは何か
テンポラリ領域(一時的なファイルの作成場所)です。
プログラムの実行中に、なんらかの情報を一時的にファイルとして置いておきたい、という場合によく使います。
プログラムの実行が終わったときに消し忘れていても、システム再起動時に消えて無くなりますので、いつのまにか不要なファイルが大量に作られていた、なんてことを防げます。
SDカードを使っている場合は「/tmp」をRAMディスク上に作ってあげると寿命が延ばせますよ^^
https://iot-plus.net/make/raspi/extend-sdcard-lifetime-5plus1/#toc_id_2_4
うまい例えは、、、難しいですねw
「駐輪場」と考えると良いかもです。自宅の庭には、自転車をいつまでとめても、何台止めても自由です。「/tmp」はコンビニや駅の駐車場で、立ち寄るときだけ駐車するように「一時的に使う場所」になります。
※自転車を長期間放置していると撤去されてしまうように。
②の補足
問題の発生場所がスクリプトにあるのか、それ以前(blynk)にあるのか切り分けるために、BLINK_WRITE_V11.sh を単体で実行しています。
「BLINK_WRITE_V11.sh」内で参照している「/tmp/v10」は、「BLYNK_WRITE_V10.sh」が実行されると作成されます。
ということは、
/tmp/v10が無い → BLYNK_WRITE_V10.sh が実行されていない → blynk本体に問題があるかも。
※実際にmain.cppの記述ミスを発見。
BLINK_WRITE_V11.sh の動作を確認するだけであれば、とりあえず手動で /tmp/v10を作成して実行すれば確認できます。
echo “255” > /tmp/v10
sh BLINK_WRITE_V11.sh
問題無ければ再起動するはずです。
まーく様
いつもほんとにお世話になっております。
まーくさんのおかげで、日に日に知識が蓄えられているのを、ヒシヒシと感じます。
今まで分からなかった事が、親切なまーくさんに、非常に分かり易く教えて頂いてます。
ありがたいです。
分かってくると非常に面白いです!
ほんとうの意味で、楽しいRaspberry Piライフを送らせていただいています!
感謝、感謝です!
さて、また、教えて頂きたく、毎回、お手数をお掛けして申し訳ありませんが、どうぞよろしくお願い致します。
m(_ _)m
(質問事項、今回は全部で4つです)
①『main.cpp』を正常に『sudo make clean all target=raspberry』した後、スマホ側のBlynkアプリにてスライダーを操作しても『/tmp/V10』が作成されません。
何が考えられるでしょうか?
また、教えて頂いた様に、手動にて『echo “255” >> /tmp/V10』とやり、その次に『sh BLINK_WRITE_V11.sh』を実行させてもRaspberry Piが再起動しません。
これは何が原因と考えられますでしょうか?
(スマホ側の設定の問題でしょうか?ちなみに今回試作で私のスマホには押しボタンスイッチとスライダーを設置させていて、押しボタンでRaspberry Piに繋いだLEDを点灯させる事は出来る状態です)
【 以下、V10を手動作成しV11(再起動)を実行したコードです 】
pi@Scspy01:~ $ ls /tmp
systemd-private-48beb23309bb460dab50f6f6bfd5b258-systemd-timesyncd.service-z9NmQ1
(↑この時点でV10は存在しない事を確認。あと、このコードはBlynk自動起動関係の表示でしょうか?)
pi@Scspy01:~ $ echo “255” > /tmp/V10(←手動で255データが入ったV10Fileを作成)
pi@Scspy01:~ $ ls /tmp
V10 systemd-private-48beb23309bb460dab50f6f6bfd5b258-systemd-timesyncd.service-z9NmQ1
(↑V10が作成できた事を確認!)
pi@Scspy01:~ $ cat /tmp/V10
255(←確認OK!)
pi@Scspy01:~ $ cd blynk(←blynkディレクトリに移動)
pi@Scspy01:~/blynk $ sh BLINK_WRITE_V11.sh(←再起動スクリプト実行)
pi@Scspy01:~/blynk $ cat /tmp/V10(←実行後、V10が削除されている事を確認)
255(←まだV10Fileが存在している。????V11においては255データを削除したあと再起動させるプログラムのハズ)
②ちなみに上記コードの途中にも注釈しましたが、tmpディレクトリ内の『systemd-private・・・』と続いている、この表示は何でしょうか?
まーくさんの同じページで『systemd』を利用したBlynk自動起動のやり方も紹介して下さっていて、これも私は登録して利用しています。
ですから、現在、私のRaspberry PiはBlynk自動起動が、稼働中の状態です。
もしかしたら、それに関する情報として、このtmpディレクトリの中に表示されているのでしょうか?
③『BLINK_WRITE_V11.sh』が正しく実行されないのは、コードの書き方が間違っていたりするのでしょうか?
(以下のカッコ1,2の部分が気になるところです。後学の事も含めて教えて下さいませ)
#!/bin/sh
SLIDER_FILE=/tmp/V10
if [ “$1” = “1” ] ; then ←(1)このif文は何についての分岐ですか?”$1″に”1″を入力?・・・ですか?
if [ -e $SLIDER_FILE ] ; then ←(2)”if”と”[“、それから”]”の閉じカッコと”;”のセミコロンの間、更に”then”との間も、それぞれに半角スペースが必要ですか?
num=`cat $SLIDER_FILE`
if [ $num -eq 255 ] ; then
rm $SLIDER_FILE
sudo shutdown -r now
fi
fi
fi
④あともうひとつ、linuxのコマンドラインに、いつも入力しているこれらのコードは、いったい何言語になるのでしょうか?
C言語ではないような気がしますが(^_^;)それともlinux特有の言語とかですか?
以上です。
重ね重ね、どうぞよろしくお願いいたします。
m(_ _)m
② /tmpディレクトリ内のファイル
他の稼働しているサービス(systemd-timesyncd)が利用しているものだと思われます。特に触れずにそっとしておきましょう。
わからない時のヒント:
意味がありそうな部分、ここでは「systemd-timesyncd」をググッてみましょう。色々わかると思いますよ(^_-)
③シェルスクリプトの書き方
実行権を与えたら無事に動いたということで解決でしょうか?
(1)前のコメントで書いたとおり、[]はtestコマンドの省略形で、条件を書くことになっています。この中では様々な比較条件などを書くことができます。
調べ方のヒント:
「if bash」とか「シェルスクリプト 条件分岐」などでググッてみてください。
それから「$1」が何か?という点に関しては、「シェルスクリプト $1」とか、「シェルスクリプト 引数」で調べてみてください。
$0, $1や、$# が何かわかると思います!
(2)そこは特にスペースは要らないです。また、あっても問題無いです。
簡単なスクリプトを書いて試してみるのが一番です。
#!/bin/bash
if [ $1 = “1” ]; then
echo “one”
fi
これをtest.sh として保存して、
sh test.sh 1
と実行してみます。
これを編集して、;とthenの間のスペースを詰めたり、もっとスペースを入れたりして何度か試してみると動きがわかると思います^^
④ Linuxのコマンドラインに入力しているもの。
それは、「コマンド」です!
実際にはターミナルを開くと「シェル」というプログラムが起動して、キーボードなどからの入力を受け付けるようになり、入力されたコマンドを逐次解釈して実行します。
※シェルにはいくつもの種類(CSH、TCSH、BASH、ZSH、etc…)がありますが、基本的にはbashが動いています。
シェルスクリプトは、シェルに与えるコマンドをまとめて記載したもの(スクリプト)になります。インタプリタなので、書かれたコマンドが順次実行されていきます。そして、実効速度が速い!
ようこそ、楽しいシェルスクリプトの世界へ(^o^)!
まーく様
ご回答頂き、ありがとうございました!
ラズパイに興味を持ち、Linuxを知り、まだ勉強を始めて間もない私です。
ですが、ここに来て、一気に知識が増え、また、様々な疑問が解け、目の前がパッと開けた感じがしています。
今回も、色々とご教示頂き、更に、様々なヒントを頂きありがとうございます!
まーくさんのブログは、私にとって、非常に興味深いコンテンツが沢山あるので、是非、次回、コメントさせて頂いた時には、その時は、また、どうぞよろしくお願い致します!
今回は、ほんとうに助かりました!
やりたかったことを実現させて頂き、更に、沢山の知識をご教示頂き、更に更に、これからの勉強のヒントも頂く事が出来ました!
まーくさんがしてくれた事は、ほんとに感謝の一言に尽きます。
ほんとうにありがとうございました!
あともう一つだけ質問させて欲しいです。
sudo make clean all target=raspberryというのは、何をやっているのでしょうか?
cleanだから、linuxディレクトリの中を全消去していると言う事だったりするのでしょうか?
また、target=raspberryとは、一体、どういういみなのでしょうか?
targetはlinuxディレクトリではないのですか?
とんちんかんな質問をしている可能性もありますが、ご説明して頂けると、非常に嬉しいです。
いろいろとお手数お掛けしもうしわけありませんが、どうぞよろしくお願い致します。
④ sudo make clean all target=raspberry
SuperUser権限で、linuxディレクトリ内の生成物(オブジェクトファイルや実行ファイル)を全消去、その後ソースをビルドしています。※targetについては後述。
1つずつ分解してみます。
1) sudo
SuperUser、一般的にはルート権限を持ったユーザーとして後ろに続くコマンドを実行するというコマンドです。
ユーザーディレクトリで実行するだけであればsudo無しでも問題無いと思います。
2) make
Makefileを使ったmakeの仕組みです。makeはググると詳しい説明が出てきますが、全部理解するのは大変(私もそこまで詳しくない)なので、ザックリと。
main.cppと同じディレクトリに「Makefile」があります。ここに書かれたルールを使って、「make XXXX」とすることで簡単にソースファイルをコンパイルして実行ファイルを作ったり(make、make all)、生成物を削除してきれいにしたり(make clean)できます。
ここには含まれていませんが「make install」って良く見かけませんか?
1つずつ
make clean
make all
とすることもできますが、以下のようにまとめて指定する事もできます。
make clean all
※念のため古い生成物(オブジェクトファイルや実行ファイル)を消すために明示的にcleanを入れています。
Makefileを見ると、cleanの所には「rm XXXX」という風に削除のコマンドが記載されています。
3) target=raspberry
対象とするハードウェアを指定しています。
Linuxは様々なハードウェアで動かす事ができるOSですが、ハードウェアに依存したライブラリが必要な場合があります。
上記のMakefileに書いてあるように、ラズベリーパイのGPIO制御に使用する「wiringPi」のライブラリを指定したりしています。
他のプログラムではインストール先としてtargetを指定する場合もありますが、全ては「Makefile」にどのように書いてあるか次第です。
ご参考になりましたら幸いです(^o^)
まーく様
すいません、一つ前の質問において、下記表示が間違っていました。
V10とV11のスクリプトが動かない原因がこれだと思ったので、修正してから再起動もしてみたのですが、やっぱりダメでした。
引き続き、どうぞよろしくお願い致します。
BLINK_WRITE_V10.sh ⇒ BLYNK_WRITE_V10.sh
(↑BLYNKのスペルミス、V11も同様)
まーく様
すいません、先にお送りした質問(①~④)のうち①については自己解決する事ができました!
①の原因については単純な事で、V10、V11スクリプト共に、実行権を与えてなかった為でした。
(これじゃあ動いてくれないの当たり前だよなと思いました)
それぞれに
『pi@Scspy01:~/blynk $ sudo chmod +x BLYNK_WRITE_V10(V11).sh』
と実施しました所、あっさり動いてくれました!
そして、この時点で、スマホのBlynkアプリから、ラズパイLチカ&再起動が出来る様にもなりました!
すごく嬉しいです!
ほんとにありがとうございました!
と言う事で、②、③、④について、すみませんが、事後の為に教えていただけると幸いです!
引き続き、どうぞよろしくお願い致します。
以上です!
自己解決おめでとうございます(^o^)
実行権、忘れがちですねw
2〜4はそのコメントの所に返信しますね。
まーくさんへ
以前、お世話になりましたmihomihokurisuです。
その節は、ご親切に、どうもありがとうございました!
まーくさんのおかげで、BlynkからRaspberry PiでLチカしたり、シャットダウンさせる事が出来る様になり、また、systemdを使った自動起動も出来る様になりました。
総じて、知識も増やすことができ、大変、感謝しております。
ほんとうにどうもありがとうございました!
さて、今回、また、コメントさせて頂いたのは、昨日、Raspberry Piに固定IPアドレス設定しましたところ、Blynkが接続しなくなってしまいました。
これは、なにが原因なのでしょうか?
systemd status ○○○と、サービスファイルを確認したところ、runningの表示がされていて、自動起動はしている様な感じです。
しかし、スマホの方のBlynkは、ディスコネクトの状態で、当然ながらスマホの方からRaspberry Piを操作する事ができませんし、シャットダウンさせる事もできません。
これから、固定IPアドレスsim+ドングルを一緒にして、Raspberry Piを、外に設置したIOT電子工作をしてみたいのですが、のっけから躓いています。
最初に家の中のLANにて、固定IPアドレスに設定してもRaspberry Piを、スマホのBlynkで、いままでの様に操作したいです。
それが出来たら、次に、先程も、お話しさせて頂いた様に、固定IPアドレスsim+ドングルで、外にRaspberry Piを設置して、それを操作したいです。
この方法について、ご教示頂きたいです。
いろいろとググったりして調べてみたのですが、なかなか解決に至らなくて、まーくさんにお力添えが願いないかと、コメントさせて頂きました。
方法、もしくは、なにかヒントとなるような情報を頂けると幸いです。
どうぞ、よろしくお願い致しますm(_ _)m
まーくさんへ
すいません、説明するのを忘れて居ました。
IPアドレス固定については、Raspberry Pi側の設定は、以下の様に設定しました。
$ nano /etc/dhcpcd.conf
一番最下部に以下のコードを追加しました。
interface wlan0
static ip_address=192.168.1.111/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1
以上です。
mihomihokurisuさん、
おお、凄い成長っぷりにビックリです(゚Д゚) 楽しそうで何よりです!
さて、ご質問の件ですが、ご自宅のLAN環境がどうなっているか気になる所です。
まず、インターネットに通じているか確認するため、ラズパイにログインして以下のコマンドを打ってみてください。
ping -c 5 www.yahoo.co.jp
それで、応答があり最後の方で「0% packet loss」と書いてあればインターネットに通じています。
もしこれがダメならばインターネットに接続できていないのが原因です。
これで応答があったら別の可能性を探る必要があります。
まーくさん
早速のご連絡、ほんとにありがとうございます!
ここまでこれたのも、ひとえにまーくさんの、適切なアドバイスのおかげです!
重ね重ね、ありがとうございます!
さて、ご教示頂いた内容にて、pingを打ってみましたところ、loss 0%と表示されました。
インターネットには繋がっている様です。
しかし、やっぱりスマホの方のBlynkは、ディスコネクトの状態です。
これを、/etc/dhcpcd.confファイルを、固定IPアドレスコード部分を、すべてコメントアウトして、アドレス自動割り付けに戻すと、また普通にLチカが出来る様になります。
ちなみに、IP固定状態で、単独コードでBlynk起動させてみました所、
【 Command 】
$ sudo /home/pi/blynk/libraries/Blynk/linux/blynk –token=○○○
以下の様なアウトプットになりました。
【 Output 】
pi@raspberrypi:~ $ sudo /home/pi/blynk/libraries/Blynk/linux/blynk –token=○○○
[0]
___ __ __
/ _ )/ /_ _____ / /__
/ _ / / // / _ \/ ‘_/
/____/_/\_, /_//_/_/\_\
/___/ v0.5.4 on Linux
[6] Connecting to blynk-cloud.com:80
[130024] Can’t connect to blynk-cloud.com
[130034] Login timeout
[130034] Connecting to blynk-cloud.com:80
[263143] Can’t connect to blynk-cloud.com
[263153] Login timeout
[263154] Connecting to blynk-cloud.com:80
[396263] Can’t connect to blynk-cloud.com
[396274] Login timeout
[396274] Connecting to blynk-cloud.com:80
[529385] Can’t connect to blynk-cloud.com
[529395] Login timeout
[529395] Connecting to blynk-cloud.com:80
[662506] Can’t connect to blynk-cloud.com
[662516] Login timeout
[662516] Connecting to blynk-cloud.com:80
[795626] Can’t connect to blynk-cloud.com
[795637] Login timeout
[795637] Connecting to blynk-cloud.com:80
[928747] Can’t connect to blynk-cloud.com
[928757] Login timeout
[928757] Connecting to blynk-cloud.com:80・・・
で、やっぱりディスコネクトで、Lチカする事が出来ませんでした(泣)
お手数を掛けさせてしまって、大変にもうしわけありませんが、引き続き、なんでも結構ですので、解決へ向けたヒントなどありましたら、ご教示下さいますと嬉しいです。
どうぞよろしくお願い致します。
mihomihokurisuさん、
うーむ、、、謎ですね。インターネットに接続できているけれど、blynkサーバーに接続できていない状況。。。
固定IPの状態で、以下のコマンドを打ってIPアドレスが表示されますか?
host blynk-cloud.com
同様にこちらで応答ありますか?
ping -c 5 blynk-cloud.com
まーくさん、ご連絡ありがとうございました。また、私からの返事が遅くなり、大変に申し訳ありません。
まーくさんのアドバイス通り、やってみましたところ、下記の様な結果になりました。
①
【 Command 】
pi@Scspy01:~ $ host blynk-cloud.com
【 Output 】
blynk-cloud.com has address 188.166.206.43
②
【 Command 】
pi@Scspy01:~ $ ping -c 4 blynk-cloud.com
【 Output 】
PING blynk-cloud.com (188.166.206.43) 56(84) bytes of data.
64 bytes from 188.166.206.43 (188.166.206.43): icmp_seq=1 ttl=51 time=116 ms
64 bytes from 188.166.206.43 (188.166.206.43): icmp_seq=2 ttl=51 time=118 ms
64 bytes from 188.166.206.43 (188.166.206.43): icmp_seq=3 ttl=51 time=100 ms
64 bytes from 188.166.206.43 (188.166.206.43): icmp_seq=4 ttl=51 time=98.6 ms
— blynk-cloud.com ping statistics —
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 98.625/108.535/118.486/9.149 ms
①②ともに固定IPアドレス状態での結果です。どちらも正常のようです。
なのに、なぜ?Blynkアプリだけが、IP固定になると使えなくなるのか?
さっぱりわかりません。
なにかヒントに繋がるものを、まーくさんに、ご提供できないかと、Blynkアプリの方の様子を動画に撮影してみました。
Youtubeにアップしましたので、そちらのほうもご覧になって頂いても宜しいでしょうか?
※『Blynk画面の様子』
https://youtu.be/OO_9AmMH2CA
動画の内容は、IP自動割り付け時のスマホ操作の様子。
それから固定IPの時のスマホの操作の様子を撮影したものです。
短時間で作成しましたので、少しわかりずらいところもあるかもしれません。不明な部分がありましたら、なんなりとお聞き下さい。
これで、なにか問題解決への切り口など見つかればうれしいのですが・・・。
いろいろとお手数とらせてしまって、ほんとうにごめんなさい。
引き続き、どうぞよろしくお願い致します。
まーくさん、おはようございます!
なんだか良く分からないんですが、固定IPアドレスでLチカが出来る様になりました!
しかし、その原因がいったいなんだったのだろうと言う所は、いまだに良く分からないままですが(^_^;)
問題解決になったと言う、その内容ですが、やったのは固定IPアドレスを変更しただけです(^_^;)
後は、なにもしていません。
/etc/dhcpcd.confファイルに記載した、固定IPアドレス設定コードの内容は、既にご報告済みですが、単純に以下の様に変更したところ、今までが何だったんだろう?と思われるくらい、あっさりとBlynkアプリが繋がり、Lチカが出来る様になりました。
interface wlan0
static ip_address=192.168.1.112/24 (←最後の『111』を『112』に変更しただけです)
static routers=192.168.1.1
static domain_name_servers=192.168.1.1
今まで、散々悩ましてくれたその原因追求について、これから並行してやって行きたいと思って居ますが、なんでこれだけで、いとも簡単にBlynkが繋がったのか、不思議でたまりません。
昨日の夜に気づき、アドレス変更してからBlynkを何度も操作したり、固定IPアドレスをセット&解除してみたり、しばらく時間をおいてからやってみたりと、いろいろと試していますが、現在まで、安定して動作しております。
192.168.1.111設定時の状況については、前回、ご報告申し上げた通り、pingでも、ちゃんと返しがありましたし、ifconfigでもしっかりと表示されていました。
例えば、コード中のどこかに全角スペースなどをいれてコード自体機能しなかったと言う事でしたら、pingやifconfigで何らかの障害が確認されたハズで・・・。
しかし、それは無かったので、間違いなく固定IPアドレスがセットされていたわけで。
アドレスの競合もありませんでしたし、ログ履歴も確認したりしてみたのですが、これと言って原因追及の糸口みたいなものは、見つかりませんでした。
ほんとに、いったい、なんだったのだろう?って正直な気持ちです。
そもそも、単純にアドレスを変更してみると言う、すぐに思いつきそうな事を、なぜ今までしてこなかったのだろう?と、ちょっと、その部分は自分自身に対して、今更ながら不思議な所でもありますが、はい f(^_^;)
と言う事で、とりあえずになるかもしれませんが、現在、問題無く固定IPアドレスにて、Blynkアプリが操作できてLチカ&強制シャットダウン&自動起動ができて居る状態です。
さきほども申し上げた通り、今回の件については、別途、原因追及していきますが、まーくさんの、ご経験から、なにか思いつくような事などありましたら、お聞かせ頂くと幸いです。
それでは、私の問題は、これで一旦、落ち着きましたので、本件の質問に関して終了させて頂きます。
今回も、親身になって考えて頂き、アドバイス頂き、重ね重ね、ほんとうに、いつも、ご親切に、どうもありがとうございます!
また、同時に、今後とも、どうぞ宜しくお願い致します。
あの灼熱の夏は、いったいなんだったのだろう?と思わせる様な、冬の寒さの到来、師走の慌ただしさを感じる今日この頃になって参りました。
どうぞ、お体をご自愛下さいませ。
m(_ _)m
mihomihokurisuさま、
YouTubeの映像見ました!TeamViewerも組み合わせられていて凄い!
まずは無事に固定IPアドレスでLチカできるようになったとのこと、おめでとうございます!
環境が変わると再発するかもしれないので、問題点は確実に原因を明らかにしておきたいですね
これまでの状況からして、ルーターの設定が関係しているのでは、と考えています。
・ルーターのDHCPサービスでIPアドレスの割り当て範囲が適切に制限されておらず、同じIPアドレスを持つ端末がネットワーク内に存在している(IPアドレスの重複)可能性。
ご自宅のネットワークでルーターは使用されていますか?
使用されている場合、DHCPの設定はどのようになっているでしょうか?
ラズパイから以下のコマンドを実行すると、何かしら見えてくるかもしれません。
(ブロードキャストでpingの応答があるか確認する)
ping -c 5 -b 192.168.1.255
あと、以下のコマンドを実行すると、検知できたIPアドレスとMACアドレスの一覧が表示されます。
ip n | grep 192.168.1
もしここで 192.168.1.111 のアドレスを持ったデバイスが出てきたら、IPアドレスが重複していたのが原因と言えそうです。
急激に寒くなってきましたので、mihomihokurisuさまも風邪などひかれませんようご自愛下さい!
まーくさんへ
お久しぶりでございます。
先だって、いろいろとお世話になりましたmihomihokurisuです。
まーくさんにおかれましては、精力的に頑張っておられることと存じます。
私のほうは、あれから、まーくさんに教えて頂いたBlynkの知識を元に、せっせと電子工作に励んでいる毎日です(^_^;)
さて、本日、コメントをさせて頂いたのは、BlynkのProjectの件で、もしも、まーくさんがご存じでしたら、出来ましたら、またお知恵を拝借できないものかと思ったからです。
淡い期待を織り交ぜながらコメント欄にいれさせて頂いております。
(^_^;)
その内容についてですが、スマホに入れたBlynkアプリから、一つのRaspberry Piを操作しているのを、2つの違うスマホから操作するのって、どうすれば実現するのだろう?というものなんです。
実は、まーくさんに色々と教えて頂いたあと、自分で我が家のIOTを、電子工作する様になりました。
電気工事士の資格を持っているので、我が家の電気関係について、なにか、便利になるような物を作ってみたいと思ったのがキッカケで、今、その電子工作にはまっています(^_^;)
それで、玄関のドアの開閉systemをRaspberry Piを採用して作りましたが、現在、私のスマホしかRaspberry Piを操作できない状況なんです。
これを、家族のスマホにも同じBlynkアプリを入れる事で、家族で玄関ドアのsystemを使える様にしたら、すごく便利だと思いつきました。
しかしながら、これについて、色々とググって見たりしたのですが、これと言って該当するようなものが、見つかりませんでした。
Blynkアプリのほうに、cloneと言うコマンドがあって、それをすれば、できるのかなと思いましたが、基本的に、一つのProjectで、一つのtokenみたいで、私が実現させたいような内容は、できないみたいなのです。
(すいません、もしかしたら、やり方が違うだけで、これって、cloneでやるので正解なのかもしれませんが・・・)
それで、この私の実現させたいことについて、もし、まーくさんが、その知識をお持ちでしたら、是非、また、ご教示頂けないかと、まーくさんの、このページのtopicとは関係ない内容のコメントを、させて頂いた次第です。
すいませんが、どうぞ、よろしくお願い致します。
m(_ _)m
追伸:まーくさんの別のページで、Raspberry Piとスピーカを接続して音を鳴らすのがありましたが、あれ、そのままそっくり、私の電子工作で採用させて頂きました。
いつも、貴重な有益な情報をサイトで、ご紹介して頂き、併せて感謝です。
m(_ _)m
mihomihokurisuさん、
こちらこそお久しぶりです(・∀・)
もの凄く発展されていて驚くばかりwww
他の記事も役立っているようで嬉しい限りです(^o^)
さてさて、本題のBlykアプリを共有する方法ですが、私がやったことがあるのは2通りです。
(1)Shared Accessを利用する方法
(2)同じアカウントでログインする方法(非推奨)
(1)のShared Accessを利用する方法では、まず対象となるBlynkアプリを開き、ナットみたいなボタンを押して、プロジェクトの設定を開きます。ここで、1000エナジーを消費(回収不可)して「SHARED ACCESS」を「ON」、「Generate Link」ボタンを押すと、他の端末で利用できる「QRコード」が表示されます。これを他の端末から読み込むと、そのプロジェクト単体が使えるようになります。
(2)の同じアカウントでログインする方法は、そのまんまです。別の端末で同じIDを利用してログインします。但しこれは「非推奨」です。作成者と同じ権限を持っているので、プロジェクトの停止・開始、変更、エナジーの購入など色々できてしまいます。その辺りがよくわかっている人じゃないと、アクシデントが多発すると思います。※子供に触らせたりした日にはもうwww
ということで、手軽にやるには(1)の方法をオススメします。
要望があれば記事として追加しますよ^^
それにしても、この部分!
↓
“電気工事士の資格を持っているので“、、、
私も持ってますよw 同じ人種な気がしてならない。。。
実現方法は違いますが、全く同じ用途(入り口の開閉)をやっていますのでwww
まーくさんへ
ご返信くださいまして、どうもありがとうございました!
教えて頂いた『Shared Access』の方でやりましたところ、私のやりたかったことを、完璧に実現させる事が出来ました!
すごい嬉しいです!
ほんとにありがとうございました!
感謝、感謝です!
m(_ _)m
自分では、色々と調べたりしたつもりだったのですが、まだまだ、勉強が足りないようです(^_^;)
これで、また一つ、生活が便利になります!
最近では、妄想ばかりが先走って、実現化が追いついていきません(^_^;)
あれも作りたい、これも作りたいと(^_^;)
でも、電子工作って、ほんとに楽しいですね!
ちょっと前だと考えられなかったような事が、自分のアイディア次第で、素人でもなんでも作れそうな(ちょっと言いすぎかな?(笑))、そんな勢いのある時代になった感じがしてなりません。
その為の情報や部品や道具なども、インターネットで手に入れたりする事が可能ですし、勉強する事も可能です!
(まーくさんのような親切な方が居て下さるおかげなんですけどね)
ほんとに良い時代に生まれ合わせたものだと、つくづく思う今日この頃です。
それから、まーくさんも電気の資格をお持ちなんですね。
私は、プログラムに興味を持ち、DIYするようになって、車に関するもの、家に関するモノと、どんどん、高じて行き、とうとう第2種電気工事士を取ってしまったと言うパターンです。
インターネットを調べてみると、私の様なパターンって、結構、居るみたいですよ(^_^;)
いつも、まーくさんには、おんぶにだっこされるだけで、こちらからは何もしてないと言う、都合の良い人間でありますので、何か、こんなものを作りましたよとか結果を出した時に、まーくさんに、ご報告申し上げますね!
『ああ、俺の教えた奴が、こんな事できるようになったのかあ』みたいなところで、まーくさんに満足していただけると、非常に嬉しいなと勝手に思ったりしています(^_^;)
今、考えて居るのが、Smart Carシステムなるもので、自分なりに、こんな風に便利にできたら良いなと生活改善の一部として考えて居ます。
もちろん、今回、まーくさんに教えて頂いた内容も盛り込もうと考えてます。
以前、一度、PICを利用して、Smart Carシステムの試作みたいな物をつくりました。
その時は、電波が出るリモコンを使ったのですが、リモコンをBlynkに変えて、更にパワーアップしたものを考えて居ます。
ちなみに、その時に試作した物を、ユーチューブ用の動画として取ってありますので、もしよろしかったら、ご覧になってください。
https://youtu.be/N_DQih_VLX8
https://youtu.be/J3_Knzn17DQ
先程も言いました様に、このようなものを作るのに、まーくさんの助けを借りながらやらせて頂いて居るので、その部分で、
『おお、おれの教えた奴がこんなものを作っているのかあ』
みたいに、満足されていただくと、なにもお返しできない私としても、非常にうれしく思います(^_^;)
長文になってしまい、乱文等、失礼しまして、それでは、今回も、また、どうもありがとうございました!
m(_ _)m
寒暖の激しい季節なので、ご自愛下さいますよう、お気を付け下さい。
それでは。(また、わからない時は是非お願いします)←という様な思いを込めてカッコ内はささやくような声で言っています(^_^;)