ESP8266 http GET 请求在串行监视器中不显示任何值
ESP8266 http GET request don't show any value in serial monitor
我在本地服务器的 MySQL 数据库中有一个 table,我设法使用 PHP 脚本回显该值。这是 PHP 脚本(我将其命名为 get.php,它直接位于 xammp 中我的 htdocs 文件夹中)。
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "mydb";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT reading FROM myread";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
echo $row["reading"]."<br>";
}
} else {
echo "0 results";
}
$conn->close();
?>
我还尝试使用以下代码将数据传输到 esp8266
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <ESP8266HTTPClient.h>
int status = WL_IDLE_STATUS;
char server[] = "112.135.74.254";
char ssid[] = "MYWIFI";
char pass[] = "123654MY";
const int httpPort = 80;
float line;
float mililine;
WiFiClient client;
void setup() {
Serial.begin(9600);
while (status != WL_CONNECTED) {
Serial.print("Attempting to connect to Network named: ");
Serial.println(ssid);
status = WiFi.begin(ssid, pass);
delay(10000);
}
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
IPAddress ip = WiFi.localIP();
IPAddress gateway = WiFi.gatewayIP();
Serial.print("IP Address: ");
Serial.println(ip);
if (!client.connect(server, httpPort)) {
Serial.println("connection failed");
return;
}
String url = "/get.php";
Serial.print("requesting URL: ");
Serial.println(url);
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + server + "\r\n" +
"User-Agent: BuildFailureDetectorESP8266\r\n" +
"Connection: close\r\n\r\n");
Serial.println("request sent");
while (client.connected()) {
String line = client.readStringUntil('\n');
if (line == "\r") {
Serial.println("headers received");
break;
}
}
Serial.println("reply was:");
Serial.println("==========");
Serial.println(line);
Serial.println("==========");
Serial.println("closing connection");
mililine= line * 0.001;
Serial.println("Final value is - ");
Serial.println(mililine);
}
void loop() {
}
但问题是即使我的数据库 table 上也有一个值(该值是 55.25,我的意思是它也有小数位)串口监视器只显示输出为零
这是 Arduino 串行监视器输出
⸮_⸮⸮=s⸮⸮Attempting to connect to Network named: MYWIFI
Attempting to connect to Network named: MYWIFI
Attempting to connect to Network named: MYWIFI
SSID: MYWIFI
IP Address: 192.168.1.102
requesting URL: /get.php
request sent
headers received
reply was:
==========
0.00
==========
closing connection
Final value is -
0.00
当我在浏览器中 运行 get.php 脚本时,它会显示值
PHP script shows the value in a browser。所以我需要将这个显示值传递给 Arduino 串行监视器。正如我上面提到的,它显示零而不是这个 value.Any 帮助,拜托 ???
我修改了您的代码以使用 char 数组而不是 String class 并更改了解码逻辑。它可能有缺陷,因为我无法测试你的逻辑 script.If 它没有做你想做的事,取消注释 getDebug() 和评论 getData() 上传和 post 结果(从 === 开始= DEBUG ====) 作为对 question.If 的编辑,您会得到一个缓冲区大小错误,该错误是 BUFFERSIZE 的两倍,直到它运行完毕。
/*
Web Server
A simple webserver getting a value from a database.
by codebraker007
*/
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <ESP8266HTTPClient.h>
const uint16_t BUFFERSIZE = 256;
void sendReq();
void getData();
void getDebug();
char msgBuffer[BUFFERSIZE] = {'[=10=]'};
int status = WL_IDLE_STATUS;
const char ssid[] = "MYWIFI";
const char pass[] = "123654MY";
// Server related vars
const char serverIp[] = "112.135.74.254";
const uint16_t httpPort = 80;
const char url[] = "/get.php";
float mililine;
WiFiClient client;
void setup() {
// For serial monitor
Serial.begin(9600);
while (!Serial) {
; // wait
}
while (status != WL_CONNECTED) {
Serial.print("Attempting to connect to Network named: ");
Serial.println(ssid);
status = WiFi.begin(ssid, pass);
delay(10000);
}
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
IPAddress ip = WiFi.localIP();
IPAddress gateway = WiFi.gatewayIP();
Serial.print("IP Address: ");
Serial.println(ip);
Serial.print("Gateway IP Address: ");
Serial.println(gateway);
if (!client.connect(serverIp, httpPort)) {
Serial.println("connection failed");
return;
}
while (client.connected()) {
sendReq();
getData();
//getDebug();
}
}
void loop() {
}
void sendReq() {
Serial.print("requesting URL: ");
Serial.println(url);
strcpy ( msgBuffer, "GET ");
strcat ( msgBuffer, url);
strcat ( msgBuffer, " HTTP/1.1\r\n" );
strcat ( msgBuffer, "Host: ");
strcat ( msgBuffer, serverIp);
strcat ( msgBuffer, "\r\n");
strcat ( msgBuffer, "User-Agent: BuildFailureDetectorESP8266\r\n");
strcat ( msgBuffer, "Connection: close\r\n\r\n");
client.print(msgBuffer);
Serial.println("request sent");
}
void getData() {
bool isHeader = true;
uint16_t i = 0;
msgBuffer[0] = '[=10=]';
if (client.available()) {
if (i >= BUFFERSIZE) {
Serial.println("==== DATA READ ERROR ==== /n Enlarge buffer size");
return;
}
char c = client.read();
if (c != '\r') {
if (c == '\n' && isHeader ) {
Serial.println("header received ");
Serial.println("reply was:");
Serial.println("==========");
Serial.println(msgBuffer);
i = 0;
msgBuffer[i] = '[=10=]';
isHeader = false;
}
else if (c == '\n' && !isHeader ) {
Serial.println(msgBuffer);
Serial.println("==========");
mililine = atof(msgBuffer) * 0.001;
Serial.println("Final value is - ");
Serial.println(mililine);
Serial.println("==========");
msgBuffer[i] = '[=10=]';
i = 0;
}
else if ( c != '\n' ) {
msgBuffer[i] = c;
i++;
}
} // '\r'
} // client available
}
void getDebug() {
uint16_t i = 0;
msgBuffer[0] = '[=10=]';
if (client.available()) {
if (i >= BUFFERSIZE) {
Serial.println("==== DEBUG ERROR ==== /n Enlarge buffer size");
return;
}
char c = client.read();
if (c == '\r') {
msgBuffer[i] = '/';
i++;
msgBuffer[i] = 'r';
i ++;
}
else if (c == '\n') {
msgBuffer[i] = '/';
i++;
msgBuffer[i] = 'n';
i ++;
}
else {
msgBuffer[i] = c;
i++;
}
} // client available
Serial.println("==== DEBUG ====");
Serial.println(msgBuffer);
Serial.println("==========");
}
我在本地服务器的 MySQL 数据库中有一个 table,我设法使用 PHP 脚本回显该值。这是 PHP 脚本(我将其命名为 get.php,它直接位于 xammp 中我的 htdocs 文件夹中)。
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "mydb";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT reading FROM myread";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
echo $row["reading"]."<br>";
}
} else {
echo "0 results";
}
$conn->close();
?>
我还尝试使用以下代码将数据传输到 esp8266
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <ESP8266HTTPClient.h>
int status = WL_IDLE_STATUS;
char server[] = "112.135.74.254";
char ssid[] = "MYWIFI";
char pass[] = "123654MY";
const int httpPort = 80;
float line;
float mililine;
WiFiClient client;
void setup() {
Serial.begin(9600);
while (status != WL_CONNECTED) {
Serial.print("Attempting to connect to Network named: ");
Serial.println(ssid);
status = WiFi.begin(ssid, pass);
delay(10000);
}
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
IPAddress ip = WiFi.localIP();
IPAddress gateway = WiFi.gatewayIP();
Serial.print("IP Address: ");
Serial.println(ip);
if (!client.connect(server, httpPort)) {
Serial.println("connection failed");
return;
}
String url = "/get.php";
Serial.print("requesting URL: ");
Serial.println(url);
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + server + "\r\n" +
"User-Agent: BuildFailureDetectorESP8266\r\n" +
"Connection: close\r\n\r\n");
Serial.println("request sent");
while (client.connected()) {
String line = client.readStringUntil('\n');
if (line == "\r") {
Serial.println("headers received");
break;
}
}
Serial.println("reply was:");
Serial.println("==========");
Serial.println(line);
Serial.println("==========");
Serial.println("closing connection");
mililine= line * 0.001;
Serial.println("Final value is - ");
Serial.println(mililine);
}
void loop() {
}
但问题是即使我的数据库 table 上也有一个值(该值是 55.25,我的意思是它也有小数位)串口监视器只显示输出为零 这是 Arduino 串行监视器输出
⸮_⸮⸮=s⸮⸮Attempting to connect to Network named: MYWIFI
Attempting to connect to Network named: MYWIFI
Attempting to connect to Network named: MYWIFI
SSID: MYWIFI
IP Address: 192.168.1.102
requesting URL: /get.php
request sent
headers received
reply was:
==========
0.00
==========
closing connection
Final value is -
0.00
当我在浏览器中 运行 get.php 脚本时,它会显示值 PHP script shows the value in a browser。所以我需要将这个显示值传递给 Arduino 串行监视器。正如我上面提到的,它显示零而不是这个 value.Any 帮助,拜托 ???
我修改了您的代码以使用 char 数组而不是 String class 并更改了解码逻辑。它可能有缺陷,因为我无法测试你的逻辑 script.If 它没有做你想做的事,取消注释 getDebug() 和评论 getData() 上传和 post 结果(从 === 开始= DEBUG ====) 作为对 question.If 的编辑,您会得到一个缓冲区大小错误,该错误是 BUFFERSIZE 的两倍,直到它运行完毕。
/*
Web Server
A simple webserver getting a value from a database.
by codebraker007
*/
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <ESP8266HTTPClient.h>
const uint16_t BUFFERSIZE = 256;
void sendReq();
void getData();
void getDebug();
char msgBuffer[BUFFERSIZE] = {'[=10=]'};
int status = WL_IDLE_STATUS;
const char ssid[] = "MYWIFI";
const char pass[] = "123654MY";
// Server related vars
const char serverIp[] = "112.135.74.254";
const uint16_t httpPort = 80;
const char url[] = "/get.php";
float mililine;
WiFiClient client;
void setup() {
// For serial monitor
Serial.begin(9600);
while (!Serial) {
; // wait
}
while (status != WL_CONNECTED) {
Serial.print("Attempting to connect to Network named: ");
Serial.println(ssid);
status = WiFi.begin(ssid, pass);
delay(10000);
}
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
IPAddress ip = WiFi.localIP();
IPAddress gateway = WiFi.gatewayIP();
Serial.print("IP Address: ");
Serial.println(ip);
Serial.print("Gateway IP Address: ");
Serial.println(gateway);
if (!client.connect(serverIp, httpPort)) {
Serial.println("connection failed");
return;
}
while (client.connected()) {
sendReq();
getData();
//getDebug();
}
}
void loop() {
}
void sendReq() {
Serial.print("requesting URL: ");
Serial.println(url);
strcpy ( msgBuffer, "GET ");
strcat ( msgBuffer, url);
strcat ( msgBuffer, " HTTP/1.1\r\n" );
strcat ( msgBuffer, "Host: ");
strcat ( msgBuffer, serverIp);
strcat ( msgBuffer, "\r\n");
strcat ( msgBuffer, "User-Agent: BuildFailureDetectorESP8266\r\n");
strcat ( msgBuffer, "Connection: close\r\n\r\n");
client.print(msgBuffer);
Serial.println("request sent");
}
void getData() {
bool isHeader = true;
uint16_t i = 0;
msgBuffer[0] = '[=10=]';
if (client.available()) {
if (i >= BUFFERSIZE) {
Serial.println("==== DATA READ ERROR ==== /n Enlarge buffer size");
return;
}
char c = client.read();
if (c != '\r') {
if (c == '\n' && isHeader ) {
Serial.println("header received ");
Serial.println("reply was:");
Serial.println("==========");
Serial.println(msgBuffer);
i = 0;
msgBuffer[i] = '[=10=]';
isHeader = false;
}
else if (c == '\n' && !isHeader ) {
Serial.println(msgBuffer);
Serial.println("==========");
mililine = atof(msgBuffer) * 0.001;
Serial.println("Final value is - ");
Serial.println(mililine);
Serial.println("==========");
msgBuffer[i] = '[=10=]';
i = 0;
}
else if ( c != '\n' ) {
msgBuffer[i] = c;
i++;
}
} // '\r'
} // client available
}
void getDebug() {
uint16_t i = 0;
msgBuffer[0] = '[=10=]';
if (client.available()) {
if (i >= BUFFERSIZE) {
Serial.println("==== DEBUG ERROR ==== /n Enlarge buffer size");
return;
}
char c = client.read();
if (c == '\r') {
msgBuffer[i] = '/';
i++;
msgBuffer[i] = 'r';
i ++;
}
else if (c == '\n') {
msgBuffer[i] = '/';
i++;
msgBuffer[i] = 'n';
i ++;
}
else {
msgBuffer[i] = c;
i++;
}
} // client available
Serial.println("==== DEBUG ====");
Serial.println(msgBuffer);
Serial.println("==========");
}