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 の公式サイトの 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:任意
Underscan:Disable
Interface SSH:Enable
SPI:Enable
I2C:Enable
Localisation - Locale Country:US (United States)
Localisation - Timezone Area:Japan
Localisation - Keyboard Country:Japan
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公式サイト

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

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

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

sudo rpi-update 52241088c1da59a359110d39c1875cda56496764

(参考記事)WiringPiでエラーになった場合のメモ

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

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

\\RASPBERRYPI\pi

(参考記事)Sambaのインストールと設定と接続

Tomcat のインストールと設定

インストール

Tomcat のパッケージは公式サイトからダウンロードします。ホームページ左側の 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
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/


tomcat.PNG

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

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

(参考記事)CentOS7にTomcat8をインストールして自動起動設定

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コマンド

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

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

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

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.