ESP8266からPHPにGETしてmySQLからのJSONデータをParseする

件名が長ったらしいですが、一連の流れが表れています。w
概要
1、PHPでデータベーステーブルに接続してSelect文を投げてからfetchしたデータを
  連想配列に突っ込んでJSONエンコードする。
2、ArduinoIDEでArduinoJsonをインクルードして1のphpにアクセスしてJSON
  受け取りParseする
3、Arduinoで分割した受け取りデータを分岐させて活用する。
  リモコンでもいいし、リモコンの送信データでも如何様にでも〜

注意
 Arduino公式が出してるJSONライブラリもある
 ArduinoJson5、ArduinoJson6があって古いネット情報では5の情報が多い
 この記事は6でやってるよ。

参考サイト

それでは実装してみましょう

順番は概要とは違いますが、ArduinoIDEでのコーディングから
RecieveJsonFromPhp.ino

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>
/* Set these to your desired credentials. */
const char *ssid = "使えるSSID";  //ENTER YOUR WIFI SETTINGS
const char *password = "WIFIのパスワード";
void setup() {
// put your setup code here, to run once:
delay(1000);
Serial.begin(115200);
WiFi.mode(WIFI_OFF);        //Prevents reconnection issue (taking too long to connect)
delay(1000);
WiFi.mode(WIFI_STA);        //This line hides the viewing of ESP as wifi hotspot
WiFi.begin(ssid, password);     //Connect to your WiFi router
Serial.println("");
Serial.print("Connecting");
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
//If connection successful show IP address in serial monitor
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());  //IP address assigned to your ESP
}
void loop() {
// Send request
HTTPClient http;    //Declare object of class HTTPClient
http.useHTTP10(true);
//http.begin("http://arduinojson.org/example.json");//←これは参考にするJSONを返すURLです
http.begin("ここにあなたが作ったJSONを返すPHPのURLを記述します");
http.GET();
// Parse response
DynamicJsonDocument doc(2048);
deserializeJson(doc, http.getStream());
// Read values
const char* id_recieve = doc["id"];
Serial.println(id_recieve);
int ondo_recieve = doc["ondo"];
Serial.println(ondo_recieve);
const char* time_recieve = doc["zikan"];
Serial.println(time_recieve);
http.end();
delay(10000);
}

JSONを返すPHP

<?php
// データベースに接続するために必要なデータソースを変数に格納
// mysql:host=ホスト名;dbname=データベース名;charset=文字エンコード
$dsn = 'mysql:host=サーバドメイン;dbname=データベース名;charset=utf8';
// データベースのユーザー名
$user = 'データベースユーザー名';
// データベースのパスワード
$password = 'データベースへのアクセスパスワード';
// tryにPDOの処理を記述
try {
// PDOインスタンスを生成
$dbh = new PDO($dsn, $user, $password);
// エラー(例外)が発生した時の処理を記述
} catch (PDOException $e) {
// エラーメッセージを表示させる
echo 'データベースにアクセスできません!' . $e->getMessage();
// 強制終了
exit;
}
$sth = $dbh->prepare("SELECT文をここに入力!"); //SQLを準備
$sth->execute();                                   //SQLを実行
//$stest = $dbh->query($sql);
$userData = array();
while($row = $sth->fetch(PDO::FETCH_ASSOC)){        //SQLで取得したデータ($sth)から連想配列でフェッチして$rowに一行づつ入れる
$userData[]=array(
'id'=>$row['id_number'],
'ondo'=>$row['temperatureField'],
'zikan'=>$row['hizuke'],
);
}
//print_r ($userData);                                //print_rで配列の中身を表示する(確認用後に削除する)
//echo "<br>";
//jsonとして出力
//header('Content-type: application/json');           //ヘッダの作成(JSON出力の明確化)
echo json_encode($userData[0]);                        //ユーザーデータ配列をJSON化!!!
//echo addslashes(json_encode($userData[0])); //配列0にしているのはselectデータの最初だけをJSONするため
//echo addslashes(json_encode($userData));     //addslashesはダブルコーテーションをバックスラッシュでエスケープする場合
//echo json_encode($sth); 
//var_dump(json_encode($userData));
?>
作成されるJSONデータ
{“id”:”55″,”ondo”:”54″,”zikan”:”2020-05-22 14:53:06″}

id=連番
ondo=センサーからの温度
zikan=レコード作成時間
お好みでPHPやらデータベスのテーブルを作ってJSON作成してください。

スケッチを実行するとWifiにつながってURL投げてJSONゲットしてParseしてSerialPrintしてこうなります。

f:id:appdeappuappu:20200523101230p:plain
シリアルモニター

スポンサーリンク

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

システム開発SE・アプリ開発・デバッガー等々なんでもやる猫の下僕です。現在は凶暴猫にカタカタ動く手を狙われながらキーボードを打っています。かなりゆるい性格なのでコメントやメッセージお気軽に〜お仕事のご依頼もお気軽にぃ〜

スポンサーリンク

コメント

コメントする

CAPTCHA


目次