iT邦幫忙

0

arduino 讀取php json無法讀取

arduino讀取簡單json 是可以讀取到值,但是如果把印出json放在if裡面就無法讀取到,有人可以幫我嗎 查了許多資料都找不到問題 拜託了(第一次發文排版不好見諒了)
如果有人可以幫我解決這問題我可以請他喝飲料!(拜託了)
這是簡單php程式碼

$test = array('sensor' => '1');
print json_encode($test);

這是我arduino程式碼
#include <ArduinoJson.h>
#include <ESP8266WiFi.h>
#include <SPI.h>
char ssid[] = "iphone123"; // SSID NAME
char pass[] = "8888hank"; // SSID PASSWORD
WiFiClient client;
void setup() {
// Initialize Serial port
Serial.begin(9600);
while (!Serial) continue;

// Initialize Ethernet library

delay(1000);

Serial.println(F("Connecting..."));

// Connect to HTTP server
int status = WL_IDLE_STATUS;

WiFi.disconnect();
Serial.println("Start connecting");
WiFi.begin(ssid,pass);
while((!(WiFi.status() == WL_CONNECTED))){
delay(300);
Serial.print("…");
}
Serial.println(WiFi.status());
Serial.println("Connected");
Serial.println("");
client.setTimeout(10000);

}

void loop() {
// not used in this example
if (!client.connect("100.10.5.100", 80)) {
Serial.println(F("Connection failed"));
delay(1000);
return;
}

Serial.println(F("Connected!"));
client.println(F("GET /connect.php HTTP/1.1"));
client.println(F("Host: 100.10.5.100"));
client.println(F("Connection: close"));
if (client.println() == 0) {
Serial.println(F("Failed to send request"));
return;
}

// Check HTTP status
char status1[32] = {0};
client.readBytesUntil('\r', status1, sizeof(status1));
if (strcmp(status1, "HTTP/1.1 200 OK") != 0) {
Serial.print(F("Unexpected response: "));
Serial.println(status1);
return;
}

// Skip HTTP headers
char endOfHeaders[] = "\r\n\r\n";
if (!client.find(endOfHeaders)) {
Serial.println(F("Invalid response"));
return;
}

// Allocate JsonBuffer
// Use arduinojson.org/assistant to compute the capacity.

// Parse JSON object
const size_t capacity = JSON_OBJECT_SIZE(3) + JSON_ARRAY_SIZE(2) + 60;
DynamicJsonBuffer jsonBuffer(capacity);
JsonObject& root = jsonBuffer.parseObject(client);
if (!root.success()) {
Serial.println(F("Parsing failed!"));
delay(10000);
return;
}

// Extract values
Serial.println(F("Response:"));
Serial.println(root["sensor"].as<char*>());

// Disconnect
delay(10000);
client.stop();

}
這是無法讀取到的php

$servername='100.17.5.100';//主機
$username='root';//你的數據庫用戶名
$password='KzmL_PIK7kq2qBh9';//你的數據庫密碼
$dbname='107project';
$a="";
$test = array('sensor' => '1');

    $rfid="";
    $rfid=$_GET["rfid"];

if(!mysqli_connect("$servername","$username","$password","$dbname")){
    die("Fail");
}
echo"<br>";  // 預設使用的資料庫名稱
$link = mysqli_connect("$servername","$username","$password","$dbname");

mysqli_query($link,"SET NAMES utf8"); 



$result = mysqli_query($link,"SELECT UID FROM RFID");

$num_rows = mysqli_num_rows($result);

while($row = mysqli_fetch_array($result))
{

    $db_id=$row['UID'];

if($rfid==$db_id){

$sql=mysqli_query($link, "INSERT INTO RFID (UIDtime,UIDconfirm,Uconfirm) VALUES (NOW(),'$rfid',1)");
    print json_encode($test);
}else{

}
unset($row);

}

2 個回答

1
0
jellyalex978
iT邦新手 5 級 ‧ 2021-06-20 05:22:51

我很久沒碰了 只能給你一些除錯方向的參考

  1. 用瀏覽器 查看你的 php 頁面 , 畫面上能不能正確秀出 json 字串
    只要可以就跟 webserver 無關了 , 也跟 php 無關
    如果不行就從 php 開始除錯

  2. aurduino 中把 php 秀出的字串 百分百 copy 到 auduino 程式碼中
    看看直接分析這個字串能不能正確取值 , 然判斷你有沒有正確載入那個函數庫
    如果沒有 , 請認真閱讀函數庫使用說明

  3. 確認 arduino 是完整取得 json 字串後才丟給 json 函數庫執行
    aurdino 原生對 http 取值好像是 "1個字1個字取回來的"
    (我印象是這樣子 , 錯了就算了 XD)

雖然在 Serial 視窗上你看到的是 {"aa":123,"bb":456}
但它只是因為沒 "換行而已"
它每一次 loop 只會拿到字串上的 1 個字元
{
"
a
a
....
所以你單純把 { 丟給 DynamicJsonBuffer 可能是無法分析的
所以你單純把 " 丟給 DynamicJsonBuffer 可能是無法分析的
所以你單純把 a 丟給 DynamicJsonBuffer 可能是無法分析的
所以你單純把 a 丟給 DynamicJsonBuffer 可能是無法分析的

以上是除錯流程的方式
供你參考

我要發表回答

立即登入回答