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);
}
我很久沒碰了 只能給你一些除錯方向的參考
用瀏覽器 查看你的 php 頁面 , 畫面上能不能正確秀出 json 字串
只要可以就跟 webserver 無關了 , 也跟 php 無關
如果不行就從 php 開始除錯
aurduino 中把 php 秀出的字串 百分百 copy 到 auduino 程式碼中
看看直接分析這個字串能不能正確取值 , 然判斷你有沒有正確載入那個函數庫
如果沒有 , 請認真閱讀函數庫使用說明
確認 arduino 是完整取得 json 字串後才丟給 json 函數庫執行
aurdino 原生對 http 取值好像是 "1個字1個字取回來的"
(我印象是這樣子 , 錯了就算了 XD)
雖然在 Serial 視窗上你看到的是 {"aa":123,"bb":456}
但它只是因為沒 "換行而已"
它每一次 loop 只會拿到字串上的 1 個字元
{
"
a
a
....
所以你單純把 { 丟給 DynamicJsonBuffer 可能是無法分析的
所以你單純把 " 丟給 DynamicJsonBuffer 可能是無法分析的
所以你單純把 a 丟給 DynamicJsonBuffer 可能是無法分析的
所以你單純把 a 丟給 DynamicJsonBuffer 可能是無法分析的
以上是除錯流程的方式
供你參考