应GET请求,Arduino ESP8266

应GET请求,Arduino ESP8266,arduino,at-command,esp8266,Arduino,At Command,Esp8266,我无法使用ESP8266-01将数据发送到我的数据库 我正在从控制台中的传感器获取正确的数据,但数据库中没有任何数据。PHP脚本是正确的,我知道,只是为了确保,我也将在这里添加它 我的代码: // http://playground.arduino.cc/Main/Average #include <Average.h> #include <SoftwareSerial.h> char serialbuffer[100];//serial buffer for req

我无法使用ESP8266-01将数据发送到我的数据库

我正在从控制台中的传感器获取正确的数据,但数据库中没有任何数据。PHP脚本是正确的,我知道,只是为了确保,我也将在这里添加它

我的代码:

 // http://playground.arduino.cc/Main/Average
#include <Average.h>
#include <SoftwareSerial.h>

char serialbuffer[100];//serial buffer for request url
SoftwareSerial mySerial(10, 11);

const char* ssid = "Master";
const char* password = "#Bennet99*";

const char* host = "server";

void setup() {
  Serial.begin(9600); // Connection to PC
  mySerial.begin(9600); // Connection to ESP8266
  pinMode(13, OUTPUT);
  digitalWrite(13, LOW);

  pinMode(7, OUTPUT);
  digitalWrite(7, LOW);
}

void loop() {
  float temp = getTemperatureAverage();
  Serial.println("Temperature: " + String(temp));
  sendTemperature(temp);

  delay(10000);
}

void sendTemperature(float temperature) {
  digitalWrite(7, HIGH);
  delay(2000);

  mySerial.println("AT+RST");
  WaitForReady(2000);
  mySerial.println("AT+CWMODE=1");
  WaitForOK(2000);
  mySerial.println("AT+RST");
  WaitForReady(2000);

  mySerial.println("AT+CWJAP=\"Master\",\"#Bennet99*\"");
  if (WaitForOK(5000)) {
    digitalWrite(13, HIGH); // Connection succesful
  }

  mySerial.println("AT+CIPSTART=\"TCP\",\"server\",80");
  WaitForOK(5000);
  mySerial.println("AT+CIPSEND=123");
  WaitForOK(5000);
  mySerial.print("GET /Intranet/Interface/modules/php/temp/temp.php?sensorid=\"1\"?humidity=\"1\"&temp=" + String(temperature) + " HTTP/1.0\r\n");
  mySerial.print("Host: server");
  WaitForOK(5000);
  mySerial.println("AT+CIPCLOSE");
  WaitForOK(5000);

  digitalWrite(13, LOW);
  digitalWrite(7, LOW);
}

float getTemperatureAverage() {
  Average<float> ave(10);
  for (int i = 0; i < 10; i++) {
    ave.push(getTemperature());
    delay(500);
  }

  float total = 0.0;
  delay(50);

  float temperature = ave.mean();

  return temperature;
}

float getTemperature() {
  int sensorVal = analogRead(A0);
  float voltage = (sensorVal / 1024.0) * 5.0;
  float temperature = (voltage - .5) * 100;

  return temperature;
}

boolean WaitForOK(long timeoutamount) {
  return WaitForResponse("OK", timeoutamount);
}

boolean WaitForReady(long timeoutamount) {
  return WaitForResponse("ready", timeoutamount);
}

// Parts used from https://github.com/contractorwolf/ESP8266
boolean WaitForResponse(String response, long timeoutamount) {
  unsigned long timeout = millis() + timeoutamount;

  while (millis() <= timeout) {
    while (mySerial.available() > 0) {
      int len = mySerial.readBytesUntil('\n', serialbuffer, sizeof(serialbuffer));

      String message = String(serialbuffer).substring(0, len - 1);

      if (message == response) {
        return true;
      }
    }
  }

  return false;
}
//http://playground.arduino.cc/Main/Average
#包括
#包括
字符串行缓冲区[100]//请求url的串行缓冲区
软件序列mySerial(10,11);
const char*ssid=“Master”;
const char*password=“#Bennet99*”;
const char*host=“server”;
无效设置(){
Serial.begin(9600);//连接到PC
mySerial.begin(9600);//连接到ESP8266
pinMode(13,输出);
数字写入(13,低);
pinMode(7,输出);
数字写入(7,低);
}
void循环(){
浮点温度=getTemperatureAverage();
Serial.println(“温度:+字符串(温度));
温度;
延迟(10 000);
}
空隙温度(浮子温度){
数字写入(7,高);
延迟(2000年);
mySerial.println(“AT+RST”);
WaitForReady(2000年);
mySerial.println(“AT+CWMODE=1”);
WaitForOK(2000年);
mySerial.println(“AT+RST”);
WaitForReady(2000年);
println(“AT+CWJAP=\“Master\”,\“Bennet99*”);
如果(WaitForOK(5000)){
digitalWrite(13,高);//连接成功
}
println(“AT+CIPSTART=\“TCP\”,\“server\”,80”);
WaitForOK(5000);
mySerial.println(“AT+CIPSEND=123”);
WaitForOK(5000);
mySerial.print(“GET/Intranet/Interface/modules/php/temp/temp.php?sensorid=\'1\'?湿度=\'1\'&temp=“+String(temperature)+”HTTP/1.0\r\n”);
打印(“主机:服务器”);
WaitForOK(5000);
mySerial.println(“AT+CIPCLOSE”);
WaitForOK(5000);
数字写入(13,低);
数字写入(7,低);
}
浮点获取温度平均值(){
平均平均日(10);
对于(int i=0;i<10;i++){
平均推力(getTemperature());
延迟(500);
}
浮动总额=0.0;
延迟(50);
浮动温度=平均值();
返回温度;
}
浮子温度(){
int sensorVal=模拟读数(A0);
浮动电压=(sensorVal/1024.0)*5.0;
浮子温度=(电压-.5)*100;
返回温度;
}
布尔WaitForOK(长时间超时量){
返回WaitForResponse(“确定”,超时金额);
}
布尔WaitForReady(长时间超时量){
返回WaitForResponse(“就绪”,超时金额);
}
//从中使用的零件https://github.com/contractorwolf/ESP8266
布尔WaitForResponse(字符串响应,长超时量){
无符号长超时=毫秒()+超时量;
while(millis()0){
int len=mySerial.readbytesintil('\n',serialbuffer,sizeof(serialbuffer));
String message=String(serialbuffer).substring(0,len-1);
如果(消息==响应){
返回true;
}
}
}
返回false;
}
PHP:



致以最诚挚的问候。

问题在于您的算法。ESP模块有时响应快,有时响应晚取决于您的internet连接。 例如,您在+CIPSTART=“TCP”,“server”,80发送了命令
,然后您
WaitForOK(5000)。ESP尚未回复
OK
,它仍在连接服务器,同时您的
WaitForOK(5000)超时并继续执行下一个命令

我建议您使用
SERIAL
手动输入所有这些命令,并检查响应


谢谢。:)

我已经在thingspeak上设计了一个频道,在那里我使用ESP8266通过命令发布数据

AT+CIPSTART="TCP","184.106.153.149",80
其中AT+CIPSTART启动到具有IP(184.106.153.149)和端口号(80)的thingspeak的TCP连接。下一步发送HTTP命令

AT+CIPSEND=93
其中93是命令的长度。命令是

GET /update?api_key=key_of_my_account&field1=1.34&field2=2.89&field3=3.45&field4=4.67\r\n

这已成功将我的数据发布到thingspeak频道。

脚本正确
否。无论我在这些Arduino/ESP自制PHP页面上走到哪里,它们都有SQL注入漏洞。每一个。请修复安全问题。问题的答案是:您没有正确终止HTTP请求<代码>mySerial.print(“主机:服务器”)
应该是mySerial.print(“主机:\r\n\r\n”)
。然后也调整
CIPSEND
中的值。还要学习使用wireshark转储发送的HTTP流量,这样我们可以调试网络问题,这比检查几百行代码要容易得多。我可能需要设置许多ESP,所以这将是最后一种选择?有什么方法可以让你的ESP收到回调并继续执行吗?上面提到的建议是检查你的ESP是否可以很好地处理这些命令序列。一旦您知道处理这些命令需要多少时间,您就可以更改
WaitForOK(5000)
等待响应(5000)函数。因此。您不必检查
SERIAL
上的所有ESP。在我的案例中,当EPS尝试在+CIPSTART=“TCP”,“server”,80上执行
操作时,我在序列上获得
Bussy p.
。您能告诉我们您是如何计算
93
的内容长度的吗?
GET /update?api_key=key_of_my_account&field1=1.34&field2=2.89&field3=3.45&field4=4.67\r\n