Проблема отправки get запроса

elephent
Offline
Зарегистрирован: 18.02.2019

Приветствую.

Есть проблема отправки get запроса.  

Вот скетч.


#include<SoftwareSerial.h>
// rdm6300
#include <RDM6300.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

const char* ssid = "OneProjectWifi";// 
const char* password = "Oneprojectwifi";
//WiFiClient client;
char server[] = "192.168.10.155";   //eg: 192.168.0.222

#define No_Of_Card 3

unsigned long reconnect = 0;
char var[8];
String inputString = "";
boolean stringComplete = false;
String buff = "";
String url = "";

WiFiClient client;
//WiFiServer server(80);
SoftwareSerial RFID (4, 0);
uint8_t Payload[6];
RDM6300 RDM6300(Payload);

byte id[No_Of_Card][5]={
  {44,153,22,219,22},             //RFID NO-1
  {112,224,72,84, 24},             //RFID NO-2
  {151,94,80,84,43}              //RFID NO-3
};
byte id_temp[3][3];
byte i;
int j=0;
int Led = 2;

void setup () {
  Serial.begin(9600);
  delay(10);
  RFID.begin(9600);
  pinMode(Led, OUTPUT);
  inputString.reserve(200);
  url.reserve(300);
  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
 
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
 
  // Start the server
//  server.begin();
  Serial.println("Server started");
  Serial.print(WiFi.localIP());
  delay(1000);
  Serial.println("connecting...");
 }
void loop () {
  //if (RFID.available()) {
    while (RFID.available() > 0) {
      digitalWrite(Led, HIGH);
      uint8_t c = RFID.read();
      if (RDM6300.decode(c)) {
        Serial.print("NEW CARD:");
        boolean perm = 1;
        for (int i=0; i < 6; i++){
          Serial.print(Payload[i], HEX);
          Serial.print(" ");
          //id_temp[0][i] = Payload[i];
        }
        Serial.println();
        String req = String(Payload[0], HEX) + String(Payload[1], HEX) + String(Payload[2], HEX) + String(Payload[3], HEX) + String(Payload[4], HEX) + String(Payload[5], HEX);
        Sending_To_DB(req);
        /*
        Serial.print("CHECK CARD:");
        int j = 0;
        for (j = 0; j < No_Of_Card; j++) {
          for (int i = 0; i < 5; i++) {
            if (id_temp[0][i] == id[j][i]) {
              perm = 1;
            } else {
              perm = 0;
            }
            if (!perm) break;
          }
        }
        Serial.println();*/
      }  
    }
    digitalWrite(Led, LOW);   
}

void Sending_To_DB (String ss) {  //CONNECTING WITH MYSQL
   if (client.connect(server, 80)) {
    Serial.println("connected");
    // Make a HTTP request:
    Serial.println("GET /rfid_read.php?allow=1&id=");     //YOUR URL /rfid/rfid_read.php?allow
    client.print("GET /rfid_read.php?allow=1&id=");     //YOUR URL /rfid/rfid_read.php?allow  /var/www/html/rfid/rfid_read.php
    client.print(ss);
    client.print(" ");
    //SPACE BEFORE HTTP/1.1
    client.print("HTTP/1.1");
    client.print(" ");
    client.print("Host: ");
     client.println(server);
    //client.println("Host: 192.168.10.155");//eg: 192.168.0.222
    client.println("Connection: close");
    client.println();
  } else {
    Serial.println("connection failed");
  }
  client.stop();
}

void rfid_read () {
  if (RFID.available()) {
    while (RFID.available() > 0) {
      digitalWrite(Led, HIGH);
      uint8_t c = RFID.read();
      Serial.print(c,HEX);
      if (RDM6300.decode(c)) {
        for (int i=0; i < 5; i++){
          Serial.print(Payload[i], HEX);
          Serial.print(" ");
          id_temp[0][i] = Payload[i];
        } 
        Serial.println();
      }  
    }
    digitalWrite(Led, LOW);   
    delay(100);
  } else {
    return;
  }
}

 

Запрос такой GET /rfid_read.php?allow=1&id=550b960911d HTTP/1.1

Когда делаю посылаю запрос через Браузер то получаю правильный ответ. т.е. в базу заносится данные

"GET /rfid_read.php?allow=1&id=550b960911d HTTP/1.1" 200 1 "-"

А через Arduino получаю вот так "GET /rfid_read.php?allow=1&id=550b960911d HTTP/1.1" 400 950 "

В чем ошибка? помогите пожалуйста

Алексей.
Алексей. аватар
Offline
Зарегистрирован: 02.02.2018

Неправильно строите http запрос, у вас на одной строке (на первой) запроса указан метод урло протокол и первый заголовок «Host:».
После протокола вместо пробела должен быть «возврат каретки» + «перевод строки»

П.С.
Много раз встречаю удивительный код.
Для передачи каких либо данных с iot устройств на http сервер, почемуто используется не POST запрос а GET и данные передаются в урле.
Загадка вообщем.

sadman41
Offline
Зарегистрирован: 19.10.2016

Гипотеза: отлаживать проще. А потом уже нафиг надо переделывать то, что работает.

negavoid
Offline
Зарегистрирован: 09.07.2016

А почему POST-то? Тогда уж, идеологически правильнее использовать PUT.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017
    // send data
    String url = espServerLogPath; url += inStr;
    url = "GET " + url + " HTTP/1.1\r\n" +
          "Host: " + espServerLogIP + "\r\n" +
          "User-Agent: Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5\r\n" +
          "Accept: text/html\r\n" +
          "Connection: Keep-Alive\r\n\r\n";
    clientLog.println(url);

 

Алексей.
Алексей. аватар
Offline
Зарегистрирован: 02.02.2018

negavoid пишет:

А почему POST-то? Тогда уж, идеологически правильнее использовать PUT.

POST наиболее общее представление запроса, т.е. мы говорим серверу обработай наши данные, что либо делай с ними на своё усмотрение.
PUT - замени данные файла или ресурса по заданному uri
В общем имеет место словоблудие, то и другое сообщает серверу об изменении каких либо данных, в отличии от GET запроса, в котором мы запрашиваем что либо в зависимости от изменившихся данных на стороне клиента.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Алексей. пишет:

 в отличии от GET запроса, в котором мы запрашиваем что либо в зависимости от изменившихся данных на стороне клиента.

ничего не мешает в ответ на GET запрос тупо ничего не возвращать клиенту.

Алексей.
Алексей. аватар
Offline
Зарегистрирован: 02.02.2018

andycat пишет:

Алексей. пишет:

 в отличии от GET запроса, в котором мы запрашиваем что либо в зависимости от изменившихся данных на стороне клиента.

ничего не мешает в ответ на GET запрос тупо ничего не возвращать клиенту.

Да конечно можно перевернуть всё с ног на голову и забить на rfc.
Типа наш сервер, что хотим то и делаем.
А когда клинтом для отладки будет броузер, будем удивляться что get запросы не долетают до сервера, а возвращаются кэшированные ответы.
Мы же сознательно не используем post запрос для которого:
Responses to this method are not cacheable, unless the response includes appropriate Cache-Control or Expires header fields. However, the 303 (See Other) response can be used to direct the user agent to retrieve cacheable resource.

elephent
Offline
Зарегистрирован: 18.02.2019

Алексей. пишет:

Неправильно строите http запрос, у вас на одной строке (на первой) запроса указан метод урло протокол и первый заголовок «Host:».
После протокола вместо пробела должен быть «возврат каретки» + «перевод строки»

П.С.
Много раз встречаю удивительный код.
Для передачи каких либо данных с iot устройств на http сервер, почемуто используется не POST запрос а GET и данные передаются в урле.
Загадка вообщем.

 

Подскажите как нужно, пожалуйста

Алексей.
Алексей. аватар
Offline
Зарегистрирован: 02.02.2018

Вам же привели пример запроса, только юзер агент не обязательно мозила, кип-элайф в коннекшен тоже лишний, зачем обманывать сервер (можете не добавлять этот заголовок или укажите честно Connection: close).

elephent
Offline
Зарегистрирован: 18.02.2019

Алексей. пишет:

Вам же привели пример запроса, только юзер агент не обязательно мозила, кип-элайф в коннекшен тоже лишний, зачем обманывать сервер (можете не добавлять этот заголовок или укажите честно Connection: close).

 

Извените, не увидел. Спасибо