はじめに
Step1
データベースの作成
ここでは、データベースをレンタルサーバー内に作成していきます。
作業はおいさんが契約しているエックスサーバーで行います。
エックスサーバーのサーバーパネルのトップページを開き、「MySQL設定」を選択します。
「MySQLユーザ追加」を選択します。
開いた画面で「MySQLユーザID」と「パスワード」を入力し、「確認画面へ進む」ボタンを押して次に進みます。
最後に確認画面で「追加する」ボタンを押すと、MySQLのユーザーの追加が完了します。
ここからは、データベースの追加作業を行います。
「MySQL追加」メニューを選択して、データベースの追加画面を開きます。
開いた画面では「MySQLデータベース名」を入力のうえ、「確認画面へ進む」ボタンを押して次に進みます。
確認画面で「追加する」ボタンを押すとデータベースの追加が完了します。
「MySQL一覧」タブを選択すると、作成したデータベースが一覧に並んでいると思います。
ここで作成したデータベースの「アクセス権未所有ユーザ」の欄で、同じく作成したユーザーを選択して、そのまま「追加」ボタンを押します。
これで、データベース関係の作業は完了になります。
ここからは、作成したデータベースの設定をしていきます。
サーバーパネルに戻り、「phpmyadmin」を選択します。
「ユーザー名」と「パスワード」を確認されますので、先程、「MySQLユーザ追加」で登録した 「ユーザー名」と「パスワード」を入力します。
データベース名を選択すると、「新しいテーブル作成」の画面が表示されます。
そこに、テーブル名とカラム数を入力します。
今回のカラム数は、6になります。
テーブルの設定を行います。入力内容は画像のとおりになります。
入力が終われば、保存するボタンを押して設定を完了させます。
Step2
データベースの操作
データベースが完成したので、これからはそのデータベースに計測データを保存していく作業が必要になります。
そのため、いろいろ検索をして勉強したのですが、raspberrypiから直接データベースへアクセスする方法がわかりませんでした。
そこで、サーバーサイドに一度データベースを操作するPHPプログラムを作成して、そのPHPプログラムに計測データを送ることにしました。
なので、このStep2ではデータベースを操作するためのPHPプログラムを作成していくことにします。
PHPについては、別のところでも紹介していますのでそちらも参考にしてください。
「Visual Studio Code」を開き、「新しいテキストファイル」を選択します。(メモ帳等でも問題ありません。)
どこでもいいのでこのコードを書いたファイルを「dbo.php」として保存します。
PHPのコードを書く場合は、画像のとおり
「<?php
?>」
を必ず記入し、その間にコードを入力していくようになします。
最初に、PHPからデータベースにアクセスする機能を提供する関数を準備をします。
関数は、「PDO」と呼ばれる物で、インスタンスのようなコードの書き方になります。
その引数?には、ホスト名、データベース名、ユーザー名、パスワード等になります。
ホスト名は迷わず「localhost」になりますが、その他は、Step1のデータベースの作成時に設定したデータベース名と
「MySQLユーザ追加」で登録した 「ユーザー名」と「パスワード」になります。
今回は、raspberrypi側からは「post」(データを送る)形式でしかサーバー側に要求をしませんが、
今後拡張できるように「get」(データをもらう)形式にも対応できるようにしておきます。
この設定は、「switch」文を使用し、送られてきた要求が「GET」か「POST」かで場合分けするようにします。
また、「GET」か「POST」はサーバー変数というものに格納されているようで「$_SERVER['REQUEST_METHOD']」
と入力することで「GET」か「POST」を得られるようです。
送られてきた要求内容が「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」での作業は終了になります。
エックスサーバーにWebページを開き、その画面の「ファイル管理」を選択します。
その中の、「public_html」を選択します。
「アップロード」を選択します。
「dbo.php」を選択し、アップロードし保存します。これでPHP関連のすべての作業が終了になります。
ちなみにこの画面で消しているアップロード先の/public_htmlを除外した残りのパスがurl名になります。(http://アップロード先/dbo.php)
このurl名は後ほど使いますので、メモ等で控えておいてください。
Step3
raspberrypi側の操作
「Visual Studio Code」で「s_v_record.py」を開きます。
最初に、インポート文を追加していきます。
今回は、2つのモジュールを追加します。
一つは、「requests」でpost形式でサーバー側に要求するためのモジュールになります。
もう一つは、「json」でJson形式を扱うためのモジュールになります。
画像のとおり、main関数内に新しい関数「uploadSensorValues」を作成します。
この中に、POST形式でサーバーサイドのPHPに計測データを送るコードを追加していきます。
また、引数は各計測データの値にしています。
urlという変数を作成し、その中にサーバーサイドのPHPまでのurlを格納します。
次に、引数の計測データを変数(sensorsdata)に格納します。
この格納の際に、ルールがあります。今回この計測データをjson形式に変換する必要があります。
その場合、変換前の書式はpythonプログラムに用意してある辞書型オブジェクト形式にする必要があります。
書き方は、画像のとおりで「キーワード:計測値」をカンマ区切りにしていくルールになります。
格納した変数(sensorsdata)を「json.dumps」でjson形式に変換します。
ここでは一度print文で出力して、その書式を確認することにしています。
ここで少しコードの内容から外れますが、サーバーにデータを送る方法について触れておこうと思います。
サーバーにデータを送ることをこれまでpost形式と表記してきましたが、具体的には「HTTPリクエスト」という形式で
サーバーに送るようです。
画像はその「HTTPリクエスト」の簡単な構造を示しています。
なのでこの構造形式をraspberrypi側で作成しサーバーへ送信する必要があります。
しかし、これを自力で作成することはおいさんには困難です。
そこで、これを作るお手伝いをしてくれるモジュール「requests」(インポートしたモジュール)の出番になります。
ここでは、上記で説明した「HTTPリクエスト」を作成するコードになります。
ただし、残念ながらあまりコードの内容が理解できていません。こういう物だとしておいさんは理解しています。
このコードで理解できるこは、「requests.post」でサーバーに計測データ等を送信していることと、その戻り値
「"normal end"」が変数「res」に格納されることです。
ここでは変数「res」の内容を出力して確認出来るようにしています。
ここまでで、「uploadSensorValues」関数のコードは完了になります。
最後に、この関数を実行します。引数は計測データになります。
「WinSCP」を開き、変更した「s_v_record.py」をraspberrypiの「python_apps」フォルダ直下にコピーします。
「Tera Term」を起動し、まずpython_appsフォルダに移動します。
移動後、「s_v_record.py」を実行してみます。
画像はその実行結果になります。
無事、戻り値の「"normal end"」が表示されています。
サーバーにあるデータベースも確認してみます。
しっかりデータが保存されていました。これで一安心です。
あとは、この保存されたデータをスマホ等でどこでも見れるようにするだけになります。
今回そのソフトをPHPで作成しようと思います。
なので、遠方監視の内容はここまでとし、別の「PHPにも挑戦したい」でその作成過程を掲載しようと思います。
前回までは、計測データをcsv形式でraspberrypi本体に保存できるようにしてきました。
ただし、これでは、手軽に計測データを確認できません。
一方、レンタルサーバーを契約しているのでそこに計測データを保存することが可能です。
そこで、レンタルサーバーに計測データを保存すればWeb上でそのデータを見ることが可能になるとおいさんは考えたのであります。
ということで、今回はその遠方監視ができるまで頑張ってトライしていくことにします。