Blynkは、インターネット上にあるBlynk Serverを介して、デバイスと情報のやりとりをします(下の図)。スマホとIOTデバイスだけで簡単にリモート操作ができるので大変すばらいい。
ローカルサーバーを持つ利点は?
今回、紹介するのは、そのBlynk serverをお家のRaspberry Piに立てることです。うん?サーバーなしですぐできるのが長所なのになぜだ?と思うかも知りません。
- 応答が速い (お家の無線LANだけでやりとりするので)
- BlynkのWidgetが使い放題(タダです)
下記の図のようにBlynk mobileアプリにジョイスティックやボタンなどのWidgetをつけるのにお金がかかります。(Energyというポイントが必要で、最初に1000pointsまで無料です)自分のサーバーなら、それを自由に設定できるので、開発の際に自由度がぐーんと増します。そして、お家のサーバーなので、ネットを介すよりタイムラグがすくなく、例えば、リモコンでミニカーを操作する場合、操作性が断然違います。
今回使ったもの
- Raspberry Pi 3 Model B+
手順
- Raspberry piにDockerをインストール
- Blynk ServerカスタマイズしてImage作成
- 自動起動設定と起動
- Mobile AppのBlynkでユーザー作成
1. Raspberry piにDockerをインストール
下記の先人の知恵を借りました。
ただ、素早くやってみたいだけの方はこちらのコードでどうぞ
// 現在の Raspberry pi内の環境
$ uname -a
Linux raspberrypi 4.14.98-v7+ #1200 SMP Tue Feb 12 20:27:48 GMT 2019 armv7l GNU/Linux
$ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 9.8 (stretch)
Release: 9.8
Codename: stretch
Raspberry Piに Docker インストール
# Install
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh
$ sudo systemctl enable docker
$ docker --version
# Docker version 19.03.9, build 9d98839
# Raspbianの標準ユーザのpiにDockerの実行権限を付与します。
$ sudo usermod -aG docker pi
インストールと起動確認
インストールしたら、常にdockerが動くようになっています。
# 確認
$ systemctl status docker.service
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2020-05-23 21:56:03 JST; 1 day 14h ago
$ ps aux | grep docker
root 416 0.1 6.5 967836 58464 ? Ssl May23 2:48 /usr/bin/dockerd -H fd:// -- ....
root 857 0.0 0.3 866456 3152 ? Sl May23 0:34 /usr/bin/docker-proxy -proto tcp -host-ip ....
root 870 0.0 0.3 867224 3396 ? Sl May23 0:00 /usr/bin/docker-proxy -proto tcp -host-ip ....
root 879 0.0 0.6 799176 5672 ? Sl May23 0:25 containerd-shim -namespace moby -workdir ....
pi 12761 0.0 0.0 4340 564 pts/0 S+ 12:49 0:00 grep --color=auto docker
2. Blynk ServerカスタマイズしてImage作成
blynkの公式Github repositoryにdockerを使った起動方法がありますが、そこの説明のままに実行したら毎回データーが初期化されるなど不便なところがあります。そこで、そのイメージを少しカスタマイズしたものを用意したので、このrepositoryからクローンして、Raspberry piで、実行してください。
大まかには、
設定ファイルを簡単に修正できるように、ユーザーデータを保持できるようにボリュームを指定しています。dockerに詳しくなくても中をのぞけば仕組みが簡単にわかると思います。
# イメージビルドソースをクローン
# ビルドしたイメージの中でblynk
$ git clone https://github.com/yusonkim/localblynkserver.git
$ cd localblynkserver
# サーバー設定ファイルを開く(各自環境に合わせてeditorを使ってください)
$ vim server.properties
initial.energy
は、新しいアカウントを作成した時に使えるWidget購入pointです。そのままでも十分ですが、ガンガン使うならもっと高くしても良いでしょう。
admin.email
とadmin.pass
は、ウェブからの管理画面にアクセスする時に使うものです。この管理画面のURLは、https://<Rasberry piのhostname>.local:9443/admin
で、お家のネットワーク内で、Macなど他のPCから接続できます。暗証番号等を新たに変更してください。
...中略
#initial amount of energy
initial.energy=100000
...中略
admin.email=admin@blynk.cc
admin.pass=admin
そのあとは、Raspberry pi内でカスタムしたイメージを作成して、Rapberry piが再起動しても常に立ち上がるように設定するだけです。
# 設定ファイルを取り込んだカスタムBlynk Server Imageを作成
$ ./build.sh
3. 自動起動設定と起動
下記を参照しました。
systemctlを使ってRaspberry Piが起動すると自動的にdocker runコマンドで起動するように設定しています。その時に、永続化するボリュームを指定してユーザーデーターがなくならないようにしています。実際には、下記のスクリプトを実行するだけでよいです。
# Blynk Serverが自動的に起動するように設定
$ ./deploy.sh
# 再起動
$ sudo reboot
# 再起動後確認
# プロセスはすぐ立ち上がりますが、サーバーが起動までには約1分ほどかかります。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
646b4dbdd298 rasbian-blynk:customlocal "entrypoint.sh" About a minute ago Up About a minute 0.0.0.0:8080->8080/tcp, 0.0.0.0:9443->9443/tcp, 8440/tcp blynk
4. Mobile AppのBlynkでユーザー作成
アプリがなければ、AppStoreなどからダウンロードしてください。
もしログインしていれば、一度ログアウトして、新しくアカウントを作ります。
ローカルサーバーへの接続は、新しいアカウントを作る時に指定します。
Create New Account を選択して、EmailやPasswordを入力します。
そのあと、下にあるサーバー選択アイコンを選択します。
BlynkからCustomに設定を変更してから、住所にRaspberry piのIP、もしくは .localをいれ、ポート番号を9443に指定します。
プロジェクトを作って見ると、Energyが増えていることが確認できます。
その他
管理画面から、token取得
IOTデバイスで動くプログラムを組むときは、PCだと思いますが、その時に、各プロジェクトごとにデバイスのtokenをいれなければなりません。結構長いので、モバイルのBlynkアプリからコピーするのは大変だと思いますが、先ほど出ていた管理画面に接続すれば、簡単に参照できます。
https://<RaspberryPiのIP>:9443/admin
に接続します。
するとこんな画面が、でます。今回ssl証明書の設定をしてないので、怒られています。Advencedを押して、Proceed to ...を押して管理画面に入ることができます。sslの設定方法はblynkの公式Github repositoryにありますので、ソース上のserver.propertiesファイルも変更すれば、ご自身で設定できると思います。
設定したadmin情報でログインして見ると、
User欄からモバイルで登録したアカウントが確認できます。
そして、そのアカウントをクリックすれば、プロジェクトやデバイスなどの情報と、デバイスの情報欄にtokenが表示されていることがわかりますので、ここからコピーすれば良いでしょう。
サーバー設置方法検討
Blynk社でローカルサーバー用のBlynk Server公開しているので、それを使えば簡単にローカルサーバーが立てられます。
が、今回はDockerを使ってサーバーを立てます。その理由は、
- どんな環境(ハードウェアに関係なし)でも失敗せずに立ち上げられます。
- パッケージやプログラム言語をインストールする必要がない
- 起動・停止・削除が簡単で、綺麗に行える
*Dockerを使うときは、ボリュームを適切にマウントして、ユーザーデーターを保持することに注意が必要です。*そうしなければ、サーバーを起動する度に初期化状態になります。簡単にできますので、心配は要りません。
docker-composeやkubernetes(k8s)を使うのもいいですが、今回は必要性をあまり感じませんでした。postgress dbを使って、データー(IOTデバイスからの生データー)を保存するとなるとdocker-composeやk8sもいいオプションですが、今回は、小さな容量で動くRaspberryPiなので、dbは必要ありません。ユーザーデーターもファイルで保存する方法でやっていますので、Blynk server単体で十分です。そして、サーバーの台数を増やしたりするAutoscalingも必要ありませんので、k8sもスキップしました。