• Система автоматизации с открытым исходным кодом на базе 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
Команда форума
А вы пробовали пробить головой стену, для начала надо ее ослабить.
 
Сверху Снизу