Day12

計測システムを構築_遠方監視_

Topへ

Day11へ

Day13へ

はじめに

前回までは、計測データをcsv形式でraspberrypi本体に保存できるようにしてきました。
ただし、これでは、手軽に計測データを確認できません。
一方、レンタルサーバーを契約しているのでそこに計測データを保存することが可能です。
そこで、レンタルサーバーに計測データを保存すればWeb上でそのデータを見ることが可能になるとおいさんは考えたのであります。
ということで、今回はその遠方監視ができるまで頑張ってトライしていくことにします。

Step1

データベースの作成

image

ここでは、データベースをレンタルサーバー内に作成していきます。
作業はおいさんが契約しているエックスサーバーで行います。
エックスサーバーのサーバーパネルのトップページを開き、「MySQL設定」を選択します。

image

「MySQLユーザ追加」を選択します。

image

開いた画面で「MySQLユーザID」と「パスワード」を入力し、「確認画面へ進む」ボタンを押して次に進みます。

image

最後に確認画面で「追加する」ボタンを押すと、MySQLのユーザーの追加が完了します。

image

ここからは、データベースの追加作業を行います。
「MySQL追加」メニューを選択して、データベースの追加画面を開きます。
開いた画面では「MySQLデータベース名」を入力のうえ、「確認画面へ進む」ボタンを押して次に進みます。

image

確認画面で「追加する」ボタンを押すとデータベースの追加が完了します。

image

「MySQL一覧」タブを選択すると、作成したデータベースが一覧に並んでいると思います。
ここで作成したデータベースの「アクセス権未所有ユーザ」の欄で、同じく作成したユーザーを選択して、そのまま「追加」ボタンを押します。
これで、データベース関係の作業は完了になります。

image

ここからは、作成したデータベースの設定をしていきます。
サーバーパネルに戻り、「phpmyadmin」を選択します。

image

「ユーザー名」と「パスワード」を確認されますので、先程、「MySQLユーザ追加」で登録した 「ユーザー名」と「パスワード」を入力します。

image

データベース名を選択すると、「新しいテーブル作成」の画面が表示されます。
そこに、テーブル名とカラム数を入力します。
今回のカラム数は、6になります。

image

テーブルの設定を行います。入力内容は画像のとおりになります。
入力が終われば、保存するボタンを押して設定を完了させます。

Step2

データベースの操作

image

データベースが完成したので、これからはそのデータベースに計測データを保存していく作業が必要になります。
そのため、いろいろ検索をして勉強したのですが、raspberrypiから直接データベースへアクセスする方法がわかりませんでした。
そこで、サーバーサイドに一度データベースを操作するPHPプログラムを作成して、そのPHPプログラムに計測データを送ることにしました。
なので、このStep2ではデータベースを操作するためのPHPプログラムを作成していくことにします。
PHPについては、別のところでも紹介していますのでそちらも参考にしてください。

image

「Visual Studio Code」を開き、「新しいテキストファイル」を選択します。(メモ帳等でも問題ありません。)

image

どこでもいいのでこのコードを書いたファイルを「dbo.php」として保存します。

image

PHPのコードを書く場合は、画像のとおり
<?php
?>
を必ず記入し、その間にコードを入力していくようになします。

image

最初に、PHPからデータベースにアクセスする機能を提供する関数を準備をします。
関数は、「PDO」と呼ばれる物で、インスタンスのようなコードの書き方になります。
その引数?には、ホスト名、データベース名、ユーザー名、パスワード等になります。
ホスト名は迷わず「localhost」になりますが、その他は、Step1のデータベースの作成時に設定したデータベース名と 「MySQLユーザ追加」で登録した 「ユーザー名」と「パスワード」になります。

image

今回は、raspberrypi側からは「post」(データを送る)形式でしかサーバー側に要求をしませんが、 今後拡張できるように「get」(データをもらう)形式にも対応できるようにしておきます。
この設定は、「switch」文を使用し、送られてきた要求が「GET」か「POST」かで場合分けするようにします。
また、「GET」か「POST」はサーバー変数というものに格納されているようで「$_SERVER['REQUEST_METHOD']」 と入力することで「GET」か「POST」を得られるようです。

image

送られてきた要求内容が「POST」の場合のコードを追加します。
はじめに、「$in = json_decode(file_get_contents('php://input'), true);」になりますが、 まず、今回raspberrypi側から送られる書式?をJson形式とするので、「json_decode」でその書式をPHPで理解できる書式に変換します。
また、PHPではPOSTデータを受け取れるのは「file_get_contents('php://input')」という書き方しかないようです。
次に、「$st = $pdo->prepare("INSERT INTO テーブル名(t0,wt,at1,hd,lm,td)VALUES(:t0,:wt,:at1,:hd,:lm,:td)");」は SQL文の設定になります。よく見るとわかると思いますが、データベースのテーブル作成時に設定した項目(atだけはat1に変更)に値を保存 するような書き方になっています。新規に保存する場合は「INSERT INTO」という命令になります。
次に「$st->execute($in);」は、上記の内容を実行する命令文になります。
最後に、「echo json_encode("normal end");」は「normal end」を出力するコードになります。全体をとおして唯一の出力 になります。 これで、「Visual Studio Code」での作業は終了になります。

image

エックスサーバーにWebページを開き、その画面の「ファイル管理」を選択します。

image

その中の、「public_html」を選択します。

image

「アップロード」を選択します。

image

「dbo.php」を選択し、アップロードし保存します。これでPHP関連のすべての作業が終了になります。
ちなみにこの画面で消しているアップロード先の/public_htmlを除外した残りのパスがurl名になります。(http://アップロード先/dbo.php)
このurl名は後ほど使いますので、メモ等で控えておいてください。

Step3

raspberrypi側の操作

image

「Visual Studio Code」で「s_v_record.py」を開きます。
最初に、インポート文を追加していきます。
今回は、2つのモジュールを追加します。
一つは、「requests」でpost形式でサーバー側に要求するためのモジュールになります。
もう一つは、「json」でJson形式を扱うためのモジュールになります。

image

画像のとおり、main関数内に新しい関数「uploadSensorValues」を作成します。
この中に、POST形式でサーバーサイドのPHPに計測データを送るコードを追加していきます。
また、引数は各計測データの値にしています。

image

urlという変数を作成し、その中にサーバーサイドのPHPまでのurlを格納します。

image

次に、引数の計測データを変数(sensorsdata)に格納します。
この格納の際に、ルールがあります。今回この計測データをjson形式に変換する必要があります。
その場合、変換前の書式はpythonプログラムに用意してある辞書型オブジェクト形式にする必要があります。
書き方は、画像のとおりで「キーワード:計測値」をカンマ区切りにしていくルールになります。

image

格納した変数(sensorsdata)を「json.dumps」でjson形式に変換します。
ここでは一度print文で出力して、その書式を確認することにしています。

image

ここで少しコードの内容から外れますが、サーバーにデータを送る方法について触れておこうと思います。
サーバーにデータを送ることをこれまでpost形式と表記してきましたが、具体的には「HTTPリクエスト」という形式で サーバーに送るようです。
画像はその「HTTPリクエスト」の簡単な構造を示しています。
なのでこの構造形式をraspberrypi側で作成しサーバーへ送信する必要があります。
しかし、これを自力で作成することはおいさんには困難です。
そこで、これを作るお手伝いをしてくれるモジュール「requests」(インポートしたモジュール)の出番になります。

image

ここでは、上記で説明した「HTTPリクエスト」を作成するコードになります。
ただし、残念ながらあまりコードの内容が理解できていません。こういう物だとしておいさんは理解しています。
このコードで理解できるこは、「requests.post」でサーバーに計測データ等を送信していることと、その戻り値 「"normal end"」が変数「res」に格納されることです。

image

ここでは変数「res」の内容を出力して確認出来るようにしています。
ここまでで、「uploadSensorValues」関数のコードは完了になります。
最後に、この関数を実行します。引数は計測データになります。

image

「WinSCP」を開き、変更した「s_v_record.py」をraspberrypiの「python_apps」フォルダ直下にコピーします。

image

「Tera Term」を起動し、まずpython_appsフォルダに移動します。
移動後、「s_v_record.py」を実行してみます。
画像はその実行結果になります。
無事、戻り値の「"normal end"」が表示されています。

image

サーバーにあるデータベースも確認してみます。 しっかりデータが保存されていました。これで一安心です。
あとは、この保存されたデータをスマホ等でどこでも見れるようにするだけになります。
今回そのソフトをPHPで作成しようと思います。
なので、遠方監視の内容はここまでとし、別の「PHPにも挑戦したい」でその作成過程を掲載しようと思います。