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もスキップしました。
