• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

ESP8266 (NodeMCUv0.9)

RepaeR

New member
Здравствуйте. Вопрос таков: на странице php есть вывод числа (Проверка на совпадение в БД). Если есть в БД, то выводит 1. Если нет - 0. Использую библиотеку ESP8266HTTPClient. Отправляю нужную и нформацию методом POST(). Получение происходит через метод getString(). Преобразование в целочисленный - toInt(). Однако, результат преобразования один и тот же - это число 0.
C++:
#include "Arduino.h"
#include "CTBot.h"
CTBot myBot;
TBMessage msg;
#include "ESP8266WiFi.h"
#include "ESP8266HTTPClient.h"
//Web server ---------
#define HTTPS_RESPONSE "***" //
#define POST_RESPONSE "***" //
#define ADMIN_RESPONSE "***" // На сайте сами скрипты

#include "ArduinoJson.h"
#include "ESP8266WiFiMulti.h"
#include "WiFiClientSecureBearSSL.h"
const uint8_t fingerprint[20] = {0xF3,0x1B,0xB7,0x47,0x29,0x59,0x39,0xC1,0x91,0x7D,0xB4,0x61,0xDA,0x4D,0xEC,0x0D,0x8C,0xE1,0xE7,0xC1};
ESP8266WiFiMulti WiFiMulti;
//  -------------
#define tx433Pin D4
#define MAX_DELTA 200 // это максимальное отклонение от длительности Pe при приеме
#define Pe 413
#define Pe2 Pe*2

const char ssid[] = "***";
const char pass[] = "***";
String token = "***";
String payload;
int access = 0;
bool admin;
const uint8_t LED_PIN = D1;

void httpsResponse(long id, String finder){

  // wait for WiFi connection
  if ((WiFiMulti.run() == WL_CONNECTED)) {
    //---std::unique_ptr<BearSSL::WiFiClientSecure>client(new BearSSL::WiFiClientSecure);
    WiFiClient clients; //----
    //---client->setFingerprint(fingerprint);
    // Or, if you happy to ignore the SSL certificate, then use the following line instead:
    // client->setInsecure();
    HTTPClient https;
    if(id == -1 && finder != "get"){
      Serial.print("[HTTPS] begin...\n");
      if (https.begin(clients, HTTPS_RESPONSE)) {  // HTTPS (*client, HTTPS_RESPONSE)
    
        Serial.print("[HTTPS] GET...\n");
        // start connection and send HTTP header
        int httpCode = https.GET();

        // httpCode will be negative on error
        if (httpCode > 0) {
          // HTTP header has been send and Server response header has been handled
          Serial.printf("[HTTPS] GET... code: %d\n", httpCode);

          // file found at server
          if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
            payload = https.getString();
            Serial.println(payload);
          }
        } else {
          Serial.printf("[HTTPS] GET... failed, error: %s\n", https.errorToString(httpCode).c_str());
        }
      } else {
        Serial.printf("[HTTPS] Unable to connect\n");
      }
    }else if(finder != "get"){
      String getData;
      getData =String("id=") + String(id);
      Serial.println("Connecting to Server");
      https.begin(clients, POST_RESPONSE); // (*client, Post_response)
      https.addHeader("Content-Type", "application/x-www-form-urlencoded");
      int httpResponseCode = https.POST(getData);
      if(httpResponseCode > 0){
        String payloads = https.getString();
        Serial.println(payloads + "," + payload.toInt());
         if (payloads.toInt() == 1) {
          Serial.println("Access Granted");
          access = 1;
         }
         else if (payloads.toInt() == 2) {
          Serial.println("time");
          access = 2;
         }
         else {
          Serial.println("Access Denied");
          access = 0;
         }
      }
    }
    else if (id != -1 && finder == "get"){
      String getData = String("id=") + String(id);
      https.begin(clients, ADMIN_RESPONSE);
      https.addHeader("Content-Type", "application/x-www-form-urlencoded");
      https.POST(getData);
      payload = https.getString();
      if(payload.toInt() == 1)
        admin = true;
      else
        admin = false;
    }
    

    https.end();
  }
}
void setup() {
  pinMode(tx433Pin, OUTPUT);
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, !HIGH);
  // initialize the Serial
  Serial.begin(9600);
  Serial.println("Starting TelegramBot...");
  myBot.wifiConnect(ssid, pass);
  if(WiFi.isConnected()){
    digitalWrite(LED_PIN, !HIGH);
    Serial.println("Connected");
  }
  else{
    Serial.println("Failed");
    digitalWrite(LED_PIN, HIGH);
    delay(3000);
    ESP.reset();
  }
  // set the telegram bot token
  myBot.setTelegramToken(token);
  WiFi.mode(WIFI_STA);
  WiFiMulti.addAP(ssid, pass);
 
 
 
}
// Transmitter Codes
//-----------------------------------------
void SendBit(byte b) {
  if (b == 0) {
    digitalWrite(tx433Pin, HIGH); // 0
    delayMicroseconds(Pe2);
    digitalWrite(tx433Pin, LOW);
    delayMicroseconds(Pe);
  }
  else {
    digitalWrite(tx433Pin, HIGH); // 1
    delayMicroseconds(Pe);
    digitalWrite(tx433Pin, LOW);
    delayMicroseconds(Pe2);
  }
}
void SendANMotors(long c1, long c2)
{

  for (int j = 0; j < 4; j++)
  {
    // отправляем 12 начальных импульсов 0-1
    for (int i = 0; i < 12; i++) {
      delayMicroseconds(Pe);
      digitalWrite(tx433Pin, HIGH);
      delayMicroseconds(Pe);
      digitalWrite(tx433Pin, LOW);
    }
    delayMicroseconds(Pe * 10);
    // отправляем первую половину
    for (int i = 4 * 8; i > 0; i--) {
      SendBit(bitRead(c1, i - 1));
    }
    // вторую половину
    for (int i = 4 * 8; i > 0; i--) {
      SendBit(bitRead(c2, i - 1));
    }
    // и еще пару ненужных бит, которые означают батарейку и флаг повтора
    SendBit(1);
    SendBit(1);
    delayMicroseconds(Pe * 39);
  }
}
void OpenANMotors(){
  long c1 = 0x20240000 + 0x101 * random(0xff); // AN-MOTORS хотят рандом - получит рандом ))
  long c2 = 0x6A19BE24;
  SendANMotors(c1, c2);
}
//------------------------------------------------------------------------

//int parkedCounts = 99;
//-------------------------------------------------------
//LOOP
void loop() {
//  if(parkedCounts == 99){
//    httpsResponse(-1, "");
//    parkedCounts = 20 - payload.toInt();
//  }
 
  // if there is an incoming message...
  if (myBot.getNewMessage(msg) && msg.sender.id != 5296944422) {
    if(msg.text.equalsIgnoreCase("/open")){
      httpsResponse(msg.sender.id, "");
      if(access == 1){
        OpenANMotors();
        myBot.sendMessage(msg.sender.id, "Welcome Back! Через 15 секунд шлагбаум закроется.");
        delay(15000);
        OpenANMotors();
      }
      else if (access == 2)
        myBot.sendMessage(msg.sender.id, "Шлагбаум работает в период: с 6 до 23 часов.");
    }
    else if (msg.text.equalsIgnoreCase("/gs")){
      httpsResponse(msg.sender.id,"get");
      
      if(!admin)
        myBot.sendMessage(msg.sender.id, "Такой команды не существует");
        else{
          OpenANMotors();
          myBot.sendMessage(msg.sender.id, "Отправлен 1 сигнал ");
        }
        
    }
  }
 
  //delay(3000);
}
 

RepaeR

New member
Я прошу прощения. Забыл добавить, что выводится в мониторе порта.
Сам вывод:
Код:
12:43:42.528 -> Connected

12:43:43.803 -> Connecting to Server

12:43:43.850 -> payload: 11, payload.toInt():  0

12:43:43.897 -> Access Denied
 

CodeNameHawk

Moderator
Команда форума
Я так понимаю вы тут
Код:
    else if (id != -1 && finder == "get"){
      String getData = String("id=") + String(id);
      https.begin(clients, ADMIN_RESPONSE);
      https.addHeader("Content-Type", "application/x-www-form-urlencoded");
      https.POST(getData);
      payload = https.getString();
      if(payload.toInt() == 1)
        admin = true;
      else
        admin = false;
    }
посылаете, если
(myBot.getNewMessage(msg) && msg.sender.id != 5296944422) == true

, ну так добавьте вывод в сериал, то что получили.
 

RepaeR

New member
Вывод в консоль уже сделал. Вот только не понимаю, почему он не может преобразовать string в int, если в string имеет вид "число".
Код:
13:20:04.544 -> payload: 1, pay int: 0
 

CodeNameHawk

Moderator
Команда форума
Где это видно в этой функции.
Разместите открывающие и закрывающие скобки на одной вертикальной линии и возле закрывающей добавьте комментарий к чему она относится.
 

RepaeR

New member
Где это видно в этой функции.
C++:
else if(finder != "get"){
      String getData;
      getData =String("id=") + String(id);
      Serial.println("Connecting to Server");
      https.begin(clients, POST_RESPONSE); // (*client, Post_response)
      https.addHeader("Content-Type", "application/x-www-form-urlencoded");
      int httpResponseCode = https.POST(getData);
      if(httpResponseCode > 0){
        String payloads = https.getString();
        Serial.println(payloads + "," + payload.toInt());
         if (payloads.toInt() == 1) {
          Serial.println("Access Granted");
          access = 1;
         }
         else if (payloads.toInt() == 2) {
          Serial.println("time");
          access = 2;
         }
         else {
          Serial.println("Access Denied");
          access = 0;
         }
      }
    }
Сам вывод:
Код:
12:43:42.528 -> Connected

12:43:43.803 -> Connecting to Server

12:43:43.850 -> payloads: 11, payloads.toInt():  0

12:43:43.897 -> Access Denied
 

RepaeR

New member
Тут что не то. Откуда она печатает payloads.toInt(): ?
там тоже payloads, это я с 1-го кода скопировал.
На самом деле выглядит так:
C++:
else if(finder != "get"){
      String getData;
      getData =String("id=") + String(id);
      Serial.println("Connecting to Server");
      https.begin(clients, POST_RESPONSE); // (*client, Post_response)
      https.addHeader("Content-Type", "application/x-www-form-urlencoded");
      int httpResponseCode = https.POST(getData);
      if(httpResponseCode > 0){
        String payloads = https.getString();
        long pay = payloads.toInt();
        Serial.println("payloads: " + payloads + ", payloads.toInt(): " + payloads.toInt());
        if (pay == 1) {
          Serial.println("Access Granted");
          access = 1;
        }
        else if (pay == 2) {
          Serial.println("time");
          access = 2;
        }
        else {
          Serial.println("Access Denied");
          access = 0;
        }
      
      }
Возможно ли так, что getString() имеет ссылочный тип и из-за этого всегда выдает 0?
 

CodeNameHawk

Moderator
Команда форума
Просто напечатайте Serial.println(payloads); вместо
Serial.println("payloads: " + payloads + ", payloads.toInt(): " + payloads.toInt());
 

RepaeR

New member
Просто напечатайте Serial.println(payloads); вместо
Serial.println("payloads: " + payloads + ", payloads.toInt(): " + payloads.toInt());
Всё равно: Accesss Denied. Он не может преобразовать String в Long(Int). В документации сказано, если toInt() не может преобразовать, то всегда устанавливает 0.
 

CodeNameHawk

Moderator
Команда форума
А вы пробовали пробить головой стену, для начала надо ее ослабить.
 
Сверху Снизу