饂飩コーディング

iOSアプリやら、Unityやら、Cocos2dやらごにょごにょ書いております

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でやってるよ。


参考サイト
arduinojson.org
arduinojson.org
http://arduinojson.org/example.json
↑上記二つのリンクで使うJSONデータ



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

順番は概要とは違いますが、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
シリアルモニター