Raspberry Piのセンサー情報をグラフ化し、Webブラウザーで確認できる環境を準備する

#はじめに
リックテレコムが出版する「JavaでRaspberry Pi 入門」は、Java をベースとした数少ない（あるいは唯一の？）Raspberry Pi の入門書です。この本は最後のほうで、Raspberry Pi に接続した温度センサーの情報を継続してデータベースに記録し、他の PC やスマホの Web ブラウザー上にグラフ化して表示させる方法を紹介しています。

これを実現するために RDBMS として MySQL、その Java とのインターフェースとして MySQL Connecter/J、Web サーバーとして Tomcat、またグラフ化のツールとして JFreeChart を使用しています。しかしこの本の発行日は2016年12月で、今となっては本の解説通りにこれらのパッケージをインストールもしくは設定しようとしても、色々と想定外のことが発生します。

そこで私なりに調べてみて、この本の目指す環境を構築してみました。

##今回使用した環境・ソフトウェアバージョン
Raspberry Pi 3 Model B
Raspbian v2.7.0
Java 1.8.0_65
Pi4J 1.1
Samba 4.5.12
Tomcat 9.0.6
MySQL 15.1 Distrib 10.1.23
MySQL Connecter/J 5.1.46
JFreeChart 1.0.19

※ 2018年4月1日時点で利用可能だったバージョンのソフトウェア・パッケージを使用しています。

##注意

* 記載されるファイル名やディレクトリ名は構築した当時のものです。使用するパッケージのバージョンによりこれらは異なってきますので、その場合は適宜読み替えてください。
* 今回構築した環境は、日本語化は目指していません。またセキュリティを重視する場合はその対策がきっと必要ですが、それについてもここでは触れていませんのでご注意ください。
* もしこの書籍に書かれているプログラムを試してみる場合は、書籍に記載されているサイトから最新のソースコードをダウンロードして使用することをお勧めします。紙面上のソースコードは、解説のとおりになっていないものがあります。

#Raspbian のインストールと設定
##インストール
今回は NOOBS からインストールしました。Raspberry Pi の[公式サイト](https://www.raspberrypi.org/)の DOWNLOADS から Raspbian をダウンロードしますが、激遅なので以下のミラーサイトを利用しました（それでも2時間ほどかかりました）。今回使用したのは2018年3月14日にリリースされた v2.7.0 です。

http://ftp.jaist.ac.jp/pub/raspberrypi/NOOBS/images/

ダウンロードしたファイル（NOOBS_v2_7_0 .zip）を展開して作成されたすべてのファイルを、フォーマットした microSD カードにそのままコピーし、Raspberry Pi のカードスロットに挿入してインストールを開始します。必要に応じて NOOBS の初期画面で Wifi networks のアイコンをクリックし、無線LANの設定をしておきます。

##設定

以降の作業はすべて pi ユーザーから実施しています。

###システムの最新化
インストールが完了し Raspbian が起動されたら、LXTerminal から以下のコマンドを入力してシステムを最新化します。

```
sudo apt-get update
sudo apt-get upgrade
```

###Raspberry Pi Configuration の設定
GUI 画面の左上のメニューアイコンをクリック～「Preferances」～「Raspberry Pi Configuration」を選択し、Raspberry Pi Configuration パネルを表示します。今回は以下を設定しました。

|カテゴリー|設定項目：設定値|
|:--|:--|
|System|Password：任意<br>Underscan：Disable|
|Interface|SSH：Enable<br>SPI：Enable<br>I2C：Enable|
|Localisation - Locale|Country：US (United States)|
|Localisation - Timezone|Area：Japan|
|Localisation - Keyboard|Country：Japan<br>Variant：使用しているキーボード|
|Localisation - WiFi Country|Country：JP Japan|

OK ボタンを押すとシステムのリブートを尋ねてきますが、ここではリブートしないで引き続き以下を設定します。

###root のパスワードの変更

```
sudo passwd root
```

###IP アドレスの固定化
/etc/dhcpcd.conf を編集します。

```
sudo nano /etc/dhcpcd.conf
```

このファイルに以下を追加します（IP アドレスなどは、ご自身の環境に合わせて指定してください）。

```
interface wlan0      # 有線LANの場合はeth0
static ip_address=192.168.1.100/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1
```

以上で Raspbian の設定は完了です。ここで一旦システムをリブートします。

```
sudo reboot
```

#Pi4J のインストール
Pi4J は Java から GPIO を制御するためのパッケージです。以下のコマンドを入力して、インストール用のスクリプトを取得・実行します。

```
curl -s get.pi4j.com | sudo bash
```

パッケージのクラスファイルは /opt/pi4j/lib にコピーされます。Pi4J の公式サイトにはドキュメントやサンプルなどが紹介されています。

[Pi4J公式サイト](http://pi4j.com/)

ここまでの設定が終わると、Java を使用して GPIO に接続された電子部品やセンサーの制御が可能になるはずなのですが、本日現在（2018年4月）GPIO の制御のベースとなる Wiring Pi が最新のファームウェア（カーネル）に対応していないため、プログラムを実行したときに以下のエラーメッセージを吐いて終了してしまいます。

Unable to determine hardware version. I see: Hardware   : BCM2835

そのため正常にプログラムを動作させるために、ファームウェアを以下のコマンドでダウングレードします（再起動が必要です）。

```
sudo rpi-update 52241088c1da59a359110d39c1875cda56496764
```

（参考記事）[WiringPiでエラーになった場合のメモ](http://www.tohuandkonsome.site/entry/2017/05/01/234002)


#Samba のインストールと設定（オプション）
必須ではありませんが、Samba をインストールして Raspberry Pi 上のファイルを他の PC から共有できるように設定しておくと便利です。

```
sudo apt-get update
sudo apt-get install samba
```

/etc/samba/smb.conf を編集します。

```
sudo nano /etc/samba/smb.conf
```

このファイルの最後に、例えば以下を追加します。この例では共有名を pi として、/home/pi 以下のファイルを pi ユーザーとして読み書きを行います。

```
[pi]
path = /home/pi
read only = No
guest ok = Yes
force user = pi
```

上記ファイルを保存後、サービスをリスタートします。

```
sudo service smbd restart
```

Windows のエクスプローラなどから Raspberry Pi が認識され、設定したディレクトリがフォルダとして見えることを確認します。

![samba.PNG](https://qiita-image-store.s3.amazonaws.com/0/242156/aaf14f1e-77ed-1162-3f29-e4f47f4ebcce.png)

Raspberry Pi が見つからない場合は、以下のように直接ホスト名と共有名をエクスプローラのアドレス部分に指定してみてください。

```
\\RASPBERRYPI\pi
```

（参考記事）[Sambaのインストールと設定と接続](http://www.hiramine.com/physicalcomputing/raspberrypi3/samba_installconfigconnect.html)

#Tomcat のインストールと設定
##インストール
Tomcat のパッケージは[公式サイト](http://tomcat.apache.org/)からダウンロードします。ホームページ左側の Download の下にある Tomcat 9.0 のリンクをクリックし、Binary Distributins の Core にある tar.gz をクリックしてパッケージファイルをダウンロードします。

ダウンロードしたファイル（apache-tomcat-9.0.6.tar.gz）は、以下のコマンドで展開します。

```
tar xzvf apache-tomcat-9.0.6.tar.gz
```

展開して作成された apache-tomcat-9.0.6 を、ディレクトリごと pi のホームディレクトリ直下に移動します。

```
mv apache-tomcat-9.0.6 ~
```

##設定

Tomcat の管理画面にアクセスするためのユーザーを設定します。管理画面は Tomcat のウェルカム画面からアクセスすることができます（ウェルカム画面のアクセス方法は後述）が、アクセスできないと Tomcat が全く使えないというわけではありません。

ユーザーの登録は、以下のファイルに対して行います。

```
nano ~/apache-tomcat-9.0.6/conf/tomcat-users.xml
```

\<tomcat-users\> タグの中に以下を追加します。username、password にそれぞれ設定したい内容を指定します。

```
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="pi" password="raspberry" roles="manager-gui,admin-gui"/>
```

管理画面はデフォルトではローカルからしかアクセスできません。管理画面のうち、Server Status や Tomcat Web Application Manager の画面を他の PC からもアクセスしたい場合は、以下の設定ファイルを編集します。

```
nano ~/apache-tomcat-9.0.6/webapps/manager/META-INF/context.xml
```

\<Valve\> タグの中の allow に、アクセスを許可する IP アドレスを正規表現で記入します。

```
 <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
```

例えば IP アドレス 192.168.1.xxx からアクセスしたい場合は、以下のように正規表現の部分を置き換えます。`192\.168\.1\.\d+`を | (or) で追加しています。

```
allow="127\.\d+\.\d+\.\d+|192\.168\.1\.\d+|::1|0:0:0:0:0:0:0:1"
```

Tomcat Virtual Host Manager の管理画面については、以下のファイルを同様に編集します。

```
nano ~/apache-tomcat-9.0.6/webapps/host-manager/META-INF/context.xml
```

```
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|192\.168\.1\.\d+|::1|0:0:0:0:0:0:0:1" />
```

##自動起動の設定
Raspberry Pi を起動したときに、Tomcat も自動で起動するように設定しておきます。以前は init.d で起動していましたが、現在の Raspbian のバージョンでは systemd を使用した方法が推奨されています。

Tomcat 用のユニットファイル /etc/systemd/system/tomcat.service を新規に作成します。

```
sudo nano /etc/systemd/system/tomcat.service
```

このファイルに、以下の内容を記載します。実行ユーザーを pi 以外にしたい場合は、[Service] セクションの User および Group の指定を置き換えます。

```
[Unit]
Description=Apache Tomcat 9
After=syslog.target network.target
ConditionPathExists=/home/pi/apache-tomcat-9.0.6/bin/

[Service]
User=pi
Group=pi
Type=oneshot
Restart=no
PIDFile=/home/pi/apache-tomcat-9.0.6/tomcat.pid
RemainAfterExit=yes
ExecStart=/home/pi/apache-tomcat-9.0.6/bin/startup.sh
ExecStop=/home/pi/apache-tomcat-9.0.6/bin/shutdown.sh
ExecReload=/home/pi/apache-tomcat-9.0.6/bin/shutdown.sh;/home/pi/apache-tomcat-9.0.6/bin/startup.sh

[Install]
WantedBy=multi-user.target
```

ファイルを作成したらファイルの所有者、アクセス権を設定しておきます（特に変えなくても、そのようになっていると思います）。

```
sudo chown root:root /etc/systemd/system/tomcat.service
sudo chmod 644 /etc/systemd/system/tomcat.service
```

サービスの起動・停止やデーモンとしての自動起動設定は、以下のコマンドを使用します。確認コマンド以外は root 権限が必要なので、頭に sudo を付加して実行します。

|機能|コマンド|
|:--|:--|
|登録状況の確認|`systemctl daemon-reload`<br>`systemctl list-unit-files --type=service`|
|起動|`systemctl start tomcat.service`|
|停止|`systemctl stop tomcat.service`|
|再起動|`systemctl restart tomcat.service`|
|状態の確認|`systemctl status tomcat.service`|
|デーモン自動起動指定|`systemctl enable tomcat.service`|
|デーモン自動起動解除|`systemctl disaable tomcat.service`|
|ログの確認|`journalctl -u tomcat.service`|

正しく登録されたことを確認後、サービスを起動します。

```
sudo systemctl daemon-reload
systemctl list-unit-files --type=service

sudo systemctl start tomcat.service
```

サービスを起動したら以下の URL を指定して、Web ブラウザーから Tomcat のウェルカムページが表示されることを確認します。

```
http://[ipアドレス または localhost]:8080/
```

<p>
![tomcat.PNG](https://qiita-image-store.s3.amazonaws.com/0/242156/9391a8ec-f1b1-90a9-01f9-9bc414758ecd.png)

正しくウェルカムページが表示されたら以下のコマンドで、自動起動を有効化しておきます。

```
sudo systemctl enable tomcat.service
systemctl list-unit-files --type=service   ・・・このコマンドでenabledを確認
```

（参考記事）[CentOS7にTomcat8をインストールして自動起動設定](https://qiita.com/nyao/items/8ad51a56638e646b2ec1)

#MySQLのインストールと設定

リレーショナル・データベースシステムのひとつである MySQL を、以下のコマンドでインストールします。

```
sudo apt-get install mysql-server
```

以前は pi などの一般ユーザーから `mysql -u root -p` コマンドで MySQL にパスワードを指定してアクセスできていましたが、認証方式が変わり、最初に MySQL に登録されている root ユーザーは OS のアカウントと連携した認証方式となっています。

今回導入しようとしている MySQL Connecter/J の様な TCP を使用した接続はパスワード認証である必要があるため、ここでは pi というユーザーをパスワード認証で MySQL に登録しておきます。

```
sudo mysql -u root
mysql> USE mysql;
mysql> CREATE USER 'pi'@'localhost' IDENTIFIED BY 'raspberry';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'pi'@'localhost';
mysql> FLUSH PRIVILEGES;
mysql> exit
```

大文字で書いている部分は、小文字で入力してもかまいません。CREATE 文の USER の後に、「'登録するユーザー'@'localhost'」、IDENTIFIED BY の後に ' ' で囲んでパスワードを指定します。また、GRANT 文と FLUSH 文ですべてのデータベースに対する権限を、pi ユーザーに付与しています。

最後に MySQL のサービスをリスタートしておきます。

```
sudo service mysql restart
```

MySQL へは以下のコマンドでアクセスします。pi ユーザーでログインしている場合は、「-u pi」を省略しても構いません。パスワードを聞いてきますので、上で設定したパスワードを指定します。

```
mysql -u pi -p
```

よく使う SQL 文は以下の記事が参考になります。

（参考記事）[Mysqlコマンド](https://qiita.com/fukumone/items/2c75bd4a11a7817e6c9e)

#MySQL Connecter/J のインストール
Java から MySQL へのアクセスに必要となるパッケージです。以下のリンク先から Compressed TAR Archive の Download をクリックします。

https://dev.mysql.com/downloads/connector/j/

Login するように尋ねられますが、ページ下のほうにある「No thanks, just start my download.」を選んでもダウンロードが可能です。

ダウンロードしたファイル（mysql-connector-java-5.1.46.tar.gz）を以下のコマンドで展開します。

```
tar zxvf mysql-connector-java-5.1.46.tar.gz
```

展開されたファイルの中から mysql-connector-java-5.1.46-bin.jar ファイルを Tomcat の lib ディレクトリ（あるいはCLASSPATH が通ったディレクトリ）にコピーします。

```
cd mysql-connector-java-5.1.46
mv mysql-connector-java-5.1.46-bin.jar ~/apache-tomcat-9.0.6/lib
```

#JFreeChartのインストール
JFreeChart は Java から多種多様なグラフを作成することができるパッケージです。以下のリンク先から SourceForge download page に飛んで、Download Latest Version のボタンをクリックします。

http://www.jfree.org/jfreechart/download.html

ダウンロードしたファイル（jfreechart-1.0.19.zip）を以下のコマンドで展開します。

```
unzip jfreechart-1.0.19.zip
```

lib の下に展開された jar ファイルを Tomcat の lib ディレクトリ（あるいはCLASSPATH が通ったディレクトリ）にコピーします。ここで注意したいのが、展開された jar ファイルのうち、**servlet.jar ファイルだけはコピーしない**ようにします。このファイルを CLASSPATH に通してしまうと、Tomcat が正しく動作しなくなります。 

```
cd jfreechart-1.0.19/lib
rm servlet.jar
mv *.jar ~/apache-tomcat-9.0.6/lib
```

#その他
今までインストールしてきたパッケージにプログラムからアクセスできるように、CLASSPATH を設定しておきます。

```
nano ~/.profile
```

このファイルの最後に、以下を追加します。各種パッケージを他のディレクトリに置いている場合は、適宜 CLASSPATH にそのディレクトリを追加してください。

```
CATALINA_HOME="/home/pi/apache-tomcat-9.0.6"	
export CLASSPATH=$CLASSPATH:.:/opt/pi4j/lib/*:$CATALINA_HOME/lib/*
```

設定を以下のコマンドで反映します。

```
source ~/.profile
```

#最後に
5,000円程度のパソコン？で普通にここまで機能を持たせることができるとは、なかなか Raspberry Pi も侮れないですね！

今回構築した環境をベースにして、実際に温湿度と気圧センサーをつなげて下のようなグラフを Web ブラウザから表示できるプログラムを作ってみました。

![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/242156/2a8b4369-3586-cb58-fe02-af2f9894b52b.png)

こちらについては以下の記事で紹介しています。

> [Raspberry Piのセンサー情報をJavaでグラフ化し、Webブラウザーで確認する](https://qiita.com/uchino-tama/items/e8e832344ab1c3357ac2)