環境センサー「BME280」の取得した温湿度・気圧データを、データベース「MySQL」にタイムスタンプを付与して保存します。言語はPHPを使用します。BME280からのデータは、インタフェース「json」により、「{“temperature”:111, “humidity”:345 , “pressure”:678}」の形式で、一定時間ごとにサーバに送信され、MySQL への接続用の API 「PDO」を用いて保存します。PHP には、MySQL への接続用の API が、mysql、mysqli、PDOの三種類あります。mysqlは非推奨となっており、今回はPDOを使用します。PDOには次の特徴があります。
- データベースが違っても、同じ方法で扱える。
- ライブラリ自体が例外を通知してくれる。
今回作成したデータベースの構造を次に示します。受け取った環境データにタイムスタンプを付与してテーブル「sensor」に保存します。
MySQLテーブル「sensor」
センサーからの環境データは、postの本文にjson形式で設定されており、「file_get_contents(‘php://input’)」により受け取ります。受け取った環境データは、json_decode関数によりデコードします。環境データを受信した時間をdate関数で取得して、タイムスタンプとし、温湿度・気圧データと共にsensorに保存します。書き込みプログラム「WriteDB.php」を次に示します。
また、例外が発生しない場合、例えば、「$stmt->execute」を実行したときに、戻り値がfalseになったが、例外が発生しませんできた。このようなときに、DB接続時の第四引数に「array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION))」を追加すると例外が発生します。
WriteDB.php
<?php try { //print_r(getallheaders() ); $post_body = file_get_contents('php://input'); //echo "body".$post_body; //$post_body = '{"temperature":111, "humidity":345 , "pressure":678}'; $obj = json_decode($post_body); if ($obj === NULL) return; //var_dump($obj); $pdo = new PDO('mysql:dbname=testdb;host=127.0.0.1','dbuser', 'dbpass', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); date_default_timezone_set('Asia/Tokyo'); $date = date("Y/m/d G:i:s"); $temperature = $obj->{'temperature'}; $humidity = $obj -> {"humidity"}; $pressure = $obj -> {"pressure"}; $sql = "INSERT INTO sensor VALUES(:date,:temperature,:humidity,:pressure)"; $stmt = $pdo->prepare($sql); $stmt->bindValue(':date',$date, PDO::PARAM_STR); $stmt->bindParam(':temperature', $temperature, PDO::PARAM_INT); $stmt->bindValue(':humidity',$humidity,PDO::PARAM_INT); $stmt->bindValue(':pressure',$pressure,PDO::PARAM_INT); $res = $stmt->execute(); } catch (PDOException $e){ var_dump($e->getMessage()); } ?>
次のinsert文を使うと、execute()で対応するデータ項目がないという例外が発生しました。現在は、上記に示すように「(date,temperature,humidity,pressure)」 の部分は削除しています。
“INSERT INTO sensor(date,temperature,humidity,pressure) VALUES(:date,:temperature,:humidity,:pressure)”
次にデータベースに保存した環境データを、読み出しプログラム「readDB.php」で読み出します。
readDB.php
<?php try { $pdo = new PDO('mysql:dbname=testdb;host=127.0.0.1','dbuser', 'dbpass', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); $stmt = $pdo->query("SELECT * FROM sensor"); while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ echo "date:" . $row['date']." "."temperature:" . $row['temperature']." "."humidity:" . row['humidity']." "."pressure:" . $row['pressure']."\n "; } } catch(PDOException $e){ var_dump($e->getMessage()); } $pdo = null; ?>